From ccda509068ac20b2c7e8761f88e6fee30a5db47d Mon Sep 17 00:00:00 2001 From: apoorv569 Date: Tue, 16 Nov 2021 10:35:10 +0530 Subject: [PATCH] Add serialize option for the splitter window sash position. --- meson.build | 5 ++++ src/GUI/MainFrame.cpp | 33 +++++++++++++++++++-- src/GUI/MainFrame.hpp | 4 +++ src/Utility/Serialize.cpp | 61 +++++++++++++++++++++++++++++++++++++++ src/Utility/Serialize.hpp | 5 ++++ 5 files changed, 106 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 05687ac..eb433d3 100755 --- a/meson.build +++ b/meson.build @@ -86,10 +86,14 @@ wx_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON', 'CMAKE_BUILD_TYPE': 'Release', 'CMAKE_CXX_COMPILER': 'g++', 'wxBUILD_SHARED': 'ON', + 'wxBUILD_MONOLITHIC': 'OFF', + 'wxBUILD_BENCHMARKS': 'OFF', + 'wxBUILD_PRECOMP': 'OFF', 'wxBUILD_TESTS': 'OFF', 'wxBUILD_SAMPLES': 'OFF', 'wxBUILD_DEMOS': 'OFF', 'wxBUILD_COMPATIBILITY': '3.0', + 'wxBUILD_TOOLKIT': 'gtk3', 'wxUSE_UNICODE': 'ON', 'wxUSE_AUI': 'OFF', 'wxUSE_XML': 'OFF', @@ -100,6 +104,7 @@ wx_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON', 'wxUSE_RIBBON': 'OFF', 'wxUSE_MDI': 'OFF', 'wxUSE_MDI_ARCHITECTURE': 'OFF', + 'wxUSE_POSTSCRIPT': 'ON', 'wxUSE_RICHTEXT': 'OFF', 'wxUSE_WEBVIEW': 'OFF', 'wxUSE_LIBSDL': 'OFF', diff --git a/src/GUI/MainFrame.cpp b/src/GUI/MainFrame.cpp index b5a3d80..ffe1b6e 100644 --- a/src/GUI/MainFrame.cpp +++ b/src/GUI/MainFrame.cpp @@ -426,6 +426,11 @@ MainFrame::MainFrame() Bind(wxEVT_MENU, &MainFrame::OnSelectResetAppData, this, wxID_REFRESH); Bind(wxEVT_MENU, &MainFrame::OnSelectAbout, this, wxID_ABOUT); + Bind(wxEVT_SPLITTER_SASH_POS_CHANGING, &MainFrame::OnTopSplitterSashPosChanged, + this, m_TopSplitter->GetId()); + Bind(wxEVT_SPLITTER_SASH_POS_CHANGING, &MainFrame::OnBottomSplitterSashPosChanged, + this, m_BottomSplitter->GetId()); + this->Connect(wxEVT_SIZE, wxSizeEventHandler(MainFrame::OnResizeFrame), NULL, this); m_StatusBar->Connect(wxEVT_SIZE, wxSizeEventHandler(MainFrame::OnResizeStatusBar), NULL, this); @@ -3054,10 +3059,30 @@ void MainFrame::OnResizeFrame(wxSizeEvent& event) event.Skip(); } +void MainFrame::OnTopSplitterSashPosChanged(wxSplitterEvent& event) +{ + Serializer serializer; + + SH_LOG_DEBUG("TopSplitter at {}", m_TopSplitter->GetSashPosition()); + + serializer.SerializeSplitterSashPos("top", m_TopSplitter->GetSashPosition()); +} + +void MainFrame::OnBottomSplitterSashPosChanged(wxSplitterEvent& event) +{ + Serializer serializer; + + SH_LOG_DEBUG("BottomSplitter at {}", m_BottomSplitter->GetSashPosition()); + + serializer.SerializeSplitterSashPos("bottom", m_BottomSplitter->GetSashPosition()); +} + void MainFrame::SetAfterFrameCreate() { - m_TopSplitter->SetSashPosition(200); - m_BottomSplitter->SetSashPosition(300); + Serializer serializer; + + m_TopSplitter->SetSashPosition(serializer.DeserializeSplitterSashPos("top")); + m_BottomSplitter->SetSashPosition(serializer.DeserializeSplitterSashPos("bottom")); } void MainFrame::OnRecieveLoopPoints(SampleHive::SH_LoopPointsEvent& event) @@ -3146,5 +3171,9 @@ void MainFrame::PlaySample(const std::string& filepath, const std::string& sampl MainFrame::~MainFrame() { + // Delete wxTimer + delete m_Timer; + + // Delete wxFilesystemWatcher delete m_FsWatcher; } diff --git a/src/GUI/MainFrame.hpp b/src/GUI/MainFrame.hpp index bcc1d3a..eb53aa2 100644 --- a/src/GUI/MainFrame.hpp +++ b/src/GUI/MainFrame.hpp @@ -262,6 +262,10 @@ class MainFrame : public wxFrame // Frame resize event handler void OnResizeFrame(wxSizeEvent& event); + // Splitter window sash pos event handler + void OnTopSplitterSashPosChanged(wxSplitterEvent& event); + void OnBottomSplitterSashPosChanged(wxSplitterEvent& event); + // ------------------------------------------------------------------- // Timer update event handler void UpdateElapsedTime(wxTimerEvent& event); diff --git a/src/Utility/Serialize.cpp b/src/Utility/Serialize.cpp index 8a0b681..4f83067 100644 --- a/src/Utility/Serialize.cpp +++ b/src/Utility/Serialize.cpp @@ -60,6 +60,8 @@ Serializer::Serializer() m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Width" << YAML::Value << 1280; m_Emitter << YAML::Key << "Height" << YAML::Value << 720; + m_Emitter << YAML::Key << "TopSplitterSashPos" << YAML::Value << 200; + m_Emitter << YAML::Key << "BottomSplitterSashPos" << YAML::Value << 300; m_Emitter << YAML::Key << "ShowMenuBar" << YAML::Value << true; m_Emitter << YAML::Key << "ShowStatusBar" << YAML::Value << true; m_Emitter << YAML::EndMap << YAML::Newline; @@ -225,6 +227,65 @@ bool Serializer::DeserializeShowMenuAndStatusBar(std::string key) const return show; } +void Serializer::SerializeSplitterSashPos(std::string key, int pos) +{ + YAML::Emitter out; + + try + { + YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); + + if (auto sash = config["Window"]) + { + if (key == "top") + sash["TopSplitterSashPos"] = pos; + + if (key == "bottom") + sash["BottomSplitterSashPos"] = pos; + + out << config; + + std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); + ofstrm << out.c_str(); + } + else + SH_LOG_ERROR("Error! Cannot store sash pos values."); + } + catch(const YAML::ParserException& ex) + { + SH_LOG_ERROR(ex.what()); + } +} + +int Serializer::DeserializeSplitterSashPos(std::string key) const +{ + int pos = 0; + + try + { + YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); + + if (auto bar = config["Window"]) + { + if (key == "top") + pos = bar["TopSplitterSashPos"].as(); + + if (key == "bottom") + pos = bar["BottomSplitterSashPos"].as(); + } + else + { + SH_LOG_ERROR("Error! Cannot fetch sash pos values."); + } + } + catch(const YAML::ParserException& ex) + { + SH_LOG_ERROR(ex.what()); + } + + return pos; +} + void Serializer::SerializeMediaOptions(std::string key, bool value) { YAML::Emitter out; diff --git a/src/Utility/Serialize.hpp b/src/Utility/Serialize.hpp index bf50232..84f5714 100644 --- a/src/Utility/Serialize.hpp +++ b/src/Utility/Serialize.hpp @@ -63,6 +63,11 @@ class Serializer void SerializeShowMenuAndStatusBar(std::string key, bool value); bool DeserializeShowMenuAndStatusBar(std::string key) const; + // ------------------------------------------------------------------- + // Splitter window sash pos + void SerializeSplitterSashPos(std::string key, int pos); + int DeserializeSplitterSashPos(std::string key) const; + // ------------------------------------------------------------------- // Browser controls void SerializeMediaOptions(std::string key, bool value);