clip picons as clip_icon.png, vwindow hang, fix for drop target test
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #ifndef AWINDOWGUI_H
23 #define AWINDOWGUI_H
24
25 #include "arraylist.h"
26 #include "bcdialog.h"
27 #include "assetpopup.inc"
28 #include "asset.inc"
29 #include "assets.inc"
30 #include "audiodevice.inc"
31 #include "awindow.inc"
32 #include "awindowgui.inc"
33 #include "clippopup.inc"
34 #include "edl.inc"
35 #include "effectlist.inc"
36 #include "folderlistmenu.inc"
37 #include "guicast.h"
38 #include "labeledit.inc"
39 #include "labelpopup.inc"
40 #include "labels.h"
41 #include "indexable.inc"
42 #include "mwindow.inc"
43 #include "newfolder.inc"
44 #include "pluginserver.inc"
45 #include "renderengine.inc"
46 #include "samples.inc"
47 #include "vicon.h"
48
49 class AssetPicon : public BC_ListBoxItem
50 {
51 public:
52         AssetPicon(MWindow *mwindow, AWindowGUI *gui, Indexable *indexable);
53         AssetPicon(MWindow *mwindow, AWindowGUI *gui, EDL *edl);
54         AssetPicon(MWindow *mwindow, AWindowGUI *gui, PluginServer *plugin);
55         AssetPicon(MWindow *mwindow, AWindowGUI *gui, Label *plugin);
56         AssetPicon(MWindow *mwindow, AWindowGUI *gui, int folder, int persist);
57         virtual ~AssetPicon();
58
59         void create_objects();
60         void reset();
61         static void draw_hue_bar(VFrame *frame, double t);
62         static void draw_wave(VFrame *frame, double *dp, int len,
63                 int base_color, int line_color);
64         void open_render_engine(EDL *edl, int is_audio);
65         void close_render_engine();
66         void render_video(int64_t pos, VFrame *vfrm);
67         void render_audio(int64_t pos, Samples **samples, int len);
68
69         MWindow *mwindow;
70         AWindowGUI *gui;
71         BC_Pixmap *icon;
72         VFrame *icon_vframe;
73         int foldernum;
74 // ID of thing pointed to
75         int id;
76
77 // Check ID first.  Update these next before dereferencing
78 // Asset if asset
79         Indexable *indexable;
80 // EDL if clip
81         EDL *edl;
82
83         int in_use;
84         time_t mtime;
85
86         int persistent;
87         PluginServer *plugin;
88         Label *label;
89         VIcon *vicon;
90         RenderEngine *render_engine;
91 };
92
93 typedef int16_t vicon_audio_t;
94
95 class AssetVIconAudio : public Thread
96 {
97 public:
98         AssetVIconAudio(AWindowGUI *gui);
99         ~AssetVIconAudio();
100
101         void run();
102         void start(AssetVIcon *vicon);
103         void stop(int wait);
104
105         AWindowGUI *gui;
106         AudioDevice *audio;
107         AssetVIcon *vicon;
108         int interrupted;
109         int audio_pos;
110 };
111
112 class AssetVIcon : public VIcon {
113 public:
114         AssetPicon *picon;
115         VFrame *temp;
116         int64_t length;
117
118         VFrame *frame();
119         int64_t set_seq_no(int64_t no);
120         int get_vx();
121         int get_vy();
122         void load_audio();
123         void start_audio();
124         void stop_audio();
125
126         AssetVIcon(AssetPicon *picon, int w, int h, double framerate, int64_t length);
127         ~AssetVIcon();
128 };
129
130 class AWindowRemovePlugin;
131
132 class AWindowRemovePluginGUI : public BC_Window {
133 public:
134         AWindow *awindow;
135         AWindowRemovePlugin *thread;
136         PluginServer *plugin;
137         ArrayList<BC_ListBoxItem*> plugin_list;
138         BC_Pixmap *icon;
139         VFrame *icon_vframe;
140         BC_ListBox *list;
141
142         void create_objects();
143
144         AWindowRemovePluginGUI(AWindow *awindow, AWindowRemovePlugin *thread,
145                  int x, int y, PluginServer *plugin);
146         ~AWindowRemovePluginGUI();
147 };
148
149 class AWindowRemovePlugin : public BC_DialogThread {
150 public:
151         AWindow *awindow;
152         PluginServer *plugin;
153         BC_Window* new_gui();
154         void handle_close_event(int result);
155         int remove_plugin(PluginServer *plugin, ArrayList<BC_ListBoxItem*> &folder);
156
157         AWindowRemovePlugin(AWindow *awindow, PluginServer *plugin);
158         ~AWindowRemovePlugin();
159 };
160
161 class AWindowGUI : public BC_Window
162 {
163 public:
164         AWindowGUI(MWindow *mwindow, AWindow *awindow);
165         ~AWindowGUI();
166
167         void create_objects();
168         int resize_event(int w, int h);
169         int translation_event();
170         int close_event();
171         int keypress_event();
172         void async_update_assets();     // Sends update asset event
173         void update_effects();
174         void sort_assets(int use_mtime);
175         void sort_folders();
176         void reposition_objects();
177         static int folder_number(const char *name);
178 // Call back for MWindow entry point
179         int drag_motion();
180         int drag_stop();
181 // Collect items into the drag vectors of MainSession
182         void collect_assets();
183         void create_persistent_folder(ArrayList<BC_ListBoxItem*> *output,
184                 int do_audio,
185                 int do_video,
186                 int is_realtime,
187                 int is_transition);
188         void create_label_folder();
189         void copy_picons(ArrayList<BC_ListBoxItem*> *dst,
190                 ArrayList<BC_ListBoxItem*> *src, int folder);
191         void sort_picons(ArrayList<BC_ListBoxItem*> *src, int use_mtime=0);
192 // Return the selected asset in asset_list
193         Indexable* selected_asset();
194         PluginServer* selected_plugin();
195         AssetPicon* selected_folder();
196         bool protected_pixmap(BC_Pixmap *pixmap);
197         int save_defaults(BC_Hash *defaults);
198         int load_defaults(BC_Hash *defaults);
199         void start_vicon_drawing();
200         void stop_vicon_drawing();
201         void update_picon(Indexable *indexable);
202
203         VFrame *get_picon(const char *name, const char *plugin_icons);
204         VFrame *get_picon(const char *name);
205         void resource_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, int idx);
206         void theme_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn);
207         void plugin_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, unsigned char *png);
208
209         MWindow *mwindow;
210         AWindow *awindow;
211
212         AWindowAssets *asset_list;
213         AWindowFolders *folder_list;
214         AWindowDivider *divider;
215         AWindowSearchText *search_text;
216
217 // Store data to speed up responses
218 // Persistant data for listboxes
219 // All assets in current EDL
220         ArrayList<BC_ListBoxItem*> assets;
221         ArrayList<BC_ListBoxItem*> folders;
222         ArrayList<BC_ListBoxItem*> aeffects;
223         ArrayList<BC_ListBoxItem*> veffects;
224         ArrayList<BC_ListBoxItem*> atransitions;
225         ArrayList<BC_ListBoxItem*> vtransitions;
226         ArrayList<BC_ListBoxItem*> labellist;
227
228 // Currently displayed data for listboxes
229 // Currently displayed assets + comments
230         ArrayList<BC_ListBoxItem*> displayed_assets[2];
231         const char *asset_titles[ASSET_COLUMNS];
232         int displayed_folder;
233
234         BC_Hash *defaults;
235 // Persistent icons
236         BC_Pixmap *aeffect_folder_icon;      VFrame *aeffect_folder_vframe;
237         BC_Pixmap *atransition_folder_icon;  VFrame *atransition_folder_vframe;
238         BC_Pixmap *clip_folder_icon;         VFrame *clip_folder_vframe;
239         BC_Pixmap *label_folder_icon;        VFrame *label_folder_vframe;
240         BC_Pixmap *media_folder_icon;        VFrame *media_folder_vframe;
241         BC_Pixmap *proxy_folder_icon;        VFrame *proxy_folder_vframe;
242         BC_Pixmap *veffect_folder_icon;      VFrame *veffect_folder_vframe;
243         BC_Pixmap *vtransition_folder_icon;  VFrame *vtransition_folder_vframe;
244         BC_Pixmap *folder_icons[AWINDOW_FOLDERS];
245
246         BC_Pixmap *folder_icon;       VFrame *folder_vframe;
247         BC_Pixmap *file_icon;         VFrame *file_vframe;
248         BC_Pixmap *audio_icon;        VFrame *audio_vframe;
249         BC_Pixmap *video_icon;        VFrame *video_vframe;
250         BC_Pixmap *label_icon;        VFrame *label_vframe;
251         BC_Pixmap *clip_icon;         VFrame *clip_vframe;
252         BC_Pixmap *atransition_icon;  VFrame *atransition_vframe;
253         BC_Pixmap *vtransition_icon;  VFrame *vtransition_vframe;
254         BC_Pixmap *aeffect_icon;      VFrame *aeffect_vframe;
255         BC_Pixmap *veffect_icon;      VFrame *veffect_vframe;
256         BC_Pixmap *ladspa_icon;       VFrame *ladspa_vframe;
257         BC_Pixmap *ff_aud_icon;       VFrame *ff_aud_vframe;
258         BC_Pixmap *ff_vid_icon;       VFrame *ff_vid_vframe;
259
260         NewFolderThread *newfolder_thread;
261
262 // Popup menus
263         AssetPopup *asset_menu;
264         ClipPopup *clip_menu;
265         LabelPopup *label_menu;
266         EffectListMenu *effectlist_menu;
267         AssetListMenu *assetlist_menu;
268         ClipListMenu *cliplist_menu;
269         LabelListMenu *labellist_menu;
270         FolderListMenu *folderlist_menu;
271         AddTools *add_tools;
272 // Temporary for reading picons from files
273         VFrame *temp_picon;
274         VIconThread *vicon_thread;
275         AssetVIconAudio *vicon_audio;
276
277         int64_t plugin_visibility;
278         AWindowRemovePlugin *remove_plugin;
279
280         AVIconDrawing *avicon_drawing;
281         int avicon_w, avicon_h, vicon_drawing;
282         int allow_iconlisting;
283
284 // Create custom atoms to be used for async messages between windows
285         int create_custom_xatoms();
286 // Function to overload to recieve customly defined atoms
287         virtual int recieve_custom_xatoms(xatom_event *event);
288         static const char *folder_names[];
289
290 private:
291         void update_folder_list();
292         void update_asset_list();
293         void filter_displayed_assets();
294         Atom UpdateAssetsXAtom;
295         void update_assets();
296
297 };
298
299 class AWindowAssets : public BC_ListBox
300 {
301 public:
302         AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
303         ~AWindowAssets();
304
305         int handle_event();
306         int selection_changed();
307         void draw_background();
308         int drag_start_event();
309         int drag_motion_event();
310         int drag_stop_event();
311         int button_press_event();
312         int column_resize_event();
313         int focus_in_event();
314         int focus_out_event();
315
316         MWindow *mwindow;
317         AWindowGUI *gui;
318 };
319
320 class AWindowDivider : public BC_SubWindow
321 {
322 public:
323         AWindowDivider(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
324         ~AWindowDivider();
325
326         int button_press_event();
327         int cursor_motion_event();
328         int button_release_event();
329
330         MWindow *mwindow;
331         AWindowGUI *gui;
332 };
333
334 class AWindowFolders : public BC_ListBox
335 {
336 public:
337         AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
338         ~AWindowFolders();
339
340         int selection_changed();
341         int button_press_event();
342
343         MWindow *mwindow;
344         AWindowGUI *gui;
345 };
346
347 class AWindowSearchTextBox : public BC_TextBox
348 {
349 public:
350         AWindowSearchTextBox(AWindowSearchText *search_text, int x, int y, int w);
351         int handle_event();
352
353         AWindowSearchText *search_text;
354 };
355
356 class AWindowSearchText
357 {
358 public:
359         AWindowSearchText(MWindow *mwindow, AWindowGUI *gui, int x, int y);
360
361         int handle_event();
362         void create_objects();
363         int get_w();
364         int get_h();
365         void reposition_window(int x, int y, int w);
366         const char *get_text();
367         void clear();
368
369         MWindow *mwindow;
370         AWindowGUI *gui;
371         int x, y;
372         BC_Title *text_title;
373         BC_TextBox *text_box;
374 };
375
376 class AWindowNewFolder : public BC_Button
377 {
378 public:
379         AWindowNewFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y);
380         int handle_event();
381         MWindow *mwindow;
382         AWindowGUI *gui;
383         int x, y;
384 };
385
386 class AWindowDeleteFolder : public BC_Button
387 {
388 public:
389         AWindowDeleteFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y);
390         int handle_event();
391         MWindow *mwindow;
392         AWindowGUI *gui;
393         int x, y;
394 };
395
396 class AWindowRenameFolder : public BC_Button
397 {
398 public:
399         AWindowRenameFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y);
400         int handle_event();
401         MWindow *mwindow;
402         AWindowGUI *gui;
403         int x, y;
404 };
405
406 class AWindowDeleteDisk : public BC_Button
407 {
408 public:
409         AWindowDeleteDisk(MWindow *mwindow, AWindowGUI *gui, int x, int y);
410         int handle_event();
411         MWindow *mwindow;
412         AWindowGUI *gui;
413         int x, y;
414 };
415
416 class AWindowDeleteProject : public BC_Button
417 {
418 public:
419         AWindowDeleteProject(MWindow *mwindow, AWindowGUI *gui, int x, int y);
420         int handle_event();
421         MWindow *mwindow;
422         AWindowGUI *gui;
423         int x, y;
424 };
425
426 class AWindowInfo : public BC_Button
427 {
428 public:
429         AWindowInfo(MWindow *mwindow, AWindowGUI *gui, int x, int y);
430         int handle_event();
431         MWindow *mwindow;
432         AWindowGUI *gui;
433         int x, y;
434 };
435
436 class AWindowRedrawIndex : public BC_Button
437 {
438 public:
439         AWindowRedrawIndex(MWindow *mwindow, AWindowGUI *gui, int x, int y);
440         int handle_event();
441         MWindow *mwindow;
442         AWindowGUI *gui;
443         int x, y;
444 };
445
446 class AWindowPaste : public BC_Button
447 {
448 public:
449         AWindowPaste(MWindow *mwindow, AWindowGUI *gui, int x, int y);
450         int handle_event();
451         MWindow *mwindow;
452         AWindowGUI *gui;
453         int x, y;
454 };
455
456 class AWindowAppend : public BC_Button
457 {
458 public:
459         AWindowAppend(MWindow *mwindow, AWindowGUI *gui, int x, int y);
460         int handle_event();
461         MWindow *mwindow;
462         AWindowGUI *gui;
463         int x, y;
464 };
465
466 class AWindowView : public BC_Button
467 {
468 public:
469         AWindowView(MWindow *mwindow, AWindowGUI *gui, int x, int y);
470         int handle_event();
471         MWindow *mwindow;
472         AWindowGUI *gui;
473         int x, y;
474 };
475
476 class AddTools : public BC_PopupMenu
477 {
478 public:
479         AddTools(MWindow *mwindow, AWindowGUI *gui, int x, int y, const char *title);
480         void create_objects();
481
482         MWindow *mwindow;
483         AWindowGUI *gui;
484 };
485
486 class AddPluginItem : public BC_MenuItem
487 {
488 public:
489         AddPluginItem(AddTools *menu, const char *text, int idx);
490         int handle_event();
491
492         AddTools *menu;
493         int idx;
494 };
495
496 class AVIconDrawing : public BC_Toggle
497 {
498 public:
499         AWindowGUI *agui;
500
501         int handle_event();
502         static void calculate_geometry(AWindowGUI *agui, VFrame **images, int *ww, int *hh);
503
504         AVIconDrawing(AWindowGUI *agui, int x, int y, VFrame **images);
505         ~AVIconDrawing();
506 };
507
508
509 class AWindowListFormat : public BC_MenuItem
510 {
511 public:
512         AWindowListFormat(MWindow *mwindow, AWindowGUI *gui);
513
514         void update();
515         int handle_event();
516         MWindow *mwindow;
517         AWindowGUI *gui;
518 };
519
520
521 class AWindowListSort : public BC_MenuItem
522 {
523 public:
524         AWindowListSort(MWindow *mwindow, AWindowGUI *gui);
525
526         void update();
527         int handle_event();
528         MWindow *mwindow;
529         AWindowGUI *gui;
530 };
531
532 #endif