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