VBR for ffmpeg mpegts, user mount for udf images, widget fixes
[goodguy/history.git] / cinelerra-5.1 / guicast / bcpopupmenu.C
index bfcca0693939b42fa0497a4f315979740c025eb7..71a172e43b62acbc9bf5edfe63a3c9565740b57c 100644 (file)
@@ -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,6 +89,7 @@ BC_PopupMenu::BC_PopupMenu(int x,
        this->data = data;
        this->w_argument = -1;
        status = BUTTON_UP;
+       pending = 0;
 }
 
 BC_PopupMenu::~BC_PopupMenu()
@@ -220,8 +222,7 @@ int BC_PopupMenu::del_item(BC_MenuItem *item)
 
 int BC_PopupMenu::total_items()
 {
-       return menu_popup->total_menuitems();
-       return 0;
+       return menu_popup->total_items();
 }
 
 BC_MenuItem* BC_PopupMenu::get_item(int i)
@@ -286,7 +287,16 @@ 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();
+       pending = 1;
+       return 0;
+}
+
+int BC_PopupMenu::menu_activate()
+{
+       pending = 0;
+       if( !popup_down )
        {
                int x = this->x;
                int y = this->y;
@@ -312,8 +322,7 @@ 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);
        }
@@ -372,10 +381,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;
@@ -388,8 +397,8 @@ 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());
@@ -421,15 +430,18 @@ 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();
        }
 // released outside popup
-       if( !result && popup_down ) {
+       if( get_resources()->popupmenu_btnup && !result && popup_down ) {
                deactivate();
                result = 1;
        }
@@ -457,8 +469,10 @@ int BC_PopupMenu::cursor_leave_event()
 
 // dispatch to popup
        if( popup_down ) {
-               if( !get_button_down() && !menu_popup->cursor_inside() )
+               if( !get_button_down() && !menu_popup->cursor_inside() ) {
+                       status = BUTTON_UP;
                        deactivate_menu();
+               }
                menu_popup->dispatch_cursor_leave();
        }
 
@@ -498,7 +512,7 @@ int BC_PopupMenu::cursor_motion_event()
        {
                if(highlighted)
                {
-                       if(cursor_inside())
+                       if(!cursor_inside())
                        {
                                highlighted = 0;
                                draw_title(1);