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.
This commit is contained in:
John Scipione 2016-09-01 22:25:26 -07:00
parent 41b9b4ad9d
commit 8fdd2629eb
8 changed files with 136 additions and 27 deletions

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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
{

View File

@ -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));

View File

@ -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();

View File

@ -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 {

View File

@ -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;