diff --git a/meson.build b/meson.build index 06e5a5a..a2203d1 100755 --- a/meson.build +++ b/meson.build @@ -120,10 +120,6 @@ wx_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON', 'wxUSE_LIBSDL': 'OFF', 'wxUSE_MEDIACTRL': 'ON'}) -if host_sys == 'windows' - wx_opts.set_override_option('b_lto', 'false') -endif - taglib_opts = cmake.subproject_options() taglib_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON', 'CMAKE_INSTALL_PREFIX': prefix, @@ -158,6 +154,14 @@ snd_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON', 'ENABLE_EXTERNAL_LIBS': 'ON', 'ENABLE_MPEG': 'ON'}) +# Disable link time optimization if host is Windows +if host_sys == 'windows' + wx_opts.set_override_option('b_lto', 'false') + taglib_opts.set_override_option('b_lto', 'false') + yaml_opts.set_override_option('b_lto', 'false') + snd_opts.set_override_option('b_lto', 'false') +endif + # Source files to be compiled src = [ diff --git a/src/App.cpp b/src/App.cpp index 6c0e9d8..83d9394 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -40,7 +40,18 @@ cApp::cApp() cApp::~cApp() { + SampleHive::cSerializer serializer; + if (serializer.DeserializeDemoMode()) + { + if (wxFileExists("tempdb.db")) + if (wxRemoveFile("tempdb.db")) + SH_LOG_WARN("Deleted temporary database file.."); + else + SH_LOG_ERROR("Could not delete file.."); + else + SH_LOG_DEBUG("File doesn't exists"); + } } bool cApp::OnInit() diff --git a/src/Database/Database.cpp b/src/Database/Database.cpp index 2633f1d..b09012e 100644 --- a/src/Database/Database.cpp +++ b/src/Database/Database.cpp @@ -21,6 +21,7 @@ #include "Database/Database.hpp" #include "Utility/Log.hpp" #include "Utility/Paths.hpp" +#include "Utility/Serialize.hpp" #include #include @@ -81,7 +82,12 @@ class Sqlite3Statement cDatabase::cDatabase() { - OpenDatabase(); + SampleHive::cSerializer serializer; + + if (!serializer.DeserializeDemoMode()) + OpenDatabase(); + else + OpenTemporaryDatabase(); } cDatabase::~cDatabase() @@ -111,10 +117,22 @@ void cDatabase::CreateTableSamples() throw_on_sqlite3_error(sqlite3_exec(m_pDatabase, samples, NULL, 0, &m_pErrMsg)); SH_LOG_INFO("SAMPLES table created successfully."); } - catch (const std::exception &e) + catch (const std::exception& e) { show_modal_dialog_and_log("Error! Cannot create SAMPLES table", "Error", e.what()); } + + const auto indices = "CREATE INDEX IF NOT EXISTS idx_filename_path ON SAMPLES(FILENAME, PATH);"; + + try + { + throw_on_sqlite3_error(sqlite3_exec(m_pDatabase, indices, NULL, 0, &m_pErrMsg)); + SH_LOG_INFO("FILENAME PATH index created successfully."); + } + catch (const std::exception& e) + { + show_modal_dialog_and_log("Error! Cannot create INDEX Filename Path", "Error", e.what()); + } } void cDatabase::CreateTableHives() @@ -469,6 +487,24 @@ void cDatabase::RemoveHiveFromDatabase(const std::string &hiveName) } } +void cDatabase::DeleteAllSamples() +{ + try + { + const auto sql = "DELETE FROM SAMPLES;"; + + Sqlite3Statement statement(m_pDatabase, sql); + + throw_on_sqlite3_error(sqlite3_exec(m_pDatabase, sql, NULL, 0, &m_pErrMsg)); + + SH_LOG_INFO("All Samples deleted."); + } + catch (const std::exception &e) + { + show_modal_dialog_and_log("Error! Could not delete samples.", "Error!", e.what()); + } +} + std::string cDatabase::GetSamplePathByFilename(const std::string &filename) { std::string path; @@ -1003,6 +1039,12 @@ void cDatabase::OpenDatabase() throw_on_sqlite3_error(sqlite3_open(static_cast(DATABASE_FILEPATH).c_str(), &m_pDatabase)); } +void cDatabase::OpenTemporaryDatabase() +{ + SH_LOG_WARN("Creating temporary in memory database, all samples will be deleted on application exit."); + throw_on_sqlite3_error(sqlite3_open("tempdb.db", &m_pDatabase)); +} + void cDatabase::CloseDatabase() { throw_on_sqlite3_error(sqlite3_close(m_pDatabase)); diff --git a/src/Database/Database.hpp b/src/Database/Database.hpp index 4020c2f..cdde7b0 100644 --- a/src/Database/Database.hpp +++ b/src/Database/Database.hpp @@ -51,6 +51,8 @@ class cDatabase void OpenDatabase(); void CloseDatabase(); + void OpenTemporaryDatabase(); + public: // ------------------------------------------------------------------- // Create the table @@ -89,6 +91,8 @@ class cDatabase void RemoveSampleFromDatabase(const std::string& filename); void RemoveHiveFromDatabase(const std::string& hiveName); + void DeleteAllSamples(); + // ------------------------------------------------------------------- wxVector> LoadSamplesDatabase(wxDataViewTreeCtrl& favorite_tree, wxDataViewItem& favorite_item, diff --git a/src/GUI/DirectoryBrowser.cpp b/src/GUI/DirectoryBrowser.cpp index 1181570..8bd643b 100644 --- a/src/GUI/DirectoryBrowser.cpp +++ b/src/GUI/DirectoryBrowser.cpp @@ -18,14 +18,20 @@ * along with this program. If not, see . */ +#include "Database/Database.hpp" #include "GUI/DirectoryBrowser.hpp" #include "Utility/ControlIDs.hpp" +#include "Utility/HiveData.hpp" #include "Utility/Log.hpp" #include "Utility/Paths.hpp" +#include "Utility/Sample.hpp" +#include "Utility/Serialize.hpp" #include "Utility/Utils.hpp" #include +#include #include +#include cDirectoryBrowser::cDirectoryBrowser(wxWindow* window) : wxGenericDirCtrl(window, SampleHive::ID::BC_DirCtrl, wxDirDialogDefaultFolderStr, wxDefaultPosition, @@ -38,6 +44,7 @@ cDirectoryBrowser::cDirectoryBrowser(wxWindow* window) Bind(wxEVT_DIRCTRL_FILEACTIVATED, &cDirectoryBrowser::OnClickDirCtrl, this, SampleHive::ID::BC_DirCtrl); Bind(wxEVT_TREE_BEGIN_DRAG, &cDirectoryBrowser::OnDragFromDirCtrl, this, this->GetTreeCtrl()->GetId()); + Bind(wxEVT_TREE_ITEM_ACTIVATED, &cDirectoryBrowser::OnDirCtrlExpanded, this, this->GetTreeCtrl()->GetId()); } void cDirectoryBrowser::OnClickDirCtrl(wxCommandEvent& event) @@ -76,6 +83,51 @@ void cDirectoryBrowser::OnDragFromDirCtrl(wxTreeEvent& event) LogDragResult(drop_source.DoDragDrop()); } +void cDirectoryBrowser::OnDirCtrlExpanded(wxTreeEvent& event) +{ + cDatabase db; + SampleHive::cSerializer serializer; + + if (serializer.DeserializeDemoMode()) + { + wxBusyCursor busy_cursor; + wxWindowDisabler window_disabler; + + wxString filepath; + wxArrayString filepath_array; + + const wxString pathToDirectory = this->GetPath(event.GetItem()); + + size_t number_of_files = wxDir::GetAllFiles(pathToDirectory, &filepath_array, wxEmptyString, wxDIR_FILES); + + for (size_t i = 0; i < number_of_files; i++) + { + filepath = filepath_array[i]; + + if (wxFileExists(filepath)) + { + filepath_array.push_back(filepath); + } + else if (wxDirExists(filepath)) + { + wxDir::GetAllFiles(filepath, &filepath_array); + } + } + + // Delete all Files + if (SampleHive::cHiveData::Get().GetListCtrlItemCount() >= 1) + { + db.DeleteAllSamples(); + SampleHive::cHiveData::Get().ListCtrlDeleteAllItems(); + } + + SampleHive::cUtils::Get().AddSamples(filepath_array, this); + + } + else + event.Veto(); +} + cDirectoryBrowser::~cDirectoryBrowser() { diff --git a/src/GUI/DirectoryBrowser.hpp b/src/GUI/DirectoryBrowser.hpp index 626b010..460caf2 100644 --- a/src/GUI/DirectoryBrowser.hpp +++ b/src/GUI/DirectoryBrowser.hpp @@ -35,6 +35,7 @@ class cDirectoryBrowser : public wxGenericDirCtrl // DirCtrl event handlers void OnClickDirCtrl(wxCommandEvent& event); void OnDragFromDirCtrl(wxTreeEvent& event); + void OnDirCtrlExpanded(wxTreeEvent& event); private: wxWindow* m_pWindow = nullptr; diff --git a/src/GUI/MainFrame.cpp b/src/GUI/MainFrame.cpp index a3aa574..406f4e9 100644 --- a/src/GUI/MainFrame.cpp +++ b/src/GUI/MainFrame.cpp @@ -76,6 +76,7 @@ cMainFrame::cMainFrame() m_pEditMenu->Append(wxID_PREFERENCES, _("Preferences\tCtrl+P"), _("Open preferences dialog")); // View menu items + m_pDemoMode = new wxMenuItem(m_pViewMenu, wxID_ANY, _("Demo mode"), _("Toggle demo mode On/Off"), wxITEM_CHECK); m_pToggleExtension = new wxMenuItem(m_pViewMenu, SampleHive::ID::MN_ToggleExtension, _("Toggle Extension\tCtrl+E"), _("Show/Hide Extension"), wxITEM_CHECK); m_pToggleMenuBar = new wxMenuItem(m_pViewMenu, SampleHive::ID::MN_ToggleMenuBar, @@ -83,6 +84,7 @@ cMainFrame::cMainFrame() m_pToggleStatusBar = new wxMenuItem(m_pViewMenu, SampleHive::ID::MN_ToggleStatusBar, _("Toggle Status Bar\tCtrl+B"), _("Show/Hide Status Bar"), wxITEM_CHECK); + m_pViewMenu->Append(m_pDemoMode)->Check(false); m_pViewMenu->Append(m_pToggleExtension)->Check(true); m_pViewMenu->Append(m_pToggleMenuBar)->Check(m_pMenuBar->IsShown()); m_pViewMenu->Append(m_pToggleStatusBar)->Check(m_pStatusBar->IsShown()); @@ -153,6 +155,7 @@ cMainFrame::cMainFrame() // Binding events. Bind(wxEVT_MENU, &cMainFrame::OnSelectAddFile, this, SampleHive::ID::MN_AddFile); Bind(wxEVT_MENU, &cMainFrame::OnSelectAddDirectory, this, SampleHive::ID::MN_AddDirectory); + Bind(wxEVT_MENU, &cMainFrame::OnSelectToggleDemoMode, this, m_pDemoMode->GetId()); Bind(wxEVT_MENU, &cMainFrame::OnSelectToggleExtension, this, SampleHive::ID::MN_ToggleExtension); Bind(wxEVT_MENU, &cMainFrame::OnSelectToggleMenuBar, this, SampleHive::ID::MN_ToggleMenuBar); Bind(wxEVT_MENU, &cMainFrame::OnSelectToggleStatusBar, this, SampleHive::ID::MN_ToggleStatusBar); @@ -199,8 +202,9 @@ cMainFrame::cMainFrame() m_pTopPanelMainSizer->SetSizeHints(m_pTopPanel); m_pTopPanelMainSizer->Layout(); - // Restore the data previously added to Library - LoadDatabase(); + // Restore the data previously added to Library only if demo mode is disabled + if (!m_bDemoMode) + LoadDatabase(); // Set some properites after the frame has been created CallAfter(&cMainFrame::SetAfterFrameCreate); @@ -343,12 +347,13 @@ void cMainFrame::LoadConfigFile() m_bShowMenuBar = serializer.DeserializeShowMenuAndStatusBar("menubar"); m_bShowStatusBar = serializer.DeserializeShowMenuAndStatusBar("statusbar"); + m_bDemoMode = serializer.DeserializeDemoMode(); m_pToggleMenuBar->Check(m_bShowMenuBar); m_pMenuBar->Show(m_bShowMenuBar); m_pToggleStatusBar->Check(m_bShowStatusBar); m_pStatusBar->Show(m_bShowStatusBar); - + m_pDemoMode->Check(m_bDemoMode); m_pToggleExtension->Check(serializer.DeserializeShowFileExtension()); this->SetFont(serializer.DeserializeFontSettings()); @@ -546,6 +551,28 @@ void cMainFrame::OnSelectAddDirectory(wxCommandEvent& event) } } +void cMainFrame::OnSelectToggleDemoMode(wxCommandEvent& event) +{ + SampleHive::cSerializer serializer; + + if (m_pDemoMode->IsChecked()) + { + serializer.SerializeDemoMode(true); + m_pLibrary->GetInfoBarObject()->ShowMessage(_("Demo mode toggled on, " + "please restart the app for changes take effect"), wxICON_INFORMATION); + + m_bDemoMode = true; + } + else + { + serializer.SerializeDemoMode(false); + m_pLibrary->GetInfoBarObject()->ShowMessage(_("Demo mode toggled off, " + "please restart the app for changes take effect"), wxICON_INFORMATION); + + m_bDemoMode = false; + } +} + void cMainFrame::OnSelectToggleExtension(wxCommandEvent& event) { SampleHive::cSerializer serializer; @@ -919,7 +946,9 @@ void cMainFrame::InitDatabase() { m_pDatabase = std::make_unique(); m_pDatabase->CreateTableSamples(); - m_pDatabase->CreateTableHives(); + + if (!m_bDemoMode) + m_pDatabase->CreateTableHives(); } catch (std::exception& e) { diff --git a/src/GUI/MainFrame.hpp b/src/GUI/MainFrame.hpp index 4f4a853..6d30fbf 100644 --- a/src/GUI/MainFrame.hpp +++ b/src/GUI/MainFrame.hpp @@ -59,6 +59,7 @@ class cMainFrame : public wxFrame // App menu items event handlers void OnSelectAddFile(wxCommandEvent& event); void OnSelectAddDirectory(wxCommandEvent& event); + void OnSelectToggleDemoMode(wxCommandEvent& event); void OnSelectToggleExtension(wxCommandEvent& event); void OnSelectToggleMenuBar(wxCommandEvent& event); void OnSelectToggleStatusBar(wxCommandEvent& event); @@ -153,6 +154,7 @@ class cMainFrame : public wxFrame wxMenuItem* m_pToggleExtension = nullptr; wxMenuItem* m_pToggleMenuBar = nullptr; wxMenuItem* m_pToggleStatusBar = nullptr; + wxMenuItem* m_pDemoMode = nullptr; // ------------------------------------------------------------------- // Splitter windows @@ -198,4 +200,5 @@ class cMainFrame : public wxFrame bool m_bShowMenuBar = false; bool m_bShowStatusBar = false; bool m_bLoopPointsSet = false; + bool m_bDemoMode = false; }; diff --git a/src/Utility/Serialize.cpp b/src/Utility/Serialize.cpp index 251ab39..3135ef7 100644 --- a/src/Utility/Serialize.cpp +++ b/src/Utility/Serialize.cpp @@ -69,6 +69,11 @@ namespace SampleHive { m_Emitter << YAML::Key << "ShowStatusBar" << YAML::Value << true; m_Emitter << YAML::EndMap << YAML::Newline; + m_Emitter << YAML::Newline << YAML::Key << "General"; + m_Emitter << YAML::BeginMap; + m_Emitter << YAML::Key << "DemoMode" << YAML::Value << false; + m_Emitter << YAML::EndMap << YAML::Newline; + m_Emitter << YAML::Newline << YAML::Key << "Media"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Autoplay" << YAML::Value << false; @@ -806,4 +811,57 @@ namespace SampleHive { return show_extension; } + void cSerializer::SerializeDemoMode(bool showDemoMode) + { + YAML::Emitter out; + + try + { + YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); + + if (auto general = config["General"]) + { + general["DemoMode"] = showDemoMode; + + out << config; + + std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); + ofstrm << out.c_str(); + } + else + { + SH_LOG_ERROR("Error! Cannot store show demo mode value."); + } + } + catch (const YAML::ParserException& ex) + { + SH_LOG_ERROR(ex.what()); + } + } + + bool cSerializer::DeserializeDemoMode() const + { + bool show_demo_mode = false; + + try + { + YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); + + if (auto general = config["General"]) + { + show_demo_mode = general["DemoMode"].as(); + } + else + { + SH_LOG_ERROR("Error! Cannot fetch show demo mode value."); + } + } + catch (const YAML::ParserException& ex) + { + SH_LOG_ERROR(ex.what()); + } + + return show_demo_mode; + } + } diff --git a/src/Utility/Serialize.hpp b/src/Utility/Serialize.hpp index 0c1bba3..6ae7f77 100644 --- a/src/Utility/Serialize.hpp +++ b/src/Utility/Serialize.hpp @@ -109,6 +109,10 @@ namespace SampleHive { void SerializeShowFileExtension(bool showExtension); bool DeserializeShowFileExtension() const; + // Demo mode + void SerializeDemoMode(bool showDemoMode); + bool DeserializeDemoMode() const; + private: // ------------------------------------------------------------------- YAML::Emitter m_Emitter; diff --git a/src/Utility/Utils.cpp b/src/Utility/Utils.cpp index 8c13dfc..6e51bcc 100644 --- a/src/Utility/Utils.cpp +++ b/src/Utility/Utils.cpp @@ -88,8 +88,11 @@ namespace SampleHive { //Check All Files At Once wxArrayString sorted_files; - sorted_files = db.CheckDuplicates(files); - files = sorted_files; + if (!serializer.DeserializeDemoMode()) + { + sorted_files = db.CheckDuplicates(files); + files = sorted_files; + } if (files.size() < 1) { diff --git a/subprojects/spdlog.wrap b/subprojects/spdlog.wrap index bfa4995..754b72a 100644 --- a/subprojects/spdlog.wrap +++ b/subprojects/spdlog.wrap @@ -8,5 +8,4 @@ patch_filename = spdlog-1.8.5-1-wrap.zip patch_hash = 3c38f275d5792b1286391102594329e98b17737924b344f98312ab09929b74be [provide] -spdlog = spdlog_dep - +spdlog = spdlog_dep \ No newline at end of file