Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / channelinfo.h
diff --git a/cinelerra-5.1/cinelerra/channelinfo.h b/cinelerra-5.1/cinelerra/channelinfo.h
new file mode 100644 (file)
index 0000000..4cafbce
--- /dev/null
@@ -0,0 +1,650 @@
+#ifndef CHANNELINFO_H
+#define CHANNELINFO_H
+
+#include "channel.inc"
+#include "channeldb.h"
+#include "channelinfo.inc"
+#include "devicedvbinput.h"
+#include "guicast.h"
+#include "mwindow.inc"
+#include "record.inc"
+#include "recordbatches.h"
+#include "signalstatus.h"
+#include "videodevice.inc"
+#include "vdevicempeg.inc"
+
+#define LTBLACK 0x001c1c1c
+
+
+class ChanSearch : public Thread
+{
+public:
+       ChannelInfo *iwindow;
+       ChanSearchGUI *gui;
+       Mutex *window_lock;
+
+       void start();
+       void stop();
+       void run();
+
+       ChanSearch(ChannelInfo *iwindow);
+       ~ChanSearch();
+};
+
+class ChanSearchGUI : public BC_Window
+{
+public:
+       ChanSearch *cswindow;
+       ChannelInfo *iwindow;
+       ChannelPanel *panel;
+       ChanSearchText *search_text;
+       ChanSearchTitleText *title_text;
+       ChanSearchInfoText *info_text;
+       ChanSearchMatchCase *match_case;
+       ChanSearchStart *search_start;
+       ChanSearchCancel *cancel;
+       ChanSearchList *search_list;
+       BC_Title *click_tip;
+       BC_Title *results;
+
+       int title_text_enable;
+       int info_text_enable;
+       int match_case_enable;
+       ChannelEvent *highlighted_event;
+       int search_x, search_y, text_x, text_y;
+       int cancel_x, cancel_y, cancel_w, cancel_h;
+       int list_x, list_y, list_w, list_h;
+       int results_x, results_y;
+       int sort_column, sort_order;
+
+       const char *search_column_titles[3];
+       int search_column_widths[3];
+       int search_columns[3];
+       ArrayList<BC_ListBoxItem*> search_items[3];
+       ArrayList<ChannelEvent*> search_results;
+
+       void create_objects();
+       int close_event();
+       int resize_event(int x, int y);
+       void update();
+       int search(const char *);
+       void search();
+       static int cmpr_text_dn(const void *a, const void *b);
+       static int cmpr_Text_dn(const void *a, const void *b);
+       static int cmpr_text_up(const void *a, const void *b);
+       static int cmpr_Text_up(const void *a, const void *b);
+       static int cmpr_time_dn(const void *a, const void *b);
+       static int cmpr_time_up(const void *a, const void *b);
+       static int cmpr_title_dn(const void *a, const void *b);
+       static int cmpr_Title_dn(const void *a, const void *b);
+       static int cmpr_title_up(const void *a, const void *b);
+       static int cmpr_Title_up(const void *a, const void *b);
+       void sort_events(int column, int order);
+       void move_column(int src, int dst);
+
+       ChanSearchGUI(ChanSearch *cswindow);
+       ~ChanSearchGUI();
+};
+
+class ChanSearchTitleText : public BC_CheckBox
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+       void update(int v) { set_value(gui->title_text_enable = v); }
+
+       ChanSearchTitleText(ChanSearchGUI *gui, int x, int y);
+       ~ChanSearchTitleText();
+};
+
+class ChanSearchInfoText : public BC_CheckBox
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+       void update(int v) { set_value(gui->info_text_enable = v); }
+
+       ChanSearchInfoText(ChanSearchGUI *gui, int x, int y);
+       ~ChanSearchInfoText();
+};
+
+class ChanSearchMatchCase : public BC_CheckBox
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+
+       ChanSearchMatchCase(ChanSearchGUI *gui, int x, int y);
+       ~ChanSearchMatchCase();
+};
+
+class ChanSearchText : public BC_TextBox
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+       int keypress_event();
+
+       ChanSearchText(ChanSearchGUI *gui, int x, int y, int w);
+       ~ChanSearchText();
+};
+
+class ChanSearchStart : public BC_GenericButton
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+
+       ChanSearchStart(ChanSearchGUI *gui, int x, int y);
+       ~ChanSearchStart();
+};
+
+class ChanSearchCancel : public BC_CancelButton
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+
+       ChanSearchCancel(ChanSearchGUI *gui, int x, int y);
+       ~ChanSearchCancel();
+};
+
+class ChanSearchList : public BC_ListBox
+{
+public:
+       ChanSearchGUI *gui;
+
+       int handle_event();
+       int sort_order_event();
+       int move_column_event();
+
+       ChanSearchList(ChanSearchGUI *gui, int x, int y, int w, int h);
+       ~ChanSearchList();
+};
+
+
+class ChannelProgress : public Thread, public BC_SubWindow
+{
+       ChannelInfoGUI *gui;
+       BC_Title *eta;
+       BC_ProgressBar *bar;
+       Timer *eta_timer;
+       double length, value;
+       int done;
+public:
+       void create_objects();
+       void run();
+       void start();
+       void stop();
+       int update();
+       void set_value(int v) { value = v; }
+
+       ChannelProgress(ChannelInfoGUI *gui, int x, int y, int w, int h, int len);
+       ~ChannelProgress();
+};
+
+
+
+class ChannelPanel : public BC_SubWindow
+{
+public:
+       ChannelInfoGUI *gui;
+       TimeLine *time_line;
+       ChannelData *channel_data;
+       ChannelFrame *channel_frame;
+       ChannelScroll *channel_scroll;
+       TimeLineScroll *time_line_scroll;
+       ArrayList<TimeLineItem*> time_line_items;
+       ArrayList<ChannelDataItem*> channel_data_items;
+       ArrayList<ChannelEventLine *> channel_line_items;
+       ArrayList<ChannelEvent*> channel_event_items;
+
+       int x0, y0, x1, y1, t0, t1;
+       int iwd, iht;
+       int x_moved, y_moved;
+       int iwindow_w, iwindow_h;
+       int path_w, path_h, hhr_w, x_now;
+       int frame_x, frame_y;
+       int frame_w, frame_h;
+       int x_scroll, y_scroll;
+       struct timeval tv;
+       struct timezone tz;
+       time_t st_org;
+
+       void create_objects();
+       ChannelEventLine *NewChannelLine(int y, int h, int color);
+       ChannelEventLine *NewChannelLine(int y) {
+               return NewChannelLine(y, path_h, LTBLACK);
+       }
+       int separator(int y) {
+               NewChannelLine(y+path_h/8, path_h/4, BLACK);
+               return path_h/2;
+       }
+       void resize(int w, int h);
+       void bounding_box(int ix0, int iy0, int ix1, int iy1);
+       void set_x_scroll(int v);
+       void set_y_scroll(int v);
+       void reposition();
+       void get_xtime(int x, char *text);
+       void time_line_update(int ix0, int ix1);
+       int button_press_event();
+
+       ChannelPanel(ChannelInfoGUI *gui, int x, int y, int w, int h);
+       ~ChannelPanel();
+};
+
+class TimeLineItem : public BC_Title
+{
+public:
+       ChannelPanel *panel;
+       int x0, y0;
+
+       TimeLineItem(ChannelPanel *panel, int x, int y, char *text);
+       ~TimeLineItem();
+};
+
+class TimeLine : public BC_SubWindow
+{
+public:
+       ChannelPanel *panel;
+       int resize_event(int w, int h);
+
+       TimeLine(ChannelPanel *panel);
+       ~TimeLine();
+};
+
+class ChannelDataItem : public BC_Title
+{
+public:
+       ChannelPanel *panel;
+       int x0, y0;
+       const char *tip_info;
+       int in_window, tooltip_done;
+
+       int cursor_enter_event();
+       int cursor_leave_event();
+       int repeat_event(int64_t duration);
+       void set_tooltip(const char *tip);
+
+       ChannelDataItem(ChannelPanel *panel, int x, int y, int w,
+               int color, const char *text);
+       ~ChannelDataItem();
+};
+
+class ChannelData : public BC_SubWindow
+{
+public:
+       ChannelPanel *panel;
+
+       int resize_event(int w, int h);
+
+       ChannelData(ChannelPanel *panel, int x, int y, int w, int h);
+       ~ChannelData();
+};
+
+class ChannelScroll : public BC_ScrollBar
+{
+public:
+       ChannelPanel *panel;
+
+       int handle_event();
+
+       ChannelScroll(ChannelPanel *panel, int x, int y, int h);
+       ~ChannelScroll();
+};
+
+class TimeLineScroll : public BC_ScrollBar
+{
+public:
+       ChannelPanel *panel;
+
+       int handle_event();
+
+       TimeLineScroll(ChannelPanel *panel, int x, int y, int w);
+       ~TimeLineScroll();
+};
+
+
+
+class ChannelEvent : public BC_GenericButton
+{
+public:
+       ChannelEventLine *channel_line;
+       time_t start_time, end_time;
+       Channel *channel;
+       int x0, y0, no;
+       const char *tip_info;
+
+       int handle_event();
+       void set_tooltip(const char *tip);
+
+       ChannelEvent(ChannelEventLine *channel_line, Channel *channel,
+               time_t start_time, time_t end_time, int x, int y, int w,
+               const char *text);
+       ~ChannelEvent();
+};
+
+class ChannelEventLine : public BC_SubWindow
+{
+public:
+       ChannelPanel *panel;
+       int x0, y0;
+
+       void resize(int w, int h);
+
+       ChannelEventLine(ChannelPanel *panel, int x, int y, int w, int h, int color);
+       ~ChannelEventLine();
+};
+
+class ChannelFrame : public BC_SubWindow
+{
+public:
+       ChannelPanel *panel;
+
+       void resize(int w, int h);
+
+       ChannelFrame(ChannelPanel *panel);
+       ~ChannelFrame();
+};
+
+
+
+class ChannelInfoGUI : public BC_Window
+{
+public:
+       ChannelInfo *iwindow;
+       ChanSearch *channel_search;
+       ChannelPanel *panel;
+       ChannelProgress *progress;
+       ChannelStatus *channel_status;
+       ChannelInfoGUIBatches *batch_bay;
+       ChannelDir *channel_dir;
+       ChannelPath *channel_path;
+       ChannelStart *channel_start;
+       ChannelDuration *channel_duration;
+       ChannelSource *channel_source;
+       ChannelClearBatch *channel_clear_batch;
+       ChannelNewBatch *channel_new_batch;
+       ChannelDeleteBatch *channel_delete_batch;
+       TimeEntryTumbler *early_time, *late_time;
+       BC_Title *directory_title;
+       BC_Title *path_title;
+       BC_Title *start_title;
+       BC_Title *duration_title;
+       BC_Title *source_title;
+       BC_OKButton *ok;
+       BC_CancelButton *cancel;
+       ChannelInfoCron *channel_cron;
+       ChannelInfoPowerOff *channel_poweroff;
+       ChannelInfoFind *channel_find;
+       int x0, y0, title_w, data_w, pad;
+       int path_w, path_h, status_w;
+       int panel_w, panel_h, max_bay_w;
+       int bay_x, bay_y, bay_w, bay_h;
+       const char *cron_caption, *power_caption;
+       int cron_x, cron_y, cron_w, cron_h;
+       int power_x, power_y, power_w, power_h;
+       int find_x, find_y, find_h;
+       int ok_x, ok_y, ok_w, ok_h;
+       int cancel_x, cancel_y, cancel_w, cancel_h;
+
+       void create_objects();
+       void stop(int v);
+       int translation_event();
+       int resize_event(int w, int h);
+       int close_event();
+       void update_channel_tools();
+       void incr_event(int start_time_incr, int duration_incr);
+       void update_progress(int n) { progress->set_value(n); }
+
+       ChannelInfoGUI(ChannelInfo *iwindow, int x, int y, int w, int h);
+       ~ChannelInfoGUI();
+};
+
+class ChannelInfoOK : public BC_OKButton
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int button_press_event();
+       int keypress_event();
+
+       ChannelInfoOK(ChannelInfoGUI *gui, int x, int y);
+       ~ChannelInfoOK();
+};
+
+class ChannelInfoCancel : public BC_CancelButton
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int button_press_event();
+
+       ChannelInfoCancel(ChannelInfoGUI *gui, int x, int y);
+       ~ChannelInfoCancel();
+};
+
+class ChannelInfoCron : public BC_CheckBox
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int handle_event();
+       ChannelInfoCron(ChannelInfoGUI *gui, int x, int y, int *value);
+       ~ChannelInfoCron();
+};
+
+class ChannelInfoPowerOff : public BC_CheckBox
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int handle_event();
+
+       ChannelInfoPowerOff(ChannelInfoGUI *gui, int x, int y, int *value);
+       ~ChannelInfoPowerOff();
+};
+
+class ChannelInfoFind : public BC_GenericButton
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int handle_event();
+       ChannelInfoFind(ChannelInfoGUI *gui, int x, int y);
+       ~ChannelInfoFind();
+};
+
+
+class ChannelInfoGUIBatches : public RecordBatchesGUI
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int handle_event();
+       int selection_changed();
+
+       ChannelInfoGUIBatches(ChannelInfoGUI *gui,
+               int x, int y, int w, int h);
+       ~ChannelInfoGUIBatches();
+};
+
+class ChannelDir : public RecordBatchesGUI::Dir
+{
+public:
+       ChannelInfoGUI *gui;
+
+       ChannelDir(ChannelInfoGUI *gui, const char *dir, int x, int y);
+};
+
+class ChannelPath : public RecordBatchesGUI::Path
+{
+public:
+       ChannelInfoGUI *gui;
+
+       ChannelPath(ChannelInfoGUI *gui, int x, int y);
+};
+
+class ChannelStart : public RecordBatchesGUI::StartTime
+{
+public:
+       ChannelInfoGUI *gui;
+
+       ChannelStart(ChannelInfoGUI *gui, int x, int y);
+};
+
+class ChannelDuration : public RecordBatchesGUI::Duration
+{
+public:
+       ChannelInfoGUI *gui;
+
+       ChannelDuration(ChannelInfoGUI *gui, int x, int y, int w);
+};
+
+class ChannelEarlyTime : public TimeEntryTumbler
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int handle_up_event();
+       int handle_down_event();
+
+       ChannelEarlyTime(ChannelInfoGUI *gui, int x, int y,
+               double *output_time);
+};
+
+class ChannelLateTime : public TimeEntryTumbler
+{
+public:
+       ChannelInfoGUI *gui;
+
+       int handle_up_event();
+       int handle_down_event();
+
+       ChannelLateTime(ChannelInfoGUI *gui, int x, int y,
+               double *output_time);
+};
+
+class ChannelSource : public RecordBatchesGUI::Source
+{
+public:
+       ChannelInfoGUI *gui;
+       void create_objects();
+       int handle_event();
+       ChannelSource(ChannelInfoGUI *gui, int x, int y);
+};
+
+
+class ChannelNewBatch : public RecordBatchesGUI::NewBatch
+{
+public:
+       ChannelInfoGUI *gui;
+       int handle_event();
+       ChannelNewBatch(ChannelInfoGUI *gui, int x, int y);
+};
+
+
+class ChannelDeleteBatch : public RecordBatchesGUI::DeleteBatch
+{
+public:
+       ChannelInfoGUI *gui;
+       int handle_event();
+       ChannelDeleteBatch(ChannelInfoGUI *gui, int x, int y);
+};
+
+class ChannelClearBatch : public RecordBatchesGUI::ClearBatch
+{
+public:
+       ChannelInfoGUI *gui;
+       int handle_event();
+       ChannelClearBatch(ChannelInfoGUI *gui, int x, int y);
+};
+
+
+
+class ChannelInfo : public Thread
+{
+public:
+       MWindow *mwindow;
+       Record *record;
+       VideoDevice *vdevice;
+       Mutex *window_lock;
+       Mutex *vdevice_lock;
+       Mutex *progress_lock;
+       DeviceDVBInput *dvb_input;
+       RecordBatches record_batches;
+       ChannelInfoGUI *gui;
+       ChannelThread *thread;
+       ChannelDB *channeldb;
+       Condition *scan_lock;
+       int cron_enable, poweroff_enable;
+       int item;
+       int done, gui_done;
+
+       void run_scan();
+       void toggle_scan();
+       void start();
+       void stop();
+       void run();
+       void close_vdevice();
+       Batch *new_batch();
+       void delete_batch();
+       int current_batch() { return gui->batch_bay->current_batch(); }
+       int editing_batch() { return gui->batch_bay->editing_batch(); }
+       bool is_active() { return gui != 0; }
+
+       ChannelInfo(MWindow *mwindow);
+       ~ChannelInfo();
+};
+
+class ChannelThread : public Thread
+{
+public:
+       ChannelInfo *iwindow;
+       ChannelInfoGUI *gui;
+       ChannelPanel *panel;
+       zmpeg3_t *fd;
+       int done;
+
+       int load_ident(int n, int y, char *ident);
+       int load_info(Channel *channel, ChannelEventLine *channel_line);
+       void start();
+       void stop();
+       void run();
+       int total_channels() { return iwindow->channeldb->size(); }
+       Channel *get_channel(int ch) { return iwindow->channeldb->get(ch); }
+       int set_channel(Channel *chan);
+
+       ChannelThread(ChannelInfoGUI *gui);
+       ~ChannelThread();
+};
+
+class ChannelScan : public BC_MenuItem
+{
+public:
+       MWindow *mwindow;
+       int handle_event();
+
+       ChannelScan(MWindow *mwindow);
+       ~ChannelScan();
+};
+
+class ChannelStatus : public SignalStatus
+{
+public:
+       ChannelInfoGUI *gui;
+
+       ChannelStatus(ChannelInfoGUI *gui, int x, int y) :
+               SignalStatus(gui, x, y) { this->gui = gui; }
+       ~ChannelStatus() {}
+};
+
+
+
+#endif