1 /*
2  Copyright (C) 2010-2014 Kristian Duske
3 
4  This file is part of TrenchBroom.
5 
6  TrenchBroom is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  TrenchBroom is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "ThreePaneMapView.h"
21 
22 #include "Model/PointFile.h"
23 #include "Renderer/Camera.h"
24 #include "View/CommandIds.h"
25 #include "View/CyclingMapView.h"
26 #include "View/Grid.h"
27 #include "View/MapDocument.h"
28 #include "View/MapView2D.h"
29 #include "View/MapView3D.h"
30 #include "View/SplitterWindow2.h"
31 
32 #include <wx/persist.h>
33 #include <wx/sizer.h>
34 
35 namespace TrenchBroom {
36     namespace View {
ThreePaneMapView(wxWindow * parent,Logger * logger,MapDocumentWPtr document,MapViewToolBox & toolBox,Renderer::MapRenderer & mapRenderer,GLContextManager & contextManager)37         ThreePaneMapView::ThreePaneMapView(wxWindow* parent, Logger* logger, MapDocumentWPtr document, MapViewToolBox& toolBox, Renderer::MapRenderer& mapRenderer, GLContextManager& contextManager) :
38         MultiMapView(parent),
39         m_logger(logger),
40         m_document(document),
41         m_hSplitter(NULL),
42         m_vSplitter(NULL),
43         m_mapView3D(NULL),
44         m_mapViewXY(NULL),
45         m_mapViewZZ(NULL) {
46             createGui(toolBox, mapRenderer, contextManager);
47         }
48 
createGui(MapViewToolBox & toolBox,Renderer::MapRenderer & mapRenderer,GLContextManager & contextManager)49         void ThreePaneMapView::createGui(MapViewToolBox& toolBox, Renderer::MapRenderer& mapRenderer, GLContextManager& contextManager) {
50 
51             m_hSplitter = new SplitterWindow2(this);
52             m_hSplitter->setSashGravity(0.5);
53             m_hSplitter->SetName("3PaneMapViewHSplitter");
54 
55             m_vSplitter = new SplitterWindow2(m_hSplitter);
56             m_vSplitter->setSashGravity(0.5);
57             m_vSplitter->SetName("3PaneMapViewVSplitter");
58 
59             m_mapView3D = new MapView3D(m_hSplitter, m_logger, m_document, toolBox, mapRenderer, contextManager);
60             m_mapViewXY = new MapView2D(m_vSplitter, m_logger, m_document, toolBox, mapRenderer, contextManager, MapView2D::ViewPlane_XY);
61             m_mapViewZZ = new CyclingMapView(m_vSplitter, m_logger, m_document, toolBox, mapRenderer, contextManager, CyclingMapView::View_ZZ);
62 
63             m_mapView3D->linkCamera(m_linkHelper);
64             m_mapViewXY->linkCamera(m_linkHelper);
65             m_mapViewZZ->linkCamera(m_linkHelper);
66 
67             addMapView(m_mapView3D);
68             addMapView(m_mapViewXY);
69             addMapView(m_mapViewZZ);
70 
71             m_vSplitter->splitHorizontally(m_mapViewXY, m_mapViewZZ, wxSize(100, 100), wxSize(100, 100));
72             m_hSplitter->splitVertically(m_mapView3D, m_vSplitter, wxSize(100, 100), wxSize(100, 100));
73 
74             wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
75             sizer->Add(m_hSplitter, 1, wxEXPAND);
76 
77             SetSizer(sizer);
78 
79             wxPersistenceManager::Get().RegisterAndRestore(m_hSplitter);
80             wxPersistenceManager::Get().RegisterAndRestore(m_vSplitter);
81         }
82 
doMaximizeView(MapView * view)83         void ThreePaneMapView::doMaximizeView(MapView* view) {
84             assert(view == m_mapView3D || view == m_mapViewXY || view == m_mapViewZZ);
85             if (view == m_mapView3D) {
86                 m_hSplitter->maximize(m_mapView3D);
87             } else if (view == m_mapViewXY) {
88                 m_vSplitter->maximize(m_mapViewXY);
89                 m_hSplitter->maximize(m_vSplitter);
90             } else if (view == m_mapViewZZ) {
91                 m_vSplitter->maximize(m_mapViewZZ);
92                 m_hSplitter->maximize(m_vSplitter);
93             }
94         }
95 
doRestoreViews()96         void ThreePaneMapView::doRestoreViews() {
97             m_hSplitter->restore();
98             m_vSplitter->restore();
99         }
100     }
101 }
102