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