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