1 
2 /*
3  * SPDX-FileCopyrightText: 2021 Michail Vourlakos <mvourlakos@gmail.com>
4  *
5  * This file is part of Latte-Dock
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  */
10 
11 #ifndef VIEWSMODEL_H
12 #define VIEWSMODEL_H
13 
14 // local
15 #include "../../lattecorona.h"
16 #include "../../data/genericbasictable.h"
17 #include "../../data/screendata.h"
18 #include "../../data/viewdata.h"
19 #include "../../data/viewstable.h"
20 #include "../../layout/centrallayout.h"
21 
22 // Qt
23 #include <QAbstractTableModel>
24 #include <QModelIndex>
25 
26 namespace Latte {
27 namespace Settings {
28 namespace Model {
29 
30 class Views : public QAbstractTableModel
31 {
32     Q_OBJECT
33 
34 public:
35     enum Columns
36     {
37         IDCOLUMN = 0,
38         NAMECOLUMN,
39         SCREENCOLUMN,
40         EDGECOLUMN,
41         ALIGNMENTCOLUMN,
42         SUBCONTAINMENTSCOLUMN,
43         LASTCOLUMN
44     };
45 
46     enum Roles
47     {
48         IDROLE = Qt::UserRole + 1,
49         NAMEROLE,
50         ISACTIVEROLE,
51         ISCHANGEDROLE,
52         HASCHANGEDVIEWROLE,
53         CHOICESROLE,
54         SCREENROLE,
55         VIEWROLE,
56         ISMOVEORIGINROLE,
57         ERRORSROLE,
58         WARNINGSROLE,
59         SORTINGROLE
60     };
61 
62     enum SortingPriority
63     {
64         NORMALPRIORITY = 10,
65         MEDIUMPRIORITY = 100,
66         HIGHPRIORITY = 1000,
67         HIGHESTPRIORITY = 10000
68     };
69 
70     explicit Views(QObject *parent, Latte::Corona *corona);
71     ~Views();
72 
73     bool hasChangedData() const;
74     bool containsCurrentName(const QString &name) const;
75 
76     //! all original data will become also current
77     void resetData();
78 
79     void appendTemporaryView(const Latte::Data::View &view);
80     void removeView(const QString &id);
81 
82     int rowCount() const;
83     static int columnCount();
84     int rowCount(const QModelIndex &parent) const override;
85     int columnCount(const QModelIndex &parent) const override;
86 
87     QVariant data(const QModelIndex &index, int role) const override;
88     QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
89     Qt::ItemFlags flags(const QModelIndex &index) const override;
90     bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
91     bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
92 
93     int rowForId(const QString &id) const;
94 
95     QString viewForSubContainment(const QString &sid);
96 
97     const Latte::Data::View &at(const int &row);
98     const Latte::Data::View currentData(const QString &id);
99     const Latte::Data::View originalData(const QString &id);
100 
101     const Latte::Data::ViewsTable &currentViewsData();
102     const Latte::Data::ViewsTable &originalViewsData();
103 
104     void setOriginalData(Latte::Data::ViewsTable &data);
105     void setOriginalView(QString currentViewId, Latte::Data::View &view);
106     void updateCurrentView(QString currentViewId, Latte::Data::View &view);
107     void clearErrorsAndWarnings();
108 
109     void updateActiveStatesBasedOn(const CentralLayout *layout);
110 
111     Latte::Data::ViewsTable alteredViews() const;
112     Latte::Data::ViewsTable newViews() const;
113 
114 signals:
115     void rowsInserted();
116     void rowsRemoved();
117 
118 private slots:
119     void clear();
120 
121     void initEdges();
122     void initAlignments();
123     void populateScreens();
124 
125 private:
126     Data::ViewsTable edgesChoices(const Data::View &view) const;
127     Data::ViewsTable horizontalAlignmentChoices(const Data::View &view) const;
128     Data::ViewsTable verticalAlignmentChoices(const Data::View &view) const;
129 
130     bool isVertical(const Plasma::Types::Location &location) const;
131 
132     int sortingFactorForState(const Data::View &view) const;
133     int sortingFactorForScreen(const Data::View &view) const;
134     int sortingFactorForEdge(const Data::View &view) const;
135     int sortingFactorForAlignment(const Data::View &view) const;
136     int sortingFactorForSubContainments(const Data::View &view) const;
137 
138     //! based on priority a sortable text is returned
139     QString sortableText(const int &priority, const QString &text) const;
140 
141     Latte::Data::Screen screenData(const QString &viewId) const;
142 
143 private:
144     Latte::Data::ViewsTable m_viewsTable;
145     Latte::Data::ViewsTable o_viewsTable;
146 
147     Latte::Corona *m_corona{nullptr};
148 
149     Data::ViewsTable s_edges;
150     Data::ViewsTable s_horizontalAlignments;
151     Data::ViewsTable s_verticalAlignments;
152     Latte::Data::ScreensTable s_screens;
153 };
154 
155 }
156 }
157 }
158 
159 #endif
160