--- /dev/null
+
+/*
+ * CINELERRA
+ * Copyright (C) 2011 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "batch.h"
+#include "bcsignals.h"
+#include "channel.h"
+#include "channeldb.h"
+#include "channeledit.h"
+#include "channelpicker.h"
+#include "chantables.h"
+#include "clip.h"
+#include "edl.h"
+#include "edlsession.h"
+#include "keys.h"
+#include "language.h"
+#include "mwindow.h"
+#include "picture.h"
+#include "playbackconfig.h"
+#include "preferencesthread.h"
+#include "record.h"
+#include "recordgui.h"
+#include "recordmonitor.h"
+#include "theme.h"
+#include "vdevicebuz.h"
+#include "vdeviceprefs.h"
+#include "videodevice.h"
+
+RecordChannelPicker::RecordChannelPicker(MWindow *mwindow,
+ Record *record,
+ RecordMonitor *record_monitor,
+ BC_WindowBase *parent_window,
+ ChannelDB *channeldb,
+ int x,
+ int y)
+ : ChannelPicker(mwindow,
+ channeldb,
+ x,
+ y,
+ parent_window)
+{
+ this->record = record;
+ this->record_monitor = record_monitor;
+}
+
+RecordChannelPicker::~RecordChannelPicker()
+{
+}
+
+int RecordChannelPicker::use_select()
+{
+ return 1;
+}
+
+Channel* RecordChannelPicker::get_master_channel()
+{
+ return record->master_channel;
+}
+
+void RecordChannelPicker::handle_channel_edit(int result)
+{
+ if(!result)
+ {
+ record->record_gui->lock_window("RecordChannelPicker::handle_channel_edit 1");
+ record->record_gui->update_batch_sources();
+ record->set_channel(get_master_channel());
+ record->record_gui->unlock_window();
+ record->save_defaults();
+ VideoDevice::save_channeldb(record->channeldb,
+ mwindow->edl->session->vconfig_in);
+ }
+ else
+ {
+ record->record_gui->lock_window("RecordChannelPicker::handle_channel_edit 2");
+ record->set_channel(record->get_current_channel());
+ record->record_gui->unlock_window();
+ }
+
+ mwindow->save_defaults();
+}
+
+void RecordChannelPicker::load_scan_defaults(Channel *scan_params)
+{
+ scan_params->load_defaults(mwindow->defaults);
+}
+
+void RecordChannelPicker::save_scan_defaults(Channel *scan_params)
+{
+ scan_params->save_defaults(mwindow->defaults);
+}
+
+BC_Theme* RecordChannelPicker::get_theme()
+{
+ return mwindow->theme;
+}
+
+
+Channel* RecordChannelPicker::get_current_channel()
+{
+ return record->get_current_channel();
+}
+
+Channel *RecordChannelPicker::get_editing_channel()
+{
+ return record->get_editing_channel();
+}
+
+ArrayList<Channel*>* RecordChannelPicker::get_video_inputs()
+{
+ return record->get_video_inputs();
+}
+
+Channel* RecordChannelPicker::get_channel_usage()
+{
+ return record->master_channel;
+}
+
+void RecordChannelPicker::set_channel_number(int number)
+{
+ if( number < 0 || number >= channeldb->size() ) return;
+ Channel *channel = channeldb->get(number);
+ if( channel ) record->set_channel(channel);
+}
+
+void RecordChannelPicker::set_brightness(int value)
+{
+ if(record)
+ {
+ record->picture->brightness = value;
+ record->set_video_picture();
+ }
+}
+
+void RecordChannelPicker::set_hue(int value)
+{
+ if(record)
+ {
+ record->picture->hue = value;
+ record->set_video_picture();
+ }
+}
+
+void RecordChannelPicker::set_color(int value)
+{
+ if(record)
+ {
+ record->picture->color = value;
+ record->set_video_picture();
+ }
+}
+
+void RecordChannelPicker::set_contrast(int value)
+{
+ if(record)
+ {
+ record->picture->contrast = value;
+ record->set_video_picture();
+ }
+}
+
+void RecordChannelPicker::set_whiteness(int value)
+{
+ if(record)
+ {
+ record->picture->whiteness = value;
+ record->set_video_picture();
+ }
+}
+
+int RecordChannelPicker::set_picture(int device_id, int value)
+{
+ if(record)
+ {
+ if(record->picture->set_item(device_id, value))
+ record->set_video_picture();
+ }
+ return 0;
+}
+
+
+int RecordChannelPicker::get_brightness()
+{
+ if(record) return record->picture->brightness;
+ return 0;
+}
+
+int RecordChannelPicker::get_hue()
+{
+ if(record) return record->picture->hue;
+ return 0;
+}
+
+int RecordChannelPicker::get_color()
+{
+ if(record) return record->picture->color;
+ return 0;
+}
+
+int RecordChannelPicker::get_contrast()
+{
+ if(record) return record->picture->contrast;
+ return 0;
+}
+
+int RecordChannelPicker::get_whiteness()
+{
+ if(record) return record->picture->whiteness;
+ return 0;
+}
+
+int RecordChannelPicker::get_controls()
+{
+ if(record) return record->picture->controls.total;
+ return 0;
+}
+
+PictureItem* RecordChannelPicker::get_control(int i)
+{
+ if(record) return record->picture->controls.values[i];
+ return 0;
+}
+
+PictureConfig* RecordChannelPicker::get_picture_usage()
+{
+ if(record) return record->picture;
+ return 0;
+}
+
+
+
+void RecordChannelPicker::set_channel(Channel *channel)
+{
+ record->set_channel(channel);
+}
+
+int RecordChannelPicker::has_signal()
+{
+ return record->has_signal();
+}
+
+int RecordChannelPicker::create_channeldb(ArrayList<Channel*> *channeldb)
+{
+ return record->create_channeldb(channeldb);
+}
+
+
+
+
+
+
+
+
+
+PrefsChannelPicker::PrefsChannelPicker(MWindow *mwindow,
+ VDevicePrefs *prefs,
+ ChannelDB *channeldb,
+ int x,
+ int y)
+ : ChannelPicker(mwindow,
+ channeldb,
+ x,
+ y,
+ prefs->dialog)
+{
+// printf("PrefsChannelPicker::PrefsChannelPicker 1\n");
+ this->prefs = prefs;
+
+#ifdef HAVE_VIDEO4LINUX
+ VDeviceBUZ::get_inputs(&input_sources);
+#endif
+
+}
+
+PrefsChannelPicker::~PrefsChannelPicker()
+{
+ input_sources.remove_all_objects();
+}
+
+void PrefsChannelPicker::load_scan_defaults(Channel *scan_params)
+{
+ scan_params->load_defaults(mwindow->defaults);
+}
+
+void PrefsChannelPicker::save_scan_defaults(Channel *scan_params)
+{
+ scan_params->save_defaults(mwindow->defaults);
+}
+
+void PrefsChannelPicker::handle_channel_edit(int result)
+{
+ mwindow->save_defaults();
+}
+
+BC_Theme* PrefsChannelPicker::get_theme()
+{
+ return mwindow->theme;
+}
+
+
+ArrayList<Channel*>* PrefsChannelPicker::get_video_inputs()
+{
+ return &input_sources;
+}
+
+Channel* PrefsChannelPicker::get_channel_usage()
+{
+ return 0;
+}
+
+
+void PrefsChannelPicker::set_channel(Channel *channel)
+{
+ if(channel)
+ channel_text->update(channel->title);
+}
+
+Channel *PrefsChannelPicker::get_current_channel()
+{
+ int number = prefs->out_config->buz_out_channel;
+ return channeldb->get(number);
+}
+
+void PrefsChannelPicker::set_channel_number(int number)
+{
+ CLAMP(number, 0, channeldb->size() - 1);
+ prefs->out_config->buz_out_channel = number;
+ set_channel(get_current_channel());
+}
+
+int PrefsChannelPicker::has_signal()
+{
+ return 0;
+}
+
+void PrefsChannelPicker::set_brightness(int value)
+{
+ prefs->out_config->brightness = value;
+}
+
+void PrefsChannelPicker::set_hue(int value)
+{
+ prefs->out_config->hue = value;
+}
+
+void PrefsChannelPicker::set_color(int value)
+{
+ prefs->out_config->color = value;
+}
+
+void PrefsChannelPicker::set_contrast(int value)
+{
+ prefs->out_config->contrast = value;
+}
+
+void PrefsChannelPicker::set_whiteness(int value)
+{
+ prefs->out_config->whiteness = value;
+}
+
+int PrefsChannelPicker::get_brightness()
+{
+ return prefs->out_config->brightness;
+}
+
+int PrefsChannelPicker::get_hue()
+{
+ return prefs->out_config->hue;
+}
+
+int PrefsChannelPicker::get_color()
+{
+ return prefs->out_config->color;
+}
+
+int PrefsChannelPicker::get_contrast()
+{
+ return prefs->out_config->contrast;
+}
+
+int PrefsChannelPicker::get_whiteness()
+{
+ return prefs->out_config->whiteness;
+}
+
+
+
+
+
+
+ChannelPicker::ChannelPicker(MWindow *mwindow,
+ ChannelDB *channeldb,
+ int x,
+ int y,
+ BC_WindowBase *parent_window)
+{
+ this->mwindow = mwindow;
+ this->parent_window = parent_window;
+ this->x = x;
+ this->y = y;
+ this->channeldb = channeldb;
+ channel_text = 0;
+ channel_select = 0;
+ channel_button = 0;
+ update_channel_list();
+}
+
+ChannelPicker::~ChannelPicker()
+{
+ delete channel_text;
+ delete channel_select;
+ delete channel_button;
+ channel_listitems.remove_all_objects();
+}
+
+void ChannelPicker::update_channel_list()
+{
+ channel_listitems.remove_all_objects();
+ for(int i = 0; i < channeldb->size(); i++)
+ {
+ channel_listitems.append(new BC_ListBoxItem(channeldb->get(i)->title));
+ }
+
+ if(channel_text)
+ channel_text->update_list(&channel_listitems);
+}
+
+int ChannelPicker::get_w()
+{
+ return channel_text->get_w() +
+ channel_select->get_w() +
+ channel_button->get_w() +
+ picture_button->get_w() +
+ ((Theme*)get_theme())->widget_border * 4;
+}
+
+
+
+
+
+
+BC_WindowBase* ChannelPicker::get_subwindow()
+{
+ return parent_window;
+ return 0;
+}
+
+
+
+
+
+
+
+void ChannelPicker::create_objects()
+{
+ channel_text = 0;
+ update_channel_list();
+
+
+ channel_text = new ChannelText(this, x, y);
+ channel_text->create_objects();
+
+
+ x += channel_text->get_w() + ((Theme*)get_theme())->widget_border;
+ get_subwindow()->add_subwindow(channel_select = new ChannelTumbler(this,
+ x,
+ y));
+
+
+ x += channel_select->get_w() + ((Theme*)get_theme())->widget_border;
+ get_subwindow()->add_subwindow(channel_button = new ChannelButton(this,
+ x,
+ y - 1));
+
+//PRINT_TRACE
+ x += channel_button->get_w() + ((Theme*)get_theme())->widget_border;
+ get_subwindow()->add_subwindow(picture_button = new PictureButton(this,
+ x,
+ y - 1));
+//PRINT_TRACE
+
+}
+
+int ChannelPicker::reposition()
+{
+ channel_text->reposition_window(channel_text->get_x(),
+ channel_text->get_y());
+ channel_select->reposition_window(channel_select->get_x(),
+ channel_select->get_y());
+ channel_button->reposition_window(channel_button->get_x(),
+ channel_button->get_y());
+ return 0;
+}
+
+void ChannelPicker::close_threads()
+{
+ channel_button->thread->close_threads();
+}
+
+const char* ChannelPicker::get_source_name(Channel *channel)
+{
+ if(channel->entry < chanlists[channel->freqtable].count)
+ return chanlists[channel->freqtable].list[channel->entry].name;
+ else
+ return chanlists[channel->freqtable].list[0].name;
+}
+
+const char* ChannelPicker::current_channel_name()
+{
+ if(get_current_channel())
+ return get_current_channel()->title;
+ return _("Channel");
+}
+
+int ChannelPicker::channel_down()
+{
+ Channel *channel = get_current_channel();
+ if( !channel ) return 1;
+ int number = channeldb->number_of(channel);
+ if( number < 0 ) return 1;
+ if( --number < 0 ) number = 0;
+ set_channel_number(number);
+ return 0;
+}
+
+int ChannelPicker::channel_up()
+{
+ Channel *channel = get_current_channel();
+ if( !channel ) return 1;
+ int number = channeldb->number_of(channel);
+ if( number < 0 ) return 1;
+ if( ++number >= channeldb->size() ) number = channeldb->size()-1;
+ set_channel_number(number);
+ return 0;
+}
+
+
+
+
+
+PictureButton::PictureButton(ChannelPicker *channel_picker, int x, int y)
+ : BC_Button(x,
+ y,
+ channel_picker->get_theme() ?
+ channel_picker->get_theme()->get_image_set("picture") :
+ 0)
+{
+ this->channel_picker = channel_picker;
+ thread = new ChannelEditPictureThread(channel_picker);
+ set_tooltip(_("Edit picture"));
+}
+
+PictureButton::~PictureButton()
+{
+//printf("PictureButton::PictureButton %d\n", __LINE__);
+ delete thread;
+//printf("PictureButton::PictureButton %d\n", __LINE__);
+}
+
+int PictureButton::handle_event()
+{
+ unlock_window();
+ thread->edit_picture();
+ lock_window("PictureButton::handle_event");
+ return 1;
+}
+
+
+
+
+ChannelButton::ChannelButton(ChannelPicker *channel_picker, int x, int y)
+ : BC_Button(x, y, channel_picker->get_theme() ?
+ channel_picker->get_theme()->get_image_set("channel") :
+ 0)
+{
+ this->channel_picker = channel_picker;
+ thread = new ChannelEditThread(channel_picker,
+ channel_picker->channeldb);
+ set_tooltip(_("Edit channels"));
+}
+
+ChannelButton::~ChannelButton()
+{
+ delete thread;
+}
+
+int ChannelButton::handle_event()
+{
+ thread->start();
+ return 1;
+}
+
+
+ChannelText::ChannelText(ChannelPicker *channel_picker, int x, int y)
+ : BC_PopupTextBox(channel_picker->get_subwindow(),
+ &channel_picker->channel_listitems,
+ channel_picker->current_channel_name(),
+ x, y, 200, 300)
+{
+
+ this->channel_picker = channel_picker;
+}
+
+ChannelText::~ChannelText()
+{
+}
+
+int ChannelText::handle_event()
+{
+ channel_picker->set_channel_number(get_number());
+ return 0;
+}
+
+
+
+
+ChannelList::ChannelList(ChannelPicker *channel_picker, int x, int y)
+ : BC_ListBox(x, y, 100, 200,
+ LISTBOX_TEXT, // Display text list or icons
+ &channel_picker->channel_listitems, // Each column has an ArrayList of BC_ListBoxItems.
+ 0, // Titles for columns. Set to 0 for no titles
+ 0, // width of each column
+ 1, // Total columns.
+ 0, // Pixel of top of window.
+ 1) // If this listbox is a popup window
+{
+ this->channel_picker = channel_picker;
+}
+
+ChannelList::~ChannelList()
+{
+}
+
+int ChannelList::handle_event()
+{
+ return 0;
+}
+
+
+
+ChannelTumbler::ChannelTumbler(ChannelPicker *channel_picker,
+ int x,
+ int y)
+ : BC_Tumbler(x, y)
+{
+ this->channel_picker = channel_picker;
+}
+ChannelTumbler::~ChannelTumbler()
+{
+}
+int ChannelTumbler::handle_up_event()
+{
+ channel_picker->channel_up();
+ return 1;
+}
+int ChannelTumbler::handle_down_event()
+{
+ channel_picker->channel_down();
+ return 1;
+}
+int ChannelTumbler::keypress_event()
+{
+ if(get_keypress() == PGUP)
+ {
+ handle_up_event();
+ return 1;
+ }
+ else
+ if(get_keypress() == PGDN)
+ {
+ handle_down_event();
+ return 1;
+ }
+ else
+ return 0;
+}
+
+