玉兔远程控制 0.1.0-alpha.2
载入中...
搜索中...
未找到
FavoriteView.cpp
1#include "FavoriteView.h"
2
3#include <QMouseEvent>
4#include <QDrag>
5#include <QMimeData>
6#include <QApplication>
7#include <QHeaderView>
8#include <QSettings>
9#include <QStandardItemModel>
10#include <QStandardItem>
11#include <QSettings>
12#include <QMenu>
13#include <QAction>
14#include <QInputDialog>
15#include <QMessageBox>
16#include <QDir>
17#include <QLoggingCategory>
18
19#include "FavoriteMimeData.h"
20#include "RabbitCommonDir.h"
21
22static Q_LOGGING_CATEGORY(log, "App.MainWindow.Favorite")
23
24CFavoriteView::CFavoriteView(QWidget *parent) : QTreeView(parent),
25 m_pDockTitleBar(nullptr),
26 m_pModel(nullptr)
27{
28 setWindowTitle(tr("Favorite"));
29 setFocusPolicy(Qt::NoFocus);
30 header()->hide();
31
32 setAcceptDrops(true);
33
34 m_pModel = new QStandardItemModel(this);
35 setModel(m_pModel);
36
37 setContextMenuPolicy(Qt::CustomContextMenu);
38 bool check = connect(this,
39 SIGNAL(customContextMenuRequested(const QPoint &)),
40 this, SLOT(slotCustomContextMenu(const QPoint &)));
41 Q_ASSERT(check);
42 check = connect(this, SIGNAL(clicked(const QModelIndex&)),
43 this, SLOT(slotFavrtieClicked(const QModelIndex&)));
44 Q_ASSERT(check);
45 check = connect(this, SIGNAL(doubleClicked(const QModelIndex&)),
46 this, SLOT(slotFavortiedoubleClicked(const QModelIndex&)));
47 Q_ASSERT(check);
48
49 m_szSaveFile = RabbitCommon::CDir::Instance()->GetDirUserConfig()
50 + QDir::separator() + "Favorite.ini";
51 QSettings set(m_szSaveFile, QSettings::IniFormat);
52 int nRootCount = 0;
53 nRootCount = set.value("RootCount").toInt();
54 for(int i = 0; i < nRootCount; i++)
55 {
56 QString name = set.value("Name_" + QString::number(i)).toString();
57 QString file = set.value("File_" + QString::number(i)).toString();
58 if(name.isEmpty()) {
59 qCritical(log) << "Current node is empty!";
60 continue;
61 }
62 QStandardItem* item = new QStandardItem(name);
63 item->setIcon(QIcon::fromTheme("network-wired"));
64 if(item)
65 {
66 QIcon icon = set.value("Icon_" + QString::number(i)).value<QIcon>();
67 if(!icon.isNull())
68 item->setIcon(icon);
69 QString szDescript = set.value("Descripte_" + QString::number(i)).toString();
70 if(!szDescript.isEmpty())
71 item->setToolTip(szDescript);
72 item->setData(file);
73 m_pModel->appendRow(item);
74 }
75 }
76 int nGroupCount = set.value("GroupCount").toInt();
77 for(int g = 0; g < nGroupCount; g++)
78 {
79 QString szGroup = set.value("Group_" + QString::number(g)).toString();
80 QStandardItem* pGroup = new QStandardItem(szGroup);
81 pGroup->setIcon(QIcon::fromTheme("network-workgroup"));
82 m_pModel->appendRow(pGroup);
83 int n = set.value(szGroup + "/" + "count").toInt();
84 for(int i = 0; i < n; i++)
85 {
86 QString name = set.value(szGroup + "/Name_" + QString::number(i)).toString();
87 if(name.isEmpty())
88 {
89 qCritical(log) << "Current node is empty!";
90 continue;
91 }
92 QStandardItem* item = new QStandardItem(name);
93 if(item)
94 {
95 QIcon icon = set.value(szGroup + "/Icon_" + QString::number(i)).value<QIcon>();
96 if(!icon.isNull())
97 item->setIcon(icon);
98 QString szDescript = set.value(szGroup + "/Descripte_" + QString::number(i)).toString();
99 if(!szDescript.isEmpty())
100 item->setToolTip(szDescript);
101 QString file = set.value(szGroup + "/File_" + QString::number(i)).toString();
102 if(file.isEmpty())
103 {
104 qCritical(log) << "File is empty";
105 } else
106 item->setData(file);
107 pGroup->appendRow(item);
108 }
109 }
110 }
111
112 m_pDockTitleBar = new RabbitCommon::CTitleBar(parent);
113 // Create tools pushbutton in title bar
114 m_pMenu = new QMenu(tr("Tools"), m_pDockTitleBar);
115 check = connect(m_pMenu, SIGNAL(aboutToShow()), this, SLOT(slotMenu()));
116 Q_ASSERT(check);
117 QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
118 QIcon::fromTheme("tools"), m_pDockTitleBar);
119 pTools->setToolTip(tr("Tools"));
120 pTools->setMenu(m_pMenu);
121 QList<QWidget*> lstWidget;
122 lstWidget << pTools;
123 m_pDockTitleBar->AddWidgets(lstWidget);
124}
125
126CFavoriteView::~CFavoriteView()
127{
128 Save();
129}
130
131int CFavoriteView::Save()
132{
133 int nRet = 0;
134 if(!m_pModel)
135 return -1;
136 QSettings set(m_szSaveFile, QSettings::IniFormat);
137 int nRootCount = 0;
138 int nGroup = 0;
139 for(int rootIndex = 0; rootIndex < m_pModel->rowCount(); rootIndex++)
140 {
141 auto rootItem = m_pModel->item(rootIndex);
142 if(!rootItem) continue;
143 QString text = rootItem->text();
144 QVariant data = rootItem->data();
145 if(rootItem->hasChildren() || rootItem->data().isNull())
146 {
147 int nCount = 0;
148 QString szGroup = rootItem->text();
149 set.setValue("Group_" + QString::number(nGroup++), szGroup);
150 for(int childIndex = 0; childIndex < rootItem->rowCount(); childIndex++)
151 {
152 auto childItem = rootItem->child(childIndex);
153 if(!childItem) continue;
154
155 set.setValue(szGroup + "/Name_" + QString::number(nCount), childItem->text());
156 set.setValue(szGroup + "/Descripte_" + QString::number(nCount), childItem->toolTip());
157 set.setValue(szGroup + "/Icon_" + QString::number(nCount), childItem->icon());
158 set.setValue(szGroup + "/File_" + QString::number(nCount), childItem->data());
159
160 nCount++;
161 }
162 set.setValue(szGroup + "/" + "count", nCount);
163 } else {
164 set.setValue("Name_" + QString::number(nRootCount), rootItem->text());
165 set.setValue("Descripte_" + QString::number(nRootCount), rootItem->toolTip());
166 set.setValue("Icon_" + QString::number(nRootCount), rootItem->icon());
167 set.setValue("File_" + QString::number(nRootCount), rootItem->data());
168 nRootCount++;
169 }
170 }
171 set.setValue("RootCount", nRootCount);
172 set.setValue("GroupCount", nGroup);
173 return nRet;
174}
175
176void CFavoriteView::slotAddToFavorite(const QString &szName,
177 const QString &szDescription,
178 const QIcon &icon,
179 const QString &szFile)
180{
181 if(!m_pModel) return;
182 QStandardItem* pItem = nullptr;
183 QString szGroup;
184 auto indexes = selectionModel()->selectedIndexes();
185 if(indexes.isEmpty())
186 {
187 auto it = m_pModel->findItems(szName, Qt::MatchFixedString);
188 if(it.isEmpty())
189 {
190 pItem = new QStandardItem(szName);
191 pItem->setIcon(icon); //QIcon::fromTheme("network-wired"));
192 pItem->setToolTip(szDescription);
193 m_pModel->appendRow(pItem);
194 } else {
195 QList<QStandardItem*>::iterator i;
196 for(i = it.begin(); i != it.end(); i++)
197 {
198 if((*i)->data() == szFile)
199 break;
200 }
201 if(it.end() != i)
202 return;
203 pItem = new QStandardItem(szName);
204 pItem->setIcon(icon); //QIcon::fromTheme("network-wired"));
205 pItem->setToolTip(szDescription);
206 m_pModel->appendRow(pItem);
207 }
208 } else {
209 auto itemGroup = m_pModel->itemFromIndex(indexes[0]);
210 if(itemGroup->data().isValid())
211 {
212 auto it = m_pModel->findItems(szName, Qt::MatchFixedString);
213 if(it.isEmpty())
214 {
215 pItem = new QStandardItem(szName);
216 pItem->setIcon(icon); //QIcon::fromTheme("network-wired"));
217 pItem->setToolTip(szDescription);
218 m_pModel->appendRow(pItem);
219 }
220 } else {
221 szGroup = itemGroup->text();
222 auto lstGroup = m_pModel->findItems(szGroup, Qt::MatchFixedString);
223 if(lstGroup.isEmpty())
224 {
225 QStandardItem* pGroup = new QStandardItem(szGroup);
226 m_pModel->appendRow(pGroup);
227 pItem = new QStandardItem(szName);
228 pItem->setIcon(icon); //QIcon::fromTheme("network-wired"));
229 pItem->setToolTip(szDescription);
230 pGroup->appendRow(pItem);
231 } else {
232 if(lstGroup[0]->data().isValid()) return;
233 for(int i = 0; i < lstGroup[0]->rowCount(); i++)
234 {
235 auto item = lstGroup[0]->child(i);
236 if(item->text() == szName)
237 return;
238 }
239 pItem = new QStandardItem(szName);
240 pItem->setIcon(icon); //QIcon::fromTheme("network-wired"));
241 pItem->setToolTip(szDescription);
242 lstGroup[0]->appendRow(pItem);
243 }
244 }
245 }
246 if(pItem)
247 pItem->setData(szFile);
248 return;
249}
250
251void CFavoriteView::slotFavrtieClicked(const QModelIndex &index)
252{
253}
254
255void CFavoriteView::slotFavortiedoubleClicked(const QModelIndex &index)
256{
257 auto item = m_pModel->itemFromIndex(index);
258 if(!item) return;
259 if(editTriggers() != QTreeView::NoEditTriggers)
260 return;
261 QString szFile = item->data().toString();
262 if(!szFile.isEmpty())
263 emit sigStart(szFile, false);
264}
265
266void CFavoriteView::slotDoubleEditNode(bool bEdit)
267{
268 if(bEdit)
269 setEditTriggers(QTreeView::DoubleClicked);
270 else
271 setEditTriggers(QTreeView::NoEditTriggers);
272}
273
274void CFavoriteView::slotMenu()
275{
276 auto index = this->currentIndex();
277 auto item = m_pModel->itemFromIndex(index);
278 m_pMenu->clear();
279 if(item)
280 {
281 if(item->data().isValid()) {
282 m_pMenu->addAction(tr("Start"), this, SLOT(slotStart()));
283 m_pMenu->addAction(tr("Open settings and Start"), this, SLOT(slotOpenStart()));
284 m_pMenu->addAction(tr("Delete operate"), this, SLOT(slotDelete()));
285 }
286 m_pMenu->addSeparator();
287 m_pMenu->addAction(tr("New group"), this, SLOT(slotNewGroup()));
288 if(!item->data().isValid())
289 m_pMenu->addAction(tr("Delete group"), this, SLOT(slotDelete()));
290 } else
291 m_pMenu->addAction(tr("New group"), this, SLOT(slotNewGroup()));
292
293 // m_pMenu->addSeparator();
294 // m_pMenu->addAction(tr("Add current operate to favorite"), this, SIGNAL(sigFavorite()));
295}
296
297void CFavoriteView::slotCustomContextMenu(const QPoint &pos)
298{
299 slotMenu();
300 m_pMenu->exec(mapToGlobal(pos));
301}
302
303void CFavoriteView::slotStart()
304{
305 auto lstIndex = selectionModel()->selectedIndexes();
306 foreach(auto index, lstIndex)
307 {
308 auto item = m_pModel->itemFromIndex(index);
309 if(!item) return;
310 QString szFile = item->data().toString();
311 if(!szFile.isEmpty())
312 emit sigStart(szFile, false);
313 }
314}
315
316void CFavoriteView::slotOpenStart()
317{
318 auto lstIndex = selectionModel()->selectedIndexes();
319 foreach(auto index, lstIndex)
320 {
321 auto item = m_pModel->itemFromIndex(index);
322 QString szFile = item->data().toString();
323 if(!szFile.isEmpty())
324 emit sigStart(szFile, true);
325 }
326}
327
328void CFavoriteView::slotDelete()
329{
330 auto lstIndex = selectionModel()->selectedIndexes();
331 foreach(auto index, lstIndex)
332 m_pModel->removeRow(index.row(), index.parent());
333}
334
335void CFavoriteView::slotNewGroup()
336{
337 QString szGroup = QInputDialog::getText(this, tr("Input"), tr("Input group name"));
338 if(szGroup.isEmpty()) return;
339 auto lstItem = m_pModel->findItems(szGroup);
340 if(!lstItem.isEmpty())
341 {
342 QMessageBox::critical(this, tr("Error"), tr("The group [%1] is existed").arg(szGroup));
343 return;
344 }
345
346 QStandardItem* pGroup = new QStandardItem(szGroup);
347 pGroup->setIcon(QIcon::fromTheme("network-workgroup"));
348 m_pModel->appendRow(pGroup);
349}
350
351void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
352{
353 qDebug(log) << "dragEnterEvent";
354 const CFavoriteMimeData* pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
355 if (pData)
356 {
357 qDebug(log) << "dragEnterEvent acceptProposedAction";
358 event->acceptProposedAction();
359 }
360}
361
362void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
363{
364}
365
366void CFavoriteView::dropEvent(QDropEvent *event)
367{
368 qDebug(log) << "dropEvent";
369 const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
370 if(!pData) return;
371 QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(model());
372 if(!pModel) return;
373#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
374 auto index = indexAt(event->position().toPoint());
375#else
376 auto index = indexAt(event->pos());
377#endif
378 if(index.isValid())
379 {
380 auto item = pModel->itemFromIndex(index);
381 if(item->data().isNull())
382 {
383 foreach(auto i, pData->m_Items)
384 {
385 qDebug(log) << "dropEvent:" << item->text();
386
387 auto newItem = NewItem(i);
388 item->appendRow(newItem);
389 if(event->dropAction() == Qt::MoveAction)
390 pModel->removeRow(i.row(), i.parent());
391 }
392 } else
393 qWarning(log) << "Don't group node. the data:" << item->data();
394 }else{
395 foreach(auto i, pData->m_Items)
396 {
397 pModel->appendRow(NewItem(i));
398 if(event->dropAction() == Qt::MoveAction)
399 pModel->removeRow(i.row(), i.parent());
400 }
401 }
402
403 event->accept();
404}
405
406QStandardItem* CFavoriteView::NewItem(const QModelIndex &index)
407{
408 QStandardItemModel* pModel = dynamic_cast<QStandardItemModel*>(model());
409 if(!pModel) return nullptr;
410 auto item = pModel->itemFromIndex(index);
411 if(!item) return nullptr;
412 auto ri = new QStandardItem(item->text());
413 ri->setData(item->data());
414 return ri;
415}
416
417void CFavoriteView::mousePressEvent(QMouseEvent *event)
418{
419 if (event->button() == Qt::LeftButton)
420 m_DragStartPosition = event->pos();
421 QTreeView::mousePressEvent(event);
422}
423
424void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
425{
426 qDebug(log) << "mouseMoveEvent";
427 do{
428 if (!(event->buttons() & Qt::LeftButton))
429 break;
430 if ((event->pos() - m_DragStartPosition).manhattanLength()
431 < QApplication::startDragDistance())
432 break;
433 qDebug(log) << "mouseMoveEvent drag";
434 QDrag *drag = new QDrag(this);
436 pData->m_Items = this->selectionModel()->selectedIndexes();
437 drag->setMimeData(pData);
438
439 Qt::DropAction dropAction = Qt::MoveAction;
440 if(event->modifiers() & Qt::ControlModifier)
441 dropAction = Qt::CopyAction;
442 drag->exec(dropAction);
443 } while (false);
444
445 QTreeView::mouseMoveEvent(event);
446}