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"));
29 setFocusPolicy(Qt::NoFocus);
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_szSaveFile = RabbitCommon::CDir::Instance()->GetDirUserConfig()
50 + QDir::separator() +
"Favorite.ini";
51 QSettings set(m_szSaveFile, QSettings::IniFormat);
53 nRootCount = set.value(
"RootCount").toInt();
54 for(
int i = 0; i < nRootCount; i++)
56 QString name = set.value(
"Name_" + QString::number(i)).toString();
57 QString file = set.value(
"File_" + QString::number(i)).toString();
59 qCritical(log) <<
"Current node is empty!";
62 QStandardItem* item =
new QStandardItem(name);
63 item->setIcon(QIcon::fromTheme(
"network-wired"));
66 QIcon icon = set.value(
"Icon_" + QString::number(i)).value<QIcon>();
69 QString szDescript = set.value(
"Descripte_" + QString::number(i)).toString();
70 if(!szDescript.isEmpty())
71 item->setToolTip(szDescript);
73 m_pModel->appendRow(item);
76 int nGroupCount = set.value(
"GroupCount").toInt();
77 for(
int g = 0; g < nGroupCount; g++)
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++)
86 QString name = set.value(szGroup +
"/Name_" + QString::number(i)).toString();
89 qCritical(log) <<
"Current node is empty!";
92 QStandardItem* item =
new QStandardItem(name);
95 QIcon icon = set.value(szGroup +
"/Icon_" + QString::number(i)).value<QIcon>();
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();
104 qCritical(log) <<
"File is empty";
107 pGroup->appendRow(item);
112 m_pDockTitleBar =
new RabbitCommon::CTitleBar(parent);
114 m_pMenu =
new QMenu(tr(
"Tools"), m_pDockTitleBar);
115 check = connect(m_pMenu, SIGNAL(aboutToShow()),
this, SLOT(slotMenu()));
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;
123 m_pDockTitleBar->AddWidgets(lstWidget);
126CFavoriteView::~CFavoriteView()
131int CFavoriteView::Save()
136 QSettings set(m_szSaveFile, QSettings::IniFormat);
139 for(
int rootIndex = 0; rootIndex < m_pModel->rowCount(); rootIndex++)
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())
148 QString szGroup = rootItem->text();
149 set.setValue(
"Group_" + QString::number(nGroup++), szGroup);
150 for(
int childIndex = 0; childIndex < rootItem->rowCount(); childIndex++)
152 auto childItem = rootItem->child(childIndex);
153 if(!childItem)
continue;
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());
162 set.setValue(szGroup +
"/" +
"count", nCount);
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());
171 set.setValue(
"RootCount", nRootCount);
172 set.setValue(
"GroupCount", nGroup);
176int CFavoriteView::AddFavorite(
const QString &szName,
177 const QString &szDescription,
const QIcon &icon,
178 const QString &szFile)
180 if(!m_pModel)
return -1;
181 QStandardItem* pItem =
nullptr;
183 auto indexes = selectionModel()->selectedIndexes();
184 if(indexes.isEmpty())
186 auto it = m_pModel->findItems(szName, Qt::MatchFixedString);
189 pItem =
new QStandardItem(szName);
190 pItem->setIcon(icon);
191 pItem->setToolTip(szDescription);
192 m_pModel->appendRow(pItem);
194 QList<QStandardItem*>::iterator i;
195 for(i = it.begin(); i != it.end(); i++)
197 if((*i)->data() == szFile)
202 pItem =
new QStandardItem(szName);
203 pItem->setIcon(icon);
204 pItem->setToolTip(szDescription);
205 m_pModel->appendRow(pItem);
208 auto itemGroup = m_pModel->itemFromIndex(indexes[0]);
209 if(itemGroup->data().isValid())
211 auto it = m_pModel->findItems(szName, Qt::MatchFixedString);
214 pItem =
new QStandardItem(szName);
215 pItem->setIcon(icon);
216 pItem->setToolTip(szDescription);
217 m_pModel->appendRow(pItem);
220 szGroup = itemGroup->text();
221 auto lstGroup = m_pModel->findItems(szGroup, Qt::MatchFixedString);
222 if(lstGroup.isEmpty())
224 QStandardItem* pGroup =
new QStandardItem(szGroup);
225 m_pModel->appendRow(pGroup);
226 pItem =
new QStandardItem(szName);
227 pItem->setIcon(icon);
228 pItem->setToolTip(szDescription);
229 pGroup->appendRow(pItem);
231 if(lstGroup[0]->data().isValid())
return 2;
232 for(
int i = 0; i < lstGroup[0]->rowCount(); i++)
234 auto item = lstGroup[0]->child(i);
235 if(item->text() == szName)
238 pItem =
new QStandardItem(szName);
239 pItem->setIcon(icon);
240 pItem->setToolTip(szDescription);
241 lstGroup[0]->appendRow(pItem);
246 pItem->setData(szFile);
250void CFavoriteView::slotFavrtieClicked(
const QModelIndex &index)
254void CFavoriteView::slotFavortiedoubleClicked(
const QModelIndex &index)
256 auto item = m_pModel->itemFromIndex(index);
258 if(editTriggers() != QTreeView::NoEditTriggers)
260 QString szFile = item->data().toString();
261 if(!szFile.isEmpty())
262 emit sigStart(szFile,
false);
265void CFavoriteView::slotDoubleEditNode(
bool bEdit)
268 setEditTriggers(QTreeView::DoubleClicked);
270 setEditTriggers(QTreeView::NoEditTriggers);
273void CFavoriteView::slotMenu()
275 auto index = this->currentIndex();
276 auto item = m_pModel->itemFromIndex(index);
280 if(item->data().isValid()) {
281 m_pMenu->addAction(tr(
"Start"),
this, SLOT(slotStart()));
282 m_pMenu->addAction(tr(
"Open settings and Start"),
this, SLOT(slotOpenStart()));
283 m_pMenu->addAction(tr(
"Delete operate"),
this, SLOT(slotDelete()));
285 m_pMenu->addSeparator();
286 m_pMenu->addAction(tr(
"New group"),
this, SLOT(slotNewGroup()));
287 if(!item->data().isValid())
288 m_pMenu->addAction(tr(
"Delete group"),
this, SLOT(slotDelete()));
290 m_pMenu->addAction(tr(
"New group"),
this, SLOT(slotNewGroup()));
292 m_pMenu->addSeparator();
293 m_pMenu->addAction(tr(
"Add to favorite"),
this, SIGNAL(sigFavorite()));
296void CFavoriteView::slotCustomContextMenu(
const QPoint &pos)
299 m_pMenu->exec(mapToGlobal(pos));
302void CFavoriteView::slotStart()
304 auto lstIndex = selectionModel()->selectedIndexes();
305 foreach(
auto index, lstIndex)
307 auto item = m_pModel->itemFromIndex(index);
309 QString szFile = item->data().toString();
310 if(!szFile.isEmpty())
311 emit sigStart(szFile,
false);
315void CFavoriteView::slotOpenStart()
317 auto lstIndex = selectionModel()->selectedIndexes();
318 foreach(
auto index, lstIndex)
320 auto item = m_pModel->itemFromIndex(index);
321 QString szFile = item->data().toString();
322 if(!szFile.isEmpty())
323 emit sigStart(szFile,
true);
327void CFavoriteView::slotDelete()
329 auto lstIndex = selectionModel()->selectedIndexes();
330 foreach(
auto index, lstIndex)
331 m_pModel->removeRow(index.row(), index.parent());
334void CFavoriteView::slotNewGroup()
336 QString szGroup = QInputDialog::getText(
this, tr(
"Input"), tr(
"Input group name"));
337 if(szGroup.isEmpty())
return;
338 auto lstItem = m_pModel->findItems(szGroup);
339 if(!lstItem.isEmpty())
341 QMessageBox::critical(
this, tr(
"Error"), tr(
"The group [%1] is existed").arg(szGroup));
345 QStandardItem* pGroup =
new QStandardItem(szGroup);
346 pGroup->setIcon(QIcon::fromTheme(
"network-workgroup"));
347 m_pModel->appendRow(pGroup);
350void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
352 qDebug(log) <<
"dragEnterEvent";
353 const CFavoriteMimeData* pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
356 qDebug(log) <<
"dragEnterEvent acceptProposedAction";
357 event->acceptProposedAction();
361void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
365void CFavoriteView::dropEvent(QDropEvent *event)
367 qDebug(log) <<
"dropEvent";
368 const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
370 QStandardItemModel* pModel =
dynamic_cast<QStandardItemModel*
>(model());
372#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
373 auto index = indexAt(event->position().toPoint());
375 auto index = indexAt(event->pos());
379 auto item = pModel->itemFromIndex(index);
380 if(item->data().isNull())
382 foreach(
auto i, pData->m_Items)
384 qDebug(log) <<
"dropEvent:" << item->text();
386 auto newItem = NewItem(i);
387 item->appendRow(newItem);
388 if(event->dropAction() == Qt::MoveAction)
389 pModel->removeRow(i.row(), i.parent());
392 qWarning(log) <<
"Don't group node. the data:" << item->data();
394 foreach(
auto i, pData->m_Items)
396 pModel->appendRow(NewItem(i));
397 if(event->dropAction() == Qt::MoveAction)
398 pModel->removeRow(i.row(), i.parent());
405QStandardItem* CFavoriteView::NewItem(
const QModelIndex &index)
407 QStandardItemModel* pModel =
dynamic_cast<QStandardItemModel*
>(model());
408 if(!pModel)
return nullptr;
409 auto item = pModel->itemFromIndex(index);
410 if(!item)
return nullptr;
411 auto ri =
new QStandardItem(item->text());
412 ri->setData(item->data());
416void CFavoriteView::mousePressEvent(QMouseEvent *event)
418 if (event->button() == Qt::LeftButton)
419 m_DragStartPosition =
event->pos();
420 QTreeView::mousePressEvent(event);
423void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
425 qDebug(log) <<
"mouseMoveEvent";
427 if (!(event->buttons() & Qt::LeftButton))
429 if ((event->pos() - m_DragStartPosition).manhattanLength()
430 < QApplication::startDragDistance())
432 qDebug(log) <<
"mouseMoveEvent drag";
433 QDrag *drag =
new QDrag(
this);
435 pData->m_Items = this->selectionModel()->selectedIndexes();
436 drag->setMimeData(pData);
438 Qt::DropAction dropAction = Qt::MoveAction;
439 if(event->modifiers() & Qt::ControlModifier)
440 dropAction = Qt::CopyAction;
441 drag->exec(dropAction);
444 QTreeView::mouseMoveEvent(event);