From 8fdd2629ebdaba038f02d95bc4b0886fac4ccef4 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 1 Sep 2016 22:25:26 -0700 Subject: [PATCH] Tracker: 32x32 icon size option in list mode 16x16 is same old default 32x32 is new and fun Adjust start offset to depend on icon size Remove the kColumnStart variable and instead use StartOffset() method which calculates the column start offset based on the icon size. When you switch between icon sizes in list mode recalculate the first column width to make room for the icon or more text. Add some padding to list height in large icon mode. --- src/kits/tracker/ContainerWindow.cpp | 75 +++++++++++++++++++++++----- src/kits/tracker/OpenWithWindow.cpp | 2 +- src/kits/tracker/PoseView.cpp | 55 ++++++++++++++++---- src/kits/tracker/PoseView.h | 23 +++++++++ src/kits/tracker/QueryPoseView.cpp | 2 +- src/kits/tracker/TextWidget.cpp | 4 +- src/kits/tracker/TitleView.h | 1 - src/kits/tracker/Utilities.h | 1 + 8 files changed, 136 insertions(+), 27 deletions(-) diff --git a/src/kits/tracker/ContainerWindow.cpp b/src/kits/tracker/ContainerWindow.cpp index 34cf1ce6ad..b838be1e97 100644 --- a/src/kits/tracker/ContainerWindow.cpp +++ b/src/kits/tracker/ContainerWindow.cpp @@ -2019,11 +2019,29 @@ BContainerWindow::AddWindowMenu(BMenu* menu) item->SetTarget(PoseView()); menu->AddItem(item); - item = new BMenuItem(B_TRANSLATE("List view"), - new BMessage(kListMode), '3'); + BMenu* listViewMenu = new BMenu("List view"); + + message = new BMessage(kListMode); + message->AddInt32("icon_size", B_MINI_ICON); + item = new BMenuItem(listViewMenu, message); + item->SetShortcut('3', B_COMMAND_KEY); item->SetTarget(PoseView()); menu->AddItem(item); + message = new BMessage(kListMode); + message->AddInt32("icon_size", B_MINI_ICON); + item = new BMenuItem(B_TRANSLATE("Mini"), message); + item->SetTarget(PoseView()); + listViewMenu->AddItem(item); + + message = new BMessage(kListMode); + message->AddInt32("icon_size", B_LARGE_ICON); + item = new BMenuItem(B_TRANSLATE("Large"), message); + item->SetTarget(PoseView()); + listViewMenu->AddItem(item); + + listViewMenu->SetTargetForItems(PoseView()); + menu->AddSeparatorItem(); item = new BMenuItem(B_TRANSLATE("Resize to fit"), @@ -3120,31 +3138,62 @@ BContainerWindow::UpdateMenu(BMenu* menu, UpdateMenuContext context) } if (context == kMenuBarContext || context == kWindowPopUpContext) { - BMenu* sizeMenu = NULL; - if (BMenuItem* item = menu->FindItem(kIconMode)) { - sizeMenu = item->Submenu(); - } - uint32 viewMode = PoseView()->ViewMode(); - if (sizeMenu) { + + BMenu* iconSizeMenu = NULL; + if (BMenuItem* item = menu->FindItem(kIconMode)) + iconSizeMenu = item->Submenu(); + + if (iconSizeMenu != NULL) { if (viewMode == kIconMode) { - int32 iconSize = (int32)PoseView()->IconSizeInt(); - for (int32 i = 0; BMenuItem* item = sizeMenu->ItemAt(i); i++) { + int32 iconSize = PoseView()->IconSizeInt(); + BMenuItem* item = iconSizeMenu->ItemAt(0); + for (int32 i = 0; (item = iconSizeMenu->ItemAt(i)) != NULL; + i++) { BMessage* message = item->Message(); - if (!message) { + if (message == NULL) { item->SetMarked(false); continue; } int32 size; - if (message->FindInt32("size", &size) < B_OK) + if (message->FindInt32("size", &size) != B_OK) size = -1; item->SetMarked(iconSize == size); } } else { - for (int32 i = 0; BMenuItem* item = sizeMenu->ItemAt(i); i++) + BMenuItem* item; + for (int32 i = 0; (item = iconSizeMenu->ItemAt(i)) != NULL; i++) item->SetMarked(false); } } + + BMenu* listSizeMenu = NULL; + if (BMenuItem* item = menu->FindItem(kListMode)) + listSizeMenu = item->Submenu(); + + if (listSizeMenu != NULL) { + if (viewMode == kListMode) { + int32 iconSize = PoseView()->IconSizeInt(); + BMenuItem* item = listSizeMenu->ItemAt(0); + for (int32 i = 0; (item = listSizeMenu->ItemAt(i)) != NULL; + i++) { + BMessage* message = item->Message(); + if (message == NULL) { + item->SetMarked(false); + continue; + } + int32 size; + if (message->FindInt32("icon_size", &size) != B_OK) + size = -1; + item->SetMarked(iconSize == size); + } + } else { + BMenuItem* item; + for (int32 i = 0; (item = listSizeMenu->ItemAt(i)) != NULL; i++) + item->SetMarked(false); + } + } + MarkNamedMenuItem(menu, kIconMode, viewMode == kIconMode); MarkNamedMenuItem(menu, kListMode, viewMode == kListMode); MarkNamedMenuItem(menu, kMiniIconMode, viewMode == kMiniIconMode); diff --git a/src/kits/tracker/OpenWithWindow.cpp b/src/kits/tracker/OpenWithWindow.cpp index e3f57f685c..4320d549eb 100644 --- a/src/kits/tracker/OpenWithWindow.cpp +++ b/src/kits/tracker/OpenWithWindow.cpp @@ -806,7 +806,7 @@ OpenWithPoseView::SetUpDefaultColumnsIfNeeded() if (fColumnList->CountItems() != 0) return; - BColumn* nameColumn = new BColumn(B_TRANSLATE("Name"), kColumnStart, 125, + BColumn* nameColumn = new BColumn(B_TRANSLATE("Name"), StartOffset(), 125, B_ALIGN_LEFT, kAttrStatName, B_STRING_TYPE, true, true); fColumnList->AddItem(nameColumn); BColumn* relationColumn = new BColumn(B_TRANSLATE("Relation"), 180, 100, diff --git a/src/kits/tracker/PoseView.cpp b/src/kits/tracker/PoseView.cpp index 4df2190cec..d8e2cae610 100644 --- a/src/kits/tracker/PoseView.cpp +++ b/src/kits/tracker/PoseView.cpp @@ -349,11 +349,14 @@ BPoseView::InitCommon() PinPointToValidRange(origin); // init things related to laying out items - fListElemHeight = ceilf(sFontHeight) < 20 ? 20 : ceilf(sFontHeight * 1.1f); + SetIconPoseHeight(); GetLayoutInfo(ViewMode(), &fGrid, &fOffset); ResetPosePlacementHint(); + if (ViewMode() == kListMode) + SetListElemHeight(); + DisableScrollBars(); ScrollTo(origin); UpdateScrollRange(); @@ -615,7 +618,7 @@ BPoseView::SetUpDefaultColumnsIfNeeded() if (fColumnList->CountItems() != 0) return; - fColumnList->AddItem(new BColumn(B_TRANSLATE("Name"), kColumnStart, 145, + fColumnList->AddItem(new BColumn(B_TRANSLATE("Name"), StartOffset(), 145, B_ALIGN_LEFT, kAttrStatName, B_STRING_TYPE, true, true)); fColumnList->AddItem(new BColumn(B_TRANSLATE("Size"), 200, 80, B_ALIGN_RIGHT, kAttrStatSize, B_OFF_T_TYPE, true, false)); @@ -1018,10 +1021,13 @@ BPoseView::SetIconPoseHeight() IconSizeInt() ? IconSizeInt() : sFontHeight + 1); break; + case kListMode: default: - fViewState->SetIconSize(B_MINI_ICON); + { + SetListElemHeight(); fIconPoseHeight = fListElemHeight; break; + } } } @@ -2233,8 +2239,41 @@ BPoseView::MessageReceived(BMessage* message) } fViewState->SetIconSize(iconSize); } - } // fall thru + SetViewMode(message->what); + break; + } + case kListMode: + { + uint32 oldMode = fViewState->ViewMode(); + int32 oldIconSize = fViewState->IconSize(); + int32 iconSize; + if (message->FindInt32("icon_size", &iconSize) == B_OK) { + // sanatize + if ((icon_size)iconSize != B_LARGE_ICON) + iconSize = B_MINI_ICON; + } else + iconSize = B_MINI_ICON; + + fViewState->SetIconSize(iconSize); + SetViewMode(message->what); + + if (oldMode == kListMode && iconSize == oldIconSize) + break; + + if (iconSize == B_MINI_ICON) + ResizeColumn(FirstColumn(), FirstColumn()->Width() - B_MINI_ICON); + else + ResizeColumn(FirstColumn(), FirstColumn()->Width() + B_MINI_ICON); + + SetListElemHeight(); + Invalidate(); + if (fTitleView != NULL && !fTitleView->IsHidden()) + fTitleView->Invalidate(); + + break; + } + case kMiniIconMode: SetViewMode(message->what); break; @@ -2790,7 +2829,7 @@ BPoseView::AddColumn(BColumn* newColumn, const BColumn* after) offset = after->Offset() + after->Width() + kTitleColumnExtraMargin; afterColumnIndex = IndexOfColumn(after); } else { - offset = kColumnStart; + offset = StartOffset(); afterColumnIndex = CountColumns() - 1; } @@ -9550,8 +9589,7 @@ BPoseView::ResizeColumn(BColumn* column, float newSize, column->SetWidth(newSize); - float offset = kColumnStart; - + float offset = StartOffset(); int32 count = fColumnList->CountItems(); for (int32 index = 0; index < count; index++) { column = fColumnList->ItemAt(index); @@ -9609,9 +9647,8 @@ BPoseView::MoveColumnTo(BColumn* src, BColumn* dest) fColumnList->RemoveItem(src, false); fColumnList->AddItem(src, index); - float offset = kColumnStart; + float offset = StartOffset(); int32 count = fColumnList->CountItems(); - for (int32 index = 0; index < count; index++) { BColumn* column = fColumnList->ItemAt(index); column->SetOffset(offset); diff --git a/src/kits/tracker/PoseView.h b/src/kits/tracker/PoseView.h index 99ac238065..c920d0127f 100644 --- a/src/kits/tracker/PoseView.h +++ b/src/kits/tracker/PoseView.h @@ -224,6 +224,7 @@ public: // returns height, descent, etc. float FontHeight() const; float ListElemHeight() const; + void SetListElemHeight(); void SetIconPoseHeight(); float IconPoseHeight() const; @@ -266,6 +267,9 @@ public: int32 IndexOfColumn(const BColumn*) const; int32 CountColumns() const; + // Where to start the first column + float StartOffset() const; + // pose access int32 IndexOfPose(const BPose*) const; BPose* PoseAtIndex(int32 index) const; @@ -861,6 +865,18 @@ BPoseView::ListElemHeight() const } +inline void +BPoseView::SetListElemHeight() +{ + float extra = 0; + if (IconSize() > B_MINI_ICON) + extra = kLargeIconSeparator; + + fListElemHeight = std::max((float)IconSize() + extra, + ceilf(sFontHeight) < 20 ? 20 : ceilf(sFontHeight * 1.1f)); +} + + inline float BPoseView::IconPoseHeight() const { @@ -1057,6 +1073,13 @@ BPoseView::CountColumns() const } +inline float +BPoseView::StartOffset() const +{ + return kListOffset + IconSizeInt() + kMiniIconSeparator + 1; +} + + inline int32 BPoseView::IndexOfColumn(const BColumn* column) const { diff --git a/src/kits/tracker/QueryPoseView.cpp b/src/kits/tracker/QueryPoseView.cpp index 7d80612668..4396bdcf2b 100644 --- a/src/kits/tracker/QueryPoseView.cpp +++ b/src/kits/tracker/QueryPoseView.cpp @@ -128,7 +128,7 @@ BQueryPoseView::SetUpDefaultColumnsIfNeeded() if (fColumnList->CountItems() != 0) return; - fColumnList->AddItem(new BColumn(B_TRANSLATE("Name"), kColumnStart, 145, + fColumnList->AddItem(new BColumn(B_TRANSLATE("Name"), StartOffset(), 145, B_ALIGN_LEFT, kAttrStatName, B_STRING_TYPE, true, true)); fColumnList->AddItem(new BColumn(B_TRANSLATE("Location"), 200, 225, B_ALIGN_LEFT, kAttrPath, B_STRING_TYPE, true, false)); diff --git a/src/kits/tracker/TextWidget.cpp b/src/kits/tracker/TextWidget.cpp index edfbd21cb9..9a6533283c 100644 --- a/src/kits/tracker/TextWidget.cpp +++ b/src/kits/tracker/TextWidget.cpp @@ -175,7 +175,8 @@ BTextWidget::CalcRectCommon(BPoint poseLoc, const BColumn* column, break; } - result.bottom = poseLoc.y + (view->ListElemHeight() - 1); + result.bottom = poseLoc.y + + roundf((view->ListElemHeight() + view->FontHeight()) / 2); } else { if (view->ViewMode() == kIconMode) { // large/scaled icon mode @@ -187,7 +188,6 @@ BTextWidget::CalcRectCommon(BPoint poseLoc, const BColumn* column, result.right = result.left + textWidth; result.bottom = poseLoc.y + view->IconPoseHeight(); - } result.top = result.bottom - view->FontHeight(); diff --git a/src/kits/tracker/TitleView.h b/src/kits/tracker/TitleView.h index 4ce1b4fb19..ab65772f67 100644 --- a/src/kits/tracker/TitleView.h +++ b/src/kits/tracker/TitleView.h @@ -57,7 +57,6 @@ const int32 kTitleColumnExtraMargin = kTitleColumnLeftExtraMargin + kTitleColumnRightExtraMargin; const int32 kMinColumnWidth = 20; const int32 kRemoveTitleMargin = 10; -const int32 kColumnStart = 40; class BTitleView : public BView { diff --git a/src/kits/tracker/Utilities.h b/src/kits/tracker/Utilities.h index ab0d708142..a3557a4b77 100644 --- a/src/kits/tracker/Utilities.h +++ b/src/kits/tracker/Utilities.h @@ -79,6 +79,7 @@ const int64 kGBSize = 1073741824; const int64 kTBSize = kGBSize * kKBSize; const int32 kMiniIconSeparator = 3; +const int32 kLargeIconSeparator = 6; const color_space kDefaultIconDepth = B_RGBA32;