add haupauge-1657 dual usb capture support, add deinterlace to recordmonitor, asset...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / probeprefs.C
1 #include "bcwindowbase.h"
2 #include "bcdisplayinfo.h"
3 #include "bcdialog.h"
4 #include "language.h"
5 #include "mainerror.h"
6 #include "mwindow.h"
7 #include "probeprefs.h"
8 #include "preferences.h"
9 #include "preferencesthread.h"
10 #include "theme.h"
11
12 #include <sys/wait.h>
13
14 ProbePref::ProbePref(const char *nm, int armed)
15 {
16         strncpy(name, nm, sizeof(name));
17         this->armed = armed;
18 }
19
20 ProbePref::~ProbePref()
21 {
22 }
23
24 FileProbeDialog::FileProbeDialog(PreferencesWindow *pwindow)
25  : BC_DialogThread()
26 {
27         this->pwindow = pwindow;
28 }
29
30 FileProbeDialog::~FileProbeDialog()
31 {
32         close_window();
33 }
34
35 BC_Window* FileProbeDialog::new_gui()
36 {
37         BC_DisplayInfo display_info;
38         int x = display_info.get_abs_cursor_x();
39         int y = display_info.get_abs_cursor_y();
40
41         pb_window = new ProbeEditWindow(this, x, y);
42         pb_window->create_objects();
43         return pb_window;
44 }
45
46 void FileProbeDialog::handle_close_event(int result)
47 {
48         pb_window = 0;
49 }
50
51
52 ProbeEditWindow::ProbeEditWindow(FileProbeDialog *pb_dialog, int x, int y)
53  : BC_Window(_(PROGRAM_NAME ": Probes"), x, y, xS(300), yS(200), xS(300), yS(200), 0, 0, 1)
54 {
55         this->pb_dialog = pb_dialog;
56         probe_list = 0;
57         probe_up_button = 0;
58         probe_down_button = 0;
59         probe_enabled = 0;
60         pb_enabled = 0;
61         pb_disabled = 0;
62 }
63
64 ProbeEditWindow::~ProbeEditWindow()
65 {
66         delete pb_enabled;
67         delete pb_disabled;
68 }
69
70 void ProbeEditWindow::create_objects()
71 {
72         int xs10 = xS(10), ys10 = yS(10);
73         lock_window("ProbeEditWindow::create_objects");
74         pb_enabled = new BC_Pixmap(this,
75                 BC_WindowBase::get_resources()->listbox_up,
76                 PIXMAP_ALPHA);
77         pb_disabled = new BC_Pixmap(this,
78                 BC_WindowBase::get_resources()->listbox_dn,
79                 PIXMAP_ALPHA);
80         Preferences *preferences = pb_dialog->pwindow->thread->preferences;
81         for( int i=0; i<preferences->file_probes.size(); ++i ) {
82                 probe_items.append(new ProbePrefItem(this, preferences->file_probes[i]));
83         }
84         int x = xs10, y = ys10;
85         add_subwindow(probe_list = new ProbePrefList(this, x, y));
86         y += probe_list->get_h();
87         int x1 = x, y1 = y;
88         add_subwindow(probe_up_button = new ProbeUpButton(this, x1, y1));
89         x1 += probe_up_button->get_w() + xs10;
90         add_subwindow(probe_down_button = new ProbeDownButton(this, x1, y1));
91         x1 += probe_down_button->get_w() + xs10;
92         add_subwindow(probe_enabled = new ProbeEnabled(this, x1, y1));
93         probe_enabled->disable();
94
95         add_subwindow(new ProbeEditOK(this));
96         add_subwindow(new BC_CancelButton(this));
97
98         list_update();
99         show_window();
100         unlock_window();
101 }
102
103 ProbeEditOK::ProbeEditOK(ProbeEditWindow *pb_window)
104  : BC_OKButton(pb_window)
105 {
106         this->pb_window = pb_window;
107 }
108
109 ProbeEditOK::~ProbeEditOK()
110 {
111 }
112
113 int ProbeEditOK::handle_event()
114 {
115         Preferences *preferences = pb_window->pb_dialog->pwindow->thread->preferences;
116         ArrayList<ProbePref *> &file_probes = preferences->file_probes;
117         file_probes.remove_all_objects();
118         ArrayList<ProbePrefItem *> &probe_items = pb_window->probe_items;
119         for( int i=0; i<probe_items.size(); ++i ) {
120                 ProbePrefItem *item = probe_items[i];
121                 file_probes.append(new ProbePref(item->get_text(), item->armed));
122         }
123         return BC_OKButton::handle_event();
124 }
125
126 int ProbeEditWindow::list_update()
127 {
128 //for( int i=0; i<probe_items.size(); ++i ) printf("%s, ",probe_items[i]->get_text()); printf("\n");
129         probe_list->update((ArrayList<BC_ListBoxItem*> *)&probe_items, 0, 0, 1,
130                 probe_list->get_xposition(), probe_list->get_yposition(),
131                 probe_list->get_highlighted_item(), 1, 0);
132         probe_list->center_selection();
133         return 1;
134 }
135
136 ProbeUpButton::ProbeUpButton(ProbeEditWindow *pb_window, int x, int y)
137  : BC_GenericButton(x, y, _("Up"))
138 {
139         this->pb_window = pb_window;
140 }
141
142 ProbeUpButton::~ProbeUpButton()
143 {
144 }
145
146 int ProbeUpButton::handle_event()
147 {
148         ArrayList<ProbePrefItem *> &probe_items = pb_window->probe_items;
149         int n = probe_items.size();
150         if( n > 1 ) {
151                 ProbePrefItem **pitem = &probe_items[0], *item0 = *pitem;
152                 for( int i=1; i<n; ++i ) {
153                         ProbePrefItem *&item = probe_items[i];
154                         if( item->get_selected() ) {
155                                 ProbePrefItem *t = item;  item = *pitem; *pitem = t;
156                         }
157                         pitem = &item;
158                 }
159                 if( item0->get_selected() ) {
160                         ProbePrefItem *t = *pitem;  *pitem = item0;  probe_items[0] = t;
161                 }
162         }
163         pb_window->list_update();
164         return 1;
165 }
166
167 ProbeDownButton::ProbeDownButton(ProbeEditWindow *pb_window, int x, int y)
168  : BC_GenericButton(x, y, _("Down"))
169 {
170         this->pb_window = pb_window;
171 }
172
173 ProbeDownButton::~ProbeDownButton()
174 {
175 }
176
177 ProbeEnabled::ProbeEnabled(ProbeEditWindow *pb_window, int x, int y)
178  : BC_CheckBox(x, y, 0, _("Enabled"))
179 {
180         this->pb_window = pb_window;
181 }
182 ProbeEnabled::~ProbeEnabled()
183 {
184 }
185
186 int ProbeEnabled::handle_event()
187 {
188         ProbePrefItem *item = (ProbePrefItem *)pb_window->probe_list->get_selection(0,0);
189         if( item ) {
190                 item->set_armed(get_value());
191                 pb_window->list_update();
192         }
193         return 1;
194 }
195
196 int ProbeDownButton::handle_event()
197 {
198         ArrayList<ProbePrefItem *> &probe_items = pb_window->probe_items;
199         int n = probe_items.size();
200         if( n > 1 ) {
201                 ProbePrefItem **pitem = &probe_items[n-1], *item1 = *pitem;
202                 for( int i=n-1; --i>=0; ) {
203                         ProbePrefItem *&item = probe_items[i];
204                         if( item->get_selected() ) {
205                                 ProbePrefItem *t = item;  item = *pitem; *pitem = t;
206                         }
207                         pitem = &item;
208                 }
209                 if( item1->get_selected() ) {
210                         ProbePrefItem *t = *pitem;  *pitem = item1;  probe_items[n-1] = t;
211                 }
212         }
213         pb_window->list_update();
214         return 1;
215 }
216
217 ProbePrefItem::ProbePrefItem(ProbeEditWindow *pb_window, ProbePref *pref)
218  : BC_ListBoxItem(pref->name, pref->armed ?
219                 pb_window->pb_enabled : pb_window->pb_disabled)
220 {
221         this->pb_window = pb_window;
222         this->armed = pref->armed;
223 }
224
225 ProbePrefItem::~ProbePrefItem()
226 {
227 }
228
229 void ProbePrefItem::set_armed(int armed)
230 {
231         this->armed = armed;
232         set_icon(armed ? pb_window->pb_enabled : pb_window->pb_disabled);
233 }
234
235 ProbePrefList::ProbePrefList(ProbeEditWindow *pb_window, int x, int y)
236  : BC_ListBox(x, y, pb_window->get_w()-x-xS(10), pb_window->get_h()-y-yS(80),
237         LISTBOX_ICON_LIST, (ArrayList<BC_ListBoxItem *>*) &pb_window->probe_items,
238         0, 0)
239 {
240         this->pb_window = pb_window;
241 }
242
243 ProbePrefList::~ProbePrefList()
244 {
245 }
246
247 int ProbePrefList::selection_changed()
248 {
249         ProbePrefItem *item = (ProbePrefItem *)pb_window->probe_list->get_selection(0,0);
250         if( item ) {
251                 pb_window->probe_enabled->set_value(item->armed);
252                 pb_window->probe_enabled->enable();
253         }
254         else {
255                 pb_window->probe_enabled->set_value(0);
256                 pb_window->probe_enabled->disable();
257         }
258         pb_window->list_update();
259         return 1;
260 }
261
262 int ProbePrefList::handle_event()
263 {
264         if( get_double_click() && get_buttonpress() == 1 ) {
265                 ProbePrefItem *item = (ProbePrefItem *)get_selection(0,0);
266                 int armed = item->armed ? 0 : 1;
267                 pb_window->probe_enabled->enable();
268                 pb_window->probe_enabled->set_value(armed);
269                 item->set_armed(armed);
270                 pb_window->list_update();
271         }
272         return 1;
273 }
274