00001 #include "batch.h"
00002 #include "bcsignals.h"
00003 #include "channel.h"
00004 #include "channeldb.h"
00005 #include "channeledit.h"
00006 #include "channelpicker.h"
00007 #include "chantables.h"
00008 #include "clip.h"
00009 #include "edl.h"
00010 #include "edlsession.h"
00011 #include "keys.h"
00012 #include "language.h"
00013 #include "mwindow.h"
00014 #include "picture.h"
00015 #include "playbackconfig.h"
00016 #include "preferencesthread.h"
00017 #include "record.h"
00018 #include "recordgui.h"
00019 #include "recordmonitor.h"
00020 #include "theme.h"
00021 #include "vdevicebuz.h"
00022 #include "vdeviceprefs.h"
00023 #include "videodevice.h"
00024
00025 RecordChannelPicker::RecordChannelPicker(MWindow *mwindow,
00026 Record *record,
00027 RecordMonitor *record_monitor,
00028 BC_WindowBase *parent_window,
00029 ChannelDB *channeldb,
00030 int x,
00031 int y)
00032 : ChannelPicker(channeldb,
00033 x,
00034 y,
00035 parent_window)
00036 {
00037 this->mwindow = mwindow;
00038 this->record = record;
00039 this->record_monitor = record_monitor;
00040 }
00041
00042 RecordChannelPicker::~RecordChannelPicker()
00043 {
00044 }
00045
00046 int RecordChannelPicker::use_select()
00047 {
00048 return 1;
00049 }
00050
00051 Channel* RecordChannelPicker::get_master_channel()
00052 {
00053 return record->master_channel;
00054 }
00055
00056 void RecordChannelPicker::handle_channel_edit(int result)
00057 {
00058 if(!result)
00059 {
00060 record->record_gui->lock_window("RecordChannelPicker::handle_channel_edit 1");
00061 record->record_gui->update_batch_sources();
00062
00063 record->set_channel(current_channel);
00064 record->record_gui->unlock_window();
00065 record->save_defaults();
00066 VideoDevice::save_channeldb(record->channeldb,
00067 mwindow->edl->session->vconfig_in);
00068 }
00069 else
00070 {
00071 record->record_gui->lock_window("RecordChannelPicker::handle_channel_edit 2");
00072 record->set_channel(record->get_editing_batch()->channel);
00073 record->record_gui->unlock_window();
00074 }
00075
00076 mwindow->save_defaults();
00077 }
00078
00079 void RecordChannelPicker::load_scan_defaults(Channel *scan_params)
00080 {
00081 scan_params->load_defaults(mwindow->defaults);
00082 }
00083
00084 void RecordChannelPicker::save_scan_defaults(Channel *scan_params)
00085 {
00086 scan_params->save_defaults(mwindow->defaults);
00087 }
00088
00089 BC_Theme* RecordChannelPicker::get_theme()
00090 {
00091 return mwindow->theme;
00092 }
00093
00094
00095 Channel* RecordChannelPicker::get_current_channel_struct()
00096 {
00097 return record->get_current_channel_struct();
00098 }
00099
00100 int RecordChannelPicker::get_current_channel_number()
00101 {
00102 return record->get_editing_channel();
00103 }
00104
00105 ArrayList<Channel*>* RecordChannelPicker::get_video_inputs()
00106 {
00107 return record->get_video_inputs();
00108 }
00109
00110 Channel* RecordChannelPicker::get_channel_usage()
00111 {
00112 return record->master_channel;
00113 }
00114
00115 void RecordChannelPicker::set_channel_number(int number)
00116 {
00117 record->set_channel(number);
00118 }
00119
00120 int RecordChannelPicker::set_brightness(int value)
00121 {
00122 if(record)
00123 {
00124 record->picture->brightness = value;
00125 record->set_video_picture();
00126 }
00127 return 0;
00128 }
00129
00130 int RecordChannelPicker::set_hue(int value)
00131 {
00132 if(record)
00133 {
00134 record->picture->hue = value;
00135 record->set_video_picture();
00136 }
00137 return 0;
00138 }
00139
00140 int RecordChannelPicker::set_color(int value)
00141 {
00142 if(record)
00143 {
00144 record->picture->color = value;
00145 record->set_video_picture();
00146 }
00147 return 0;
00148 }
00149
00150 int RecordChannelPicker::set_contrast(int value)
00151 {
00152 if(record)
00153 {
00154 record->picture->contrast = value;
00155 record->set_video_picture();
00156 }
00157 return 0;
00158 }
00159
00160 int RecordChannelPicker::set_whiteness(int value)
00161 {
00162 if(record)
00163 {
00164 record->picture->whiteness = value;
00165 record->set_video_picture();
00166 }
00167 return 0;
00168 }
00169
00170 int RecordChannelPicker::set_picture(int device_id, int value)
00171 {
00172 if(record)
00173 {
00174 record->picture->set_item(device_id, value);
00175 record->set_video_picture();
00176 }
00177 return 0;
00178 }
00179
00180
00181 int RecordChannelPicker::get_brightness()
00182 {
00183 if(record) return record->picture->brightness;
00184 return 0;
00185 }
00186
00187 int RecordChannelPicker::get_hue()
00188 {
00189 if(record) return record->picture->hue;
00190 return 0;
00191 }
00192
00193 int RecordChannelPicker::get_color()
00194 {
00195 if(record) return record->picture->color;
00196 return 0;
00197 }
00198
00199 int RecordChannelPicker::get_contrast()
00200 {
00201 if(record) return record->picture->contrast;
00202 return 0;
00203 }
00204
00205 int RecordChannelPicker::get_whiteness()
00206 {
00207 if(record) return record->picture->whiteness;
00208 return 0;
00209 }
00210
00211 int RecordChannelPicker::get_controls()
00212 {
00213 if(record) return record->picture->controls.total;
00214 return 0;
00215 }
00216
00217 PictureItem* RecordChannelPicker::get_control(int i)
00218 {
00219 if(record) return record->picture->controls.values[i];
00220 return 0;
00221 }
00222
00223 PictureConfig* RecordChannelPicker::get_picture_usage()
00224 {
00225 if(record) return record->picture;
00226 return 0;
00227 }
00228
00229
00230
00231 void RecordChannelPicker::set_channel(Channel *channel)
00232 {
00233 record->set_channel(channel);
00234 }
00235
00236 int RecordChannelPicker::has_signal()
00237 {
00238 return record->has_signal();
00239 }
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 PrefsChannelPicker::PrefsChannelPicker(MWindow *mwindow,
00250 VDevicePrefs *prefs,
00251 ChannelDB *channeldb,
00252 int x,
00253 int y)
00254 : ChannelPicker(channeldb,
00255 x,
00256 y,
00257 prefs->dialog)
00258 {
00259
00260 this->mwindow = mwindow;
00261 this->prefs = prefs;
00262 VDeviceBUZ::get_inputs(&input_sources);
00263 }
00264
00265 PrefsChannelPicker::~PrefsChannelPicker()
00266 {
00267 input_sources.remove_all_objects();
00268 }
00269
00270 void PrefsChannelPicker::load_scan_defaults(Channel *scan_params)
00271 {
00272 scan_params->load_defaults(mwindow->defaults);
00273 }
00274
00275 void PrefsChannelPicker::save_scan_defaults(Channel *scan_params)
00276 {
00277 scan_params->save_defaults(mwindow->defaults);
00278 }
00279
00280 void PrefsChannelPicker::handle_channel_edit(int result)
00281 {
00282 mwindow->save_defaults();
00283 }
00284
00285 BC_Theme* PrefsChannelPicker::get_theme()
00286 {
00287 return mwindow->theme;
00288 }
00289
00290
00291 Channel* PrefsChannelPicker::get_current_channel_struct()
00292 {
00293 int number = get_current_channel_number();
00294
00295 if(number >= 0 && number < channeldb->size())
00296 {
00297 return channeldb->get(number);
00298 }
00299 return 0;
00300 }
00301
00302 int PrefsChannelPicker::get_current_channel_number()
00303 {
00304 return prefs->out_config->buz_out_channel;
00305 }
00306
00307 ArrayList<Channel*>* PrefsChannelPicker::get_video_inputs()
00308 {
00309 return &input_sources;
00310 }
00311
00312 Channel* PrefsChannelPicker::get_channel_usage()
00313 {
00314 return 0;
00315 }
00316
00317
00318 void PrefsChannelPicker::set_channel(Channel *channel)
00319 {
00320 if(channel)
00321 channel_text->update(channel->title);
00322 }
00323
00324 void PrefsChannelPicker::set_channel_number(int number)
00325 {
00326 CLAMP(number, 0, channeldb->size() - 1);
00327 prefs->out_config->buz_out_channel = number;
00328 set_channel(get_current_channel_struct());
00329 }
00330
00331 int PrefsChannelPicker::has_signal()
00332 {
00333 return 0;
00334 }
00335
00336 int PrefsChannelPicker::set_brightness(int value)
00337 {
00338 prefs->out_config->brightness = value;
00339 }
00340
00341 int PrefsChannelPicker::set_hue(int value)
00342 {
00343 prefs->out_config->hue = value;
00344 }
00345
00346 int PrefsChannelPicker::set_color(int value)
00347 {
00348 prefs->out_config->color = value;
00349 }
00350
00351 int PrefsChannelPicker::set_contrast(int value)
00352 {
00353 prefs->out_config->contrast = value;
00354 }
00355
00356 int PrefsChannelPicker::set_whiteness(int value)
00357 {
00358 prefs->out_config->whiteness = value;
00359 }
00360
00361 int PrefsChannelPicker::get_brightness()
00362 {
00363 return prefs->out_config->brightness;
00364 }
00365
00366 int PrefsChannelPicker::get_hue()
00367 {
00368 return prefs->out_config->hue;
00369 }
00370
00371 int PrefsChannelPicker::get_color()
00372 {
00373 return prefs->out_config->color;
00374 }
00375
00376 int PrefsChannelPicker::get_contrast()
00377 {
00378 return prefs->out_config->contrast;
00379 }
00380
00381 int PrefsChannelPicker::get_whiteness()
00382 {
00383 return prefs->out_config->whiteness;
00384 }
00385
00386
00387
00388
00389
00390
00391 ChannelPicker::ChannelPicker(ChannelDB *channeldb,
00392 int x,
00393 int y,
00394 BC_WindowBase *parent_window)
00395 {
00396 this->parent_window = parent_window;
00397 this->x = x;
00398 this->y = y;
00399 this->channeldb = channeldb;
00400 current_channel = new Channel;
00401 channel_text = 0;
00402 channel_select = 0;
00403 channel_button = 0;
00404 current_channel = 0;
00405 update_channel_list();
00406 }
00407
00408 ChannelPicker::~ChannelPicker()
00409 {
00410 delete channel_text;
00411 delete channel_select;
00412 delete channel_button;
00413 delete current_channel;
00414 channel_listitems.remove_all_objects();
00415 }
00416
00417 void ChannelPicker::update_channel_list()
00418 {
00419 channel_listitems.remove_all_objects();
00420 for(int i = 0; i < channeldb->size(); i++)
00421 {
00422 channel_listitems.append(new BC_ListBoxItem(channeldb->get(i)->title));
00423 }
00424
00425 if(channel_text)
00426 channel_text->update_list(&channel_listitems);
00427 }
00428
00429
00430
00431
00432
00433
00434
00435
00436 BC_WindowBase* ChannelPicker::get_subwindow()
00437 {
00438 return parent_window;
00439 return 0;
00440 }
00441
00442
00443
00444
00445
00446
00447
00448 int ChannelPicker::create_objects()
00449 {
00450 channel_text = 0;
00451 update_channel_list();
00452 channel_text = new ChannelText(this, x, y);
00453 channel_text->create_objects();
00454 x += channel_text->get_w();
00455 get_subwindow()->add_subwindow(channel_select = new ChannelTumbler(this,
00456 x,
00457 y));
00458 x += channel_select->get_w() + 5;
00459 get_subwindow()->add_subwindow(channel_button = new ChannelButton(this,
00460 x,
00461 y - 1));
00462 return 0;
00463 }
00464
00465 int ChannelPicker::reposition()
00466 {
00467 channel_text->reposition_window(channel_text->get_x(),
00468 channel_text->get_y());
00469 channel_select->reposition_window(channel_select->get_x(),
00470 channel_select->get_y());
00471 channel_button->reposition_window(channel_button->get_x(),
00472 channel_button->get_y());
00473 return 0;
00474 }
00475
00476 int ChannelPicker::close_threads()
00477 {
00478 channel_button->thread->close_threads();
00479 return 0;
00480 }
00481
00482 char* ChannelPicker::get_source_name(Channel *channel)
00483 {
00484 if(channel->entry < chanlists[channel->freqtable].count)
00485 return chanlists[channel->freqtable].list[channel->entry].name;
00486 else
00487 return chanlists[channel->freqtable].list[0].name;
00488 }
00489
00490 char* ChannelPicker::current_channel_name()
00491 {
00492 if(get_current_channel_struct())
00493 {
00494 return get_current_channel_struct()->title;
00495 }
00496 else
00497 return _("Channel");
00498 }
00499
00500 int ChannelPicker::channel_down()
00501 {
00502 int number = get_current_channel_number() - 1;
00503 if(number < 0) number = 0;
00504 CLAMP(number, 0, channeldb->size() - 1);
00505 set_channel_number(number);
00506 return 0;
00507 }
00508
00509 int ChannelPicker::channel_up()
00510 {
00511 int number = get_current_channel_number() + 1;
00512 if(number >= channeldb->size()) number = channeldb->size() - 1;
00513 CLAMP(number, 0, channeldb->size() - 1);
00514 set_channel_number(number);
00515 return 0;
00516 }
00517
00518
00519
00520 ChannelButton::ChannelButton(ChannelPicker *channel_picker,
00521 int x,
00522 int y)
00523 : BC_Button(x,
00524 y,
00525 channel_picker->get_theme() ?
00526 channel_picker->get_theme()->get_image_set("channel") :
00527 0)
00528 {
00529 this->channel_picker = channel_picker;
00530 thread = new ChannelEditThread(channel_picker,
00531 channel_picker->channeldb);
00532 set_tooltip(_("Edit channels"));
00533 }
00534
00535 ChannelButton::~ChannelButton()
00536 {
00537 delete thread;
00538 }
00539
00540 int ChannelButton::handle_event()
00541 {
00542 thread->start();
00543 return 1;
00544 }
00545
00546
00547 ChannelText::ChannelText(ChannelPicker *channel_picker,
00548 int x,
00549 int y)
00550 : BC_PopupTextBox(channel_picker->get_subwindow(),
00551 &channel_picker->channel_listitems,
00552 channel_picker->current_channel_name(),
00553 x,
00554 y,
00555 150,
00556 300)
00557 {
00558
00559 this->channel_picker = channel_picker;
00560 }
00561
00562 ChannelText::~ChannelText()
00563 {
00564 }
00565
00566 int ChannelText::handle_event()
00567 {
00568 channel_picker->set_channel_number(get_number());
00569 return 0;
00570 }
00571
00572
00573
00574
00575 ChannelList::ChannelList(ChannelPicker *channel_picker, int x, int y)
00576 : BC_ListBox(x,
00577 y,
00578 100,
00579 200,
00580 LISTBOX_TEXT,
00581 &channel_picker->channel_listitems,
00582 0,
00583 0,
00584 1,
00585 0,
00586 1)
00587 {
00588 this->channel_picker = channel_picker;
00589 }
00590
00591 ChannelList::~ChannelList()
00592 {
00593 }
00594
00595 int ChannelList::handle_event()
00596 {
00597 return 0;
00598 }
00599
00600
00601
00602 ChannelTumbler::ChannelTumbler(ChannelPicker *channel_picker,
00603 int x,
00604 int y)
00605 : BC_Tumbler(x, y)
00606 {
00607 this->channel_picker = channel_picker;
00608 }
00609 ChannelTumbler::~ChannelTumbler()
00610 {
00611 }
00612 int ChannelTumbler::handle_up_event()
00613 {
00614 channel_picker->channel_up();
00615 return 1;
00616 }
00617 int ChannelTumbler::handle_down_event()
00618 {
00619 channel_picker->channel_down();
00620 return 1;
00621 }
00622 int ChannelTumbler::keypress_event()
00623 {
00624 if(get_keypress() == PGUP)
00625 {
00626 handle_up_event();
00627 return 1;
00628 }
00629 else
00630 if(get_keypress() == PGDN)
00631 {
00632 handle_down_event();
00633 return 1;
00634 }
00635 else
00636 return 0;
00637 }
00638
00639