14#include <QInputDialog>
17#include <QLoggingCategory>
20#include "RabbitCommonDir.h"
21#include "FavoriteMimeData.h"
23#include "FavoriteView.h"
25static Q_LOGGING_CATEGORY(log,
"Favorite")
30 , m_pDockTitleBar(
nullptr)
31 , m_pTreeView(
nullptr)
33 , m_pDatabase(
nullptr)
34 , m_pStartAction(
nullptr)
35 , m_pEidtStartAction(
nullptr)
36 , m_pAddFolderAction(
nullptr)
37 , m_pEditAction(
nullptr)
38 , m_pDeleteAction(
nullptr)
39 , m_pImportAction(
nullptr)
40 , m_pExportAction(
nullptr)
42 , m_pShowToolbar(
nullptr)
47 setWindowTitle(tr(
"Favorite"));
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);
65CFavoriteView::~CFavoriteView()
69 m_pDatabase =
nullptr;
73void CFavoriteView::setupUI()
75 QVBoxLayout *pMainLayout =
new QVBoxLayout(
this);
76 if(!pMainLayout)
return;
78 setupToolBar(pMainLayout);
80 setupTreeView(pMainLayout);
83void CFavoriteView::setupToolBar(QLayout *layout)
87 QToolBar* pToolBar =
new QToolBar(
this);
89 layout->addWidget(pToolBar);
91 m_pShowToolbar =
new QAction(tr(
"Show tool bar"),
this);
92 m_pShowToolbar->setCheckable(
true);
93 m_pShowToolbar->setChecked(m_pParaApp->GetDockListFavoriteShowToolBar());
94 pToolBar->setVisible(m_pShowToolbar->isChecked());
95 check = connect(m_pShowToolbar, &QAction::triggered,
this, [&, pToolBar]() {
96 if(m_pShowToolbar && m_pParaApp) {
97 pToolBar->setVisible(m_pShowToolbar->isChecked());
98 m_pParaApp->SetDockListFovoriteShowToolBar(m_pShowToolbar->isChecked());
104 m_pStartAction = pToolBar->addAction(
105 QIcon::fromTheme(
"media-playback-start"), tr(
"Start"));
107 m_pStartAction->setToolTip(m_pStartAction->text());
108 m_pStartAction->setStatusTip(m_pStartAction->text());
109 check = connect(m_pStartAction, &QAction::triggered,
110 this, &CFavoriteView::slotStart);
114 m_pEidtStartAction = pToolBar->addAction(
115 QIcon::fromTheme(
"system-settings"), tr(
"Open settings and Start"));
116 if(m_pEidtStartAction) {
117 m_pEidtStartAction->setToolTip(m_pEidtStartAction->text());
118 m_pEidtStartAction->setStatusTip(m_pEidtStartAction->text());
119 check = connect(m_pEidtStartAction, &QAction::triggered,
120 this, &CFavoriteView::slotOpenStart);
124 pToolBar->addSeparator();
126 m_pAddFolderAction = pToolBar->addAction(
127 QIcon::fromTheme(
"folder-new"), tr(
"New group"));
128 if(m_pAddFolderAction) {
129 m_pAddFolderAction->setToolTip(m_pAddFolderAction->text());
130 m_pAddFolderAction->setStatusTip(m_pAddFolderAction->text());
131 check = connect(m_pAddFolderAction, &QAction::triggered,
132 this, &CFavoriteView::slotNewGroup);
136 m_pEditAction = pToolBar->addAction(QIcon::fromTheme(
"edit"), tr(
"Edit"));
138 m_pEditAction->setToolTip(m_pEditAction->text());
139 m_pEditAction->setStatusTip(m_pEditAction->text());
140 check = connect(m_pEditAction, &QAction::triggered,
141 this, &CFavoriteView::slotEdit);
145 m_pDeleteAction = pToolBar->addAction(QIcon::fromTheme(
"edit-delete"), tr(
"Delete"));
146 if(m_pDeleteAction) {
147 m_pDeleteAction->setToolTip(m_pDeleteAction->text());
148 m_pDeleteAction->setStatusTip(m_pDeleteAction->text());
149 check = connect(m_pDeleteAction, &QAction::triggered,
this, &CFavoriteView::slotDelete);
153 pToolBar->addSeparator();
155 m_pImportAction = pToolBar->addAction(QIcon::fromTheme(
"import"), tr(
"Import"));
156 if(m_pImportAction) {
157 m_pImportAction->setToolTip(m_pImportAction->text());
158 m_pImportAction->setStatusTip(m_pImportAction->text());
159 check = connect(m_pImportAction, &QAction::triggered,
this, &CFavoriteView::slotImport);
163 m_pExportAction = pToolBar->addAction(QIcon::fromTheme(
"export"), tr(
"Export"));
164 if(m_pExportAction) {
165 m_pExportAction->setToolTip(m_pExportAction->text());
166 m_pExportAction->setStatusTip(m_pExportAction->text());
167 check = connect(m_pExportAction, &QAction::triggered,
this, &CFavoriteView::slotExport);
171 pToolBar->addSeparator();
172 m_pRefresh = pToolBar->addAction(QIcon::fromTheme(
"view-refresh"), tr(
"Refresh"),
this, [&](){
178void CFavoriteView::setupTreeView(QLayout *layout)
181 m_pTreeView =
new QTreeView(
this);
184 layout->addWidget(m_pTreeView);
186 m_pTreeView->setAcceptDrops(
true);
187 m_pTreeView->setUniformRowHeights(
true);
188 m_pTreeView->setHeaderHidden(
true);
195 m_pTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
196 bool check = connect(m_pTreeView,
197 SIGNAL(customContextMenuRequested(
const QPoint &)),
198 this, SLOT(slotCustomContextMenu(
const QPoint &)));
200 check = connect(m_pTreeView, SIGNAL(clicked(
const QModelIndex&)),
201 this, SLOT(slotFavrtieClicked(
const QModelIndex&)));
203 check = connect(m_pTreeView, SIGNAL(doubleClicked(
const QModelIndex&)),
204 this, SLOT(slotFavortiedoubleClicked(
const QModelIndex&)));
210void CFavoriteView::Initial()
217 m_pTreeView->setModel(m_pModel);
223void CFavoriteView::EnableAction(
const QModelIndex &index)
225 if(!m_pModel)
return;
226 if(index.isValid()) {
228 m_pModel->data(index, CFavoriteModel::RoleItem)
230 if(item.isFavorite()) {
231 m_pStartAction->setEnabled(
true);
232 m_pEidtStartAction->setEnabled(
true);
234 m_pStartAction->setEnabled(
false);
235 m_pEidtStartAction->setEnabled(
false);
237 m_pEditAction->setEnabled(
true);
238 m_pDeleteAction->setEnabled(
true);
243 m_pStartAction->setEnabled(
false);
244 if(m_pEidtStartAction)
245 m_pEidtStartAction->setEnabled(
false);
247 m_pEditAction->setEnabled(
false);
249 m_pDeleteAction->setEnabled(
false);
252void CFavoriteView::slotAddToFavorite(
const QString &szFile,
253 const QString &szName,
254 const QString &szDescription,
258 if(!m_pModel || !m_pTreeView)
return;
261 QString szGroup = tr(
"Root");
262 auto indexes = m_pTreeView->selectionModel()->selectedIndexes();
263 if(!indexes.isEmpty())
265 QModelIndex idx = indexes.at(0);
266 while (idx.isValid()) {
269 if(item.isFolder() && item.id > 0) {
271 szGroup = item.szName;
278 auto item = m_pModel->GetFavorite(szFile);
280 if(item.parentId == parentId) {
281 QMessageBox::information(
282 nullptr, tr(
"Add favorite"),
283 tr(
"\"%1\" already exists in \"%2\"").arg(szName, szGroup));
286 int ret = QMessageBox::warning(
287 nullptr, tr(
"Add favorite"),
288 tr(
"\"%1\" already exists, do you want to move it to \"%2\"?").arg(szName, szGroup),
289 QMessageBox::Ok | QMessageBox::No);
290 if(QMessageBox::Ok != ret)
294 m_pModel->AddFavorite(szFile, szName, icon, szDescription, parentId);
299void CFavoriteView::slotUpdateFavorite(
300 const QString &szFile,
const QString &szName,
301 const QString &szDescription,
const QIcon &icon)
303 if(!m_pModel || !m_pTreeView || szFile.isEmpty())
return;
304 m_pModel->UpdateFavorite(szFile, szName, szDescription, icon);
307void CFavoriteView::slotFavrtieClicked(
const QModelIndex &index)
312void CFavoriteView::slotFavortiedoubleClicked(
const QModelIndex &index)
314 if(!index.isValid())
return;
315 if(m_pTreeView->editTriggers() != QTreeView::NoEditTriggers)
317 QString szFile = m_pModel->data(index, CFavoriteModel::RoleFile).toString();
318 if(!szFile.isEmpty())
319 emit sigStart(szFile,
false);
322void CFavoriteView::slotDoubleEditNode(
bool bEdit)
325 m_pTreeView->setEditTriggers(QTreeView::DoubleClicked);
327 m_pTreeView->setEditTriggers(QTreeView::NoEditTriggers);
330void CFavoriteView::slotMenu()
336 m_pMenu->addAction(m_pStartAction);
337 m_pMenu->addAction(m_pEidtStartAction);
339 m_pMenu->addSeparator();
340 m_pMenu->addAction(m_pAddFolderAction);
341 m_pMenu->addAction(m_pEditAction);
342 m_pMenu->addAction(m_pDeleteAction);
344 m_pMenu->addSeparator();
345 m_pMenu->addAction(m_pImportAction);
346 m_pMenu->addAction(m_pExportAction);
348 m_pMenu->addSeparator();
349 m_pMenu->addAction(m_pRefresh);
351 m_pMenu->addSeparator();
352 m_pMenu->addAction(m_pShowToolbar);
355void CFavoriteView::slotCustomContextMenu(
const QPoint &pos)
358 m_pMenu->exec(m_pTreeView->mapToGlobal(pos));
361void CFavoriteView::slotStart()
363 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
364 foreach(
auto index, lstIndex)
366 QString szFile = m_pModel->data(index, CFavoriteModel::RoleFile).toString();
367 if(!szFile.isEmpty())
368 emit sigStart(szFile,
false);
372void CFavoriteView::slotOpenStart()
374 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
375 foreach(
auto index, lstIndex)
377 QString szFile = m_pModel->data(index, CFavoriteModel::RoleFile).toString();
378 if(!szFile.isEmpty())
379 emit sigStart(szFile,
true);
383void CFavoriteView::slotEdit()
385 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
386 foreach(
auto index, lstIndex)
388 QString szName = m_pModel->data(index).toString();
389 szName = QInputDialog::getText(
390 this, tr(
"Edit"), tr(
"Enter the modified name"), QLineEdit::Normal, szName);
393 m_pModel->setData(index, szName);
397void CFavoriteView::slotDelete()
399 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
400 if(1 == lstIndex.size()) {
402 m_pModel->data(lstIndex.at(0), CFavoriteModel::RoleItem)
405 int ret = QMessageBox::warning(
406 nullptr, tr(
"Delete"), tr(
"Will be delete \"%1\"").arg(item.szName),
407 QMessageBox::Ok|QMessageBox::No);
408 if(QMessageBox::Ok != ret)
412 foreach(
auto index, lstIndex)
413 m_pModel->removeRow(index.row(), index.parent());
416void CFavoriteView::slotNewGroup()
418 if(!m_pModel)
return;
419 QString szGroup = QInputDialog::getText(
420 this, tr(
"New group"), tr(
"Input group name"));
421 if(szGroup.isEmpty())
return;
424 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
425 if(!lstIndex.isEmpty())
428 m_pModel->data(lstIndex.at(0), CFavoriteModel::RoleItem)
430 if(0 < item.id && item.isFolder())
434 m_pModel->AddNode(szGroup, parentId);
437void CFavoriteView::slotRefresh()
443void CFavoriteView::slotImport()
445 QString filename = QFileDialog::getOpenFileName(
446 this, tr(
"Import favorite"),
447 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
448 tr(
"JSON (*.json)"));
450 if (!filename.isEmpty()) {
451 QFileInfo fi(filename);
452 if(0 == fi.suffix().compare(
"json", Qt::CaseInsensitive)) {
453 if (m_pDatabase->ImportFromJsonFile(filename)) {
455 QMessageBox::information(
457 tr(
"Successfully imported favorite from json file"));
459 QMessageBox::warning(
461 tr(
"Failed to import favorite from json file"));
468void CFavoriteView::slotExport()
470 QString filename = QFileDialog::getSaveFileName(
471 this, tr(
"Export favorite"),
472 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
473 tr(
"JSON (*.json)"));
475 if (!filename.isEmpty()) {
476 QFileInfo fi(filename);
477 if(0 == fi.suffix().compare(
"json", Qt::CaseInsensitive)) {
478 if (m_pDatabase->ExportToJsonFile(filename)) {
479 QMessageBox::information(
481 tr(
"Successfully export favorite to json file"));
483 QMessageBox::warning(
485 tr(
"Failed to export favorite to json file"));
492void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
494 qDebug(log) <<
"dragEnterEvent";
496 qobject_cast<const CFavoriteMimeData*>(event->mimeData());
499 qDebug(log) <<
"dragEnterEvent acceptProposedAction";
500 event->acceptProposedAction();
504void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
508void CFavoriteView::dropEvent(QDropEvent *event)
510 qDebug(log) <<
"dropEvent";
511 const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
591bool CFavoriteView::eventFilter(QObject *watched, QEvent *event)
593 return QWidget::eventFilter(watched, event);
virtual bool OpenDatabase(CParameterDatabase *pPara=nullptr)
OpenDatabase.
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file.