source: subversion/applications/editors/merkaartor/DirtyDock.cpp @ 8167

Last change on this file since 8167 was 8167, checked in by Chris Browet, 12 years ago

Beware! This one is big and probably bugged. It just became too big to be test manageable on my own. Please test and report bugs.

FIX : segfault with MDC containing history where a feature is created and deleted
ADD : "Dirty" layer where all modified features go
ADD : "Undo" dock with all undo actions (closes #782)

  • Property svn:executable set to *
File size: 4.0 KB
Line 
1//
2// C++ Implementation: DirtyDock
3//
4// Description:
5//
6//
7// Author: cbro <cbro@semperpax.com>, (C) 2008
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#include "DirtyDock.h"
13#include "PropertiesDock.h"
14#include "MainWindow.h"
15#include "MapView.h"
16#include "Preferences/MerkaartorPreferences.h"
17#include "Map/MapDocument.h"
18#include "Map/MapLayer.h"
19#include "Map/MapFeature.h"
20#include "Map/DownloadOSM.h"
21#include "Command/Command.h"
22#include "Sync/DirtyList.h"
23
24#include <QMessageBox>
25
26DirtyDock::DirtyDock(MainWindow* aParent)
27        : QDockWidget(aParent), Main(aParent)
28{
29        setMinimumSize(220,100);
30        setWindowTitle(tr("Undo"));
31        setObjectName("dirtyDock");
32
33        QWidget *widget = new QWidget;
34        ui.setupUi(widget);
35        setWidget(widget);
36
37        centerAction = new QAction(tr("Center map"), this);
38        connect(centerAction, SIGNAL(triggered()), this, SLOT(on_centerAction_triggered()));
39        centerZoomAction = new QAction(tr("Center && Zoom map"), this);
40        connect(centerZoomAction, SIGNAL(triggered()), this, SLOT(on_centerZoomAction_triggered()));
41
42        connect(ui.ChangesList, SIGNAL(itemSelectionChanged()), this, SLOT(on_ChangesList_itemSelectionChanged()));
43        connect(ui.ChangesList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_ChangesList_itemDoubleClicked(QListWidgetItem*)));
44        connect(ui.ChangesList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(on_ChangesList_customContextMenuRequested(const QPoint &)));
45}
46
47
48DirtyDock::~DirtyDock()
49{
50}
51
52
53void DirtyDock::updateList()
54{
55        if (Main->document()->getDirtyLayer()->size())
56                ui.label->setText(tr("There are <b>%1</b> object(s) in the dirty layer").arg(Main->document()->getDirtyLayer()->size()));
57        else
58                ui.label->setText(tr("There is <b>no</b> object in the dirty layer"));
59
60        ui.ChangesList->clear();
61
62        Main->document()->history().buildUndoList(ui.ChangesList);
63}
64
65void DirtyDock::on_ChangesList_itemSelectionChanged()
66{
67        MapFeature* F;
68
69        if (ui.ChangesList->selectedItems().count() != 0) {
70
71                if (ui.ChangesList->selectedItems().count() == 1) {
72                        F = Main->document()->getFeature(ui.ChangesList->selectedItems()[0]->data(Qt::UserRole).toString());
73                        if (F)
74                                Main->properties()->setSelection(F);
75                } else {
76                        Selection.clear();
77                        for (int i=0; i < ui.ChangesList->selectedItems().count(); ++i) {
78                                F = Main->document()->getFeature(ui.ChangesList->selectedItems()[i]->data(Qt::UserRole).toString());
79                                if (F)
80                                        Selection.push_back(F);
81                        }
82                        Main->properties()->setMultiSelection(Selection);
83                }
84
85        }
86        Main->view()->update();
87}
88
89void DirtyDock::on_ChangesList_itemDoubleClicked(QListWidgetItem* /* item */)
90{
91        on_centerAction_triggered();
92}
93
94void DirtyDock::on_ChangesList_customContextMenuRequested(const QPoint & pos)
95{
96        QListWidgetItem *it = ui.ChangesList->itemAt(pos);
97        if (it) {
98                QMenu menu(ui.ChangesList);
99                menu.addAction(centerAction);
100                menu.addAction(centerZoomAction);
101                menu.exec(ui.ChangesList->mapToGlobal(pos));
102        }
103}
104
105void DirtyDock::on_centerAction_triggered()
106{
107        MapFeature* F;
108        CoordBox cb;
109
110        Main->setUpdatesEnabled(false);
111        for (int i=0; i < ui.ChangesList->selectedItems().count(); ++i) {
112                F = Main->document()->getFeature(ui.ChangesList->selectedItems()[0]->data(Qt::UserRole).toString());
113                if (F) {
114                        if (cb.isNull())
115                                cb = F->boundingBox();
116                        else
117                                cb.merge(F->boundingBox());
118                }
119        }
120        if (!cb.isNull()) {
121                Coord c = cb.center();
122                Main->view()->projection().setCenter(c, Main->view()->rect());
123                Main->invalidateView();
124        }
125        Main->setUpdatesEnabled(true);
126}
127
128void DirtyDock::on_centerZoomAction_triggered()
129{
130        MapFeature* F;
131        CoordBox cb;
132
133        Main->setUpdatesEnabled(false);
134        for (int i=0; i < ui.ChangesList->selectedItems().count(); ++i) {
135                F = Main->document()->getFeature(ui.ChangesList->selectedItems()[0]->data(Qt::UserRole).toString());
136                if (F) {
137                        if (cb.isNull())
138                                cb = F->boundingBox();
139                        else
140                                cb.merge(F->boundingBox());
141                }
142        }
143        if (!cb.isNull()) {
144                CoordBox min(cb.center()-0.00001, cb.center()+0.00001);
145                cb.merge(min);
146                cb = cb.zoomed(1.1);
147                Main->view()->projection().setViewport(cb, Main->view()->rect());
148                Main->invalidateView();
149        }
150        Main->setUpdatesEnabled(true);
151}
Note: See TracBrowser for help on using the repository browser.