cposer/viewer btn1/2/3 fwd/rev/frm playback, misc fixes, leaks, cleanup
[goodguy/history.git] / cinelerra-5.1 / guicast / bclistbox.C
index e85cb599d00915743081ba8eeab9fe3351c4401b..0cea9d626cb9275cd7e21e5332d86b2d53873563 100644 (file)
@@ -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()