11// Author: Kang Lin <kl222@126.com>
22
3+ #include < QMimeData>
34#include < QVBoxLayout>
45#include < QDateTime>
56#include < QStandardItem>
1314#include " FrmRecent.h"
1415#include " RabbitCommonDir.h"
1516
16- static Q_LOGGING_CATEGORY (log, " App.FrmListRecent " )
17+ static Q_LOGGING_CATEGORY (log, " App.CFrmRecent " )
1718
1819CFrmRecent::CFrmRecent(
1920 MainWindow *pMainWindow, CManager *pManager,
@@ -156,6 +157,7 @@ CFrmRecent::CFrmRecent(
156157
157158 Q_ASSERT (m_pManager);
158159 m_pTableView = new QTableView (this );
160+ InitialDrop ();
159161 m_pTableView->setContextMenuPolicy (Qt::CustomContextMenu);
160162 check = connect (m_pTableView,
161163 SIGNAL (customContextMenuRequested (const QPoint &)),
@@ -582,9 +584,10 @@ void CFrmRecent::slotImport()
582584 this , tr (" Success" ),
583585 tr (" Successfully imported recent from json file" ));
584586 } else {
585- QMessageBox::warning (
586- this , tr (" Failure" ),
587- tr (" Failed to import 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);
588591 }
589592 return ;
590593 }
@@ -606,11 +609,89 @@ void CFrmRecent::slotExport()
606609 this , tr (" Success" ),
607610 tr (" Successfully exported recent to json file" ));
608611 } else {
609- QMessageBox::warning (
610- this , tr (" Failure" ),
611- tr (" Failed to export 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);
612616 }
613617 return ;
614618 }
615619 }
616620}
621+
622+ void 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+
634+ void 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+
645+ void CFrmRecent::dragMoveEvent (QDragMoveEvent *event)
646+ {
647+ // qDebug(log) << Q_FUNC_INFO;
648+ }
649+
650+ void 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+
678+ bool 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+ }
0 commit comments