X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcprogressbox.C;fp=cinelerra-5.1%2Fguicast%2Fbcprogressbox.C;h=69cc52b16c58e384daf6a587f8b0c566f19902a4;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcprogressbox.C b/cinelerra-5.1/guicast/bcprogressbox.C new file mode 100644 index 00000000..69cc52b1 --- /dev/null +++ b/cinelerra-5.1/guicast/bcprogressbox.C @@ -0,0 +1,160 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "bcbutton.h" +#include "bcdisplayinfo.h" +#include "bcprogress.h" +#include "bcprogressbox.h" +#include "bcresources.h" +#include "bctitle.h" +#include "bcwindow.h" +#include "language.h" +#include "vframe.h" + +BC_ProgressBox::BC_ProgressBox(int x, int y, const char *text, int64_t length) + : Thread(1, 0, 0) +{ +// Calculate default x, y + if(x < 0 || y < 0) + { + BC_DisplayInfo display_info; + x = display_info.get_abs_cursor_x(); + y = display_info.get_abs_cursor_y(); + // preloads boarder data (if not already loaded) + // without reopening display, also avoids a bug in X + display_info.get_top_border(); + } + + pwindow = new BC_ProgressWindow(x, y); + pwindow->create_objects(text, length); + cancelled = 0; +} + +BC_ProgressBox::~BC_ProgressBox() +{ + stop_progress(); + delete pwindow; +} + +void BC_ProgressBox::run() +{ + int result = pwindow->run_window(); + if(result) cancelled = 1; +} + +int BC_ProgressBox::update(int64_t position, int lock_it) +{ + if(!cancelled) + { + if(lock_it) pwindow->lock_window("BC_ProgressBox::update"); + pwindow->bar->update(position); + if(lock_it) pwindow->unlock_window(); + } + return cancelled; +} + +int BC_ProgressBox::update_title(const char *title, int lock_it) +{ + if(lock_it) pwindow->lock_window("BC_ProgressBox::update_title"); + pwindow->caption->update(title); + if(lock_it) pwindow->unlock_window(); + return cancelled; +} + +int BC_ProgressBox::update_length(int64_t length, int lock_it) +{ + if(lock_it) pwindow->lock_window("BC_ProgressBox::update_length"); + pwindow->bar->update_length(length); + if(lock_it) pwindow->unlock_window(); + return cancelled; +} + + +int BC_ProgressBox::is_cancelled() +{ + return cancelled; +} + +int BC_ProgressBox::stop_progress() +{ + if( Thread::running() ) { + pwindow->set_done(0); + Thread::join(); + } + return 0; +} + +void BC_ProgressBox::lock_window() +{ + pwindow->lock_window("BC_ProgressBox::lock_window"); +} + +void BC_ProgressBox::unlock_window() +{ + pwindow->unlock_window(); +} + + + +BC_ProgressWindow::BC_ProgressWindow(int x, int y) + : BC_Window(_("Progress"), + x, + y, + 340, + 100 + get_resources()->ok_images[0]->get_h(), + 0, + 0, + 0) +{ +} + +BC_ProgressWindow::~BC_ProgressWindow() +{ +} + +int BC_ProgressWindow::create_objects(const char *text, int64_t length) +{ + int x = 10, y = 10; + +// Recalculate width based on text + if(text) + { + int text_w = get_text_width(MEDIUMFONT, text); + int new_w = text_w + x + 10, scr_w = get_screen_w(0, -1); + if(new_w > scr_w) new_w = scr_w; + if(new_w > get_w()) { + resize_window(new_w, get_h()); + } + } + + this->text = text; + add_tool(caption = new BC_Title(x, y, text)); + y += caption->get_h() + 20; + add_tool(bar = new BC_ProgressBar(x, y, get_w() - 20, length)); + add_tool(new BC_CancelButton(this)); + show_window(1); + + return 0; +} + + + +