From a07e46d684a8aff4b56566b010b697ba9891872d Mon Sep 17 00:00:00 2001 From: Good Guy Date: Thu, 11 May 2017 15:54:06 -0600 Subject: [PATCH] add dyn h/v scrollbars to BC_ScrollTextBox, titler text visiblity fix --- cinelerra-5.1/guicast/bctextbox.C | 168 ++++++++++++++++++-------- cinelerra-5.1/guicast/bctextbox.h | 31 +++-- cinelerra-5.1/plugins/titler/titler.C | 3 +- 3 files changed, 143 insertions(+), 59 deletions(-) diff --git a/cinelerra-5.1/guicast/bctextbox.C b/cinelerra-5.1/guicast/bctextbox.C index a6611352..bd43f1cd 100644 --- a/cinelerra-5.1/guicast/bctextbox.C +++ b/cinelerra-5.1/guicast/bctextbox.C @@ -173,6 +173,7 @@ int BC_TextBox::reset_parameters(int rows, int has_border, int font, int size) keypress_draw = 1; last_keypress = 0; separators = 0; + xscroll = 0; yscroll = 0; dirty = 1; return 0; @@ -503,10 +504,11 @@ void BC_TextBox::enable() } } -int BC_TextBox::get_enabled() -{ - return enabled; -} +int BC_TextBox::get_enabled() { return enabled; } +int BC_TextBox::get_text_x() { return text_x; } +int BC_TextBox::get_text_y() { return text_y; } +void BC_TextBox::set_text_x(int v) { text_x = v; } +void BC_TextBox::set_text_y(int v) { text_y = v; } int BC_TextBox::pixels_to_rows(BC_WindowBase *window, int font, int pixels) { @@ -2116,6 +2118,7 @@ BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window, this->y = y; this->w = w; this->rows = rows; + xscroll = 0; yscroll = 0; this->default_text = default_text; this->default_wtext = 0; this->default_size = default_size; @@ -2130,6 +2133,7 @@ BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window, this->y = y; this->w = w; this->rows = rows; + xscroll = 0; yscroll = 0; this->default_text = 0; this->default_wtext = default_wtext; this->default_size = default_size; @@ -2137,6 +2141,7 @@ BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window, BC_ScrollTextBox::~BC_ScrollTextBox() { + delete xscroll; delete yscroll; if(text) { text->gui = 0; @@ -2150,44 +2155,32 @@ void BC_ScrollTextBox::create_objects() parent_window->add_subwindow(text = default_wtext ? new BC_ScrollTextBoxText(this, default_wtext) : new BC_ScrollTextBoxText(this, default_text)); - parent_window->add_subwindow(yscroll = new BC_ScrollTextBoxYScroll(this)); - text->yscroll = yscroll; - yscroll->bound_to = text; set_text_row(0); } void BC_ScrollTextBox::set_text(char *text, int isz) { this->text->set_text(text, isz); - yscroll->update_length(this->text->get_text_rows(), - this->text->get_text_row(), - yscroll->get_handlelength(), - 1); + update_scrollbars(); } int BC_ScrollTextBox::set_text_row(int n) { text->set_text_row(n); - yscroll->update_value(n); + update_scrollbars(); return 1; } void BC_ScrollTextBox::update(const char *text) { this->text->update(text); - yscroll->update_length(this->text->get_text_rows(), - this->text->get_text_row(), - yscroll->get_handlelength(), - 1); + update_scrollbars(); } void BC_ScrollTextBox::update(const wchar_t *wtext) { this->text->update(wtext); - yscroll->update_length(this->text->get_text_rows(), - this->text->get_text_row(), - yscroll->get_handlelength(), - 1); + update_scrollbars(); } void BC_ScrollTextBox::reposition_window(int x, int y, int w, int rows) @@ -2196,19 +2189,7 @@ void BC_ScrollTextBox::reposition_window(int x, int y, int w, int rows) this->y = y; this->w = w; this->rows = rows; - - text->reposition_window(x, - y, - w - yscroll->get_span(), - rows); - yscroll->reposition_window(x + w - yscroll->get_span(), - y, - BC_TextBox::calculate_row_h(rows, - parent_window)); - yscroll->update_length(text->get_text_rows(), - text->get_text_row(), - rows, - 0); + update_scrollbars(); } int BC_ScrollTextBox::button_press_event() @@ -2240,6 +2221,15 @@ int BC_ScrollTextBox::get_ibeam_letter() { return text->get_ibeam_letter(); } +int BC_ScrollTextBox::get_x_pos() +{ + return text->left_margin - text->get_text_x(); +} +void BC_ScrollTextBox::set_x_pos(int x) +{ + text->set_text_x(text->left_margin - x); + text->draw(1); +} BC_ScrollTextBoxText::BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *text) : BC_TextBox(gui->x, gui->y, @@ -2266,35 +2256,111 @@ BC_ScrollTextBoxText::~BC_ScrollTextBoxText() } } +void BC_ScrollTextBox::update_scrollbars() +{ + int view_w = w, view_rows = rows; + int view_h = BC_TextBox::calculate_row_h(view_rows, parent_window); + int text_rows = text->get_text_rows(); + int text_width = parent_window->get_text_width(text->font, text->get_wtext()); + BC_Resources *resources = parent_window->get_resources(); + int need_xscroll = 0, need_yscroll = 0; + +// Create scrollbars as needed + int resize = 1; + while( resize ) { + resize = 0; + if( !need_xscroll && (text->get_text_x() != text->left_margin || + text_width >= view_w - text->left_margin - text->right_margin) ) { + resize = need_xscroll = 1; + view_h -= resources->hscroll_data[SCROLL_HANDLE_UP]->get_h(); + view_rows = BC_TextBox::pixels_to_rows(parent_window, text->font, view_h); + } + if( !need_yscroll && (text->get_text_y() != text->top_margin || + text_rows > view_rows) ) { + resize = need_yscroll = 1; + view_w -= resources->vscroll_data[SCROLL_HANDLE_UP]->get_w(); + } + } + + if( !need_xscroll && xscroll ) { + text->yscroll = 0; + delete xscroll; xscroll = 0; + } + if( !need_yscroll && yscroll ) { + text->yscroll = 0; + delete yscroll; yscroll = 0; + } + + if( view_rows != text->get_rows() || view_w != text->get_w() ) { + text->reposition_window(x, y, view_w, view_rows); + } + if( need_xscroll && !xscroll ) { + xscroll = new BC_ScrollTextBoxXScroll(this); + parent_window->add_subwindow(xscroll); + text->xscroll = xscroll; + xscroll->bound_to = text; + xscroll->show_window(); + } + if( need_yscroll && !yscroll ) { + yscroll = new BC_ScrollTextBoxYScroll(this); + parent_window->add_subwindow(yscroll); + text->yscroll = yscroll; + yscroll->bound_to = text; + yscroll->show_window(); + } + if( xscroll ) { + xscroll->reposition_window(x, y + text->get_h(), view_w); + int xpos = get_x_pos(); + if( xpos != xscroll->get_value() ) + xscroll->update_value(xpos); + int xlength = text_width + view_w/4; + if( xlength != xscroll->get_length() || + view_w != xscroll->get_handlelength() ) + xscroll->update_length(xlength, xpos, view_w, 0); + } + if( yscroll ) { + yscroll->reposition_window(x + w - yscroll->get_span(), y, text->get_h()); + int text_row = text->get_text_row(); + if( text_row != yscroll->get_value() ) + yscroll->update_value(text_row); + if( text_rows != yscroll->get_length() || + view_rows != yscroll->get_handlelength() ) + yscroll->update_length(text_rows, text_row, view_rows, 0); + } +} + int BC_ScrollTextBoxText::handle_event() { - gui->yscroll->update_length(get_text_rows(), - get_text_row(), - gui->yscroll->get_handlelength(), - 1); + gui->update_scrollbars(); return gui->handle_event(); } int BC_ScrollTextBoxText::motion_event() { - gui->yscroll->update_length(get_text_rows(), - get_text_row(), - gui->yscroll->get_handlelength(), - 1); + gui->update_scrollbars(); + return 1; +} + +BC_ScrollTextBoxXScroll::BC_ScrollTextBoxXScroll(BC_ScrollTextBox *gui) + : BC_ScrollBar(gui->x, gui->y + gui->text->get_h(), SCROLL_HORIZ, gui->text->get_w(), + gui->text->get_text_width(MEDIUMFONT, gui->get_wtext()), 0, gui->w) +{ + this->gui = gui; +} + +BC_ScrollTextBoxXScroll::~BC_ScrollTextBoxXScroll() +{ +} + +int BC_ScrollTextBoxXScroll::handle_event() +{ + gui->set_x_pos(get_position()); return 1; } BC_ScrollTextBoxYScroll::BC_ScrollTextBoxYScroll(BC_ScrollTextBox *gui) - : BC_ScrollBar(gui->x + - gui->w - - get_resources()->vscroll_data[SCROLL_HANDLE_UP]->get_w(), - gui->y, - SCROLL_VERT, - BC_TextBox::calculate_row_h(gui->rows, - gui->parent_window), - gui->text->get_text_rows(), - 0, - gui->rows) + : BC_ScrollBar(gui->x + gui->text->get_w(), gui->y, SCROLL_VERT, gui->text->get_h(), + gui->text->get_text_rows(), 0, gui->rows) { this->gui = gui; } diff --git a/cinelerra-5.1/guicast/bctextbox.h b/cinelerra-5.1/guicast/bctextbox.h index a798e780..e681f76f 100644 --- a/cinelerra-5.1/guicast/bctextbox.h +++ b/cinelerra-5.1/guicast/bctextbox.h @@ -35,7 +35,10 @@ class BC_TextBoxSuggestions; + +class BC_ScrollTextBoxXScroll; class BC_ScrollTextBoxYScroll; +class BC_ScrollTextBoxText; class BC_TextBox : public BC_SubWindow @@ -69,6 +72,7 @@ public: friend class BC_TextBoxSuggestions; + friend class BC_ScrollTextBox; // Whenever the contents of the text change @@ -106,6 +110,10 @@ public: // Set top left of text view void set_text_row(int row); int get_text_row(); + int get_text_x(); + int get_text_y(); + void set_text_x(int v); + void set_text_y(int v); int reposition_window(int x, int y, int w = -1, int rows = -1); int uses_text(); @@ -143,8 +151,9 @@ public: // column - starting column to replace void no_suggestions(); void set_suggestions(ArrayList *suggestions, int column); - BC_ScrollTextBoxYScroll *yscroll; + BC_ScrollTextBoxXScroll *xscroll; + BC_ScrollTextBoxYScroll *yscroll; private: int reset_parameters(int rows, int has_border, int font, int size); void draw(int flush); @@ -225,14 +234,10 @@ public: }; - -class BC_ScrollTextBoxText; -class BC_ScrollTextBoxYScroll; - - class BC_ScrollTextBox { BC_ScrollTextBoxText *text; + BC_ScrollTextBoxXScroll *xscroll; BC_ScrollTextBoxYScroll *yscroll; BC_WindowBase *parent_window; const char *default_text; @@ -241,6 +246,7 @@ class BC_ScrollTextBox int x, y, w, rows; friend class BC_ScrollTextBoxText; + friend class BC_ScrollTextBoxXScroll; friend class BC_ScrollTextBoxYScroll; public: BC_ScrollTextBox(BC_WindowBase *parent_window, @@ -261,13 +267,15 @@ public: void update(const char *text); void update(const wchar_t *wtext); void reposition_window(int x, int y, int w, int rows); + void update_scrollbars(); // accessors int get_x() { return x; } int get_y() { return y; } int get_w() { return w; } // Visible rows for resizing int get_rows() { return rows; } - + int get_x_pos(); + void set_x_pos(int x); // forward functions int get_h(); const char *get_text(); @@ -291,6 +299,15 @@ public: int button_release_event() { return gui->button_release_event(); } }; +class BC_ScrollTextBoxXScroll : public BC_ScrollBar +{ +public: + BC_ScrollTextBoxXScroll(BC_ScrollTextBox *gui); + virtual ~BC_ScrollTextBoxXScroll(); + int handle_event(); + BC_ScrollTextBox *gui; +}; + class BC_ScrollTextBoxYScroll : public BC_ScrollBar { public: diff --git a/cinelerra-5.1/plugins/titler/titler.C b/cinelerra-5.1/plugins/titler/titler.C index 67f88a96..77132e7b 100644 --- a/cinelerra-5.1/plugins/titler/titler.C +++ b/cinelerra-5.1/plugins/titler/titler.C @@ -2329,7 +2329,8 @@ void TitleMain::draw_overlay() if( !translate ) translate = new TitleTranslate(this, cpus); - if( text_x+mask_w > 0 && text_x < title_w ) { + int tx = text_x - text_x1 + mask_x1; + if( tx < title_w && tx+mask_w > 0 ) { translate->xlat_mask = text_mask; translate->run_packages(); if( config.stroke_width >= SMALL && (config.style & BC_FONT_OUTLINE) ) { -- 2.26.2