1 /**********************************************************************************************
2     Copyright (C) 2014 Oliver Eichler <oliver.eichler@gmx.de>
3     Copyright (C) 2017 Norbert Truchsess <norbert.truchsess@t-online.de>
4 
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation, either version 3 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 
18 **********************************************************************************************/
19 
20 #ifndef CGISLISTWKS_H
21 #define CGISLISTWKS_H
22 
23 #include "gis/prj/IGisProject.h"
24 #include "gis/trk/CTrackData.h"
25 
26 #include <QPointer>
27 #include <QSqlDatabase>
28 #include <QTreeWidget>
29 
30 struct action_t;
31 class QAction;
32 class CGeoSearch;
33 class IGisProject;
34 class CDBProject;
35 class IDeviceWatcher;
36 class QActionGroup;
37 
38 class CGisListWks : public QTreeWidget
39 {
40     Q_OBJECT
41 public:
42     CGisListWks(QWidget* parent);
43     virtual ~CGisListWks();
44 
45     enum column_e
46     {
47         eColumnIcon = 0
48         , eColumnCheckBox = eColumnIcon
49         , eColumnDecoration = eColumnIcon
50         , eColumnRating = 1
51         , eColumnName = 2
52     };
53 
54 
55     void setExternalMenu(QMenu* project);
56     bool hasProject(IGisProject* project);
57 
58     IGisProject* getProjectByKey(const QString& key);
59     CDBProject* getProjectById(quint64 id, const QString& db);
60 
61     bool event(QEvent* e) override;
62 
63     void addProject(IGisProject* proj);
64 
65     void removeDevice(const QString& key);
66 
67 public slots:
68     void slotLoadWorkspace();
69 
70 signals:
71     void sigChanged();
72     void sigItemDeleted();
73 
74 protected:
75     void dragMoveEvent(QDragMoveEvent* e) override;
76     void dropEvent(QDropEvent* e) override;
77 
78 private slots:
79     void slotSaveWorkspace();
80     void slotContextMenu(const QPoint& point);
81     void slotSaveProject();
82     void slotSaveAsProject();
83     void slotSaveAsStrictGpx11Project();
84     void slotEditPrj();
85     void slotCloseProject();
86     void slotDeleteProject();
87     void slotShowOnMap();
88     void slotHideFrMap();
89     void slotItemDoubleClicked(QTreeWidgetItem* item, int);
90     void slotItemChanged(QTreeWidgetItem* item, int column);
91     void slotEditItem();
92     void slotTagItem();
93     void slotDeleteItem();
94     void slotBubbleWpt();
95     void slotNogoItem();
96     void slotDelRadiusWpt();
97     void slotEditRadiusWpt();
98     void slotProjWpt();
99     void slotMoveWpt();
100     void slotCopyCoordWpt();
101     void slotFocusTrk(bool on);
102     void slotEditTrk();
103     void slotReverseTrk();
104     void slotCombineTrk();
105     void slotRangeTrk();
106     void slotActivityTrk(trkact_t act);
107     void slotColorTrk();
108     void slotCopyTrkWithWpt();
109     void slotFocusRte(bool on);
110     void slotCalcRte();
111     void slotResetRte();
112     void slotEditRte();
113     void slotReverseRte();
114     void slotRte2Trk();
115     void slotEditArea();
116     void slotAddEmptyProject();
117     void slotCloseAllProjects();
118     void slotGeoSearch(bool on);
119     void slotCopyItem();
120     void slotSyncWksDev();
121     void slotSyncDevWks();
122     void slotRteFromWpt();
123     void slotEditPrxWpt();
124     void slotSyncDB();
125     void slotSetSortMode(IGisProject::sorting_folder_e mode, bool checked);
126     void slotCopyProject();
127     void slotSymWpt();
128     void slotEleWptTrk();
129     void slotAutoSaveProject(bool on);
130     void slotUserFocusPrj(bool yes);
131     void slotAutoSyncProject(bool yes);
132     void slotAddProjectFilter();
133     void slotNewDevice();
134     void slotSyncPrjToDevices();
135     void slotToRoute();
136 
137 private:
138     void configDB();
139     void initDB();
140     void migrateDB(int version);
141     void migrateDB1to2();
142     void migrateDB2to3();
143     void migrateDB3to4();
144     void setVisibilityOnMap(bool visible);
145     QAction* addSortAction(QObject* parent, QActionGroup* actionGroup, const QString& icon, const QString& text, IGisProject::sorting_folder_e mode);
146 
147     template<typename Func>
addAction(const QIcon & icon,const QString & name,QObject * parent,Func slot)148     QAction* addAction(const QIcon& icon, const QString& name, QObject* parent, Func slot)
149     {
150         QAction* action = new QAction(icon, name, parent);
151         connect(action, &QAction::triggered, this, slot);
152         return action;
153     }
154 
155     void showMenuProjectWks(const QPoint& p);
156     void showMenuProjectDev(const QPoint& p);
157     void showMenuProjectTrash(const QPoint& p);
158     void showMenuItemTrk(const QPoint& p, const IGisItem::key_t& key);
159     void showMenuItemWpt(const QPoint& p, CGisItemWpt* wpt);
160     void showMenuItemRte(const QPoint& p);
161     void showMenuItemOvl(const QPoint& p);
162     void showMenuItem(const QPoint& p, const QList<IGisItem::key_t>& keysTrks, const QList<IGisItem::key_t>& keysWpts);
163 
164     void syncPrjToDevices(IGisProject* project, const QSet<QString>& keys);
165     QSet<QString> getAllDeviceKeys() const;
166 
167     template<typename T>
selectedItems2Keys()168     QList<IGisItem::key_t> selectedItems2Keys() const
169     {
170         QList<IGisItem::key_t> keys;
171         const QList<QTreeWidgetItem*>& items = selectedItems();
172         for(const QTreeWidgetItem* item : items)
173         {
174             const T* gisItem = dynamic_cast<const T*>(item);
175             if(nullptr != gisItem)
176             {
177                 keys << gisItem->getKey();
178             }
179         }
180         return keys;
181     }
182 
183     QSqlDatabase db;
184 
185     QActionGroup* actionGroupSort;
186     QAction* actionSave;
187     QAction* actionSaveAs;
188     QAction* actionSaveAsStrict;
189     QAction* actionAutoSave;
190     QAction* actionUserFocusPrj;
191     QAction* actionAutoSyncToDev;
192     QAction* actionCopyPrj;
193     QAction* actionEditPrj;
194     QAction* actionCloseProj;
195     QAction* actionShowOnMap;
196     QAction* actionHideFrMap;
197     QAction* actionSyncWksDev;
198     QAction* actionSyncDB;
199     QAction* actionSortByTime;
200     QAction* actionSortByName;
201     QAction* actionSortByRating;
202     QAction* actionFilterProject;
203     QAction* actionDelProj;
204     QAction* actionSyncDevWks;
205     QAction* actionEditDetails;
206     QAction* actionTagItem;
207     QAction* actionCopyItem;
208     QAction* actionDelete;
209     QAction* actionBubbleWpt;
210     QAction* actionDelRadiusWpt;
211     QAction* actionNogoWpt;
212     QAction* actionEditRadiusWpt;
213     QAction* actionProjWpt;
214     QAction* actionMoveWpt;
215     QAction* actionCopyCoordWpt;
216     QAction* actionFocusTrk;
217     QAction* actionEditTrk;
218     QAction* actionReverseTrk;
219     QAction* actionCombineTrk;
220     QAction* actionRangeTrk;
221     QAction* actionNogoTrk;
222     QAction* actionCopyTrkWithWpt;
223     QAction* actionFocusRte;
224     QAction* actionCalcRte;
225     QAction* actionResetRte;
226     QAction* actionEditRte;
227     QAction* actionNogoRte;
228     QAction* actionReverseRte;
229     QAction* actionRte2Trk;
230     QAction* actionEditArea;
231     QAction* actionNogoArea;
232     QAction* actionRteFromWpt;
233     QAction* actionEditPrxWpt;
234     QAction* actionToRoute;
235 
236     QAction* actionEleWptTrk;
237 
238     QMenu* menuNone = nullptr;
239 
240     QPointer<CGeoSearch> geoSearch;
241 
242     bool saveOnExit = true;
243     qint32 saveEvery = 5;
244 
245     IDeviceWatcher* deviceWatcher = nullptr;
246 
247     bool blockSorting = false;
248 };
249 
250 #endif //CGISLISTWKS_H
251 
252