X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbclistbox.C;h=0cea9d626cb9275cd7e21e5332d86b2d53873563;hb=49d684c03f57629c656d81d76b84737c6449e0b4;hp=e85cb599d00915743081ba8eeab9fe3351c4401b;hpb=0d37fdc03a4c5eeffef41d15490ebc528079ea52;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bclistbox.C b/cinelerra-5.1/guicast/bclistbox.C index e85cb599..0cea9d62 100644 --- a/cinelerra-5.1/guicast/bclistbox.C +++ b/cinelerra-5.1/guicast/bclistbox.C @@ -311,6 +311,7 @@ BC_ListBox::BC_ListBox(int x, int y, int w, int h, list_highlighted = 0; disabled = 0; + scroll_repeat = 0; allow_drag_scroll = 1; process_drag = 1; @@ -744,6 +745,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) { @@ -2443,6 +2457,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 ) { @@ -2627,6 +2649,7 @@ int BC_ListBox::button_release_event() 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,7 +2667,6 @@ 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, @@ -2679,7 +2701,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 +2898,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 +2950,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); @@ -3126,29 +3143,22 @@ int BC_ListBox::drag_start_event() int cx, cy; get_abs_cursor(cx, cy); if( item_return->icon_vframe ) { - cx -= item_return->icon_vframe->get_w() / 2, - cy -= item_return->icon_vframe->get_h() / 2; drag_popup = new BC_DragWindow(this, item_return->icon_vframe, cx, cy); } else -// this probably works not! if( item_return->icon ) { - cx -= item_return->icon->get_w() / 2, - cy -= item_return->icon->get_h() / 2; drag_popup = new BC_DragWindow(this, item_return->icon, cx, cy); } else { - cx -= drag_icon_vframe->get_w() / 2, - cy -= drag_icon_vframe->get_h() / 2; drag_popup = new BC_DragWindow(this, drag_icon_vframe, cx, cy); } 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; } } @@ -3215,9 +3225,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 && @@ -3229,9 +3240,9 @@ int BC_ListBox::drag_stop_event() if( display_format == LISTBOX_ICONS ) { reposition_item(data, selection_number, - top_level->cursor_x + drag_popup->get_offset_x() - + top_level->cursor_x - drag_popup->get_w() / 2 - LISTBOX_MARGIN - 2 + xposition, - top_level->cursor_y + drag_popup->get_offset_y() - + top_level->cursor_y - drag_popup->get_h() / 2 - LISTBOX_MARGIN - 2 + yposition); } else @@ -3255,13 +3266,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 ) { @@ -3271,13 +3277,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()