undo nested clip bug, wheel zoom redraw fix, uninited vars, shortcuts doc
[goodguy/history.git] / cinelerra-5.1 / guicast / bcpopupmenu.C
index cefaea7f48e22be0e9667cb4f376d84e794d5509..4c639fe27d25890f96bd4289cc77c21c651ca569 100644 (file)
@@ -26,7 +26,7 @@
 #include "bcpopupmenu.h"
 #include "bcresources.h"
 #include "bcsignals.h"
-#include "colors.h"
+#include "bccolors.h"
 #include "fonts.h"
 #include <string.h>
 #include "vframe.h"
@@ -67,6 +67,7 @@ BC_PopupMenu::BC_PopupMenu(int x,
        this->data = data;
        this->w_argument = w;
        status = BUTTON_UP;
+       pending = 0;
 }
 
 BC_PopupMenu::BC_PopupMenu(int x,
@@ -88,11 +89,14 @@ BC_PopupMenu::BC_PopupMenu(int x,
        this->data = data;
        this->w_argument = -1;
        status = BUTTON_UP;
+       pending = 0;
 }
 
 BC_PopupMenu::~BC_PopupMenu()
 {
-       if(menu_popup) delete menu_popup;
+       use_title = 0;
+       deactivate();
+       delete menu_popup;
        for(int i = 0; i < TOTAL_IMAGES; i++)
        {
                if(images[i]) delete images[i];
@@ -208,16 +212,21 @@ int BC_PopupMenu::add_item(BC_MenuItem *item)
 
 int BC_PopupMenu::remove_item(BC_MenuItem *item)
 {
-       menu_popup->remove_item(item, 0);
+       menu_popup->remove_item(item);
        return 0;
 }
 
-int BC_PopupMenu::total_items()
+int BC_PopupMenu::del_item(BC_MenuItem *item)
 {
-       return menu_popup->total_menuitems();
+       menu_popup->del_item(item);
        return 0;
 }
 
+int BC_PopupMenu::total_items()
+{
+       return menu_popup->total_items();
+}
+
 BC_MenuItem* BC_PopupMenu::get_item(int i)
 {
        return menu_popup->menu_items.values[i];
@@ -280,7 +289,17 @@ int BC_PopupMenu::deactivate()
 
 int BC_PopupMenu::activate_menu()
 {
-       if(!popup_down)
+       if( !get_button_down() || !BC_WindowBase::get_resources()->popupmenu_btnup )
+               return menu_activate();
+       top_level->active_popup_menu = this;
+       pending = 1;
+       return 0;
+}
+
+int BC_PopupMenu::menu_activate()
+{
+       pending = 0;
+       if( !popup_down )
        {
                int x = this->x;
                int y = this->y;
@@ -295,7 +314,6 @@ int BC_PopupMenu::activate_menu()
                        button_press_y = top_level->cursor_y;
                }
 
-               button_releases = 0;
                if(use_title)
                {
                        Window tempwin;
@@ -307,12 +325,11 @@ int BC_PopupMenu::activate_menu()
                                w, h, 0, 1);
                }
                else
-// back off x,y just a bit so the menu doesnt deactivate without motion
-                       menu_popup->activate_menu(x-10, y-10, w, h, 0, 1);
+                       menu_popup->activate_menu(x+3, y+3, w, h, 0, 1);
                popup_down = 1;
                if(use_title) draw_title(1);
        }
-       return 0;
+       return 1;
 }
 
 int BC_PopupMenu::deactivate_menu()
@@ -340,12 +357,11 @@ int BC_PopupMenu::focus_out_event()
 
 int BC_PopupMenu::repeat_event(int64_t duration)
 {
-       if( status == BUTTON_HI && !tooltip_done &&
+       if( status == BUTTON_HI &&
                tooltip_text && tooltip_text[0] != 0 &&
                duration == top_level->get_resources()->tooltip_delay )
        {
                show_tooltip();
-               tooltip_done = 1;
                return 1;
        }
        return 0;
@@ -353,6 +369,7 @@ int BC_PopupMenu::repeat_event(int64_t duration)
 
 int BC_PopupMenu::button_press_event()
 {
+       int result = 0;
        if(get_buttonpress() == 1 &&
                is_event_win() &&
                use_title)
@@ -367,10 +384,10 @@ int BC_PopupMenu::button_press_event()
        // Scrolling section
        if (is_event_win()
                && (get_buttonpress() == 4 || get_buttonpress() == 5)
-               && menu_popup->total_menuitems() > 1 )
+               && menu_popup->total_items() > 1 )
        {
                int theval = -1;
-               for (int i = 0; i < menu_popup->total_menuitems(); i++) {
+               for (int i = 0; i < menu_popup->total_items(); i++) {
                        if (!strcmp(menu_popup->menu_items.values[i]->get_text(),get_text())) {
                                theval=i;
                                break;
@@ -383,22 +400,23 @@ int BC_PopupMenu::button_press_event()
 
                if (theval < 0)
                        theval=0;
-               if (theval >= menu_popup->total_menuitems())
-                       theval = menu_popup->total_menuitems() - 1;
+               if (theval >= menu_popup->total_items())
+                       theval = menu_popup->total_items() - 1;
 
                BC_MenuItem *tmp = menu_popup->menu_items.values[theval];
                set_text(tmp->get_text());
-               if (!tmp->handle_event())
-                       this->handle_event();
+               result = tmp->handle_event();
+               if( !result )
+                       result = this->handle_event();
        }
        if(popup_down)
        {
 // Menu is down so dispatch to popup.
                menu_popup->dispatch_button_press();
-               return 1;
+               result = 1;
        }
 
-       return 0;
+       return result;
 }
 
 int BC_PopupMenu::button_release_event()
@@ -406,8 +424,6 @@ int BC_PopupMenu::button_release_event()
 // try the title
        int result = 0;
 
-       button_releases++;
-
        if(is_event_win() && use_title)
        {
                hide_tooltip();
@@ -418,78 +434,22 @@ int BC_PopupMenu::button_release_event()
                }
        }
 
+       if( pending )
+               return menu_activate();
+
        if( !use_title && status == BUTTON_DN ) {
                result = 1;
        }
-       else if(popup_down)
-       {
+       else if( popup_down && menu_popup->cursor_inside() ) {
 // Menu is down so dispatch to popup.
                result = menu_popup->dispatch_button_release();
        }
-
-       if(popup_down && button_releases >= 2)
-       {
-               deactivate();
-       }
-
-       if(!result && use_title && cursor_inside() && is_event_win())
-       {
-               hide_tooltip();
-               result = 1;
-       }
-       else
-       if(!result && !use_title && popup_down && button_releases < 2)
-       {
-               result = 1;
-       }
-
-
-       if(!result && popup_down)
-       {
-// Button was released outside any menu.
+// released outside popup
+       if( get_resources()->popupmenu_btnup && !result && popup_down ) {
                deactivate();
                result = 1;
        }
-
-       return result;
-
-
-
-
-
-
-
-
-
-
-       if(popup_down)
-       {
-// Menu is down so dispatch to popup.
-               result = menu_popup->dispatch_button_release();
-       }
-
-       if(!result && use_title && cursor_inside() && top_level->event_win == win)
-       {
-// Inside title
-               if(button_releases >= 2)
-               {
-                       highlighted = 1;
-                       deactivate();
-               }
-               result = 1;
-       }
-       else
-       if(!result && !use_title && button_releases < 2)
-       {
-// First release outside a floating menu
-// Released outside a fictitious title area
-//             if(top_level->cursor_x < button_press_x - 5 ||
-//                     top_level->cursor_y < button_press_y - 5 ||
-//                     top_level->cursor_x > button_press_x + 5 ||
-//                     top_level->cursor_y > button_press_y + 5)
-                       deactivate();
-               result = 1;
-       }
+       hide_tooltip();
 
        return result;
 }
@@ -513,8 +473,10 @@ int BC_PopupMenu::cursor_leave_event()
 
 // dispatch to popup
        if( popup_down ) {
-               if( !get_button_down() && !menu_popup->cursor_inside() )
-                       deactivate_menu();
+               if( !get_button_down() && !menu_popup->cursor_inside() ) {
+                       status = BUTTON_UP;
+//                     deactivate_menu();
+               }
                menu_popup->dispatch_cursor_leave();
        }
 
@@ -526,7 +488,6 @@ int BC_PopupMenu::cursor_enter_event()
 {
        if(is_event_win() && use_title)
        {
-               tooltip_done = 0;
                if(top_level->button_down)
                {
                        status = BUTTON_DN;
@@ -545,25 +506,19 @@ int BC_PopupMenu::cursor_motion_event()
        int result = 0;
 
 // This menu is down.
-       if(popup_down)
-       {
+       if(popup_down) {
                result = menu_popup->dispatch_motion_event();
        }
 
-       if(!result && use_title && top_level->event_win == win)
-       {
-               if(highlighted)
-               {
-                       if(cursor_inside())
-                       {
+       if(!result && use_title && is_event_win()) {
+               if(highlighted) {
+                       if(!cursor_inside()) {
                                highlighted = 0;
                                draw_title(1);
                        }
                }
-               else
-               {
-                       if(cursor_inside())
-                       {
+               else {
+                       if(cursor_inside()) {
                                highlighted = 1;
                                draw_title(1);
                                result = 1;