X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbclistbox.C;h=2dd4283c990fc325d4caf6edc68068c882a4b035;hp=88afc836f39d9317b1856cfea66aaa02446918e6;hb=HEAD;hpb=22a5ea2ff7a04c02465dc9b2256f04c38433142e diff --git a/cinelerra-5.1/guicast/bclistbox.C b/cinelerra-5.1/guicast/bclistbox.C index 88afc836..2dd4283c 100644 --- a/cinelerra-5.1/guicast/bclistbox.C +++ b/cinelerra-5.1/guicast/bclistbox.C @@ -287,8 +287,8 @@ BC_ListBox::BC_ListBox(int x, int y, int w, int h, yscrollbar = 0; current_cursor = ARROW_CURSOR; gui = 0; - view_h = 0; - view_w = 0; + view_w = items_w = 0; + view_h = items_h = 0; title_h = 0; active = 0; is_suggestions = 0; @@ -300,19 +300,26 @@ BC_ListBox::BC_ListBox(int x, int y, int w, int h, bg_tile = 0; bg_draw = 1; drag_popup = 0; + dragged_title = 0; selection_number1 = -1; selection_number2 = -1; bg_surface = 0; bg_pixmap = 0; row_height = row_ascent = row_descent = 0; - + selection_start = 0; + selection_center = 0; + selection_end = -1; + selection_number = -1; current_operation = NO_OPERATION; button_highlighted = 0; + button_releases = 0; list_highlighted = 0; disabled = 0; + scroll_repeat = 0; allow_drag_scroll = 1; process_drag = 1; + for( int i=0; i<32; ++i ) default_column_width[i] = 0; sort_column = -1; sort_order = 0; @@ -359,8 +366,12 @@ BC_ListBox::BC_ListBox(int x, int y, int w, int h, drag_icon_vframe = 0; drag_column_icon_vframe = 0; - - + drag_cursor_x = 0; + drag_column_w = 0; + temp_display_format = display_format; + packed_icons = display_format == LISTBOX_ICONS_PACKED ? 1 : 0; + rect_x1 = rect_x2 = 0; + rect_y1 = rect_y2 = 0; // reset the search engine //printf("BC_ListBox::BC_ListBox 4\n"); @@ -607,8 +618,7 @@ void BC_ListBox::calculate_last_coords_recursive( *next_text_y = current_text_y; // Add sublist depth if it is expanded - if( item->get_sublist() && item->get_columns() && - item->get_expand() ) { + if( item->sublist_active() && item->get_columns() ) { calculate_last_coords_recursive(item->get_sublist(), icon_x, next_icon_x, next_icon_y, next_text_y, 0); } @@ -645,8 +655,8 @@ void BC_ListBox::calculate_item_coords_recursive( if( temp_display_format == LISTBOX_ICON_LIST ) { for( int i=0; iicon ) { - if( data[0].get(i)->icon->get_h() > row_height ) - row_height = data[0].get(i)->icon->get_h(); + int icon_h = data[0].get(i)->icon->get_h() + 2*ICON_MARGIN; + if( row_height < icon_h ) row_height = icon_h; } } } @@ -698,10 +708,10 @@ void BC_ListBox::calculate_item_coords_recursive( int bl = get_baseline(item); if( bl > row_ascent ) row_ascent = bl; int dt = ht - bl; - if( dt > row_descent ) row_ascent = bl; + if( dt > row_descent ) row_descent = dt; // printf("BC_ListBox::calculate_item_coords_recursive %p %d %d %d %d %s \n", -// item->get_sublist(), item->get_columns(), item->get_expand(), +// item->sublist, item->get_columns(), item->get_expand(), // next_text_x, *next_text_y, item->get_text()); // Increment position of next column if( j < columns - 1 ) { @@ -732,8 +742,7 @@ void BC_ListBox::calculate_item_coords_recursive( // Set up a sublist BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() && item->get_columns() && - item->get_expand() ) { + if( item->sublist_active() && item->get_columns() ) { calculate_item_coords_recursive( item->get_sublist(), icon_x, next_icon_x, next_icon_y, next_text_y, 0); } @@ -744,6 +753,19 @@ void BC_ListBox::set_is_suggestions(int value) { this->is_suggestions = value; } +void BC_ListBox::set_scroll_repeat() +{ + if( scroll_repeat ) return; + scroll_repeat = 1; + set_repeat(get_resources()->scroll_repeat); +} + +void BC_ListBox::unset_scroll_repeat() +{ + if( !scroll_repeat ) return; + scroll_repeat = 0; + unset_repeat(get_resources()->scroll_repeat); +} void BC_ListBox::set_use_button(int value) { @@ -828,25 +850,38 @@ int BC_ListBox::get_highlighted_item() int BC_ListBox::get_item_x(BC_ListBoxItem *item) { - if( display_format == LISTBOX_TEXT ) + switch( display_format ) { + case LISTBOX_TEXT: + case LISTBOX_ICON_LIST: return item->text_x - xposition + 2; - if( display_format == LISTBOX_ICON_LIST ) - return item->text_x - xposition + 2; - return item->icon_x - xposition + 2; + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: + return item->icon_x - xposition + 2; + } + return 0; } int BC_ListBox::get_item_y(BC_ListBoxItem *item) { - if( display_format == LISTBOX_TEXT ) - return item->text_y - yposition + title_h + 2; - if( display_format == LISTBOX_ICON_LIST ) + switch( display_format ) { + case LISTBOX_TEXT: + case LISTBOX_ICON_LIST: return item->text_y - yposition + title_h + 2; - return item->icon_y - yposition + title_h + 2; + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: + return item->icon_y - yposition + 2; + } + return 0; } int BC_ListBox::get_item_w(BC_ListBoxItem *item) { - if( display_format == LISTBOX_ICONS ) { + switch( display_format ) { + case LISTBOX_TEXT: + case LISTBOX_ICON_LIST: { + return get_text_w(item) + 2 * LISTBOX_MARGIN; } + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: { int x, y, w, h; get_icon_mask(item, x, y, w, h); int icon_w = w; @@ -855,13 +890,19 @@ int BC_ListBox::get_item_w(BC_ListBoxItem *item) return icon_position == ICON_LEFT ? icon_w + text_w : icon_w > text_w ? icon_w : text_w; + } } - return get_text_w(item) + 2 * LISTBOX_MARGIN; + return 0; } int BC_ListBox::get_item_h(BC_ListBoxItem *item) { - if( display_format == LISTBOX_ICONS ) { + switch( display_format ) { + case LISTBOX_TEXT: + case LISTBOX_ICON_LIST: + return get_text_h(item); + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: { int x, y, w, h; get_icon_mask(item, x, y, w, h); int icon_h = h; @@ -869,20 +910,30 @@ int BC_ListBox::get_item_h(BC_ListBoxItem *item) int text_h = h; return icon_position != ICON_LEFT ? icon_h + text_h : - icon_h > text_h ? icon_h : text_h; + icon_h > text_h ? icon_h : text_h; } } - return get_text_h(item); + return 0; } +int BC_ListBox::get_icon_x(BC_ListBoxItem *item) +{ + return get_item_x(item) + ICON_MARGIN; +} + +int BC_ListBox::get_icon_y(BC_ListBoxItem *item) +{ + return get_item_y(item) + ICON_MARGIN; +} + int BC_ListBox::get_icon_w(BC_ListBoxItem *item) { - return item->get_icon_w(); + return item->get_icon_w() + 2*ICON_MARGIN; } int BC_ListBox::get_icon_h(BC_ListBoxItem *item) { - return item->get_icon_h(); + return item->get_icon_h() + 2*ICON_MARGIN; } int BC_ListBox::get_text_w(BC_ListBoxItem *item) @@ -908,9 +959,12 @@ int BC_ListBox::get_baseline(BC_ListBoxItem *item) int BC_ListBox::get_items_width() { - int widest = 0; - - if( display_format == LISTBOX_ICONS ) { + switch( display_format ) { + case LISTBOX_TEXT: + return get_column_offset(columns); + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: { + int widest = 0; for( int i=0; i widest ) widest = x1 + w; - if( display_format == LISTBOX_ICONS && icon_position == ICON_LEFT ) + if( icon_position == ICON_LEFT ) x1 += w; get_text_mask(item, x, y, w, h); if( x1 + w > widest ) widest = x1 + w; } } - } - else - if( display_format == LISTBOX_TEXT ) { + return widest; } + case LISTBOX_ICON_LIST: return get_column_offset(columns); } - else { - return get_column_offset(columns); - } - return widest; + return 0; } int BC_ListBox::get_items_height(ArrayList *data, int columns, @@ -953,23 +1003,23 @@ int BC_ListBox::get_items_height(ArrayList *data, int columns, int x, y, w, h; BC_ListBoxItem *item = data[master_column].values[j]; - if( display_format == LISTBOX_ICONS || - display_format == LISTBOX_ICON_LIST ) { + switch( display_format ) { + case LISTBOX_TEXT: + get_text_mask(item, x, y, w, h); + *result += h; +// Descend into sublist + if( item->sublist_active() ) + get_items_height(item->get_sublist(), item->get_columns(), result); + break; + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: + case LISTBOX_ICON_LIST: get_icon_mask(item, x, y, w, h); if( y + h + yposition > highest ) highest = y + h + yposition; get_text_mask(item, x, y, w, h); if( y + h + yposition > highest ) highest = y + h + yposition; - } - else { - get_text_mask(item, x, y, w, h); - *result += h; -// Descend into sublist - if( item->get_sublist() && item->get_expand() ) { - get_items_height(item->get_sublist(), - item->get_columns(), - result); - } + break; } } @@ -996,6 +1046,11 @@ int BC_ListBox::set_xposition(int position) return 0; } +int BC_ListBox::is_highlighted() +{ + return list_highlighted; +} + void BC_ListBox::expand_item(BC_ListBoxItem *item, int expand) { if( item ) { @@ -1016,7 +1071,7 @@ void BC_ListBox::collapse_recursive(ArrayList *data, { for( int i=0; iget_sublist() && item->expand ) { + if( item->sublist_active() ) { item->expand = 0; collapse_recursive(item->get_sublist(), master_column); } @@ -1034,7 +1089,7 @@ void BC_ListBox::set_autoplacement(ArrayList *data, } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() ) { + if( item->sublist_active() ) { set_autoplacement(item->get_sublist(), do_icons, do_text); } } @@ -1124,14 +1179,20 @@ int BC_ListBox::get_column_width(int column, int clamp_right) int BC_ListBox::get_icon_mask(BC_ListBoxItem *item, int &x, int &y, int &w, int &h) { - if( display_format == LISTBOX_ICONS ) { - x = get_item_x(item); - y = get_item_y(item); - w = get_icon_w(item) + ICON_MARGIN * 2; - h = get_icon_h(item) + ICON_MARGIN * 2; - } - else + switch( display_format ) { + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: + case LISTBOX_ICON_LIST: { + x = get_icon_x(item); + y = get_icon_y(item); + w = get_icon_w(item); + h = get_icon_h(item); + break; } + case LISTBOX_TEXT: + default: { x = y = w = h = 0; + break; } + } return 0; } @@ -1141,28 +1202,32 @@ int BC_ListBox::get_text_mask(BC_ListBoxItem *item, x = get_item_x(item); y = get_item_y(item); - if( display_format == LISTBOX_ICONS ) { + switch( display_format ) { + case LISTBOX_TEXT: { + w = get_text_w(item) + LISTBOX_MARGIN * 2; + h = get_text_h(item); + break; } + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: { if( icon_position == ICON_LEFT ) { - x += get_icon_w(item) + ICON_MARGIN * 2; + x += get_icon_w(item); y += get_icon_h(item) - get_text_h(item); } else { - y += get_icon_h(item) + ICON_MARGIN; + y += get_icon_h(item); } - w = get_text_w(item) + ICON_MARGIN * 2; + w = packed_icons ? + get_icon_w(item) + ICON_MARGIN * 2 : + get_text_w(item) + ICON_MARGIN * 2 ; h = get_text_h(item) + ICON_MARGIN * 2; - } - else - if( display_format == LISTBOX_TEXT ) { - w = get_text_w(item) + LISTBOX_MARGIN * 2; - h = get_text_h(item); - } - else { + break; } + case LISTBOX_ICON_LIST: { w = get_text_width(MEDIUMFONT, item->text) + LISTBOX_MARGIN * 2; h = row_height; - int ih = get_icon_h(item); - if( h < ih ) h = ih; + break; } + default: + w = h = 0; } return 0; } @@ -1223,7 +1288,7 @@ BC_ListBoxItem* BC_ListBox::get_selection_recursive(ArrayList * } } - if( item->get_sublist() ) { + if( item->sublist_active() ) { BC_ListBoxItem *result = get_selection_recursive(item->get_sublist(), column, selection_number); @@ -1256,7 +1321,7 @@ int BC_ListBox::get_selection_number_recursive(ArrayList *data, return (*counter); } } - if( item->get_sublist() ) { + if( item->sublist_active() ) { int result = get_selection_number_recursive(item->get_sublist(), column, selection_number, counter); if( result >= 0 ) return result; @@ -1387,8 +1452,7 @@ int BC_ListBox::select_previous(int skip, BC_ListBoxItem *selected_item, int *co do { for( int i=data[master_column].total-1; i>=0; --i ) { BC_ListBoxItem *current_item = data[master_column].values[i]; - if( current_item->get_sublist() && - current_item->get_expand() ) { + if( current_item->sublist_active() ) { int result = select_previous(skip, selected_item, counter, current_item->get_sublist(), got_first, got_second); if( *got_second ) @@ -1479,8 +1543,7 @@ int BC_ListBox::select_next(int skip, BC_ListBoxItem *selected_item, int *counte } // Descend into expanded level - if( current_item->get_sublist() && - current_item->get_expand() ) { + if( current_item->sublist_active() ) { int result = select_next(skip, selected_item, counter, current_item->get_sublist(), got_first, got_second); if( *got_second ) { @@ -1558,9 +1621,9 @@ int BC_ListBox::center_selection(int selection, BC_ListBoxItem *item = data[master_column].values[i]; if( (*counter) == selection ) { BC_ListBoxItem *top_item = this->data[master_column].values[0]; - - - if( display_format == LISTBOX_ICONS ) { + switch( display_format ) { + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: { // Icon is out of window if( item->icon_y-yposition > view_h-get_text_h(item) || item->icon_y-yposition < 0 ) { @@ -1571,24 +1634,21 @@ int BC_ListBox::center_selection(int selection, data[master_column].values[selection]->icon_x - xposition < 0 ) { xposition = item->icon_x - view_w / 2; } - } - else { + break; } + case LISTBOX_TEXT: + case LISTBOX_ICON_LIST: // Text coordinate is out of window if( item->text_y-yposition > view_h-get_text_h(item) || item->text_y-yposition < 0 ) { - yposition = item->text_y - - top_item->text_y - - view_h / 2; + yposition = item->text_y - top_item->text_y - view_h / 2; } } return 1; } // Descend - if( item->get_sublist() ) { - int result = center_selection(selection, - item->get_sublist(), - counter); + if( item->sublist_active() ) { + int result = center_selection(selection, item->get_sublist(), counter); if( result ) return result; } } @@ -1826,7 +1886,9 @@ int BC_ListBox::select_rectangle(ArrayList *data, for( int i=0; i *data, result = 1; } } - } - else { + break; } + case LISTBOX_TEXT: + case LISTBOX_ICON_LIST: { if( x2 >= 0 && x1 < (yscrollbar ? gui->get_w() - get_resources()->vscroll_data[SCROLL_HANDLE_UP]->get_w() : @@ -1866,14 +1929,15 @@ int BC_ListBox::select_rectangle(ArrayList *data, result = 1; } } + break; } } } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() && - item->get_expand() ) + if( item->sublist_active() ) { result |= select_rectangle(item->get_sublist(), x1, y1, x2, y2); + } } return result; } @@ -1912,9 +1976,8 @@ void BC_ListBox::move_selection(ArrayList *dst, continue; } // Descend into sublist - if( item->get_sublist() ) { - move_selection(dst, - item->get_sublist()); + if( item->sublist_active() ) { + move_selection(dst, item->get_sublist()); } ++i; } @@ -1947,11 +2010,8 @@ int BC_ListBox::put_selection(ArrayList *data, } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() ) { - if( put_selection(item->get_sublist(), - src, - destination, - counter) ) + if( item->sublist_active() ) { + if( put_selection(item->get_sublist(), src, destination, counter) ) return 1; } } @@ -1977,10 +2037,8 @@ int BC_ListBox::item_to_index(ArrayList *data, } BC_ListBoxItem *new_item = data[master_column].values[i]; - if( new_item->get_sublist() ) { - if( item_to_index(new_item->get_sublist(), - item, - counter) >= 0 ) + if( new_item->sublist_active() ) { + if( item_to_index(new_item->get_sublist(), item, counter) >= 0 ) return (*counter); } } @@ -1999,7 +2057,7 @@ BC_ListBoxItem* BC_ListBox::index_to_item(ArrayList *data, return data[column].values[i]; } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() ) { + if( item->sublist_active() ) { BC_ListBoxItem *result = index_to_item(item->get_sublist(), number, column, counter); if( result ) return result; @@ -2016,8 +2074,11 @@ int BC_ListBox::get_cursor_item(ArrayList *data, int cursor_x, if( !counter ) counter = &temp; // Icons are not treed - if( display_format == LISTBOX_ICONS ) { - for( int j=data[master_column].total-1; j>=0; --j ) { + switch( display_format ) { + case LISTBOX_ICONS: + case LISTBOX_ICONS_PACKED: + case LISTBOX_ICON_LIST: { + for( int j=data[master_column].total; --j>=0; ) { int icon_x, icon_y, icon_w, icon_h; int text_x, text_y, text_w, text_h; BC_ListBoxItem *item = data[master_column].values[j]; @@ -2032,8 +2093,9 @@ int BC_ListBox::get_cursor_item(ArrayList *data, int cursor_x, return j; } } - } - else if( gui ) { + return -1; } + case LISTBOX_TEXT: + if( !gui ) break; // Text is treed // Cursor is inside items rectangle if( cursor_x >= 0 && @@ -2055,23 +2117,42 @@ int BC_ListBox::get_cursor_item(ArrayList *data, int cursor_x, cursor_y < get_item_y(item) + get_item_h(item) ) { //printf("BC_ListBox::get_cursor_item %d %d %p\n", master_column, i, item); if( item_return ) (*item_return) = item; + if( expanded < 0 ) (*counter) = i; return (*counter); } // Descend into sublist - if( item->get_sublist() ) { + if( item->sublist_active() ) { if( get_cursor_item(item->get_sublist(), cursor_x, cursor_y, item_return, counter, - item->get_expand()) >= 0 ) + item->get_expand()) >= 0 ) { + if( expanded < 0 ) (*counter) = i; return (*counter); + } } } } + break; } return -1; } +// short version +int BC_ListBox::get_cursor_item_no() +{ + int rx, ry; + gui->get_relative_cursor(rx, ry); + return get_cursor_item(data, rx, ry, 0, 0); +} + +int BC_ListBox::get_cursor_data_item_no(BC_ListBoxItem **item_return) +{ + int rx, ry; + gui->get_relative_cursor(rx, ry); + return get_cursor_item(data, rx, ry, item_return, 0, -1); +} + int BC_ListBox::repeat_event(int64_t duration) { switch( current_operation ) { @@ -2174,7 +2255,7 @@ int BC_ListBox::get_first_selection(ArrayList *data, int *resul BC_ListBoxItem *item = data[master_column].values[i]; (*result)++; if( item->selected ) return (*result); - if( item->get_sublist() ) { + if( item->sublist_active() ) { if( get_first_selection(item->get_sublist(), result) >= 0 ) return (*result); } @@ -2191,7 +2272,7 @@ int BC_ListBox::get_total_items(ArrayList *data, for( int i=0; iget_sublist() ) + if( data[master_column].values[i]->sublist_active() ) get_total_items(data[master_column].values[i]->get_sublist(), result, master_column); @@ -2221,7 +2302,7 @@ int BC_ListBox::get_last_selection(ArrayList *data, return (*result); } - if( item->get_sublist() ) { + if( item->sublist_active() ) { if( get_last_selection(item->get_sublist(), result) >= 0 ) { if( top_level ) return get_total_items(data, 0, master_column) - (*result) /* - 1 */; @@ -2246,7 +2327,7 @@ void BC_ListBox::select_range(ArrayList *data, data[j].values[i]->selected = 1; } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() ) + if( item->sublist_active() ) select_range(item->get_sublist(), start, end, current); } } @@ -2298,7 +2379,7 @@ int BC_ListBox::toggle_item_selection(ArrayList *data, } // Descend into sublist - if( item->get_sublist() ) { + if( item->sublist_active() ) { if( toggle_item_selection(item->get_sublist(), selection_number, counter) ) return 1; @@ -2339,7 +2420,7 @@ void BC_ListBox::set_selected(ArrayList *data, } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() ) { + if( item->sublist_active() ) { set_selected(item->get_sublist(), item_number, value, counter); } } @@ -2366,7 +2447,7 @@ int BC_ListBox::update_selection(ArrayList *data, for( int j=0; jselected = 0; } - if( item->get_sublist() ) + if( item->sublist_active() ) result |= update_selection(item->get_sublist(), selection_number, counter); @@ -2383,7 +2464,7 @@ void BC_ListBox::promote_selections(ArrayList *data, if( item->selected == old_value ) item->selected = new_value; } BC_ListBoxItem *item = data[master_column].values[i]; - if( item->get_sublist() ) + if( item->sublist_active() ) promote_selections(item->get_sublist(), old_value, new_value); } } @@ -2443,6 +2524,14 @@ int BC_ListBox::button_press_event() if( debug ) printf("BC_ListBox::button_press_event %d\n", __LINE__); } + if( current_operation != NO_OPERATION ) { + switch( current_operation ) { + case DRAG_ITEM: + case COLUMN_DRAG: + return drag_stop_event(); + } + } + // Wheel mouse pressed if( get_buttonpress() == 4 ) { if( current_operation == NO_OPERATION ) { @@ -2624,9 +2713,9 @@ int BC_ListBox::button_press_event() int BC_ListBox::button_release_event() { int result = 0; - int cursor_x, cursor_y; int do_event = 0; new_value = 0; + unset_scroll_repeat(); //printf("BC_ListBox::button_release_event 1 %d\n", current_operation); switch( current_operation ) { @@ -2644,14 +2733,9 @@ int BC_ListBox::button_release_event() case BUTTON_DOWN_SELECT: case SELECT: //printf("BC_ListBox::button_release_event 10\n"); - unset_repeat(get_resources()->scroll_repeat); current_operation = NO_OPERATION; 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); + selection_number1 = selection_number = get_cursor_item_no(); //printf("BC_ListBox::button_release_event %d %d\n", selection_number2, selection_number1); } @@ -2679,7 +2763,6 @@ int BC_ListBox::button_release_event() case SELECT_RECT: - unset_repeat(get_resources()->scroll_repeat); if( data ) { // Demote selections from rectangle selection promote_selections(data, 2, 1); @@ -2877,9 +2960,8 @@ int BC_ListBox::cursor_motion_event() break; } case SELECT_RECT: { - if( test_drag_scroll(get_cursor_x(), get_cursor_y()) ) { - set_repeat(get_resources()->scroll_repeat); - } + if( test_drag_scroll(get_cursor_x(), get_cursor_y()) ) + set_scroll_repeat(); int old_x1 = MIN(rect_x1, rect_x2); int old_x2 = MAX(rect_x1, rect_x2); @@ -2930,11 +3012,8 @@ int BC_ListBox::cursor_motion_event() case SELECT: { int old_highlighted_item = highlighted_item; - if( test_drag_scroll(get_cursor_x(), - get_cursor_y()) ) { - set_repeat(get_resources()->scroll_repeat); - } - + if( test_drag_scroll(get_cursor_x(), get_cursor_y()) ) + set_scroll_repeat(); highlighted_item = selection_number = get_cursor_item(data, get_cursor_x(), get_cursor_y(), &highlighted_ptr); @@ -3068,7 +3147,8 @@ int BC_ListBox::cursor_motion_event() // Moved out of item area if( old_highlighted_item != highlighted_item ) { - redraw_items = 1; + if( !mouse_over_event(highlighted_item) ) + redraw_items = 1; } //printf("BC_ListBox::cursor_motion_event 1 %d\n", highlighted_item); @@ -3115,6 +3195,7 @@ int BC_ListBox::drag_start_event() { switch( current_operation ) { case SELECT: + if( expander_active() ) break; if( gui && gui->is_event_win() && allow_drag ) { BC_ListBoxItem *item_return = 0; selection_number = get_cursor_item(data, @@ -3141,7 +3222,7 @@ int BC_ListBox::drag_start_event() current_operation = DRAG_ITEM; // require shift down for scrolling if( allow_drag < 0 && shift_down() ) - set_repeat(get_resources()->scroll_repeat); + set_scroll_repeat(); return 1; } } @@ -3208,9 +3289,10 @@ int BC_ListBox::drag_motion_event() int BC_ListBox::drag_stop_event() { + int result = 0; + unset_scroll_repeat(); switch( current_operation ) { case DRAG_ITEM: - unset_repeat(get_resources()->scroll_repeat); // Inside window boundary if( top_level->cursor_x > 0 && top_level->cursor_x < gui->get_w() - drag_popup->get_w() / 2 && @@ -3219,7 +3301,8 @@ int BC_ListBox::drag_stop_event() // Move icon - if( display_format == LISTBOX_ICONS ) { + if( display_format == LISTBOX_ICONS || + display_format == LISTBOX_ICONS_PACKED ) { reposition_item(data, selection_number, top_level->cursor_x - drag_popup->get_w() / 2 - @@ -3248,13 +3331,8 @@ int BC_ListBox::drag_stop_event() } else drag_popup->drag_failure_event(); - - delete drag_popup; - flush(); - drag_popup = 0; - current_operation = NO_OPERATION; - new_value = 0; - return 1; + result = 1; + break; case COLUMN_DRAG: if( dragged_title != highlighted_title ) { @@ -3264,13 +3342,18 @@ int BC_ListBox::drag_stop_event() else drag_popup->drag_failure_event(); } + result = 1; + } + + if( result ) { current_operation = NO_OPERATION; delete drag_popup; flush(); drag_popup = 0; - return 1; + new_value = 0; } - return 0; + + return result; } BC_DragWindow* BC_ListBox::get_drag_popup() @@ -3386,6 +3469,14 @@ int BC_ListBox::is_active() return active; } +int BC_ListBox::expander_active() +{ + for( int i=0; ivalue ) return 1; + } + return 0 ; +} + int BC_ListBox::keypress_event() { if( !active ) return 0; @@ -3478,7 +3569,7 @@ int BC_ListBox::keypress_event() break; default: - if( !ctrl_down() ) { + if( show_query && !ctrl_down() ) { int query_len = strlen(query); if( query_len < (int)sizeof(query)-1 && top_level->get_keypress() > 30 && @@ -3492,12 +3583,10 @@ 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(); - } + if( query_len > 0 ) + show_tooltip(query); + else + hide_tooltip(); redraw = 1; result = 1; } @@ -3550,6 +3639,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; + packed_icons = display_format == LISTBOX_ICONS_PACKED ? 1 : 0; xposition = 0; yposition = 0; if( redraw && gui ) draw_items(1, 1); } @@ -3579,7 +3669,8 @@ int BC_ListBox::draw_items(int flush, int draw_bg) first_in_view = -1; last_in_view = 0; // Icon display - if( display_format == LISTBOX_ICONS ) { + if( display_format == LISTBOX_ICONS || + display_format == LISTBOX_ICONS_PACKED ) { clear_listbox(2, 2 + title_h, view_w, view_h); set_font(MEDIUMFONT); @@ -3623,12 +3714,17 @@ int BC_ListBox::draw_items(int flush, int draw_bg) } // Draw icons gui->set_color(get_item_color(data, 0, i)); - if( item->icon ) - gui->pixmap->draw_pixmap(item->icon, - icon_x + ICON_MARGIN, icon_y + ICON_MARGIN); - - gui->draw_text(text_x + ICON_MARGIN, - text_y + ICON_MARGIN + get_baseline(item), item->text); + VFrame *vicon = item->get_vicon_frame(); + if( vicon ) + gui->pixmap->draw_vframe(vicon, icon_x, icon_y); + else if( item->icon ) + gui->pixmap->draw_pixmap(item->icon, icon_x, icon_y); + char item_text[BCTEXTLEN]; + if( display_format == LISTBOX_ICONS_PACKED ) + gui->truncate_text(item_text, item->text, text_w); + else + strcpy(item_text, item->text); + gui->draw_text(text_x, text_y + get_baseline(item), item_text); } else item->set_in_view(0); @@ -3709,7 +3805,7 @@ void BC_ListBox::draw_text_recursive(ArrayList *data, int bl = get_baseline(item); if( bl > row_ascent ) row_ascent = bl; int dt = ht - bl; - if( dt > row_descent ) row_ascent = bl; + if( dt > row_descent ) row_descent = dt; } for( int i=0; i *data, if( column == 0 && display_format == LISTBOX_ICON_LIST ) { - if( item->icon ) { - gui->pixmap->draw_pixmap(item->icon, x, y); + int ix = get_icon_x(item), iy = get_icon_y(item); + VFrame *vicon = item->get_vicon_frame(); + if( vicon ) { + gui->pixmap->draw_vframe(vicon, ix, iy); + x += vicon->get_w() + ICON_MARGIN; + } + else if( item->icon ) { + gui->pixmap->draw_pixmap(item->icon, ix, iy); x += item->icon->get_w() + ICON_MARGIN; } } @@ -3791,7 +3893,7 @@ void BC_ListBox::draw_text_recursive(ArrayList *data, item->set_in_view(0); // Descend into sublist - if( first_item->get_expand() ) { + if( first_item->sublist_active() ) { draw_text_recursive(first_item->get_sublist(), column, indent + LISTBOX_INDENT,