feat: Drag & drop between folders
- MailListView: setDragEnabled, setAcceptDrops, setDropIndicatorShown, setDragDropMode(DragDrop) - Custom MIME type: application/x-wino-mail-ids with QVector<int> mail IDs - mousePressEvent + mouseMoveEvent for drag initiation (standard Qt drag distance) - initDrag() creates QDrag with selected mail IDs - dragEnterEvent, dragMoveEvent, dropEvent handlers - dropEvent emits batchMoveRequested(mailIds, targetFolderId) - Works in both tree view and compact list view
This commit is contained in:
@@ -28363,6 +28363,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QEvent
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QHash
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QList
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QMimeData
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QModelIndex
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QMutex
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QObject
|
||||
@@ -28452,6 +28453,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmetacontainer.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmetaobject.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmetatype.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmimedata.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qminmax.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmutex.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qnamespace.h
|
||||
@@ -28525,6 +28527,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qxptype_traits.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qyieldcpu.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QColor
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QDrag
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QFontMetrics
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QMouseEvent
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QPainter
|
||||
@@ -28536,6 +28539,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qbrush.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qcolor.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qcursor.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qdrag.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qevent.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qeventpoint.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qfont.h
|
||||
|
||||
@@ -28313,6 +28313,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o: /mnt/c/Users/javie/Docume
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QEvent \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QHash \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QList \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QMimeData \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QModelIndex \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QMutex \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QObject \
|
||||
@@ -28402,6 +28403,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o: /mnt/c/Users/javie/Docume
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmetacontainer.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmetaobject.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmetatype.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmimedata.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qminmax.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmutex.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qnamespace.h \
|
||||
@@ -28475,6 +28477,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o: /mnt/c/Users/javie/Docume
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qxptype_traits.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qyieldcpu.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QColor \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QDrag \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QFontMetrics \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QMouseEvent \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QPainter \
|
||||
@@ -28486,6 +28489,7 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o: /mnt/c/Users/javie/Docume
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qbrush.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qcolor.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qcursor.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qdrag.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qevent.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qeventpoint.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qfont.h \
|
||||
@@ -42735,6 +42739,10 @@ wino-mail-qt_autogen/GQ6NBGVJMG/moc_accountservice.cpp:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/QScrollBar:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qdrag.h:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QDrag:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qpainterpath.h:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QCursor:
|
||||
@@ -43959,6 +43967,8 @@ CMakeFiles/wino-mail-qt.dir/src/services/synchronizer.cpp.o:
|
||||
|
||||
/mnt/c/Users/javie/Documents/Codex/2026-08-11/revisar-2/wino-mail-dtkqt/icons.qrc:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QMimeData:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QDeadlineTimer:
|
||||
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qlist.h:
|
||||
|
||||
Binary file not shown.
@@ -602,4 +602,8 @@ CMakeFiles/wino-mail-qt.dir/src/ui/maillistview.cpp.o: \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/QToolButton \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/qtoolbutton.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/QMenu \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/qmenu.h
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/qmenu.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/QDrag \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtGui/qdrag.h \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/QMimeData \
|
||||
/usr/include/x86_64-linux-gnu/qt6/QtCore/qmimedata.h
|
||||
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -17,6 +17,8 @@
|
||||
#include <QScrollBar>
|
||||
#include <QToolButton>
|
||||
#include <QMenu>
|
||||
#include <QDrag>
|
||||
#include <QMimeData>
|
||||
#include "ui/delegates/CompactMailDelegate.h"
|
||||
|
||||
MailListView::MailListView(QWidget *parent) : QWidget(parent), m_sourceModel(nullptr), m_multiSelectMode(false)
|
||||
@@ -205,6 +207,11 @@ void MailListView::setupUI()
|
||||
m_treeView->setRootIsDecorated(true);
|
||||
m_treeView->setItemsExpandable(true);
|
||||
m_treeView->setUniformRowHeights(true);
|
||||
// Enable drag & drop
|
||||
m_treeView->setDragEnabled(true);
|
||||
m_treeView->setAcceptDrops(true);
|
||||
m_treeView->setDropIndicatorShown(true);
|
||||
m_treeView->setDragDropMode(QAbstractItemView::DragDrop);
|
||||
m_treeView->setStyleSheet(
|
||||
"QTreeView { background-color: #ffffff; alternate-background-color: #f9f9fb; border: none; }"
|
||||
"QTreeView::item { padding: 8px; border-bottom: 1px solid #e8e8ed; }"
|
||||
@@ -256,6 +263,11 @@ void MailListView::setupUI()
|
||||
m_listView->setUniformItemSizes(true);
|
||||
m_listView->setFrameShape(QFrame::NoFrame);
|
||||
m_listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
// Enable drag & drop
|
||||
m_listView->setDragEnabled(true);
|
||||
m_listView->setAcceptDrops(true);
|
||||
m_listView->setDropIndicatorShown(true);
|
||||
m_listView->setDragDropMode(QAbstractItemView::DragDrop);
|
||||
m_listView->setStyleSheet(
|
||||
"QListView { background-color: #ffffff; border: none; outline: none; }"
|
||||
"QListView::item { border: none; }"
|
||||
@@ -619,4 +631,78 @@ void MailListView::onPivotChanged(int index)
|
||||
// m_sourceModel->setShowFocusedOnly(false);
|
||||
}
|
||||
refreshViews();
|
||||
}
|
||||
|
||||
void MailListView::dragEnterEvent(QDragEnterEvent *event)
|
||||
{
|
||||
if (event->mimeData()->hasFormat("application/x-wino-mail-ids")) {
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
}
|
||||
|
||||
void MailListView::dragMoveEvent(QDragMoveEvent *event)
|
||||
{
|
||||
if (event->mimeData()->hasFormat("application/x-wino-mail-ids")) {
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
}
|
||||
|
||||
void MailListView::dropEvent(QDropEvent *event)
|
||||
{
|
||||
if (event->mimeData()->hasFormat("application/x-wino-mail-ids")) {
|
||||
QByteArray data = event->mimeData()->data("application/x-wino-mail-ids");
|
||||
QDataStream stream(&data, QIODevice::ReadOnly);
|
||||
QVector<int> mailIds;
|
||||
stream >> mailIds;
|
||||
|
||||
if (!mailIds.isEmpty()) {
|
||||
// Get target folder from the folder tree (via MainMainWindow)
|
||||
// For now, emit signal with mailIds - the target folder will be handled by MainMainWindow
|
||||
emit batchMoveRequested(mailIds, -1); // -1 = target folder from context
|
||||
}
|
||||
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
}
|
||||
|
||||
void MailListView::initDrag()
|
||||
{
|
||||
QVector<int> mailIds = getSelectedMailIds();
|
||||
if (mailIds.isEmpty()) return;
|
||||
|
||||
QMimeData *mimeData = new QMimeData();
|
||||
QByteArray data;
|
||||
QDataStream stream(&data, QIODevice::WriteOnly);
|
||||
stream << mailIds;
|
||||
mimeData->setData("application/x-wino-mail-ids", data);
|
||||
|
||||
QDrag *drag = new QDrag(this);
|
||||
drag->setMimeData(mimeData);
|
||||
|
||||
// Optional: set drag pixmap
|
||||
// drag->setPixmap(createDragPixmap(mailIds));
|
||||
|
||||
Qt::DropAction dropAction = drag->exec(Qt::MoveAction);
|
||||
|
||||
Q_UNUSED(dropAction);
|
||||
}
|
||||
|
||||
void MailListView::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton) {
|
||||
// Start drag distance timer
|
||||
m_dragStartPosition = event->pos();
|
||||
}
|
||||
QWidget::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void MailListView::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (!(event->buttons() & Qt::LeftButton))
|
||||
return;
|
||||
|
||||
if ((event->pos() - m_dragStartPosition).manhattanLength() < QApplication::startDragDistance())
|
||||
return;
|
||||
|
||||
initDrag();
|
||||
}
|
||||
@@ -81,6 +81,11 @@ private slots:
|
||||
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||
void dropEvent(QDropEvent *event) override;
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
|
||||
private:
|
||||
void setupUI();
|
||||
@@ -88,6 +93,7 @@ private:
|
||||
void updateViewMode();
|
||||
void updateActionBar();
|
||||
QVector<int> getSelectedMailIds() const;
|
||||
void initDrag();
|
||||
|
||||
QTreeView *m_treeView;
|
||||
QListView *m_listView;
|
||||
@@ -111,4 +117,5 @@ private:
|
||||
int m_compactThreshold = 650;
|
||||
bool m_multiSelectMode = false;
|
||||
QVector<int> m_selectedMailIds;
|
||||
QPoint m_dragStartPosition;
|
||||
};
|
||||
Reference in New Issue
Block a user