plug leaks, leaker tweaks, lang for effect info, c41 spiffs, wm probe tweaks
[goodguy/history.git] / cinelerra-5.1 / guicast / bclistbox.C
index 3b1332923fcc9953e21374d060afe169960a0254..4d9cba1099974ca1bcc2d2032b0fdb8dacfc257a 100644 (file)
 
 // ====================================================== 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");
 }
@@ -1060,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;
 }
 
@@ -1233,6 +1209,13 @@ void BC_ListBox::set_autoplacement(ArrayList<BC_ListBoxItem*> *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()
 {
@@ -1361,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;
 }
@@ -1967,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;
                }
@@ -1994,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;
                }
@@ -2479,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;
@@ -3942,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,
@@ -3978,6 +3957,7 @@ int BC_ListBox::deactivate()
 int BC_ListBox::activate(int take_focus)
 {
        if( active ) return 0;
+       active = 1;
        if( take_focus )
                set_active_subwindow(this);
        button_releases = 0;
@@ -3996,11 +3976,11 @@ int BC_ListBox::activate(int take_focus)
 
 int BC_ListBox::activate(int x, int y, int w, int h)
 {
-       if( active || !is_popup || gui ) return 0;
+       if( !is_popup || gui ) return 0;
+       active = 1;
        if(w != -1) popup_w = w;
        if(h != -1) popup_h = h;
        reset_query();
-       active = 1;
        if( y + popup_h > top_level->get_root_h(0) )
                y -= get_h() + popup_h;
        add_subwindow(gui = new BC_Popup(this,
@@ -4030,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.
@@ -4131,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;
                        }
@@ -4186,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);
 }
 
@@ -4398,9 +4383,14 @@ void BC_ListBox::draw_text_recursive(ArrayList<BC_ListBoxItem*> *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);
                        }