r753: Add raise_window() commands when making various windows
[cinelerra_cv/mob.git] / cinelerra / awindowgui.C
blobf9e6533b31c1cd96b1db6dbd29828e8155cb8574
1 #include "asset.h"
2 #include "assetedit.h"
3 #include "assetpopup.h"
4 #include "assets.h"
5 #include "awindowgui.h"
6 #include "awindowgui.inc"
7 #include "awindow.h"
8 #include "awindowmenu.h"
9 #include "cache.h"
10 #include "colormodels.h"
11 #include "cursors.h"
12 #include "cwindowgui.h"
13 #include "cwindow.h"
14 #include "edl.h"
15 #include "edlsession.h"
16 #include "file.h"
17 #include "filesystem.h"
18 #include "language.h"
19 #include "labels.h"
20 #include "labeledit.h"
21 #include "localsession.h"
22 #include "mainmenu.h"
23 #include "mainsession.h"
24 #include "mwindowgui.h"
25 #include "mwindow.h"
26 #include "newfolder.h"
27 #include "preferences.h"
28 #include "theme.h"
29 #include "vframe.h"
30 #include "vwindowgui.h"
31 #include "vwindow.h"
36 AssetPicon::AssetPicon(MWindow *mwindow, 
37         AWindowGUI *gui, 
38         Asset *asset)
39  : BC_ListBoxItem()
41         reset();
42         this->mwindow = mwindow;
43         this->gui = gui;
44         this->asset = asset;
45         this->id = asset->id;
48 AssetPicon::AssetPicon(MWindow *mwindow, 
49         AWindowGUI *gui, 
50         EDL *edl)
51  : BC_ListBoxItem()
53         reset();
54         this->mwindow = mwindow;
55         this->gui = gui;
56         this->edl = edl;
57         this->id = edl->id;
60 AssetPicon::AssetPicon(MWindow *mwindow, 
61         AWindowGUI *gui, 
62         char *folder)
63  : BC_ListBoxItem(folder, gui->folder_icon)
65         reset();
66         this->mwindow = mwindow;
67         this->gui = gui;
70 AssetPicon::AssetPicon(MWindow *mwindow, 
71         AWindowGUI *gui, 
72         PluginServer *plugin)
73  : BC_ListBoxItem()
75         reset();
76         this->mwindow = mwindow;
77         this->gui = gui;
78         this->plugin = plugin;
79         asset = 0;
80         icon = 0;
81         id = 0;
84 AssetPicon::AssetPicon(MWindow *mwindow, 
85         AWindowGUI *gui, 
86         Label *label)
87  : BC_ListBoxItem()
89         reset();
90         this->mwindow = mwindow;
91         this->gui = gui;
92         this->label = label;
93         asset = 0;
94         icon = 0;
95         id = 0;
98 AssetPicon::~AssetPicon()
100         if(icon)
101         {
102                 if(icon != gui->file_icon &&
103                         icon != gui->audio_icon &&
104                         icon != gui->folder_icon &&
105                         icon != gui->clip_icon &&
106                         icon != gui->video_icon) 
107                 {
108                         delete icon;
109                         delete icon_vframe;
110                 }
111         }
114 void AssetPicon::reset()
116         plugin = 0;
117         label = 0;
118         asset = 0;
119         edl = 0;
120         icon = 0;
121         icon_vframe = 0;
122         in_use = 1;
123         id = 0;
124         persistent = 0;
127 void AssetPicon::create_objects()
129         FileSystem fs;
130         char name[BCTEXTLEN];
131         int pixmap_w, pixmap_h;
134         pixmap_h = 50;
136         if(asset)
137         {
138                 fs.extract_name(name, asset->path);
139                 set_text(name);
140                 if(asset->video_data)
141                 {
142                         if(mwindow->preferences->use_thumbnails)
143                         {
144                                 File *file = mwindow->video_cache->check_out(asset);
146                                 if(file)
147                                 {
148                                         pixmap_w = pixmap_h * asset->width / asset->height;
150                                         file->set_layer(0);
151                                         file->set_video_position(0, mwindow->edl->session->frame_rate);
153                                         if(gui->temp_picon && 
154                                                 (gui->temp_picon->get_w() != asset->width ||
155                                                 gui->temp_picon->get_h() != asset->height))
156                                         {
157                                                 delete gui->temp_picon;
158                                                 gui->temp_picon = 0;
159                                         }
161                                         if(!gui->temp_picon)
162                                         {
163                                                 gui->temp_picon = new VFrame(0, 
164                                                         asset->width, 
165                                                         asset->height, 
166                                                         BC_RGB888);
167                                         }
169                                         file->read_frame(gui->temp_picon);
171                                         icon = new BC_Pixmap(gui, pixmap_w, pixmap_h);
172                                         icon->draw_vframe(gui->temp_picon,
173                                                 0, 
174                                                 0, 
175                                                 pixmap_w, 
176                                                 pixmap_h,
177                                                 0,
178                                                 0);
179 //printf("%d %d\n", gui->temp_picon->get_w(), gui->temp_picon->get_h());
180                                         icon_vframe = new VFrame(0, 
181                                                 pixmap_w, 
182                                                 pixmap_h, 
183                                                 BC_RGB888);
184                                         cmodel_transfer(icon_vframe->get_rows(), /* Leave NULL if non existent */
185                                                 gui->temp_picon->get_rows(),
186                                                 0, /* Leave NULL if non existent */
187                                                 0,
188                                                 0,
189                                                 0, /* Leave NULL if non existent */
190                                                 0,
191                                                 0,
192                                                 0,        /* Dimensions to capture from input frame */
193                                                 0, 
194                                                 gui->temp_picon->get_w(), 
195                                                 gui->temp_picon->get_h(),
196                                                 0,       /* Dimensions to project on output frame */
197                                                 0, 
198                                                 pixmap_w, 
199                                                 pixmap_h,
200                                                 BC_RGB888, 
201                                                 BC_RGB888,
202                                                 0,         /* When transfering BC_RGBA8888 to non-alpha this is the background color in 0xRRGGBB hex */
203                                                 0,       /* For planar use the luma rowspan */
204                                                 0);     /* For planar use the luma rowspan */
207                                         mwindow->video_cache->check_in(asset);
208                                 }
209                                 else
210                                 {
211                                         icon = gui->video_icon;
212                                         icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
214                                 }
215                         }
216                         else
217                         {
218                                 icon = gui->video_icon;
219                                 icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];                  
220                         }
221                 }
222                 else
223                 if(asset->audio_data)
224                 {
225                         icon = gui->audio_icon;
226                         icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_SOUND];
227                 }
228 //printf("AssetPicon::create_objects 2\n");
230                 set_icon(icon);
231                 set_icon_vframe(icon_vframe);
232 //printf("AssetPicon::create_objects 4\n");
233         }
234         else
235         if(edl)
236         {
237 //printf("AssetPicon::create_objects 4 %s\n", edl->local_session->clip_title);
238                 strcpy(name, edl->local_session->clip_title);
239                 set_text(name);
240                 set_icon(gui->clip_icon);
241                 set_icon_vframe(mwindow->theme->get_image("clip_icon"));
242         }
243         else
244         if(plugin)
245         {
246                 strcpy(name, _(plugin->title));
247                 set_text(name);
248                 if(plugin->picon)
249                 {
250                         if(plugin->picon->get_color_model() == BC_RGB888)
251                         {
252                                 icon = new BC_Pixmap(gui, 
253                                         plugin->picon->get_w(), 
254                                         plugin->picon->get_h());
255                                 icon->draw_vframe(plugin->picon,
256                                         0,
257                                         0,
258                                         plugin->picon->get_w(), 
259                                         plugin->picon->get_h(),
260                                         0,
261                                         0);
262                         }
263                         else
264                         {
265                                 icon = new BC_Pixmap(gui, 
266                                         plugin->picon, 
267                                         PIXMAP_ALPHA);
268                         }
269                         icon_vframe = new VFrame (*plugin->picon);
270                 }
271                 else
272                 {
273                         icon = gui->file_icon;
274                         icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_UNKNOWN];
275                 }
276                 set_icon(icon);
277                 set_icon_vframe(icon_vframe);
278         }
279         else
280         if(label)
281         {
282                 Units::totext(name, 
283                               label->position,
284                               mwindow->edl->session->time_format,
285                               mwindow->edl->session->sample_rate,
286                               mwindow->edl->session->frame_rate,
287                               mwindow->edl->session->frames_per_foot);
288                 set_text(name);
289                 icon = gui->file_icon;
290                 icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_UNKNOWN];
291                 set_icon(icon);
292                 set_icon_vframe(icon_vframe);
293         }
302 AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow)
303  : BC_Window(PROGRAM_NAME ": Resources",
304         mwindow->session->awindow_x, 
305     mwindow->session->awindow_y, 
306     mwindow->session->awindow_w, 
307     mwindow->session->awindow_h,
308     100,
309     100,
310     1,
311     1,
312     1)
314 // printf("AWindowGUI::AWindowGUI %d %d %d %d\n",
315 // mwindow->session->awindow_x, 
316 // mwindow->session->awindow_y, 
317 // mwindow->session->awindow_w, 
318 // mwindow->session->awindow_h);
319         this->mwindow = mwindow;
320         this->awindow = awindow;
321         temp_picon = 0;
322         allow_iconlisting = 1;
325 AWindowGUI::~AWindowGUI()
327         assets.remove_all_objects();
328         folders.remove_all_objects();
329         aeffects.remove_all_objects();
330         veffects.remove_all_objects();
331         atransitions.remove_all_objects();
332         vtransitions.remove_all_objects();
333         labellist.remove_all_objects();
334         displayed_assets[1].remove_all_objects();
335         delete file_icon;
336         delete audio_icon;
337         delete folder_icon;
338         delete clip_icon;
339         delete newfolder_thread;
340         delete asset_menu;
341         delete label_menu;
342         delete assetlist_menu;
343         delete folderlist_menu;
344         if(temp_picon) delete temp_picon;
347 int AWindowGUI::create_objects()
349         int x, y;
350         AssetPicon *picon;
352 //printf("AWindowGUI::create_objects 1\n");
353         asset_titles[0] = _("Title");
354         asset_titles[1] = _("Comments");
356         set_icon(mwindow->theme->get_image("awindow_icon"));
357         file_icon = new BC_Pixmap(this, 
358                 BC_WindowBase::get_resources()->type_to_icon[ICON_UNKNOWN],
359                 PIXMAP_ALPHA);
361         folder_icon = new BC_Pixmap(this, 
362                 BC_WindowBase::get_resources()->type_to_icon[ICON_FOLDER],
363                 PIXMAP_ALPHA);
365         audio_icon = new BC_Pixmap(this, 
366                 BC_WindowBase::get_resources()->type_to_icon[ICON_SOUND],
367                 PIXMAP_ALPHA);
369         video_icon = new BC_Pixmap(this, 
370                 BC_WindowBase::get_resources()->type_to_icon[ICON_FILM],
371                 PIXMAP_ALPHA);
373         clip_icon = new BC_Pixmap(this, 
374                 mwindow->theme->get_image("clip_icon"),
375                 PIXMAP_ALPHA);
377 // Mandatory folders
378         folders.append(picon = new AssetPicon(mwindow,
379                 this,
380                 AEFFECT_FOLDER));
381         picon->persistent = 1;
382         folders.append(picon = new AssetPicon(mwindow,
383                 this,
384                 VEFFECT_FOLDER));
385         picon->persistent = 1;
386         folders.append(picon = new AssetPicon(mwindow,
387                 this,
388                 ATRANSITION_FOLDER));
389         picon->persistent = 1;
390         folders.append(picon = new AssetPicon(mwindow,
391                 this,
392                 VTRANSITION_FOLDER));
393         picon->persistent = 1;
394         folders.append(picon = new AssetPicon(mwindow,
395                 this,
396                 LABEL_FOLDER));
397         picon->persistent = 1;
399         create_label_folder();
400         create_persistent_folder(&aeffects, 1, 0, 1, 0);
401         create_persistent_folder(&veffects, 0, 1, 1, 0);
402         create_persistent_folder(&atransitions, 1, 0, 0, 1);
403         create_persistent_folder(&vtransitions, 0, 1, 0, 1);
405         mwindow->theme->get_awindow_sizes(this);
406         add_subwindow(asset_list = new AWindowAssets(mwindow,
407                 this,
408                 mwindow->theme->alist_x, 
409         mwindow->theme->alist_y, 
410         mwindow->theme->alist_w, 
411         mwindow->theme->alist_h));
412         add_subwindow(divider = new AWindowDivider(mwindow,
413                 this,
414                 mwindow->theme->adivider_x,
415                 mwindow->theme->adivider_y,
416                 mwindow->theme->adivider_w,
417                 mwindow->theme->adivider_h));
418         divider->set_cursor(HSEPARATE_CURSOR);
419         add_subwindow(folder_list = new AWindowFolders(mwindow,
420                 this,
421                 mwindow->theme->afolders_x, 
422         mwindow->theme->afolders_y, 
423         mwindow->theme->afolders_w, 
424         mwindow->theme->afolders_h));
425         
426         x = mwindow->theme->abuttons_x;
427         y = mwindow->theme->abuttons_y;
429         newfolder_thread = new NewFolderThread(mwindow, this);
431         add_subwindow(asset_menu = new AssetPopup(mwindow, this));
432         asset_menu->create_objects();
434         add_subwindow(label_menu = new LabelPopup(mwindow, this));
435         label_menu->create_objects();
437         add_subwindow(assetlist_menu = new AssetListMenu(mwindow, this));
438         assetlist_menu->create_objects();
440         add_subwindow(folderlist_menu = new FolderListMenu(mwindow, this));
441         folderlist_menu->create_objects();
442 //printf("AWindowGUI::create_objects 2\n");
444         return 0;
447 int AWindowGUI::resize_event(int w, int h)
449         mwindow->session->awindow_x = get_x();
450         mwindow->session->awindow_y = get_y();
451         mwindow->session->awindow_w = w;
452         mwindow->session->awindow_h = h;
454         mwindow->theme->get_awindow_sizes(this);
455         mwindow->theme->draw_awindow_bg(this);
457         asset_list->reposition_window(mwindow->theme->alist_x, 
458         mwindow->theme->alist_y, 
459         mwindow->theme->alist_w, 
460         mwindow->theme->alist_h);
461         divider->reposition_window(mwindow->theme->adivider_x,
462                 mwindow->theme->adivider_y,
463                 mwindow->theme->adivider_w,
464                 mwindow->theme->adivider_h);
465         folder_list->reposition_window(mwindow->theme->afolders_x, 
466         mwindow->theme->afolders_y, 
467         mwindow->theme->afolders_w, 
468         mwindow->theme->afolders_h);
469         
470         int x = mwindow->theme->abuttons_x;
471         int y = mwindow->theme->abuttons_y;
473 //      new_bin->reposition_window(x, y);
474 //      x += new_bin->get_w();
475 //      delete_bin->reposition_window(x, y);
476 //      x += delete_bin->get_w();
477 //      rename_bin->reposition_window(x, y);
478 //      x += rename_bin->get_w();
479 //      delete_disk->reposition_window(x, y);
480 //      x += delete_disk->get_w();
481 //      delete_project->reposition_window(x, y);
482 //      x += delete_project->get_w();
483 //      info->reposition_window(x, y);
484 //      x += info->get_w();
485 //      redraw_index->reposition_window(x, y);
486 //      x += redraw_index->get_w();
487 //      paste->reposition_window(x, y);
488 //      x += paste->get_w();
489 //      append->reposition_window(x, y);
490 //      x += append->get_w();
491 //      view->reposition_window(x, y);
493         BC_WindowBase::resize_event(w, h);
494         return 1;
497 int AWindowGUI::translation_event()
499         mwindow->session->awindow_x = get_x();
500         mwindow->session->awindow_y = get_y();
501         return 0;
504 void AWindowGUI::reposition_objects()
506         mwindow->theme->get_awindow_sizes(this);
507         asset_list->reposition_window(mwindow->theme->alist_x, 
508         mwindow->theme->alist_y, 
509         mwindow->theme->alist_w, 
510         mwindow->theme->alist_h);
511         divider->reposition_window(mwindow->theme->adivider_x,
512                 mwindow->theme->adivider_y,
513                 mwindow->theme->adivider_w,
514                 mwindow->theme->adivider_h);
515         folder_list->reposition_window(mwindow->theme->afolders_x, 
516         mwindow->theme->afolders_y, 
517         mwindow->theme->afolders_w, 
518         mwindow->theme->afolders_h);
519         flush();
522 int AWindowGUI::close_event()
524         hide_window();
525         mwindow->session->show_awindow = 0;
526         unlock_window();
528         mwindow->gui->lock_window("AWindowGUI::close_event");
529         mwindow->gui->mainmenu->show_awindow->set_checked(0);
530         mwindow->gui->unlock_window();
532         lock_window("AWindowGUI::close_event");
533         mwindow->save_defaults();
534         return 1;
538 int AWindowGUI::keypress_event()
540         switch(get_keypress())
541         {
542                 case 'w':
543                 case 'W':
544                         if(ctrl_down())
545                         {
546                                 close_event();
547                                 return 1;
548                         }
549                         break;
550         }
551         return 0;
554 void AWindowGUI::update_folder_list()
556 //printf("AWindowGUI::update_folder_list 1\n");
557         for(int i = 0; i < folders.total; i++)
558         {
559                 AssetPicon *picon = (AssetPicon*)folders.values[i];
560                 picon->in_use--;
561         }
562 //printf("AWindowGUI::update_folder_list 1\n");
564 // Search assets for folders
565         for(int i = 0; i < mwindow->edl->folders.total; i++)
566         {
567                 char *folder = mwindow->edl->folders.values[i];
568                 int exists = 0;
569 //printf("AWindowGUI::update_folder_list 1.1\n");
571                 for(int j = 0; j < folders.total; j++)
572                 {
573                         AssetPicon *picon = (AssetPicon*)folders.values[j];
574                         if(!strcasecmp(picon->get_text(), folder))
575                         {
576                                 exists = 1;
577                                 picon->in_use = 1;
578                                 break;
579                         }
580                 }
582                 if(!exists)
583                 {
584                         AssetPicon *picon = new AssetPicon(mwindow, this, folder);
585                         picon->create_objects();
586                         folders.append(picon);
587                 }
588 //printf("AWindowGUI::update_folder_list 1.3\n");
589         }
590 //printf("AWindowGUI::update_folder_list 1\n");
591 //for(int i = 0; i < folders.total; i++)
592 //      printf("AWindowGUI::update_folder_list %s\n", folders.values[i]->get_text());
594 // Delete excess
595         for(int i = folders.total - 1; i >= 0; i--)
596         {
597                 AssetPicon *picon = (AssetPicon*)folders.values[i];
598                 if(!picon->in_use && !picon->persistent)
599                 {
600                         delete picon;
601                         folders.remove_number(i);
602                 }
603         }
604 //for(int i = 0; i < folders.total; i++)
605 //      printf("AWindowGUI::update_folder_list %s\n", folders.values[i]->get_text());
606 //printf("AWindowGUI::update_folder_list 2\n");
609 void AWindowGUI::create_persistent_folder(ArrayList<BC_ListBoxItem*> *output, 
610         int do_audio, 
611         int do_video, 
612         int is_realtime, 
613         int is_transition)
615         ArrayList<PluginServer*> plugindb;
617 // Get pointers to plugindb entries
618         mwindow->create_plugindb(do_audio, 
619                         do_video, 
620                         is_realtime, 
621                         is_transition,
622                         0,
623                         plugindb);
625         for(int i = 0; i < plugindb.total; i++)
626         {
627                 PluginServer *server = plugindb.values[i];
628                 int exists = 0;
630 // Create new listitem
631                 if(!exists)
632                 {
633                         AssetPicon *picon = new AssetPicon(mwindow, this, server);
634                         picon->create_objects();
635                         output->append(picon);
636                 }
637         }
640 void AWindowGUI::create_label_folder()
642         Label *current;
643         for(current = mwindow->edl->labels->first; current; current = NEXT) {
644                 AssetPicon *picon = new AssetPicon(mwindow, this, current);
645                 picon->create_objects();
646                 labellist.append(picon);
647         }
651 void AWindowGUI::update_asset_list()
653 //printf("AWindowGUI::update_asset_list 1\n");
654         for(int i = 0; i < assets.total; i++)
655         {
656                 AssetPicon *picon = (AssetPicon*)assets.values[i];
657                 picon->in_use--;
658         }
664 //printf("AWindowGUI::update_asset_list 2\n");
667 // Synchronize EDL clips
668         for(int i = 0; i < mwindow->edl->clips.total; i++)
669         {
670                 int exists = 0;
671                 
672 // Look for clip in existing listitems
673                 for(int j = 0; j < assets.total && !exists; j++)
674                 {
675                         AssetPicon *picon = (AssetPicon*)assets.values[j];
676                         
677                         if(picon->id == mwindow->edl->clips.values[i]->id)
678                         {
679                                 picon->edl = mwindow->edl->clips.values[i];
680                                 picon->set_text(mwindow->edl->clips.values[i]->local_session->clip_title);
681                                 exists = 1;
682                                 picon->in_use = 1;
683                         }
684                 }
686 // Create new listitem
687                 if(!exists)
688                 {
689                         AssetPicon *picon = new AssetPicon(mwindow, 
690                                 this, 
691                                 mwindow->edl->clips.values[i]);
692                         picon->create_objects();
693                         assets.append(picon);
694                 }
695         }
703 //printf("AWindowGUI::update_asset_list 3 %d\n", assets.total);
704 // Synchronize EDL assets
705         for(Asset *current = mwindow->edl->assets->first; 
706                 current; 
707                 current = NEXT)
708         {
709                 int exists = 0;
711 //printf("AWindowGUI::update_asset_list 3 %s\n", current->path);
712 // Look for asset in existing listitems
713                 for(int j = 0; j < assets.total && !exists; j++)
714                 {
715                         AssetPicon *picon = (AssetPicon*)assets.values[j];
717                         if(picon->id == current->id)
718                         {
719 //printf("AWindowGUI::update_asset_list 4 %p %d %d\n", picon->asset, picon->get_icon_x(), picon->get_icon_y());
720                                 picon->asset = current;
721                                 exists = 1;
722                                 picon->in_use = 1;
723                                 break;
724                         }
725                 }
727 //printf("AWindowGUI::update_asset_list 5\n");
728 // Create new listitem
729                 if(!exists)
730                 {
731 //printf("AWindowGUI::update_asset_list 4.1 %s\n", current->path);
732                         AssetPicon *picon = new AssetPicon(mwindow, this, current);
733 //printf("AWindowGUI::update_asset_list 4.2 %s\n", current->path);
734                         picon->create_objects();
735 //printf("AWindowGUI::update_asset_list 4.3 %s\n", current->path);
736                         assets.append(picon);
737 //printf("AWindowGUI::update_asset_list 4.4 %s\n", current->path);
738                 }
739         }
749 //printf("AWindowGUI::update_asset_list 6\n");
750         for(int i = assets.total - 1; i >= 0; i--)
751         {
752                 AssetPicon *picon = (AssetPicon*)assets.values[i];
753 //printf("AWindowGUI::update_asset_list %s %d\n", picon->asset->path, picon->in_use);
754                 if(!picon->in_use)
755                 {
756                         delete picon;
757                         assets.remove_number(i);
758                 }
759         }
760 //printf("AWindowGUI::update_asset_list 7 %d\n", assets.total);
767 void AWindowGUI::sort_assets()
769 //printf("AWindowGUI::sort_assets 1 %s\n", mwindow->edl->session->current_folder);
770         if(!strcasecmp(mwindow->edl->session->current_folder, AEFFECT_FOLDER))
771                 sort_picons(&aeffects, 
772                         0);
773         else
774         if(!strcasecmp(mwindow->edl->session->current_folder, VEFFECT_FOLDER))
775                 sort_picons(&veffects, 
776                         0);
777         else
778         if(!strcasecmp(mwindow->edl->session->current_folder, ATRANSITION_FOLDER))
779                 sort_picons(&atransitions, 
780                         0);
781         else
782         if(!strcasecmp(mwindow->edl->session->current_folder, VTRANSITION_FOLDER))
783                 sort_picons(&vtransitions, 
784                         0);
785         else
786         if(!strcasecmp(mwindow->edl->session->current_folder, LABEL_FOLDER))
787                 ;// Labels should ALWAYS be sorted by time.
788         else
789                 sort_picons(&assets, 
790                         mwindow->edl->session->current_folder);
792         update_assets();
805 void AWindowGUI::collect_assets()
807         int i = 0;
808         mwindow->session->drag_assets->remove_all();
809         mwindow->session->drag_clips->remove_all();
810         while(1)
811         {
812                 AssetPicon *result = (AssetPicon*)asset_list->get_selection(0, i++);
813                 if(!result) break;
815                 if(result->asset) mwindow->session->drag_assets->append(result->asset);
816                 if(result->edl) mwindow->session->drag_clips->append(result->edl);
817         }
820 void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst, 
821         ArrayList<BC_ListBoxItem*> *src, 
822         char *folder)
824 // Remove current pointers
825         dst[0].remove_all();
826         dst[1].remove_all_objects();
828 // Create new pointers
829 //if(folder) printf("AWindowGUI::copy_picons 1 %s\n", folder);
830         for(int i = 0; i < src->total; i++)
831         {
832                 AssetPicon *picon = (AssetPicon*)src->values[i];
833 //printf("AWindowGUI::copy_picons 2 %s\n", picon->asset->folder);
834                 if(!folder ||
835                         (folder && picon->asset && !strcasecmp(picon->asset->folder, folder)) ||
836                         (folder && picon->edl && !strcasecmp(picon->edl->local_session->folder, folder)))
837                 {
838                         BC_ListBoxItem *item2, *item1;
839                         dst[0].append(item1 = picon);
840                         if(picon->edl)
841                                 dst[1].append(item2 = new BC_ListBoxItem(picon->edl->local_session->clip_notes));
842                         else
843                         if(picon->label && picon->label->textstr)
844                                 dst[1].append(item2 = new BC_ListBoxItem(picon->label->textstr));
845                         else
846                                 dst[1].append(item2 = new BC_ListBoxItem(""));
847                         item1->set_autoplace_text(1);
848                         item2->set_autoplace_text(1);
849 //printf("AWindowGUI::copy_picons 3 %s\n", picon->get_text());
850                 }
851         }
854 void AWindowGUI::sort_picons(ArrayList<BC_ListBoxItem*> *src, 
855                 char *folder)
857 //printf("AWindowGUI::sort_picons 1\n")
858         int done = 0;
859         while(!done)
860         {
861                 done = 1;
862                 for(int i = 0; i < src->total - 1; i++)
863                 {
864                         BC_ListBoxItem *item1 = src->values[i];
865                         BC_ListBoxItem *item2 = src->values[i + 1];
866                         item1->set_autoplace_icon(1);
867                         item2->set_autoplace_icon(1);
868                         item1->set_autoplace_text(1);
869                         item2->set_autoplace_text(1);
870                         if(strcmp(item1->get_text(), item2->get_text()) > 0)
871                         {
872                                 src->values[i + 1] = item1;
873                                 src->values[i] = item2;
874                                 done = 0;
875                         }
876                 }
877         }
881 void AWindowGUI::filter_displayed_assets()
883         allow_iconlisting = 1;
884         asset_titles[0] = _("Title");
885         asset_titles[1] = _("Comments");
886         if(!strcasecmp(mwindow->edl->session->current_folder, AEFFECT_FOLDER))
887                 copy_picons(displayed_assets, 
888                         &aeffects, 
889                         0);
890         else
891         if(!strcasecmp(mwindow->edl->session->current_folder, VEFFECT_FOLDER))
892                 copy_picons(displayed_assets, 
893                         &veffects, 
894                         0);
895         else
896         if(!strcasecmp(mwindow->edl->session->current_folder, ATRANSITION_FOLDER))
897                 copy_picons(displayed_assets, 
898                         &atransitions, 
899                         0);
900         else
901         if(!strcasecmp(mwindow->edl->session->current_folder, VTRANSITION_FOLDER))
902                 copy_picons(displayed_assets, 
903                         &vtransitions, 
904                         0);
905         else
906         if(!strcasecmp(mwindow->edl->session->current_folder, LABEL_FOLDER)) {
907                 copy_picons(displayed_assets, 
908                             &labellist, 
909                             0);
910                 asset_titles[0] = _("Time Stamps");
911                 asset_titles[1] = _("Title");
912                 allow_iconlisting = 0;
913         }
914         else
915                 copy_picons(displayed_assets, 
916                         &assets, 
917                         mwindow->edl->session->current_folder);
918         // Ensure the current folder icon is highlighted
919         for(int i = 0; i < folders.total; i++)
920         {
921                 if(!strcasecmp(mwindow->edl->session->current_folder, folders.values[i]->get_text()))
922                         folders.values[i]->set_selected(1);
923                 else
924                         folders.values[i]->set_selected(0);
925         }
929 void AWindowGUI::update_assets()
931 //printf("AWindowGUI::update_assets 1\n");
932         update_folder_list();
933 //printf("AWindowGUI::update_assets 2\n");
934         update_asset_list();
935         labellist.remove_all_objects();
936         create_label_folder();
937 //printf("AWindowGUI::update_assets 3\n");
938         filter_displayed_assets();
940 //for(int i = 0; i < folders.total; i++)
941 //printf("AWindowGUI::update_assets 4\n");
942 //      printf("AWindowGUI::update_assets %s\n", folders.values[i]->get_text());
943         if(mwindow->edl->session->folderlist_format != folder_list->get_format())
944                 folder_list->update_format(mwindow->edl->session->folderlist_format, 0);
945         folder_list->update(&folders,
946                 0,
947                 0,
948                 1,
949                 folder_list->get_xposition(),
950                 folder_list->get_yposition(),
951                 -1);
952 //printf("AWindowGUI::update_assets 5\n");
954         if(mwindow->edl->session->assetlist_format != asset_list->get_format())
955                 asset_list->update_format(mwindow->edl->session->assetlist_format, 0);
958 //printf("AWindowGUI::update_assets 6 %d\n", displayed_assets[0].total);
959         asset_list->update(displayed_assets,
960                 asset_titles,
961                 mwindow->edl->session->asset_columns,
962                 ASSET_COLUMNS, 
963                 asset_list->get_xposition(),
964                 asset_list->get_yposition(),
965                 -1,
966                 0);
967 //printf("AWindowGUI::update_assets 7\n");
969         flush();
970 //printf("AWindowGUI::update_assets 8\n");
971         return;
974 int AWindowGUI::current_folder_number()
976         int result = -1;
977         for(int i = 0; i < folders.total; i++)
978         {
979                 if(!strcasecmp(folders.values[i]->get_text(), mwindow->edl->session->current_folder))
980                 {
981                         result = i;
982                         break;
983                 }
984         }
985         return result;
988 int AWindowGUI::drag_motion()
990         if(get_hidden()) return 0;
992         int result = 0;
993         return result;
996 int AWindowGUI::drag_stop()
998         if(get_hidden()) return 0;
1000         return 0;
1003 Asset* AWindowGUI::selected_asset()
1005         AssetPicon *picon = (AssetPicon*)asset_list->get_selection(0, 0);
1006         if(picon) return picon->asset;
1009 PluginServer* AWindowGUI::selected_plugin()
1011         AssetPicon *picon = (AssetPicon*)asset_list->get_selection(0, 0);
1012         if(picon) return picon->plugin;
1015 AssetPicon* AWindowGUI::selected_folder()
1017         AssetPicon *picon = (AssetPicon*)folder_list->get_selection(0, 0);
1018     return picon;
1030 AWindowDivider::AWindowDivider(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h)
1031  : BC_SubWindow(x, y, w, h)
1033         this->mwindow = mwindow;
1034         this->gui = gui;
1036 AWindowDivider::~AWindowDivider()
1040 int AWindowDivider::button_press_event()
1042         if(is_event_win() && cursor_inside())
1043         {
1044                 mwindow->session->current_operation = DRAG_PARTITION;
1045                 return 1;
1046         }
1047         return 0;
1050 int AWindowDivider::cursor_motion_event()
1052         if(mwindow->session->current_operation == DRAG_PARTITION)
1053         {
1054                 mwindow->session->afolders_w = gui->get_relative_cursor_x();
1055                 gui->reposition_objects();
1056         }
1057         return 0;
1060 int AWindowDivider::button_release_event()
1062         if(mwindow->session->current_operation == DRAG_PARTITION)
1063         {
1064                 mwindow->session->current_operation = NO_OPERATION;
1065                 return 1;
1066         }
1067         return 0;
1075 AWindowFolders::AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h)
1076  : BC_ListBox(x, 
1077                 y, 
1078                 w, 
1079                 h,
1080                 mwindow->edl->session->folderlist_format == FOLDERS_ICONS ? 
1081                         LISTBOX_ICONS : LISTBOX_TEXT, 
1082                 &gui->folders, // Each column has an ArrayList of BC_ListBoxItems.
1083                 0,             // Titles for columns.  Set to 0 for no titles
1084                 0,                // width of each column
1085                 1,                      // Total columns.
1086                 0,                    // Pixel of top of window.
1087                 0,                        // If this listbox is a popup window
1088                 LISTBOX_SINGLE,  // Select one item or multiple items
1089                 ICON_TOP,        // Position of icon relative to text of each item
1090                 1)               // Allow drags
1092         this->mwindow = mwindow;
1093         this->gui = gui;
1094         set_drag_scroll(0);
1097 AWindowFolders::~AWindowFolders()
1100         
1101 int AWindowFolders::selection_changed()
1103         AssetPicon *picon = (AssetPicon*)get_selection(0, 0);
1104         if(picon)
1105         {
1106                 strcpy(mwindow->edl->session->current_folder, picon->get_text());
1107 //printf("AWindowFolders::selection_changed 1\n");
1108                 gui->asset_list->draw_background();
1109                 gui->update_assets();
1110         }
1111         return 1;
1114 int AWindowFolders::button_press_event()
1116         int result = 0;
1118         result = BC_ListBox::button_press_event();
1120         if(!result)
1121         {
1122                 if(get_buttonpress() == 3 && is_event_win() && cursor_inside())
1123                 {
1124                         gui->folderlist_menu->update_titles();
1125                         gui->folderlist_menu->activate_menu();
1126                         result = 1;
1127                 }
1128         }
1131         return result;
1140 AWindowAssets::AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h)
1141  : BC_ListBox(x, 
1142                 y, 
1143                 w, 
1144                 h,
1145                 (mwindow->edl->session->assetlist_format == ASSETS_ICONS && gui->allow_iconlisting ) ? 
1146                         LISTBOX_ICONS : LISTBOX_TEXT,
1147                 &gui->assets,     // Each column has an ArrayList of BC_ListBoxItems.
1148                 gui->asset_titles,             // Titles for columns.  Set to 0 for no titles
1149                 mwindow->edl->session->asset_columns,                // width of each column
1150                 1,                      // Total columns.
1151                 0,                    // Pixel of top of window.
1152                 0,                        // If this listbox is a popup window
1153                 LISTBOX_MULTIPLE,  // Select one item or multiple items
1154                 ICON_TOP,        // Position of icon relative to text of each item
1155                 1)               // Allow drag
1157         this->mwindow = mwindow;
1158         this->gui = gui;
1159         set_drag_scroll(0);
1162 AWindowAssets::~AWindowAssets()
1166 int AWindowAssets::button_press_event()
1168         int result = 0;
1170         result = BC_ListBox::button_press_event();
1172         if(!result && get_buttonpress() == 3 && is_event_win() && cursor_inside())
1173         {
1174                 BC_ListBox::deactivate_selection();
1175                 gui->assetlist_menu->update_titles();
1176                 gui->assetlist_menu->activate_menu();
1177                 result = 1;
1178         }
1181         return result;
1185 int AWindowAssets::handle_event()
1187 //printf("AWindowAssets::handle_event 1 %d %d\n", get_buttonpress(), get_selection(0, 0));
1188         if(get_selection(0, 0))
1189         {
1190                 if(!strcasecmp(mwindow->edl->session->current_folder, AEFFECT_FOLDER))
1191                 {
1192                 }
1193                 else
1194                 if(!strcasecmp(mwindow->edl->session->current_folder, VEFFECT_FOLDER))
1195                 {
1196                 }
1197                 else
1198                 if(!strcasecmp(mwindow->edl->session->current_folder, ATRANSITION_FOLDER))
1199                 {
1200                 }
1201                 else
1202                 if(!strcasecmp(mwindow->edl->session->current_folder, VTRANSITION_FOLDER))
1203                 {
1204                 }
1205                 else
1206                 {
1207 //printf("AWindowAssets::handle_event 2 %d %d\n", get_buttonpress(), get_selection(0, 0));
1208                         mwindow->vwindow->gui->lock_window("AWindowAssets::handle_event");
1209                         
1210                         if(((AssetPicon*)get_selection(0, 0))->asset)
1211                                 mwindow->vwindow->change_source(((AssetPicon*)get_selection(0, 0))->asset);
1212                         else
1213                         if(((AssetPicon*)get_selection(0, 0))->edl)
1214                                 mwindow->vwindow->change_source(((AssetPicon*)get_selection(0, 0))->edl);
1216                         mwindow->vwindow->gui->unlock_window();
1217                 }
1218                 return 1;
1219         }
1221         return 0;
1224 int AWindowAssets::selection_changed()
1226 // Show popup window
1227         if(get_button_down() && get_buttonpress() == 3 && get_selection(0, 0))
1228         {
1229                 if(!strcasecmp(mwindow->edl->session->current_folder, AEFFECT_FOLDER) || 
1230                         !strcasecmp(mwindow->edl->session->current_folder, VEFFECT_FOLDER) ||
1231                         !strcasecmp(mwindow->edl->session->current_folder, ATRANSITION_FOLDER) ||
1232                         !strcasecmp(mwindow->edl->session->current_folder, VTRANSITION_FOLDER))
1233                 {
1234                         gui->assetlist_menu->update_titles();
1235                         gui->assetlist_menu->activate_menu();
1236                 }
1237                 else
1238                 if (!strcasecmp(mwindow->edl->session->current_folder, LABEL_FOLDER)) 
1239                 {
1240                         if(((AssetPicon*)get_selection(0, 0))->label)
1241                                 gui->label_menu->activate_menu();
1242                 }
1243                 else
1244                 {
1245                         if(((AssetPicon*)get_selection(0, 0))->asset)
1246                                 gui->asset_menu->update();
1247                         else
1248                         if(((AssetPicon*)get_selection(0, 0))->edl)
1249                                 gui->asset_menu->update();
1253                         gui->asset_menu->activate_menu();
1254                 }
1256                 BC_ListBox::deactivate_selection();
1257                 return 1;
1258         }
1259         return 0;
1262 void AWindowAssets::draw_background()
1264         BC_ListBox::draw_background();
1265         set_color(BC_WindowBase::get_resources()->audiovideo_color);
1266         set_font(LARGEFONT);
1267         draw_text(get_w() - 
1268                         get_text_width(LARGEFONT, mwindow->edl->session->current_folder) - 4, 
1269                 30, 
1270                 mwindow->edl->session->current_folder, 
1271                 -1, 
1272                 get_bg_surface());
1275 int AWindowAssets::drag_start_event()
1277         int collect_pluginservers = 0;
1278         int collect_assets = 0;
1280         if(BC_ListBox::drag_start_event())
1281         {
1282                 if(!strcasecmp(mwindow->edl->session->current_folder, AEFFECT_FOLDER))
1283                 {
1284                         mwindow->session->current_operation = DRAG_AEFFECT;
1285                         collect_pluginservers = 1;
1286                 }
1287                 else
1288                 if(!strcasecmp(mwindow->edl->session->current_folder, VEFFECT_FOLDER))
1289                 {
1290                         mwindow->session->current_operation = DRAG_VEFFECT;
1291                         collect_pluginservers = 1;
1292                 }
1293                 else
1294                 if(!strcasecmp(mwindow->edl->session->current_folder, ATRANSITION_FOLDER))
1295                 {
1296                         mwindow->session->current_operation = DRAG_ATRANSITION;
1297                         collect_pluginservers = 1;
1298                 }
1299                 else
1300                 if(!strcasecmp(mwindow->edl->session->current_folder, VTRANSITION_FOLDER))
1301                 {
1302                         mwindow->session->current_operation = DRAG_VTRANSITION;
1303                         collect_pluginservers = 1;
1304                 }
1305                 else
1306                 if(!strcasecmp(mwindow->edl->session->current_folder, LABEL_FOLDER))
1307                 {
1308                         // do nothing!
1309                 }
1310                 else
1311                 {
1312                         mwindow->session->current_operation = DRAG_ASSET;
1313                         collect_assets = 1;
1314                 }
1315                 
1316                 
1317                 if(collect_pluginservers)
1318                 {
1319                         int i = 0;
1320                         mwindow->session->drag_pluginservers->remove_all();
1321                         while(1)
1322                         {
1323                                 AssetPicon *result = (AssetPicon*)get_selection(0, i++);
1324                                 if(!result) break;
1325                                 
1326                                 mwindow->session->drag_pluginservers->append(result->plugin);
1327                         }
1328                 }
1329                 
1330                 if(collect_assets)
1331                 {
1332                         gui->collect_assets();
1333                 }
1335                 return 1;
1336         }
1337         return 0;
1340 int AWindowAssets::drag_motion_event()
1342         BC_ListBox::drag_motion_event();
1344         mwindow->gui->lock_window("AWindowAssets::drag_motion_event");
1345         mwindow->gui->drag_motion();
1346         mwindow->gui->unlock_window();
1348         mwindow->vwindow->gui->lock_window("AWindowAssets::drag_motion_event");
1349         mwindow->vwindow->gui->drag_motion();
1350         mwindow->vwindow->gui->unlock_window();
1352         mwindow->cwindow->gui->lock_window("AWindowAssets::drag_motion_event");
1353         mwindow->cwindow->gui->drag_motion();
1354         mwindow->cwindow->gui->unlock_window();
1355         return 0;
1358 int AWindowAssets::drag_stop_event()
1360         int result = 0;
1362         result = gui->drag_stop();
1365         if(!result)
1366         {
1367                 mwindow->gui->lock_window("AWindowAssets::drag_stop_event");
1368                 result = mwindow->gui->drag_stop();
1369                 mwindow->gui->unlock_window();
1370         }
1372         if(!result) 
1373         {
1374                 mwindow->vwindow->gui->lock_window("AWindowAssets::drag_stop_event");
1375                 result = mwindow->vwindow->gui->drag_stop();
1376                 mwindow->vwindow->gui->unlock_window();
1377         }
1379         if(!result) 
1380         {
1381                 mwindow->cwindow->gui->lock_window("AWindowAssets::drag_stop_event");
1382                 result = mwindow->cwindow->gui->drag_stop();
1383                 mwindow->cwindow->gui->unlock_window();
1384         }
1388         if(result) get_drag_popup()->set_animation(0);
1390         BC_ListBox::drag_stop_event();
1391         mwindow->session->current_operation = ::NO_OPERATION; // since NO_OPERATION is also defined in listbox, we have to reach for global scope...
1392         return 0;
1395 int AWindowAssets::column_resize_event()
1397         mwindow->edl->session->asset_columns[0] = get_column_width(0);
1398         mwindow->edl->session->asset_columns[1] = get_column_width(1);
1399         return 1;
1413 AWindowNewFolder::AWindowNewFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1414  : BC_Button(x, y, mwindow->theme->newbin_data)
1416         this->mwindow = mwindow;
1417         this->gui = gui;
1418         set_tooltip(_("New bin"));
1421 int AWindowNewFolder::handle_event()
1423         gui->newfolder_thread->start_new_folder();
1424         return 1;
1427 AWindowDeleteFolder::AWindowDeleteFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1428  : BC_Button(x, y, mwindow->theme->deletebin_data)
1430         this->mwindow = mwindow;
1431         this->gui = gui;
1432         set_tooltip(_("Delete bin"));
1435 int AWindowDeleteFolder::handle_event()
1437         if(gui->folder_list->get_selection(0, 0))
1438         {
1439                 BC_ListBoxItem *folder = gui->folder_list->get_selection(0, 0);
1440                 mwindow->delete_folder(folder->get_text());
1441         }
1442         return 1;
1445 AWindowRenameFolder::AWindowRenameFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1446  : BC_Button(x, y, mwindow->theme->renamebin_data)
1448         this->mwindow = mwindow;
1449         this->gui = gui;
1450         set_tooltip(_("Rename bin"));
1453 int AWindowRenameFolder::handle_event()
1455         return 1;
1458 AWindowDeleteDisk::AWindowDeleteDisk(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1459  : BC_Button(x, y, mwindow->theme->deletedisk_data)
1461         this->mwindow = mwindow;
1462         this->gui = gui;
1463         set_tooltip(_("Delete asset from disk"));
1466 int AWindowDeleteDisk::handle_event()
1468         return 1;
1471 AWindowDeleteProject::AWindowDeleteProject(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1472  : BC_Button(x, y, mwindow->theme->deleteproject_data)
1474         this->mwindow = mwindow;
1475         this->gui = gui;
1476         set_tooltip(_("Delete asset from project"));
1479 int AWindowDeleteProject::handle_event()
1481         return 1;
1484 AWindowInfo::AWindowInfo(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1485  : BC_Button(x, y, mwindow->theme->infoasset_data)
1487         this->mwindow = mwindow;
1488         this->gui = gui;
1489         set_tooltip(_("Edit information on asset"));
1492 int AWindowInfo::handle_event()
1494         gui->awindow->asset_edit->edit_asset(gui->selected_asset());
1495         return 1;
1498 AWindowRedrawIndex::AWindowRedrawIndex(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1499  : BC_Button(x, y, mwindow->theme->redrawindex_data)
1501         this->mwindow = mwindow;
1502         this->gui = gui;
1503         set_tooltip(_("Redraw index"));
1506 int AWindowRedrawIndex::handle_event()
1508         return 1;
1511 AWindowPaste::AWindowPaste(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1512  : BC_Button(x, y, mwindow->theme->pasteasset_data)
1514         this->mwindow = mwindow;
1515         this->gui = gui;
1516         set_tooltip(_("Paste asset on recordable tracks"));
1519 int AWindowPaste::handle_event()
1521         return 1;
1524 AWindowAppend::AWindowAppend(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1525  : BC_Button(x, y, mwindow->theme->appendasset_data)
1527         this->mwindow = mwindow;
1528         this->gui = gui;
1529         set_tooltip(_("Append asset in new tracks"));
1532 int AWindowAppend::handle_event()
1534         return 1;
1537 AWindowView::AWindowView(MWindow *mwindow, AWindowGUI *gui, int x, int y)
1538  : BC_Button(x, y, mwindow->theme->viewasset_data)
1540         this->mwindow = mwindow;
1541         this->gui = gui;
1542         set_tooltip(_("View asset"));
1545 int AWindowView::handle_event()
1547         return 1;
1552 LabelPopup::LabelPopup(MWindow *mwindow, AWindowGUI *gui)
1553  : BC_PopupMenu(0, 
1554                 0, 
1555                 0, 
1556                 "", 
1557                 0)
1559         this->mwindow = mwindow;
1560         this->gui = gui;
1563 LabelPopup::~LabelPopup()
1567 void LabelPopup::create_objects()
1569         add_item(editlabel = new LabelPopupEdit(mwindow, this));
1575 LabelPopupEdit::LabelPopupEdit(MWindow *mwindow, LabelPopup *popup)
1576  : BC_MenuItem(_("Edit..."))
1578         this->mwindow = mwindow;
1579         this->popup = popup;
1582 LabelPopupEdit::~LabelPopupEdit()
1586 int LabelPopupEdit::handle_event()
1588         int i = 0;
1589         while(1)
1590         {
1591                 AssetPicon *result = (AssetPicon*)mwindow->awindow->gui->asset_list->get_selection(0, i++);
1592                 if(!result) break;
1594                 if(result->label) {
1595                         mwindow->awindow->gui->awindow->label_edit->edit_label(result->label);
1596                         break;
1597                 }
1598         }
1600         return 1;