From 2a5dec9cf02e954f87872592ef84492f85ac9ce9 Mon Sep 17 00:00:00 2001 From: Micah Stanley Date: Thu, 7 Nov 2024 05:17:57 +0000 Subject: [PATCH] homescreens/folio: FavouritesBar: Icon position animation bugfix This fixes in issue where the favorites bar icons would previously animate based off of position changes. This was causing unwanted animations in situations like screen rotation and login. --- .../homescreens/folio/favouritesmodel.cpp | 50 +------------------ .../homescreens/folio/favouritesmodel.h | 2 - .../package/contents/ui/FavouritesBar.qml | 38 +++++++------- .../folio/package/contents/ui/HomeScreen.qml | 2 - 4 files changed, 18 insertions(+), 74 deletions(-) diff --git a/containments/homescreens/folio/favouritesmodel.cpp b/containments/homescreens/folio/favouritesmodel.cpp index 46d49518..9f09f5b7 100644 --- a/containments/homescreens/folio/favouritesmodel.cpp +++ b/containments/homescreens/folio/favouritesmodel.cpp @@ -24,24 +24,6 @@ FavouritesModel::FavouritesModel(HomeScreen *parent) : QAbstractListModel{parent} , m_homeScreen{parent} { - connect(m_homeScreen->homeScreenState(), &HomeScreenState::pageWidthChanged, this, [this]() { - evaluateDelegatePositions(true); - }); - connect(m_homeScreen->homeScreenState(), &HomeScreenState::pageHeightChanged, this, [this]() { - evaluateDelegatePositions(true); - }); - connect(m_homeScreen->homeScreenState(), &HomeScreenState::pageCellWidthChanged, this, [this]() { - evaluateDelegatePositions(true); - }); - connect(m_homeScreen->homeScreenState(), &HomeScreenState::pageCellHeightChanged, this, [this]() { - evaluateDelegatePositions(true); - }); - connect(m_homeScreen->homeScreenState(), &HomeScreenState::favouritesBarLocationChanged, this, [this]() { - evaluateDelegatePositions(true); - }); - connect(m_homeScreen->homeScreenState(), &HomeScreenState::pageOrientationChanged, this, [this]() { - evaluateDelegatePositions(true); - }); } int FavouritesModel::rowCount(const QModelIndex &parent) const @@ -59,8 +41,6 @@ QVariant FavouritesModel::data(const QModelIndex &index, int role) const switch (role) { case DelegateRole: return QVariant::fromValue(m_delegates.at(index.row()).delegate); - case XPositionRole: - return QVariant::fromValue(m_delegates.at(index.row()).xPosition); } return QVariant(); @@ -68,7 +48,7 @@ QVariant FavouritesModel::data(const QModelIndex &index, int role) const QHash FavouritesModel::roleNames() const { - return {{DelegateRole, "delegate"}, {XPositionRole, "xPosition"}}; + return {{DelegateRole, "delegate"}}; } void FavouritesModel::removeEntry(int row) @@ -83,8 +63,6 @@ void FavouritesModel::removeEntry(int row) m_delegates.removeAt(row); endRemoveRows(); - evaluateDelegatePositions(); - save(); } @@ -109,8 +87,6 @@ void FavouritesModel::moveEntry(int fromRow, int toRow) } endMoveRows(); - evaluateDelegatePositions(); - save(); } @@ -136,22 +112,18 @@ bool FavouritesModel::addEntry(int row, FolioDelegate *delegate) if (row == m_delegates.size()) { beginInsertRows(QModelIndex(), row, row); m_delegates.append({delegate, 0}); - evaluateDelegatePositions(false); endInsertRows(); } else if (m_delegates[row].delegate->type() == FolioDelegate::None) { replaceGhostEntry(delegate); } else { beginInsertRows(QModelIndex(), row, row); m_delegates.insert(row, {delegate, 0}); - evaluateDelegatePositions(false); endInsertRows(); } // ensure saves are connected when requested by the delegate connectSaveRequests(delegate); - evaluateDelegatePositions(); - save(); return true; @@ -291,7 +263,6 @@ void FavouritesModel::loadFromJson(QJsonArray arr) } } - evaluateDelegatePositions(false); endResetModel(); } @@ -398,25 +369,6 @@ QPointF FavouritesModel::getDelegateScreenPosition(int position) const return {0, 0}; } -void FavouritesModel::evaluateDelegatePositions(bool emitSignal) -{ - auto homeScreenState = m_homeScreen->homeScreenState(); - - bool isLocationBottom = homeScreenState->favouritesBarLocation() == HomeScreenState::Bottom; - qreal cellLength = isLocationBottom ? homeScreenState->pageCellWidth() : homeScreenState->pageCellHeight(); - qreal startPosition = getDelegateRowStartPos(); - qreal currentPos = startPosition; - - for (int i = 0; i < m_delegates.size(); ++i) { - m_delegates[adjustIndex(i)].xPosition = qRound(currentPos); - currentPos += cellLength; - } - - if (emitSignal) { - Q_EMIT dataChanged(createIndex(0, 0), createIndex(m_delegates.size() - 1, 0), {XPositionRole}); - } -} - qreal FavouritesModel::getDelegateRowStartPos() const { auto homeScreenState = m_homeScreen->homeScreenState(); diff --git a/containments/homescreens/folio/favouritesmodel.h b/containments/homescreens/folio/favouritesmodel.h index 751dbf7c..1ff88b9e 100644 --- a/containments/homescreens/folio/favouritesmodel.h +++ b/containments/homescreens/folio/favouritesmodel.h @@ -31,7 +31,6 @@ class FavouritesModel : public QAbstractListModel public: enum Roles { DelegateRole = Qt::UserRole + 1, - XPositionRole, }; FavouritesModel(HomeScreen *parent = nullptr); @@ -73,7 +72,6 @@ public: private: void connectSaveRequests(FolioDelegate *delegate); - void evaluateDelegatePositions(bool emitSignal = true); // get the x (or y) position where delegates start being placed qreal getDelegateRowStartPos() const; diff --git a/containments/homescreens/folio/package/contents/ui/FavouritesBar.qml b/containments/homescreens/folio/package/contents/ui/FavouritesBar.qml index 031684da..86dbc799 100644 --- a/containments/homescreens/folio/package/contents/ui/FavouritesBar.qml +++ b/containments/homescreens/folio/package/contents/ui/FavouritesBar.qml @@ -20,45 +20,41 @@ MouseArea { property var homeScreen - // use to account for x-y positioning, because delegate x and y will include the screen margins - property real leftMargin - property real topMargin - signal delegateDragRequested(var item) onPressAndHold: folio.HomeScreenState.openSettingsView() Repeater { + id: repeater model: folio.FavouritesModel delegate: Item { id: delegate - property var delegateModel: model.delegate - property int index: model.index + readonly property var delegateModel: model.delegate + readonly property int index: model.index - property var dragState: folio.HomeScreenState.dragState - property bool isDropPositionThis: dragState.candidateDropPosition.location === Folio.DelegateDragPosition.Favourites && + readonly property var dragState: folio.HomeScreenState.dragState + readonly property bool isDropPositionThis: dragState.candidateDropPosition.location === Folio.DelegateDragPosition.Favourites && dragState.candidateDropPosition.favouritesPosition === delegate.index - property bool isAppHoveredOver: folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate && + readonly property bool isAppHoveredOver: folio.HomeScreenState.swipeState === Folio.HomeScreenState.DraggingDelegate && dragState.dropDelegate && dragState.dropDelegate.type === Folio.FolioDelegate.Application && isDropPositionThis - // only one of them will be used, because of the anchors below - // this is used due to the ability for the favourites bar to be in multiple locations - x: model.xPosition - leftMargin - y: model.xPosition - topMargin + readonly property bool isLocationBottom: folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom - anchors.verticalCenter: folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom ? parent.verticalCenter : undefined - anchors.horizontalCenter: folio.HomeScreenState.favouritesBarLocation === Folio.HomeScreenState.Bottom ? undefined : parent.horizontalCenter + // get the normalized index position value from the center so we can animate it + property double fromCenterValue: model.index - (repeater.count / 2) + Behavior on fromCenterValue { + NumberAnimation { duration: 250; easing.type: Easing.InOutQuad; } + } - Behavior on x { - NumberAnimation { duration: 250; easing.type: Easing.InOutQuad } - } - Behavior on y { - NumberAnimation { duration: 250; easing.type: Easing.InOutQuad } - } + // multiply the 'fromCenterValue' by the cell size to get the actual position + readonly property int centerPosition: (isLocationBottom ? folio.HomeScreenState.pageCellWidth : folio.HomeScreenState.pageCellHeight) * fromCenterValue + + x: isLocationBottom ? centerPosition + parent.width / 2 : (parent.width - width) / 2 + y: isLocationBottom ? (parent.height - height) / 2 : parent.height / 2 - centerPosition - folio.HomeScreenState.pageCellHeight implicitWidth: folio.HomeScreenState.pageCellWidth implicitHeight: folio.HomeScreenState.pageCellHeight diff --git a/containments/homescreens/folio/package/contents/ui/HomeScreen.qml b/containments/homescreens/folio/package/contents/ui/HomeScreen.qml index 41e57190..215307cf 100644 --- a/containments/homescreens/folio/package/contents/ui/HomeScreen.qml +++ b/containments/homescreens/folio/package/contents/ui/HomeScreen.qml @@ -258,8 +258,6 @@ Item { id: favouritesBar folio: root.folio homeScreen: root - leftMargin: root.leftMargin - topMargin: root.topMargin // don't show in settings mode opacity: 1 - folio.HomeScreenState.settingsOpenProgress