1#include "FavoriteView.h"
9#include <QStandardItemModel>
10#include <QStandardItem>
14#include <QInputDialog>
17#include <QLoggingCategory>
19#include "FavoriteMimeData.h"
20#include "RabbitCommonDir.h"
22static Q_LOGGING_CATEGORY(log,
"App.MainWindow.Favorite")
25 m_pDockTitleBar(
nullptr),
28 setWindowTitle(tr(
"Favorite"));
34 m_pModel =
new QStandardItemModel(
this);
37 setContextMenuPolicy(Qt::CustomContextMenu);
38 bool check = connect(
this,
39 SIGNAL(customContextMenuRequested(
const QPoint &)),
40 this, SLOT(slotCustomContextMenu(
const QPoint &)));
42 check = connect(
this, SIGNAL(clicked(
const QModelIndex&)),
43 this, SLOT(slotFavrtieClicked(
const QModelIndex&)));
45 check = connect(
this, SIGNAL(doubleClicked(
const QModelIndex&)),
46 this, SLOT(slotFavortiedoubleClicked(
const QModelIndex&)));
49 m_pDockTitleBar =
new RabbitCommon::CTitleBar(parent);
51 m_pMenu =
new QMenu(tr(
"Tools"), m_pDockTitleBar);
52 check = connect(m_pMenu, SIGNAL(aboutToShow()),
this, SLOT(slotMenu()));
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;
60 m_pDockTitleBar->AddWidgets(lstWidget);
63CFavoriteView::~CFavoriteView()
68int CFavoriteView::Load()
70 m_szSaveFile = RabbitCommon::CDir::Instance()->GetDirUserConfig()
71 + QDir::separator() +
"Favorite.ini";
72 QSettings set(m_szSaveFile, QSettings::IniFormat);
74 nRootCount = set.value(
"RootCount").toInt();
75 for(
int i = 0; i < nRootCount; i++)
77 QString name = set.value(
"Name_" + QString::number(i)).toString();
78 QString file = set.value(
"File_" + QString::number(i)).toString();
80 qCritical(log) <<
"Current node is empty!";
83 QStandardItem* item =
new QStandardItem(name);
84 item->setIcon(QIcon::fromTheme(
"network-wired"));
87 QIcon icon = set.value(
"Icon_" + QString::number(i)).value<QIcon>();
90 QString szDescript = set.value(
"Descripte_" + QString::number(i)).toString();
91 if(!szDescript.isEmpty())
92 item->setToolTip(szDescript);
94 m_pModel->appendRow(item);
97 int nGroupCount = set.value(
"GroupCount").toInt();
98 for(
int g = 0; g < nGroupCount; g++)
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++)
107 QString name = set.value(szGroup +
"/Name_" + QString::number(i)).toString();
110 qCritical(log) <<
"Current node is empty!";
113 QStandardItem* item =
new QStandardItem(name);
116 QIcon icon = set.value(szGroup +
"/Icon_" + QString::number(i)).value<QIcon>();
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();
125 qCritical(log) <<
"File is empty";
128 pGroup->appendRow(item);
135int CFavoriteView::Save()
140 QSettings set(m_szSaveFile, QSettings::IniFormat);
143 for(
int rootIndex = 0; rootIndex < m_pModel->rowCount(); rootIndex++)
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())
152 QString szGroup = rootItem->text();
153 set.setValue(
"Group_" + QString::number(nGroup++), szGroup);
154 for(
int childIndex = 0; childIndex < rootItem->rowCount(); childIndex++)
156 auto childItem = rootItem->child(childIndex);
157 if(!childItem)
continue;
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());
166 set.setValue(szGroup +
"/" +
"count", nCount);
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());
175 set.setValue(
"RootCount", nRootCount);
176 set.setValue(
"GroupCount", nGroup);
180void CFavoriteView::slotAddToFavorite(
const QString &szName,
181 const QString &szDescription,
183 const QString &szFile)
185 if(!m_pModel)
return;
186 QStandardItem* pItem =
nullptr;
188 auto indexes = selectionModel()->selectedIndexes();
189 if(indexes.isEmpty())
191 auto it = m_pModel->findItems(szName, Qt::MatchFixedString);
194 pItem =
new QStandardItem(szName);
195 pItem->setIcon(icon);
196 pItem->setToolTip(szDescription);
197 m_pModel->appendRow(pItem);
199 QList<QStandardItem*>::iterator i;
200 for(i = it.begin(); i != it.end(); i++)
202 if((*i)->data() == szFile)
207 pItem =
new QStandardItem(szName);
208 pItem->setIcon(icon);
209 pItem->setToolTip(szDescription);
210 m_pModel->appendRow(pItem);
213 auto itemGroup = m_pModel->itemFromIndex(indexes[0]);
214 if(itemGroup->data().isValid())
216 auto it = m_pModel->findItems(szName, Qt::MatchFixedString);
219 pItem =
new QStandardItem(szName);
220 pItem->setIcon(icon);
221 pItem->setToolTip(szDescription);
222 m_pModel->appendRow(pItem);
225 szGroup = itemGroup->text();
226 auto lstGroup = m_pModel->findItems(szGroup, Qt::MatchFixedString);
227 if(lstGroup.isEmpty())
229 QStandardItem* pGroup =
new QStandardItem(szGroup);
230 m_pModel->appendRow(pGroup);
231 pItem =
new QStandardItem(szName);
232 pItem->setIcon(icon);
233 pItem->setToolTip(szDescription);
234 pGroup->appendRow(pItem);
236 if(lstGroup[0]->data().isValid())
return;
237 for(
int i = 0; i < lstGroup[0]->rowCount(); i++)
239 auto item = lstGroup[0]->child(i);
240 if(item->text() == szName)
243 pItem =
new QStandardItem(szName);
244 pItem->setIcon(icon);
245 pItem->setToolTip(szDescription);
246 lstGroup[0]->appendRow(pItem);
251 pItem->setData(szFile);
255void CFavoriteView::slotFavrtieClicked(
const QModelIndex &index)
259void CFavoriteView::slotFavortiedoubleClicked(
const QModelIndex &index)
261 auto item = m_pModel->itemFromIndex(index);
263 if(editTriggers() != QTreeView::NoEditTriggers)
265 QString szFile = item->data().toString();
266 if(!szFile.isEmpty())
267 emit sigStart(szFile,
false);
270void CFavoriteView::slotDoubleEditNode(
bool bEdit)
273 setEditTriggers(QTreeView::DoubleClicked);
275 setEditTriggers(QTreeView::NoEditTriggers);
278void CFavoriteView::slotMenu()
280 auto index = this->currentIndex();
281 auto item = m_pModel->itemFromIndex(index);
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()));
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()));
295 m_pMenu->addAction(tr(
"New group"),
this, SLOT(slotNewGroup()));
301void CFavoriteView::slotCustomContextMenu(
const QPoint &pos)
304 m_pMenu->exec(mapToGlobal(pos));
307void CFavoriteView::slotStart()
309 auto lstIndex = selectionModel()->selectedIndexes();
310 foreach(
auto index, lstIndex)
312 auto item = m_pModel->itemFromIndex(index);
314 QString szFile = item->data().toString();
315 if(!szFile.isEmpty())
316 emit sigStart(szFile,
false);
320void CFavoriteView::slotOpenStart()
322 auto lstIndex = selectionModel()->selectedIndexes();
323 foreach(
auto index, lstIndex)
325 auto item = m_pModel->itemFromIndex(index);
326 QString szFile = item->data().toString();
327 if(!szFile.isEmpty())
328 emit sigStart(szFile,
true);
332void CFavoriteView::slotDelete()
334 auto lstIndex = selectionModel()->selectedIndexes();
335 foreach(
auto index, lstIndex)
336 m_pModel->removeRow(index.row(), index.parent());
339void CFavoriteView::slotNewGroup()
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())
346 QMessageBox::critical(
this, tr(
"Error"), tr(
"The group [%1] is existed").arg(szGroup));
350 QStandardItem* pGroup =
new QStandardItem(szGroup);
351 pGroup->setIcon(QIcon::fromTheme(
"network-workgroup"));
352 m_pModel->appendRow(pGroup);
355void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
357 qDebug(log) <<
"dragEnterEvent";
358 const CFavoriteMimeData* pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
361 qDebug(log) <<
"dragEnterEvent acceptProposedAction";
362 event->acceptProposedAction();
366void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
370void CFavoriteView::dropEvent(QDropEvent *event)
372 qDebug(log) <<
"dropEvent";
373 const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
375 QStandardItemModel* pModel =
dynamic_cast<QStandardItemModel*
>(model());
377#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
378 auto index = indexAt(event->position().toPoint());
380 auto index = indexAt(event->pos());
384 auto item = pModel->itemFromIndex(index);
385 if(item->data().isNull())
387 foreach(
auto i, pData->m_Items)
389 qDebug(log) <<
"dropEvent:" << item->text();
391 auto newItem = NewItem(i);
392 item->appendRow(newItem);
393 if(event->dropAction() == Qt::MoveAction)
394 pModel->removeRow(i.row(), i.parent());
397 qWarning(log) <<
"Don't group node. the data:" << item->data();
399 foreach(
auto i, pData->m_Items)
401 pModel->appendRow(NewItem(i));
402 if(event->dropAction() == Qt::MoveAction)
403 pModel->removeRow(i.row(), i.parent());
410QStandardItem* CFavoriteView::NewItem(
const QModelIndex &index)
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());
421void CFavoriteView::mousePressEvent(QMouseEvent *event)
423 if (event->button() == Qt::LeftButton)
424 m_DragStartPosition =
event->pos();
425 QTreeView::mousePressEvent(event);
428void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
430 qDebug(log) <<
"mouseMoveEvent";
432 if (!(event->buttons() & Qt::LeftButton))
434 if ((event->pos() - m_DragStartPosition).manhattanLength()
435 < QApplication::startDragDistance())
437 qDebug(log) <<
"mouseMoveEvent drag";
438 QDrag *drag =
new QDrag(
this);
440 pData->m_Items = this->selectionModel()->selectedIndexes();
441 drag->setMimeData(pData);
443 Qt::DropAction dropAction = Qt::MoveAction;
444 if(event->modifiers() & Qt::ControlModifier)
445 dropAction = Qt::CopyAction;
446 drag->exec(dropAction);
449 QTreeView::mouseMoveEvent(event);