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()
63 void ChannelEditThread::run()
69 window->lock_window("ChannelEditThread::run");
70 window->raise_window(1);
71 window->unlock_window();
76 completion->lock("ChannelEditThread::run");
78 // Copy master channel list to temporary.
79 new_channels->copy_from(channel_picker->channeldb);
80 Channel *channel = channel_picker->get_current_channel();
81 current_channel = channel_picker->channeldb->number_of(channel);
82 //printf("ChannelEditThread::run 1 %d\n", current_channel);
84 // Run the channel list window using the temporary list.
85 window = new ChannelEditWindow(this, channel_picker);
86 window->create_objects();
87 int result = window->run_window();
88 delete window; window = 0;
91 // Copy new channels to master list
92 channel_picker->channeldb->clear();
94 channel_picker->channeldb->copy_from(new_channels);
95 channel_picker->update_channel_list();
99 channel_picker->handle_channel_edit(result);
101 completion->unlock();
106 void ChannelEditThread::close_threads()
108 if(in_progress && window)
111 completion->lock("ChannelEditThread::close_threads");
112 completion->unlock();
116 char *ChannelEditThread::value_to_freqtable(int value)
120 case NTSC_DVB: return _("NTSC_DVB");
121 case CATV_DVB: return _("CATV_DVB");
122 case NTSC_BCAST: return _("NTSC_BCAST");
123 case NTSC_CABLE: return _("NTSC_CABLE");
124 case NTSC_HRC: return _("NTSC_HRC");
125 case NTSC_BCAST_JP: return _("NTSC_BCAST_JP");
126 case NTSC_CABLE_JP: return _("NTSC_CABLE_JP");
127 case PAL_AUSTRALIA: return _("PAL_AUSTRALIA");
128 case PAL_EUROPE: return _("PAL_EUROPE");
129 case PAL_E_EUROPE: return _("PAL_E_EUROPE");
130 case PAL_ITALY: return _("PAL_ITALY");
131 case PAL_IRELAND: return _("PAL_IRELAND");
132 case PAL_NEWZEALAND: return _("PAL_NEWZEALAND");
137 char* ChannelEditThread::value_to_norm(int value)
141 case NTSC: return _("NTSC");
142 case PAL: return _("PAL");
143 case SECAM: return _("SECAM");
148 char* ChannelEditThread::value_to_input(int value)
150 ArrayList<Channel*> *inputs = channel_picker->get_video_inputs();
151 return value >= inputs->total ? _("None") :
152 inputs->values[value]->device_name;
161 ChannelEditWindow::ChannelEditWindow(ChannelEditThread *thread,
162 ChannelPicker *channel_picker)
163 : BC_Window(_(PROGRAM_NAME ": Channels"),
164 channel_picker->mwindow->session->channels_x,
165 channel_picker->mwindow->session->channels_y,
166 350, 400, 350, 400, 0, 0, 1)
168 this->thread = thread;
169 this->channel_picker = channel_picker;
170 this->edit_thread = 0;
171 this->picture_thread = 0;
172 this->scan_confirm_thread = 0;
175 ChannelEditWindow::~ChannelEditWindow()
177 if( thread->scan_thread )
178 thread->scan_thread->stop();
179 channel_list.remove_all_objects();
181 delete picture_thread;
182 delete scan_confirm_thread;
185 void ChannelEditWindow::create_objects()
189 // Create channel list
190 for(int i = 0; i < thread->new_channels->size(); i++)
192 channel_list.append(new BC_ListBoxItem(thread->new_channels->get(i)->title));
195 add_subwindow(list_box = new ChannelEditList(this, x, y));
197 if(channel_picker->use_select())
199 add_subwindow(new ChannelEditSelect(this, x, y));
202 add_subwindow(new ChannelEditAdd(this, x, y));
204 add_subwindow(new ChannelEdit(this, x, y));
206 add_subwindow(new ChannelEditMoveUp(this, x, y));
208 add_subwindow(new ChannelEditMoveDown(this, x, y));
210 add_subwindow(new ChannelEditSort(this, x, y));
213 Channel *channel_usage = channel_picker->get_channel_usage();
214 if(channel_usage && channel_usage->has_scanning)
216 add_subwindow(new ChannelEditScan(this, x, y));
219 add_subwindow(new ChannelEditDel(this, x, y));
221 add_subwindow(new ChannelEditPicture(this, x, y));
224 add_subwindow(new BC_OKButton(this));
226 add_subwindow(new BC_CancelButton(this));
229 edit_thread = new ChannelEditEditThread(this, channel_picker);
230 picture_thread = new ChannelEditPictureThread(channel_picker);
234 int ChannelEditWindow::close_event()
236 if( thread->scan_thread )
237 thread->scan_thread->stop();
238 return BC_WindowBase::close_event();
241 int ChannelEditWindow::translation_event()
243 channel_picker->mwindow->session->channels_x = get_x();
244 channel_picker->mwindow->session->channels_y = get_y();
249 int ChannelEditWindow::add_channel()
251 Channel *new_channel;
252 Channel *prev_channel = 0;
254 // Create new channel
255 new_channel = new Channel;
257 // Reuse parameters from previous channel
258 if(thread->new_channels->size())
260 prev_channel = thread->new_channels->get(
261 thread->new_channels->size() - 1);
262 new_channel->copy_settings(prev_channel);
265 // Use default channel parameters
266 if(channel_picker->get_master_channel())
268 new_channel->copy_settings(channel_picker->get_master_channel());
271 // Copy device usage. Need the same thing for playback.
272 if(channel_picker->get_master_channel())
274 new_channel->copy_usage(channel_picker->get_master_channel());
277 // Add to channel table
278 channel_list.append(new BC_ListBoxItem(new_channel->title));
279 thread->new_channels->append(new_channel);
282 // Start common routing
283 edit_thread->edit_channel(new_channel, 0);
287 void ChannelEditWindow::update_list()
289 // Create channel list
290 channel_list.remove_all_objects();
291 for(int i = 0; i < thread->new_channels->size(); i++)
295 thread->new_channels->get(i)->title));
298 list_box->update(&channel_list, 0, 0, 1, list_box->get_yposition());
301 void ChannelEditWindow::update_list(Channel *channel)
304 for(i = 0; i < thread->new_channels->size(); i++)
305 if(thread->new_channels->get(i) == channel) break;
307 if(i < thread->new_channels->size())
309 channel_list.values[i]->set_text(channel->title);
316 void ChannelEditWindow::edit_channel()
318 if(list_box->get_selection_number(0, 0) > -1)
320 thread->current_channel = list_box->get_selection_number(0, 0);
321 edit_thread->edit_channel(
322 thread->new_channels->get(
323 list_box->get_selection_number(0, 0)),
328 void ChannelEditWindow::edit_picture()
330 picture_thread->edit_picture();
333 void ChannelEditWindow::scan_confirm()
335 channel_picker->load_scan_defaults(&thread->scan_params);
336 if(!scan_confirm_thread) scan_confirm_thread = new ConfirmScanThread(this);
338 scan_confirm_thread->start();
339 lock_window("ChannelEditWindow::scan_confirm");
342 void ChannelEditWindow::scan()
344 thread->new_channels->clear();
347 if( !thread->scan_thread )
348 thread->scan_thread = new ScanThread(thread);
349 thread->scan_thread->start();
353 void ChannelEditWindow::get_chan_num(Channel *channel, int &chan, int &stream)
355 const char *cp = channel->title;
356 int chn = 0, str = 0;
357 while( isdigit(*cp) ) chn = 10*chn + (*cp++ -'0');
358 if( chn != 0 && *cp != 0 ) {
360 while( isdigit(*cp) ) str = 10*str + (*cp++ -'0');
363 chan = chn; stream = str;
366 void ChannelEditWindow::sort()
371 for(int i = 0; i < thread->new_channels->size() - 1; i++) {
372 Channel *channel1 = thread->new_channels->get(i);
373 Channel *channel2 = thread->new_channels->get(i + 1);
374 int ch1, st1; get_chan_num(channel1, ch1, st1);
375 int ch2, st2; get_chan_num(channel2, ch2, st2);
376 if( (ch1 > 0 && ch2 > 0) ?
377 (ch1 > ch2 || (ch1 == ch2 && (st1 > st2 || (st1 == st2 &&
378 strcasecmp(channel2->title, channel1->title) < 0)))) :
379 strcasecmp(channel2->title, channel1->title) < 0) {
380 thread->new_channels->set(i, channel2);
381 thread->new_channels->set(i + 1, channel1);
390 void ChannelEditWindow::delete_channel(int number)
392 delete thread->new_channels->get(number);
393 channel_list.remove_number(number);
394 thread->new_channels->remove_number(number);
398 void ChannelEditWindow::delete_channel(Channel *channel)
401 for(i = 0; i < thread->new_channels->size(); i++)
403 if(thread->new_channels->get(i) == channel)
408 if(i < thread->new_channels->size()) delete_channel(i);
411 int ChannelEditWindow::move_channel_up()
413 if(list_box->get_selection_number(0, 0) > -1)
415 int number2 = list_box->get_selection_number(0, 0);
416 int number1 = number2 - 1;
418 BC_ListBoxItem *temp_text;
420 if(number1 < 0) number1 = thread->new_channels->size() - 1;
422 temp = thread->new_channels->get(number1);
423 thread->new_channels->set(number1, thread->new_channels->get(number2));
424 thread->new_channels->set(number2, temp);
426 temp_text = channel_list.values[number1];
427 channel_list.values[number1] = channel_list.values[number2];
428 channel_list.values[number2] = temp_text;
429 list_box->update(&channel_list,
433 list_box->get_xposition(),
434 list_box->get_yposition(),
441 int ChannelEditWindow::move_channel_down()
443 if(list_box->get_selection_number(0, 0) > -1)
445 int number2 = list_box->get_selection_number(0, 0);
446 int number1 = number2 + 1;
448 BC_ListBoxItem *temp_text;
450 if(number1 > thread->new_channels->size() - 1) number1 = 0;
452 temp = thread->new_channels->get(number1);
453 thread->new_channels->set(number1, thread->new_channels->get(number2));
454 thread->new_channels->set(number2, temp);
455 temp_text = channel_list.values[number1];
456 channel_list.values[number1] = channel_list.values[number2];
457 channel_list.values[number2] = temp_text;
458 list_box->update(&channel_list,
462 list_box->get_xposition(),
463 list_box->get_yposition(),
470 int ChannelEditWindow::change_channel_from_list(int channel_number)
472 if(channel_number > -1 && channel_number < thread->new_channels->size())
474 thread->current_channel = channel_number;
475 channel_picker->set_channel(thread->new_channels->get(channel_number));
480 ChannelEditSelect::ChannelEditSelect(ChannelEditWindow *window, int x, int y)
481 : BC_GenericButton(x, y, _("Select"))
483 this->window = window;
485 ChannelEditSelect::~ChannelEditSelect()
488 int ChannelEditSelect::handle_event()
490 window->change_channel_from_list(
491 window->list_box->get_selection_number(0, 0));
495 ChannelEditAdd::ChannelEditAdd(ChannelEditWindow *window, int x, int y)
496 : BC_GenericButton(x, y, _("Add..."))
498 this->window = window;
500 ChannelEditAdd::~ChannelEditAdd()
503 int ChannelEditAdd::handle_event()
505 window->add_channel();
509 ChannelEditList::ChannelEditList(ChannelEditWindow *window, int x, int y)
513 window->get_h() - BC_OKButton::calculate_h() - y - 10,
515 &(window->channel_list))
517 this->window = window;
519 ChannelEditList::~ChannelEditList()
522 int ChannelEditList::handle_event()
524 window->edit_channel();
528 ChannelEditMoveUp::ChannelEditMoveUp(ChannelEditWindow *window, int x, int y)
529 : BC_GenericButton(x, y, _("Move up"))
531 this->window = window;
533 ChannelEditMoveUp::~ChannelEditMoveUp()
536 int ChannelEditMoveUp::handle_event()
538 lock_window("ChannelEditMoveUp::handle_event");
539 window->move_channel_up();
544 ChannelEditMoveDown::ChannelEditMoveDown(ChannelEditWindow *window, int x, int y)
545 : BC_GenericButton(x, y, _("Move down"))
547 this->window = window;
549 ChannelEditMoveDown::~ChannelEditMoveDown()
552 int ChannelEditMoveDown::handle_event()
554 lock_window("ChannelEditMoveDown::handle_event");
555 window->move_channel_down();
560 ChannelEditSort::ChannelEditSort(ChannelEditWindow *window, int x, int y)
561 : BC_GenericButton(x, y, _("Sort"))
563 this->window = window;
565 int ChannelEditSort::handle_event()
567 lock_window("ChannelEditSort::handle_event");
573 ChannelEditScan::ChannelEditScan(ChannelEditWindow *window, int x, int y)
574 : BC_GenericButton(x, y, _("Scan"))
576 this->window = window;
578 int ChannelEditScan::handle_event()
580 window->scan_confirm();
584 ChannelEditDel::ChannelEditDel(ChannelEditWindow *window, int x, int y)
585 : BC_GenericButton(x, y, _("Delete"))
587 this->window = window;
589 ChannelEditDel::~ChannelEditDel()
592 int ChannelEditDel::handle_event()
594 if(window->list_box->get_selection_number(0, 0) > -1)
595 window->delete_channel(window->list_box->get_selection_number(0, 0));
599 ChannelEdit::ChannelEdit(ChannelEditWindow *window, int x, int y)
600 : BC_GenericButton(x, y, _("Edit..."))
602 this->window = window;
604 ChannelEdit::~ChannelEdit()
607 int ChannelEdit::handle_event()
609 window->edit_channel();
613 ChannelEditPicture::ChannelEditPicture(ChannelEditWindow *window, int x, int y)
614 : BC_GenericButton(x, y, _("Picture..."))
616 this->window = window;
618 ChannelEditPicture::~ChannelEditPicture()
621 int ChannelEditPicture::handle_event()
623 window->edit_picture();
638 // ========================= confirm overwrite by channel scannin
641 ConfirmScan::ConfirmScan(ChannelEditWindow *gui, int x, int y)
642 : BC_Window(_(PROGRAM_NAME ": Scan confirm"),
646 BC_OKButton::calculate_h() + 130,
656 void ConfirmScan::create_objects()
661 add_subwindow(title = new BC_Title(x, y, _("Set parameters for channel scanning.")));
662 y += title->get_h() + 10;
665 add_subwindow(title = new BC_Title(x, y, _("Frequency table:")));
667 y += BC_PopupMenu::calculate_h();
668 add_subwindow(title = new BC_Title(x, y, _("Norm:")));
669 x2 = MAX(x2, title->get_w());
670 y += BC_PopupMenu::calculate_h();
671 add_subwindow(title = new BC_Title(x, y, _("Input:")));
672 x2 = MAX(x2, title->get_w());
673 y += BC_PopupMenu::calculate_h();
678 ChannelEditEditFreqtable *table;
679 add_subwindow(table = new ChannelEditEditFreqtable(x,
684 y += table->get_h() + 10;
686 ChannelEditEditNorm *norm;
687 add_subwindow(norm = new ChannelEditEditNorm(x,
692 y += norm->get_h() + 10;
694 ChannelEditEditInput *input;
695 add_subwindow(input = new ChannelEditEditInput(x,
702 add_subwindow(new BC_OKButton(this));
703 add_subwindow(new BC_CancelButton(this));
713 ConfirmScanThread::ConfirmScanThread(ChannelEditWindow *gui)
719 void ConfirmScanThread::handle_done_event(int result)
721 gui->channel_picker->save_scan_defaults(&gui->thread->scan_params);
724 get_gui()->hide_window();
725 gui->lock_window("ConfirmScanThread::handle_done_event");
727 gui->unlock_window();
731 ConfirmScanThread::~ConfirmScanThread()
736 BC_Window* ConfirmScanThread::new_gui()
738 int x = gui->get_abs_cursor_x(1);
739 int y = gui->get_abs_cursor_y(1);
740 ConfirmScan *result = new ConfirmScan(gui, x, y);
741 result->create_objects();
750 ScanThread::ScanThread(ChannelEditThread *edit)
758 ScanThread::~ScanThread()
763 void ScanThread::stop()
765 // Cancel previous job
769 progress->stop_progress();
770 delete progress; progress = 0;
774 void ScanThread::start()
779 progress = new BC_ProgressBox(
780 edit->channel_picker->parent_window->get_abs_cursor_x(1),
781 edit->channel_picker->parent_window->get_abs_cursor_y(1),
783 chanlists[edit->scan_params.freqtable].count);
789 void ScanThread::run()
791 for(int i = 0; i < chanlists[edit->scan_params.freqtable].count &&
792 !interrupt && !progress->is_cancelled(); i++) {
793 edit->scan_params.entry = i;
794 char string[BCTEXTLEN];
795 sprintf(edit->scan_params.title, "%s",
796 chanlists[edit->scan_params.freqtable].list[i].name);
797 sprintf(string, _("Scanning %s"), edit->scan_params.title);
798 progress->update_title(string, 1);
799 progress->update(i, 1);
800 edit->channel_picker->set_channel(&edit->scan_params);
801 sleep(1); // has_signal should do whatever it takes
802 if( interrupt ) break;
803 int got_signal = edit->channel_picker->has_signal();
804 if( interrupt ) break;
805 if(!got_signal) continue;
806 if(edit->channel_picker->get_channel_usage()->has_subchan) {
807 ArrayList<Channel*> channels;
808 edit->channel_picker->create_channeldb(&channels);
809 if( channels.total ) {
810 edit->window->lock_window("ScanThread::run");
811 for( int i=0; i<channels.total; ++i ) {
812 Channel *new_channel = channels.values[i];
813 new_channel->copy_usage(&edit->scan_params);
814 edit->new_channels->append(new_channel);
816 edit->window->update_list();
817 edit->window->unlock_window();
821 Channel *new_channel = new Channel;
822 new_channel->copy_usage(&edit->scan_params);
823 new_channel->copy_settings(&edit->scan_params);
824 edit->window->lock_window("ScanThread::run");
825 edit->new_channels->append(new_channel);
826 edit->window->update_list();
827 edit->window->unlock_window();
829 edit->window->set_done(interrupt || progress->is_cancelled() ? 1 : 0);
838 // ================================= Edit a single channel
842 ChannelEditEditThread::ChannelEditEditThread(ChannelEditWindow *window,
843 ChannelPicker *channel_picker)
846 this->window = window;
847 this->channel_picker = channel_picker;
851 completion = new Condition(1, "ChannelEditEditThread::completion");
854 ChannelEditEditThread::~ChannelEditEditThread()
860 void ChannelEditEditThread::close_threads()
864 edit_window->set_done(1);
865 completion->lock("ChannelEditEditThread::close_threads");
866 completion->unlock();
870 int ChannelEditEditThread::edit_channel(Channel *channel, int editing)
874 edit_window->lock_window("ChannelEditEditThread::edit_channel");
875 edit_window->raise_window(1);
876 edit_window->unlock_window();
881 // Copy the channel to edit into a temporary
882 completion->lock("ChannelEditEditThread::edit_channel");
883 this->editing = editing;
884 this->output_channel = channel;
885 new_channel.copy_settings(output_channel);
886 new_channel.copy_usage(output_channel);
888 if(editing && new_channel.title[0])
898 void ChannelEditEditThread::set_device()
900 channel_picker->set_channel(&new_channel);
903 void ChannelEditEditThread::change_source(const char *source_name)
905 for(int i = 0; i < chanlists[new_channel.freqtable].count; i++)
907 if(!strcasecmp(chanlists[new_channel.freqtable].list[i].name, source_name))
909 new_channel.entry = i;
910 i = chanlists[new_channel.freqtable].count;
916 strcpy(new_channel.title, source_name);
917 if(edit_window->title_text)
919 edit_window->title_text->update(source_name);
924 void ChannelEditEditThread::source_up()
927 if(new_channel.entry > chanlists[new_channel.freqtable].count - 1) new_channel.entry = 0;
928 source_text->update(chanlists[new_channel.freqtable].list[new_channel.entry].name);
932 void ChannelEditEditThread::source_down()
935 if(new_channel.entry < 0) new_channel.entry = chanlists[new_channel.freqtable].count - 1;
936 source_text->update(chanlists[new_channel.freqtable].list[new_channel.entry].name);
940 void ChannelEditEditThread::set_input(int value)
942 new_channel.input = value;
946 void ChannelEditEditThread::set_norm(int value)
948 new_channel.norm = value;
952 void ChannelEditEditThread::set_freqtable(int value)
954 new_channel.freqtable = value;
955 if(new_channel.entry > chanlists[new_channel.freqtable].count - 1) new_channel.entry = 0;
956 source_text->update(chanlists[new_channel.freqtable].list[new_channel.entry].name);
960 void ChannelEditEditThread::run()
962 ChannelEditEditWindow edit_window(this, window, channel_picker);
963 edit_window.create_objects(&new_channel);
964 this->edit_window = &edit_window;
965 int result = edit_window.run_window();
966 this->edit_window = 0;
968 // Done editing channel. Keep channel.
971 output_channel->copy_settings(&new_channel);
972 window->lock_window();
973 window->update_list(output_channel);
974 window->unlock_window();
981 window->lock_window();
982 window->delete_channel(output_channel);
983 window->unlock_window();
987 completion->unlock();
991 ChannelEditEditWindow::ChannelEditEditWindow(ChannelEditEditThread *thread,
992 ChannelEditWindow *window,
993 ChannelPicker *channel_picker)
994 : BC_Window(_(PROGRAM_NAME ": Edit Channel"),
995 channel_picker->parent_window->get_abs_cursor_x(1),
996 channel_picker->parent_window->get_abs_cursor_y(1),
1005 this->channel_picker = channel_picker;
1006 this->window = window;
1007 this->thread = thread;
1009 ChannelEditEditWindow::~ChannelEditEditWindow()
1012 void ChannelEditEditWindow::create_objects(Channel *channel)
1014 this->new_channel = channel;
1015 Channel *channel_usage = channel_picker->get_channel_usage();
1019 // if(!channel_usage ||
1020 // (!channel_usage->use_frequency &&
1021 // !channel_usage->use_fine &&
1022 // !channel_usage->use_norm &&
1023 // !channel_usage->use_input))
1025 // add_subwindow(new BC_Title(x, y, "Device has no input selection."));
1030 add_subwindow(new BC_Title(x, y, _("Title:")));
1031 add_subwindow(title_text = new ChannelEditEditTitle(x, y + 20, thread));
1035 if(channel_usage && channel_usage->use_frequency)
1037 add_subwindow(new BC_Title(x, y, _("Channel:")));
1039 add_subwindow(thread->source_text = new ChannelEditEditSource(x, y, thread));
1040 add_subwindow(new ChannelEditEditSourceTumbler(x + 160, y, thread));
1043 add_subwindow(new BC_Title(x, y, _("Frequency table:")));
1044 ChannelEditEditFreqtable *table;
1045 add_subwindow(table = new ChannelEditEditFreqtable(x + 130,
1053 if(channel_usage && channel_usage->use_fine)
1055 add_subwindow(new BC_Title(x, y, _("Fine:")));
1056 add_subwindow(new ChannelEditEditFine(x + 130, y, thread));
1060 if(channel_usage && channel_usage->use_norm)
1062 add_subwindow(new BC_Title(x, y, _("Norm:")));
1063 ChannelEditEditNorm *norm;
1064 add_subwindow(norm = new ChannelEditEditNorm(x + 130,
1072 if( (channel_usage && channel_usage->use_input) ||
1075 add_subwindow(new BC_Title(x, y, _("Input:")));
1076 ChannelEditEditInput *input;
1077 add_subwindow(input = new ChannelEditEditInput(x + 130,
1085 add_subwindow(new BC_OKButton(this));
1087 add_subwindow(new BC_CancelButton(this));
1091 ChannelEditEditTitle::ChannelEditEditTitle(int x,
1093 ChannelEditEditThread *thread)
1094 : BC_TextBox(x, y, 150, 1, thread->new_channel.title)
1096 this->thread = thread;
1098 ChannelEditEditTitle::~ChannelEditEditTitle()
1101 int ChannelEditEditTitle::handle_event()
1103 if(strlen(get_text()) < 1024)
1105 strcpy(thread->new_channel.title, get_text());
1107 thread->user_title = get_text()[0] ? 1 : 0;
1112 ChannelEditEditSource::ChannelEditEditSource(int x, int y, ChannelEditEditThread *thread)
1113 : BC_TextBox(x, y, 150, 1, chanlists[thread->new_channel.freqtable].list[thread->new_channel.entry].name)
1115 this->thread = thread;
1118 ChannelEditEditSource::~ChannelEditEditSource()
1121 int ChannelEditEditSource::handle_event()
1123 thread->change_source(get_text());
1128 ChannelEditEditSourceTumbler::ChannelEditEditSourceTumbler(int x, int y, ChannelEditEditThread *thread)
1131 this->thread = thread;
1133 ChannelEditEditSourceTumbler::~ChannelEditEditSourceTumbler()
1136 int ChannelEditEditSourceTumbler::handle_up_event()
1138 thread->source_up();
1141 int ChannelEditEditSourceTumbler::handle_down_event()
1143 thread->source_down();
1147 ChannelEditEditInput::ChannelEditEditInput(int x,
1149 ChannelEditEditThread *thread,
1150 ChannelEditThread *edit)
1154 edit->value_to_input(thread ? thread->new_channel.input : edit->scan_params.input))
1156 this->thread = thread;
1159 ChannelEditEditInput::~ChannelEditEditInput()
1162 void ChannelEditEditInput::add_items()
1164 ArrayList<Channel*> *inputs;
1165 inputs = edit->channel_picker->get_video_inputs();
1169 for(int i = 0; i < inputs->total; i++)
1171 add_item(new ChannelEditEditInputItem(thread,
1173 inputs->values[i]->device_name,
1178 int ChannelEditEditInput::handle_event()
1183 ChannelEditEditInputItem::ChannelEditEditInputItem(ChannelEditEditThread *thread,
1184 ChannelEditThread *edit,
1189 this->thread = thread;
1191 this->value = value;
1193 ChannelEditEditInputItem::~ChannelEditEditInputItem()
1196 int ChannelEditEditInputItem::handle_event()
1198 get_popup_menu()->set_text(get_text());
1199 if(thread && !thread->user_title)
1201 strcpy(thread->new_channel.title, get_text());
1202 if(thread->edit_window->title_text)
1204 thread->edit_window->title_text->update(get_text());
1208 thread->set_input(value);
1210 edit->scan_params.input = value;
1214 ChannelEditEditNorm::ChannelEditEditNorm(int x,
1216 ChannelEditEditThread *thread,
1217 ChannelEditThread *edit)
1221 edit->value_to_norm(thread ? thread->new_channel.norm : edit->scan_params.norm))
1223 this->thread = thread;
1226 ChannelEditEditNorm::~ChannelEditEditNorm()
1229 void ChannelEditEditNorm::add_items()
1231 add_item(new ChannelEditEditNormItem(thread,
1233 edit->value_to_norm(NTSC), NTSC));
1234 add_item(new ChannelEditEditNormItem(thread,
1236 edit->value_to_norm(PAL), PAL));
1237 add_item(new ChannelEditEditNormItem(thread,
1239 edit->value_to_norm(SECAM), SECAM));
1243 ChannelEditEditNormItem::ChannelEditEditNormItem(ChannelEditEditThread *thread,
1244 ChannelEditThread *edit,
1249 this->value = value;
1251 this->thread = thread;
1253 ChannelEditEditNormItem::~ChannelEditEditNormItem()
1256 int ChannelEditEditNormItem::handle_event()
1258 get_popup_menu()->set_text(get_text());
1260 thread->set_norm(value);
1262 edit->scan_params.norm = value;
1267 ChannelEditEditFreqtable::ChannelEditEditFreqtable(int x,
1269 ChannelEditEditThread *thread,
1270 ChannelEditThread *edit)
1274 edit->value_to_freqtable(thread ? thread->new_channel.freqtable : edit->scan_params.freqtable))
1276 this->thread = thread;
1279 ChannelEditEditFreqtable::~ChannelEditEditFreqtable()
1282 void ChannelEditEditFreqtable::add_items()
1284 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_DVB), NTSC_DVB));
1285 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(CATV_DVB), CATV_DVB));
1286 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_BCAST), NTSC_BCAST));
1287 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_CABLE), NTSC_CABLE));
1288 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_HRC), NTSC_HRC));
1289 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_BCAST_JP), NTSC_BCAST_JP));
1290 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(NTSC_CABLE_JP), NTSC_CABLE_JP));
1291 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_AUSTRALIA), PAL_AUSTRALIA));
1292 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_EUROPE), PAL_EUROPE));
1293 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_E_EUROPE), PAL_E_EUROPE));
1294 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_ITALY), PAL_ITALY));
1295 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_IRELAND), PAL_IRELAND));
1296 add_item(new ChannelEditEditFreqItem(thread, edit, edit->value_to_freqtable(PAL_NEWZEALAND), PAL_NEWZEALAND));
1299 ChannelEditEditFreqItem::ChannelEditEditFreqItem(ChannelEditEditThread *thread,
1300 ChannelEditThread *edit,
1301 char *text, int value)
1304 this->value = value;
1306 this->thread = thread;
1308 ChannelEditEditFreqItem::~ChannelEditEditFreqItem()
1311 int ChannelEditEditFreqItem::handle_event()
1313 get_popup_menu()->set_text(get_text());
1315 thread->set_freqtable(value);
1317 edit->scan_params.freqtable = value;
1323 ChannelEditEditFine::ChannelEditEditFine(int x,
1325 ChannelEditEditThread *thread)
1333 thread->new_channel.fine_tune)
1335 this->thread = thread;
1337 ChannelEditEditFine::~ChannelEditEditFine()
1340 int ChannelEditEditFine::handle_event()
1344 int ChannelEditEditFine::button_release_event()
1346 if(BC_Slider::button_release_event())
1348 thread->new_channel.fine_tune = get_value();
1349 thread->set_device();
1356 // ========================== picture quality
1358 ChannelEditPictureThread::ChannelEditPictureThread(
1359 ChannelPicker *channel_picker)
1362 this->channel_picker = channel_picker;
1364 ChannelEditPictureThread::~ChannelEditPictureThread()
1368 void ChannelEditPictureThread::handle_done_event(int result)
1370 if(channel_picker->get_picture_usage())
1371 channel_picker->get_picture_usage()->save_defaults();
1374 BC_Window* ChannelEditPictureThread::new_gui()
1376 ChannelEditPictureWindow *edit_window = new ChannelEditPictureWindow(this,
1378 edit_window->create_objects();
1382 void ChannelEditPictureThread::edit_picture()
1388 ChannelEditPictureWindow::ChannelEditPictureWindow(ChannelEditPictureThread *thread,
1389 ChannelPicker *channel_picker)
1390 : BC_Window(_(PROGRAM_NAME ": Picture"),
1391 channel_picker->mwindow->session->picture_x,
1392 channel_picker->mwindow->session->picture_y,
1393 calculate_w(channel_picker),
1394 calculate_h(channel_picker),
1395 calculate_w(channel_picker),
1396 calculate_h(channel_picker))
1398 this->thread = thread;
1399 this->channel_picker = channel_picker;
1401 ChannelEditPictureWindow::~ChannelEditPictureWindow()
1405 int ChannelEditPictureWindow::calculate_h(ChannelPicker *channel_picker)
1407 PictureConfig *picture_usage = channel_picker->get_picture_usage();
1408 int pad = BC_Pot::calculate_h();
1410 channel_picker->parent_window->get_text_height(MEDIUMFONT) + 5 +
1411 BC_OKButton::calculate_h();
1413 // Only used for Video4Linux 1
1416 if(picture_usage->use_brightness)
1418 if(picture_usage->use_contrast)
1420 if(picture_usage->use_color)
1422 if(picture_usage->use_hue)
1424 if(picture_usage->use_whiteness)
1428 result += channel_picker->get_controls() * pad;
1432 int ChannelEditPictureWindow::calculate_w(ChannelPicker *channel_picker)
1434 PictureConfig *picture_usage = channel_picker->get_picture_usage();
1435 int widget_border = ((Theme*)channel_picker->get_theme())->widget_border;
1436 int pad = BC_Pot::calculate_w() + 4 * widget_border;
1439 // Only used for Video4Linux 1
1440 if(!picture_usage ||
1441 (!picture_usage->use_brightness &&
1442 !picture_usage->use_contrast &&
1443 !picture_usage->use_color &&
1444 !picture_usage->use_hue &&
1445 !picture_usage->use_whiteness &&
1446 !channel_picker->get_controls()))
1448 result = BC_Title::calculate_w(channel_picker->parent_window,
1449 _("Device has no picture controls.")) +
1453 // Only used for Video4Linux 1
1456 if(picture_usage->use_brightness)
1458 int new_w = BC_Title::calculate_w(channel_picker->parent_window, _("Brightness:")) + pad;
1459 result = MAX(result, new_w);
1461 if(picture_usage->use_contrast)
1463 int new_w = BC_Title::calculate_w(channel_picker->parent_window, _("Contrast:")) + pad;
1464 result = MAX(result, new_w);
1466 if(picture_usage->use_color)
1468 int new_w = BC_Title::calculate_w(channel_picker->parent_window, _("Color:")) + pad;
1469 result = MAX(result, new_w);
1471 if(picture_usage->use_hue)
1473 int new_w = BC_Title::calculate_w(channel_picker->parent_window, _("Hue:")) + pad;
1474 result = MAX(result, new_w);
1476 if(picture_usage->use_whiteness)
1478 int new_w = BC_Title::calculate_w(channel_picker->parent_window, _("Whiteness:")) + pad;
1479 result = MAX(result, new_w);
1483 for(int i = 0; i < channel_picker->get_controls(); i++)
1485 int new_w = BC_Title::calculate_w(channel_picker->parent_window,
1486 channel_picker->get_control(i)->name) +
1488 result = MAX(result, new_w);
1495 void ChannelEditPictureWindow::create_objects()
1498 int widget_border = ((Theme*)channel_picker->get_theme())->widget_border;
1499 int x1 = get_w() - BC_Pot::calculate_w() * 2 - widget_border * 2;
1500 int x2 = get_w() - BC_Pot::calculate_w() - widget_border;
1501 int pad = BC_Pot::calculate_h();
1503 #define SWAP_X x1 ^= x2; x2 ^= x1; x1 ^= x2;
1505 PictureConfig *picture_usage = channel_picker->get_picture_usage();
1507 // Only used for Video4Linux 1
1508 if(!picture_usage ||
1509 (!picture_usage->use_brightness &&
1510 !picture_usage->use_contrast &&
1511 !picture_usage->use_color &&
1512 !picture_usage->use_hue &&
1513 !picture_usage->use_whiteness &&
1514 !channel_picker->get_controls()))
1516 add_subwindow(new BC_Title(x, y, "Device has no picture controls."));
1520 // Only used for Video4Linux 1
1521 if(picture_usage && picture_usage->use_brightness)
1523 add_subwindow(new BC_Title(x, y + 10, _("Brightness:")));
1524 add_subwindow(new ChannelEditBright(x1, y, channel_picker, channel_picker->get_brightness()));
1530 if(picture_usage && picture_usage->use_contrast)
1532 add_subwindow(new BC_Title(x, y + 10, _("Contrast:")));
1533 add_subwindow(new ChannelEditContrast(x1, y, channel_picker, channel_picker->get_contrast()));
1538 if(picture_usage && picture_usage->use_color)
1540 add_subwindow(new BC_Title(x, y + 10, _("Color:")));
1541 add_subwindow(new ChannelEditColor(x1, y, channel_picker, channel_picker->get_color()));
1546 if(picture_usage && picture_usage->use_hue)
1548 add_subwindow(new BC_Title(x, y + 10, _("Hue:")));
1549 add_subwindow(new ChannelEditHue(x1, y, channel_picker, channel_picker->get_hue()));
1554 if(picture_usage && picture_usage->use_whiteness)
1556 add_subwindow(new BC_Title(x, y + 10, _("Whiteness:")));
1557 add_subwindow(new ChannelEditWhiteness(x1, y, channel_picker, channel_picker->get_whiteness()));
1562 for(int i = 0; i < channel_picker->get_controls(); i++)
1565 add_subwindow(title = new BC_Title(x,
1567 _(channel_picker->get_control(i)->name)));
1570 if(x3 < title->get_x() + title->get_w() + widget_border)
1571 x3 = title->get_x() + title->get_w() + widget_border;
1573 add_subwindow(new ChannelEditCommon(x3,
1576 channel_picker->get_control(i)));
1583 add_subwindow(new BC_OKButton(this));
1587 int ChannelEditPictureWindow::translation_event()
1589 channel_picker->mwindow->session->picture_x = get_x();
1590 channel_picker->mwindow->session->picture_y = get_y();
1596 ChannelEditBright::ChannelEditBright(int x, int y, ChannelPicker *channel_picker, int value)
1603 this->channel_picker = channel_picker;
1605 ChannelEditBright::~ChannelEditBright() {}
1606 int ChannelEditBright::handle_event()
1610 int ChannelEditBright::button_release_event()
1612 if(BC_Pot::button_release_event())
1614 channel_picker->set_brightness(get_value());
1620 ChannelEditContrast::ChannelEditContrast(int x, int y, ChannelPicker *channel_picker, int value)
1627 this->channel_picker = channel_picker;
1629 ChannelEditContrast::~ChannelEditContrast() {}
1630 int ChannelEditContrast::handle_event()
1634 int ChannelEditContrast::button_release_event()
1636 if(BC_Pot::button_release_event())
1638 channel_picker->set_contrast(get_value());
1645 ChannelEditColor::ChannelEditColor(int x, int y, ChannelPicker *channel_picker, int value)
1652 this->channel_picker = channel_picker;
1654 ChannelEditColor::~ChannelEditColor() {}
1655 int ChannelEditColor::handle_event()
1659 int ChannelEditColor::button_release_event()
1661 if(BC_Pot::button_release_event())
1663 channel_picker->set_color(get_value());
1669 ChannelEditHue::ChannelEditHue(int x, int y, ChannelPicker *channel_picker, int value)
1676 this->channel_picker = channel_picker;
1678 ChannelEditHue::~ChannelEditHue() {}
1679 int ChannelEditHue::handle_event()
1683 int ChannelEditHue::button_release_event()
1685 if(BC_Pot::button_release_event())
1687 channel_picker->set_hue(get_value());
1693 ChannelEditWhiteness::ChannelEditWhiteness(int x, int y, ChannelPicker *channel_picker, int value)
1700 this->channel_picker = channel_picker;
1702 ChannelEditWhiteness::~ChannelEditWhiteness()
1705 int ChannelEditWhiteness::handle_event()
1709 int ChannelEditWhiteness::button_release_event()
1711 if(BC_Pot::button_release_event())
1713 channel_picker->set_whiteness(get_value());
1721 ChannelEditCommon::ChannelEditCommon(int x,
1723 ChannelPicker *channel_picker,
1731 this->channel_picker = channel_picker;
1732 this->device_id = item->device_id;
1735 ChannelEditCommon::~ChannelEditCommon()
1739 int ChannelEditCommon::handle_event()
1744 int ChannelEditCommon::button_release_event()
1746 if(BC_Pot::button_release_event())
1748 channel_picker->set_picture(device_id, get_value());
1754 int ChannelEditCommon::keypress_event()
1756 if(BC_Pot::keypress_event())
1758 channel_picker->set_picture(device_id, get_value());