prevent popup deactivation while button_down
[goodguy/history.git] / cinelerra-5.0 / guicast / bcprogressbox.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 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 "bcbutton.h"
23 #include "bcdisplayinfo.h"
24 #include "bcprogress.h"
25 #include "bcprogressbox.h"
26 #include "bcresources.h"
27 #include "bctitle.h"
28 #include "bcwindow.h"
29 #include "language.h"
30 #include "vframe.h"
31
32 BC_ProgressBox::BC_ProgressBox(int x, int y, const char *text, int64_t length)
33  : Thread(1, 0, 0)
34 {
35 // Calculate default x, y
36         if(x < 0 || y < 0)
37         {
38                 BC_DisplayInfo display_info;
39                 x = display_info.get_abs_cursor_x();
40                 y = display_info.get_abs_cursor_y();
41                 // preloads boarder data (if not already loaded)
42                 //  without reopening display, also avoids a bug in X
43                 display_info.get_top_border();
44         }
45
46         pwindow = new BC_ProgressWindow(x, y);
47         pwindow->create_objects(text, length);
48         cancelled = 0;
49 }
50
51 BC_ProgressBox::~BC_ProgressBox()
52 {
53         delete pwindow;
54 }
55
56 void BC_ProgressBox::run()
57 {
58         int result = pwindow->run_window();
59         if(result) cancelled = 1;
60 }
61
62 int BC_ProgressBox::update(int64_t position, int lock_it)
63 {
64         if(!cancelled)
65         {
66                 if(lock_it) pwindow->lock_window("BC_ProgressBox::update");
67                 pwindow->bar->update(position);
68                 if(lock_it) pwindow->unlock_window();
69         }
70         return cancelled;
71 }
72
73 int BC_ProgressBox::update_title(const char *title, int lock_it)
74 {
75         if(lock_it) pwindow->lock_window("BC_ProgressBox::update_title");
76         pwindow->caption->update(title);
77         if(lock_it) pwindow->unlock_window();
78         return cancelled;
79 }
80
81 int BC_ProgressBox::update_length(int64_t length, int lock_it)
82 {
83         if(lock_it) pwindow->lock_window("BC_ProgressBox::update_length");
84         pwindow->bar->update_length(length);
85         if(lock_it) pwindow->unlock_window();
86         return cancelled;
87 }
88
89
90 int BC_ProgressBox::is_cancelled()
91 {
92         return cancelled;
93 }
94
95 int BC_ProgressBox::stop_progress()
96 {
97         pwindow->set_done(0);
98         Thread::join();
99         return 0;
100 }
101
102 void BC_ProgressBox::lock_window()
103 {
104         pwindow->lock_window("BC_ProgressBox::lock_window");
105 }
106
107 void BC_ProgressBox::unlock_window()
108 {
109         pwindow->unlock_window();
110 }
111
112
113
114 BC_ProgressWindow::BC_ProgressWindow(int x, int y)
115  : BC_Window(_("Progress"),
116         x,
117         y,
118         340,
119         100 + get_resources()->ok_images[0]->get_h(),
120         0,
121         0,
122         0)
123 {
124 }
125
126 BC_ProgressWindow::~BC_ProgressWindow()
127 {
128 }
129
130 int BC_ProgressWindow::create_objects(const char *text, int64_t length)
131 {
132         int x = 10, y = 10;
133
134 // Recalculate width based on text
135         if(text)
136         {
137                 int text_w = get_text_width(MEDIUMFONT, text);
138                 int new_w = text_w + x + 10, scr_w = get_screen_w(0, -1);
139                 if(new_w > scr_w) new_w = scr_w;
140                 if(new_w > get_w()) {
141                         resize_window(new_w, get_h());
142                 }
143         }
144
145         this->text = text;
146         add_tool(caption = new BC_Title(x, y, text));
147         y += caption->get_h() + 20;
148         add_tool(bar = new BC_ProgressBar(x, y, get_w() - 20, length));
149         add_tool(new BC_CancelButton(this));
150         show_window(1);
151
152         return 0;
153 }
154
155
156
157