From beef38501a0f6c503d4b71136e947e50fa0db1b8 Mon Sep 17 00:00:00 2001 From: casey langen Date: Sat, 10 Oct 2020 01:50:37 -0700 Subject: [PATCH] Switch between library types without restarting the app via MasterLibrary pimpl-style implementation. --- src/core/library/MasterLibrary.cpp | 2 ++ src/core/library/MasterLibrary.h | 2 ++ src/musikcube/app/layout/MainLayout.cpp | 7 +++++++ src/musikcube/app/layout/MainLayout.h | 1 + src/musikcube/app/layout/SettingsLayout.cpp | 7 +++++-- src/musikcube/app/layout/SettingsLayout.h | 11 ++++++----- 6 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/core/library/MasterLibrary.cpp b/src/core/library/MasterLibrary.cpp index 808ee89cd..0b87595e1 100644 --- a/src/core/library/MasterLibrary.cpp +++ b/src/core/library/MasterLibrary.cpp @@ -121,6 +121,8 @@ void MasterLibrary::LoadDefaultLibrary() { this->wrappedLibrary->QueryCompleted.connect(this, &MasterLibrary::OnQueryCompleted); this->wrappedLibrary->ConnectionStateChanged.connect(this, &MasterLibrary::OnConectionStateChanged); } + + this->LibraryChanged(); } } diff --git a/src/core/library/MasterLibrary.h b/src/core/library/MasterLibrary.h index af38bc8a1..6528aae45 100644 --- a/src/core/library/MasterLibrary.h +++ b/src/core/library/MasterLibrary.h @@ -50,6 +50,8 @@ namespace musik { namespace core { namespace library { class MasterLibrary: public ILibrary, public sigslot::has_slots<> { public: + sigslot::signal0<> LibraryChanged; + MasterLibrary(); virtual ~MasterLibrary(); diff --git a/src/musikcube/app/layout/MainLayout.cpp b/src/musikcube/app/layout/MainLayout.cpp index 1b99a8079..25e03566d 100755 --- a/src/musikcube/app/layout/MainLayout.cpp +++ b/src/musikcube/app/layout/MainLayout.cpp @@ -111,6 +111,7 @@ MainLayout::MainLayout( this->prefs = Preferences::ForComponent("settings"); library->ConnectionStateChanged.connect(this, &MainLayout::OnLibraryConnectionStateChanged); + library->LibraryChanged.connect(this, &MainLayout::OnLibraryChanged); library->Indexer()->Started.connect(this, &MainLayout::OnIndexerStarted); library->Indexer()->Finished.connect(this, &MainLayout::OnIndexerFinished); library->Indexer()->Progress.connect(this, &MainLayout::OnIndexerProgress); @@ -302,6 +303,12 @@ void MainLayout::OnLibraryConnectionStateChanged(ILibrary::ConnectionState state } } +void MainLayout::OnLibraryChanged() { + this->playback.Stop(); + this->libraryLayout.reset(new LibraryLayout(playback, library)); + this->Layout(); +} + void MainLayout::OnIndexerStarted() { this->Post(message::IndexerStarted); } diff --git a/src/musikcube/app/layout/MainLayout.h b/src/musikcube/app/layout/MainLayout.h index 72956883a..b3037b6a8 100755 --- a/src/musikcube/app/layout/MainLayout.h +++ b/src/musikcube/app/layout/MainLayout.h @@ -75,6 +75,7 @@ namespace musik { void OnIndexerFinished(int count); void OnTrackChanged(size_t index, musik::core::TrackPtr track); void OnLibraryConnectionStateChanged(musik::core::ILibrary::ConnectionState state); + void OnLibraryChanged(); bool IsLibraryConnected(); diff --git a/src/musikcube/app/layout/SettingsLayout.cpp b/src/musikcube/app/layout/SettingsLayout.cpp index 086db8d31..6e677b650 100755 --- a/src/musikcube/app/layout/SettingsLayout.cpp +++ b/src/musikcube/app/layout/SettingsLayout.cpp @@ -161,7 +161,7 @@ static void setTransportType(TransportType type) { SettingsLayout::SettingsLayout( cursespp::App& app, - musik::core::ILibraryPtr library, + MasterLibraryPtr library, musik::core::audio::PlaybackService& playback) : LayoutBase() , app(app) @@ -215,7 +215,10 @@ void SettingsLayout::OnCheckboxChanged(cursespp::Checkbox* cb, bool checked) { } void SettingsLayout::OnLibraryTypeDropdownActivated(cursespp::TextLabel* label) { - SettingsOverlays::ShowLibraryTypeOverlay([this]() { this->LoadPreferences(); }); + SettingsOverlays::ShowLibraryTypeOverlay([this]() { + this->LoadPreferences(); + this->library->LoadDefaultLibrary(); + }); } void SettingsLayout::OnLocaleDropdownActivate(cursespp::TextLabel* label) { diff --git a/src/musikcube/app/layout/SettingsLayout.h b/src/musikcube/app/layout/SettingsLayout.h index 096c31e1d..2ea9f1530 100755 --- a/src/musikcube/app/layout/SettingsLayout.h +++ b/src/musikcube/app/layout/SettingsLayout.h @@ -48,13 +48,12 @@ #include #include +#include +#include #include #include -#include -#include - #include #include "LocalLibrarySettingsLayout.h" @@ -66,9 +65,11 @@ namespace musik { namespace cube { public sigslot::has_slots<> { public: + using MasterLibraryPtr = std::shared_ptr; + SettingsLayout( cursespp::App& app, - musik::core::ILibraryPtr library, + MasterLibraryPtr library, musik::core::audio::PlaybackService& playback); virtual ~SettingsLayout(); @@ -106,7 +107,7 @@ namespace musik { namespace cube { void OnAdvancedSettingsActivate(cursespp::TextLabel* label); cursespp::App& app; - musik::core::ILibraryPtr library; + MasterLibraryPtr library; musik::core::IIndexer* indexer; musik::core::audio::PlaybackService& playback;