玉兔远程控制 0.1.0-bate11
载入中...
搜索中...
未找到
FrmRecent.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QMimeData>
4#include <QVBoxLayout>
5#include <QDateTime>
6#include <QStandardItem>
7#include <QDir>
8#include <QHeaderView>
9#include <QMenu>
10#include <QFile>
11#include <QMessageBox>
12#include <QLoggingCategory>
13#include "mainwindow.h"
14#include "FrmRecent.h"
15#include "RabbitCommonDir.h"
16
17static Q_LOGGING_CATEGORY(log, "App.CFrmRecent")
18
20 MainWindow *pMainWindow, CManager *pManager,
21 CParameterApp &parameterApp, bool bDock, QWidget *parent)
22 : QWidget(parent)
23 , m_pMainWindow(pMainWindow)
24 , m_ParameterApp(parameterApp)
25 , m_pToolBar(nullptr)
26 , m_ptbOperate(nullptr)
27 , m_pMenuNew(nullptr)
28 , m_pModel(nullptr)
29 , m_pManager(pManager)
30 , m_bDock(bDock)
31 , m_pDockTitleBar(nullptr)
32 , m_pExport(nullptr)
33 , m_pImport(nullptr)
34{
35 bool check = false;
36 //setFocusPolicy(Qt::NoFocus);
37 setAttribute(Qt::WA_DeleteOnClose);
38 setLayout(new QVBoxLayout(this));
39 setWindowTitle(tr("Recently list"));
40
41 m_pToolBar = new QToolBar(this);
42
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();
54
55 m_ptbOperate = new QToolButton(m_pToolBar);
56 m_ptbOperate->setFocusPolicy(Qt::NoFocus);
57 m_ptbOperate->setPopupMode(QToolButton::InstantPopup);
58 //m_ptbOperate->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
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()));
69 Q_ASSERT(check);
70
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());
97 if(m_bDock) {
98 m_pRefresh = m_pToolBar->addAction(
99 QIcon::fromTheme("view-refresh"),
100 tr("Refresh"),
101 this, SLOT(slotRefresh()));
102 m_pRefresh->setToolTip(tr("Refresh"));
103 m_pRefresh->setStatusTip(tr("Refresh"));
104 } else {
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"));
110 }
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);
116
117 layout()->addWidget(m_pToolBar);
118
119 if(bDock) {
120 m_pDockTitleBar = new RabbitCommon::CTitleBar(parent);
121 // Create tools pushbutton in title bar
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;
128 lstWidget << pTools;
129 m_pDockTitleBar->AddWidgets(lstWidget);
130
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();
147 if(a) {
148 m_pToolBar->setVisible(a->isChecked());
149 m_ParameterApp.SetDockListRecentShowToolBar(a->isChecked());
150 m_ParameterApp.Save();
151 }
152 });
153 pShowToolBar->setCheckable(true);
154 pShowToolBar->setChecked(m_ParameterApp.GetDockListRecentShowToolBar());
155 m_pToolBar->setVisible(m_ParameterApp.GetDockListRecentShowToolBar());
156 }
157
158 Q_ASSERT(m_pManager);
159 m_pTableView = new QTableView(this);
160 InitialDrop();
161 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
162 check = connect(m_pTableView,
163 SIGNAL(customContextMenuRequested(const QPoint &)),
164 this, SLOT(slotCustomContextMenu(const QPoint &)));
165 Q_ASSERT(check);
166 check = connect(m_pTableView, SIGNAL(doubleClicked(const QModelIndex &)),
167 this, SLOT(slotDoubleClicked(const QModelIndex&)));
168 Q_ASSERT(check);
169 layout()->addWidget(m_pTableView);
170
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);
178 }
179}
180
181CFrmRecent::~CFrmRecent()
182{
183}
184
185int CFrmRecent::Initial()
186{
187 if(!m_Database.IsOpen()) {
188 bool bRet = false;
189 //bRet = m_Database.OpenDatabase(&m_ParameterApp.GetGlobalParameters()->m_Database, "recent_connection");
190 bRet = m_Database.SetDatabase(&m_ParameterApp.GetGlobalParameters()->m_DatabaseRemote);
191 if(!bRet) return -1;
192 }
193 m_pModel = new CRecentModel(&m_ParameterApp, &m_Database, m_pTableView);
194 m_pTableView->setModel(m_pModel);
195 if(m_pTableView->horizontalHeader()) {
196 // check = connect(&m_Database, &CRecentDatabase::sigChanged,
197 // this, &CFrmRecent::slotRefresh);
198 // Q_ASSERT(check);
199 //必须在 setModel 后,才能应用
200 /*第二个参数可以为:
201 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
202 QHeaderView::Fixed :2 用户不可更改列宽
203 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
204 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
205 */
206 m_pTableView->horizontalHeader()->setSectionResizeMode(
207#if defined(DEBUG) && !defined(Q_OS_ANDROID)
208 0,
209#endif
210 QHeaderView::Interactive);
211 }
212 //以下设置列宽函数必须要数据加载完成后使用,才能应用
213 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
214 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
215
216 m_pManager->EnumPlugins(this);
217 slotRefresh();
218 return 0;
219}
220
221int CFrmRecent::AddRecent(const CRecentDatabase::RecentItem &item)
222{
223 int nRet = m_Database.AddRecent(item);
224 slotRefresh();
225 return nRet;
226}
227
228bool CFrmRecent::UpdateRecent(const CRecentDatabase::RecentItem &item)
229{
230 bool bRet = m_Database.UpdateRecent(item);
231 slotRefresh();
232 return bRet;
233}
234
235QList<CRecentDatabase::RecentItem> CFrmRecent::GetRecents(int limit, int offset)
236{
237 return m_Database.GetRecents(limit, offset);
238}
239
240void CFrmRecent::slotRefresh()
241{
242 if(!m_pModel) return;
243 m_pModel->refresh(m_ParameterApp.GetRecentMenuMaxCount() << 1);
244
245 //以下设置列宽函数必须要数据加载完成后使用,才能应用
246 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
247 m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
248
249 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
250 QModelIndexList lstIndex;
251 if(pSelect)
252 lstIndex = pSelect->selectedRows();
253 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
254 {
255 m_pTableView->selectRow(0);
256 }
257 return;
258}
259
260int CFrmRecent::InsertItem(COperate *c, QString& szFile)
261{
262 CRecentDatabase::RecentItem item;
263 item.icon = c->Icon();
264 item.szName = c->Name();
265 item.szProtocol = c->Protocol();
266 item.szType = c->GetTypeName();
267 item.SetFile(szFile);
268 m_pModel->addItem(item);
269
270 m_pTableView->selectRow(0);
271 return 0;
272}
273
274void CFrmRecent::slotStartByType()
275{
276 qDebug(log) << Q_FUNC_INFO;
277 auto m = m_pMenuNew->actions();
278 foreach(auto a, m) {
279 a->deleteLater();
280 }
281 foreach (auto a, m_MenuStartByType) {
282 a->deleteLater();
283 }
284 m_pMenuNew->clear();
285 m_MenuStartByType.clear();
286 m_pManager->EnumPlugins(this);
287}
288
289int CFrmRecent::onProcess(const QString &id, CPlugin *pPlugin)
290{
291 // Connect menu and toolbar
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);
299 } else
300 m = *it;
301 }
302 // Start menu and toolbar
303 QAction* p = m_pMainWindow->GetStartAction(m, pPlugin);
304 bool check = connect(p, SIGNAL(triggered()), this, SLOT(slotNew()));
305 Q_ASSERT(check);
306 return 0;
307}
308
309void CFrmRecent::slotNew()
310{
311 QAction* pAction = dynamic_cast<QAction*>(this->sender());
312 if(!pAction || pAction->data().toString().isEmpty())
313 return;
314 COperate* pOperate = m_pManager->CreateOperate(pAction->data().toString());
315 if(nullptr == pOperate) return;
316
317 int nRet = pOperate->OpenDialogSettings(this);
318 switch(nRet)
319 {
320 case QDialog::Rejected:
321 break;
322 case QDialog::Accepted:
323 {
324 QString szFile = pOperate->GetSettingsFile();
325 QDir d;
326 if(d.exists(szFile)) {
327 QMessageBox::StandardButton ret
328 = QMessageBox::warning(
329 this, tr("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)
334 {
335 break;
336 }
337 }
338
339 int nRet = 0;
340 bool bRet = QMetaObject::invokeMethod(
341 m_pMainWindow,
342 "Start",
343 Qt::DirectConnection,
344 Q_RETURN_ARG(int, nRet),
345 Q_ARG(COperate*, pOperate),
346 Q_ARG(bool, false),
347 Q_ARG(QString, szFile)
348 );
349 if(!bRet)
350 qCritical(log) << "Failed to call MainWindow::Start()";
351 return;
352 }
353 }
354
355 m_pManager->DeleteOperate(pOperate);
356}
357
358void CFrmRecent::slotEdit()
359{
360 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
361 QModelIndexList lstIndex = pSelect->selectedRows();
362 foreach(auto index, lstIndex)
363 {
364 auto item = m_pModel->getItem(index);
365 QString szFile = item.GetFile();
366 if(szFile.isEmpty()) continue;
367 COperate* pOperate = m_pManager->LoadOperate(szFile);
368 int nRet = pOperate->OpenDialogSettings(this);
369 switch(nRet)
370 {
371 case QDialog::Rejected:
372 break;
373 case QDialog::Accepted:
374 m_pManager->SaveOperate(pOperate);
375 break;
376 }
377 m_pManager->DeleteOperate(pOperate);
378 }
379}
380
381void CFrmRecent::slotEditConnect()
382{
383 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
384 QModelIndexList lstIndex = pSelect->selectedRows();
385 foreach(auto index, lstIndex)
386 {
387 auto item = m_pModel->getItem(index);
388 QString szFile = item.GetFile();
389 if(szFile.isEmpty()) continue;
390 COperate* c = m_pManager->LoadOperate(szFile);
391 int nRet = c->OpenDialogSettings(this);
392 switch(nRet)
393 {
394 case QDialog::Rejected:
395 break;
396 case QDialog::Accepted:
397 m_pManager->SaveOperate(c);
398 emit sigStart(szFile);
399 break;
400 }
401 m_pManager->DeleteOperate(c);
402 }
403 if(!m_bDock)
404 close();
405}
406
407void CFrmRecent::slotCopy()
408{
409 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
410 QModelIndexList lstIndex = pSelect->selectedRows();
411 foreach(auto index, lstIndex)
412 {
413 auto item = m_pModel->getItem(index);
414 QString szFile = item.GetFile();
415 if(szFile.isEmpty()) continue;
416 COperate* pOperate = m_pManager->LoadOperate(szFile);
417
418 bool bExit = true;
419 do {
420 bExit = true;
421 int nRet = pOperate->OpenDialogSettings(this);
422 switch(nRet)
423 {
424 case QDialog::Rejected:
425 break;
426 case QDialog::Accepted:
427 {
428 szFile = RabbitCommon::CDir::Instance()->GetDirUserData()
429 + QDir::separator()
430 + pOperate->Id()
431 + ".rrc";
432 QDir d(szFile);
433 if(d.exists(szFile)) {
434 QMessageBox::StandardButton r
435 = QMessageBox::warning(
436 this,
437 tr("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)
445 {
446 bExit = false;
447 break;
448 }
449 if(QMessageBox::StandardButton::Cancel == r)
450 break;
451 }
452
453 int nRet = 0;
454 bool bRet = QMetaObject::invokeMethod(
455 m_pMainWindow,
456 "Start",
457 Qt::DirectConnection,
458 Q_RETURN_ARG(int, nRet),
459 Q_ARG(COperate*, pOperate),
460 Q_ARG(bool, false),
461 Q_ARG(QString, szFile)
462 );
463 if(!bRet)
464 qCritical(log) << "Failed to call MainWindow::Start()";
465 return;
466 }
467 }
468
469 } while(1 && !bExit);
470
471 m_pManager->DeleteOperate(pOperate);
472 }
473}
474
475void CFrmRecent::slotDelete()
476{
477 if(!m_pModel || !m_pTableView) return;
478 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
479 QModelIndexList lstIndex = pSelect->selectedRows();
480 foreach(auto index, lstIndex)
481 {
482 /*
483 auto item = m_pModel->getItem(index);
484 QString szFile = item.szFile;
485 if(szFile.isEmpty()) continue;
486 QDir d(szFile);
487 if(d.remove(szFile)) //*/
488 m_pModel->removeRow(index.row());
489 }
490 slotRefresh();
491}
492
493void CFrmRecent::slotStart()
494{
495 if(!m_pModel || !m_pTableView) return;
496 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
497 QModelIndexList lstIndex = pSelect->selectedRows();
498 foreach(auto index, lstIndex)
499 {
500 auto item = m_pModel->getItem(index);
501 QString szFile = item.GetFile();
502 if(szFile.isEmpty()) continue;
503 emit sigStart(szFile);
504 }
505 if(!m_bDock) close();
506}
507
508void CFrmRecent::slotDetail()
509{
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);
514 } else {
515 m_pTableView->hideColumn(CRecentModel::ColumnNo::ID);
516 m_pTableView->hideColumn(CRecentModel::ColumnNo::File);
517 }
518}
519
520void CFrmRecent::slotCustomContextMenu(const QPoint &pos)
521{
522 QMenu menu(this);
523
524 menu.addAction(m_pStart);
525 menu.addAction(m_pStart);
526 menu.addSeparator();
527 menu.addMenu(m_pMenuNew);
528 menu.addAction(m_pEdit);
529 menu.addAction(m_pCopy);
530 menu.addAction(m_pDelete);
531 menu.addSeparator();
532 menu.addAction(m_pAddToFavorite);
533 menu.addSeparator();
534 menu.addAction(m_pImport);
535 menu.addAction(m_pExport);
536 if(m_bDock)
537 menu.addAction(m_pRefresh);
538
539 menu.exec(mapToGlobal(pos));
540}
541
542void CFrmRecent::slotDoubleClicked(const QModelIndex& index)
543{
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();
551}
552
553void CFrmRecent::slotAddToFavorite()
554{
555 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
556 QModelIndexList lstIndex = pSelect->selectedRows();
557 foreach(auto index, lstIndex)
558 {
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);
568 }
569}
570
571void CFrmRecent::slotImport()
572{
573 QString filename = QFileDialog::getOpenFileName(
574 this, tr("Import recent"),
575 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
576 tr("JSON (*.json)"));
577
578 if (!filename.isEmpty()) {
579 QFileInfo fi(filename);
580 if(0 == fi.suffix().compare("json", Qt::CaseInsensitive)) {
581 if (m_Database.ImportFromJsonFile(filename)) {
582 slotRefresh();
583 QMessageBox::information(
584 this, tr("Success"),
585 tr("Successfully imported recent from json file"));
586 } else {
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);
591 }
592 return;
593 }
594 }
595}
596
597void CFrmRecent::slotExport()
598{
599 QString filename = QFileDialog::getSaveFileName(
600 this, tr("Export recent"),
601 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
602 tr("JSON (*.json)"));
603
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(
609 this, tr("Success"),
610 tr("Successfully exported recent to json file"));
611 } else {
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);
616 }
617 return;
618 }
619 }
620}
621
622void CFrmRecent::InitialDrop()
623{
624 if(!m_pTableView || !m_pTableView->viewport())
625 return;
626 m_pTableView->viewport()->installEventFilter(this);
627 m_pTableView->setAcceptDrops(true);
628 //m_pTableView->setDragEnabled(true);
629 m_pTableView->setDragDropMode(QTreeView::DropOnly);
630 m_pTableView->setDefaultDropAction(Qt::MoveAction);
631 m_pTableView->setDropIndicatorShown(true);
632}
633
634void CFrmRecent::dragEnterEvent(QDragEnterEvent *event)
635{
636 //qDebug(log) << Q_FUNC_INFO;
637 auto urls = event->mimeData()->urls();
638 if(event->mimeData()->hasUrls() && urls.length() == 1) {
639 //qDebug(log) << event->mimeData()->urls();
640 event->acceptProposedAction();
641 return;
642 }
643}
644
645void CFrmRecent::dragMoveEvent(QDragMoveEvent *event)
646{
647 //qDebug(log) << Q_FUNC_INFO;
648}
649
650void CFrmRecent::dropEvent(QDropEvent *event)
651{
652 //qDebug(log) << Q_FUNC_INFO;
653 bool bRet = false;
654 auto urls = event->mimeData()->urls();
655 foreach(auto url, urls)
656 {
657 if(url.isLocalFile()) {
658 QString filename = url.toLocalFile();
659 if (m_Database.ImportFromJsonFile(filename)) {
660 slotRefresh();
661 emit sigShowMessageBox(tr("Success"),
662 tr("Successfully imported recent from json file"),
663 QMessageBox::Information);
664 } else {
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();
668 emit sigShowMessageBox(tr("Failure"), szErr, QMessageBox::Critical);
669 }
670 }
671 }
672 if(bRet)
673 event->accept();
674 else
675 event->ignore();
676}
677
678bool CFrmRecent::eventFilter(QObject *watched, QEvent *event)
679{
680 if (watched == m_pTableView->viewport()) {
681 //qDebug(log) << Q_FUNC_INFO << "Viewport event:" << event->type();
682 switch (event->type()) {
683 case QEvent::DragEnter:
684 dragEnterEvent(static_cast<QDragEnterEvent*>(event));
685 return true;
686 case QEvent::DragMove:
687 dragMoveEvent(static_cast<QDragMoveEvent*>(event));
688 return true;
689 case QEvent::Drop:
690 dropEvent(static_cast<QDropEvent*>(event));
691 return true;
692 default:
693 break;
694 }
695 }
696 return QWidget::eventFilter(watched, event);
697}
列出存在的连接配置
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 COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
操作接口。
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
类型名
插件接口
The MainWindow class