4 * Copyright (C) 2011 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
23 #include "bcprogressbox.h"
24 #include "bcsignals.h"
26 #include "channeldb.h"
27 #include "channeledit.h"
28 #include "channelpicker.h"
29 #include "chantables.h"
31 #include "condition.h"
33 #include "mainsession.h"
37 #include "videodevice.h"
43 ChannelEditThread::ChannelEditThread(ChannelPicker *channel_picker,
47 this->channel_picker = channel_picker;
48 this->channeldb = channeldb;
51 new_channels = new ChannelDB;
52 completion = new Condition(1, "ChannelEditThread::completion");
55 ChannelEditThread::~ChannelEditThread()
57 channel_picker->get_subwindow()->unlock_window();
59 channel_picker->get_subwindow()->lock_window("ChannelEditThread::~ChannelEditThread");
64 void ChannelEditThread::run()
70 window->lock_window("ChannelEditThread::run");
71 window->raise_window(1);
72 window->unlock_window();
77 completion->lock("ChannelEditThread::run");
79 // Copy master channel list to temporary.
80 new_channels->copy_from(channel_picker->channeldb);
81 Channel *channel = channel_picker->get_current_channel();
82 current_channel = channel_picker->channeldb->number_of(channel);
83 //printf("ChannelEditThread::run 1 %d\n", current_channel);
85 // Run the channel list window using the temporary list.
86 ChannelEditWindow window(this, channel_picker);
87 window.create_objects();
88 this->window = &window;
89 int result = window.run_window();
94 // Copy new channels to master list
95 channel_picker->channeldb->clear();
97 channel_picker->channeldb->copy_from(new_channels);
98 channel_picker->update_channel_list();
102 channel_picker->handle_channel_edit(result);
104 window.edit_thread->close_threads();
106 completion->unlock();
111 void ChannelEditThread::close_threads()
113 if(in_progress && window)
115 window->edit_thread->close_threads();
117 completion->lock("ChannelEditThread::close_threads");
118 completion->unlock();
122 char *ChannelEditThread::value_to_freqtable(int value)
126 case NTSC_DVB: return _("NTSC_DVB");
127 case CATV_DVB: return _("CATV_DVB");
128 case NTSC_BCAST: return _("NTSC_BCAST");
129 case NTSC_CABLE: return _("NTSC_CABLE");
130 case NTSC_HRC: return _("NTSC_HRC");
131 case NTSC_BCAST_JP: return _("NTSC_BCAST_JP");
132 case NTSC_CABLE_JP: return _("NTSC_CABLE_JP");
133 case PAL_AUSTRALIA: return _("PAL_AUSTRALIA");
134 case PAL_EUROPE: return _("PAL_EUROPE");
135 case PAL_E_EUROPE: return _("PAL_E_EUROPE");
136 case PAL_ITALY: return _("PAL_ITALY");
137 case PAL_IRELAND: return _("PAL_IRELAND");
138 case PAL_NEWZEALAND: return _("PAL_NEWZEALAND");
143 char* ChannelEditThread::value_to_norm(int value)
147 case NTSC: return _("NTSC");
148 case PAL: return _("PAL");
149 case SECAM: return _("SECAM");
154 char* ChannelEditThread::value_to_input(int value)
156 ArrayList<Channel*> *inputs = channel_picker->get_video_inputs();
157 return value >= inputs->total ? _("None") :
158 inputs->values[value]->device_name;
167 ChannelEditWindow::ChannelEditWindow(ChannelEditThread *thread,
168 ChannelPicker *channel_picker)
169 : BC_Window(PROGRAM_NAME ": Channels",
170 channel_picker->mwindow->session->channels_x,
171 channel_picker->mwindow->session->channels_y,
180 this->thread = thread;
181 this->channel_picker = channel_picker;
182 scan_confirm_thread = 0;
184 ChannelEditWindow::~ChannelEditWindow()
187 for(i = 0; i < channel_list.total; i++)
189 delete channel_list.values[i];
191 channel_list.remove_all();
193 delete picture_thread;
194 delete scan_confirm_thread;
197 void ChannelEditWindow::create_objects()
201 // Create channel list
202 for(int i = 0; i < thread->new_channels->size(); i++)
204 channel_list.append(new BC_ListBoxItem(thread->new_channels->get(i)->title));
207 add_subwindow(list_box = new ChannelEditList(this, x, y));
209 if(channel_picker->use_select())
211 add_subwindow(new ChannelEditSelect(this, x, y));
214 add_subwindow(new ChannelEditAdd(this, x, y));
216 add_subwindow(new ChannelEdit(this, x, y));
218 add_subwindow(new ChannelEditMoveUp(this, x, y));
220 add_subwindow(new ChannelEditMoveDown(this, x, y));
222 add_subwindow(new ChannelEditSort(this, x, y));
225 Channel *channel_usage = channel_picker->get_channel_usage();
226 if(channel_usage && channel_usage->has_scanning)
228 add_subwindow(new ChannelEditScan(this, x, y));
231 add_subwindow(new ChannelEditDel(this, x, y));
233 add_subwindow(new ChannelEditPicture(this, x, y));
236 add_subwindow(new BC_OKButton(this));
238 add_subwindow(new BC_CancelButton(this));
241 edit_thread = new ChannelEditEditThread(this,
243 picture_thread = new ChannelEditPictureThread(channel_picker);
247 int ChannelEditWindow::close_event()
253 int ChannelEditWindow::translation_event()
255 channel_picker->mwindow->session->channels_x = get_x();
256 channel_picker->mwindow->session->channels_y = get_y();
261 int ChannelEditWindow::add_channel()
263 Channel *new_channel;
264 Channel *prev_channel = 0;
266 // Create new channel
267 new_channel = new Channel;
269 // Reuse parameters from previous channel
270 if(thread->new_channels->size())
272 prev_channel = thread->new_channels->get(
273 thread->new_channels->size() - 1);
274 new_channel->copy_settings(prev_channel);
277 // Use default channel parameters
278 if(channel_picker->get_master_channel())
280 new_channel->copy_settings(channel_picker->get_master_channel());
283 // Copy device usage. Need the same thing for playback.
284 if(channel_picker->get_master_channel())
286 new_channel->copy_usage(channel_picker->get_master_channel());
289 // Add to channel table
290 channel_list.append(new BC_ListBoxItem(new_channel->title));
291 thread->new_channels->append(new_channel);
294 // Start common routing
295 edit_thread->edit_channel(new_channel, 0);
299 void ChannelEditWindow::update_list()
301 // Create channel list
302 channel_list.remove_all_objects();
303 for(int i = 0; i < thread->new_channels->size(); i++)
307 thread->new_channels->get(i)->title));
310 list_box->update(&channel_list, 0, 0, 1, list_box->get_yposition());
313 void ChannelEditWindow::update_list(Channel *channel)
316 for(i = 0; i < thread->new_channels->size(); i++)
317 if(thread->new_channels->get(i) == channel) break;
319 if(i < thread->new_channels->size())
321 channel_list.values[i]->set_text(channel->title);
328 void ChannelEditWindow::edit_channel()
330 if(list_box->get_selection_number(0, 0) > -1)
332 thread->current_channel = list_box->get_selection_number(0, 0);
333 edit_thread->edit_channel(
334 thread->new_channels->get(
335 list_box->get_selection_number(0, 0)),
340 void ChannelEditWindow::edit_picture()
342 picture_thread->edit_picture();
345 void ChannelEditWindow::scan_confirm()
347 channel_picker->load_scan_defaults(&thread->scan_params);
348 if(!scan_confirm_thread) scan_confirm_thread = new ConfirmScanThread(this);
350 scan_confirm_thread->start();
351 lock_window("ChannelEditWindow::scan_confirm");
354 void ChannelEditWindow::scan()
356 thread->new_channels->clear();
359 if(!thread->scan_thread) thread->scan_thread = new ScanThread(thread);
360 thread->scan_thread->start();
364 void ChannelEditWindow::get_chan_num(Channel *channel, int &chan, int &stream)
366 const char *cp = channel->title;
367 int chn = 0, str = 0;
368 while( isdigit(*cp) ) chn = 10*chn + (*cp++ -'0');
369 if( chn != 0 && *cp != 0 ) {
371 while( isdigit(*cp) ) str = 10*str + (*cp++ -'0');
374 chan = chn; stream = str;
377 void ChannelEditWindow::sort()
382 for(int i = 0; i < thread->new_channels->size() - 1; i++) {
383 Channel *channel1 = thread->new_channels->get(i);
384 Channel *channel2 = thread->new_channels->get(i + 1);
385 int ch1, st1; get_chan_num(channel1, ch1, st1);
386 int ch2, st2; get_chan_num(channel2, ch2, st2);
387 if( (ch1 > 0 && ch2 > 0) ?
388 (ch1 > ch2 || (ch1 == ch2 && (st1 > st2 || (st1 == st2 &&
389 strcasecmp(channel2->title, channel1->title) < 0)))) :
390 strcasecmp(channel2->title, channel1->title) < 0) {
391 thread->new_channels->set(i, channel2);
392 thread->new_channels->set(i + 1, channel1);
401 void ChannelEditWindow::delete_channel(int number)
403 delete thread->new_channels->get(number);
404 channel_list.remove_number(number);
405 thread->new_channels->remove_number(number);
409 void ChannelEditWindow::delete_channel(Channel *channel)
412 for(i = 0; i < thread->new_channels->size(); i++)
414 if(thread->new_channels->get(i) == channel)
419 if(i < thread->new_channels->size()) delete_channel(i);
422 int ChannelEditWindow::move_channel_up()
424 if(list_box->get_selection_number(0, 0) > -1)
426 int number2 = list_box->get_selection_number(0, 0);
427 int number1 = number2 - 1;
429 BC_ListBoxItem *temp_text;
431 if(number1 < 0) number1 = thread->new_channels->size() - 1;
433 temp = thread->new_channels->get(number1);
434 thread->new_channels->set(number1, thread->new_channels->get(number2));
435 thread->new_channels->set(number2, temp);
437 temp_text = channel_list.values[number1];
438 channel_list.values[number1] = channel_list.values[number2];
439 channel_list.values[number2] = temp_text;
440 list_box->update(&channel_list,
444 list_box->get_xposition(),
445 list_box->get_yposition(),
452 int ChannelEditWindow::move_channel_down()
454 if(list_box->get_selection_number(0, 0) > -1)
456 int number2 = list_box->get_selection_number(0, 0);
457 int number1 = number2 + 1;
459 BC_ListBoxItem *temp_text;
461 if(number1 > thread->new_channels->size() - 1) number1 = 0;
463 temp = thread->new_channels->get(number1);
464 thread->new_channels->set(number1, thread->new_channels->get(number2));
465 thread->new_channels->set(number2, temp);
466 temp_text = channel_list.values[number1];
467 channel_list.values[number1] = channel_list.values[number2];
468 channel_list.values[number2] = temp_text;
469 list_box->update(&channel_list,
473 list_box->get_xposition(),
474 list_box->get_yposition(),
481 int ChannelEditWindow::change_channel_from_list(int channel_number)
483 if(channel_number > -1 && channel_number < thread->new_channels->size())
485 thread->current_channel = channel_number;
486 channel_picker->set_channel(thread->new_channels->get(channel_number));
491 ChannelEditSelect::ChannelEditSelect(ChannelEditWindow *window, int x, int y)
492 : BC_GenericButton(x, y, _("Select"))
494 this->window = window;
496 ChannelEditSelect::~ChannelEditSelect()
499 int ChannelEditSelect::handle_event()
501 window->change_channel_from_list(
502 window->list_box->get_selection_number(0, 0));
506 ChannelEditAdd::ChannelEditAdd(ChannelEditWindow *window, int x, int y)
507 : BC_GenericButton(x, y, _("Add..."))
509 this->window = window;
511 ChannelEditAdd::~ChannelEditAdd()
514 int ChannelEditAdd::handle_event()
516 window->add_channel();
520 ChannelEditList::ChannelEditList(ChannelEditWindow *window, int x, int y)
524 window->get_h() - BC_OKButton::calculate_h() - y - 10,
526 &(window->channel_list))
528 this->window = window;
530 ChannelEditList::~ChannelEditList()
533 int ChannelEditList::handle_event()
535 window->edit_channel();
539 ChannelEditMoveUp::ChannelEditMoveUp(ChannelEditWindow *window, int x, int y)
540 : BC_GenericButton(x, y, _("Move up"))
542 this->window = window;
544 ChannelEditMoveUp::~ChannelEditMoveUp()
547 int ChannelEditMoveUp::handle_event()
549 lock_window("ChannelEditMoveUp::handle_event");
550 window->move_channel_up();
555 ChannelEditMoveDown::ChannelEditMoveDown(ChannelEditWindow *window, int x, int y)
556 : BC_GenericButton(x, y, _("Move down"))
558 this->window = window;
560 ChannelEditMoveDown::~ChannelEditMoveDown()
563 int ChannelEditMoveDown::handle_event()
565 lock_window("ChannelEditMoveDown::handle_event");
566 window->move_channel_down();
571 ChannelEditSort::ChannelEditSort(ChannelEditWindow *window, int x, int y)
572 : BC_GenericButton(x, y, _("Sort"))
574 this->window = window;
576 int ChannelEditSort::handle_event()
578 lock_window("ChannelEditSort::handle_event");
584 ChannelEditScan::ChannelEditScan(ChannelEditWindow *window, int x, int y)
585 : BC_GenericButton(x, y, _("Scan"))
587 this->window = window;
589 int ChannelEditScan::handle_event()
591 window->scan_confirm();
595 ChannelEditDel::ChannelEditDel(ChannelEditWindow *window, int x, int y)
596 : BC_GenericButton(x, y, _("Delete"))
598 this->window = window;
600 ChannelEditDel::~ChannelEditDel()
603 int ChannelEditDel::handle_event()
605 if(window->list_box->get_selection_number(0, 0) > -1)
606 window->delete_channel(window->list_box->get_selection_number(0, 0));
610 ChannelEdit::ChannelEdit(ChannelEditWindow *window, int x, int y)
611 : BC_GenericButton(x, y, _("Edit..."))
613 this->window = window;
615 ChannelEdit::~ChannelEdit()
618 int ChannelEdit::handle_event()
620 window->edit_channel();
624 ChannelEditPicture::ChannelEditPicture(ChannelEditWindow *window, int x, int y)
625 : BC_GenericButton(x, y, _("Picture..."))
627 this->window = window;
629 ChannelEditPicture::~ChannelEditPicture()
632 int ChannelEditPicture::handle_event()
634 window->edit_picture();
649 // ========================= confirm overwrite by channel scannin
652 ConfirmScan::ConfirmScan(ChannelEditWindow *gui, int x, int y)
653 : BC_Window(PROGRAM_NAME ": Scan confirm",
657 BC_OKButton::calculate_h() + 130,
667 void ConfirmScan::create_objects()
672 add_subwindow(title = new BC_Title(x, y, _("Set parameters for channel scanning.")));
673 y += title->get_h() + 10;
676 add_subwindow(title = new BC_Title(x, y, _("Frequency table:")));
678 y += BC_PopupMenu::calculate_h();
679 add_subwindow(title = new BC_Title(x, y, _("Norm:")));
680 x2 = MAX(x2, title->get_w());
681 y += BC_PopupMenu::calculate_h();
682 add_subwindow(title = new BC_Title(x, y, _("Input:")));
683 x2 = MAX(x2, title->get_w());
684 y += BC_PopupMenu::calculate_h();
689 ChannelEditEditFreqtable *table;
690 add_subwindow(table = new ChannelEditEditFreqtable(x,
695 y += table->get_h() + 10;
697 ChannelEditEditNorm *norm;
698 add_subwindow(norm = new ChannelEditEditNorm(x,
703 y += norm->get_h() + 10;
705 ChannelEditEditInput *input;
706 add_subwindow(input = new ChannelEditEditInput(x,
713 add_subwindow(new BC_OKButton(this));
714 add_subwindow(new BC_CancelButton(this));
724 ConfirmScanThread::ConfirmScanThread(ChannelEditWindow *gui)
730 void ConfirmScanThread::handle_done_event(int result)
732 gui->channel_picker->save_scan_defaults(&gui->thread->scan_params);
735 get_gui()->hide_window();
736 gui->lock_window("ConfirmScanThread::handle_done_event");
738 gui->unlock_window();
742 ConfirmScanThread::~ConfirmScanThread()
747 BC_Window* ConfirmScanThread::new_gui()
749 int x = gui->get_abs_cursor_x(1);
750 int y = gui->get_abs_cursor_y(1);
751 ConfirmScan *result = new ConfirmScan(gui, x, y);
752 result->create_objects();
761 ScanThread::ScanThread(ChannelEditThread *edit)
769 ScanThread::~ScanThread()
778 void ScanThread::start()
780 // Cancel previous job
787 progress = new BC_ProgressBox(
788 edit->channel_picker->parent_window->get_abs_cursor_x(1),
789 edit->channel_picker->parent_window->get_abs_cursor_y(1),
791 chanlists[edit->scan_params.freqtable].count);
796 void ScanThread::run()
798 for(int i = 0; i < chanlists[edit->scan_params.freqtable].count &&
799 !interrupt && !progress->is_cancelled(); i++) {
800 edit->scan_params.entry = i;
801 char string[BCTEXTLEN];
802 sprintf(edit->scan_params.title, "%s",
803 chanlists[edit->scan_params.freqtable].list[i].name);
804 sprintf(string, "Scanning %s", edit->scan_params.title);
805 progress->update_title(string, 1);
806 progress->update(i, 1);
807 edit->channel_picker->set_channel(&edit->scan_params);
808 sleep(1); // has_signal should do whatever it takes
809 int got_signal = edit->channel_picker->has_signal();
810 if(!got_signal) continue;
811 if(edit->channel_picker->get_channel_usage()->has_subchan) {
812 ArrayList<Channel*> channels;
813 edit->channel_picker->create_channeldb(&channels);
814 if( channels.total ) {
815 edit->window->lock_window("ScanThread::run");
816 for( int i=0; i<channels.total; ++i ) {
817 Channel *new_channel = channels.values[i];
818 new_channel->copy_usage(&edit->scan_params);
819 edit->new_channels->append(new_channel);
821 edit->window->update_list();
822 edit->window->unlock_window();
826 Channel *new_channel = new Channel;
827 new_channel->copy_usage(&edit->scan_params);
828 new_channel->copy_settings(&edit->scan_params);
829 edit->window->lock_window("ScanThread::run");
830 edit->new_channels->append(new_channel);
831 edit->window->update_list();
832 edit->window->unlock_window();
834 progress->stop_progress();
845 // ================================= Edit a single channel
849 ChannelEditEditThread::ChannelEditEditThread(ChannelEditWindow *window,
850 ChannelPicker *channel_picker)
853 this->window = window;
854 this->channel_picker = channel_picker;
858 completion = new Condition(1, "ChannelEditEditThread::completion");
861 ChannelEditEditThread::~ChannelEditEditThread()
866 void ChannelEditEditThread::close_threads()
870 edit_window->set_done(1);
871 completion->lock("ChannelEditEditThread::close_threads");
872 completion->unlock();
876 int ChannelEditEditThread::edit_channel(Channel *channel, int editing)
880 edit_window->lock_window("ChannelEditEditThread::edit_channel");
881 edit_window->raise_window(1);
882 edit_window->unlock_window();
887 // Copy the channel to edit into a temporary
888 completion->lock("ChannelEditEditThread::edit_channel");
889 this->editing = editing;
890 this->output_channel = channel;
891 new_channel.copy_settings(output_channel);
892 new_channel.copy_usage(output_channel);
894 if(editing && new_channel.title[0])
904 void ChannelEditEditThread::set_device()
906 channel_picker->set_channel(&new_channel);
909 void ChannelEditEditThread::change_source(const char *source_name)
911 for(int i = 0; i < chanlists[new_channel.freqtable].count; i++)
913 if(!strcasecmp(chanlists[new_channel.freqtable].list[i].name, source_name))
915 new_channel.entry = i;
916 i = chanlists[new_channel.freqtable].count;
922 strcpy(new_channel.title, source_name);
923 if(edit_window->title_text)
925 edit_window->title_text->update(source_name);
930 void ChannelEditEditThread::source_up()
933 if(new_channel.entry > chanlists[new_channel.freqtable].count - 1) new_channel.entry = 0;
934 source_text->update(chanlists[new_channel.freqtable].list[new_channel.entry].name);
938 void ChannelEditEditThread::source_down()
941 if(new_channel.entry < 0) new_channel.entry = chanlists[new_channel.freqtable].count - 1;
942 source_text->update(chanlists[new_channel.freqtable].list[new_channel.entry].name);
946 void ChannelEditEditThread::set_input(int value)
948 new_channel.input = value;
952 void ChannelEditEditThread::set_norm(int value)
954 new_channel.norm = value;
958 void ChannelEditEditThread::set_freqtable(int value)
960 new_channel.freqtable = value;
961 if(new_channel.entry > chanlists[new_channel.freqtable].count - 1) new_channel.entry = 0;
962 source_text->update(chanlists[new_channel.freqtable].list[new_channel.entry].name);
966 void ChannelEditEditThread::run()
968 ChannelEditEditWindow edit_window(this, window, channel_picker);
969 edit_window.create_objects(&new_channel);
970 this->edit_window = &edit_window;
971 int result = edit_window.run_window();
972 this->edit_window = 0;
974 // Done editing channel. Keep channel.
977 output_channel->copy_settings(&new_channel);
978 window->lock_window();
979 window->update_list(output_channel);
980 window->unlock_window();
987 window->lock_window();
988 window->delete_channel(output_channel);
989 window->unlock_window();
993 completion->unlock();
997 ChannelEditEditWindow::ChannelEditEditWindow(ChannelEditEditThread *thread,
998 ChannelEditWindow *window,
999 ChannelPicker *channel_picker)
1000 : BC_Window(PROGRAM_NAME ": Edit Channel",
1001 channel_picker->parent_window->get_abs_cursor_x(1),
1002 channel_picker->parent_window->get_abs_cursor_y(1),
1011 this->channel_picker = channel_picker;
1012 this->window = window;
1013 this->thread = thread;
1015 ChannelEditEditWindow::~ChannelEditEditWindow()
1018 void ChannelEditEditWindow::create_objects(Channel *channel)
1020 this->new_channel = channel;
1021 Channel *channel_usage = channel_picker->get_channel_usage();
1025 // if(!channel_usage ||
1026 // (!channel_usage->use_frequency &&
1027 // !channel_usage->use_fine &&
1028 // !channel_usage->use_norm &&
1029 // !channel_usage->use_input))
1031 // add_subwindow(new BC_Title(x, y, "Device has no input selection."));
1036 add_subwindow(new BC_Title(x, y, _("Title:")));
1037 add_subwindow(title_text = new ChannelEditEditTitle(x, y + 20, thread));
1041 if(channel_usage && channel_usage->use_frequency)
1043 add_subwindow(new BC_Title(x, y, _("Channel:")));
1045 add_subwindow(thread->source_text = new ChannelEditEditSource(x, y, thread));
1046 add_subwindow(new ChannelEditEditSourceTumbler(x + 160, y, thread));
1049 add_subwindow(new BC_Title(x, y, _("Frequency table:")));
1050 ChannelEditEditFreqtable *table;
1051 add_subwindow(table = new ChannelEditEditFreqtable(x + 130,
1059 if(channel_usage && channel_usage->use_fine)
1061 add_subwindow(new BC_Title(x, y, _("Fine:")));
1062 add_subwindow(new ChannelEditEditFine(x + 130, y, thread));
1066 if(channel_usage && channel_usage->use_norm)
1068 add_subwindow(new BC_Title(x, y, _("Norm:")));
1069 ChannelEditEditNorm *norm;
1070 add_subwindow(norm = new ChannelEditEditNorm(x + 130,
1078 if( (channel_usage && channel_usage->use_input) ||
1081 add_subwindow(new BC_Title(x, y, _("Input:")));
1082 ChannelEditEditInput *input;
1083 add_subwindow(input = new ChannelEditEditInput(x + 130,
1091 add_subwindow(new BC_OKButton(this));
1093 add_subwindow(new BC_CancelButton(this));
1097 ChannelEditEditTitle::ChannelEditEditTitle(int x,
1099 ChannelEditEditThread *thread)
1100 : BC_TextBox(x, y, 150, 1, thread->new_channel.title)
1102 this->thread = thread;
1104 ChannelEditEditTitle::~ChannelEditEditTitle()
1107 int ChannelEditEditTitle::handle_event()
1109 if(strlen(get_text()) < 1024)
1111 strcpy(thread->new_channel.title, get_text());
1113 thread->user_title = get_text()[0] ? 1 : 0;
1118 ChannelEditEditSource::ChannelEditEditSource(int x, int y, ChannelEditEditThread *thread)
1119 : BC_TextBox(x, y, 150, 1, chanlists[thread->new_channel.freqtable].list[thread->new_channel.entry].name)
1121 this->thread = thread;
1124 ChannelEditEditSource::~ChannelEditEditSource()
1127 int ChannelEditEditSource::handle_event()
1129 thread->change_source(get_text());
1134 ChannelEditEditSourceTumbler::ChannelEditEditSourceTumbler(int x, int y, ChannelEditEditThread *thread)
1137 this->thread = thread;
1139 ChannelEditEditSourceTumbler::~ChannelEditEditSourceTumbler()
1142 int ChannelEditEditSourceTumbler::handle_up_event()
1144 thread->source_up();
1147 int ChannelEditEditSourceTumbler::handle_down_event()
1149 thread->source_down();
1153 ChannelEditEditInput::ChannelEditEditInput(int x,
1155 ChannelEditEditThread *thread,
1156 ChannelEditThread *edit)
1160 edit->value_to_input(thread ? thread->new_channel.input : edit->scan_params.input))
1162 this->thread = thread;
1165 ChannelEditEditInput::~ChannelEditEditInput()
1168 void ChannelEditEditInput::add_items()
1170 ArrayList<Channel*> *inputs;
1171 inputs = edit->channel_picker->get_video_inputs();
1175 for(int i = 0; i < inputs->total; i++)
1177 add_item(new ChannelEditEditInputItem(thread,
1179 inputs->values[i]->device_name,
1184 int ChannelEditEditInput::handle_event()
1189 ChannelEditEditInputItem::ChannelEditEditInputItem(ChannelEditEditThread *thread,
1190 ChannelEditThread *edit,
1195 this->thread = thread;
1197 this->value = value;
1199 ChannelEditEditInputItem::~ChannelEditEditInputItem()
1202 int ChannelEditEditInputItem::handle_event()
1204 get_popup_menu()->set_text(get_text());
1205 if(thread && !thread->user_title)
1207 strcpy(thread->new_channel.title, get_text());
1208 if(thread->edit_window->title_text)
1210 thread->edit_window->title_text->update(get_text());
1214 thread->set_input(value);
1216 edit->scan_params.input = value;
1220 ChannelEditEditNorm::ChannelEditEditNorm(int x,
1222 ChannelEditEditThread *thread,
1223 ChannelEditThread *edit)
1227 edit->value_to_norm(thread ? thread->new_channel.norm : edit->scan_params.norm))
1229 this->thread = thread;
1232 ChannelEditEditNorm::~ChannelEditEditNorm()
1235 void ChannelEditEditNorm::add_items()
1237 add_item(new ChannelEditEditNormItem(thread,
1239 edit->value_to_norm(NTSC), NTSC));
1240 add_item(new ChannelEditEditNormItem(thread,
1242 edit->value_to_norm(PAL), PAL));
1243 add_item(new ChannelEditEditNormItem(thread,
1245 edit->value_to_norm(SECAM), SECAM));
1249 ChannelEditEditNormItem::ChannelEditEditNormItem(ChannelEditEditThread *thread,
1250 ChannelEditThread *edit,
1255 this->value = value;
1257 this->thread = thread;
1259 ChannelEditEditNormItem::~ChannelEditEditNormItem()
1262 int ChannelEditEditNormItem::handle_event()
1264 get_popup_menu()->set_text(get_text());
1266 thread->set_norm(value);
1268 edit->scan_params.norm = value;
1273 ChannelEditEditFreqtable::ChannelEditEditFreqtable(int x,
1275 ChannelEditEditThread *thread,
1276 ChannelEditThread *edit)
1280 edit->value_to_freqtable(thread ? thread->new_channel.freqtable : edit->scan_params.freqtable))
1282 this->thread = thread;
1285 ChannelEditEditFreqtable::~ChannelEditEditFreqtable()
1288 void ChannelEditEditFreqtable::add_items()
1290 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_DVB), NTSC_DVB));
1291 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(CATV_DVB), CATV_DVB));
1292 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_BCAST), NTSC_BCAST));
1293 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_CABLE), NTSC_CABLE));
1294 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_HRC), NTSC_HRC));
1295 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_BCAST_JP), NTSC_BCAST_JP));
1296 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_CABLE_JP), NTSC_CABLE_JP));
1297 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_AUSTRALIA), PAL_AUSTRALIA));
1298 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_EUROPE), PAL_EUROPE));
1299 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_E_EUROPE), PAL_E_EUROPE));
1300 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_ITALY), PAL_ITALY));
1301 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_IRELAND), PAL_IRELAND));
1302 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_NEWZEALAND), PAL_NEWZEALAND));
1305 ChannelEditEditFreqItem::ChannelEditEditFreqItem(ChannelEditEditThread *thread,
1306 ChannelEditThread *edit,
1307 char *text, int value)
1310 this->value = value;
1312 this->thread = thread;
1314 ChannelEditEditFreqItem::~ChannelEditEditFreqItem()
1317 int ChannelEditEditFreqItem::handle_event()
1319 get_popup_menu()->set_text(get_text());
1321 thread->set_freqtable(value);
1323 edit->scan_params.freqtable = value;
1329 ChannelEditEditFine::ChannelEditEditFine(int x,
1331 ChannelEditEditThread *thread)
1339 thread->new_channel.fine_tune)
1341 this->thread = thread;
1343 ChannelEditEditFine::~ChannelEditEditFine()
1346 int ChannelEditEditFine::handle_event()
1350 int ChannelEditEditFine::button_release_event()
1352 if(BC_Slider::button_release_event())
1354 thread->new_channel.fine_tune = get_value();
1355 thread->set_device();
1362 // ========================== picture quality
1364 ChannelEditPictureThread::ChannelEditPictureThread(
1365 ChannelPicker *channel_picker)
1368 this->channel_picker = channel_picker;
1370 ChannelEditPictureThread::~ChannelEditPictureThread()
1374 void ChannelEditPictureThread::handle_done_event(int result)
1376 if(channel_picker->get_picture_usage())
1377 channel_picker->get_picture_usage()->save_defaults();
1380 BC_Window* ChannelEditPictureThread::new_gui()
1382 ChannelEditPictureWindow *edit_window = new ChannelEditPictureWindow(this,
1384 edit_window->create_objects();
1388 void ChannelEditPictureThread::edit_picture()
1396 ChannelEditPictureWindow::ChannelEditPictureWindow(ChannelEditPictureThread *thread,
1397 ChannelPicker *channel_picker)
1398 : BC_Window(PROGRAM_NAME ": Picture",
1399 channel_picker->mwindow->session->picture_x,
1400 channel_picker->mwindow->session->picture_y,
1401 calculate_w(channel_picker),
1402 calculate_h(channel_picker),
1403 calculate_w(channel_picker),
1404 calculate_h(channel_picker))
1406 this->thread = thread;
1407 this->channel_picker = channel_picker;
1409 ChannelEditPictureWindow::~ChannelEditPictureWindow()
1413 int ChannelEditPictureWindow::calculate_h(ChannelPicker *channel_picker)
1415 PictureConfig *picture_usage = channel_picker->get_picture_usage();
1416 int pad = BC_Pot::calculate_h();
1418 channel_picker->parent_window->get_text_height(MEDIUMFONT) + 5 +
1419 BC_OKButton::calculate_h();
1421 // Only used for Video4Linux 1
1424 if(picture_usage->use_brightness)
1426 if(picture_usage->use_contrast)
1428 if(picture_usage->use_color)
1430 if(picture_usage->use_hue)
1432 if(picture_usage->use_whiteness)
1436 result += channel_picker->get_controls() * pad;
1440 int ChannelEditPictureWindow::calculate_w(ChannelPicker *channel_picker)
1442 PictureConfig *picture_usage = channel_picker->get_picture_usage();
1443 int widget_border = ((Theme*)channel_picker->get_theme())->widget_border;
1444 int pad = BC_Pot::calculate_w() + 4 * widget_border;
1447 // Only used for Video4Linux 1
1448 if(!picture_usage ||
1449 (!picture_usage->use_brightness &&
1450 !picture_usage->use_contrast &&
1451 !picture_usage->use_color &&
1452 !picture_usage->use_hue &&
1453 !picture_usage->use_whiteness &&
1454 !channel_picker->get_controls()))
1456 result = BC_Title::calculate_w(channel_picker->parent_window,
1457 "Device has no picture controls." +
1461 // Only used for Video4Linux 1
1464 if(picture_usage->use_brightness)
1466 int new_w = BC_Title::calculate_w(channel_picker->parent_window, "Brightness:") + pad;
1467 result = MAX(result, new_w);
1469 if(picture_usage->use_contrast)
1471 int new_w = BC_Title::calculate_w(channel_picker->parent_window, "Contrast:") + pad;
1472 result = MAX(result, new_w);
1474 if(picture_usage->use_color)
1476 int new_w = BC_Title::calculate_w(channel_picker->parent_window, "Color:") + pad;
1477 result = MAX(result, new_w);
1479 if(picture_usage->use_hue)
1481 int new_w = BC_Title::calculate_w(channel_picker->parent_window, "Hue:") + pad;
1482 result = MAX(result, new_w);
1484 if(picture_usage->use_whiteness)
1486 int new_w = BC_Title::calculate_w(channel_picker->parent_window, "Whiteness:") + pad;
1487 result = MAX(result, new_w);
1491 for(int i = 0; i < channel_picker->get_controls(); i++)
1493 int new_w = BC_Title::calculate_w(channel_picker->parent_window,
1494 channel_picker->get_control(i)->name) +
1496 result = MAX(result, new_w);
1503 void ChannelEditPictureWindow::create_objects()
1506 int widget_border = ((Theme*)channel_picker->get_theme())->widget_border;
1507 int x1 = get_w() - BC_Pot::calculate_w() * 2 - widget_border * 2;
1508 int x2 = get_w() - BC_Pot::calculate_w() - widget_border;
1509 int pad = BC_Pot::calculate_h();
1511 #define SWAP_X x1 ^= x2; x2 ^= x1; x1 ^= x2;
1513 PictureConfig *picture_usage = channel_picker->get_picture_usage();
1515 // Only used for Video4Linux 1
1516 if(!picture_usage ||
1517 (!picture_usage->use_brightness &&
1518 !picture_usage->use_contrast &&
1519 !picture_usage->use_color &&
1520 !picture_usage->use_hue &&
1521 !picture_usage->use_whiteness &&
1522 !channel_picker->get_controls()))
1524 add_subwindow(new BC_Title(x, y, "Device has no picture controls."));
1528 // Only used for Video4Linux 1
1529 if(picture_usage && picture_usage->use_brightness)
1531 add_subwindow(new BC_Title(x, y + 10, _("Brightness:")));
1532 add_subwindow(new ChannelEditBright(x1, y, channel_picker, channel_picker->get_brightness()));
1538 if(picture_usage && picture_usage->use_contrast)
1540 add_subwindow(new BC_Title(x, y + 10, _("Contrast:")));
1541 add_subwindow(new ChannelEditContrast(x1, y, channel_picker, channel_picker->get_contrast()));
1546 if(picture_usage && picture_usage->use_color)
1548 add_subwindow(new BC_Title(x, y + 10, _("Color:")));
1549 add_subwindow(new ChannelEditColor(x1, y, channel_picker, channel_picker->get_color()));
1554 if(picture_usage && picture_usage->use_hue)
1556 add_subwindow(new BC_Title(x, y + 10, _("Hue:")));
1557 add_subwindow(new ChannelEditHue(x1, y, channel_picker, channel_picker->get_hue()));
1562 if(picture_usage && picture_usage->use_whiteness)
1564 add_subwindow(new BC_Title(x, y + 10, _("Whiteness:")));
1565 add_subwindow(new ChannelEditWhiteness(x1, y, channel_picker, channel_picker->get_whiteness()));
1570 for(int i = 0; i < channel_picker->get_controls(); i++)
1573 add_subwindow(title = new BC_Title(x,
1575 _(channel_picker->get_control(i)->name)));
1578 if(x3 < title->get_x() + title->get_w() + widget_border)
1579 x3 = title->get_x() + title->get_w() + widget_border;
1581 add_subwindow(new ChannelEditCommon(x3,
1584 channel_picker->get_control(i)));
1591 add_subwindow(new BC_OKButton(this));
1595 int ChannelEditPictureWindow::translation_event()
1597 channel_picker->mwindow->session->picture_x = get_x();
1598 channel_picker->mwindow->session->picture_y = get_y();
1604 ChannelEditBright::ChannelEditBright(int x, int y, ChannelPicker *channel_picker, int value)
1611 this->channel_picker = channel_picker;
1613 ChannelEditBright::~ChannelEditBright() {}
1614 int ChannelEditBright::handle_event()
1618 int ChannelEditBright::button_release_event()
1620 if(BC_Pot::button_release_event())
1622 channel_picker->set_brightness(get_value());
1628 ChannelEditContrast::ChannelEditContrast(int x, int y, ChannelPicker *channel_picker, int value)
1635 this->channel_picker = channel_picker;
1637 ChannelEditContrast::~ChannelEditContrast() {}
1638 int ChannelEditContrast::handle_event()
1642 int ChannelEditContrast::button_release_event()
1644 if(BC_Pot::button_release_event())
1646 channel_picker->set_contrast(get_value());
1653 ChannelEditColor::ChannelEditColor(int x, int y, ChannelPicker *channel_picker, int value)
1660 this->channel_picker = channel_picker;
1662 ChannelEditColor::~ChannelEditColor() {}
1663 int ChannelEditColor::handle_event()
1667 int ChannelEditColor::button_release_event()
1669 if(BC_Pot::button_release_event())
1671 channel_picker->set_color(get_value());
1677 ChannelEditHue::ChannelEditHue(int x, int y, ChannelPicker *channel_picker, int value)
1684 this->channel_picker = channel_picker;
1686 ChannelEditHue::~ChannelEditHue() {}
1687 int ChannelEditHue::handle_event()
1691 int ChannelEditHue::button_release_event()
1693 if(BC_Pot::button_release_event())
1695 channel_picker->set_hue(get_value());
1701 ChannelEditWhiteness::ChannelEditWhiteness(int x, int y, ChannelPicker *channel_picker, int value)
1708 this->channel_picker = channel_picker;
1710 ChannelEditWhiteness::~ChannelEditWhiteness()
1713 int ChannelEditWhiteness::handle_event()
1717 int ChannelEditWhiteness::button_release_event()
1719 if(BC_Pot::button_release_event())
1721 channel_picker->set_whiteness(get_value());
1729 ChannelEditCommon::ChannelEditCommon(int x,
1731 ChannelPicker *channel_picker,
1739 this->channel_picker = channel_picker;
1740 this->device_id = item->device_id;
1743 ChannelEditCommon::~ChannelEditCommon()
1747 int ChannelEditCommon::handle_event()
1752 int ChannelEditCommon::button_release_event()
1754 if(BC_Pot::button_release_event())
1756 channel_picker->set_picture(device_id, get_value());
1762 int ChannelEditCommon::keypress_event()
1764 if(BC_Pot::keypress_event())
1766 channel_picker->set_picture(device_id, get_value());