From e70b6d957a03fbd24b6c47ad2668d23c11806912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Mon, 6 Apr 2009 18:18:12 +0000 Subject: [PATCH] * Cleanup in the icon mode stuff. kScaleIconMode is gone. There is simply kIconMode and it can have different sizes. * The "Icon Mode" super menu item is marked, when in icon mode, as well as the size item in it's sub menu. * When switching from mini icon mode or list mode back into icon mode, the previous icon size is now restored. This also works when the folder has been closed meanwhile. (The on-disk format for view state has changed, so your folders will open with default values.) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29971 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/tracker/ContainerWindow.cpp | 16 ++++--- src/kits/tracker/DeskWindow.cpp | 6 +-- src/kits/tracker/Pose.cpp | 6 +-- src/kits/tracker/PoseView.cpp | 63 ++++++++++++++-------------- src/kits/tracker/PoseView.h | 1 - src/kits/tracker/TextWidget.cpp | 5 +-- src/kits/tracker/ViewState.cpp | 14 ++++++- src/kits/tracker/ViewState.h | 21 +++++++++- 8 files changed, 77 insertions(+), 55 deletions(-) diff --git a/src/kits/tracker/ContainerWindow.cpp b/src/kits/tracker/ContainerWindow.cpp index d150ffe531..0ef1dd9f2e 100644 --- a/src/kits/tracker/ContainerWindow.cpp +++ b/src/kits/tracker/ContainerWindow.cpp @@ -1914,19 +1914,19 @@ BContainerWindow::AddWindowMenu(BMenu *menu) item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("size", 40); item = new BMenuItem("40 x 40", message); item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("size", 48); item = new BMenuItem("48 x 48", message); item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("size", 64); item = new BMenuItem("64 x 64", message); item->SetTarget(PoseView()); @@ -1934,13 +1934,13 @@ BContainerWindow::AddWindowMenu(BMenu *menu) iconSizeMenu->AddSeparatorItem(); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("scale", 0); item = new BMenuItem("Decrease Size", message, '-'); item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("scale", 1); item = new BMenuItem("Increase Size", message, '+'); item->SetTarget(PoseView()); @@ -2936,7 +2936,7 @@ BContainerWindow::UpdateMenu(BMenu *menu, UpdateMenuContext context) uint32 viewMode = PoseView()->ViewMode(); if (sizeMenu) { - if (viewMode == kIconMode || viewMode == kScaleIconMode) { + if (viewMode == kIconMode) { int32 iconSize = (int32)PoseView()->IconSizeInt(); for (int32 i = 0; BMenuItem* item = sizeMenu->ItemAt(i); i++) { BMessage* message = item->Message(); @@ -2953,10 +2953,8 @@ BContainerWindow::UpdateMenu(BMenu *menu, UpdateMenuContext context) for (int32 i = 0; BMenuItem* item = sizeMenu->ItemAt(i); i++) item->SetMarked(false); } - } else { - MarkNamedMenuItem(menu, kIconMode, viewMode == kIconMode); } - + MarkNamedMenuItem(menu, kIconMode, viewMode == kIconMode); MarkNamedMenuItem(menu, kListMode, viewMode == kListMode); MarkNamedMenuItem(menu, kMiniIconMode, viewMode == kMiniIconMode); diff --git a/src/kits/tracker/DeskWindow.cpp b/src/kits/tracker/DeskWindow.cpp index 205c23df24..25a977575a 100644 --- a/src/kits/tracker/DeskWindow.cpp +++ b/src/kits/tracker/DeskWindow.cpp @@ -271,21 +271,21 @@ BDeskWindow::AddWindowContextMenus(BMenu *menu) item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("size", 40); item = new BMenuItem("40 x 40", message); item->SetMarked(PoseView()->IconSizeInt() == 40); item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("size", 48); item = new BMenuItem("48 x 48", message); item->SetMarked(PoseView()->IconSizeInt() == 48); item->SetTarget(PoseView()); iconSizeMenu->AddItem(item); - message = new BMessage(kScaleIconMode); + message = new BMessage(kIconMode); message->AddInt32("size", 64); item = new BMenuItem("64 x 64", message); item->SetMarked(PoseView()->IconSizeInt() == 64); diff --git a/src/kits/tracker/Pose.cpp b/src/kits/tracker/Pose.cpp index 6d8e3d9e79..527d141917 100644 --- a/src/kits/tracker/Pose.cpp +++ b/src/kits/tracker/Pose.cpp @@ -450,8 +450,7 @@ BPose::PointInPose(const BPoseView *poseView, BPoint where) const { ASSERT(poseView->ViewMode() != kListMode); - if (poseView->ViewMode() == kIconMode - || poseView->ViewMode() == kScaleIconMode) { + if (poseView->ViewMode() == kIconMode) { // check icon rect, then actual icon pixel BRect rect(fLocation, fLocation); rect.right += poseView->IconSizeInt() - 1; @@ -880,8 +879,7 @@ BPose::CalcRect(const BPoseView *poseView) ASSERT(poseView->ViewMode() != kListMode); BRect rect; - if (poseView->ViewMode() == kIconMode - || poseView->ViewMode() == kScaleIconMode) { + if (poseView->ViewMode() == kIconMode) { rect.left = fLocation.x; rect.right = rect.left + poseView->IconSizeInt(); diff --git a/src/kits/tracker/PoseView.cpp b/src/kits/tracker/PoseView.cpp index a9113a3cf4..92fae6c8b9 100644 --- a/src/kits/tracker/PoseView.cpp +++ b/src/kits/tracker/PoseView.cpp @@ -929,7 +929,7 @@ BPoseView::SetIconPoseHeight() { switch (ViewMode()) { case kIconMode: - fViewState->SetIconSize(B_LARGE_ICON); + // IconSize should allready be set in MessageReceived() fIconPoseHeight = ceilf(IconSizeInt() + sFontHeight + 1); break; @@ -938,11 +938,6 @@ BPoseView::SetIconPoseHeight() fIconPoseHeight = ceilf(sFontHeight < IconSizeInt() ? IconSizeInt() : sFontHeight + 1); break; - case kScaleIconMode: - // IconSize should allready be set in MessageReceived() - fIconPoseHeight = ceilf(IconSizeInt() + sFontHeight + 1); - break; - default: fViewState->SetIconSize(B_MINI_ICON); fIconPoseHeight = fListElemHeight; @@ -961,11 +956,6 @@ BPoseView::GetLayoutInfo(uint32 mode, BPoint *grid, BPoint *offset) const break; case kIconMode: - grid->Set(60, 60); - offset->Set(20, 20); - break; - - case kScaleIconMode: grid->Set(IconSizeInt() + 28, IconSizeInt() + 28); offset->Set(20, 20); break; @@ -1727,7 +1717,6 @@ BPoseView::CreatePoses(Model **models, PoseInfo *poseInfoArray, int32 count, case kIconMode: case kMiniIconMode: - case kScaleIconMode: if (poseInfo->fInitedDirectory == -1LL || fAlwaysAutoPlace) { if (pose->HasLocation()) RemoveFromVSList(pose); @@ -2035,15 +2024,14 @@ BPoseView::MessageReceived(BMessage *message) pendingNodeMonitorCache.Add(message); break; - case kScaleIconMode: { + case kIconMode: { int32 size; int32 scale; if (message->FindInt32("size", &size) == B_OK) { if (size != (int32)IconSizeInt()) fViewState->SetIconSize(size); } else if (message->FindInt32("scale", &scale) == B_OK - && (fViewState->ViewMode() == kIconMode - || fViewState->ViewMode() == kScaleIconMode)) { + && fViewState->ViewMode() == kIconMode) { if (scale == 0 && (int32)IconSizeInt() != 32) { switch ((int32)IconSizeInt()) { case 40: @@ -2069,11 +2057,16 @@ BPoseView::MessageReceived(BMessage *message) break; } } - } else - break; // no change + } else { + int32 iconSize = fViewState->LastIconSize(); + if (iconSize < 32 || iconSize > 64) { + // uninitialized last icon size? + iconSize = 32; + } + fViewState->SetIconSize(iconSize); + } } // fall thru case kListMode: - case kIconMode: case kMiniIconMode: SetViewMode(message->what); break; @@ -2729,18 +2722,26 @@ BPoseView::ReadExtendedPoseInfo(Model *model) void BPoseView::SetViewMode(uint32 newMode) { - if (newMode == ViewMode() && newMode != kScaleIconMode) - return; + uint32 oldMode = ViewMode(); + uint32 lastIconSize = fViewState->LastIconSize(); + + if (newMode == oldMode) { + if (newMode != kIconMode || lastIconSize == fViewState->IconSize()) + return; + } ASSERT(!IsFilePanel()); uint32 lastIconMode = fViewState->LastIconMode(); - if (newMode != kListMode) + if (newMode != kListMode) { fViewState->SetLastIconMode(newMode); + if (oldMode == kIconMode) + fViewState->SetLastIconSize(fViewState->IconSize()); + } - uint32 oldMode = ViewMode(); fViewState->SetViewMode(newMode); + // toggle view layout between listmode and non-listmode, if necessary BContainerWindow *window = ContainerWindow(); if (oldMode == kListMode) { fTitleView->RemoveSelf(); @@ -2750,7 +2751,7 @@ BPoseView::SetViewMode(uint32 newMode) MoveBy(0, -(kTitleViewHeight + 1)); ResizeBy(0, kTitleViewHeight + 1); - } else if (ViewMode() == kListMode) { + } else if (newMode == kListMode) { MoveBy(0, kTitleViewHeight + 1); ResizeBy(0, -(kTitleViewHeight + 1)); @@ -2767,14 +2768,14 @@ BPoseView::SetViewMode(uint32 newMode) CommitActivePose(); SetIconPoseHeight(); - GetLayoutInfo(ViewMode(), &fGrid, &fOffset); + GetLayoutInfo(newMode, &fGrid, &fOffset); // see if we need to map icons into new mode - bool mapIcons; - if (fOkToMapIcons) - mapIcons = (ViewMode() != kListMode) && (ViewMode() != lastIconMode); - else - mapIcons = false; + bool mapIcons = false; + if (fOkToMapIcons) { + mapIcons = (newMode != kListMode) && (newMode != lastIconMode + || fViewState->IconSize() != lastIconSize); + } BPoint oldOffset; BPoint oldGrid; @@ -2784,7 +2785,7 @@ BPoseView::SetViewMode(uint32 newMode) BRect bounds(Bounds()); PoseList newPoseList(30); - if (ViewMode() != kListMode) { + if (newMode != kListMode) { int32 count = fPoseList->CountItems(); for (int32 index = 0; index < count; index++) { BPose *pose = fPoseList->ItemAt(index); @@ -2797,7 +2798,7 @@ BPoseView::SetViewMode(uint32 newMode) // update origin in case of a list <-> icon mode transition BPoint newOrigin; - if (ViewMode() == kListMode) + if (newMode == kListMode) newOrigin = fViewState->ListOrigin(); else newOrigin = fViewState->IconOrigin(); diff --git a/src/kits/tracker/PoseView.h b/src/kits/tracker/PoseView.h index 3c446e7cfa..d125744718 100644 --- a/src/kits/tracker/PoseView.h +++ b/src/kits/tracker/PoseView.h @@ -99,7 +99,6 @@ const int32 kListOffset = 20; const uint32 kMiniIconMode = 'Tmic'; const uint32 kIconMode = 'Ticn'; const uint32 kListMode = 'Tlst'; -const uint32 kScaleIconMode = 'Tsic'; // new mode for scaled icons const uint32 kCheckTypeahead = 'Tcty'; diff --git a/src/kits/tracker/TextWidget.cpp b/src/kits/tracker/TextWidget.cpp index 3675802a71..9c96045c47 100644 --- a/src/kits/tracker/TextWidget.cpp +++ b/src/kits/tracker/TextWidget.cpp @@ -159,8 +159,7 @@ BTextWidget::CalcRectCommon(BPoint poseLoc, const BColumn *column, result.bottom = poseLoc.y + (view->ListElemHeight() - 1); } else { - if (view->ViewMode() == kIconMode - || view->ViewMode() == kScaleIconMode) { + if (view->ViewMode() == kIconMode) { // large/scaled icon mode result.left = poseLoc.x + (view->IconSizeInt() - textWidth) / 2; } else { @@ -338,7 +337,6 @@ BTextWidget::StartEdit(BRect bounds, BPoseView *view, BPose *pose) rect.right = rect.left + textView->LineWidth() + 3; // center new width, if necessary if (view->ViewMode() == kIconMode - || view->ViewMode() == kScaleIconMode || view->ViewMode() == kListMode && fAlignment == B_ALIGN_CENTER) { rect.OffsetBy(bounds.Width() / 2 - rect.Width() / 2, 0); } @@ -366,7 +364,6 @@ BTextWidget::StartEdit(BRect bounds, BPoseView *view, BPose *pose) // configure text view switch (view->ViewMode()) { case kIconMode: - case kScaleIconMode: textView->SetAlignment(B_ALIGN_CENTER); break; diff --git a/src/kits/tracker/ViewState.cpp b/src/kits/tracker/ViewState.cpp index bf5d02c89d..5ca51cd139 100644 --- a/src/kits/tracker/ViewState.cpp +++ b/src/kits/tracker/ViewState.cpp @@ -70,6 +70,7 @@ const char *kViewStateSecondarySortAttrName = "ViewState:fSecondarySortAttr"; const char *kViewStateSecondarySortTypeName = "ViewState:fSecondarySortType"; const char *kViewStateReverseSortName = "ViewState:fReverseSort"; const char *kViewStateIconSizeName = "ViewState:fIconSize"; +const char *kViewStateLastIconSizeName = "ViewState:fLastIconSize"; static const int32 kColumnStateMinArchiveVersion = 21; @@ -280,6 +281,7 @@ BViewState::BViewState() fViewMode = kListMode; fLastIconMode = 0; fIconSize = 32; + fLastIconSize = 32; fListOrigin.Set(0, 0); fIconOrigin.Set(0, 0); fPrimarySortAttr = AttrHashString(kAttrStatName, B_STRING_TYPE); @@ -304,12 +306,14 @@ BViewState::BViewState(BMallocIO *stream, bool endianSwap) stream->Read(&fSecondarySortType, sizeof(uint32)); stream->Read(&fReverseSort, sizeof(bool)); stream->Read(&fIconSize, sizeof(uint32)); + stream->Read(&fLastIconSize, sizeof(uint32)); if (endianSwap) { PRINT(("endian swapping view state\n")); fViewMode = B_SWAP_INT32(fViewMode); fLastIconMode = B_SWAP_INT32(fLastIconMode); fIconSize = B_SWAP_INT32(fIconSize); + fLastIconSize = B_SWAP_INT32(fLastIconSize); swap_data(B_POINT_TYPE, &fListOrigin, sizeof(fListOrigin), B_SWAP_ALWAYS); swap_data(B_POINT_TYPE, &fIconOrigin, @@ -365,6 +369,7 @@ BViewState::ArchiveToStream(BMallocIO *stream) const stream->Write(&fSecondarySortType, sizeof(uint32)); stream->Write(&fReverseSort, sizeof(bool)); stream->Write(&fIconSize, sizeof(uint32)); + stream->Write(&fLastIconSize, sizeof(uint32)); } @@ -388,6 +393,8 @@ BViewState::ArchiveToMessage(BMessage &message) const static_cast(fSecondarySortType)); message.AddBool(kViewStateReverseSortName, fReverseSort); message.AddInt32(kViewStateIconSizeName, static_cast(fIconSize)); + message.AddInt32(kViewStateLastIconSizeName, + static_cast(fLastIconSize)); } @@ -432,6 +439,7 @@ BViewState::_StorePreviousState() fPreviousViewMode = fViewMode; fPreviousLastIconMode = fLastIconMode; fPreviousIconSize = fIconSize; + fPreviousLastIconSize = fLastIconSize; fPreviousListOrigin = fListOrigin; fPreviousIconOrigin = fIconOrigin; fPreviousPrimarySortAttr = fPrimarySortAttr; @@ -458,6 +466,10 @@ BViewState::_Sanitize(BViewState *state, bool fixOnly) state->fIconSize = 16; if (state->fIconSize > 64) state->fIconSize = 64; + if (state->fLastIconSize < 16) + state->fLastIconSize = 16; + if (state->fLastIconSize > 64) + state->fLastIconSize = 64; if (fixOnly) return state; @@ -466,12 +478,10 @@ BViewState::_Sanitize(BViewState *state, bool fixOnly) if ((state->fViewMode != kListMode && state->fViewMode != kIconMode && state->fViewMode != kMiniIconMode - && state->fViewMode != kScaleIconMode && state->fViewMode != 0) || (state->fLastIconMode != kListMode && state->fLastIconMode != kIconMode && state->fLastIconMode != kMiniIconMode - && state->fLastIconMode != kScaleIconMode && state->fLastIconMode != 0)) { PRINT(("Bad data instantiating ViewState, view mode %x, lastIconMode %x\n", state->fViewMode, state->fLastIconMode)); diff --git a/src/kits/tracker/ViewState.h b/src/kits/tracker/ViewState.h index b98b96faf7..33db7f9e66 100644 --- a/src/kits/tracker/ViewState.h +++ b/src/kits/tracker/ViewState.h @@ -96,7 +96,7 @@ class BColumn { }; -const int32 kViewStateArchiveVersion = 10; +const int32 kViewStateArchiveVersion = 11; // bump version when layout or size changes class BViewState { @@ -113,6 +113,7 @@ class BViewState { uint32 ViewMode() const; uint32 LastIconMode() const; uint32 IconSize() const; + uint32 LastIconSize() const; BPoint ListOrigin() const; BPoint IconOrigin() const; uint32 PrimarySort() const; @@ -124,6 +125,7 @@ class BViewState { void SetViewMode(uint32); void SetLastIconMode(uint32); void SetIconSize(uint32); + void SetLastIconSize(uint32); void SetListOrigin(BPoint); void SetIconOrigin(BPoint); void SetPrimarySort(uint32); @@ -140,6 +142,7 @@ class BViewState { uint32 fViewMode; uint32 fLastIconMode; uint32 fIconSize; + uint32 fLastIconSize; BPoint fListOrigin; BPoint fIconOrigin; uint32 fPrimarySortAttr; @@ -153,6 +156,7 @@ class BViewState { uint32 fPreviousViewMode; uint32 fPreviousLastIconMode; uint32 fPreviousIconSize; + uint32 fPreviousLastIconSize; BPoint fPreviousListOrigin; BPoint fPreviousIconOrigin; uint32 fPreviousPrimarySortAttr; @@ -268,6 +272,13 @@ BViewState::IconSize() const } +inline uint32 +BViewState::LastIconSize() const +{ + return fLastIconSize; +} + + inline BPoint BViewState::ListOrigin() const { @@ -336,6 +347,13 @@ BViewState::SetIconSize(uint32 size) } +inline void +BViewState::SetLastIconSize(uint32 size) +{ + fLastIconSize = size; +} + + inline void BViewState::SetListOrigin(BPoint newOrigin) { @@ -389,6 +407,7 @@ BViewState::StateNeedsSaving() return (fPreviousViewMode != fViewMode) || (fPreviousLastIconMode != fLastIconMode) || (fPreviousIconSize != fIconSize) + || (fPreviousLastIconSize != fLastIconSize) || (fPreviousListOrigin != fListOrigin) || (fPreviousIconOrigin != fIconOrigin) || (fPreviousPrimarySortAttr != fPrimarySortAttr)