diff --git a/src/kits/tracker/Commands.h b/src/kits/tracker/Commands.h index d40e69c65f..c2e19d3646 100644 --- a/src/kits/tracker/Commands.h +++ b/src/kits/tracker/Commands.h @@ -85,6 +85,10 @@ const uint32 kOpenParentDir = 'Topt'; const uint32 kOpenDir = 'Topd'; const uint32 kCleanup = 'Tcln'; const uint32 kCleanupAll = 'Tcla'; + +const uint32 kArrangeBy = 'ARBY'; +const uint32 kArrangeReverseOrder = 'ARRO'; + const uint32 kResizeToFit = 'Trtf'; const uint32 kSelectMatchingEntries = 'Tsme'; const uint32 kShowSelectionWindow = 'Tssw'; diff --git a/src/kits/tracker/ContainerWindow.cpp b/src/kits/tracker/ContainerWindow.cpp index f6a5d289ea..fb065e8b48 100644 --- a/src/kits/tracker/ContainerWindow.cpp +++ b/src/kits/tracker/ContainerWindow.cpp @@ -567,6 +567,7 @@ BContainerWindow::BContainerWindow(LockingList *list, fAttrMenu(NULL), fWindowMenu(NULL), fFileMenu(NULL), + fArrangeByMenu(NULL), fSelectionWindow(NULL), fTaskLoop(NULL), fIsTrash(false), @@ -886,6 +887,8 @@ BContainerWindow::RepopulateMenus() if (PoseView()->ViewMode() == kListMode) ShowAttributeMenu(); + PopulateArrangeByMenu(fArrangeByMenu); + int32 selectCount = PoseView()->SelectionList()->CountItems(); SetupOpenWithMenu(fFileMenu); @@ -1748,25 +1751,30 @@ BContainerWindow::SetPasteItem(BMenu *menu) void -BContainerWindow::SetCleanUpItem(BMenu *menu) +BContainerWindow::SetArrangeMenu(BMenu *menu) { BMenuItem *item; if ((item = menu->FindItem(kCleanup)) == NULL && (item = menu->FindItem(kCleanupAll)) == NULL) return; - item->SetEnabled(PoseView()->CountItems() > 0 + item->Menu()->SetEnabled(PoseView()->CountItems() > 0 && (PoseView()->ViewMode() != kListMode)); + BMenu* arrangeMenu; + if (modifiers() & B_SHIFT_KEY) { item->SetLabel(B_TRANSLATE("Clean up all")); item->SetShortcut('K', B_COMMAND_KEY | B_SHIFT_KEY); item->SetMessage(new BMessage(kCleanupAll)); + arrangeMenu = item->Menu(); } else { item->SetLabel(B_TRANSLATE("Clean up")); item->SetShortcut('K', B_COMMAND_KEY); item->SetMessage(new BMessage(kCleanup)); + arrangeMenu = item->Menu(); } + MarkArrangeByMenu(arrangeMenu); } @@ -1818,6 +1826,7 @@ BContainerWindow::AddMenus() // just create the attribute, decide to add it later fAttrMenu = new BMenu(B_TRANSLATE("Attributes")); NewAttributeMenu(fAttrMenu); + PopulateArrangeByMenu(fArrangeByMenu); } @@ -1977,9 +1986,8 @@ BContainerWindow::AddWindowMenu(BMenu *menu) item->SetTarget(this); menu->AddItem(item); - item = new BMenuItem(B_TRANSLATE("Clean up"), new BMessage(kCleanup), 'K'); - item->SetTarget(PoseView()); - menu->AddItem(item); + fArrangeByMenu = new BMenu(B_TRANSLATE("Arrange by")); + menu->AddItem(fArrangeByMenu); item = new BMenuItem(B_TRANSLATE("Select"B_UTF8_ELLIPSIS), new BMessage(kShowSelectionWindow), 'A', B_SHIFT_KEY); @@ -2744,8 +2752,11 @@ BContainerWindow::AddWindowContextMenus(BMenu *menu) menu->AddItem(pasteItem); menu->AddSeparatorItem(); #endif - menu->AddItem(new BMenuItem(B_TRANSLATE("Clean up"), - new BMessage(kCleanup), 'K')); + BMenu* arrangeBy = new BMenu(B_TRANSLATE("Arrange by")); + PopulateArrangeByMenu(arrangeBy); + + menu->AddItem(arrangeBy); + menu->AddItem(new BMenuItem(B_TRANSLATE("Select"B_UTF8_ELLIPSIS), new BMessage(kShowSelectionWindow), 'A', B_SHIFT_KEY)); menu->AddItem(new BMenuItem(B_TRANSLATE("Select all"), @@ -3055,7 +3066,7 @@ BContainerWindow::UpdateMenu(BMenu *menu, UpdateMenuContext context) MarkNamedMenuItem(menu, kMiniIconMode, viewMode == kMiniIconMode); SetCloseItem(menu); - SetCleanUpItem(menu); + SetArrangeMenu(menu); SetPasteItem(menu); EnableNamedMenuItem(menu, kOpenParentDir, !TargetModel()->IsRoot()); @@ -3257,6 +3268,26 @@ BContainerWindow::MarkAttributeMenu(BMenu *menu) } +void +BContainerWindow::MarkArrangeByMenu(BMenu* menu) +{ + if (!menu) + return; + + int32 count = menu->CountItems(); + for (int32 index = 0; index < count; index++) { + BMenuItem* item = menu->ItemAt(index); + if (item->Message()) { + uint32 attrHash; + if (item->Message()->FindInt32("attr_hash", (int32*)&attrHash) == B_OK) + item->SetMarked(PoseView()->PrimarySort() == attrHash); + else if (item->Command() == kArrangeReverseOrder) + item->SetMarked(PoseView()->ReverseSort()); + } + } +} + + void BContainerWindow::AddMimeTypesToMenu() { @@ -3991,6 +4022,44 @@ BContainerWindow::PulseTaskLoop() } +void +BContainerWindow::PopulateArrangeByMenu(BMenu* menu) +{ + if (!fAttrMenu || !menu) + return; + // empty fArrangeByMenu... + BMenuItem* item; + while ((item = menu->RemoveItem((int32)0)) != NULL) + delete item; + + int32 itemCount = fAttrMenu->CountItems(); + for (int32 i = 0; i < itemCount; i++) { + item = fAttrMenu->ItemAt(i); + if (item->Command() == kAttributeItem) { + BMessage* message = new BMessage(*(item->Message())); + message->what = kArrangeBy; + BMenuItem* newItem = new BMenuItem(item->Label(), message); + newItem->SetTarget(PoseView()); + menu->AddItem(newItem); + } + } + + menu->AddSeparatorItem(); + + item = new BMenuItem(B_TRANSLATE("Reverse order"), + new BMessage(kArrangeReverseOrder)); + + item->SetTarget(PoseView()); + menu->AddItem(item); + menu->AddSeparatorItem(); + + + item = new BMenuItem(B_TRANSLATE("Clean up"), new BMessage(kCleanup), 'K'); + item->SetTarget(PoseView()); + menu->AddItem(item); +} + + // #pragma mark - diff --git a/src/kits/tracker/ContainerWindow.h b/src/kits/tracker/ContainerWindow.h index dec7bc2b26..2d05ba1d7c 100644 --- a/src/kits/tracker/ContainerWindow.h +++ b/src/kits/tracker/ContainerWindow.h @@ -150,6 +150,7 @@ class BContainerWindow : public BWindow { void AddMimeTypesToMenu(); virtual void MarkAttributeMenu(BMenu *); void MarkAttributeMenu(); + void MarkArrangeByMenu(BMenu *); BMenuItem *NewAttributeMenuItem(const char *label, const char *name, int32 type, float width, int32 align, bool editable, bool statField); BMenuItem *NewAttributeMenuItem(const char *label, const char *name, @@ -216,11 +217,12 @@ class BContainerWindow : public BWindow { virtual void AddTrashContextMenus(BMenu *); virtual void RepopulateMenus(); + void PopulateArrangeByMenu(BMenu* ); virtual void SetCutItem(BMenu *); virtual void SetCopyItem(BMenu *); virtual void SetPasteItem(BMenu *); - virtual void SetCleanUpItem(BMenu *); + virtual void SetArrangeMenu(BMenu *); virtual void SetCloseItem(BMenu *); virtual void SetupNavigationMenu(const entry_ref *, BMenu *); virtual void SetupMoveCopyMenus(const entry_ref *, BMenu *); @@ -268,6 +270,7 @@ class BContainerWindow : public BWindow { BMenu *fAttrMenu; BMenu *fWindowMenu; BMenu *fFileMenu; + BMenu *fArrangeByMenu; SelectionWindow *fSelectionWindow; diff --git a/src/kits/tracker/PoseView.cpp b/src/kits/tracker/PoseView.cpp index d4dda49043..d5f6543567 100644 --- a/src/kits/tracker/PoseView.cpp +++ b/src/kits/tracker/PoseView.cpp @@ -2402,6 +2402,28 @@ BPoseView::MessageReceived(BMessage *message) be_clipboard->Unlock(); } break; + + case kArrangeBy: + { + uint32 attrHash; + if (message->FindInt32("attr_hash", (int32*)&attrHash) == B_OK) { + if (ColumnFor(attrHash) == NULL) + HandleAttrMenuItemSelected(message); + + if (PrimarySort() == attrHash) + attrHash = 0; + + SetPrimarySort(attrHash); + SetSecondarySort(0); + Cleanup(true); + } + break; + } + case kArrangeReverseOrder: + SetReverseSort(!fViewState->ReverseSort()); + Cleanup(true); + break; + case kAttributeItem: HandleAttrMenuItemSelected(message); break; @@ -2981,10 +3003,8 @@ BPoseView::SetViewMode(uint32 newMode) AddToVSList(pose); } - // sort poselist if we are switching to list mode - if (newMode == kListMode) - SortPoses(); - else + SortPoses(); + if (newMode != kListMode) RecalcExtent(); UpdateScrollRange();