[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [falkon] src/lib/tabwidget: TabModel: Implement drag&drop
From: David Rosca <null () kde ! org>
Date: 2018-01-31 20:10:36
Message-ID: E1egyiK-0002Fo-Lk () code ! kde ! org
[Download RAW message or body]
Git commit 72c4b605a5499f383e9f8d15ced43660f91698a4 by David Rosca.
Committed on 31/01/2018 at 19:56.
Pushed by drosca into branch 'master'.
TabModel: Implement drag&drop
M +75 -0 src/lib/tabwidget/tabmodel.cpp
M +6 -0 src/lib/tabwidget/tabmodel.h
https://commits.kde.org/falkon/72c4b605a5499f383e9f8d15ced43660f91698a4
diff --git a/src/lib/tabwidget/tabmodel.cpp b/src/lib/tabwidget/tabmodel.cpp
index 4329af82..4f0d95b8 100644
--- a/src/lib/tabwidget/tabmodel.cpp
+++ b/src/lib/tabwidget/tabmodel.cpp
@@ -21,6 +21,8 @@
#include "tabbedwebview.h"
#include "browserwindow.h"
+#include <QMimeData>
+
TabModel::TabModel(BrowserWindow *window, QObject *parent)
: QAbstractListModel(parent)
, m_window(window)
@@ -41,6 +43,14 @@ int TabModel::rowCount(const QModelIndex &parent) const
return m_window ? m_window->tabCount() : 0;
}
+Qt::ItemFlags TabModel::flags(const QModelIndex &index) const
+{
+ if (!index.isValid()) {
+ return Qt::ItemIsDropEnabled;
+ }
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
+}
+
QVariant TabModel::data(const QModelIndex &index, int role) const
{
if (!m_window || index.row() < 0 || index.row() > m_window->tabCount()) {
@@ -81,6 +91,71 @@ QVariant TabModel::data(const QModelIndex &index, int role) const
}
}
+Qt::DropActions TabModel::supportedDropActions() const
+{
+ return Qt::MoveAction;
+}
+
+#define MIMETYPE QStringLiteral("application/falkon.tabmodel.tab")
+
+QStringList TabModel::mimeTypes() const
+{
+ return {MIMETYPE};
+}
+
+QMimeData *TabModel::mimeData(const QModelIndexList &indexes) const
+{
+ QByteArray data;
+ QDataStream stream(&data, QIODevice::WriteOnly);
+
+ for (const QModelIndex &index : indexes) {
+ if (index.isValid() && index.column() == 0) {
+ stream << index.row();
+ }
+ }
+
+ QMimeData *mimeData = new QMimeData();
+ mimeData->setData(MIMETYPE, data);
+ return mimeData;
+}
+
+bool TabModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, \
int column, const QModelIndex &parent) +{
+ if (action == Qt::IgnoreAction) {
+ return true;
+ }
+
+ if (!m_window || !data->hasFormat(MIMETYPE) || parent.isValid() || column != 0) \
{ + return false;
+ }
+
+ QByteArray encodedData = data->data(MIMETYPE);
+ QDataStream stream(&encodedData, QIODevice::ReadOnly);
+
+ QVector<WebTab*> tabs;
+ while (!stream.atEnd()) {
+ int index;
+ stream >> index;
+ WebTab *tab = webTab(index);
+ if (tab) {
+ tabs.append(tab);
+ }
+ }
+
+ if (tabs.isEmpty()) {
+ return false;
+ }
+
+ for (int i = 0; i < tabs.count(); ++i) {
+ const int from = tabs.at(i)->tabIndex();
+ const int to = row >= from ? row - 1 : row++;
+ // FIXME: This switches order when moving > 2 non-contiguous indices
+ m_window->tabWidget()->moveTab(from, to);
+ }
+
+ return true;
+}
+
void TabModel::init()
{
for (int i = 0; i < m_window->tabCount(); ++i) {
diff --git a/src/lib/tabwidget/tabmodel.h b/src/lib/tabwidget/tabmodel.h
index 6a6bd761..140460e3 100644
--- a/src/lib/tabwidget/tabmodel.h
+++ b/src/lib/tabwidget/tabmodel.h
@@ -44,8 +44,14 @@ public:
WebTab *webTab(int row) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const \
override;
+ Qt::DropActions supportedDropActions() const override;
+ QStringList mimeTypes() const override;
+ QMimeData *mimeData(const QModelIndexList &indexes) const override;
+ bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int \
column, const QModelIndex &parent) override; +
private:
void init();
void tabInserted(int index);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic