Add back 2 patches for histogram and overlayframe that are working correctly and...
[goodguy/cinelerra.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 "binfolder.inc"
28 #include "assetpopup.inc"
29 #include "asset.inc"
30 #include "assets.inc"
31 #include "audiodevice.inc"
32 #include "awindow.inc"
33 #include "awindowgui.inc"
34 #include "clippopup.inc"
35 #include "edl.inc"
36 #include "effectlist.inc"
37 #include "folderlistmenu.inc"
38 #include "garbage.h"
39 #include "guicast.h"
40 #include "labeledit.inc"
41 #include "labelpopup.inc"
42 #include "labels.h"
43 #include "indexable.inc"
44 #include "mwindow.inc"
45 #include "mutex.inc"
46 #include "pluginserver.inc"
47 #include "preferences.inc"
48 #include "proxypopup.inc"
49 #include "renderengine.inc"
50 #include "samples.inc"
51 #include "vicon.h"
52
53 #define SELECT_ALL 0
54 #define SELECT_USED 1
55 #define SELECT_UNUSED 2
56 #define SELECT_NONE 3
57
58 // in percent view_h
59 #define VIEW_POPUP_BAR_H 15
60
61 #define ASSET_VIEW_NONE 0
62 #define ASSET_VIEW_ICON 1
63 #define ASSET_VIEW_MEDIA 2
64 #define ASSET_VIEW_MEDIA_MAP 3
65 #define ASSET_VIEW_FULL 4
66
67 #define AVICON_FULL_PLAY   0
68 #define AVICON_MOUSE_OVER  1
69 #define AVICON_SRC_TARGET  2
70 #define AVICON_NO_PLAY     3
71 #define AVICON_PLAY_MODES  4
72
73 class AWindowFolderItem : public BC_ListBoxItem
74 {
75 public:
76         AWindowFolderItem();
77         AWindowFolderItem(const char *text, int color = -1);
78         AWindowFolderItem(const char *text, BC_Pixmap *icon, int color = -1);
79
80         AssetPicon *get_picon();
81         int matches(const char *text);
82
83         AWindowFolderItem *parent;
84 };
85
86 class AssetPicon : public AWindowFolderItem
87 {
88 public:
89         AssetPicon(MWindow *mwindow, AWindowGUI *gui, Indexable *indexable);
90         AssetPicon(MWindow *mwindow, AWindowGUI *gui, EDL *edl);
91         AssetPicon(MWindow *mwindow, AWindowGUI *gui, PluginServer *plugin);
92         AssetPicon(MWindow *mwindow, AWindowGUI *gui, Label *plugin);
93         AssetPicon(MWindow *mwindow, AWindowGUI *gui, int folder, int persist);
94         AssetPicon(MWindow *mwindow, AWindowGUI *gui, int folder, const char *title);
95         virtual ~AssetPicon();
96
97         void create_objects();
98         void reset();
99         static void draw_hue_bar(VFrame *frame, double t);
100         static void draw_wave(VFrame *frame, double *dp, int len,
101                 int base_color, int line_color, int x, int y, int w, int h);
102         static void draw_wave(VFrame *frame, double *dp, int len,
103                 int base_color, int line_color, int x=0, int y=0) {
104           draw_wave(frame, dp, len, base_color, line_color,
105                 x,y,frame->get_w(),frame->get_h());
106         }
107         void open_render_engine(EDL *edl, int is_audio);
108         void close_render_engine();
109         void render_video(int64_t pos, VFrame *vfrm);
110         void render_audio(int64_t pos, Samples **samples, int len);
111         VFrame *get_vicon_frame();
112
113         MWindow *mwindow;
114         AWindowGUI *gui;
115         BC_Pixmap *icon;
116         VFrame *icon_vframe;
117         VFrame *vicon_frame;
118         int foldernum;
119 // sublist items if set
120         AWindowFolderSubItems *sub_items;
121
122 // ID of thing pointed to
123         int id;
124
125 // Check ID first.  Update these next before dereferencing
126 // Asset if asset
127         Indexable *indexable;
128 // EDL if clip
129         EDL *edl;
130
131         int in_use;
132         int persistent;
133         time_t comments_time;
134         int comments_ffmt;
135         double comments_rate;
136         const char *comments_type;
137         double sort_key;
138         PluginServer *plugin;
139         Label *label;
140         AssetVIcon *vicon;
141         RenderEngine *render_engine;
142 };
143
144 typedef int16_t vicon_audio_t;
145
146 class AssetVIconAudio : public Thread
147 {
148 public:
149         AssetVIconAudio(AWindowGUI *gui);
150         ~AssetVIconAudio();
151
152         void run();
153         void start(AssetVIcon *vicon);
154         void stop(int wait);
155
156         AWindowGUI *gui;
157         AudioDevice *audio;
158         AssetVIcon *vicon;
159         int interrupted;
160         int audio_pos;
161 };
162
163 class AssetVIcon : public VIcon, public Garbage {
164 public:
165         AssetPicon *picon;
166         VFrame *temp;
167         int64_t length;
168         int broken;
169
170         VFrame *frame();
171         int64_t set_seq_no(int64_t no);
172         int get_vx();
173         int get_vy();
174         void load_audio();
175         void start_audio();
176         void stop_audio();
177
178         AssetVIcon(AssetPicon *picon, int w, int h, double framerate, int64_t length);
179         ~AssetVIcon();
180 };
181
182 class AssetViewPopup : public ViewPopup
183 {
184 public:
185         AssetViewPopup(VIconThread *vt, int draw_mode,
186                         int x, int y, int w, int h);
187         ~AssetViewPopup();
188
189         int reposition_window(int x, int y, int w, int h);
190         int button_press_event();
191         int button_release_event();
192         int cursor_motion_event();
193         int keypress_event();
194
195         void draw_vframe(VFrame *frame);
196
197         int bar_h;
198         int draw_mode;
199         int dragging;
200 };
201
202 class AssetVIconThread : public VIconThread
203 {
204 public:
205         AssetVIconThread(AWindowGUI *gui, Preferences *preferences);
206         ~AssetVIconThread();
207
208         void set_view_popup(AssetVIcon *v, int draw_mode);
209         void set_view_popup(AssetVIcon *v);
210         ViewPopup *new_view_window(ViewPopup *popup);
211         void drawing_started();
212         void drawing_stopped();
213         void close_view_popup();
214
215         AWindowGUI *gui;
216         int draw_mode;
217         int vicon_cmodel;
218         Mutex *draw_lock;
219 };
220
221
222 class AWindowRemovePlugin;
223
224 class AWindowRemovePluginGUI : public BC_Window {
225 public:
226         AWindow *awindow;
227         AWindowRemovePlugin *thread;
228         PluginServer *plugin;
229         ArrayList<BC_ListBoxItem*> plugin_list;
230         BC_Pixmap *icon;
231         VFrame *icon_vframe;
232         BC_ListBox *list;
233
234         void create_objects();
235
236         AWindowRemovePluginGUI(AWindow *awindow, AWindowRemovePlugin *thread,
237                  int x, int y, PluginServer *plugin);
238         ~AWindowRemovePluginGUI();
239 };
240
241 class AWindowRemovePlugin : public BC_DialogThread {
242 public:
243         AWindow *awindow;
244         PluginServer *plugin;
245         BC_Window* new_gui();
246         void handle_close_event(int result);
247         int remove_plugin(PluginServer *plugin, ArrayList<BC_ListBoxItem*> &folder);
248
249         AWindowRemovePlugin(AWindow *awindow, PluginServer *plugin);
250         ~AWindowRemovePlugin();
251 };
252
253 class AWindowGUI : public BC_Window
254 {
255 public:
256         AWindowGUI(MWindow *mwindow, AWindow *awindow);
257         ~AWindowGUI();
258
259         void create_objects();
260         int resize_event(int w, int h);
261         int translation_event();
262         int close_event();
263         int keypress_event();
264         void async_update_assets();     // Sends update asset event
265         void update_effects();
266         void sort_assets();
267         void sort_folders();
268         void reposition_objects();
269 // Call back for MWindow entry point
270         int drag_motion();
271         int drag_stop();
272 // Collect items into the drag vectors of MainSession
273         void collect_assets(int proxy=0);
274         EDL *collect_proxy(Indexable *indexable);
275         void create_persistent_folder(ArrayList<BC_ListBoxItem*> *output,
276                 int do_audio,
277                 int do_video,
278                 int is_realtime,
279                 int is_transition);
280         void create_label_folder();
281         void copy_picons(AssetPicon *picon, ArrayList<BC_ListBoxItem*> *src);
282         void sort_picons(ArrayList<BC_ListBoxItem*> *src);
283 // Return the selected asset in asset_list
284         Indexable* selected_asset();
285         PluginServer* selected_plugin();
286         AssetPicon* selected_folder();
287         bool protected_pixmap(BC_Pixmap *pixmap);
288         int save_defaults(BC_Hash *defaults);
289         int load_defaults(BC_Hash *defaults);
290         int start_vicon_drawing();
291         int stop_vicon_drawing();
292         void close_view_popup();
293         void update_picon(Indexable *indexable);
294         int cycle_assetlist_format();
295         void hide_tip_info();
296
297         VFrame *get_picon(const char *name, const char *plugin_icons);
298         VFrame *get_picon(const char *name);
299         void resource_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, int idx);
300         void theme_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn);
301         void plugin_icon(VFrame *&vfrm, BC_Pixmap *&icon, const char *fn, unsigned char *png);
302
303         MWindow *mwindow;
304         AWindow *awindow;
305
306         AWindowAssets *asset_list;
307         AWindowFolders *folder_list;
308         AWindowDivider *divider;
309         AWindowSearchText *search_text;
310         Mutex *folder_lock;
311
312 // Store data to speed up responses
313 // Persistant data for listboxes
314 // All assets in current EDL
315         ArrayList<BC_ListBoxItem*> assets;
316         ArrayList<BC_ListBoxItem*> folders;
317         ArrayList<BC_ListBoxItem*> aeffects;
318         ArrayList<BC_ListBoxItem*> veffects;
319         ArrayList<BC_ListBoxItem*> atransitions;
320         ArrayList<BC_ListBoxItem*> vtransitions;
321         ArrayList<BC_ListBoxItem*> labellist;
322
323 // Currently displayed data for listboxes
324 // Currently displayed assets + comments
325         ArrayList<BC_ListBoxItem*> displayed_assets[2];
326         const char *asset_titles[ASSET_COLUMNS];
327         int displayed_folder;
328
329         BC_Hash *defaults;
330 // Persistent icons
331         BC_Pixmap *aeffect_folder_icon;      VFrame *aeffect_folder_vframe;
332         BC_Pixmap *atransition_folder_icon;  VFrame *atransition_folder_vframe;
333         BC_Pixmap *clip_folder_icon;         VFrame *clip_folder_vframe;
334         BC_Pixmap *label_folder_icon;        VFrame *label_folder_vframe;
335         BC_Pixmap *media_folder_icon;        VFrame *media_folder_vframe;
336         BC_Pixmap *proxy_folder_icon;        VFrame *proxy_folder_vframe;
337         BC_Pixmap *veffect_folder_icon;      VFrame *veffect_folder_vframe;
338         BC_Pixmap *vtransition_folder_icon;  VFrame *vtransition_folder_vframe;
339         BC_Pixmap *folder_icons[AWINDOW_FOLDERS];
340
341         BC_Pixmap *folder_icon;       VFrame *folder_vframe;
342         BC_Pixmap *file_icon;         VFrame *file_vframe;
343         BC_Pixmap *audio_icon;        VFrame *audio_vframe;
344         BC_Pixmap *video_icon;        VFrame *video_vframe;
345         BC_Pixmap *label_icon;        VFrame *label_vframe;
346         BC_Pixmap *clip_icon;         VFrame *clip_vframe;
347         BC_Pixmap *atransition_icon;  VFrame *atransition_vframe;
348         BC_Pixmap *vtransition_icon;  VFrame *vtransition_vframe;
349         BC_Pixmap *aeffect_icon;      VFrame *aeffect_vframe;
350         BC_Pixmap *veffect_icon;      VFrame *veffect_vframe;
351         BC_Pixmap *ladspa_icon;       VFrame *ladspa_vframe;
352         BC_Pixmap *ff_aud_icon;       VFrame *ff_aud_vframe;
353         BC_Pixmap *ff_vid_icon;       VFrame *ff_vid_vframe;
354
355 // Popup menus
356         AssetPopup *asset_menu;
357         ClipPopup *clip_menu;
358         LabelPopup *label_menu;
359         ProxyPopup *proxy_menu;
360         EffectListMenu *effectlist_menu;
361         AssetListMenu *assetlist_menu;
362         ClipListMenu *cliplist_menu;
363         LabelListMenu *labellist_menu;
364         ProxyListMenu *proxylist_menu;
365         FolderListMenu *folderlist_menu;
366         AddTools *add_tools;
367 // Temporary for reading picons from files
368         VFrame *temp_picon;
369         AssetVIconThread *vicon_thread;
370         AssetVIconAudio *vicon_audio;
371
372         int64_t plugin_visibility;
373         AWindowRemovePlugin *remove_plugin;
374
375         AVIconDrawing *avicon_drawing;
376         int avicon_w, avicon_h;
377         int vicon_drawing, play_off;
378         int allow_iconlisting;
379         int tip_info;
380
381 // Create custom atoms to be used for async messages between windows
382         int create_custom_xatoms();
383 // Function to overload to receive customly defined atoms
384         virtual int receive_custom_xatoms(xatom_event *event);
385         static const char *folder_names[];
386         NewFolderThread *new_folder_thread;
387         ModifyFolderThread *modify_folder_thread;
388
389 private:
390         void update_folder_list();
391         void update_asset_list();
392         void filter_displayed_assets();
393         Atom UpdateAssetsXAtom;
394         void update_assets();
395
396 };
397
398 class AWindowAssets : public BC_ListBox
399 {
400 public:
401         AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
402         ~AWindowAssets();
403
404         int handle_event();
405         int selection_changed();
406         void draw_background();
407         int drag_start_event();
408         int drag_motion_event();
409         int drag_stop_event();
410         int button_press_event();
411         int column_resize_event();
412         int cursor_enter_event();
413         int cursor_leave_event();
414         int focus_out_event();
415         void update_vicon_area();
416         int mouse_over_event(int no);
417         void show_tip_info(const char *info, int no);
418         void hide_tip_info();
419
420         MWindow *mwindow;
421         AWindowGUI *gui;
422         int info_tip;
423 };
424
425 class AWindowDivider : public BC_SubWindow
426 {
427 public:
428         AWindowDivider(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
429         ~AWindowDivider();
430
431         int button_press_event();
432         int cursor_motion_event();
433         int button_release_event();
434
435         MWindow *mwindow;
436         AWindowGUI *gui;
437 };
438
439 class AWindowSubFolderNames : public ArrayList<const char *>
440 {
441 public:
442         AWindowSubFolderNames() { set_array_delete(); }
443         ~AWindowSubFolderNames() { remove_all_objects(); }
444 };
445
446 class AWindowFolderSubItems : public AWindowFolderItem
447 {
448 public:
449         AWindowFolderSubItems(AWindowFolderItem *parent, const char *text);
450         int matches(const char *text);
451
452         AWindowSubFolderNames names;
453 };
454
455 class AWindowFolders : public BC_ListBox
456 {
457 public:
458         AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
459         ~AWindowFolders();
460
461         int selection_changed();
462         int button_press_event();
463         int drag_stop();
464         int load_expanders();
465
466         MWindow *mwindow;
467         AWindowGUI *gui;
468 // last selection
469         AWindowFolderItem *last_item0, *last_item1;
470 };
471
472 class AWindowSearchTextBox : public BC_TextBox
473 {
474 public:
475         AWindowSearchTextBox(AWindowSearchText *search_text, int x, int y, int w);
476         int handle_event();
477
478         AWindowSearchText *search_text;
479 };
480
481 class AWindowSearchText
482 {
483 public:
484         AWindowSearchText(MWindow *mwindow, AWindowGUI *gui, int x, int y);
485
486         int handle_event();
487         void create_objects();
488         int get_w();
489         int get_h();
490         void reposition_window(int x, int y, int w);
491         const char *get_text();
492         void clear();
493
494         MWindow *mwindow;
495         AWindowGUI *gui;
496         int x, y;
497         BC_Title *text_title;
498         BC_TextBox *text_box;
499 };
500
501 class AWindowDeleteDisk : public BC_Button
502 {
503 public:
504         AWindowDeleteDisk(MWindow *mwindow, AWindowGUI *gui, int x, int y);
505         int handle_event();
506         MWindow *mwindow;
507         AWindowGUI *gui;
508         int x, y;
509 };
510
511 class AWindowDeleteProject : public BC_Button
512 {
513 public:
514         AWindowDeleteProject(MWindow *mwindow, AWindowGUI *gui, int x, int y);
515         int handle_event();
516         MWindow *mwindow;
517         AWindowGUI *gui;
518         int x, y;
519 };
520
521 class AWindowInfo : public BC_Button
522 {
523 public:
524         AWindowInfo(MWindow *mwindow, AWindowGUI *gui, int x, int y);
525         int handle_event();
526         MWindow *mwindow;
527         AWindowGUI *gui;
528         int x, y;
529 };
530
531 class AWindowRedrawIndex : public BC_Button
532 {
533 public:
534         AWindowRedrawIndex(MWindow *mwindow, AWindowGUI *gui, int x, int y);
535         int handle_event();
536         MWindow *mwindow;
537         AWindowGUI *gui;
538         int x, y;
539 };
540
541 class AWindowPaste : public BC_Button
542 {
543 public:
544         AWindowPaste(MWindow *mwindow, AWindowGUI *gui, int x, int y);
545         int handle_event();
546         MWindow *mwindow;
547         AWindowGUI *gui;
548         int x, y;
549 };
550
551 class AWindowAppend : public BC_Button
552 {
553 public:
554         AWindowAppend(MWindow *mwindow, AWindowGUI *gui, int x, int y);
555         int handle_event();
556         MWindow *mwindow;
557         AWindowGUI *gui;
558         int x, y;
559 };
560
561 class AWindowView : public BC_Button
562 {
563 public:
564         AWindowView(MWindow *mwindow, AWindowGUI *gui, int x, int y);
565         int handle_event();
566         MWindow *mwindow;
567         AWindowGUI *gui;
568         int x, y;
569 };
570
571 class AddTools : public BC_PopupMenu
572 {
573 public:
574         AddTools(MWindow *mwindow, AWindowGUI *gui, int x, int y, const char *title);
575         void create_objects();
576
577         MWindow *mwindow;
578         AWindowGUI *gui;
579 };
580
581 class AddPluginItem : public BC_MenuItem
582 {
583 public:
584         AddPluginItem(AddTools *menu, const char *text, int idx);
585         int handle_event();
586
587         AddTools *menu;
588         int idx;
589 };
590
591 class AVIconDrawingItem : public BC_MenuItem
592 {
593 public:
594         AVIconDrawingItem(AVIconDrawing *avicon, const char *text, int id);
595         int handle_event();
596
597         AVIconDrawing *avicon;
598         int id;
599 };
600
601 class AVIconDrawing : public BC_PopupMenu
602 {
603 public:
604         AVIconDrawing(AWindowGUI *agui, int x, int y, int w, const char *text);
605         ~AVIconDrawing();
606
607         static const char *avicon_names[];
608         void create_objects();
609         int button_press_event();
610         int draw_face(int dx, int color);
611
612         AWindowGUI *agui;
613 };
614
615
616 class AWindowListFormat : public BC_MenuItem
617 {
618 public:
619         AWindowListFormat(MWindow *mwindow, AWindowGUI *gui);
620
621         void update();
622         int handle_event();
623         MWindow *mwindow;
624         AWindowGUI *gui;
625 };
626
627
628 class AWindowListSort : public BC_MenuItem
629 {
630 public:
631         AWindowListSort(MWindow *mwindow, AWindowGUI *gui);
632
633         void update();
634         int handle_event();
635         MWindow *mwindow;
636         AWindowGUI *gui;
637 };
638
639 class AssetSelectUsedItem : public BC_MenuItem
640 {
641 public:
642         AssetSelectUsedItem(AssetSelectUsed *select_used, const char *text, int action);
643         int handle_event();
644
645         int action;
646         AssetSelectUsed *select_used;
647 };
648
649 class AssetSelectUsed : public BC_MenuItem
650 {
651 public:
652         AssetSelectUsed(MWindow *mwindow, AWindowGUI *gui);
653
654         MWindow *mwindow;
655         AWindowGUI *gui;
656 };
657
658 #endif