Index: source/tools/atlas/AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.h =================================================================== --- source/tools/atlas/AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.h +++ source/tools/atlas/AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2009 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -20,17 +20,26 @@ class SnapSplitterWindow : public wxSplitterWindow { public: - SnapSplitterWindow(wxWindow* parent, long style = wxSP_3D); + SnapSplitterWindow(wxWindow* parent, long style = wxSP_3D, const wxString& configPath = wxString()); + void SetDefaultSashPosition(int sashPosition); + virtual bool SplitVertically(wxWindow* window1, wxWindow* window2, int sashPosition = 0); virtual bool SplitHorizontally(wxWindow* window1, wxWindow* window2, int sashPosition = 0); + bool LoadSashPositionIfSaved(int* sashPosition); + void SaveSashPositionIfChanged(); + + void OnClose(wxCloseEvent& event); + private: void OnSashPosChanging(wxSplitterEvent& evt); void OnDoubleClick(wxSplitterEvent& evt); int m_DefaultSashPosition; int m_SnapTolerance; + wxString m_ConfigPath; + bool m_SashPositionChanged; DECLARE_EVENT_TABLE(); }; Index: source/tools/atlas/AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.cpp =================================================================== --- source/tools/atlas/AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.cpp +++ source/tools/atlas/AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2009 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -19,15 +19,19 @@ #include "SnapSplitterWindow.h" +#include + BEGIN_EVENT_TABLE(SnapSplitterWindow, wxSplitterWindow) EVT_SPLITTER_SASH_POS_CHANGING(wxID_ANY, SnapSplitterWindow::OnSashPosChanging) EVT_SPLITTER_DCLICK(wxID_ANY, SnapSplitterWindow::OnDoubleClick) END_EVENT_TABLE() -SnapSplitterWindow::SnapSplitterWindow(wxWindow* parent, long style) +SnapSplitterWindow::SnapSplitterWindow(wxWindow* parent, long style, const wxString& configPath) : wxSplitterWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, style | wxSP_LIVE_UPDATE), - m_SnapTolerance(16) + m_SnapTolerance(16), + m_ConfigPath(configPath), + m_SashPositionChanged(false) { // Set min size, to disable unsplitting SetMinimumPaneSize(32); @@ -50,6 +54,9 @@ { if (sashPosition == 0) sashPosition = m_DefaultSashPosition; + + LoadSashPositionIfSaved(&sashPosition); + return wxSplitterWindow::SplitVertically(window1, window2, sashPosition); } @@ -57,6 +64,9 @@ { if (sashPosition == 0) sashPosition = m_DefaultSashPosition; + + LoadSashPositionIfSaved(&sashPosition); + return wxSplitterWindow::SplitHorizontally(window1, window2, sashPosition); } @@ -69,6 +79,8 @@ { evt.SetSashPosition(defaultPos); } + + m_SashPositionChanged = true; } void SnapSplitterWindow::OnDoubleClick(wxSplitterEvent& WXUNUSED(evt)) @@ -76,3 +88,25 @@ int defaultPos = ConvertSashPosition(m_DefaultSashPosition); SetSashPosition(defaultPos); } + +bool SnapSplitterWindow::LoadSashPositionIfSaved(int* sashPosition) +{ + // We use the same config path for both horizontal and vertical splits, + // because we can't have both at the same moment. + wxConfigBase* cfg = wxConfigBase::Get(false); + // wxConfigBase::Read doesn't modify the value if there was an error. + return cfg && cfg->Read(m_ConfigPath, sashPosition); +} + +void SnapSplitterWindow::SaveSashPositionIfChanged() +{ + wxConfigBase* cfg = wxConfigBase::Get(false); + if (!cfg || !m_SashPositionChanged) + return; + cfg->Write(m_ConfigPath, GetSashPosition()); +} + +void SnapSplitterWindow::OnClose(wxCloseEvent& WXUNUSED(event)) +{ + SaveSashPositionIfChanged(); +} Index: source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp =================================================================== --- source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp +++ source/tools/atlas/AtlasUI/ScenarioEditor/SectionLayout.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -17,15 +17,11 @@ #include "precompiled.h" -#include "wx/filename.h" -#include "wx/wfstream.h" - #include "SectionLayout.h" #include "CustomControls/SnapSplitterWindow/SnapSplitterWindow.h" - +#include "General/Datafile.h" #include "ScenarioEditor.h" - #include "Sections/Cinema/Cinema.h" #include "Sections/Environment/Environment.h" #include "Sections/Map/Map.h" @@ -33,7 +29,8 @@ #include "Sections/Player/Player.h" #include "Sections/Terrain/Terrain.h" -#include "General/Datafile.h" +#include +#include ////////////////////////////////////////////////////////////////////////// @@ -257,8 +254,10 @@ void SectionLayout::SetWindow(wxWindow* window) { - m_HorizSplitter = new SnapSplitterWindow(window, wxSP_NOBORDER); - m_VertSplitter = new SnapSplitterWindow(m_HorizSplitter, wxSP_3D); + m_HorizSplitter = new SnapSplitterWindow( + window, wxSP_NOBORDER, _T("Scenario Editor/Layout/VerticalSplitter")); + m_VertSplitter = new SnapSplitterWindow( + m_HorizSplitter, wxSP_3D, _T("Scenario Editor/Layout/HorizontalSplitter")); } wxWindow* SectionLayout::GetCanvasParent()