upgrade to ffmpeg 4.2, rework mask for speedup
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / editlength.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2009 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 "bcdisplayinfo.h"
23 #include "clip.h"
24 #include "edit.h"
25 #include "editlength.h"
26 #include "edits.h"
27 #include "edl.h"
28 #include "edlsession.h"
29 #include "language.h"
30 #include "localsession.h"
31 #include "mwindow.h"
32 #include "mwindowgui.h"
33 #include "track.h"
34 #include "tracks.h"
35
36
37 EditLengthThread::EditLengthThread(MWindow *mwindow)
38  : BC_DialogThread()
39 {
40         this->mwindow = mwindow;
41 }
42
43 EditLengthThread::~EditLengthThread()
44 {
45         close_window();
46 }
47
48 void EditLengthThread::start(Edit *edit)
49 {
50         this->edit = edit;
51
52         orig_length = 0;
53         length = 0;
54
55         double start = mwindow->edl->local_session->get_selectionstart();
56         double end = mwindow->edl->local_session->get_selectionend();
57
58 // get the default length from the first edit selected
59         if(!edit)
60         {
61                 Track *track = 0;
62                 int got_it = 0;
63                 for(track = mwindow->edl->tracks->first;
64                         track && !got_it;
65                         track = track->next)
66                 {
67                         if(track->record)
68                         {
69                                 int64_t start_units = track->to_units(start, 0);
70                                 int64_t end_units = track->to_units(end, 0);
71
72                                 for(edit = track->edits->first;
73                                         edit && !got_it;
74                                         edit = edit->next)
75                                 {
76                                         if(edit->startproject >= start_units &&
77                                                 edit->startproject < end_units)
78                                         {
79                                                 this->length =
80                                                         this->orig_length =
81                                                         track->from_units(edit->length);
82                                                 got_it = 1;
83                                         }
84                                 }
85                         }
86                 }
87         }
88
89         BC_DialogThread::start();
90 }
91
92 BC_Window* EditLengthThread::new_gui()
93 {
94         BC_DisplayInfo display_info;
95         int x = display_info.get_abs_cursor_x() - 150;
96         int y = display_info.get_abs_cursor_y() - 50;
97         EditLengthDialog *gui = new EditLengthDialog(mwindow,
98                 this,
99                 x,
100                 y);
101         gui->create_objects();
102         return gui;
103 }
104
105 void EditLengthThread::handle_close_event(int result)
106 {
107         if(!result)
108         {
109                 if(edit)
110                 {
111 //                      mwindow->set_edit_length(edit, length);
112                 }
113                 else
114                 {
115                         mwindow->set_edit_length(length);
116                 }
117         }
118 }
119
120
121
122
123
124
125
126
127
128 EditLengthDialog::EditLengthDialog(MWindow *mwindow,
129         EditLengthThread *thread,
130         int x,
131         int y)
132  : BC_Window(_(PROGRAM_NAME ": Edit length"),
133         x,
134         y,
135         300,
136         100,
137         -1,
138         -1,
139         0,
140         0,
141         1)
142 {
143         this->mwindow = mwindow;
144         this->thread = thread;
145 }
146
147 EditLengthDialog::~EditLengthDialog()
148 {
149 }
150
151
152 void EditLengthDialog::create_objects()
153 {
154         lock_window("EditLengthDialog::create_objects");
155         add_subwindow(new BC_Title(10, 10, _("Seconds:")));
156         text = new EditLengthText(mwindow, this, 100, 10);
157         text->create_objects();
158         add_subwindow(new BC_OKButton(this));
159         add_subwindow(new BC_CancelButton(this));
160         show_window();
161         unlock_window();
162 }
163
164 int EditLengthDialog::close_event()
165 {
166         set_done(0);
167         return 1;
168 }
169
170
171
172
173
174
175 EditLengthText::EditLengthText(MWindow *mwindow,
176         EditLengthDialog *gui,
177         int x,
178         int y)
179  : BC_TumbleTextBox(gui,
180         (float)gui->thread->length,
181         (float)0,
182         (float)100,
183         x,
184         y,
185         100)
186 {
187         this->mwindow = mwindow;
188         this->gui = gui;
189 }
190
191 int EditLengthText::handle_event()
192 {
193         double result = atof(get_text());
194         if(fabs(result - gui->thread->length) > 0.000001)
195         {
196                 gui->thread->length = result;
197         }
198
199         return 1;
200 }
201
202
203
204
205
206
207
208
209
210