r602: Fix baver's code... don't insert timecode when show_tc is not set
[cinelerra_cv/mob.git] / cinelerra / mainprogress.C
blobb6dcc1218e119c4ec875a1d144ca679939f9e3a0
1 #include "bcprogressbox.h"
2 #include "language.h"
3 #include "mainprogress.h"
4 #include "mwindow.h"
5 #include "mwindowgui.h"
6 #include "statusbar.h"
7 #include "bctimer.h"
9 #include <string.h>
11 MainProgressBar::MainProgressBar(MWindow *mwindow, MainProgress *mainprogress)
13         progress_box = 0;
14         progress_bar = 0;
15         this->mwindow = mwindow;
16         this->mainprogress = mainprogress;
17         eta_timer = new Timer;
20 MainProgressBar::~MainProgressBar()
22         if(progress_box) delete progress_box;
24         if(mainprogress->mwindow_progress == this)
25         {
26                 mainprogress->mwindow_progress = 0;
27         }
28         else
29         {
30                 mainprogress->progress_bars.remove(this);
31         }
32         delete eta_timer;
35 void MainProgressBar::start()
37         if(progress_box)
38         {
39                 progress_box->start();
40         }
41         eta_timer->update();
42         last_eta = 0;
45 void MainProgressBar::stop_progress()
47         if(progress_box)
48         {
49                 progress_box->stop_progress();
50         }
51         else
52         if(progress_bar)
53         {
54                 progress_bar->update(0);
55                 mwindow->gui->statusbar->default_message();
56         }
59 int MainProgressBar::is_cancelled()
61         if(progress_box)
62         {
63 //printf("MainProgressBar::is_cancelled 1 %d\n", progress_box->is_cancelled());
64                 return progress_box->is_cancelled();
65         }
66         else
67         if(progress_bar)
68         {
69                 return mainprogress->cancelled;
70         }
72         return 0;
75 void MainProgressBar::update_title(char *string, int default_)
77         if(default_) strcpy(default_title, string);
78 //printf("MainProgressBar::update_title %p %p %s\n", progress_bar, progress_box, string);
80         if(progress_box)
81         {
82                 progress_box->lock_window();
83                 progress_box->update_title(string);
84                 progress_box->unlock_window();
85         }
86         else
87         if(progress_bar)
88         {
89                 mwindow->gui->lock_window();
90                 mwindow->gui->show_message(string, BLACK);
91                 mwindow->gui->unlock_window();
92         }
95 void MainProgressBar::update_length(long length)
97         this->length = length;
98 //printf("MainProgressBar::update_length %d\n", length);
99         if(progress_box)
100         {
101                 progress_box->lock_window();
102                 progress_box->update_length(length);
103                 progress_box->unlock_window();
104         }
105         else
106         if(progress_bar)
107         {
108                 mwindow->gui->lock_window();
109                 progress_bar->update_length(length);
110                 mwindow->gui->unlock_window();
111         }
114 int MainProgressBar::update(long value)
116 // Print ETA on title
117         double current_eta = (double)eta_timer->get_scaled_difference(1000);
119 //printf("MainProgressBar::update %f %f %f\n", current_eta, last_eta, current_eta - last_eta);
120         if(current_eta - last_eta > 1000)
121         {
122                 char string[BCTEXTLEN];
123                 char time_string[BCTEXTLEN];
124                 double eta;
126                 if(value > 0.001)
127                         eta = (double)current_eta / 
128                                 1000 * 
129                                 length / 
130                                 value - 
131                                 current_eta / 
132                                 1000;
133                 else
134                         eta = 0;
136 //printf("MainProgressBar::update %f %d %d %f\n", current_eta, length, value, eta);
137                 Units::totext(time_string, 
138                         eta,
139                         TIME_HMS2);
141                 sprintf(string, _("%s ETA: %s"), 
142                         default_title, 
143                         time_string);
144                 update_title(string, 0);
146                 last_eta = (long)current_eta;
147         }
149         if(progress_box)
150         {
151                 progress_box->lock_window();
152                 progress_box->update(value);
153                 progress_box->unlock_window();
154         }
155         else
156         if(progress_bar)
157         {
158                 mwindow->gui->lock_window();
159                 progress_bar->update(value);
160                 mwindow->gui->unlock_window();
161         }
163         return is_cancelled();
166 void MainProgressBar::get_time(char *text)
168         double current_time = (double)eta_timer->get_scaled_difference(1);
169 //printf("MainProgressBar::get_time %f\n", current_time);
170         Units::totext(text, 
171                         current_time,
172                         TIME_HMS2);
175 double MainProgressBar::get_time()
177         return (double)eta_timer->get_scaled_difference(1);
190 MainProgress::MainProgress(MWindow *mwindow, MWindowGUI *gui)
192         this->mwindow = mwindow;
193         this->gui = gui;
194         mwindow_progress = 0;
195         cancelled = 0;
199 MainProgress::~MainProgress()
203 MainProgressBar* MainProgress::start_progress(char *text, long total_length)
205         MainProgressBar *result = 0;
207 // Default to main window
208         if(!mwindow_progress)
209         {
210                 mwindow_progress = new MainProgressBar(mwindow, this);
211                 mwindow_progress->progress_bar = gui->statusbar->main_progress;
212                 mwindow_progress->progress_bar->update_length(total_length);
213                 mwindow_progress->update_title(text);
214                 result = mwindow_progress;
215                 cancelled = 0;
216         }
218         if(!result)
219         {
220                 result = new MainProgressBar(mwindow, this);
221                 progress_bars.append(result);
222                 result->progress_box = new BC_ProgressBox(gui->get_abs_cursor_x(1), 
223                         gui->get_abs_cursor_y(1), 
224                         text, 
225                         total_length);
226         }
228         result->length = total_length;
229         strcpy(result->default_title, text);
230         result->start();
231         return result;
235 void MainProgress::end_progress(MainProgressBar* progress_bar)
237         if(mwindow_progress == progress_bar)
238         {
239                 delete mwindow_progress;
240                 mwindow_progress = 0;
241         }
242         else
243         {
244                 delete progress_bar;
245                 progress_bars.remove(progress_bar);
246         }