From 2c46ccdfb84af46bbd48530678fae54b5ea08963 Mon Sep 17 00:00:00 2001 From: Norm Date: Mon, 20 Sep 2021 10:45:00 -0500 Subject: [PATCH] fix chapters model update, add some padding to the manga details icon --- src/models/ChaptersModel.cpp | 9 +++- src/models/DownloadsModel.cpp | 10 ++++ src/pinchzoomitem.cpp | 11 ++++ src/pinchzoomitem.h | 96 +++++++++++++++++++++++++++++++++++ src/qml/MangaDetails.qml | 3 ++ 5 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/pinchzoomitem.cpp create mode 100644 src/pinchzoomitem.h diff --git a/src/models/ChaptersModel.cpp b/src/models/ChaptersModel.cpp index 966630a..b664463 100644 --- a/src/models/ChaptersModel.cpp +++ b/src/models/ChaptersModel.cpp @@ -42,6 +42,11 @@ void ChaptersModel::classBegin() { } +/****************************************************************************** + * + * gotChapters + * + *****************************************************************************/ void ChaptersModel::gotChapters(const QJsonDocument& reply) { if (reply.isEmpty()) { @@ -53,7 +58,7 @@ void ChaptersModel::gotChapters(const QJsonDocument& reply) _chapters.clear(); - beginInsertRows({}, _chapters.size(), _chapters.size() + reply.array().count() - 1); + beginResetModel(); for (const auto& entry_arr : reply.array()) { const auto& entry = entry_arr.toObject(); @@ -75,7 +80,7 @@ void ChaptersModel::gotChapters(const QJsonDocument& reply) } emit lastReadChapterChanged(); - endInsertRows(); + endResetModel(); if (!_cachedChapters) { _cachedChapters = true; diff --git a/src/models/DownloadsModel.cpp b/src/models/DownloadsModel.cpp index bb13ef9..7edabc3 100644 --- a/src/models/DownloadsModel.cpp +++ b/src/models/DownloadsModel.cpp @@ -52,6 +52,11 @@ void DownloadsModel::componentComplete() _webSocket.open(QUrl(resolved)); } +/****************************************************************************** + * + * closed + * + *****************************************************************************/ void DownloadsModel::closed() { } @@ -67,6 +72,11 @@ void DownloadsModel::onConnected() this, &DownloadsModel::onTextMessageReceived); } +/****************************************************************************** + * + * onTextMessageReceived + * + *****************************************************************************/ void DownloadsModel::onTextMessageReceived(const QString& message) { QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8()); diff --git a/src/pinchzoomitem.cpp b/src/pinchzoomitem.cpp new file mode 100644 index 0000000..1b69b97 --- /dev/null +++ b/src/pinchzoomitem.cpp @@ -0,0 +1,11 @@ +#include "pinchzoomitem.h" + +#include +#include + +#define exportQmlType(ns, cls) qmlRegisterType(#ns, 1, 0, #cls) +#define IMPLEMENT_QTQUICK_TYPE(ns, cls) \ + void register ## cls ## Type() { exportQmlType(ns, cls); } \ + Q_COREAPP_STARTUP_FUNCTION(register ## cls ## Type) + +IMPLEMENT_QTQUICK_TYPE(Tachidesk.Util, PinchZoomItem) diff --git a/src/pinchzoomitem.h b/src/pinchzoomitem.h new file mode 100644 index 0000000..3477071 --- /dev/null +++ b/src/pinchzoomitem.h @@ -0,0 +1,96 @@ +#pragma once + +#include +#include +#include + +/** + * @brief The PinchZoomItem class + * @author ARC + */ +class PinchZoomItem : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(QQuickItem* zoomTarget MEMBER mTarget) + Q_PROPERTY(qreal wheelFactor MEMBER mWheelFactor) + Q_PROPERTY(qreal zoomFactor MEMBER mFactor) + Q_PROPERTY(qreal zoomMax MEMBER mMax) + Q_PROPERTY(qreal zoomMin MEMBER mMin) +public: + PinchZoomItem(QQuickItem *parent = 0) : + QQuickItem(parent), + mTarget(Q_NULLPTR), + mWheelFactor(0.1), + mCurrentFactor(1), + mFactor(1), + mMax(-1), + mMin(0.5) + { + connect(this, &QQuickItem::widthChanged, this, &PinchZoomItem::setDefaultMax); + connect(this, &QQuickItem::heightChanged, this, &PinchZoomItem::setDefaultMax); + } + +signals: + +public slots: + +protected: + void touchEvent(QTouchEvent *touchEvent) Q_DECL_OVERRIDE { + switch (touchEvent->type()) { + case QTouchEvent::TouchBegin: + case QTouchEvent::TouchUpdate: + case QTouchEvent::TouchEnd: { + QList touchPoints = touchEvent->touchPoints(); + if(touchPoints.count() == 2) { + const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first(); + const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last(); + qreal s = QLineF(touchPoint0.pos(), touchPoint1.pos()).length() / \ + QLineF(touchPoint0.startPos(), touchPoint1.startPos()).length(); + if(touchEvent->touchPointStates() & Qt::TouchPointReleased) { + mCurrentFactor = zoom(mCurrentFactor * s); + } else { + zoom(mCurrentFactor * s); + } + } + } + default: + break; + } + } + + void wheelEvent(QWheelEvent* wheelEvent) Q_DECL_OVERRIDE{ + mCurrentFactor = zoom(mCurrentFactor + (wheelEvent->angleDelta().y() > 0? 1:-1) * mWheelFactor); + } + + void componentComplete() Q_DECL_OVERRIDE { + QQuickItem::componentComplete(); + if(mTarget == Q_NULLPTR && !childItems().isEmpty()) + mTarget = childItems().first(); + } +private slots: + void setDefaultMax(){ + if(mMax == -1){ + mMax = mTarget->parentItem()->width() / mTarget->width(); + if(mMax < mMin) + qWarning()<className()<<"Zoom min have to be smaller than max."; + } + } + +private: + inline qreal zoom(const qreal& f){ + if(mTarget != Q_NULLPTR && mMin < f && f < mMax){ + mTarget->setScale(f * mFactor); + return f; + } else { + return mCurrentFactor; + } + } + + QQuickItem* mTarget; + qreal mWheelFactor; + qreal mCurrentFactor; + qreal mFactor; + qreal mMax; + qreal mMin; +}; + diff --git a/src/qml/MangaDetails.qml b/src/qml/MangaDetails.qml index 9048bb7..ab75109 100644 --- a/src/qml/MangaDetails.qml +++ b/src/qml/MangaDetails.qml @@ -124,6 +124,9 @@ Item { Column { id: detailsColumn spacing: 8 + leftPadding: 4 + rightPadding: 4 + topPadding: 4 width: parent.width height: { var heightLimit = parent.height * 3/8