aboutsummaryrefslogtreecommitdiff
path: root/mapman/src/sliceview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mapman/src/sliceview.cpp')
-rw-r--r--mapman/src/sliceview.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/mapman/src/sliceview.cpp b/mapman/src/sliceview.cpp
new file mode 100644
index 0000000..1dc385b
--- /dev/null
+++ b/mapman/src/sliceview.cpp
@@ -0,0 +1,101 @@
+#include "sliceview.hpp"
+#include "library.hpp"
+#include "painter.hpp"
+#include "utils.hpp"
+
+#include <QListView>
+#include <QGraphicsView>
+#include <QStandardItemModel>
+#include <QSplitter>
+#include <QDrag>
+#include <QMimeData>
+#include <QEvent>
+#include <QMouseEvent>
+#include <QApplication>
+#include <qnamespace.h>
+
+slice_view::slice_view() : l(nullptr)
+{
+ lv = new QListView(this);
+ m = new QStandardItemModel(this);
+ lv->setModel(m);
+ lv->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
+ lv->setDragDropMode(QAbstractItemView::DragDropMode::NoDragDrop);
+ lv->viewport()->installEventFilter(this);
+ p = new map_painter();
+ p->set_dimension(1, 1);
+ auto layout = new QSplitter(Qt::Orientation::Horizontal, this);
+ layout->setContentsMargins(6, 6, 6, 6);
+ layout->addWidget(lv);
+ layout->addWidget(p->view());
+ layout->setStretchFactor(0, 1);
+ layout->setStretchFactor(1, 3);
+ layout->setCollapsible(0, false);
+ layout->setCollapsible(1, false);
+ this->setWidget(layout);
+ connect(lv->selectionModel(), &QItemSelectionModel::currentChanged,
+ [this](const QModelIndex &cur, const QModelIndex&) {
+ if (this->l)
+ this->p->set_map_id(0, true, cur.data(Qt::UserRole + 1).toInt());
+ });
+ connect(lv, &QAbstractItemView::pressed,
+ [this](const QModelIndex &idx) {
+ dragidx = idx;
+ });
+ this->setWindowTitle("Map listings");
+ this->setAttribute(Qt::WA_DeleteOnClose, false);
+}
+
+slice_view::~slice_view()
+{
+ delete p;
+}
+
+void slice_view::set_library(map_library *lib)
+{
+ l = lib;
+ p->set_map_library(l);
+ refresh();
+}
+
+bool slice_view::eventFilter(QObject *o, QEvent *e)
+{
+ if (e->type() == QEvent::MouseButtonRelease)
+ dragidx = QModelIndex();
+ if (e->type() == QEvent::MouseButtonPress)
+ dragpos = static_cast<QMouseEvent*>(e)->screenPos();
+ if (e->type() == QEvent::MouseMove)
+ {
+ auto pos = static_cast<QMouseEvent*>(e)->screenPos();
+ if (dragidx.isValid() && (pos - dragpos).manhattanLength() >= QApplication::startDragDistance())
+ {
+ auto *d = new QDrag(lv);
+ int mapid = dragidx.data(Qt::ItemDataRole::UserRole + 1).toInt();
+ d->setPixmap(qvariant_cast<QIcon>(dragidx.data(Qt::ItemDataRole::DecorationRole)).pixmap(128, 128));
+ auto *m = new QMimeData();
+ m->setData("application/x-map-id", QByteArray(reinterpret_cast<char*>(&mapid), 4));
+ d->setMimeData(m);
+ d->exec(Qt::DropAction::CopyAction);
+ }
+ }
+ return false;
+}
+
+void slice_view::refresh()
+{
+ int curid = lv->currentIndex().data().toInt();
+ m->clear();
+ auto ids = l->map_ids();
+ for (auto id : ids)
+ {
+ map_t map = l->get_map(id);
+ QPixmap pm = pixmap_of_map_data(map.map_data);
+ QString text = QString("(%1)").arg(id);
+ if (map.custom_name.length()) text = QString::fromStdString(map.custom_name) + " " + text;
+ QStandardItem *itm = new QStandardItem(QIcon(pm), text);
+ itm->setData(QVariant(id));
+ m->appendRow(itm);
+ if (id == curid)
+ lv->setCurrentIndex(itm->index());
+ }
+}