From 4875d5a09172e873caa55fe60039e0db80e64fde Mon Sep 17 00:00:00 2001 From: John Scipione Date: Tue, 8 Oct 2013 20:23:59 -0400 Subject: [PATCH] DeskBar: refactor expander code. With the Tracker thread code in shared now it is possible to use the same trick for the expanders in Deskbar to open and close in a separate thread that we use in Tracker. See Find Panel and Info window for examples of the code being used in Tracker. Also eliminates the fClickedExpander variable and allow you to expand with any mouse button. Hopefully fixes #9676 --- src/apps/deskbar/ExpandoMenuBar.cpp | 156 +++++++--------------------- src/apps/deskbar/ExpandoMenuBar.h | 4 +- 2 files changed, 42 insertions(+), 118 deletions(-) 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;