MenuItems don't flicker anymore when a submenu opens (fixes bug 484). Implemented popupmenu's 'clickToOpenRect' feature, used by tracker's dirmenus, for example (fixes bug 523

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17168 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2006-04-18 20:32:10 +00:00
parent bb55c479b8
commit 1b5b2e4c35
+18 -13
View File
@@ -1149,6 +1149,7 @@ BMenu::_track(int *action, bigtime_t trackTime, long start)
bigtime_t closeTime = openTime; bigtime_t closeTime = openTime;
fState = MENU_ACT_NONE; fState = MENU_ACT_NONE;
while (true) { while (true) {
bool locked = LockLooper(); bool locked = LockLooper();
if (!locked) if (!locked)
@@ -1168,7 +1169,7 @@ BMenu::_track(int *action, bigtime_t trackTime, long start)
openTime = system_time(); openTime = system_time();
fState = MENU_ACT_NONE; fState = MENU_ACT_NONE;
snoozeAmount = 20000; snoozeAmount = 20000;
} else if (system_time() > kHysteresis + openTime && item->Submenu() } else if (system_time() > kHysteresis + openTime && item->Submenu() != NULL
&& item->Submenu()->Window() == NULL) { && item->Submenu()->Window() == NULL) {
// Open the submenu if it's not opened yet, but only if // Open the submenu if it's not opened yet, but only if
// the mouse pointer stayed over there for some time // the mouse pointer stayed over there for some time
@@ -1214,7 +1215,8 @@ BMenu::_track(int *action, bigtime_t trackTime, long start)
localAction = MENU_ACT_CLOSE; localAction = MENU_ACT_CLOSE;
break; break;
} else if (buttons == 0 && !IsStickyMode()) { } else if (buttons == 0 && !IsStickyMode()) {
if (IsStickyPrefOn() && system_time() < trackTime + 1000000) if (IsStickyPrefOn() && (system_time() < trackTime + 1000000
|| (fExtraRect != NULL && fExtraRect->Contains(location))))
SetStickyMode(true); SetStickyMode(true);
else { else {
localAction = MENU_ACT_CLOSE; localAction = MENU_ACT_CLOSE;
@@ -1446,8 +1448,6 @@ BMenu::ComputeLayout(int32 index, bool bestFit, bool moveItems,
break; break;
} }
// This is for BMenuBar
if (_width) { if (_width) {
if ((ResizingMode() & B_FOLLOW_LEFT_RIGHT) == B_FOLLOW_LEFT_RIGHT) { if ((ResizingMode() & B_FOLLOW_LEFT_RIGHT) == B_FOLLOW_LEFT_RIGHT) {
if (Parent()) if (Parent())
@@ -1724,17 +1724,22 @@ void
BMenu::SelectItem(BMenuItem *menuItem, uint32 showSubmenu, bool selectFirstItem) BMenu::SelectItem(BMenuItem *menuItem, uint32 showSubmenu, bool selectFirstItem)
{ {
// TODO: make use of "selectFirstItem" // TODO: make use of "selectFirstItem"
if (fSelected != NULL) {
fSelected->Select(false); // Avoid deselecting and then reselecting the same item
BMenu *subMenu = fSelected->Submenu(); // which would cause flickering
if (subMenu != NULL && subMenu->Window() != NULL) if (menuItem != fSelected) {
subMenu->_hide(); if (fSelected != NULL) {
fSelected->Select(false);
BMenu *subMenu = fSelected->Submenu();
if (subMenu != NULL && subMenu->Window() != NULL)
subMenu->_hide();
}
fSelected = menuItem;
if (fSelected != NULL)
fSelected->Select(true);
} }
if (menuItem != NULL)
menuItem->Select(true);
fSelected = menuItem;
if (fSelected != NULL && showSubmenu == 0) { if (fSelected != NULL && showSubmenu == 0) {
BMenu *subMenu = fSelected->Submenu(); BMenu *subMenu = fSelected->Submenu();
if (subMenu != NULL && subMenu->Window() == NULL) if (subMenu != NULL && subMenu->Window() == NULL)