6#include <QStandardItem>
12#include <QLoggingCategory>
13#include "mainwindow.h"
15#include "RabbitCommonDir.h"
17static Q_LOGGING_CATEGORY(log,
"App.CFrmRecent")
23 , m_pMainWindow(pMainWindow)
24 , m_ParameterApp(parameterApp)
26 , m_ptbOperate(
nullptr)
29 , m_pManager(pManager)
31 , m_pDockTitleBar(
nullptr)
37 setAttribute(Qt::WA_DeleteOnClose);
38 setLayout(
new QVBoxLayout(
this));
39 setWindowTitle(tr(
"Recently list"));
41 m_pToolBar =
new QToolBar(
this);
43 m_pStart = m_pToolBar->addAction(
44 QIcon::fromTheme(
"media-playback-start"), tr(
"Start"),
45 this, SLOT(slotStart()));
46 m_pStart->setStatusTip(tr(
"Start"));
47 m_pStart->setToolTip(tr(
"Start"));
48 m_pEditOperate = m_pToolBar->addAction(
49 QIcon::fromTheme(
"edit-connect"), tr(
"Edit and Start"),
50 this, SLOT(slotEditConnect()));
51 m_pEditOperate->setStatusTip(tr(
"Edit and Start"));
52 m_pEditOperate->setToolTip(tr(
"Edit and Start"));
53 m_pToolBar->addSeparator();
55 m_ptbOperate =
new QToolButton(m_pToolBar);
56 m_ptbOperate->setFocusPolicy(Qt::NoFocus);
57 m_ptbOperate->setPopupMode(QToolButton::InstantPopup);
59 m_pMenuNew =
new QMenu(tr(
"New"),
this);
60 m_pMenuNew->setIcon(QIcon::fromTheme(
"add"));
61 m_ptbOperate->setMenu(m_pMenuNew);
62 m_ptbOperate->setIcon(m_pMenuNew->icon());
63 m_ptbOperate->setText(tr(
"New"));
64 m_ptbOperate->setToolTip(tr(
"New"));
65 m_ptbOperate->setStatusTip(tr(
"New"));
66 m_pToolBar->addWidget(m_ptbOperate);
67 check = connect(&m_ParameterApp, SIGNAL(sigStartByTypeChanged()),
68 this, SLOT(slotStartByType()));
71 m_pEdit = m_pToolBar->addAction(QIcon::fromTheme(
"edit"), tr(
"Edit"),
72 this, SLOT(slotEdit()));
73 m_pEdit->setStatusTip(tr(
"Edit"));
74 m_pEdit->setToolTip(tr(
"Edit"));
75 m_pCopy = m_pToolBar->addAction(QIcon::fromTheme(
"edit-copy"), tr(
"Copy"),
76 this, SLOT(slotCopy()));
77 m_pCopy->setStatusTip(tr(
"Copy"));
78 m_pCopy->setToolTip(tr(
"Copy"));
79 m_pDelete = m_pToolBar->addAction(
80 QIcon::fromTheme(
"edit-delete"), tr(
"Delete"),
81 this, SLOT(slotDelete()));
82 m_pDelete->setToolTip(tr(
"Delete"));
83 m_pDelete->setStatusTip(tr(
"Delete"));
84 m_pDetail = m_pToolBar->addAction(
85 QIcon::fromTheme(
"dialog-information"), tr(
"Detail"),
86 this, SLOT(slotDetail()));
87 m_pDetail->setCheckable(
true);
88 m_pDetail->setChecked(
false);
89 m_pDetail->setToolTip(tr(
"Detail"));
90 m_pDetail->setStatusTip(tr(
"Detail"));
91 m_pToolBar->addSeparator();
92 m_pAddToFavorite = m_pToolBar->addAction(
93 QIcon::fromTheme(
"emblem-favorite"), tr(
"Add to favorite"),
94 this, SLOT(slotAddToFavorite()));
95 m_pAddToFavorite->setStatusTip(m_pAddToFavorite->text());
96 m_pAddToFavorite->setToolTip(m_pAddToFavorite->text());
98 m_pRefresh = m_pToolBar->addAction(
99 QIcon::fromTheme(
"view-refresh"),
101 this, SLOT(slotRefresh()));
102 m_pRefresh->setToolTip(tr(
"Refresh"));
103 m_pRefresh->setStatusTip(tr(
"Refresh"));
105 QAction* pClose = m_pToolBar->addAction(
106 QIcon::fromTheme(
"window-close"), tr(
"Close"),
107 this, SLOT(close()));
108 pClose->setStatusTip(tr(
"Close"));
109 pClose->setToolTip(tr(
"Close"));
111 m_pToolBar->addSeparator();
112 m_pImport = m_pToolBar->addAction(QIcon::fromTheme(
"import"), tr(
"Import"),
113 this, &CFrmRecent::slotImport);
114 m_pExport = m_pToolBar->addAction(QIcon::fromTheme(
"export"), tr(
"Export"),
115 this, &CFrmRecent::slotExport);
117 layout()->addWidget(m_pToolBar);
120 m_pDockTitleBar =
new RabbitCommon::CTitleBar(parent);
122 QMenu* pMenu =
new QMenu(tr(
"Tools"), m_pDockTitleBar);
123 QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
124 QIcon::fromTheme(
"tools"), m_pDockTitleBar);
125 pTools->setToolTip(tr(
"Tools"));
126 pTools->setMenu(pMenu);
127 QList<QWidget*> lstWidget;
129 m_pDockTitleBar->AddWidgets(lstWidget);
131 pMenu->addAction(m_pStart);
132 pMenu->addAction(m_pEditOperate);
133 pMenu->addMenu(m_pMenuNew);
134 pMenu->addAction(m_pEdit);
135 pMenu->addAction(m_pCopy);
136 pMenu->addAction(m_pDelete);
137 pMenu->addAction(m_pDetail);
138 pMenu->addSeparator();
139 pMenu->addAction(m_pAddToFavorite);
140 pMenu->addAction(m_pRefresh);
141 pMenu->addSeparator();
142 pMenu->addAction(m_pImport);
143 pMenu->addAction(m_pExport);
144 pMenu->addSeparator();
145 auto pShowToolBar = pMenu->addAction(tr(
"Show tool bar"),
this, [&](){
146 QAction* a = (QAction*)sender();
148 m_pToolBar->setVisible(a->isChecked());
149 m_ParameterApp.SetDockListRecentShowToolBar(a->isChecked());
150 m_ParameterApp.Save();
153 pShowToolBar->setCheckable(
true);
154 pShowToolBar->setChecked(m_ParameterApp.GetDockListRecentShowToolBar());
155 m_pToolBar->setVisible(m_ParameterApp.GetDockListRecentShowToolBar());
158 Q_ASSERT(m_pManager);
159 m_pTableView =
new QTableView(
this);
161 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
162 check = connect(m_pTableView,
163 SIGNAL(customContextMenuRequested(
const QPoint &)),
164 this, SLOT(slotCustomContextMenu(
const QPoint &)));
166 check = connect(m_pTableView, SIGNAL(doubleClicked(
const QModelIndex &)),
167 this, SLOT(slotDoubleClicked(
const QModelIndex&)));
169 layout()->addWidget(m_pTableView);
171 m_pTableView->verticalHeader()->hide();
172 m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
173 m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
174 m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
175 if(!m_pDetail->isChecked()) {
176 m_pTableView->hideColumn(CRecentModel::ColumnNo::ID);
177 m_pTableView->hideColumn(CRecentModel::ColumnNo::File);
181CFrmRecent::~CFrmRecent()
185int CFrmRecent::Initial()
187 if(!m_Database.IsOpen()) {
190 bRet = m_Database.
SetDatabase(&m_ParameterApp.GetGlobalParameters()->m_DatabaseRemote);
193 m_pModel =
new CRecentModel(&m_ParameterApp, &m_Database, m_pTableView);
194 m_pTableView->setModel(m_pModel);
195 if(m_pTableView->horizontalHeader()) {
206 m_pTableView->horizontalHeader()->setSectionResizeMode(
207#
if defined(DEBUG) && !defined(Q_OS_ANDROID)
210 QHeaderView::Interactive);
223 int nRet = m_Database.AddRecent(item);
230 bool bRet = m_Database.UpdateRecent(item);
235QList<CRecentDatabase::RecentItem> CFrmRecent::GetRecents(
int limit,
int offset)
237 return m_Database.GetRecents(limit, offset);
240void CFrmRecent::slotRefresh()
242 if(!m_pModel)
return;
243 m_pModel->refresh(m_ParameterApp.GetRecentMenuMaxCount() << 1);
247 m_pTableView->resizeColumnsToContents();
249 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
250 QModelIndexList lstIndex;
252 lstIndex = pSelect->selectedRows();
253 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
255 m_pTableView->selectRow(0);
260int CFrmRecent::InsertItem(
COperate *c, QString& szFile)
263 item.icon = c->
Icon();
264 item.szName = c->
Name();
267 item.SetFile(szFile);
268 m_pModel->addItem(item);
270 m_pTableView->selectRow(0);
274void CFrmRecent::slotStartByType()
276 qDebug(log) << Q_FUNC_INFO;
277 auto m = m_pMenuNew->actions();
281 foreach (
auto a, m_MenuStartByType) {
285 m_MenuStartByType.clear();
292 QMenu* m = m_pMenuNew;
293 if(m_ParameterApp.GetStartByType()) {
294 auto it = m_MenuStartByType.find(pPlugin->Type());
295 if(it == m_MenuStartByType.end()) {
296 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), m_pMenuNew);
297 m_MenuStartByType[pPlugin->Type()] = m;
298 m_pMenuNew->addMenu(m);
303 QAction* p = m_pMainWindow->GetStartAction(m, pPlugin);
304 bool check = connect(p, SIGNAL(triggered()),
this, SLOT(slotNew()));
309void CFrmRecent::slotNew()
311 QAction* pAction =
dynamic_cast<QAction*
>(this->sender());
312 if(!pAction || pAction->data().toString().isEmpty())
315 if(
nullptr == pOperate)
return;
320 case QDialog::Rejected:
322 case QDialog::Accepted:
324 QString szFile = pOperate->GetSettingsFile();
326 if(d.exists(szFile)) {
327 QMessageBox::StandardButton ret
328 = QMessageBox::warning(
330 tr(
"The file is exists. whether to overwrite it?\nFile: %1").arg(szFile),
331 QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::No,
332 QMessageBox::StandardButton::No);
333 if(QMessageBox::StandardButton::Ok != ret)
340 bool bRet = QMetaObject::invokeMethod(
343 Qt::DirectConnection,
344 Q_RETURN_ARG(
int, nRet),
347 Q_ARG(QString, szFile)
350 qCritical(log) <<
"Failed to call MainWindow::Start()";
358void CFrmRecent::slotEdit()
360 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
361 QModelIndexList lstIndex = pSelect->selectedRows();
362 foreach(
auto index, lstIndex)
364 auto item = m_pModel->getItem(index);
365 QString szFile = item.GetFile();
366 if(szFile.isEmpty())
continue;
371 case QDialog::Rejected:
373 case QDialog::Accepted:
381void CFrmRecent::slotEditConnect()
383 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
384 QModelIndexList lstIndex = pSelect->selectedRows();
385 foreach(
auto index, lstIndex)
387 auto item = m_pModel->getItem(index);
388 QString szFile = item.GetFile();
389 if(szFile.isEmpty())
continue;
394 case QDialog::Rejected:
396 case QDialog::Accepted:
398 emit sigStart(szFile);
407void CFrmRecent::slotCopy()
409 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
410 QModelIndexList lstIndex = pSelect->selectedRows();
411 foreach(
auto index, lstIndex)
413 auto item = m_pModel->getItem(index);
414 QString szFile = item.GetFile();
415 if(szFile.isEmpty())
continue;
424 case QDialog::Rejected:
426 case QDialog::Accepted:
428 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
433 if(d.exists(szFile)) {
434 QMessageBox::StandardButton r
435 = QMessageBox::warning(
438 tr(
"The file is exists. whether to overwrite it?"
439 " If select No, please modify the name."),
440 QMessageBox::StandardButton::Ok
441 | QMessageBox::StandardButton::No
442 | QMessageBox::StandardButton::Cancel,
443 QMessageBox::StandardButton::No);
444 if(QMessageBox::StandardButton::No == r)
449 if(QMessageBox::StandardButton::Cancel == r)
454 bool bRet = QMetaObject::invokeMethod(
457 Qt::DirectConnection,
458 Q_RETURN_ARG(
int, nRet),
461 Q_ARG(QString, szFile)
464 qCritical(log) <<
"Failed to call MainWindow::Start()";
469 }
while(1 && !bExit);
475void CFrmRecent::slotDelete()
477 if(!m_pModel || !m_pTableView)
return;
478 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
479 QModelIndexList lstIndex = pSelect->selectedRows();
480 foreach(
auto index, lstIndex)
488 m_pModel->removeRow(index.row());
493void CFrmRecent::slotStart()
495 if(!m_pModel || !m_pTableView)
return;
496 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
497 QModelIndexList lstIndex = pSelect->selectedRows();
498 foreach(
auto index, lstIndex)
500 auto item = m_pModel->getItem(index);
501 QString szFile = item.GetFile();
502 if(szFile.isEmpty())
continue;
503 emit sigStart(szFile);
505 if(!m_bDock) close();
508void CFrmRecent::slotDetail()
510 if(!m_pDetail || !m_pTableView)
return;
511 if(m_pDetail->isChecked()) {
512 m_pTableView->showColumn(CRecentModel::ColumnNo::ID);
513 m_pTableView->showColumn(CRecentModel::ColumnNo::File);
515 m_pTableView->hideColumn(CRecentModel::ColumnNo::ID);
516 m_pTableView->hideColumn(CRecentModel::ColumnNo::File);
520void CFrmRecent::slotCustomContextMenu(
const QPoint &pos)
524 menu.addAction(m_pStart);
525 menu.addAction(m_pStart);
527 menu.addMenu(m_pMenuNew);
528 menu.addAction(m_pEdit);
529 menu.addAction(m_pCopy);
530 menu.addAction(m_pDelete);
532 menu.addAction(m_pAddToFavorite);
534 menu.addAction(m_pImport);
535 menu.addAction(m_pExport);
537 menu.addAction(m_pRefresh);
539 menu.exec(mapToGlobal(pos));
542void CFrmRecent::slotDoubleClicked(
const QModelIndex& index)
544 if(!m_pModel)
return;
545 if(!index.isValid())
return;
546 auto item = m_pModel->getItem(index);
547 QString szFile = item.GetFile();
548 if(szFile.isEmpty())
return;
549 emit sigStart(szFile);
550 if(!m_bDock) close();
553void CFrmRecent::slotAddToFavorite()
555 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
556 QModelIndexList lstIndex = pSelect->selectedRows();
557 foreach(
auto index, lstIndex)
559 if(!index.isValid())
continue;
560 auto item = m_pModel->getItem(index);
561 QFileInfo fi(item.GetFile());
562 if(0 == item.id || item.GetFile().isEmpty() || !fi.exists())
continue;
563 QString szName = item.szName;
564 QIcon icon = item.icon;
565 QString szDescription = item.szDescription;
566 QString szFile = item.GetFile();
567 emit sigAddToFavorite(szFile, szName, szDescription, icon);
571void CFrmRecent::slotImport()
573 QString filename = QFileDialog::getOpenFileName(
574 this, tr(
"Import recent"),
575 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
576 tr(
"JSON (*.json)"));
578 if (!filename.isEmpty()) {
579 QFileInfo fi(filename);
580 if(0 == fi.suffix().compare(
"json", Qt::CaseInsensitive)) {
581 if (m_Database.ImportFromJsonFile(filename)) {
583 QMessageBox::information(
585 tr(
"Successfully imported recent from json file"));
587 QString szErr = tr(
"Failed to import recent from json file: %1").arg(filename) +
"\n";
588 if(!m_Database.GetError().isEmpty())
589 szErr +=
"\n" + tr(
"Error: ") + m_Database.GetError();
590 QMessageBox::critical(
this, tr(
"Failure"), szErr);
597void CFrmRecent::slotExport()
599 QString filename = QFileDialog::getSaveFileName(
600 this, tr(
"Export recent"),
601 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
602 tr(
"JSON (*.json)"));
604 if (!filename.isEmpty()) {
605 QFileInfo fi(filename);
606 if(0 == fi.suffix().compare(
"json", Qt::CaseInsensitive)) {
607 if (m_Database.ExportToJsonFile(filename)) {
608 QMessageBox::information(
610 tr(
"Successfully exported recent to json file"));
612 QString szErr = tr(
"Failed to export recent to json file: %1").arg(filename) +
"\n";
613 if(!m_Database.GetError().isEmpty())
614 szErr +=
"\n" + tr(
"Error: ") + m_Database.GetError();
615 QMessageBox::critical(
this, tr(
"Failure"), szErr);
622void CFrmRecent::InitialDrop()
624 if(!m_pTableView || !m_pTableView->viewport())
626 m_pTableView->viewport()->installEventFilter(
this);
627 m_pTableView->setAcceptDrops(
true);
629 m_pTableView->setDragDropMode(QTreeView::DropOnly);
630 m_pTableView->setDefaultDropAction(Qt::MoveAction);
631 m_pTableView->setDropIndicatorShown(
true);
634void CFrmRecent::dragEnterEvent(QDragEnterEvent *event)
637 auto urls =
event->mimeData()->urls();
638 if(event->mimeData()->hasUrls() && urls.length() == 1) {
640 event->acceptProposedAction();
645void CFrmRecent::dragMoveEvent(QDragMoveEvent *event)
650void CFrmRecent::dropEvent(QDropEvent *event)
654 auto urls =
event->mimeData()->urls();
655 foreach(
auto url, urls)
657 if(url.isLocalFile()) {
658 QString filename = url.toLocalFile();
659 if (m_Database.ImportFromJsonFile(filename)) {
662 tr(
"Successfully imported recent from json file"),
663 QMessageBox::Information);
665 QString szErr = tr(
"Failed to import recent from json file: %1").arg(filename) +
"\n";
666 if(!m_Database.GetError().isEmpty())
667 szErr +=
"\n" + tr(
"Error: ") + m_Database.GetError();
678bool CFrmRecent::eventFilter(QObject *watched, QEvent *event)
680 if (watched == m_pTableView->viewport()) {
682 switch (event->type()) {
683 case QEvent::DragEnter:
684 dragEnterEvent(
static_cast<QDragEnterEvent*
>(event));
686 case QEvent::DragMove:
687 dragMoveEvent(
static_cast<QDragMoveEvent*
>(event));
690 dropEvent(
static_cast<QDropEvent*
>(event));
696 return QWidget::eventFilter(watched, event);
bool SetDatabase(const CDatabase *db)
Share an existing database
virtual void sigShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
virtual int onProcess(const QString &id, CPlugin *pPlugin) override
Process plugins
virtual int EnumPlugins(Handle *handle)
Enum plugins
virtual COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
virtual COperate * LoadOperate(const QString &szFile)
从文件中新建 COperate 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteOperate() 删除此指针。 调用者必须连接信号 COperate::sigFinished 。...
virtual int DeleteOperate(COperate *p)
Delete COperate
virtual int SaveOperate(COperate *pOperate)
保存连接参数到文件
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
virtual const QIcon Icon() const
图标
virtual const QString Protocol() const
协议
virtual const QString Name()
名称
virtual const QString Id()
标识
virtual const QString GetTypeName() const
类型名