diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index 017cbe0242..1eae671881 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -170,6 +170,12 @@ public: void SetTrackingHook(menu_tracking_hook hook, void* state); + // Reorder items + void SortItems(int (*compare)(const BMenuItem*, + const BMenuItem*)); + bool SwapItems(int32 indexA, int32 indexB); + bool MoveItem(int32 indexFrom, int32 indexTo); + private: friend class BMenuBar; friend class BSeparatorItem; diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 0268733492..bfc7b1936e 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -1439,6 +1439,56 @@ BMenu::SetTrackingHook(menu_tracking_hook func, void* state) } +// #pragma mark - Reorder item methods + + +void +BMenu::SortItems(int (*compare)(const BMenuItem*, const BMenuItem*)) +{ + fItems.SortItems((int (*)(const void*, const void*))compare); + InvalidateLayout(); + if (Window() != NULL && !Window()->IsHidden() && LockLooper()) { + _LayoutItems(0); + Invalidate(); + UnlockLooper(); + } +} + + +bool +BMenu::SwapItems(int32 indexA, int32 indexB) +{ + bool swapped = fItems.SwapItems(indexA, indexB); + if (swapped) { + InvalidateLayout(); + if (Window() != NULL && !Window()->IsHidden() && LockLooper()) { + _LayoutItems(std::min(indexA, indexB)); + Invalidate(); + UnlockLooper(); + } + } + + return swapped; +} + + +bool +BMenu::MoveItem(int32 indexFrom, int32 indexTo) +{ + bool moved = fItems.MoveItem(indexFrom, indexTo); + if (moved) { + InvalidateLayout(); + if (Window() != NULL && !Window()->IsHidden() && LockLooper()) { + _LayoutItems(std::min(indexFrom, indexTo)); + Invalidate(); + UnlockLooper(); + } + } + + return moved; +} + + void BMenu::_ReservedMenu3() {} void BMenu::_ReservedMenu4() {} void BMenu::_ReservedMenu5() {}