玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
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{
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}
bool SetDatabase(const CDatabase *db)
Share an existing database
Definition Database.cpp:34
列出存在的连接配置
Definition FrmRecent.h:23
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
管理插件
Definition Manager.h:48
virtual int EnumPlugins(Handle *handle)
Enum plugins
Definition Manager.cpp:636
virtual COperate * CreateOperate(const QString &id)
新建 COperate 指针,所有者是调用者。 当不在使用时,调用者必调用 DeteleOperate() 须释放指针。 调用者必须连接信号 COperate::sigFinished 。 释放指针 (...
Definition Manager.cpp:364
virtual COperate * LoadOperate(const QString &szFile)
从文件中新建 COperate 指针,所有者是调用者。 当不再使用时,调用者必须负责调用 DeleteOperate() 删除此指针。 调用者必须连接信号 COperate::sigFinished 。...
Definition Manager.cpp:425
virtual int DeleteOperate(COperate *p)
Delete COperate
Definition Manager.cpp:392
virtual int SaveOperate(COperate *pOperate)
保存连接参数到文件
Definition Manager.cpp:476
操作接口。
Definition Operate.h:51
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
Definition Operate.cpp:97
virtual const QIcon Icon() const
图标
Definition Operate.cpp:92
virtual const QString Protocol() const
协议
Definition Operate.cpp:81
virtual const QString Name()
名称
Definition Operate.cpp:46
virtual const QString Id()
标识
Definition Operate.cpp:36
virtual const QString GetTypeName() const
类型名
Definition Operate.cpp:86
插件接口
Definition Plugin.h:15
The MainWindow class
Definition mainwindow.h:36