Mercurial > minori
annotate src/gui/pages/anime_list.cc @ 198:bc1ae1810855
dep/animia: switch from using classes to global functions
the old idea was ok, but sort of hackish; this method doesn't use classes
at all, and this way (especially important!) we can do wayland stuff AND x11
at the same time, which wasn't really possible without stupid workarounds in
the other method
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sun, 24 Dec 2023 02:59:42 -0500 |
parents | c4ca035c565d |
children | 7cf53145de11 |
rev | line source |
---|---|
10 | 1 /** |
2 * anime_list.cpp: defines the anime list page | |
3 * and widgets. | |
4 * | |
5 * much of this file is based around | |
6 * Qt's original QTabWidget implementation, because | |
7 * I needed a somewhat native way to create a tabbed | |
8 * widget with only one subwidget that worked exactly | |
9 * like a native tabbed widget. | |
10 **/ | |
11 #include "gui/pages/anime_list.h" | |
12 #include "core/anime.h" | |
13 #include "core/anime_db.h" | |
14 #include "core/session.h" | |
76 | 15 #include "core/strings.h" |
10 | 16 #include "core/time.h" |
17 #include "gui/dialog/information.h" | |
18 #include "gui/translate/anime.h" | |
52
0c4138de2ea7
anime list: we are finally read-write
Paper <mrpapersonic@gmail.com>
parents:
51
diff
changeset
|
19 #include "services/services.h" |
178
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
118
diff
changeset
|
20 |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
185
diff
changeset
|
21 #include <QDate> |
15 | 22 #include <QDebug> |
10 | 23 #include <QHBoxLayout> |
24 #include <QHeaderView> | |
25 #include <QMenu> | |
26 #include <QProgressBar> | |
27 #include <QShortcut> | |
86 | 28 #include <QTreeView> |
10 | 29 #include <QStylePainter> |
30 #include <QStyledItemDelegate> | |
77 | 31 #include <QThreadPool> |
178
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
118
diff
changeset
|
32 |
77 | 33 #include <set> |
10 | 34 |
64 | 35 AnimeListPageSortFilter::AnimeListPageSortFilter(QObject* parent) : QSortFilterProxyModel(parent) { |
10 | 36 } |
37 | |
64 | 38 bool AnimeListPageSortFilter::lessThan(const QModelIndex& l, const QModelIndex& r) const { |
10 | 39 QVariant left = sourceModel()->data(l, sortRole()); |
40 QVariant right = sourceModel()->data(r, sortRole()); | |
41 | |
42 switch (left.userType()) { | |
43 case QMetaType::Int: | |
44 case QMetaType::UInt: | |
45 case QMetaType::LongLong: | |
46 case QMetaType::ULongLong: return left.toInt() < right.toInt(); | |
47 case QMetaType::QDate: return left.toDate() < right.toDate(); | |
48 case QMetaType::QString: | |
49 default: return QString::compare(left.toString(), right.toString(), Qt::CaseInsensitive) < 0; | |
50 } | |
51 } | |
52 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
53 /* -------------------------------------------------- */ |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
54 |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
55 AnimeListPageModel::AnimeListPageModel(QObject* parent, Anime::ListStatus _status) : QAbstractListModel(parent) { |
10 | 56 status = _status; |
57 return; | |
58 } | |
59 | |
64 | 60 int AnimeListPageModel::rowCount(const QModelIndex& parent) const { |
10 | 61 return list.size(); |
62 (void)(parent); | |
63 } | |
64 | |
64 | 65 int AnimeListPageModel::columnCount(const QModelIndex& parent) const { |
10 | 66 return NB_COLUMNS; |
67 (void)(parent); | |
68 } | |
69 | |
64 | 70 QVariant AnimeListPageModel::headerData(const int section, const Qt::Orientation orientation, const int role) const { |
10 | 71 if (role == Qt::DisplayRole) { |
72 switch (section) { | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
73 case AL_TITLE: return tr("Anime title"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
74 case AL_PROGRESS: return tr("Progress"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
75 case AL_EPISODES: return tr("Episodes"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
76 case AL_TYPE: return tr("Type"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
77 case AL_SCORE: return tr("Score"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
78 case AL_SEASON: return tr("Season"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
79 case AL_STARTED: return tr("Date started"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
80 case AL_COMPLETED: return tr("Date completed"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
81 case AL_NOTES: return tr("Notes"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
82 case AL_AVG_SCORE: return tr("Average score"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
83 case AL_UPDATED: return tr("Last updated"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
84 default: return {}; |
10 | 85 } |
86 } else if (role == Qt::TextAlignmentRole) { | |
87 switch (section) { | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
88 case AL_TITLE: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
89 case AL_NOTES: return QVariant(Qt::AlignLeft | Qt::AlignVCenter); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
90 case AL_PROGRESS: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
91 case AL_EPISODES: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
92 case AL_TYPE: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
93 case AL_SCORE: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
94 case AL_AVG_SCORE: return QVariant(Qt::AlignCenter | Qt::AlignVCenter); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
95 case AL_SEASON: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
96 case AL_STARTED: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
97 case AL_COMPLETED: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
98 case AL_UPDATED: return QVariant(Qt::AlignRight | Qt::AlignVCenter); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
99 default: return QAbstractListModel::headerData(section, orientation, role); |
10 | 100 } |
101 } | |
102 return QAbstractListModel::headerData(section, orientation, role); | |
103 } | |
104 | |
64 | 105 QVariant AnimeListPageModel::data(const QModelIndex& index, int role) const { |
10 | 106 if (!index.isValid()) |
107 return QVariant(); | |
108 switch (role) { | |
109 case Qt::DisplayRole: | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
110 switch (index.column()) { |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
111 case AL_TITLE: return Strings::ToQString(list[index.row()].GetUserPreferredTitle()); |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
112 case AL_PROGRESS: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
113 return QString::number(list[index.row()].GetUserProgress()) + "/" + |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
114 QString::number(list[index.row()].GetEpisodes()); |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
115 case AL_EPISODES: return list[index.row()].GetEpisodes(); |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
116 case AL_SCORE: return Strings::ToQString(list[index.row()].GetUserPresentableScore()); |
65
26721c28bf22
*: avoid usage of (to|from)StdString
Paper <mrpapersonic@gmail.com>
parents:
64
diff
changeset
|
117 case AL_TYPE: return Strings::ToQString(Translate::ToString(list[index.row()].GetFormat())); |
197 | 118 case AL_SEASON: { |
198
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
119 std::optional<unsigned int> year = list[index.row()].GetAirDate().GetYear(); |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
120 if (!year) |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
121 return "Unknown Unknown"; |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
122 return Strings::ToQString(Translate::ToLocalString(list[index.row()].GetSeason()) + " " + std::to_string(year.value())); |
197 | 123 } |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
124 case AL_AVG_SCORE: return QString::number(list[index.row()].GetAudienceScore()) + "%"; |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
125 case AL_STARTED: return list[index.row()].GetUserDateStarted().GetAsQDate(); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
126 case AL_COMPLETED: return list[index.row()].GetUserDateCompleted().GetAsQDate(); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
127 case AL_UPDATED: { |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
128 if (list[index.row()].GetUserTimeUpdated() == 0) |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
129 return QString("-"); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
130 Time::Duration duration(Time::GetSystemTime() - list[index.row()].GetUserTimeUpdated()); |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
131 return Strings::ToQString(duration.AsRelativeString()); |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
132 } |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
133 case AL_NOTES: return Strings::ToQString(list[index.row()].GetUserNotes()); |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
134 default: return ""; |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
135 } |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
136 break; |
10 | 137 case Qt::UserRole: |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
138 switch (index.column()) { |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
139 case AL_PROGRESS: return list[index.row()].GetUserProgress(); |
185
62e336597bb7
anime list: add support for different score formats
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
140 case AL_SCORE: return list[index.row()].GetUserScore(); |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
141 case AL_TYPE: return static_cast<int>(list[index.row()].GetFormat()); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
142 case AL_SEASON: return list[index.row()].GetAirDate().GetAsQDate(); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
143 case AL_AVG_SCORE: return list[index.row()].GetAudienceScore(); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
144 case AL_UPDATED: return QVariant::fromValue(list[index.row()].GetUserTimeUpdated()); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
145 default: return data(index, Qt::DisplayRole); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
146 } |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
147 break; |
10 | 148 case Qt::TextAlignmentRole: |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
149 switch (index.column()) { |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
150 case AL_TITLE: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
151 case AL_NOTES: return QVariant(Qt::AlignLeft | Qt::AlignVCenter); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
152 case AL_PROGRESS: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
153 case AL_EPISODES: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
154 case AL_TYPE: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
155 case AL_SCORE: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
156 case AL_AVG_SCORE: return QVariant(Qt::AlignCenter | Qt::AlignVCenter); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
157 case AL_SEASON: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
158 case AL_STARTED: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
159 case AL_COMPLETED: |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
160 case AL_UPDATED: return QVariant(Qt::AlignRight | Qt::AlignVCenter); |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
161 default: break; |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
162 } |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
163 break; |
10 | 164 } |
165 return QVariant(); | |
166 } | |
167 | |
64 | 168 Anime::Anime* AnimeListPageModel::GetAnimeFromIndex(QModelIndex index) { |
10 | 169 return &list.at(index.row()); |
170 } | |
171 | |
64 | 172 void AnimeListPageModel::RefreshList() { |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
173 /* equivalent to hasChildren()... */ |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
174 if (!rowCount(index(0))) { |
77 | 175 beginInsertRows(QModelIndex(), 0, 0); |
176 endInsertRows(); | |
15 | 177 } |
178 | |
77 | 179 beginResetModel(); |
180 | |
10 | 181 list.clear(); |
182 | |
11 | 183 for (const auto& a : Anime::db.items) { |
184 if (a.second.IsInUserList() && a.second.GetUserStatus() == status) { | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
185 list.push_back(a.second); |
10 | 186 } |
187 } | |
15 | 188 |
77 | 189 endResetModel(); |
10 | 190 } |
191 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
192 /* ----------------------------------------------------------------- */ |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
193 |
64 | 194 int AnimeListPage::VisibleColumnsCount() const { |
10 | 195 int count = 0; |
196 | |
197 for (int i = 0, end = tree_view->header()->count(); i < end; i++) { | |
198 if (!tree_view->isColumnHidden(i)) | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
199 count++; |
10 | 200 } |
201 | |
202 return count; | |
203 } | |
204 | |
64 | 205 void AnimeListPage::SetColumnDefaults() { |
206 tree_view->setColumnHidden(AnimeListPageModel::AL_SEASON, false); | |
207 tree_view->setColumnHidden(AnimeListPageModel::AL_TYPE, false); | |
208 tree_view->setColumnHidden(AnimeListPageModel::AL_UPDATED, false); | |
209 tree_view->setColumnHidden(AnimeListPageModel::AL_PROGRESS, false); | |
210 tree_view->setColumnHidden(AnimeListPageModel::AL_SCORE, false); | |
211 tree_view->setColumnHidden(AnimeListPageModel::AL_TITLE, false); | |
212 tree_view->setColumnHidden(AnimeListPageModel::AL_EPISODES, true); | |
213 tree_view->setColumnHidden(AnimeListPageModel::AL_AVG_SCORE, true); | |
214 tree_view->setColumnHidden(AnimeListPageModel::AL_STARTED, true); | |
215 tree_view->setColumnHidden(AnimeListPageModel::AL_COMPLETED, true); | |
216 tree_view->setColumnHidden(AnimeListPageModel::AL_UPDATED, true); | |
217 tree_view->setColumnHidden(AnimeListPageModel::AL_NOTES, true); | |
10 | 218 } |
219 | |
77 | 220 void AnimeListPage::UpdateAnime(int id) { |
221 QThreadPool::globalInstance()->start([this, id] { | |
222 Services::UpdateAnimeEntry(id); | |
223 Refresh(); | |
224 }); | |
225 } | |
226 | |
227 void AnimeListPage::RemoveAnime(int id) { | |
228 Anime::Anime& anime = Anime::db.items[id]; | |
229 anime.RemoveFromUserList(); | |
230 Refresh(); | |
231 } | |
232 | |
64 | 233 void AnimeListPage::DisplayColumnHeaderMenu() { |
10 | 234 QMenu* menu = new QMenu(this); |
235 menu->setAttribute(Qt::WA_DeleteOnClose); | |
236 menu->setTitle(tr("Column visibility")); | |
237 menu->setToolTipsVisible(true); | |
238 | |
64 | 239 for (int i = 0; i < AnimeListPageModel::NB_COLUMNS; i++) { |
240 if (i == AnimeListPageModel::AL_TITLE) | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
241 continue; |
10 | 242 const auto column_name = |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
243 sort_models[tab_bar->currentIndex()]->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
244 |
10 | 245 QAction* action = menu->addAction(column_name, this, [this, i](const bool checked) { |
246 if (!checked && (VisibleColumnsCount() <= 1)) | |
247 return; | |
248 | |
249 tree_view->setColumnHidden(i, !checked); | |
250 | |
251 if (checked && (tree_view->columnWidth(i) <= 5)) | |
252 tree_view->resizeColumnToContents(i); | |
253 | |
254 // SaveSettings(); | |
255 }); | |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
256 |
10 | 257 action->setCheckable(true); |
258 action->setChecked(!tree_view->isColumnHidden(i)); | |
259 } | |
260 | |
261 menu->addSeparator(); | |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
262 menu->addAction(tr("Reset to defaults"), this, [this]() { |
10 | 263 for (int i = 0, count = tree_view->header()->count(); i < count; ++i) { |
264 SetColumnDefaults(); | |
265 } | |
266 // SaveSettings(); | |
267 }); | |
268 menu->popup(QCursor::pos()); | |
269 } | |
270 | |
64 | 271 void AnimeListPage::DisplayListMenu() { |
10 | 272 QMenu* menu = new QMenu(this); |
273 menu->setAttribute(Qt::WA_DeleteOnClose); | |
274 menu->setTitle(tr("Column visibility")); | |
275 menu->setToolTipsVisible(true); | |
276 | |
77 | 277 AnimeListPageModel* source_model = |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
278 reinterpret_cast<AnimeListPageModel*>(sort_models[tab_bar->currentIndex()]->sourceModel()); |
15 | 279 const QItemSelection selection = |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
280 sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection()); |
77 | 281 |
282 std::set<Anime::Anime*> animes; | |
283 for (const auto& index : selection.indexes()) { | |
284 if (!index.isValid()) | |
285 continue; | |
286 Anime::Anime* anime = source_model->GetAnimeFromIndex(index); | |
287 if (anime) | |
288 animes.insert(anime); | |
10 | 289 } |
290 | |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
291 menu->addAction(tr("Information"), [this, animes] { |
77 | 292 for (auto& anime : animes) { |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
293 InformationDialog* dialog = new InformationDialog(*anime, [this, anime] { |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
294 UpdateAnime(anime->GetId()); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
295 }, InformationDialog::PAGE_MAIN_INFO, this); |
10 | 296 |
77 | 297 dialog->show(); |
298 dialog->raise(); | |
299 dialog->activateWindow(); | |
300 } | |
301 }); | |
302 menu->addSeparator(); | |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
303 menu->addAction(tr("Edit"), [this, animes] { |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
304 for (auto& anime : animes) { |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
305 InformationDialog* dialog = new InformationDialog(*anime, [this, anime] { |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
306 UpdateAnime(anime->GetId()); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
307 }, InformationDialog::PAGE_MY_LIST, this); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
308 |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
309 dialog->show(); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
310 dialog->raise(); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
311 dialog->activateWindow(); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
312 } |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
313 }); |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
314 menu->addAction(tr("Delete from list..."), [this, animes] { |
77 | 315 for (auto& anime : animes) { |
316 RemoveAnime(anime->GetId()); | |
317 } | |
10 | 318 }); |
319 menu->popup(QCursor::pos()); | |
320 } | |
321 | |
64 | 322 void AnimeListPage::ItemDoubleClicked() { |
10 | 323 /* throw out any other garbage */ |
324 const QItemSelection selection = | |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
325 sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection()); |
10 | 326 if (!selection.indexes().first().isValid()) { |
327 return; | |
328 } | |
329 | |
64 | 330 AnimeListPageModel* source_model = |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
331 reinterpret_cast<AnimeListPageModel*>(sort_models[tab_bar->currentIndex()]->sourceModel()); |
64 | 332 |
333 const QModelIndex index = source_model->index(selection.indexes().first().row()); | |
334 Anime::Anime* anime = source_model->GetAnimeFromIndex(index); | |
10 | 335 |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
336 InformationDialog* dialog = new InformationDialog(*anime, [this, anime] { |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
337 UpdateAnime(anime->GetId()); |
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
338 }, InformationDialog::PAGE_MAIN_INFO, this); |
10 | 339 |
340 dialog->show(); | |
341 dialog->raise(); | |
342 dialog->activateWindow(); | |
343 } | |
344 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
345 void AnimeListPage::RefreshList() { |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
346 for (unsigned int i = 0; i < sort_models.size(); i++) |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
347 reinterpret_cast<AnimeListPageModel*>(sort_models[i]->sourceModel())->RefreshList(); |
10 | 348 } |
349 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
350 void AnimeListPage::RefreshTabs() { |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
351 for (unsigned int i = 0; i < sort_models.size(); i++) |
178
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
118
diff
changeset
|
352 tab_bar->setTabText(i, Strings::ToQString(Translate::ToString(Anime::ListStatuses[i]) + " (" + |
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
118
diff
changeset
|
353 std::to_string(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")")); |
10 | 354 } |
355 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
356 void AnimeListPage::Refresh() { |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
357 RefreshList(); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
358 RefreshTabs(); |
10 | 359 } |
360 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
361 /* -------- QTabWidget replication begin --------- */ |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
362 |
64 | 363 void AnimeListPage::InitBasicStyle(QStyleOptionTabWidgetFrame* option) const { |
10 | 364 if (!option) |
365 return; | |
366 | |
367 option->initFrom(this); | |
368 option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, nullptr, this); | |
369 option->shape = QTabBar::RoundedNorth; | |
370 option->tabBarRect = tab_bar->geometry(); | |
371 } | |
372 | |
64 | 373 void AnimeListPage::InitStyle(QStyleOptionTabWidgetFrame* option) const { |
10 | 374 if (!option) |
375 return; | |
376 | |
377 InitBasicStyle(option); | |
378 | |
379 QSize t(0, tree_view->frameWidth()); | |
380 if (tab_bar->isVisibleTo(this)) { | |
381 t = tab_bar->sizeHint(); | |
382 t.setWidth(width()); | |
383 } | |
46 | 384 |
10 | 385 option->tabBarSize = t; |
386 | |
387 QRect selected_tab_rect = tab_bar->tabRect(tab_bar->currentIndex()); | |
388 selected_tab_rect.moveTopLeft(selected_tab_rect.topLeft() + option->tabBarRect.topLeft()); | |
389 option->selectedTabRect = selected_tab_rect; | |
390 | |
391 option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, nullptr, this); | |
392 } | |
393 | |
64 | 394 void AnimeListPage::SetupLayout() { |
10 | 395 QStyleOptionTabWidgetFrame option; |
396 InitStyle(&option); | |
397 | |
398 QRect tabRect = style()->subElementRect(QStyle::SE_TabWidgetTabBar, &option, this); | |
399 tabRect.setLeft(tabRect.left() + 1); | |
400 panelRect = style()->subElementRect(QStyle::SE_TabWidgetTabPane, &option, this); | |
401 QRect contentsRect = style()->subElementRect(QStyle::SE_TabWidgetTabContents, &option, this); | |
402 | |
403 tab_bar->setGeometry(tabRect); | |
404 tree_view->parentWidget()->setGeometry(contentsRect); | |
405 } | |
406 | |
114
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
407 void AnimeListPage::paintEvent(QPaintEvent*) { |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
408 QStylePainter p(this); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
409 |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
410 QStyleOptionTabWidgetFrame opt; |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
411 InitStyle(&opt); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
412 opt.rect = panelRect; |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
413 p.drawPrimitive(QStyle::PE_FrameTabWidget, opt); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
414 } |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
415 |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
416 void AnimeListPage::resizeEvent(QResizeEvent* e) { |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
417 QWidget::resizeEvent(e); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
418 SetupLayout(); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
419 } |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
420 |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
421 void AnimeListPage::showEvent(QShowEvent*) { |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
422 SetupLayout(); |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
423 } |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
424 |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
425 /* --------- QTabWidget replication end ---------- */ |
ab191e28e69d
*: add initial torrent stuff
Paper <mrpapersonic@gmail.com>
parents:
112
diff
changeset
|
426 |
64 | 427 AnimeListPage::AnimeListPage(QWidget* parent) : QWidget(parent) { |
10 | 428 /* Tab bar */ |
429 tab_bar = new QTabBar(this); | |
430 tab_bar->setExpanding(false); | |
431 tab_bar->setDrawBase(false); | |
432 | |
433 /* Tree view... */ | |
434 QWidget* tree_widget = new QWidget(this); | |
435 tree_view = new QTreeView(tree_widget); | |
436 tree_view->setUniformRowHeights(true); | |
437 tree_view->setAllColumnsShowFocus(false); | |
438 tree_view->setAlternatingRowColors(true); | |
439 tree_view->setSortingEnabled(true); | |
440 tree_view->setSelectionMode(QAbstractItemView::ExtendedSelection); | |
441 tree_view->setItemsExpandable(false); | |
442 tree_view->setRootIsDecorated(false); | |
443 tree_view->setContextMenuPolicy(Qt::CustomContextMenu); | |
444 tree_view->setFrameShape(QFrame::NoFrame); | |
445 | |
83 | 446 for (unsigned int i = 0; i < sort_models.size(); i++) { |
65
26721c28bf22
*: avoid usage of (to|from)StdString
Paper <mrpapersonic@gmail.com>
parents:
64
diff
changeset
|
447 tab_bar->addTab(Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])) + " (" + |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
448 QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")"); |
64 | 449 sort_models[i] = new AnimeListPageSortFilter(tree_view); |
450 sort_models[i]->setSourceModel(new AnimeListPageModel(this, Anime::ListStatuses[i])); | |
10 | 451 sort_models[i]->setSortRole(Qt::UserRole); |
452 sort_models[i]->setSortCaseSensitivity(Qt::CaseInsensitive); | |
453 } | |
15 | 454 tree_view->setModel(sort_models[0]); |
10 | 455 |
68
2417121d894e
*: normalize usage of layouts
Paper <mrpapersonic@gmail.com>
parents:
65
diff
changeset
|
456 QHBoxLayout* layout = new QHBoxLayout(tree_widget); |
10 | 457 layout->addWidget(tree_view); |
62 | 458 layout->setContentsMargins(0, 0, 0, 0); |
10 | 459 |
460 /* Double click stuff */ | |
64 | 461 connect(tree_view, &QAbstractItemView::doubleClicked, this, &AnimeListPage::ItemDoubleClicked); |
462 connect(tree_view, &QWidget::customContextMenuRequested, this, &AnimeListPage::DisplayListMenu); | |
10 | 463 |
464 /* Enter & return keys */ | |
15 | 465 connect(new QShortcut(Qt::Key_Return, tree_view, nullptr, nullptr, Qt::WidgetShortcut), &QShortcut::activated, this, |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
466 &AnimeListPage::ItemDoubleClicked); |
10 | 467 |
15 | 468 connect(new QShortcut(Qt::Key_Enter, tree_view, nullptr, nullptr, Qt::WidgetShortcut), &QShortcut::activated, this, |
118
39521c47c7a3
*: another huge megacommit, SORRY
Paper <mrpapersonic@gmail.com>
parents:
114
diff
changeset
|
469 &AnimeListPage::ItemDoubleClicked); |
10 | 470 |
471 tree_view->header()->setStretchLastSection(false); | |
472 tree_view->header()->setContextMenuPolicy(Qt::CustomContextMenu); | |
64 | 473 connect(tree_view->header(), &QWidget::customContextMenuRequested, this, &AnimeListPage::DisplayColumnHeaderMenu); |
10 | 474 |
475 connect(tab_bar, &QTabBar::currentChanged, this, [this](int index) { | |
476 if (sort_models[index]) | |
477 tree_view->setModel(sort_models[index]); | |
478 }); | |
479 | |
69 | 480 SetColumnDefaults(); |
10 | 481 setFocusPolicy(Qt::TabFocus); |
482 setFocusProxy(tab_bar); | |
112
80f49f623d30
locale: allow switching locales without restarting
Paper <mrpapersonic@gmail.com>
parents:
108
diff
changeset
|
483 |
80f49f623d30
locale: allow switching locales without restarting
Paper <mrpapersonic@gmail.com>
parents:
108
diff
changeset
|
484 Refresh(); |
10 | 485 } |
486 | |
487 #include "gui/pages/moc_anime_list.cpp" |