From 51290f11aac75e138b0ef8a1a3106e3a63e190ff Mon Sep 17 00:00:00 2001 From: Filip Maryjanski Date: Mon, 22 Jan 2018 11:51:01 +0000 Subject: [PATCH] ScreenSaver: add live update of screensavers list. Fixes #13956 Change-Id: Icfc26c1617541f030ece31d36f1e3bb0c2ec96b0 --- .../screensaver/ScreenSaverWindow.cpp | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/src/preferences/screensaver/ScreenSaverWindow.cpp b/src/preferences/screensaver/ScreenSaverWindow.cpp index 38e02a4c48..49a8d5aca3 100644 --- a/src/preferences/screensaver/ScreenSaverWindow.cpp +++ b/src/preferences/screensaver/ScreenSaverWindow.cpp @@ -5,6 +5,7 @@ * Authors: * Axel Dörfler, axeld@pinc-software.de * Jérôme Duval, jerome.duval@free.fr + * Filip Maryjański, widelec@morphos.pl * Puck Meerburg, puck@puckipedia.nl * Michael Phipps * John Scipione, jscipione@gmail.com @@ -34,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -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