diff --git a/src/App.cpp b/src/App.cpp index 44f42c5..6d7c8f9 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -27,7 +27,8 @@ #include #include #include -#include +#include +#include wxIMPLEMENT_APP(cApp); @@ -47,25 +48,34 @@ bool cApp::OnInit() if (!wxApp::OnInit()) return false; + SampleHive::cSerializer serializer; + wxLog::AddTraceMask("EventSource"); wxLog::AddTraceMask(wxTRACE_FSWATCHER); - m_Frame = new cMainFrame(); + // Add image handler for PNG + wxImage::AddHandler(new wxPNGHandler); + + m_pFrame = new cMainFrame(); wxBitmap bitmap; - wxSplashScreen* splash; if (bitmap.LoadFile(SPLASH_LOGO, wxBITMAP_TYPE_PNG)) { - splash = new wxSplashScreen(bitmap, - wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, - 2000, NULL, -1, wxDefaultPosition, wxDefaultSize, - wxBORDER_SIMPLE | wxSTAY_ON_TOP); + m_pSplash = new wxSplashScreen(bitmap, + wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, + 10000, NULL, -1, wxDefaultPosition, wxDefaultSize, + wxBORDER_SIMPLE | wxSTAY_ON_TOP); } + if (!serializer.DeserializeShowSplash()) + m_pSplash->Hide(); + else + m_pSplash->Show(); + wxYield(); - m_Frame->Show(true); + m_pFrame->Show(true); return true; } @@ -97,31 +107,31 @@ bool cApp::OnCmdLineParsed(wxCmdLineParser& parser) if (ans == 'y' || ans == 'Y') { - if (!wxFileExists(CONFIG_FILEPATH)) + if (!wxFileExists(static_cast(CONFIG_FILEPATH))) { - SH_LOG_ERROR("Error! File {} doesn't exist.", CONFIG_FILEPATH); + SH_LOG_ERROR("Error! File {} doesn't exist.", static_cast(CONFIG_FILEPATH)); return false; } - bool config_is_deleted = wxRemoveFile(CONFIG_FILEPATH); + bool config_is_deleted = wxRemoveFile(static_cast(CONFIG_FILEPATH)); if (config_is_deleted) - SH_LOG_INFO("Deleted {}", CONFIG_FILEPATH); + SH_LOG_INFO("Deleted {}", static_cast(CONFIG_FILEPATH)); else - SH_LOG_ERROR("Could not delete {}", CONFIG_FILEPATH); + SH_LOG_ERROR("Could not delete {}", static_cast(CONFIG_FILEPATH)); - if (!wxFileExists(DATABASE_FILEPATH)) + if (!wxFileExists(static_cast(DATABASE_FILEPATH))) { - SH_LOG_ERROR("Error! File {} doesn't exist.", DATABASE_FILEPATH); + SH_LOG_ERROR("Error! File {} doesn't exist.", static_cast(DATABASE_FILEPATH)); return false; } - bool db_is_deleted = wxRemoveFile(DATABASE_FILEPATH); + bool db_is_deleted = wxRemoveFile(static_cast(DATABASE_FILEPATH)); if (db_is_deleted) - SH_LOG_INFO("Deleted {}", DATABASE_FILEPATH); + SH_LOG_INFO("Deleted {}", static_cast(DATABASE_FILEPATH)); else - SH_LOG_ERROR("Could not delete {}", DATABASE_FILEPATH); + SH_LOG_ERROR("Could not delete {}", static_cast(DATABASE_FILEPATH)); if (config_is_deleted && db_is_deleted) SH_LOG_INFO("Successfully cleared app data"); @@ -144,6 +154,6 @@ bool cApp::OnCmdLineParsed(wxCmdLineParser& parser) void cApp::OnEventLoopEnter(wxEventLoopBase* event) { - if (m_Frame->CreateWatcherIfNecessary()) + if (m_pFrame->CreateWatcherIfNecessary()) SH_LOG_INFO("Filesystem watcher created sucessfully"); } diff --git a/src/App.hpp b/src/App.hpp index 1cdee1e..54d085a 100644 --- a/src/App.hpp +++ b/src/App.hpp @@ -24,6 +24,7 @@ #include #include +#include class cApp : public wxApp { @@ -38,5 +39,6 @@ class cApp : public wxApp virtual bool OnCmdLineParsed(wxCmdLineParser& parser); private: - cMainFrame* m_Frame = nullptr; + wxSplashScreen* m_pSplash = nullptr; + cMainFrame* m_pFrame = nullptr; }; diff --git a/src/GUI/Dialogs/Settings.cpp b/src/GUI/Dialogs/Settings.cpp index 4dde838..bb3ea99 100644 --- a/src/GUI/Dialogs/Settings.cpp +++ b/src/GUI/Dialogs/Settings.cpp @@ -65,6 +65,9 @@ cSettings::cSettings(wxWindow *window) serializer.DeserializeWaveformColour(), wxDefaultPosition, wxDefaultSize, wxCLRP_DEFAULT_STYLE); + m_pShowSplashCheck = new wxCheckBox(m_pDisplaySettingPanel, SampleHive::ID::SD_ShowSplash, "Show splash on startup", + wxDefaultPosition, wxDefaultSize, 0); + m_pShowSplashCheck->SetValue(serializer.DeserializeShowSplash()); m_pCollectionSettingPanel = new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition, wxDefaultSize); @@ -104,13 +107,13 @@ cSettings::cSettings(wxWindow *window) m_pConfigLabel = new wxStaticText(m_pConfigurationSettingPanel, wxID_ANY, "Default configuration file location", wxDefaultPosition, wxDefaultSize); - m_pConfigText = new wxTextCtrl(m_pConfigurationSettingPanel, wxID_ANY, CONFIG_FILEPATH, + m_pConfigText = new wxTextCtrl(m_pConfigurationSettingPanel, wxID_ANY, static_cast(CONFIG_FILEPATH), wxDefaultPosition, wxDefaultSize); m_pConfigBrowse = new wxButton(m_pConfigurationSettingPanel, SampleHive::ID::SD_BrowseConfigDir, "Browse", wxDefaultPosition, wxDefaultSize, 0); m_pDatabaseLabel = new wxStaticText(m_pConfigurationSettingPanel, wxID_ANY, "Default database location", wxDefaultPosition, wxDefaultSize); - m_pDatabaseText = new wxTextCtrl(m_pConfigurationSettingPanel, wxID_ANY, DATABASE_FILEPATH, + m_pDatabaseText = new wxTextCtrl(m_pConfigurationSettingPanel, wxID_ANY, static_cast(DATABASE_FILEPATH), wxDefaultPosition, wxDefaultSize); m_pDatabaseBrowse = new wxButton(m_pConfigurationSettingPanel, SampleHive::ID::SD_BrowseDatabaseDir, "Browse", wxDefaultPosition, wxDefaultSize, 0); @@ -135,6 +138,7 @@ cSettings::cSettings(wxWindow *window) Bind(wxEVT_BUTTON, &cSettings::OnClickConfigBrowse, this, SampleHive::ID::SD_BrowseConfigDir); Bind(wxEVT_BUTTON, &cSettings::OnClickDatabaseBrowse, this, SampleHive::ID::SD_BrowseDatabaseDir); Bind(wxEVT_COLOURPICKER_CHANGED, &cSettings::OnChangeWaveformColour, this, SampleHive::ID::SD_WaveformColourPickerCtrl); + Bind(wxEVT_CHECKBOX, &cSettings::OnCheckShowSplash, this, SampleHive::ID::SD_ShowSplash); // Adding controls to sizers m_pNotebookSizer->Add(m_pNotebook, 1, wxALL | wxEXPAND, 2); @@ -156,6 +160,7 @@ cSettings::cSettings(wxWindow *window) m_pDisplayTopSizer->Add(m_pDisplayFontSizer, 0, wxALL | wxEXPAND, 2); m_pDisplayTopSizer->Add(m_pWaveformColourSizer, 0, wxALL | wxEXPAND, 2); + m_pDisplayTopSizer->Add(m_pShowSplashCheck, 0, wxALL | wxEXPAND, 2); m_pCollectionImportDirSizer->Add(m_pAutoImportCheck, 0, wxALL | wxALIGN_CENTER_VERTICAL, 2); m_pCollectionImportDirSizer->Add(m_pImportDirLocation, 1, wxALL | wxALIGN_CENTER_VERTICAL, 2); @@ -501,6 +506,13 @@ void cSettings::OnChangeWaveformColour(wxColourPickerEvent& event) } } +void cSettings::OnCheckShowSplash(wxCommandEvent& event) +{ + SampleHive::cSerializer serializer; + + serializer.SerializeShowSplash(m_pShowSplashCheck->GetValue()); +} + cSettings::~cSettings() { diff --git a/src/GUI/Dialogs/Settings.hpp b/src/GUI/Dialogs/Settings.hpp index df24b58..940d0ba 100644 --- a/src/GUI/Dialogs/Settings.hpp +++ b/src/GUI/Dialogs/Settings.hpp @@ -58,6 +58,7 @@ class cSettings : public wxDialog void OnChangeFontSize(wxSpinEvent& event); void OnSelectFont(wxCommandEvent& event); void OnChangeWaveformColour(wxColourPickerEvent& event); + void OnCheckShowSplash(wxCommandEvent& event); // ------------------------------------------------------------------- void SetCustomFont(); @@ -117,6 +118,7 @@ class cSettings : public wxDialog wxBoxSizer* m_pWaveformColourSizer = nullptr; wxStaticText* m_pWaveformColourLabel = nullptr; wxColourPickerCtrl* m_pWaveformColourPickerCtrl = nullptr; + wxCheckBox* m_pShowSplashCheck = nullptr; // ------------------------------------------------------------------- // Collection page diff --git a/src/GUI/MainFrame.cpp b/src/GUI/MainFrame.cpp index c061058..1a053ee 100644 --- a/src/GUI/MainFrame.cpp +++ b/src/GUI/MainFrame.cpp @@ -50,7 +50,7 @@ cMainFrame::cMainFrame() int status_width[4] = { 300, -6, -1, -2 }; m_pStatusBar->SetStatusWidths(4, status_width); - m_pHiveBitmap = new wxStaticBitmap(m_pStatusBar, wxID_ANY, wxBitmap(ICON_HIVE_24px)); + m_pHiveBitmap = new wxStaticBitmap(m_pStatusBar, wxID_ANY, wxBitmap(ICON_HIVE_24px, wxBITMAP_TYPE_PNG)); // Initialize menubar and menus m_pMenuBar = new wxMenuBar(); @@ -252,8 +252,6 @@ void cMainFrame::UpdateElapsedTime(wxTimerEvent& event) m_pTransportControls->SetSamplePositionText(wxString::Format(wxT("%s/%s"), position.c_str(), duration.c_str())); - this->Refresh(); - m_pTransportControls->Refresh(); m_pWaveformViewer->Refresh(); if (m_bLoopPointsSet && m_pTransportControls->IsLoopABOn()) @@ -648,7 +646,8 @@ void cMainFrame::OnSelectResetAppData(wxCommandEvent& event) wxMessageDialog clearDataDialog(this, wxString::Format(_("Warning! This will delete configuration file " "\"%s\" and database file \"%s\" permanently, " "are you sure you want to delete these files?"), - CONFIG_FILEPATH, DATABASE_FILEPATH), + static_cast(CONFIG_FILEPATH), + static_cast(DATABASE_FILEPATH)), _("Clear app data?"), wxYES_NO | wxNO_DEFAULT | wxCENTRE, wxDefaultPosition); bool remove = false; @@ -660,31 +659,31 @@ void cMainFrame::OnSelectResetAppData(wxCommandEvent& event) if (remove) { - if (!wxFileExists(CONFIG_FILEPATH)) + if (!wxFileExists(static_cast(CONFIG_FILEPATH))) { - SH_LOG_ERROR("Error! File {} doesn't exist.", CONFIG_FILEPATH); + SH_LOG_ERROR("Error! File {} doesn't exist.", static_cast(CONFIG_FILEPATH)); return; } - bool config_is_deleted = wxRemoveFile(CONFIG_FILEPATH); + bool config_is_deleted = wxRemoveFile(static_cast(CONFIG_FILEPATH)); if (config_is_deleted) - SH_LOG_INFO("Deleted {}", CONFIG_FILEPATH); + SH_LOG_INFO("Deleted {}", static_cast(CONFIG_FILEPATH)); else - SH_LOG_ERROR("Could not delete {}", CONFIG_FILEPATH); + SH_LOG_ERROR("Could not delete {}", static_cast(CONFIG_FILEPATH)); - if (!wxFileExists(DATABASE_FILEPATH)) + if (!wxFileExists(static_cast(DATABASE_FILEPATH))) { - SH_LOG_ERROR("Error! File {} doesn't exist.", DATABASE_FILEPATH); + SH_LOG_ERROR("Error! File {} doesn't exist.", static_cast(DATABASE_FILEPATH)); return; } - bool db_is_deleted = wxRemoveFile(DATABASE_FILEPATH); + bool db_is_deleted = wxRemoveFile(static_cast(DATABASE_FILEPATH)); if (db_is_deleted) - SH_LOG_INFO("Deleted {}", DATABASE_FILEPATH); + SH_LOG_INFO("Deleted {}", static_cast(DATABASE_FILEPATH)); else - SH_LOG_ERROR("Could not delete {}", DATABASE_FILEPATH); + SH_LOG_ERROR("Could not delete {}", static_cast(DATABASE_FILEPATH)); if (config_is_deleted && db_is_deleted) { @@ -707,7 +706,7 @@ void cMainFrame::OnSelectAbout(wxCommandEvent& event) wxAboutDialogInfo aboutInfo; aboutInfo.SetName(PROJECT_NAME); - aboutInfo.SetIcon(wxIcon(ICON_HIVE_64px)); + aboutInfo.SetIcon(wxIcon(ICON_HIVE_64px, wxBITMAP_TYPE_PNG)); aboutInfo.AddArtist(PROJECT_AUTHOR); aboutInfo.SetVersion(PROJECT_VERSION, _("Version 0.9.0_alpha.1")); aboutInfo.SetDescription(_(PROJECT_DESCRIPTION)); diff --git a/src/GUI/WaveformViewer.cpp b/src/GUI/WaveformViewer.cpp index 92296e3..a45c2df 100644 --- a/src/GUI/WaveformViewer.cpp +++ b/src/GUI/WaveformViewer.cpp @@ -175,7 +175,7 @@ void cWaveformViewer::UpdateWaveformBitmap() wxString path = selection.Contains(wxString::Format(".%s", extension)) ? filepath_with_extension : filepath_without_extension; - SndfileHandle snd_file(path); + SndfileHandle snd_file(path.ToStdString().c_str()); int channels = snd_file.channels(); double sample_rate = snd_file.samplerate(); diff --git a/src/Utility/ControlIDs.hpp b/src/Utility/ControlIDs.hpp index 528ed3a..144ce1a 100644 --- a/src/Utility/ControlIDs.hpp +++ b/src/Utility/ControlIDs.hpp @@ -65,6 +65,7 @@ namespace SampleHive { namespace ID { SD_FontSize, SD_FontBrowseButton, SD_WaveformColourPickerCtrl, + SD_ShowSplash, // ------------------------------------------------------------------- // App Menu items diff --git a/src/Utility/Serialize.cpp b/src/Utility/Serialize.cpp index f1380e8..0852d2f 100644 --- a/src/Utility/Serialize.cpp +++ b/src/Utility/Serialize.cpp @@ -87,6 +87,10 @@ namespace SampleHive { m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Colour" << YAML::Value << colour.GetAsString().ToStdString(); m_Emitter << YAML::EndMap; + m_Emitter << YAML::Key << "Splash"; + m_Emitter << YAML::BeginMap; + m_Emitter << YAML::Key << "ShowSplashOnStartup" << YAML::Value << true; + m_Emitter << YAML::EndMap; m_Emitter << YAML::EndMap << YAML::Newline; m_Emitter << YAML::Newline << YAML::Key << "Collection"; @@ -100,10 +104,10 @@ namespace SampleHive { m_Emitter << YAML::EndMap; - std::ofstream ofstrm(CONFIG_FILEPATH); + std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << m_Emitter.c_str(); - SH_LOG_INFO("Generated {} successfully!", CONFIG_FILEPATH); + SH_LOG_INFO("Generated {} successfully!", static_cast(CONFIG_FILEPATH)); } } @@ -529,6 +533,63 @@ namespace SampleHive { return static_cast(colour); } + void cSerializer::SerializeShowSplash(bool value) + { + YAML::Emitter out; + + try + { + YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); + + auto display = config["Display"]; + + if (auto splash = display["Splash"]) + { + splash["ShowSplashOnStartup"] = value; + + out << config; + + std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); + ofstrm << out.c_str(); + } + else + { + SH_LOG_ERROR("Error! Cannot store show splash value."); + } + } + catch (const YAML::ParserException& ex) + { + SH_LOG_ERROR(ex.what()); + } + } + + bool cSerializer::DeserializeShowSplash() const + { + bool show = false; + + try + { + YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); + + auto display = config["Display"]; + + if (auto splash = display["Splash"]) + { + show = splash["ShowSplashOnStartup"].as(); + } + else + { + SH_LOG_ERROR("Error! Cannot fetch show splash value."); + } + } + catch (const YAML::ParserException& ex) + { + SH_LOG_ERROR(ex.what()); + } + + return show; + } + void cSerializer::SerializeAutoImport(bool autoImport, const std::string& importDir) { YAML::Emitter out; diff --git a/src/Utility/Serialize.hpp b/src/Utility/Serialize.hpp index 32f08d0..0c1bba3 100644 --- a/src/Utility/Serialize.hpp +++ b/src/Utility/Serialize.hpp @@ -84,6 +84,11 @@ namespace SampleHive { void SerializeWaveformColour(wxColour& colour); wxColour DeserializeWaveformColour() const; + // ------------------------------------------------------------------- + // Splash screen + void SerializeShowSplash(bool value); + bool DeserializeShowSplash() const; + // ------------------------------------------------------------------- // Auto import settings void SerializeAutoImport(bool autoImport, const std::string& importDir);