玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
FavoriteView.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QFileDialog>
4#include <QToolBar>
5#include <QMouseEvent>
6#include <QDrag>
7#include <QMimeData>
8#include <QApplication>
9#include <QHeaderView>
10#include <QSettings>
11#include <QSettings>
12#include <QMenu>
13#include <QAction>
14#include <QInputDialog>
15#include <QMessageBox>
16#include <QDir>
17#include <QLoggingCategory>
18#include <QVBoxLayout>
19
20#include "RabbitCommonDir.h"
21#include "FavoriteMimeData.h"
22#include "TitleBar.h"
23#include "FavoriteView.h"
24#include "ParameterGlobal.h"
25#include "Database.h"
26
27static Q_LOGGING_CATEGORY(log, "Favorite")
28
29CFavoriteView::CFavoriteView(CParameterApp *pPara, QWidget *parent)
30 : QWidget(parent)
31 , m_pParaApp(pPara)
32 , m_pDockTitleBar(nullptr)
33 , m_pTreeView(nullptr)
34 , m_pModel(nullptr)
35 , m_pDatabase(nullptr)
36 , m_pStartAction(nullptr)
37 , m_pEidtStartAction(nullptr)
38 , m_pAddFolderAction(nullptr)
39 , m_pEditAction(nullptr)
40 , m_pDeleteAction(nullptr)
41 , m_pImportAction(nullptr)
42 , m_pExportAction(nullptr)
43 , m_pRefresh(nullptr)
44 , m_pShowToolbar(nullptr)
45 , m_pMenu(nullptr)
46{
47 bool check = false;
48
49 setWindowTitle(tr("Favorite"));
50
51 m_pDockTitleBar = new RabbitCommon::CTitleBar(parent);
52 // Create tools pushbutton in title bar
53 m_pMenu = new QMenu(tr("Tools"), m_pDockTitleBar);
54 check = connect(m_pMenu, SIGNAL(aboutToShow()), this, SLOT(slotMenu()));
55 Q_ASSERT(check);
56 QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
57 QIcon::fromTheme("tools"), m_pDockTitleBar);
58 pTools->setToolTip(tr("Tools"));
59 pTools->setMenu(m_pMenu);
60 QList<QWidget*> lstWidget;
61 lstWidget << pTools;
62 m_pDockTitleBar->AddWidgets(lstWidget);
63
64 setupUI();
65}
66
67CFavoriteView::~CFavoriteView()
68{
69 if(m_pDatabase) {
70 delete m_pDatabase;
71 m_pDatabase = nullptr;
72 }
73}
74
75void CFavoriteView::setupUI()
76{
77 QVBoxLayout *pMainLayout = new QVBoxLayout(this);
78 if(!pMainLayout) return;
79
80 setupToolBar(pMainLayout);
81
82 setupTreeView(pMainLayout);
83}
84
85void CFavoriteView::setupToolBar(QLayout *layout)
86{
87 if(!layout) return;
88 bool check = false;
89 QToolBar* pToolBar = new QToolBar(this);
90 if(!pToolBar) return;
91 layout->addWidget(pToolBar);
92
93 m_pShowToolbar = new QAction(tr("Show tool bar"), this);
94 m_pShowToolbar->setCheckable(true);
95 m_pShowToolbar->setChecked(m_pParaApp->GetDockListFavoriteShowToolBar());
96 pToolBar->setVisible(m_pShowToolbar->isChecked());
97 check = connect(m_pShowToolbar, &QAction::triggered, this, [&, pToolBar]() {
98 if(m_pShowToolbar && m_pParaApp) {
99 pToolBar->setVisible(m_pShowToolbar->isChecked());
100 m_pParaApp->SetDockListFovoriteShowToolBar(m_pShowToolbar->isChecked());
101 m_pParaApp->Save();
102 }
103 });
104 Q_ASSERT(check);
105
106 m_pStartAction = pToolBar->addAction(
107 QIcon::fromTheme("media-playback-start"), tr("Start"));
108 if(m_pStartAction) {
109 m_pStartAction->setToolTip(m_pStartAction->text());
110 m_pStartAction->setStatusTip(m_pStartAction->text());
111 check = connect(m_pStartAction, &QAction::triggered,
112 this, &CFavoriteView::slotStart);
113 Q_ASSERT(check);
114 }
115
116 m_pEidtStartAction = pToolBar->addAction(
117 QIcon::fromTheme("system-settings"), tr("Open settings and Start"));
118 if(m_pEidtStartAction) {
119 m_pEidtStartAction->setToolTip(m_pEidtStartAction->text());
120 m_pEidtStartAction->setStatusTip(m_pEidtStartAction->text());
121 check = connect(m_pEidtStartAction, &QAction::triggered,
122 this, &CFavoriteView::slotOpenStart);
123 Q_ASSERT(check);
124 }
125
126 pToolBar->addSeparator();
127
128 m_pAddFolderAction = pToolBar->addAction(
129 QIcon::fromTheme("folder-new"), tr("New group"));
130 if(m_pAddFolderAction) {
131 m_pAddFolderAction->setToolTip(m_pAddFolderAction->text());
132 m_pAddFolderAction->setStatusTip(m_pAddFolderAction->text());
133 check = connect(m_pAddFolderAction, &QAction::triggered,
134 this, &CFavoriteView::slotNewGroup);
135 Q_ASSERT(check);
136 }
137
138 m_pEditAction = pToolBar->addAction(QIcon::fromTheme("edit"), tr("Edit"));
139 if(m_pEditAction) {
140 m_pEditAction->setToolTip(m_pEditAction->text());
141 m_pEditAction->setStatusTip(m_pEditAction->text());
142 check = connect(m_pEditAction, &QAction::triggered,
143 this, &CFavoriteView::slotEdit);
144 Q_ASSERT(check);
145 }
146
147 m_pDeleteAction = pToolBar->addAction(QIcon::fromTheme("edit-delete"), tr("Delete"));
148 if(m_pDeleteAction) {
149 m_pDeleteAction->setToolTip(m_pDeleteAction->text());
150 m_pDeleteAction->setStatusTip(m_pDeleteAction->text());
151 check = connect(m_pDeleteAction, &QAction::triggered, this, &CFavoriteView::slotDelete);
152 Q_ASSERT(check);
153 }
154
155 pToolBar->addSeparator();
156
157 m_pImportAction = pToolBar->addAction(QIcon::fromTheme("import"), tr("Import"));
158 if(m_pImportAction) {
159 m_pImportAction->setToolTip(m_pImportAction->text());
160 m_pImportAction->setStatusTip(m_pImportAction->text());
161 check = connect(m_pImportAction, &QAction::triggered, this, &CFavoriteView::slotImport);
162 Q_ASSERT(check);
163 }
164
165 m_pExportAction = pToolBar->addAction(QIcon::fromTheme("export"), tr("Export"));
166 if(m_pExportAction) {
167 m_pExportAction->setToolTip(m_pExportAction->text());
168 m_pExportAction->setStatusTip(m_pExportAction->text());
169 check = connect(m_pExportAction, &QAction::triggered, this, &CFavoriteView::slotExport);
170 Q_ASSERT(check);
171 }
172
173 pToolBar->addSeparator();
174 m_pRefresh = pToolBar->addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"), this, [&](){
175 if(m_pModel)
176 m_pModel->Refresh();
177 });
178}
179
180void CFavoriteView::setupTreeView(QLayout *layout)
181{
182 if(!layout) return;
183 m_pTreeView = new QTreeView(this);
184 if(!m_pTreeView)
185 return;
186 layout->addWidget(m_pTreeView);
187
188 InitialDragDrop();
189
190 m_pTreeView->setUniformRowHeights(true);
191 m_pTreeView->setHeaderHidden(true);
192
193 //m_pTreeView->setExpandsOnDoubleClick(true);
194 // 如果需要自动展开第一层
195 //m_pTreeView->expandAll(); // 或者根据需要展开特定节点
196 //m_pTreeView->expandToDepth(1);
197
198 m_pTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
199 bool check = connect(m_pTreeView,
200 SIGNAL(customContextMenuRequested(const QPoint &)),
201 this, SLOT(slotCustomContextMenu(const QPoint &)));
202 Q_ASSERT(check);
203 check = connect(m_pTreeView, SIGNAL(clicked(const QModelIndex&)),
204 this, SLOT(slotFavrtieClicked(const QModelIndex&)));
205 Q_ASSERT(check);
206 check = connect(m_pTreeView, SIGNAL(doubleClicked(const QModelIndex&)),
207 this, SLOT(slotFavortiedoubleClicked(const QModelIndex&)));
208 Q_ASSERT(check);
209
210 //m_pTreeView->installEventFilter(this);
211}
212
213int CFavoriteView::Initial()
214{
215 int nRet = 0;
216 m_pDatabase = new CFavoriteDatabase(this);
217 if(m_pDatabase) {
218 bool bRet = false;
219 //bRet = m_pDatabase->OpenDatabase(&m_pParaApp->GetGlobalParameters()->m_Database, "favorite_connect");
220 auto pg = m_pParaApp->GetGlobalParameters();
221 bRet = m_pDatabase->SetDatabase(&pg->m_DatabaseRemote);
222 if(!bRet) return -1;
223 }
224 if(m_pDatabase) {
225 m_pModel = new CFavoriteModel(m_pDatabase, this);
226 m_pTreeView->setModel(m_pModel);
227 }
228
229 EnableAction();
230 return nRet;
231}
232
233void CFavoriteView::EnableAction(const QModelIndex &index)
234{
235 if(!m_pModel) return;
236 if(index.isValid()) {
238 m_pModel->data(index, CFavoriteModel::RoleItem)
239 .value<CFavoriteDatabase::Item>();
240 if(item.isFavorite()) {
241 m_pStartAction->setEnabled(true);
242 m_pEidtStartAction->setEnabled(true);
243 } else {
244 m_pStartAction->setEnabled(false);
245 m_pEidtStartAction->setEnabled(false);
246 }
247 m_pEditAction->setEnabled(true);
248 m_pDeleteAction->setEnabled(true);
249 return;
250 }
251
252 if(m_pStartAction)
253 m_pStartAction->setEnabled(false);
254 if(m_pEidtStartAction)
255 m_pEidtStartAction->setEnabled(false);
256 if(m_pEditAction)
257 m_pEditAction->setEnabled(false);
258 if(m_pDeleteAction)
259 m_pDeleteAction->setEnabled(false);
260}
261
262void CFavoriteView::slotAddToFavorite(const QString &file,
263 const QString &szName,
264 const QString &szDescription,
265 const QIcon &icon
266 )
267{
268 if(!m_pModel || !m_pTreeView) return;
269
270 QString szFile = CDatabaseFile::SetFile(file);
271
272 int parentId = 0;
273 QString szGroup = tr("Root");
274 auto indexes = m_pTreeView->selectionModel()->selectedIndexes();
275 if(!indexes.isEmpty())
276 {
277 QModelIndex idx = indexes.at(0);
278 while (idx.isValid()) {
280 m_pModel->data(idx, CFavoriteModel::RoleItem).value<CFavoriteDatabase::Item>();
281 if(item.isFolder() && item.id > 0) {
282 parentId = item.id;
283 szGroup = item.szName;
284 break;
285 }
286 idx = idx.parent();
287 }
288 }
289 // Check if it already exists
290 auto item = m_pModel->GetFavorite(szFile);
291 if(item.id > 0) {
292 if(item.parentId == parentId) {
293 QMessageBox::information(
294 nullptr, tr("Add favorite"),
295 tr("\"%1\" already exists in \"%2\"").arg(szName, szGroup));
296 return;
297 }
298 int ret = QMessageBox::warning(
299 nullptr, tr("Add favorite"),
300 tr("\"%1\" already exists, do you want to move it to \"%2\"?").arg(szName, szGroup),
301 QMessageBox::Ok | QMessageBox::No);
302 if(QMessageBox::Ok != ret)
303 return;
304 }
305
306 m_pModel->AddFavorite(szFile, szName, icon, szDescription, parentId);
307
308 return;
309}
310
311void CFavoriteView::slotUpdateFavorite(
312 const QString &szFile, const QString &szName,
313 const QString &szDescription, const QIcon &icon)
314{
315 if(!m_pModel || !m_pTreeView || szFile.isEmpty()) return;
316 m_pModel->UpdateFavorite(CDatabaseFile::SetFile(szFile), szName, szDescription, icon);
317}
318
319void CFavoriteView::slotFavrtieClicked(const QModelIndex &index)
320{
321 EnableAction(index);
322}
323
324void CFavoriteView::slotFavortiedoubleClicked(const QModelIndex &index)
325{
326 if(!index.isValid()) return;
327 if(m_pTreeView->editTriggers() != QTreeView::NoEditTriggers)
328 return;
329 QString szFile = m_pModel->data(index, CFavoriteModel::RoleFile).toString();
330 if(!szFile.isEmpty())
331 emit sigStart(CDatabaseFile::GetFile(szFile), false);
332}
333
334void CFavoriteView::slotDoubleEditNode(bool bEdit)
335{
336 if(bEdit)
337 m_pTreeView->setEditTriggers(QTreeView::DoubleClicked);
338 else
339 m_pTreeView->setEditTriggers(QTreeView::NoEditTriggers);
340}
341
342void CFavoriteView::slotMenu()
343{
344 if(!m_pTreeView)
345 return;
346
347 m_pMenu->clear();
348 m_pMenu->addAction(m_pStartAction);
349 m_pMenu->addAction(m_pEidtStartAction);
350
351 m_pMenu->addSeparator();
352 m_pMenu->addAction(m_pAddFolderAction);
353 m_pMenu->addAction(m_pEditAction);
354 m_pMenu->addAction(m_pDeleteAction);
355
356 m_pMenu->addSeparator();
357 m_pMenu->addAction(m_pImportAction);
358 m_pMenu->addAction(m_pExportAction);
359
360 m_pMenu->addSeparator();
361 m_pMenu->addAction(m_pRefresh);
362
363 m_pMenu->addSeparator();
364 m_pMenu->addAction(m_pShowToolbar);
365}
366
367void CFavoriteView::slotCustomContextMenu(const QPoint &pos)
368{
369 slotMenu();
370 m_pMenu->exec(m_pTreeView->mapToGlobal(pos));
371}
372
373void CFavoriteView::slotStart()
374{
375 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
376 foreach(auto index, lstIndex)
377 {
378 QString szFile = m_pModel->data(index, CFavoriteModel::RoleFile).toString();
379 if(!szFile.isEmpty())
380 emit sigStart(CDatabaseFile::GetFile(szFile), false);
381 }
382}
383
384void CFavoriteView::slotOpenStart()
385{
386 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
387 foreach(auto index, lstIndex)
388 {
389 QString szFile = m_pModel->data(index, CFavoriteModel::RoleFile).toString();
390 if(!szFile.isEmpty())
391 emit sigStart(CDatabaseFile::GetFile(szFile), true);
392 }
393}
394
395void CFavoriteView::slotEdit()
396{
397 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
398 foreach(auto index, lstIndex)
399 {
400 QString szName = m_pModel->data(index).toString();
401 szName = QInputDialog::getText(
402 this, tr("Edit"), tr("Enter the modified name"), QLineEdit::Normal, szName);
403 if(szName.isEmpty())
404 return;
405 m_pModel->setData(index, szName);
406 }
407}
408
409void CFavoriteView::slotDelete()
410{
411 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
412 if(1 == lstIndex.size()) {
414 m_pModel->data(lstIndex.at(0), CFavoriteModel::RoleItem)
415 .value<CFavoriteDatabase::Item>();
416 if(0 < item.id) {
417 int ret = QMessageBox::warning(
418 nullptr, tr("Delete"), tr("Will be delete \"%1\"").arg(item.szName),
419 QMessageBox::Ok|QMessageBox::No);
420 if(QMessageBox::Ok != ret)
421 return;
422 }
423 }
424 foreach(auto index, lstIndex)
425 m_pModel->removeRow(index.row(), index.parent());
426}
427
428void CFavoriteView::slotNewGroup()
429{
430 if(!m_pModel) return;
431 QString szGroup = QInputDialog::getText(
432 this, tr("New group"), tr("Input group name"));
433 if(szGroup.isEmpty()) return;
434
435 int parentId = 0;
436 auto lstIndex = m_pTreeView->selectionModel()->selectedIndexes();
437 if(!lstIndex.isEmpty())
438 {
440 m_pModel->data(lstIndex.at(0), CFavoriteModel::RoleItem)
441 .value<CFavoriteDatabase::Item>();
442 if(0 < item.id && item.isFolder())
443 parentId = item.id;
444 }
445
446 m_pModel->AddNode(szGroup, parentId);
447}
448
449void CFavoriteView::slotRefresh()
450{
451 if(m_pModel)
452 m_pModel->Refresh();
453}
454
455void CFavoriteView::slotImport()
456{
457 QString filename = QFileDialog::getOpenFileName(
458 this, tr("Import favorite"),
459 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
460 tr("JSON (*.json)"));
461
462 if (!filename.isEmpty()) {
463 QFileInfo fi(filename);
464 if(0 == fi.suffix().compare("json", Qt::CaseInsensitive)) {
465 if (m_pDatabase->ImportFromJsonFile(filename)) {
466 slotRefresh();
467 QMessageBox::information(
468 this, tr("Success"),
469 tr("Successfully imported favorite from JSON file: %1").arg(filename));
470 } else {
471 QString szErr = tr("Failed to import favorite from JSON file: %1").arg(filename) + "\n";
472 if(!m_pDatabase->GetError().isEmpty())
473 szErr += "\n" + tr("Error: ") + m_pDatabase->GetError();
474 QMessageBox::critical(this, tr("Failure"), szErr);
475 }
476 return;
477 }
478 QMessageBox::warning(this, tr("Import favorite"),
479 tr("Invalid file: %1").arg(filename) + "\n\n"
480 + tr("Please use JSON file"));
481 }
482}
483
484void CFavoriteView::slotExport()
485{
486 QString filename = QFileDialog::getSaveFileName(
487 this, tr("Export favorite"),
488 RabbitCommon::CDir::Instance()->GetDirUserDocument(),
489 tr("JSON (*.json)"));
490
491 if (!filename.isEmpty()) {
492 QFileInfo fi(filename);
493 if(0 == fi.suffix().compare("json", Qt::CaseInsensitive)) {
494 if (m_pDatabase->ExportToJsonFile(filename)) {
495 QMessageBox::information(
496 this, tr("Success"),
497 tr("Favorite successfully exported to JSON file: %1").arg(filename));
498 } else {
499 QString szErr = tr("Failed to import favorite from JSON file: %1").arg(filename) + "\n";
500 if(!m_pDatabase->GetError().isEmpty())
501 szErr += "\n" + tr("Error: ") + m_pDatabase->GetError();
502 QMessageBox::critical(this, tr("Failure"), szErr);
503 }
504 return;
505 }
506 QMessageBox::critical(this, tr("Failure"),
507 tr("Invalid file: %1").arg(filename) + "\n\n"
508 + tr("Please use JSON file"));
509 }
510}
511
512void CFavoriteView::InitialDragDrop()
513{
514 if(!m_pTreeView || !m_pTreeView->viewport())
515 return;
516 //m_pTreeView->installEventFilter(this);
517 m_pTreeView->viewport()->installEventFilter(this);
518 m_pTreeView->setAcceptDrops(true);
519 m_pTreeView->setDragEnabled(true);
520 m_pTreeView->setDragDropMode(QTreeView::InternalMove);
521 m_pTreeView->setDefaultDropAction(Qt::MoveAction);
522 m_pTreeView->setDropIndicatorShown(true);
523}
524
525void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
526{
527 qDebug(log) << Q_FUNC_INFO;
528 auto urls = event->mimeData()->urls();
529 if(event->mimeData()->hasUrls() && urls.length() == 1) {
530 //qDebug(log) << event->mimeData()->urls();
531 event->acceptProposedAction();
532 return;
533 }
534
535 const CFavoriteMimeData* pData =
536 qobject_cast<const CFavoriteMimeData*>(event->mimeData());
537 if (pData)
538 {
539 qDebug(log) << "dragEnterEvent acceptProposedAction";
540 event->acceptProposedAction();
541 /*
542 // 设置拖拽时的光标
543 if (event->proposedAction() == Qt::MoveAction) {
544 setCursor(Qt::DragMoveCursor);
545 } else {
546 setCursor(Qt::DragCopyCursor);
547 }//*/
548 }
549}
550
551void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
552{
553 // qDebug(log) << Q_FUNC_INFO;
554 // const CFavoriteMimeData* pData =
555 // qobject_cast<const CFavoriteMimeData*>(event->mimeData());
556 // if (!pData)
557 // {
558 // event->ignore();
559 // return;
560 // }
561}
562
563void CFavoriteView::dropEvent(QDropEvent *event)
564{
565 qDebug(log) << Q_FUNC_INFO << "drop action:" << event->dropAction();
566 bool bRet = false;
567 auto urls = event->mimeData()->urls();
568 foreach(auto url, urls)
569 {
570 if(url.isLocalFile()) {
571 QString filename = url.toLocalFile();
572 if (m_pDatabase->ImportFromJsonFile(filename)) {
573 slotRefresh();
574 emit sigShowMessageBox(tr("Success"), tr("Successfully imported favorite from JSON file: %1").arg(filename), QMessageBox::Information);
575 } else {
576 QString szErr = tr("Failed to import favorite from JSON file: %1").arg(filename) + "\n";
577 if(!m_pDatabase->GetError().isEmpty())
578 szErr += "\n" + tr("Error: ") + m_pDatabase->GetError();
579 emit sigShowMessageBox(tr("Failure"), szErr, QMessageBox::Critical);
580 }
581 }
582 }
583 if(bRet)
584 event->accept();
585
586 const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
587 if(!pData || pData->m_Items.isEmpty() || !m_pTreeView || !m_pModel) {
588 event->ignore();
589 return;
590 }
591
592#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
593 auto idxParent = m_pTreeView->indexAt(event->position().toPoint());
594#else
595 auto idxParent = m_pTreeView->indexAt(event->pos());
596#endif
597 QVariant v = m_pModel->data(idxParent, CFavoriteModel::RoleItem);
598 CFavoriteDatabase::Item item(TreeItem::TYPE::Node);
599 if(v.isValid())
600 item = v.value<CFavoriteDatabase::Item>();
601 if(0 <= item.id && item.isFolder())
602 {
603 foreach(auto i, pData->m_Items)
604 {
605 if(i == idxParent) {
606 qWarning(log) << "Don't drag, the same node.";
607 break;
608 }
609 if (event->dropAction() == Qt::MoveAction)
610 bRet = m_pModel->Move(i, idxParent);
611 else if (event->dropAction() == Qt::CopyAction)
612 bRet = m_pModel->Copy(i, idxParent);
613 if(!bRet) break;
614 }
615 } else {
616 qWarning(log) << "Don't group node. the id:" << item.id
617 << " Folder:" << item.isFolder();
618 }
619
620 if(bRet)
621 event->accept();
622 else
623 event->ignore();
624}
625
626void CFavoriteView::mousePressEvent(QMouseEvent *event)
627{
628 qDebug(log) << "mousePressEvent";
629 if (m_pTreeView && m_pTreeView->selectionModel()
630 && event->button() == Qt::LeftButton) {
631
632 // 获取选中的索引
633 QModelIndexList indexes = m_pTreeView->selectionModel()->selectedIndexes();
634 if (!indexes.isEmpty()) {
635
636#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
637 auto curIndex = m_pTreeView->indexAt(event->position().toPoint());
638#else
639 auto curIndex = m_pTreeView->indexAt(event->pos());
640#endif
641 if(indexes.contains(curIndex)) {
642 QDrag *drag = new QDrag(this);
643 do {
644 if(!drag) break;
645 m_DragStartPosition = event->pos();
647 pData->m_Items = indexes;
648 drag->setMimeData(pData);
649 Qt::DropAction dropAction = Qt::MoveAction;
650 /*
651 if(event->modifiers() & Qt::ControlModifier) {
652 dropAction = Qt::CopyAction;
653 // 设置拖拽时的光标
654 // QIcon icon = QIcon::fromTheme("edit-copy");
655 // QSize size(16, 16);
656 // if(!icon.availableSizes().isEmpty())
657 // size = icon.availableSizes().at(0);
658 // drag->setDragCursor(icon.pixmap(size), Qt::MoveAction);
659 }//*/
660 drag->exec(dropAction);
661 } while(0);
662 if(drag)
663 delete drag;
664 }
665 }
666 }
667 QWidget::mousePressEvent(event);
668}
669
670void CFavoriteView::mouseMoveEvent(QMouseEvent *event)
671{
672 qDebug(log) << "mouseMoveEvent";
673 do{
674 if (!(event->buttons() & Qt::LeftButton))
675 break;
676 if ((event->pos() - m_DragStartPosition).manhattanLength()
677 < QApplication::startDragDistance())
678 break;
679 qDebug(log) << "mouseMoveEvent drag";
680
681 } while (false);
682
683 QWidget::mouseMoveEvent(event);
684}
685
686bool CFavoriteView::eventFilter(QObject *watched, QEvent *event)
687{
688 // 处理 treeview 的事件
689 if (watched == m_pTreeView->viewport()) { // 处理 viewport 的事件
690 //qDebug(log) << Q_FUNC_INFO << "Viewport event:" << event->type();
691
692 switch (event->type()) {
693 case QEvent::DragEnter:
694 dragEnterEvent(static_cast<QDragEnterEvent*>(event));
695 return true;
696 case QEvent::DragMove:
697 dragMoveEvent(static_cast<QDragMoveEvent*>(event));
698 return true;
699 case QEvent::Drop:
700 dropEvent(static_cast<QDropEvent*>(event));
701 return true;
702 case QEvent::MouseButtonPress:
703 mousePressEvent(static_cast<QMouseEvent*>(event));
704 // 不返回true,让 viewport 也处理
705 break;
706 case QEvent::MouseMove:
707 mouseMoveEvent(static_cast<QMouseEvent*>(event));
708 // 不返回true,让 viewport 也处理
709 break;
710 default:
711 break;
712 }
713 }
714
715 return QWidget::eventFilter(watched, event);
716}
static QString SetFile(const QString &szFile)
Set the file with file system to the file in database
Definition Database.cpp:892
static QString GetFile(const QString &szFile)
Get the file with file system from the file in database
Definition Database.cpp:881
bool SetDatabase(const CDatabase *db)
Share an existing database
Definition Database.cpp:34
The CFavoriteDatabase class
The CFavoriteView class
virtual void sigShowMessageBox(const QString &title, const QString &message, const QMessageBox::Icon &icon)
用消息对话框(QMessageBox)显示信息
virtual int Save(QString szFile=QString(), bool bForce=true)
Save to file
Definition Parameter.cpp:47