5#include <QStandardItem>
11#include <QLoggingCategory>
12#include "mainwindow.h"
14#include "RabbitCommonDir.h"
16static Q_LOGGING_CATEGORY(log,
"App.FrmListRecent")
22 , m_pMainWindow(pMainWindow)
23 , m_ParameterApp(parameterApp)
25 , 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);
160 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
161 check = connect(m_pTableView,
162 SIGNAL(customContextMenuRequested(
const QPoint &)),
163 this, SLOT(slotCustomContextMenu(
const QPoint &)));
165 check = connect(m_pTableView, SIGNAL(doubleClicked(
const QModelIndex &)),
166 this, SLOT(slotDoubleClicked(
const QModelIndex&)));
168 layout()->addWidget(m_pTableView);
170 m_pModel =
new CRecentModel(&m_ParameterApp, m_pDatabase, m_pTableView);
171 m_pTableView->setModel(m_pModel);
172 m_pTableView->verticalHeader()->hide();
173 m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
174 m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
175 m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
176 if(!m_pDetail->isChecked()) {
177 m_pTableView->hideColumn(CRecentModel::ColumnNo::ID);
178 m_pTableView->hideColumn(CRecentModel::ColumnNo::File);
181 check = connect(m_pDatabase, &CRecentDatabase::sigChanged,
182 this, &CFrmRecent::slotRefresh);
195 m_pTableView->horizontalHeader()->setSectionResizeMode(
196#
if defined(DEBUG) && !defined(Q_OS_ANDROID)
199 QHeaderView::Interactive);
208CFrmRecent::~CFrmRecent()
212int CFrmRecent::Init()
219void CFrmRecent::slotRefresh()
221 if(!m_pModel)
return;
222 m_pModel->refresh(m_ParameterApp.GetRecentMenuMaxCount() << 1);
226 m_pTableView->resizeColumnsToContents();
228 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
229 QModelIndexList lstIndex;
231 lstIndex = pSelect->selectedRows();
232 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
234 m_pTableView->selectRow(0);
239int CFrmRecent::InsertItem(
COperate *c, QString& szFile)
242 item.icon = c->
Icon();
243 item.szName = c->
Name();
246 item.szFile = szFile;
247 m_pModel->addItem(item);
249 m_pTableView->selectRow(0);
253void CFrmRecent::slotStartByType()
255 qDebug(log) << Q_FUNC_INFO;
256 auto m = m_pMenuNew->actions();
260 foreach (
auto a, m_MenuStartByType) {
264 m_MenuStartByType.clear();
271 QMenu* m = m_pMenuNew;
272 if(m_ParameterApp.GetStartByType()) {
273 auto it = m_MenuStartByType.find(pPlugin->Type());
274 if(it == m_MenuStartByType.end()) {
275 m =
new QMenu(pPlugin->TypeName(pPlugin->Type()), m_pMenuNew);
276 m_MenuStartByType[pPlugin->Type()] = m;
277 m_pMenuNew->addMenu(m);
282 QAction* p = m_pMainWindow->GetStartAction(m, pPlugin);
283 bool check = connect(p, SIGNAL(triggered()),
this, SLOT(slotNew()));
288void CFrmRecent::slotNew()
290 QAction* pAction =
dynamic_cast<QAction*
>(this->sender());
291 if(!pAction || pAction->data().toString().isEmpty())
294 if(
nullptr == pOperate)
return;
299 case QDialog::Rejected:
301 case QDialog::Accepted:
303 QString szFile = pOperate->GetSettingsFile();
305 if(d.exists(szFile)) {
306 QMessageBox::StandardButton ret
307 = QMessageBox::warning(
309 tr(
"The file is exists. whether to overwrite it?\nFile: %1").arg(szFile),
310 QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::No,
311 QMessageBox::StandardButton::No);
312 if(QMessageBox::StandardButton::Ok != ret)
319 bool bRet = QMetaObject::invokeMethod(
322 Qt::DirectConnection,
323 Q_RETURN_ARG(
int, nRet),
326 Q_ARG(QString, szFile)
329 qCritical(log) <<
"Failed to call MainWindow::Start()";
337void CFrmRecent::slotEdit()
339 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
340 QModelIndexList lstIndex = pSelect->selectedRows();
341 foreach(
auto index, lstIndex)
343 auto item = m_pModel->getItem(index);
344 QString szFile = item.szFile;
345 if(szFile.isEmpty())
continue;
350 case QDialog::Rejected:
352 case QDialog::Accepted:
360void CFrmRecent::slotEditConnect()
362 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
363 QModelIndexList lstIndex = pSelect->selectedRows();
364 foreach(
auto index, lstIndex)
366 auto item = m_pModel->getItem(index);
367 QString szFile = item.szFile;
368 if(szFile.isEmpty())
continue;
373 case QDialog::Rejected:
375 case QDialog::Accepted:
377 emit sigStart(szFile);
386void CFrmRecent::slotCopy()
388 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
389 QModelIndexList lstIndex = pSelect->selectedRows();
390 foreach(
auto index, lstIndex)
392 auto item = m_pModel->getItem(index);
393 QString szFile = item.szFile;
394 if(szFile.isEmpty())
continue;
403 case QDialog::Rejected:
405 case QDialog::Accepted:
407 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
412 if(d.exists(szFile)) {
413 QMessageBox::StandardButton r
414 = QMessageBox::warning(
417 tr(
"The file is exists. whether to overwrite it?"
418 " If select No, please modify the name."),
419 QMessageBox::StandardButton::Ok
420 | QMessageBox::StandardButton::No
421 | QMessageBox::StandardButton::Cancel,
422 QMessageBox::StandardButton::No);
423 if(QMessageBox::StandardButton::No == r)
428 if(QMessageBox::StandardButton::Cancel == r)
433 bool bRet = QMetaObject::invokeMethod(
436 Qt::DirectConnection,
437 Q_RETURN_ARG(
int, nRet),
440 Q_ARG(QString, szFile)
443 qCritical(log) <<
"Failed to call MainWindow::Start()";
448 }
while(1 && !bExit);
454void CFrmRecent::slotDelete()
456 if(!m_pModel || !m_pTableView)
return;
457 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
458 QModelIndexList lstIndex = pSelect->selectedRows();
459 foreach(
auto index, lstIndex)
467 m_pModel->removeRow(index.row());
472void CFrmRecent::slotStart()
474 if(!m_pModel || !m_pTableView)
return;
475 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
476 QModelIndexList lstIndex = pSelect->selectedRows();
477 foreach(
auto index, lstIndex)
479 auto item = m_pModel->getItem(index);
480 QString szFile = item.szFile;
481 if(szFile.isEmpty())
continue;
482 emit sigStart(szFile);
484 if(!m_bDock) close();
487void CFrmRecent::slotDetail()
489 if(!m_pDetail || !m_pTableView)
return;
490 if(m_pDetail->isChecked()) {
491 m_pTableView->showColumn(CRecentModel::ColumnNo::ID);
492 m_pTableView->showColumn(CRecentModel::ColumnNo::File);
494 m_pTableView->hideColumn(CRecentModel::ColumnNo::ID);
495 m_pTableView->hideColumn(CRecentModel::ColumnNo::File);
499void CFrmRecent::slotCustomContextMenu(
const QPoint &pos)
503 menu.addAction(m_pStart);
504 menu.addAction(m_pStart);
506 menu.addMenu(m_pMenuNew);
507 menu.addAction(m_pEdit);
508 menu.addAction(m_pCopy);
509 menu.addAction(m_pDelete);
511 menu.addAction(m_pAddToFavorite);
513 menu.addAction(m_pImport);
514 menu.addAction(m_pExport);
516 menu.addAction(m_pRefresh);
518 menu.exec(mapToGlobal(pos));
521void CFrmRecent::slotDoubleClicked(
const QModelIndex& index)
523 if(!m_pModel)
return;
524 if(!index.isValid())
return;
525 auto item = m_pModel->getItem(index);
526 QString szFile = item.szFile;
527 if(szFile.isEmpty())
return;
528 emit sigStart(szFile);
529 if(!m_bDock) close();
532void CFrmRecent::slotAddToFavorite()
534 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
535 QModelIndexList lstIndex = pSelect->selectedRows();
536 foreach(
auto index, lstIndex)
538 if(!index.isValid())
continue;
539 auto item = m_pModel->getItem(index);
540 QFileInfo fi(item.szFile);
541 if(0 == item.id || item.szFile.isEmpty() || !fi.exists())
continue;
542 QString szName = item.szName;
543 QIcon icon = item.icon;
544 QString szDescription = item.szDescription;
545 QString szFile = item.szFile;
546 emit sigAddToFavorite(szFile, szName, szDescription, icon);
550void CFrmRecent::slotImport()
552 QString filename = QFileDialog::getOpenFileName(
553 this, tr(
"Import recent"),
554 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
555 tr(
"JSON (*.json)"));
557 if (!filename.isEmpty()) {
558 QFileInfo fi(filename);
559 if(0 == fi.suffix().compare(
"json", Qt::CaseInsensitive)) {
560 if (m_pDatabase->ImportFromJsonFile(filename)) {
562 QMessageBox::information(
564 tr(
"Successfully imported recent from json file"));
566 QMessageBox::warning(
568 tr(
"Failed to import recent from json file"));
575void CFrmRecent::slotExport()
577 QString filename = QFileDialog::getSaveFileName(
578 this, tr(
"Export recent"),
579 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
580 tr(
"JSON (*.json)"));
582 if (!filename.isEmpty()) {
583 QFileInfo fi(filename);
584 if(0 == fi.suffix().compare(
"json", Qt::CaseInsensitive)) {
585 if (m_pDatabase->ExportToJsonFile(filename)) {
586 QMessageBox::information(
588 tr(
"Successfully exported recent to json file"));
590 QMessageBox::warning(
592 tr(
"Failed to export recent to json file"));
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
Icon
virtual const QString Protocol() const
Protocol
virtual const QString Name()
Name
virtual const QString Id()
Identity
virtual const QString GetTypeName() const
Get type name