Backgrounds preflet limited to 10 recent folders

Added recent folder limit as class member but
defaulted the value to 10.
Stopped using index to keep track of selected
path and folder menu item. Instead use BMessage to send
clicked folder path to the folder bg image loader.

Change-Id: I6b1809ff782db839ef43eb7169a7f6e77fb4ec70
Fixes #5026
This commit is contained in:
David Murphy
2018-06-26 00:56:51 +00:00
committed by waddlesplash
parent abb59d7351
commit 3d86db178e
2 changed files with 65 additions and 65 deletions
+62 -63
View File
@@ -73,6 +73,7 @@ BackgroundsView::BackgroundsView()
fCurrent(NULL),
fCurrentInfo(NULL),
fLastImageIndex(-1),
fRecentFoldersLimit(10),
fPathList(1, true),
fImageList(1, true),
fFoundPositionSetting(false)
@@ -147,8 +148,6 @@ BackgroundsView::BackgroundsView()
B_TRANSLATE("Current workspace"),
new BMessage(kMsgCurrentWorkspace)));
menuItem->SetMarked(true);
fLastWorkspaceIndex =
fWorkspaceMenu->IndexOf(fWorkspaceMenu->FindMarked());
fWorkspaceMenu->AddSeparatorItem();
fWorkspaceMenu->AddItem(new BMenuItem(B_TRANSLATE("Default folder"),
new BMessage(kMsgDefaultFolder)));
@@ -352,8 +351,6 @@ BackgroundsView::MessageReceived(BMessage* message)
case kMsgCurrentWorkspace:
case kMsgAllWorkspaces:
fImageMenu->FindItem(kMsgNoImage)->SetLabel(B_TRANSLATE("None"));
fLastWorkspaceIndex = fWorkspaceMenu->IndexOf(
fWorkspaceMenu->FindMarked());
if (fCurrent && fCurrent->IsDesktop()) {
_UpdateButtons();
} else {
@@ -364,8 +361,6 @@ BackgroundsView::MessageReceived(BMessage* message)
case kMsgDefaultFolder:
fImageMenu->FindItem(kMsgNoImage)->SetLabel(B_TRANSLATE("None"));
fLastWorkspaceIndex = fWorkspaceMenu->IndexOf(
fWorkspaceMenu->FindMarked());
_SetDesktop(false);
_LoadDefaultFolder();
break;
@@ -388,10 +383,6 @@ BackgroundsView::MessageReceived(BMessage* message)
_FindImageItem(fLastImageIndex)->SetMarked(true);
else
fImageMenu->ItemAt(0)->SetMarked(true);
} else if (pointer == fFolderPanel) {
if (fLastWorkspaceIndex >= 0)
fWorkspaceMenu->ItemAt(fLastWorkspaceIndex)
->SetMarked(true);
}
break;
}
@@ -405,15 +396,16 @@ BackgroundsView::MessageReceived(BMessage* message)
break;
case kMsgFolderSelected:
{
fImageMenu->FindItem(kMsgNoImage)->SetLabel(B_TRANSLATE("Default"));
fLastWorkspaceIndex = fWorkspaceMenu->IndexOf(
fWorkspaceMenu->FindMarked());
_SetDesktop(false);
_LoadRecentFolder(*fPathList.ItemAt(fWorkspaceMenu->IndexOf(
fWorkspaceMenu->FindMarked()) - 6));
BString folderPathStr;
if (message->FindString("folderPath", &folderPathStr) == B_OK) {
BPath folderPath(folderPathStr);
_LoadRecentFolder(folderPath);
}
break;
}
case kMsgApplySettings:
{
_Save();
@@ -830,27 +822,21 @@ BackgroundsView::_LoadSettings()
PRINT_OBJECT(fSettings);
BString string;
if (fSettings.FindString("paneldir", &string) == B_OK)
fPanel->SetPanelDirectory(string.String());
BString settingStr;
if (fSettings.FindString("paneldir", &settingStr) == B_OK)
fPanel->SetPanelDirectory(settingStr.String());
if (fSettings.FindString("folderpaneldir", &string) == B_OK)
fFolderPanel->SetPanelDirectory(string.String());
if (fSettings.FindString("folderpaneldir", &settingStr) == B_OK)
fFolderPanel->SetPanelDirectory(settingStr.String());
int32 index = 0;
while (fSettings.FindString("recentfolder", index, &string) == B_OK) {
if (index == 0)
fWorkspaceMenu->AddSeparatorItem();
path.SetTo(string.String());
int32 i = _AddPath(path);
BString s;
s << B_TRANSLATE("Folder: ") << path.Leaf();
BMenuItem* item = new BMenuItem(s.String(),
new BMessage(kMsgFolderSelected));
fWorkspaceMenu->AddItem(item, -i - 1 + 6);
while (fSettings.FindString("recentfolder", index, &settingStr) == B_OK) {
path.SetTo(settingStr.String());
_AddRecentFolder(path);
index++;
}
fWorkspaceMenu->ItemAt(1)->SetMarked(true);
fWorkspaceMenu->SetTargetForItems(this);
PRINT(("Settings Loaded\n"));
@@ -1043,46 +1029,59 @@ BackgroundsView::RefsReceived(BMessage* message)
BMessenger(this).SendMessage(kMsgCurrentWorkspace);
break;
}
BMenuItem* item;
int32 index = _AddPath(path);
if (index >= 0) {
item = fWorkspaceMenu->ItemAt(index + 6);
fLastWorkspaceIndex = index + 6;
} else {
if (fWorkspaceMenu->CountItems() <= 5)
fWorkspaceMenu->AddSeparatorItem();
BString s;
s << B_TRANSLATE("Folder: ") << path.Leaf();
item = new BMenuItem(s.String(),
new BMessage(kMsgFolderSelected));
fWorkspaceMenu->AddItem(item, -index - 1 + 6);
item->SetTarget(this);
fLastWorkspaceIndex = -index - 1 + 6;
}
item->SetMarked(true);
BMessenger(this).SendMessage(kMsgFolderSelected);
// Add the newly selected path as a recent folder,
// removing the oldest entry if needed
_AddRecentFolder(path, true);
}
}
}
int32
BackgroundsView::_AddPath(BPath path)
static BPath*
FindPath(BPath* currentPath, void* newPath)
{
int32 count = fPathList.CountItems();
int32 index = 0;
for (; index < count; index++) {
BPath* p = fPathList.ItemAt(index);
int c = BString(p->Path()).ICompare(path.Path());
if (c == 0)
return index;
BPath* pathToCheck = static_cast<BPath*>(newPath);
int compare = ICompare(currentPath->Path(), pathToCheck->Path());
return compare == 0 ? currentPath : NULL;
}
if (c > 0)
break;
void
BackgroundsView::_AddRecentFolder(BPath path, bool notifyApp = false)
{
BPath* currentPath = fPathList.EachElement(FindPath, &path);
BMenuItem* item;
BMessage* folderSelectedMsg = new BMessage(kMsgFolderSelected);
folderSelectedMsg->AddString("folderPath", path.Path());
if (currentPath == NULL) {
// "All Workspaces", "Current Workspace", "--", "Default folder",
// "Other folder...", If only these 5 exist,
// we need a new separator to add path specific recent folders.
if (fWorkspaceMenu->CountItems() <= 5)
fWorkspaceMenu->AddSeparatorItem();
// Maxed out the number of recent folders, remove the oldest entry
if (fPathList.CountItems() == fRecentFoldersLimit) {
fPathList.RemoveItemAt(0);
fWorkspaceMenu->RemoveItem(6);
}
// Add the new recent folder
BString folderMenuText(B_TRANSLATE("Folder: %path"));
folderMenuText.ReplaceFirst("%path", path.Leaf());
item = new BMenuItem(folderMenuText.String(), folderSelectedMsg);
fWorkspaceMenu->AddItem(item);
fPathList.AddItem(new BPath(path));
item->SetTarget(this);
} else {
int32 itemIndex = fPathList.IndexOf(currentPath);
item = fWorkspaceMenu->ItemAt(itemIndex + 6);
}
fPathList.AddItem(new BPath(path), index);
return -index - 1;
item->SetMarked(true);
if (notifyApp)
BMessenger(this).SendMessage(folderSelectedMsg);
}
@@ -130,7 +130,8 @@ protected:
void _UpdatePreview();
void _UpdateButtons();
void _SetDesktop(bool isDesktop);
int32 _AddPath(BPath path);
void _AddRecentFolder(BPath path,
bool notifyApp = false);
static int32 _NotifyThread(void* data);
@@ -159,7 +160,7 @@ protected:
entry_ref fCurrentRef;
int32 fLastImageIndex;
int32 fLastWorkspaceIndex;
int32 fRecentFoldersLimit;
BMessage fSettings;
BObjectList<BPath> fPathList;