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:
+18
-13
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user