X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbclistbox.C;h=4d9cba1099974ca1bcc2d2032b0fdb8dacfc257a;hb=7b05ad287956f8bd00836d9b5fb39f899a5fb641;hp=c78af1a68db7e489ea9cc9ecd1b838d68f97a251;hpb=3ec3a9cc6afc6561311686b3ec597ee3c1d80d6f;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bclistbox.C b/cinelerra-5.1/guicast/bclistbox.C index c78af1a6..4d9cba10 100644 --- a/cinelerra-5.1/guicast/bclistbox.C +++ b/cinelerra-5.1/guicast/bclistbox.C @@ -38,18 +38,10 @@ // ====================================================== scrollbars - -BC_ListBoxYScroll::BC_ListBoxYScroll(BC_ListBox *listbox, - int total_height, - int view_height, - int position) - : BC_ScrollBar(listbox->get_yscroll_x(), - listbox->get_yscroll_y(), - SCROLL_VERT, - listbox->get_yscroll_height(), - total_height, - position, - view_height) +BC_ListBoxYScroll::BC_ListBoxYScroll(BC_ListBox *listbox) + : BC_ScrollBar(listbox->get_yscroll_x(), listbox->get_yscroll_y(), + listbox->yscroll_orientation, listbox->get_yscroll_height(), + listbox->items_h, listbox->yposition, listbox->view_h) { this->listbox = listbox; } @@ -64,23 +56,10 @@ int BC_ListBoxYScroll::handle_event() return 1; } - - - - - - -BC_ListBoxXScroll::BC_ListBoxXScroll(BC_ListBox *listbox, - int total_width, - int view_width, - int position) - : BC_ScrollBar(listbox->get_xscroll_x(), - listbox->get_xscroll_y(), - SCROLL_HORIZ, - listbox->get_xscroll_width(), - total_width, - position, - view_width) +BC_ListBoxXScroll::BC_ListBoxXScroll(BC_ListBox *listbox) + : BC_ScrollBar(listbox->get_xscroll_x(), listbox->get_xscroll_y(), + listbox->xscroll_orientation, listbox->get_xscroll_width(), + listbox->items_w, listbox->xposition, listbox->view_w) { this->listbox = listbox; } @@ -96,12 +75,6 @@ int BC_ListBoxXScroll::handle_event() } - - - - - - BC_ListBoxToggle::BC_ListBoxToggle(BC_ListBox *listbox, BC_ListBoxItem *item, int x, @@ -361,6 +334,8 @@ BC_ListBox::BC_ListBox(int x, new_value = 0; need_xscroll = 0; need_yscroll = 0; + xscroll_orientation = SCROLL_HORIZ; + yscroll_orientation = SCROLL_VERT; bg_tile = 0; bg_draw = 1; drag_popup = 0; @@ -432,6 +407,7 @@ BC_ListBox::BC_ListBox(int x, // reset the search engine //printf("BC_ListBox::BC_ListBox 4\n"); + show_query = 0; reset_query(); //printf("BC_ListBox::BC_ListBox 5\n"); } @@ -732,9 +708,10 @@ void BC_ListBox::calculate_last_coords_recursive( // Lowest right icon coordinate. current_icon_x = item->icon_x; if(current_icon_x > *icon_x) *icon_x = current_icon_x; - if(current_icon_x + get_item_w(item) > *next_icon_x) + if(current_icon_x + get_item_w(item) > *next_icon_x) { *next_icon_x = current_icon_x + get_item_w(item); - + *next_icon_y = 0; + } current_icon_y = item->icon_y + get_item_h(item); if(current_icon_y > *next_icon_y) *next_icon_y = current_icon_y; @@ -1059,7 +1036,7 @@ int BC_ListBox::get_text_w(BC_ListBoxItem *item) int BC_ListBox::get_text_h(BC_ListBoxItem *item) { int h = item->get_text_h(); - if( h < 0 ) item->set_text_h(h = get_text_height(MEDIUMFONT)); + if( h < 0 ) item->set_text_h(h = get_text_height(MEDIUMFONT, item->get_text())); return h; } @@ -1129,8 +1106,8 @@ int BC_ListBox::get_items_height(ArrayList *data, int x, y, w, h; BC_ListBoxItem *item = data[master_column].values[j]; - if(display_format == LISTBOX_ICONS) - { + if( display_format == LISTBOX_ICONS || + display_format == LISTBOX_ICON_LIST ) { get_icon_mask(item, x, y, w, h); if(y + h + yposition > highest) highest = y + h + yposition; @@ -1141,8 +1118,6 @@ int BC_ListBox::get_items_height(ArrayList *data, { get_text_mask(item, x, y, w, h); *result += h; - - // Descend into sublist if(item->get_sublist() && item->get_expand()) @@ -1154,9 +1129,7 @@ int BC_ListBox::get_items_height(ArrayList *data, } } - if((display_format == LISTBOX_TEXT || - display_format == LISTBOX_ICON_LIST) && - top_level) + if( display_format == LISTBOX_TEXT && top_level ) { highest = LISTBOX_MARGIN + *result; } @@ -1236,6 +1209,13 @@ void BC_ListBox::set_autoplacement(ArrayList *data, } +void BC_ListBox::set_scroll_stretch(int xv, int yv) +{ + if( xv >= 0 ) xscroll_orientation = + !xv ? SCROLL_HORIZ : SCROLL_HORIZ + SCROLL_STRETCH; + if( yv >= 0 ) yscroll_orientation = + !yv ? SCROLL_VERT : SCROLL_VERT + SCROLL_STRETCH; +} int BC_ListBox::get_yscroll_x() { @@ -1364,6 +1344,8 @@ int BC_ListBox::get_text_mask(BC_ListBoxItem *item, { w = get_text_width(MEDIUMFONT, item->text) + LISTBOX_MARGIN * 2; h = row_height; + int ih = get_icon_h(item); + if( h < ih ) h = ih; } return 0; } @@ -1970,11 +1952,8 @@ int BC_ListBox::get_scrollbars() { if(!xscrollbar) { - destination->add_subwindow(xscrollbar = - new BC_ListBoxXScroll(this, - w_needed, - view_w, - xposition)); + xscrollbar = new BC_ListBoxXScroll(this); + destination->add_subwindow(xscrollbar); xscrollbar->show_window(0); xscrollbar->bound_to = this; } @@ -1997,11 +1976,8 @@ int BC_ListBox::get_scrollbars() { if(!yscrollbar) { - destination->add_subwindow(yscrollbar = - new BC_ListBoxYScroll(this, - h_needed, - view_h, - yposition)); + yscrollbar = new BC_ListBoxYScroll(this); + destination->add_subwindow(yscrollbar); yscrollbar->show_window(0); yscrollbar->bound_to = this; } @@ -2419,9 +2395,8 @@ int BC_ListBox::get_cursor_item(ArrayList *data, } } } - else + else if( gui ) { // Text is treed - { // Cursor is inside items rectangle if(cursor_x >= 0 && cursor_x < (yscrollbar ? @@ -2483,12 +2458,11 @@ int BC_ListBox::repeat_event(int64_t duration) case NO_OPERATION: // Show tooltip - if(button_highlighted && is_popup && !tooltip_done && + if(button_highlighted && is_popup && tooltip_text && tooltip_text[0] != 0 && duration == get_resources()->tooltip_delay) { show_tooltip(); - tooltip_done = 1; return 1; } break; @@ -3126,17 +3100,14 @@ int BC_ListBox::button_release_event() //printf("BC_ListBox::button_release_event 10\n"); unset_repeat(get_resources()->scroll_repeat); current_operation = NO_OPERATION; - translate_coordinates(top_level->event_win, - gui->win, - gui->get_cursor_x(), - gui->get_cursor_y(), - &cursor_x, - &cursor_y); - - selection_number1 = - selection_number = - get_cursor_item(data, cursor_x, cursor_y); + if( gui ) { + translate_coordinates(top_level->event_win, gui->win, + gui->get_cursor_x(), gui->get_cursor_y(), + &cursor_x, &cursor_y); + selection_number1 = selection_number = + get_cursor_item(data, cursor_x, cursor_y); //printf("BC_ListBox::button_release_event %d %d\n", selection_number2, selection_number1); + } if(is_popup) { @@ -3929,8 +3900,6 @@ int BC_ListBox::reposition_window(int x, int y, int w, int h, int flush) if(!is_popup) { - if(w != -1) popup_w = w; - if(h != -1) popup_h = h; if(xscrollbar) xscrollbar->reposition_window(get_xscroll_x(), get_xscroll_y(), @@ -3951,6 +3920,7 @@ int BC_ListBox::reposition_window(int x, int y, int w, int h, int flush) int BC_ListBox::deactivate() { + hide_tooltip(); // printf("BC_ListBox::deactivate %d this=%p gui=%p active=%d\n", // __LINE__, // this, @@ -3986,69 +3956,45 @@ int BC_ListBox::deactivate() int BC_ListBox::activate(int take_focus) { -//printf("BC_ListBox::activate %d %p\n", __LINE__, this); - if(!active) - { - if(take_focus) - { - top_level->active_subwindow = this; - active = 1; - } - - button_releases = 0; - -// Test for existence of GUI in case this was previously called without -// take_focus & again with take_focus - if(is_popup && !gui) - { - Window tempwin; - int x, y; - int new_x, new_y; - y = get_y() + get_h(); - if(justify == LISTBOX_RIGHT) - { - x = get_x() - popup_w + get_w(); - } - else - { - x = get_x(); - } - - - XTranslateCoordinates(top_level->display, - parent_window->win, - top_level->rootwin, - x, - y, - &new_x, - &new_y, - &tempwin); - - if(new_x < 0) new_x = 0; - if(new_y + popup_h > top_level->get_root_h(0)) - new_y -= get_h() + popup_h; - - add_subwindow(gui = new BC_Popup(this, - new_x, - new_y, - popup_w, - popup_h, - -1, - 0, - 0)); -// Avoid top going out of screen - if(new_y < 0 ) - new_y = 2; -//printf("BC_ListBox::activate %d this=%p %p\n", __LINE__, this, gui->win); - draw_items(1); - gui->show_window(1); - } -//printf("BC_ListBox::activate %d %p\n", __LINE__, this); -//sleep(1); - } + if( active ) return 0; + active = 1; + if( take_focus ) + set_active_subwindow(this); + button_releases = 0; + if( !is_popup || gui ) return 0; + int wx = get_x(), wy = get_y() + get_h(); + if( justify == LISTBOX_RIGHT ) wx += get_w() - popup_w; + Window xwin; + int abs_x, abs_y; + XTranslateCoordinates(top_level->display, + parent_window->win, top_level->rootwin, + wx, wy, &abs_x, &abs_y, &xwin); + if( x <= 0 ) x = 2; + if( y <= 0 ) y = 2; + return activate(abs_x, abs_y); +} + +int BC_ListBox::activate(int x, int y, int w, int h) +{ + if( !is_popup || gui ) return 0; + active = 1; + if(w != -1) popup_w = w; + if(h != -1) popup_h = h; + reset_query(); + if( y + popup_h > top_level->get_root_h(0) ) + y -= get_h() + popup_h; + add_subwindow(gui = new BC_Popup(this, + x, y, popup_w, popup_h, -1, 0, 0)); + draw_items(1); + gui->show_window(1); return 0; } +int BC_ListBox::is_active() +{ + return active; +} + int BC_ListBox::keypress_event() { if(!active) return 0; @@ -4064,7 +4010,6 @@ int BC_ListBox::keypress_event() { case ESC: case RETURN: - case BACKSPACE: top_level->deactivate(); // If user is manipulating popup with keyboard, don't pass on event. @@ -4165,7 +4110,12 @@ int BC_ListBox::keypress_event() if(query_len > 0) query[--query_len] = 0; new_selection = query_list(); } - + if( show_query ) { + if( query_len > 0 ) + show_tooltip(query); + else + hide_tooltip(); + } redraw = 1; result = 1; } @@ -4220,6 +4170,7 @@ void BC_ListBox::clear_listbox(int x, int y, int w, int h) void BC_ListBox::update_format(int display_format, int redraw) { this->display_format = display_format; + xposition = 0; yposition = 0; if( redraw && gui ) draw_items(1, 1); } @@ -4432,9 +4383,14 @@ void BC_ListBox::draw_text_recursive(ArrayList *data, gui->set_color(row_color); gui->draw_box(x, y, column_width, h); gui->set_color(BLACK); - int yy = y, xx = x + column_width-1; - gui->draw_line(x, yy, xx, yy); - yy = y + row_height; + int xx = x + column_width-1; + gui->draw_line(x, y, xx, y); + int hh = row_height; + if( display_format == LISTBOX_ICON_LIST ) { + int ih = get_icon_h(item); + if( ih > hh ) hh = ih; + } + int yy = y + hh-1; gui->draw_line(x, yy, xx, yy); }