ScreenSaver: add live update of screensavers list.

Fixes #13956

Change-Id: Icfc26c1617541f030ece31d36f1e3bb0c2ec96b0
This commit is contained in:
Filip Maryjanski
2018-01-31 03:16:41 +00:00
committed by waddlesplash
parent 9dd4d2dd05
commit 51290f11aa
@@ -5,6 +5,7 @@
* Authors:
* Axel Dörfler, [email protected]
* Jérôme Duval, [email protected]
* Filip Maryjański, [email protected]
* Puck Meerburg, [email protected]
* Michael Phipps
* John Scipione, [email protected]
@@ -34,6 +35,7 @@
#include <LayoutBuilder.h>
#include <ListItem.h>
#include <ListView.h>
#include <NodeMonitor.h>
#include <Path.h>
#include <Rect.h>
#include <Roster.h>
@@ -171,6 +173,9 @@ private:
void _CloseSaver();
void _OpenSaver();
void _AddNewScreenSaverToList(const char* name,
BPath* path);
void _RemoveScreenSaverFromList(const char* name);
private:
ScreenSaverSettings& fSettings;
@@ -599,6 +604,8 @@ ModulesView::ModulesView(const char* name, ScreenSaverSettings& settings)
ModulesView::~ModulesView()
{
stop_watching(this);
delete fTestButton;
delete fSettingsBox;
delete fPreviewView;
@@ -691,6 +698,46 @@ ModulesView::MessageReceived(BMessage* message)
break;
}
case B_NODE_MONITOR:
{
switch (message->GetInt32("opcode", 0)) {
case B_ENTRY_CREATED:
{
const char* name;
node_ref nodeRef;
message->FindString("name", &name);
message->FindInt32("device", &nodeRef.device);
message->FindInt64("directory", &nodeRef.node);
BDirectory dir(&nodeRef);
if (dir.InitCheck() == B_OK) {
BPath path(&dir);
_AddNewScreenSaverToList(name, &path);
}
break;
}
case B_ENTRY_MOVED:
case B_ENTRY_REMOVED:
{
const char* name;
message->FindString("name", &name);
_RemoveScreenSaverFromList(name);
break;
}
default:
// ignore any other operations
break;
}
break;
}
case B_SOME_APP_QUIT:
{
team_id team;
@@ -757,6 +804,11 @@ ModulesView::PopulateScreenSaverList()
BDirectory dir(basePath.Path());
BEntry entry;
node_ref nodeRef;
dir.GetNodeRef(&nodeRef);
watch_node(&nodeRef, B_WATCH_DIRECTORY, this);
while (dir.GetNextEntry(&entry, true) == B_OK) {
char name[B_FILE_NAME_LENGTH];
if (entry.GetName(name) != B_OK)
@@ -882,6 +934,59 @@ ModulesView::_OpenSaver()
}
void
ModulesView::_AddNewScreenSaverToList(const char* name, BPath* path)
{
int32 oldSelected = fScreenSaversListView->CurrentSelection();
ScreenSaverItem* selectedItem = (ScreenSaverItem*)fScreenSaversListView->ItemAt(
oldSelected);
path->Append(name);
fScreenSaversListView->AddItem(new ScreenSaverItem(name, path->Path()));
fScreenSaversListView->SortItems(_CompareScreenSaverItems);
if (selectedItem != NULL) {
fScreenSaversListView->Select(fScreenSaversListView->IndexOf(
selectedItem));
fScreenSaversListView->ScrollToSelection();
}
}
void
ModulesView::_RemoveScreenSaverFromList(const char* name)
{
int32 oldSelected = fScreenSaversListView->CurrentSelection();
ScreenSaverItem* selectedItem = (ScreenSaverItem*)fScreenSaversListView->ItemAt(
oldSelected);
if (strcasecmp(selectedItem->Text(), name) == 0) {
fScreenSaversListView->RemoveItem(selectedItem);
fScreenSaversListView->SortItems(_CompareScreenSaverItems);
fScreenSaversListView->Select(0);
fScreenSaversListView->ScrollToSelection();
return;
}
for (int i = 0, max = fScreenSaversListView->CountItems(); i < max; i++) {
ScreenSaverItem* item = (ScreenSaverItem*)fScreenSaversListView->ItemAt(
i);
if (strcasecmp(item->Text(), name) == 0) {
fScreenSaversListView->RemoveItem(item);
delete item;
break;
}
}
fScreenSaversListView->SortItems(_CompareScreenSaverItems);
oldSelected = fScreenSaversListView->IndexOf(selectedItem);
fScreenSaversListView->Select(oldSelected);
fScreenSaversListView->ScrollToSelection();
}
// #pragma mark - TabView