00001 #include "condition.h"
00002 #include "edl.h"
00003 #include "language.h"
00004 #include "localsession.h"
00005 #include "mainsession.h"
00006 #include "mainundo.h"
00007 #include "mwindow.h"
00008 #include "mwindowgui.h"
00009 #include "module.h"
00010 #include "mutex.h"
00011 #include "plugin.h"
00012 #include "plugindialog.h"
00013 #include "pluginserver.h"
00014 #include "theme.h"
00015 #include "track.h"
00016 #include "tracks.h"
00017 #include "transition.h"
00018
00019
00020 PluginDialogThread::PluginDialogThread(MWindow *mwindow)
00021 : Thread()
00022 {
00023 this->mwindow = mwindow;
00024 window = 0;
00025 plugin = 0;
00026 Thread::set_synchronous(0);
00027 window_lock = new Mutex("PluginDialogThread::window_lock");
00028 completion = new Condition(1, "PluginDialogThread::completion");
00029 }
00030
00031 PluginDialogThread::~PluginDialogThread()
00032 {
00033 if(window)
00034 {
00035 window->set_done(1);
00036 completion->lock("PluginDialogThread::~PluginDialogThread");
00037 completion->unlock();
00038 }
00039 delete window_lock;
00040 delete completion;
00041 }
00042
00043 void PluginDialogThread::start_window(Track *track,
00044 Plugin *plugin,
00045 char *title)
00046 {
00047 if(Thread::running())
00048 {
00049 window_lock->lock("PluginDialogThread::start_window");
00050 if(window)
00051 {
00052 window->lock_window("PluginDialogThread::start_window");
00053 window->raise_window();
00054 window->flush();
00055 window->unlock_window();
00056 }
00057 window_lock->unlock();
00058 }
00059 else
00060 {
00061 this->track = track;
00062 this->data_type = track->data_type;
00063 this->plugin = plugin;
00064
00065 if(plugin)
00066 {
00067 plugin->calculate_title(plugin_title, 0);
00068 this->shared_location = plugin->shared_location;
00069 this->plugin_type = plugin->plugin_type;
00070 }
00071 else
00072 {
00073 this->plugin_title[0] = 0;
00074 this->shared_location.plugin = -1;
00075 this->shared_location.module = -1;
00076 this->plugin_type = PLUGIN_NONE;
00077 }
00078
00079 strcpy(this->window_title, title);
00080 completion->lock("PluginDialogThread::start_window");
00081 Thread::start();
00082 }
00083 }
00084
00085
00086 int PluginDialogThread::set_dialog(Transition *transition, char *title)
00087 {
00088 return 0;
00089 }
00090
00091 void PluginDialogThread::run()
00092 {
00093 int result = 0;
00094
00095 plugin_type = 0;
00096 int x = mwindow->gui->get_abs_cursor_x(1) - mwindow->session->plugindialog_w / 2;
00097 int y = mwindow->gui->get_abs_cursor_y(1) - mwindow->session->plugindialog_h / 2;
00098
00099 window_lock->lock("PluginDialogThread::run 1");
00100 window = new PluginDialog(mwindow, this, window_title, x, y);
00101 window->create_objects();
00102 window_lock->unlock();
00103
00104 result = window->run_window();
00105
00106
00107 window_lock->lock("PluginDialogThread::run 2");
00108
00109 if(window->selected_available >= 0)
00110 {
00111 window->attach_new(window->selected_available);
00112 }
00113 else
00114 if(window->selected_shared >= 0)
00115 {
00116 window->attach_shared(window->selected_shared);
00117 }
00118 else
00119 if(window->selected_modules >= 0)
00120 {
00121 window->attach_module(window->selected_modules);
00122 }
00123
00124
00125
00126
00127 delete window;
00128 window = 0;
00129 window_lock->unlock();
00130
00131 completion->unlock();
00132
00133
00134 if(!result)
00135 {
00136
00137
00138 if(plugin_type)
00139 {
00140 mwindow->gui->lock_window("PluginDialogThread::run 3");
00141
00142
00143 if(plugin)
00144 {
00145 plugin->change_plugin(plugin_title,
00146 &shared_location,
00147 plugin_type);
00148 }
00149 else
00150 {
00151 mwindow->insert_effect(plugin_title,
00152 &shared_location,
00153 track,
00154 0,
00155 0,
00156 0,
00157 plugin_type);
00158 }
00159
00160
00161 mwindow->save_backup();
00162 mwindow->undo->update_undo(_("attach effect"), LOAD_EDITS | LOAD_PATCHES);
00163 mwindow->restart_brender();
00164 mwindow->update_plugin_states();
00165 mwindow->sync_parameters(CHANGE_EDL);
00166 mwindow->gui->update(1,
00167 1,
00168 0,
00169 0,
00170 1,
00171 0,
00172 0);
00173
00174 mwindow->gui->unlock_window();
00175 }
00176 }
00177 plugin = 0;
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 PluginDialog::PluginDialog(MWindow *mwindow,
00189 PluginDialogThread *thread,
00190 char *window_title,
00191 int x,
00192 int y)
00193 : BC_Window(window_title,
00194 x,
00195 y,
00196 mwindow->session->plugindialog_w,
00197 mwindow->session->plugindialog_h,
00198 510,
00199 415,
00200 1,
00201 0,
00202 1)
00203 {
00204 this->mwindow = mwindow;
00205 this->thread = thread;
00206
00207
00208
00209
00210
00211
00212 inoutthru = 0;
00213 }
00214
00215 PluginDialog::~PluginDialog()
00216 {
00217 int i;
00218 standalone_data.remove_all_objects();
00219
00220 shared_data.remove_all_objects();
00221
00222 module_data.remove_all_objects();
00223
00224 plugin_locations.remove_all_objects();
00225
00226 module_locations.remove_all_objects();
00227
00228
00229
00230 delete standalone_list;
00231 delete shared_list;
00232 delete module_list;
00233
00234
00235
00236
00237
00238
00239
00240
00241 }
00242
00243 int PluginDialog::create_objects()
00244 {
00245 int use_default = 1;
00246 char string[BCTEXTLEN];
00247 int module_number;
00248 mwindow->theme->get_plugindialog_sizes();
00249
00250 if(thread->plugin)
00251 {
00252 strcpy(string, thread->plugin->title);
00253 use_default = 1;
00254 }
00255 else
00256 {
00257
00258 sprintf(string, _("None"));
00259 }
00260
00261
00262
00263
00264
00265
00266
00267 mwindow->create_plugindb(thread->data_type == TRACK_AUDIO,
00268 thread->data_type == TRACK_VIDEO,
00269 1,
00270 0,
00271 0,
00272 plugindb);
00273
00274 mwindow->edl->get_shared_plugins(thread->track,
00275 &plugin_locations);
00276
00277 mwindow->edl->get_shared_tracks(thread->track,
00278 &module_locations);
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 for(int i = 0; i < plugindb.total; i++)
00289 standalone_data.append(new BC_ListBoxItem(_(plugindb.values[i]->title)));
00290 for(int i = 0; i < plugin_locations.total; i++)
00291 {
00292 Track *track = mwindow->edl->tracks->number(plugin_locations.values[i]->module);
00293 char *track_title = track->title;
00294 int number = plugin_locations.values[i]->plugin;
00295 Plugin *plugin = track->get_current_plugin(mwindow->edl->local_session->get_selectionstart(1),
00296 number,
00297 PLAY_FORWARD,
00298 1,
00299 0);
00300 char *plugin_title = plugin->title;
00301 char string[BCTEXTLEN];
00302
00303 sprintf(string, "%s: %s", track_title, _(plugin_title));
00304 shared_data.append(new BC_ListBoxItem(string));
00305 }
00306 for(int i = 0; i < module_locations.total; i++)
00307 {
00308 Track *track = mwindow->edl->tracks->number(module_locations.values[i]->module);
00309 module_data.append(new BC_ListBoxItem(track->title));
00310 }
00311
00312
00313
00314
00315
00316
00317 add_subwindow(standalone_title = new BC_Title(mwindow->theme->plugindialog_new_x,
00318 mwindow->theme->plugindialog_new_y - 20,
00319 _("Plugins:")));
00320 add_subwindow(standalone_list = new PluginDialogNew(this,
00321 &standalone_data,
00322 mwindow->theme->plugindialog_new_x,
00323 mwindow->theme->plugindialog_new_y,
00324 mwindow->theme->plugindialog_new_w,
00325 mwindow->theme->plugindialog_new_h));
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345 add_subwindow(shared_title = new BC_Title(mwindow->theme->plugindialog_shared_x,
00346 mwindow->theme->plugindialog_shared_y - 20,
00347 _("Shared effects:")));
00348 add_subwindow(shared_list = new PluginDialogShared(this,
00349 &shared_data,
00350 mwindow->theme->plugindialog_shared_x,
00351 mwindow->theme->plugindialog_shared_y,
00352 mwindow->theme->plugindialog_shared_w,
00353 mwindow->theme->plugindialog_shared_h));
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 add_subwindow(module_title = new BC_Title(mwindow->theme->plugindialog_module_x,
00374 mwindow->theme->plugindialog_module_y - 20,
00375 _("Shared tracks:")));
00376 add_subwindow(module_list = new PluginDialogModules(this,
00377 &module_data,
00378 mwindow->theme->plugindialog_module_x,
00379 mwindow->theme->plugindialog_module_y,
00380 mwindow->theme->plugindialog_module_w,
00381 mwindow->theme->plugindialog_module_h));
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 add_subwindow(new BC_OKButton(this));
00399
00400
00401 add_subwindow(new BC_CancelButton(this));
00402
00403 selected_available = -1;
00404 selected_shared = -1;
00405 selected_modules = -1;
00406
00407 show_window();
00408 flush();
00409 return 0;
00410 }
00411
00412 int PluginDialog::resize_event(int w, int h)
00413 {
00414 mwindow->session->plugindialog_w = w;
00415 mwindow->session->plugindialog_h = h;
00416 mwindow->theme->get_plugindialog_sizes();
00417
00418
00419 standalone_title->reposition_window(mwindow->theme->plugindialog_new_x,
00420 mwindow->theme->plugindialog_new_y - 20);
00421 standalone_list->reposition_window(mwindow->theme->plugindialog_new_x,
00422 mwindow->theme->plugindialog_new_y,
00423 mwindow->theme->plugindialog_new_w,
00424 mwindow->theme->plugindialog_new_h);
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436 shared_title->reposition_window(mwindow->theme->plugindialog_shared_x,
00437 mwindow->theme->plugindialog_shared_y - 20);
00438 shared_list->reposition_window(mwindow->theme->plugindialog_shared_x,
00439 mwindow->theme->plugindialog_shared_y,
00440 mwindow->theme->plugindialog_shared_w,
00441 mwindow->theme->plugindialog_shared_h);
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453 module_title->reposition_window(mwindow->theme->plugindialog_module_x,
00454 mwindow->theme->plugindialog_module_y - 20);
00455 module_list->reposition_window(mwindow->theme->plugindialog_module_x,
00456 mwindow->theme->plugindialog_module_y,
00457 mwindow->theme->plugindialog_module_w,
00458 mwindow->theme->plugindialog_module_h);
00459
00460
00461
00462
00463
00464
00465 flush();
00466 }
00467
00468 int PluginDialog::attach_new(int number)
00469 {
00470 if(number > -1 && number < standalone_data.total)
00471 {
00472 strcpy(thread->plugin_title, plugindb.values[number]->title);
00473 thread->plugin_type = PLUGIN_STANDALONE;
00474 }
00475 return 0;
00476 }
00477
00478 int PluginDialog::attach_shared(int number)
00479 {
00480 if(number > -1 && number < shared_data.total)
00481 {
00482 thread->plugin_type = PLUGIN_SHAREDPLUGIN;
00483 thread->shared_location = *(plugin_locations.values[number]);
00484 }
00485 return 0;
00486 }
00487
00488 int PluginDialog::attach_module(int number)
00489 {
00490 if(number > -1 && number < module_data.total)
00491 {
00492
00493 thread->plugin_type = PLUGIN_SHAREDMODULE;
00494 thread->shared_location = *(module_locations.values[number]);
00495 }
00496 return 0;
00497 }
00498
00499 int PluginDialog::save_settings()
00500 {
00501 }
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548 PluginDialogNew::PluginDialogNew(PluginDialog *dialog,
00549 ArrayList<BC_ListBoxItem*> *standalone_data,
00550 int x,
00551 int y,
00552 int w,
00553 int h)
00554 : BC_ListBox(x,
00555 y,
00556 w,
00557 h,
00558 LISTBOX_TEXT,
00559 standalone_data)
00560 {
00561 this->dialog = dialog;
00562 }
00563 PluginDialogNew::~PluginDialogNew() { }
00564 int PluginDialogNew::handle_event()
00565 {
00566
00567
00568
00569 set_done(0);
00570 return 1;
00571 }
00572 int PluginDialogNew::selection_changed()
00573 {
00574 dialog->selected_available = get_selection_number(0, 0);
00575
00576
00577 dialog->shared_list->set_all_selected(&dialog->shared_data, 0);
00578 dialog->shared_list->draw_items(1);
00579 dialog->module_list->set_all_selected(&dialog->module_data, 0);
00580 dialog->module_list->draw_items(1);
00581 dialog->selected_shared = -1;
00582 dialog->selected_modules = -1;
00583 return 1;
00584 }
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625 PluginDialogShared::PluginDialogShared(PluginDialog *dialog,
00626 ArrayList<BC_ListBoxItem*> *shared_data,
00627 int x,
00628 int y,
00629 int w,
00630 int h)
00631 : BC_ListBox(x,
00632 y,
00633 w,
00634 h,
00635 LISTBOX_TEXT,
00636 shared_data)
00637 {
00638 this->dialog = dialog;
00639 }
00640 PluginDialogShared::~PluginDialogShared() { }
00641 int PluginDialogShared::handle_event()
00642 {
00643
00644
00645 set_done(0);
00646 return 1;
00647 }
00648 int PluginDialogShared::selection_changed()
00649 {
00650 dialog->selected_shared = get_selection_number(0, 0);
00651
00652
00653 dialog->standalone_list->set_all_selected(&dialog->standalone_data, 0);
00654 dialog->standalone_list->draw_items(1);
00655 dialog->module_list->set_all_selected(&dialog->module_data, 0);
00656 dialog->module_list->draw_items(1);
00657 dialog->selected_available = -1;
00658 dialog->selected_modules = -1;
00659 return 1;
00660 }
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 PluginDialogModules::PluginDialogModules(PluginDialog *dialog,
00707 ArrayList<BC_ListBoxItem*> *module_data,
00708 int x,
00709 int y,
00710 int w,
00711 int h)
00712 : BC_ListBox(x,
00713 y,
00714 w,
00715 h,
00716 LISTBOX_TEXT,
00717 module_data)
00718 {
00719 this->dialog = dialog;
00720 }
00721 PluginDialogModules::~PluginDialogModules() { }
00722 int PluginDialogModules::handle_event()
00723 {
00724
00725
00726
00727 set_done(0);
00728 return 1;
00729 }
00730 int PluginDialogModules::selection_changed()
00731 {
00732 dialog->selected_modules = get_selection_number(0, 0);
00733
00734
00735 dialog->standalone_list->set_all_selected(&dialog->standalone_data, 0);
00736 dialog->standalone_list->draw_items(1);
00737 dialog->shared_list->set_all_selected(&dialog->shared_data, 0);
00738 dialog->shared_list->draw_items(1);
00739 dialog->selected_available = -1;
00740 dialog->selected_shared = -1;
00741 return 1;
00742 }
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790