add x10tv ati remote rework, android remote rework, wintv remote tweaks
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / zwindow.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2012 Adam Williams <broadcast at earthling dot net>
5  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #include "bcdialog.h"
23 #include "edl.h"
24 #include "filexml.h"
25 #include "language.h"
26 #include "mainsession.h"
27 #include "mwindow.h"
28 #include "mwindowgui.h"
29 #include "patchbay.h"
30 #include "patchgui.h"
31 #include "playbackengine.h"
32 #include "renderengine.h"
33 #include "timelinepane.h"
34 #include "track.h"
35 #include "tracks.h"
36 #include "transportque.h"
37 #include "zwindow.h"
38 #include "zwindowgui.h"
39
40 Mixers::Mixers()
41 {
42 }
43
44 Mixers::~Mixers()
45 {
46         remove_all_objects();
47 }
48
49 Mixer *Mixers::new_mixer()
50 {
51         int idx = 0;
52         for( int i=0; i<size(); ++i ) {
53                 Mixer *mixer = get(i);
54                 if( idx < mixer->idx ) idx = mixer->idx;
55         }
56         return append(new Mixer(idx+1));
57 }
58
59 Mixer *Mixers::get_mixer(int idx)
60 {
61         for( int i=0; i<size(); ++i ) {
62                 Mixer *mixer = get(i);
63                 if( mixer->idx == idx ) return mixer;
64         }
65         return 0;
66 }
67
68 void Mixers::del_mixer(int idx)
69 {
70         Mixer *mixer = get_mixer(idx);
71         if( mixer ) remove_object(mixer);
72 }
73
74 void Mixer::set_title(const char *tp)
75 {
76         if( tp == title ) return;
77         strncpy(title, !tp ? "" : tp, sizeof(title));
78         title[sizeof(title)-1] = 0;
79 }
80
81 void Mixers::save(FileXML *file)
82 {
83         file->tag.set_title("MIXERS");
84         file->append_tag();
85         file->append_newline();
86         for( int i=0; i<size(); ++i ) {
87                 Mixer *mixer = get(i);
88                 mixer->save(file);
89         }
90         file->tag.set_title("/MIXERS");
91         file->append_tag();
92         file->append_newline();
93 }
94
95 int Mixers::load(FileXML *file)
96 {
97         int result = 0;
98         while( !(result = file->read_tag()) ) {
99                 if( file->tag.title_is("/MIXERS") ) break;
100                 if( file->tag.title_is("MIXER") ) {
101                         Mixer *mixer = new_mixer();
102                         file->tag.get_property("TITLE", mixer->title);
103                         mixer->x = file->tag.get_property("X", mixer->x);
104                         mixer->y = file->tag.get_property("Y", mixer->y);
105                         mixer->w = file->tag.get_property("W", mixer->w);
106                         mixer->h = file->tag.get_property("H", mixer->h);
107                         mixer->load(file);
108                 }
109         }
110         return 0;
111 }
112
113 void Mixers::copy_from(Mixers &that)
114 {
115         remove_all_objects();
116         for( int i=0; i<that.size(); ++i ) {
117                 Mixer *mixer = new_mixer();
118                 mixer->copy_from(*that[i]);
119         }
120 }
121
122 void Mixer::save(FileXML *file)
123 {
124         file->tag.set_title("MIXER");
125         file->tag.set_property("TITLE",title);
126         file->tag.set_property("X",x);
127         file->tag.set_property("Y",y);
128         file->tag.set_property("W",w);
129         file->tag.set_property("H",h);
130         file->append_tag();
131         file->append_newline();
132         for( int i=0; i<mixer_ids.size(); ++i ) {
133                 file->tag.set_title("MIX");
134                 file->tag.set_property("ID", mixer_ids[i]);
135                 file->append_tag();
136                 file->tag.set_title("/MIX");
137                 file->append_tag();
138                 file->append_newline();
139         }
140         file->tag.set_title("/MIXER");
141         file->append_tag();
142         file->append_newline();
143 }
144
145 Mixer::Mixer(int idx)
146 {
147         this->idx = idx;
148         title[0] = 0;
149         x = y = 100 + idx*64;
150         w = 400;  h = 300;
151 }
152 void Mixer::reposition(int x, int y, int w, int h)
153 {
154         this->x = x;  this->y = y;
155         this->w = w;  this->h = h;
156 }
157
158 int Mixer::load(FileXML *file)
159 {
160         int result = 0;
161         while( !(result = file->read_tag()) ) {
162                 if( file->tag.title_is("/MIXER") ) break;
163                 if( file->tag.title_is("MIX") ) {
164                         mixer_ids.append(file->tag.get_property("ID", 0));
165                 }
166         }
167         return 0;
168 }
169
170 void Mixer::copy_from(Mixer &that)
171 {
172         mixer_ids.remove_all();
173         strncpy(title, that.title, sizeof(title));
174         title[sizeof(title)-1] = 0;
175         x = that.x;  y = that.y;
176         w = that.w;  h = that.h;
177         for( int i=0; i<that.mixer_ids.size(); ++i )
178                 mixer_ids.append(that.mixer_ids[i]);
179 }
180
181
182 ZWindow::ZWindow(MWindow *mwindow)
183  : BC_DialogThread()
184 {
185         this->mwindow = mwindow;
186         idx = -1;
187         edl = 0;
188         highlighted = 0;
189         title[0] = 0;
190         zgui = 0;
191 }
192
193 ZWindow::~ZWindow()
194 {
195         close_window();
196         if( edl )
197                 edl->remove_user();
198 }
199
200 BC_Window* ZWindow::new_gui()
201 {
202         Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
203         zgui = new ZWindowGUI(mwindow, this, mixer);
204         zgui->create_objects();
205         return zgui;
206 }
207
208 void ZWindow::handle_done_event(int result)
209 {
210         stop_playback(1);
211         if( result )
212                 mwindow->del_mixer(this);
213         idx = -1;
214 }
215 void ZWindow::handle_close_event(int result)
216 {
217         zgui = 0;
218 }
219
220 void ZWindow::change_source(EDL *edl)
221 {
222         if( this->edl == edl ) return;
223         zgui->playback_engine->refresh_frame(CHANGE_ALL, edl);
224         if( this->edl )
225                 this->edl->remove_user();
226         this->edl = edl;
227 }
228
229 void ZWindow::stop_playback(int wait)
230 {
231         zgui->playback_engine->stop_playback(wait);
232 }
233
234 void ZWindow::handle_mixer(int command, int wait_tracking,
235                 int use_inout, int toggle_audio, int loop_play, float speed)
236 {
237         PlaybackEngine *engine = zgui->playback_engine;
238         engine->next_command->toggle_audio = toggle_audio;
239         engine->next_command->loop_play = loop_play;
240         engine->next_command->speed = speed;
241         engine->send_command(command, edl, wait_tracking, use_inout);
242 }
243
244 void ZWindow::update_mixer_ids()
245 {
246         if( !running() ) return;
247         Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
248         if( !mixer ) return;
249         mixer->mixer_ids.remove_all();
250         PatchBay *patchbay = mwindow->gui->pane[0]->patchbay;
251         for( int i=0; i<patchbay->patches.size(); ++i ) {
252                 PatchGUI *patchgui = patchbay->patches[i];
253                 if( !patchgui->mixer ) continue;
254                 int mixer_id = patchgui->track->get_mixer_id();
255                 if( mixer->mixer_ids.number_of(mixer_id) >= 0 ) continue;
256                 mixer->mixer_ids.append(mixer_id);
257         }
258 }
259
260 void ZWindow::set_title(const char *tp)
261 {
262         Track *track = 0;
263         Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
264         if( mixer ) {
265                 mixer->set_title(tp);
266                 for( track=mwindow->edl->tracks->first; track; track=track->next ) {
267                         if( track->data_type != TRACK_VIDEO ) continue;
268                         int mixer_id = track->get_mixer_id();
269                         int k = mixer->mixer_ids.size();
270                         while( --k >= 0 && mixer_id != mixer->mixer_ids[k] );
271                         if( k >= 0 ) break;
272                 }
273         }
274         char *cp = title, *ep = cp + sizeof(title)-1;
275         cp += snprintf(title, ep-cp, track ? track->title : _("Mixer %d"), idx);
276         if( tp ) cp += snprintf(cp, ep-cp, ": %s", tp);
277         *cp = 0;
278 }
279
280 void ZWindow::reposition(int x, int y, int w, int h)
281 {
282         Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
283         if( !mixer ) return;
284         mixer->reposition(x, y, w, h);
285 }
286