source: subversion/applications/editors/merkaartor/LayerDock.cpp @ 13736

Last change on this file since 13736 was 13597, checked in by Chris Browet, 11 years ago

ADD : Outline coastlines

  • Property svn:eol-style set to native
File size: 7.0 KB
Line 
1#include "LayerDock.h"
2#include "LayerWidget.h"
3
4#include "MainWindow.h"
5#include "MapView.h"
6#include "Map/MapDocument.h"
7#include "Map/MapLayer.h"
8#include "PropertiesDock.h"
9#include "Command/Command.h"
10#include "InfoDock.h"
11
12#include <QPushButton>
13
14#define LINEHEIGHT 25
15
16class LayerDockPrivate
17{
18        public:
19                LayerDockPrivate(MainWindow* aMain) :
20                  Main(aMain), Scroller(0), Content(0), Layout(0), butGroup(0) {}
21        public:
22                MainWindow* Main;
23                QScrollArea* Scroller;
24                QWidget* Content;
25                QVBoxLayout* Layout;
26                QHBoxLayout* frameLayout;
27                QButtonGroup* butGroup;
28                QTabBar* tab;
29
30                QList < QPair<MapLayer*, LayerWidget*> > layerList;
31};
32
33LayerDock::LayerDock(MainWindow* aMain)
34: MDockAncestor(aMain)
35{
36        p = new LayerDockPrivate(aMain);
37//      setMinimumSize(220,100);
38        setObjectName("layersDock");
39
40        createContent();
41
42        retranslateUi();
43}
44
45LayerDock::~LayerDock()
46{
47        delete p;
48}
49
50void LayerDock::clearLayers()
51{
52        for (int i=p->layerList.size()-1; i >= 0; i--) {
53                p->butGroup->removeButton(p->layerList[i].second);
54                p->Layout->removeWidget(p->layerList[i].second);
55                delete p->layerList[i].second;
56                p->layerList.removeAt(i);
57        }
58}
59
60void LayerDock::addLayer(MapLayer* aLayer)
61{
62        LayerWidget* w = aLayer->newWidget();
63        if (w) {
64                p->layerList.append(qMakePair(aLayer, w));
65                p->butGroup->addButton(w);
66                p->Layout->insertWidget(p->layerList.size()-1, w);
67
68                connect(w, SIGNAL(layerChanged(LayerWidget*,bool)), this, SLOT(layerChanged(LayerWidget*,bool)));
69                connect(w, SIGNAL(layerClosed(MapLayer*)), this, SLOT(layerClosed(MapLayer*)));
70                connect(w, SIGNAL(layerCleared(MapLayer*)), this, SLOT(layerCleared(MapLayer*)));
71                connect(w, SIGNAL(layerZoom(MapLayer*)), this, SLOT(layerZoom(MapLayer*)));
72
73                p->Main->menuLayers->addMenu(w->getAssociatedMenu());
74
75                //w->setChecked(aLayer->isSelected());
76                w->setVisible(aLayer->isEnabled());
77                w->setEnabled(aLayer->isEnabled());
78                w->getAssociatedMenu()->menuAction()->setVisible(aLayer->isEnabled());
79
80                update();
81        }
82}
83
84void LayerDock::deleteLayer(MapLayer* aLayer)
85{
86        for (int i=p->layerList.size()-1; i >= 0; i--) {
87                if (p->layerList[i].first == aLayer) {
88                        if (i) {
89                                p->layerList[i-1].first->setSelected(true);
90                                p->layerList[i-1].second->setChecked(true);
91                        }
92                        p->butGroup->removeButton(p->layerList[i].second);
93                        p->Layout->removeWidget(p->layerList[i].second);
94                        disconnect(p->layerList[i].second);
95                        p->layerList[i].second->setVisible(false);
96
97                        p->Main->menuLayers->removeAction(p->layerList[i].second->getAssociatedMenu()->menuAction());
98
99                        p->layerList.removeAt(i);
100                        //aLayer->deleteWidget();
101                }
102        }
103
104        update();
105}
106
107void LayerDock::createContent()
108{
109        delete p->Scroller;
110
111        QWidget* frame = new QWidget();
112        p->frameLayout = new QHBoxLayout(frame);
113        p->frameLayout->setMargin(0);
114        p->frameLayout->setSpacing(0);
115
116        p->tab = new QTabBar(frame);
117        p->tab->setShape(QTabBar::RoundedWest);
118        p->tab->setContextMenuPolicy(Qt::CustomContextMenu);
119        int t;
120        t = p->tab->addTab(NULL);
121        p->tab->setTabData(t, MapLayer::All);
122        t = p->tab->addTab(NULL);
123        p->tab->setTabData(t, MapLayer::Default);
124        t = p->tab->addTab(NULL);
125        p->tab->setTabData(t, MapLayer::OSM);
126        t = p->tab->addTab(NULL);
127        p->tab->setTabData(t, MapLayer::Tracks);
128        retranslateTabBar();
129        connect(p->tab, SIGNAL(currentChanged (int)), this, SLOT(tabChanged(int)));
130        connect(p->tab, SIGNAL(customContextMenuRequested (const QPoint&)), this, SLOT(tabContextMenuRequested(const QPoint&)));
131
132        QVBoxLayout* tabLayout = new QVBoxLayout();
133        tabLayout->addWidget(p->tab);
134        QSpacerItem* tabSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
135        tabLayout->addItem(tabSpacer);
136
137        p->frameLayout->addLayout(tabLayout);
138
139        p->Scroller = new QScrollArea(frame);
140        p->Scroller->setBackgroundRole(QPalette::Base);
141        p->Scroller->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
142        p->Scroller->setWidgetResizable(true);
143
144        p->Content = new QWidget();
145        p->Layout = new QVBoxLayout(p->Content);
146        p->Layout->setSpacing(0);
147        p->Layout->setMargin(0);
148
149        p->butGroup = new QButtonGroup(p->Content);
150        connect(p->butGroup, SIGNAL(buttonClicked (QAbstractButton *)), this, SLOT(layerSelected(QAbstractButton *)));
151
152        p->Layout->addStretch();
153
154        p->Scroller->setWidget(p->Content);
155
156        p->frameLayout->addWidget(p->Scroller);
157
158        setWidget(frame);
159        update();
160}
161
162void LayerDock::resizeEvent(QResizeEvent* )
163{
164}
165
166void LayerDock::layerSelected(QAbstractButton * l)
167{
168        if (p->Main->info())
169                p->Main->info()->setHtml(((LayerWidget*)l)->getMapLayer()->toHtml());
170}
171
172void LayerDock::layerChanged(LayerWidget* l, bool adjustViewport)
173{
174        l->getAssociatedMenu()->setTitle(l->getMapLayer()->name());
175        emit(layersChanged(adjustViewport));
176}
177
178void LayerDock::layerClosed(MapLayer* l)
179{
180//      Main->document()->getUploadedLayer()->clear();
181        //Main->document()->remove(l);
182        //delete l;
183        l->clear();
184        l->setEnabled(false);
185        l->getWidget()->setVisible(false);
186        l->getWidget()->getAssociatedMenu()->setVisible(false);
187        p->Main->on_editPropertiesAction_triggered();
188
189        update();
190}
191
192void LayerDock::layerCleared(MapLayer* l)
193{
194        l->clear();
195        p->Main->on_editPropertiesAction_triggered();
196}
197
198void LayerDock::layerZoom(MapLayer * l)
199{
200        CoordBox bb = MapLayer::boundingBox(l);
201        CoordBox mini(bb.center()-10, bb.center()+10);
202        bb.merge(mini);
203        bb = bb.zoomed(1.1);
204        p->Main->view()->projection().setViewport(bb, p->Main->view()->rect());
205        emit(layersChanged(false));
206}
207
208void LayerDock::tabChanged(int idx)
209{
210        for (int i=p->layerList.size()-1; i >= 0; i--) {
211                if ((p->layerList[i].first->isEnabled()) && (p->layerList[i].first->classGroups() & p->tab->tabData(idx).toInt()))
212                        p->layerList[i].second->setVisible(true);
213                else
214                        p->layerList[i].second->setVisible(false);
215        }
216}
217
218void LayerDock::tabContextMenuRequested(const QPoint& pos)
219{
220        int idx = p->tab->tabAt(pos);
221        p->tab->setCurrentIndex(idx);
222
223        QMenu* ctxMenu = new QMenu(this);
224
225        QAction* actTabShow = new QAction(tr("Show All"), ctxMenu);
226        ctxMenu->addAction(actTabShow);
227        connect(actTabShow, SIGNAL(triggered(bool)), this, SLOT(TabShowAll(bool)));
228
229        QAction* actTabHide = new QAction(tr("Hide All"), ctxMenu);
230        ctxMenu->addAction(actTabHide);
231        connect(actTabHide, SIGNAL(triggered(bool)), this, SLOT(TabHideAll(bool)));
232
233        ctxMenu->exec(mapToGlobal(pos));
234
235}
236
237void LayerDock::TabShowAll(bool)
238{
239        for (int i=p->layerList.size()-1; i >= 0; i--) {
240                if (p->layerList[i].first->classGroups() & p->tab->tabData(p->tab->currentIndex()).toInt()) {
241                        p->layerList[i].second->setLayerVisible(true);
242                }
243        }
244}
245
246void LayerDock::TabHideAll(bool)
247{
248        for (int i=p->layerList.size()-1; i >= 0; i--) {
249                if (p->layerList[i].first->classGroups() & p->tab->tabData(p->tab->currentIndex()).toInt()) {
250                        p->layerList[i].second->setLayerVisible(false);
251                }
252        }
253}
254
255void LayerDock::changeEvent(QEvent * event)
256{
257        if (event->type() == QEvent::LanguageChange)
258                retranslateUi();
259        MDockAncestor::changeEvent(event);
260}
261
262void LayerDock::retranslateUi()
263{
264        setWindowTitle(tr("Layers"));
265        retranslateTabBar();
266}
267
268void LayerDock::retranslateTabBar()
269{
270        p->tab->setTabText(0, tr("All"));
271        p->tab->setTabText(1, tr("Default"));
272        p->tab->setTabText(2, tr("OSM"));
273        p->tab->setTabText(3, tr("Tracks"));
274}
Note: See TracBrowser for help on using the repository browser.