* 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
This commit is contained in:
Stephan Aßmus 2009-04-06 18:18:12 +00:00
parent 8ce14887cb
commit e70b6d957a
8 changed files with 77 additions and 55 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<int32>(fSecondarySortType));
message.AddBool(kViewStateReverseSortName, fReverseSort);
message.AddInt32(kViewStateIconSizeName, static_cast<int32>(fIconSize));
message.AddInt32(kViewStateLastIconSizeName,
static_cast<int32>(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));

View File

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