diff --git a/src/apps/deskbar/ExpandoMenuBar.cpp b/src/apps/deskbar/ExpandoMenuBar.cpp index 60c266ef8a..7129fc07b1 100644 --- a/src/apps/deskbar/ExpandoMenuBar.cpp +++ b/src/apps/deskbar/ExpandoMenuBar.cpp @@ -45,6 +45,7 @@ All rights reserved. #include #include #include +#include #include #include "icons.h" @@ -91,8 +92,7 @@ TExpandoMenuBar::TExpandoMenuBar(BRect frame, const char* name, fDeskbarMenuWidth(kMinMenuItemWidth), fPreviousDragTargetItem(NULL), fLastMousedOverItem(NULL), - fLastClickedItem(NULL), - fClickedExpander(false) + fLastClickedItem(NULL) { SetItemMargins(0.0f, 0.0f, 0.0f, 0.0f); SetFont(be_plain_font); @@ -267,9 +267,6 @@ TExpandoMenuBar::MessageReceived(BMessage* message) void TExpandoMenuBar::MouseDown(BPoint where) { - fClickedExpander = false; - // in case MouseUp() wasn't called - BMessage* message = Window()->CurrentMessage(); BMenuItem* menuItem; TTeamMenuItem* item = TeamItemAtPoint(where, &menuItem); @@ -310,16 +307,13 @@ TExpandoMenuBar::MouseDown(BPoint where) // absorb the message } - int32 buttons = 0; // check if within expander bounds to expand window items if (fVertical && fShowTeamExpander - && item->ExpanderBounds().Contains(where) - && message->FindInt32("buttons", &buttons) == B_OK - && buttons == B_PRIMARY_MOUSE_BUTTON) { + && item->ExpanderBounds().Contains(where)) { // start the animation here, finish on mouse up fLastClickedItem = item; - fClickedExpander = true; - item->SetArrowDirection(BControlLook::B_RIGHT_DOWN_ARROW); + MouseDownThread::TrackMouse(this, + &TExpandoMenuBar::_DoneTracking, &TExpandoMenuBar::_Track); Invalidate(item->ExpanderBounds()); return; // absorb the message @@ -354,89 +348,6 @@ TExpandoMenuBar::MouseMoved(BPoint where, uint32 code, const BMessage* message) // force a cleanup _FinishedDrag(); - switch (code) { - case B_ENTERED_VIEW: - { - TTeamMenuItem* lastItem - = dynamic_cast(fLastClickedItem); - if (fVertical && fShowTeamExpander && fClickedExpander - && lastItem != NULL && buttons == B_PRIMARY_MOUSE_BUTTON) { - // Started expander animation, exited view then entered - // again, redraw the expanded arrow - lastItem->SetArrowDirection(BControlLook::B_RIGHT_DOWN_ARROW); - Invalidate(lastItem->ExpanderBounds()); - } - break; - } - - case B_INSIDE_VIEW: - { - BMenuItem* menuItem; - TTeamMenuItem* item = TeamItemAtPoint(where, &menuItem); - TWindowMenuItem* windowMenuItem - = dynamic_cast(menuItem); - - if (item == NULL || menuItem == NULL) { - // item is NULL, remove the tooltip and break out - fLastMousedOverItem = NULL; - SetToolTip((const char*)NULL); - break; - } - - if (menuItem == fLastMousedOverItem) { - // already set the tooltip for this item, break out - break; - } - - if (windowMenuItem != NULL && fBarView->Vertical() - && fBarView->ExpandoState() && item->IsExpanded()) { - // expando mode window menu item - fLastMousedOverItem = menuItem; - if (strcmp(windowMenuItem->Label(), - windowMenuItem->FullTitle()) != 0) { - // label is truncated, set tooltip - SetToolTip(windowMenuItem->FullTitle()); - } else - SetToolTip((const char*)NULL); - - break; - } - - if (item->HasLabel()) { - // item has a visible label, remove the tooltip and break out - fLastMousedOverItem = menuItem; - SetToolTip((const char*)NULL); - break; - } - - SetToolTip(item->Name()); - // new item, set the tooltip to the item name - fLastMousedOverItem = menuItem; - // save the current menuitem for the next MouseMoved() call - break; - } - - case B_OUTSIDE_VIEW: - // NOTE: Should not be here, but for the sake of defensive - // programming... fall-through - case B_EXITED_VIEW: - { - TTeamMenuItem* lastItem - = dynamic_cast(fLastClickedItem); - if (lastItem != NULL && fVertical && fShowTeamExpander - && fClickedExpander) { - // Started expander animation, then exited view, - // since we can't track outside mouse movements - // redraw the original expander arrow - lastItem->SetArrowDirection(lastItem->IsExpanded() - ? BControlLook::B_DOWN_ARROW - : BControlLook::B_RIGHT_ARROW); - Invalidate(lastItem->ExpanderBounds()); - } - break; - } - } - BMenuBar::MouseMoved(where, code, message); return; } @@ -488,35 +399,12 @@ TExpandoMenuBar::MouseMoved(BPoint where, uint32 code, const BMessage* message) void TExpandoMenuBar::MouseUp(BPoint where) { - bool clickedExpander = fClickedExpander; - fClickedExpander = false; - if (fBarView->Dragging()) { _FinishedDrag(true); return; // absorb the message } - TTeamMenuItem* item = TeamItemAtPoint(where, NULL); - TTeamMenuItem* lastItem = dynamic_cast(fLastClickedItem); - if (fVertical && fShowTeamExpander && clickedExpander) { - if (item != NULL && lastItem != NULL && item == lastItem - && item->ExpanderBounds().Contains(where)) { - // Toggle the expanded state - BAutolock locker(sMonLocker); - // let the update thread wait... - item->ToggleExpandState(true); - item->Draw(); - return; - // absorb the message - } else if (lastItem != NULL) { - // User changed their mind, redraw the original expander arrow - lastItem->SetArrowDirection(lastItem->IsExpanded() - ? BControlLook::B_DOWN_ARROW : BControlLook::B_RIGHT_ARROW); - Invalidate(lastItem->ExpanderBounds()); - } - } - BMenuBar::MouseUp(where); } @@ -1051,3 +939,37 @@ TExpandoMenuBar::_FinishedDrag(bool invoke) if (!invoke && fBarView->Dragging()) fBarView->DragStop(true); } + + +void +TExpandoMenuBar::_DoneTracking(BPoint point) +{ + TTeamMenuItem* lastItem = dynamic_cast(fLastClickedItem); + + if (!lastItem->ExpanderBounds().Contains(point)) + return; + + lastItem->ToggleExpandState(true); + lastItem->SetArrowDirection(lastItem->IsExpanded() + ? BControlLook::B_DOWN_ARROW + : BControlLook::B_RIGHT_ARROW); + + Invalidate(lastItem->ExpanderBounds()); +} + + +void +TExpandoMenuBar::_Track(BPoint point, uint32) +{ + TTeamMenuItem* lastItem = dynamic_cast(fLastClickedItem); + + if (lastItem->ExpanderBounds().Contains(point)) + lastItem->SetArrowDirection(BControlLook::B_RIGHT_DOWN_ARROW); + else { + lastItem->SetArrowDirection(lastItem->IsExpanded() + ? BControlLook::B_DOWN_ARROW + : BControlLook::B_RIGHT_ARROW); + } + + Invalidate(lastItem->ExpanderBounds()); +} diff --git a/src/apps/deskbar/ExpandoMenuBar.h b/src/apps/deskbar/ExpandoMenuBar.h index 6cb2b7d066..19e0627d07 100644 --- a/src/apps/deskbar/ExpandoMenuBar.h +++ b/src/apps/deskbar/ExpandoMenuBar.h @@ -104,6 +104,9 @@ private: void _FinishedDrag(bool invoke = false); + void _DoneTracking(BPoint where); + void _Track(BPoint where, uint32); + private: TBarView* fBarView; bool fVertical : 1; @@ -116,7 +119,6 @@ private: TTeamMenuItem* fPreviousDragTargetItem; BMenuItem* fLastMousedOverItem; BMenuItem* fLastClickedItem; - bool fClickedExpander; BList fTeamList; static bool sDoMonitor;