From b0f89f914d8d7e1e633c41566de0d5ae74c087b3 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Sat, 20 May 2006 22:36:38 +0000 Subject: [PATCH] Fixed the problem mentioned in bug 484, some cleanups, implemented BMenu::InvokeItem() more correctly. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17519 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/Menu.cpp | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 1796b10ace..6af6e4c161 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -1204,7 +1204,7 @@ BMenu::_track(int *action, bigtime_t trackTime, long start) // TODO: cleanup BMenuItem *item = NULL; bigtime_t openTime = system_time(); - bigtime_t closeTime = openTime; + bigtime_t closeTime = 0; fState = MENU_STATE_TRACKING; if (fSuper != NULL) @@ -1675,11 +1675,26 @@ BMenu::State(BMenuItem **item) const void BMenu::InvokeItem(BMenuItem *item, bool now) { - if (item->Submenu()) - item->Submenu()->Show(); - else if (IsRadioMode()) - item->SetMarked(true); - + if (!item->IsEnabled()) + return; + + // Do the "selected" animation + if (!item->Submenu() && LockLooper()) { + snooze(50000); + item->Select(true); + Sync(); + snooze(50000); + item->Select(false); + Sync(); + snooze(50000); + item->Select(true); + Sync(); + snooze(50000); + item->Select(false); + Sync(); + UnlockLooper(); + } + item->Invoke(); } @@ -1740,6 +1755,12 @@ BMenuItem * BMenu::HitTestItems(BPoint where, BPoint slop) const { // TODO: Take "slop" into account ? + + // if the point doesn't lie within the menu's + // bounds, bail out immediately + if (!Bounds().Contains(where)) + return NULL; + int32 itemCount = CountItems(); for (int32 i = 0; i < itemCount; i++) { BMenuItem *item = ItemAt(i); @@ -1778,7 +1799,6 @@ BMenu::ItemMarked(BMenuItem *item) ItemAt(i)->SetMarked(false); InvalidateLayout(); } - if (IsLabelFromMarked() && Superitem()) Superitem()->SetLabel(item->Label());