4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
25 #include "arraylist.h"
27 #include "binfolder.inc"
28 #include "assetpopup.inc"
31 #include "audiodevice.inc"
32 #include "awindow.inc"
33 #include "awindowgui.inc"
34 #include "clippopup.inc"
36 #include "effectlist.inc"
37 #include "folderlistmenu.inc"
40 #include "labeledit.inc"
41 #include "labelpopup.inc"
43 #include "indexable.inc"
44 #include "mwindow.inc"
46 #include "pluginserver.inc"
47 #include "preferences.inc"
48 #include "proxypopup.inc"
49 #include "renderengine.inc"
50 #include "samples.inc"
55 #define SELECT_UNUSED 2
59 #define VIEW_POPUP_BAR_H 15
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
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
73 class AWindowFolderItem : public BC_ListBoxItem
77 AWindowFolderItem(const char *text, int color = -1);
78 AWindowFolderItem(const char *text, BC_Pixmap *icon, int color = -1);
80 AssetPicon *get_picon();
81 int matches(const char *text);
83 AWindowFolderItem *parent;
86 class AssetPicon : public AWindowFolderItem
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();
97 void create_objects();
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());
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();
119 // sublist items if set
120 AWindowFolderSubItems *sub_items;
122 // ID of thing pointed to
125 // Check ID first. Update these next before dereferencing
127 Indexable *indexable;
133 time_t comments_time;
135 double comments_rate;
136 const char *comments_type;
138 PluginServer *plugin;
141 RenderEngine *render_engine;
144 typedef int16_t vicon_audio_t;
146 class AssetVIconAudio : public Thread
149 AssetVIconAudio(AWindowGUI *gui);
153 void start(AssetVIcon *vicon);
163 class AssetVIcon : public VIcon, public Garbage {
171 int64_t set_seq_no(int64_t no);
178 AssetVIcon(AssetPicon *picon, int w, int h, double framerate, int64_t length);
182 class AssetViewPopup : public ViewPopup
185 AssetViewPopup(VIconThread *vt, int draw_mode,
186 int x, int y, int w, int h);
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();
195 void draw_vframe(VFrame *frame);
202 class AssetVIconThread : public VIconThread
205 AssetVIconThread(AWindowGUI *gui, Preferences *preferences);
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();
222 class AWindowRemovePlugin;
224 class AWindowRemovePluginGUI : public BC_Window {
227 AWindowRemovePlugin *thread;
228 PluginServer *plugin;
229 ArrayList<BC_ListBoxItem*> plugin_list;
234 void create_objects();
236 AWindowRemovePluginGUI(AWindow *awindow, AWindowRemovePlugin *thread,
237 int x, int y, PluginServer *plugin);
238 ~AWindowRemovePluginGUI();
241 class AWindowRemovePlugin : public BC_DialogThread {
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);
249 AWindowRemovePlugin(AWindow *awindow, PluginServer *plugin);
250 ~AWindowRemovePlugin();
253 class AWindowGUI : public BC_Window
256 AWindowGUI(MWindow *mwindow, AWindow *awindow);
259 void create_objects();
260 int resize_event(int w, int h);
261 int translation_event();
263 int keypress_event();
264 void async_update_assets(); // Sends update asset event
265 void update_effects();
268 void reposition_objects();
269 // Call back for MWindow entry point
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,
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();
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);
306 AWindowAssets *asset_list;
307 AWindowFolders *folder_list;
308 AWindowDivider *divider;
309 AWindowSearchText *search_text;
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;
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;
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];
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;
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;
367 // Temporary for reading picons from files
369 AssetVIconThread *vicon_thread;
370 AssetVIconAudio *vicon_audio;
372 int64_t plugin_visibility;
373 AWindowRemovePlugin *remove_plugin;
375 AVIconDrawing *avicon_drawing;
376 int avicon_w, avicon_h;
377 int vicon_drawing, play_off;
378 int allow_iconlisting;
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;
390 void update_folder_list();
391 void update_asset_list();
392 void filter_displayed_assets();
393 Atom UpdateAssetsXAtom;
394 void update_assets();
398 class AWindowAssets : public BC_ListBox
401 AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
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();
425 class AWindowDivider : public BC_SubWindow
428 AWindowDivider(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
431 int button_press_event();
432 int cursor_motion_event();
433 int button_release_event();
439 class AWindowSubFolderNames : public ArrayList<const char *>
442 AWindowSubFolderNames() { set_array_delete(); }
443 ~AWindowSubFolderNames() { remove_all_objects(); }
446 class AWindowFolderSubItems : public AWindowFolderItem
449 AWindowFolderSubItems(AWindowFolderItem *parent, const char *text);
450 int matches(const char *text);
452 AWindowSubFolderNames names;
455 class AWindowFolders : public BC_ListBox
458 AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h);
461 int selection_changed();
462 int button_press_event();
464 int load_expanders();
469 AWindowFolderItem *last_item0, *last_item1;
472 class AWindowSearchTextBox : public BC_TextBox
475 AWindowSearchTextBox(AWindowSearchText *search_text, int x, int y, int w);
478 AWindowSearchText *search_text;
481 class AWindowSearchText
484 AWindowSearchText(MWindow *mwindow, AWindowGUI *gui, int x, int y);
487 void create_objects();
490 void reposition_window(int x, int y, int w);
491 const char *get_text();
497 BC_Title *text_title;
498 BC_TextBox *text_box;
501 class AWindowDeleteDisk : public BC_Button
504 AWindowDeleteDisk(MWindow *mwindow, AWindowGUI *gui, int x, int y);
511 class AWindowDeleteProject : public BC_Button
514 AWindowDeleteProject(MWindow *mwindow, AWindowGUI *gui, int x, int y);
521 class AWindowInfo : public BC_Button
524 AWindowInfo(MWindow *mwindow, AWindowGUI *gui, int x, int y);
531 class AWindowRedrawIndex : public BC_Button
534 AWindowRedrawIndex(MWindow *mwindow, AWindowGUI *gui, int x, int y);
541 class AWindowPaste : public BC_Button
544 AWindowPaste(MWindow *mwindow, AWindowGUI *gui, int x, int y);
551 class AWindowAppend : public BC_Button
554 AWindowAppend(MWindow *mwindow, AWindowGUI *gui, int x, int y);
561 class AWindowView : public BC_Button
564 AWindowView(MWindow *mwindow, AWindowGUI *gui, int x, int y);
571 class AddTools : public BC_PopupMenu
574 AddTools(MWindow *mwindow, AWindowGUI *gui, int x, int y, const char *title);
575 void create_objects();
581 class AddPluginItem : public BC_MenuItem
584 AddPluginItem(AddTools *menu, const char *text, int idx);
591 class AVIconDrawingItem : public BC_MenuItem
594 AVIconDrawingItem(AVIconDrawing *avicon, const char *text, int id);
597 AVIconDrawing *avicon;
601 class AVIconDrawing : public BC_PopupMenu
604 AVIconDrawing(AWindowGUI *agui, int x, int y, int w, const char *text);
607 static const char *avicon_names[];
608 void create_objects();
609 int button_press_event();
610 int draw_face(int dx, int color);
616 class AWindowListFormat : public BC_MenuItem
619 AWindowListFormat(MWindow *mwindow, AWindowGUI *gui);
628 class AWindowListSort : public BC_MenuItem
631 AWindowListSort(MWindow *mwindow, AWindowGUI *gui);
639 class AssetSelectUsedItem : public BC_MenuItem
642 AssetSelectUsedItem(AssetSelectUsed *select_used, const char *text, int action);
646 AssetSelectUsed *select_used;
649 class AssetSelectUsed : public BC_MenuItem
652 AssetSelectUsed(MWindow *mwindow, AWindowGUI *gui);