mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-29 15:03:09 +00:00
Currently delegates do not get deleted when removed from models. Due to the complexity of drag state and other objects, we can't simply delete the delegate when removed from the model because they might still be involved in animations or other state at the time of removal. Use smart pointers to have the delegate objects deleted instead. QML unfortunately doesn't support QSharedPointer, so we need to expose raw pointers to it.
66 lines
1.8 KiB
C++
66 lines
1.8 KiB
C++
// SPDX-FileCopyrightText: 2022-2023 Devin Lin <devin@kde.org>
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include "folioapplication.h"
|
|
#include "folioapplicationfolder.h"
|
|
#include "foliodelegate.h"
|
|
#include "homescreen.h"
|
|
|
|
#include <QAbstractListModel>
|
|
#include <QJsonArray>
|
|
#include <QList>
|
|
|
|
#include <Plasma/Applet>
|
|
|
|
class HomeScreen;
|
|
class FolioPageDelegate;
|
|
|
|
class PageModel : public QAbstractListModel
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
enum Roles {
|
|
DelegateRole = Qt::UserRole + 1,
|
|
XPositionRole,
|
|
YPositionRole,
|
|
ShownRole,
|
|
};
|
|
|
|
PageModel(QList<std::shared_ptr<FolioPageDelegate>> delegates = QList<std::shared_ptr<FolioPageDelegate>>{},
|
|
QObject *parent = nullptr,
|
|
HomeScreen *m_homeScreen = nullptr);
|
|
~PageModel();
|
|
|
|
static PageModel *fromJson(QJsonArray &arr, QObject *parent, HomeScreen *homeScreen);
|
|
|
|
QJsonArray toJson() const;
|
|
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
|
QHash<int, QByteArray> roleNames() const override;
|
|
|
|
Q_INVOKABLE void removeDelegate(int row, int col);
|
|
Q_INVOKABLE void removeDelegate(int index);
|
|
Q_INVOKABLE bool canAddDelegate(int row, int column, FolioDelegate *delegate);
|
|
bool addDelegate(std::shared_ptr<FolioPageDelegate> delegate);
|
|
std::shared_ptr<FolioPageDelegate> getDelegate(int row, int col);
|
|
|
|
Q_INVOKABLE void moveAndResizeWidgetDelegate(FolioPageDelegate *delegate, int newRow, int newColumn, int newGridWidth, int newGridHeight);
|
|
|
|
bool isPageEmpty();
|
|
|
|
public Q_SLOTS:
|
|
void save();
|
|
|
|
Q_SIGNALS:
|
|
void saveRequested();
|
|
|
|
private:
|
|
void connectSaveRequests(std::shared_ptr<FolioDelegate> delegate);
|
|
|
|
HomeScreen *m_homeScreen{nullptr};
|
|
QList<std::shared_ptr<FolioPageDelegate>> m_delegates;
|
|
};
|