annotate src/gui/pages/anime_list.cc @ 101:c537996cf67b

*: multitude of config changes 1. theme is now configurable from the settings menu (but you have to restart for it to apply) 2. config is now stored in an INI file, with no method of conversion from json (this repo is private-ish anyway)
author Paper <mrpapersonic@gmail.com>
date Fri, 03 Nov 2023 14:06:02 -0400
parents c912128af0eb
children b315f3759c56
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
1 /**
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
2 * anime_list.cpp: defines the anime list page
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
3 * and widgets.
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
4 *
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
5 * much of this file is based around
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
6 * Qt's original QTabWidget implementation, because
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
7 * I needed a somewhat native way to create a tabbed
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
8 * widget with only one subwidget that worked exactly
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
9 * like a native tabbed widget.
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
10 **/
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
11 #include "gui/pages/anime_list.h"
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
12 #include "core/anime.h"
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
13 #include "core/anime_db.h"
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
14 #include "core/session.h"
76
3364fadc8a36 *: format source code
Paper <mrpapersonic@gmail.com>
parents: 69
diff changeset
15 #include "core/strings.h"
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
16 #include "core/time.h"
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
17 #include "gui/dialog/information.h"
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
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"
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
20 #include <QDebug>
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
21 #include <QHBoxLayout>
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
22 #include <QHeaderView>
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
23 #include <QMenu>
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
24 #include <QProgressBar>
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
25 #include <QShortcut>
86
c912128af0eb *: various macos fixes
Paper <mrpapersonic@gmail.com>
parents: 83
diff changeset
26 #include <QTreeView>
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
27 #include <QStylePainter>
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
28 #include <QStyledItemDelegate>
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
29 #include <QThreadPool>
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
30 #include <set>
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
31
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
32 AnimeListPageDelegate::AnimeListPageDelegate(QObject* parent) : QStyledItemDelegate(parent) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
33 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
34
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
35 QWidget* AnimeListPageDelegate::createEditor(QWidget*, const QStyleOptionViewItem&, const QModelIndex&) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
36 // no edit 4 u
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
37 return nullptr;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
38 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
39
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
40 void AnimeListPageDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
41 const QModelIndex& index) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
42 switch (index.column()) {
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
43 #if 0
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
44 case AnimeListPageModel::AL_PROGRESS: {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
45 const int progress = static_cast<int>(index.data(Qt::UserRole).toReal());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
46 const int episodes =
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
47 static_cast<int>(index.siblingAtColumn(AnimeListPageModel::AL_EPISODES).data(Qt::UserRole).toReal());
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
48
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
49 int text_width = 59;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
50 QRectF text_rect(option.rect.x() + text_width, option.rect.y(), text_width, option.decorationSize.height());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
51 painter->save();
51
75c804f713b2 window: add about window,
Paper <mrpapersonic@gmail.com>
parents: 47
diff changeset
52 painter->drawText(text_rect, tr("/"), QTextOption(Qt::AlignCenter | Qt::AlignVCenter));
75c804f713b2 window: add about window,
Paper <mrpapersonic@gmail.com>
parents: 47
diff changeset
53 drawText(const QRectF &rectangle, const QString &text, const QTextOption &option =
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
54 QTextOption()) painter->drawText(QRectF(text_rect.x(), text_rect.y(), text_width / 2 - 2,
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
55 text_rect.height()), QString::number(progress), QTextOption(Qt::AlignRight | Qt::AlignVCenter));
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
56 painter->drawText(
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
57 QRectF(text_rect.x() + text_width / 2 + 2, text_rect.y(), text_width / 2 - 2, text_rect.height()),
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
58 QString::number(episodes), QTextOption(Qt::AlignLeft | Qt::AlignVCenter));
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
59 painter->restore();
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
60 QStyledItemDelegate::paint(painter, option, index);
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
61 break;
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
62 }
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
63 #endif
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
64 default: QStyledItemDelegate::paint(painter, option, index); break;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
65 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
66 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
67
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
68 AnimeListPageSortFilter::AnimeListPageSortFilter(QObject* parent) : QSortFilterProxyModel(parent) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
69 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
70
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
71 bool AnimeListPageSortFilter::lessThan(const QModelIndex& l, const QModelIndex& r) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
72 QVariant left = sourceModel()->data(l, sortRole());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
73 QVariant right = sourceModel()->data(r, sortRole());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
74
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
75 switch (left.userType()) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
76 case QMetaType::Int:
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
77 case QMetaType::UInt:
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
78 case QMetaType::LongLong:
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
79 case QMetaType::ULongLong: return left.toInt() < right.toInt();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
80 case QMetaType::QDate: return left.toDate() < right.toDate();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
81 case QMetaType::QString:
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
82 default: return QString::compare(left.toString(), right.toString(), Qt::CaseInsensitive) < 0;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
83 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
84 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
85
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
86 AnimeListPageModel::AnimeListPageModel(QWidget* parent, Anime::ListStatus _status) : QAbstractListModel(parent) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
87 status = _status;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
88 return;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
89 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
90
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
91 int AnimeListPageModel::rowCount(const QModelIndex& parent) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
92 return list.size();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
93 (void)(parent);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
94 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
95
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
96 int AnimeListPageModel::columnCount(const QModelIndex& parent) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
97 return NB_COLUMNS;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
98 (void)(parent);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
99 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
100
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
101 QVariant AnimeListPageModel::headerData(const int section, const Qt::Orientation orientation, const int role) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
102 if (role == Qt::DisplayRole) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
103 switch (section) {
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
104 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
105 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
106 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
107 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
108 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
109 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
110 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
111 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
112 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
113 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
114 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
115 default: return {};
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
116 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
117 } else if (role == Qt::TextAlignmentRole) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
118 switch (section) {
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
119 case AL_TITLE:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
120 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
121 case AL_PROGRESS:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
122 case AL_EPISODES:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
123 case AL_TYPE:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
124 case AL_SCORE:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
125 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
126 case AL_SEASON:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
127 case AL_STARTED:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
128 case AL_COMPLETED:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
129 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
130 default: return QAbstractListModel::headerData(section, orientation, role);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
131 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
132 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
133 return QAbstractListModel::headerData(section, orientation, role);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
134 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
135
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
136 QVariant AnimeListPageModel::data(const QModelIndex& index, int role) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
137 if (!index.isValid())
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
138 return QVariant();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
139 switch (role) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
140 case Qt::DisplayRole:
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
141 switch (index.column()) {
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
142 case AL_TITLE: return QString::fromUtf8(list[index.row()].GetUserPreferredTitle().c_str());
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
143 case AL_PROGRESS:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
144 return QString::number(list[index.row()].GetUserProgress()) + "/" +
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
145 QString::number(list[index.row()].GetEpisodes());
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
146 case AL_EPISODES: return list[index.row()].GetEpisodes();
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
147 case AL_SCORE: return list[index.row()].GetUserScore();
65
26721c28bf22 *: avoid usage of (to|from)StdString
Paper <mrpapersonic@gmail.com>
parents: 64
diff changeset
148 case AL_TYPE: return Strings::ToQString(Translate::ToString(list[index.row()].GetFormat()));
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
149 case AL_SEASON:
65
26721c28bf22 *: avoid usage of (to|from)StdString
Paper <mrpapersonic@gmail.com>
parents: 64
diff changeset
150 return Strings::ToQString(Translate::ToString(list[index.row()].GetSeason())) + " " +
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
151 QString::number(list[index.row()].GetAirDate().GetYear());
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
152 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
153 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
154 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
155 case AL_UPDATED: {
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
156 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
157 return QString("-");
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
158 Time::Duration duration(Time::GetSystemTime() - list[index.row()].GetUserTimeUpdated());
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
159 return QString::fromUtf8(duration.AsRelativeString().c_str());
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
160 }
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
161 case AL_NOTES: return QString::fromUtf8(list[index.row()].GetUserNotes().c_str());
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
162 default: return "";
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
163 }
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
164 break;
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
165 case Qt::UserRole:
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
166 switch (index.column()) {
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
167 case AL_PROGRESS: return list[index.row()].GetUserProgress();
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
168 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
169 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
170 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
171 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
172 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
173 }
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
174 break;
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
175 case Qt::TextAlignmentRole:
47
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
176 switch (index.column()) {
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
177 case AL_TITLE:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
178 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
179 case AL_PROGRESS:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
180 case AL_EPISODES:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
181 case AL_TYPE:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
182 case AL_SCORE:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
183 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
184 case AL_SEASON:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
185 case AL_STARTED:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
186 case AL_COMPLETED:
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
187 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
188 default: break;
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
189 }
d8eb763e6661 information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents: 46
diff changeset
190 break;
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
191 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
192 return QVariant();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
193 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
194
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
195 Anime::Anime* AnimeListPageModel::GetAnimeFromIndex(QModelIndex index) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
196 return &list.at(index.row());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
197 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
198
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
199 void AnimeListPageModel::RefreshList() {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
200 bool has_children = !!rowCount(index(0));
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
201 if (!has_children) {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
202 beginInsertRows(QModelIndex(), 0, 0);
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
203 endInsertRows();
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
204 }
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
205
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
206 beginResetModel();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
207
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
208 list.clear();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
209
11
fc1bf97c528b *: use C++11 standard
Paper <mrpapersonic@gmail.com>
parents: 10
diff changeset
210 for (const auto& a : Anime::db.items) {
fc1bf97c528b *: use C++11 standard
Paper <mrpapersonic@gmail.com>
parents: 10
diff changeset
211 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
212 list.push_back(a.second);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
213 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
214 }
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
215
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
216 endResetModel();
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
217 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
218
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
219 int AnimeListPage::VisibleColumnsCount() const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
220 int count = 0;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
221
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
222 for (int i = 0, end = tree_view->header()->count(); i < end; i++) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
223 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
224 count++;
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
225 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
226
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
227 return count;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
228 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
229
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
230 void AnimeListPage::SetColumnDefaults() {
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
231 tree_view->setColumnHidden(AnimeListPageModel::AL_SEASON, false);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
232 tree_view->setColumnHidden(AnimeListPageModel::AL_TYPE, false);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
233 tree_view->setColumnHidden(AnimeListPageModel::AL_UPDATED, false);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
234 tree_view->setColumnHidden(AnimeListPageModel::AL_PROGRESS, false);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
235 tree_view->setColumnHidden(AnimeListPageModel::AL_SCORE, false);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
236 tree_view->setColumnHidden(AnimeListPageModel::AL_TITLE, false);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
237 tree_view->setColumnHidden(AnimeListPageModel::AL_EPISODES, true);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
238 tree_view->setColumnHidden(AnimeListPageModel::AL_AVG_SCORE, true);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
239 tree_view->setColumnHidden(AnimeListPageModel::AL_STARTED, true);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
240 tree_view->setColumnHidden(AnimeListPageModel::AL_COMPLETED, true);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
241 tree_view->setColumnHidden(AnimeListPageModel::AL_UPDATED, true);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
242 tree_view->setColumnHidden(AnimeListPageModel::AL_NOTES, true);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
243 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
244
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
245 void AnimeListPage::UpdateAnime(int id) {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
246 QThreadPool::globalInstance()->start([this, id] {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
247 Services::UpdateAnimeEntry(id);
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
248 Refresh();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
249 });
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
250 }
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
251
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
252 void AnimeListPage::RemoveAnime(int id) {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
253 Anime::Anime& anime = Anime::db.items[id];
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
254 anime.RemoveFromUserList();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
255 Refresh();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
256 }
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
257
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
258 void AnimeListPage::DisplayColumnHeaderMenu() {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
259 QMenu* menu = new QMenu(this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
260 menu->setAttribute(Qt::WA_DeleteOnClose);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
261 menu->setTitle(tr("Column visibility"));
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
262 menu->setToolTipsVisible(true);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
263
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
264 for (int i = 0; i < AnimeListPageModel::NB_COLUMNS; i++) {
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
265 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
266 continue;
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
267 const auto column_name =
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
268 sort_models[tab_bar->currentIndex()]->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
269 QAction* action = menu->addAction(column_name, this, [this, i](const bool checked) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
270 if (!checked && (VisibleColumnsCount() <= 1))
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
271 return;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
272
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
273 tree_view->setColumnHidden(i, !checked);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
274
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
275 if (checked && (tree_view->columnWidth(i) <= 5))
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
276 tree_view->resizeColumnToContents(i);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
277
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
278 // SaveSettings();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
279 });
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
280 action->setCheckable(true);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
281 action->setChecked(!tree_view->isColumnHidden(i));
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
282 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
283
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
284 menu->addSeparator();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
285 QAction* resetAction = menu->addAction(tr("Reset to defaults"), this, [this]() {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
286 for (int i = 0, count = tree_view->header()->count(); i < count; ++i) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
287 SetColumnDefaults();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
288 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
289 // SaveSettings();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
290 });
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
291 menu->popup(QCursor::pos());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
292 (void)(resetAction);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
293 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
294
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
295 void AnimeListPage::DisplayListMenu() {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
296 QMenu* menu = new QMenu(this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
297 menu->setAttribute(Qt::WA_DeleteOnClose);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
298 menu->setTitle(tr("Column visibility"));
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
299 menu->setToolTipsVisible(true);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
300
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
301 AnimeListPageModel* source_model =
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
302 reinterpret_cast<AnimeListPageModel*>(sort_models[tab_bar->currentIndex()]->sourceModel());
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
303 const QItemSelection selection =
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
304 sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection());
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
305
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
306 std::set<Anime::Anime*> animes;
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
307 for (const auto& index : selection.indexes()) {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
308 if (!index.isValid())
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
309 continue;
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
310 Anime::Anime* anime = source_model->GetAnimeFromIndex(index);
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
311 if (anime)
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
312 animes.insert(anime);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
313 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
314
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
315 QAction* action = menu->addAction(tr("Information"), [this, animes] {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
316 for (auto& anime : animes) {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
317 InformationDialog* dialog = new InformationDialog(
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
318 *anime, [this, anime] { UpdateAnime(anime->GetId()); }, this);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
319
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
320 dialog->show();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
321 dialog->raise();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
322 dialog->activateWindow();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
323 }
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
324 });
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
325 menu->addSeparator();
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
326 action = menu->addAction(tr("Delete from list..."), [this, animes] {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
327 for (auto& anime : animes) {
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
328 RemoveAnime(anime->GetId());
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
329 }
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
330 });
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
331 menu->popup(QCursor::pos());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
332 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
333
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
334 void AnimeListPage::ItemDoubleClicked() {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
335 /* throw out any other garbage */
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
336 const QItemSelection selection =
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
337 sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection());
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
338 if (!selection.indexes().first().isValid()) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
339 return;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
340 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
341
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
342 AnimeListPageModel* source_model =
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
343 reinterpret_cast<AnimeListPageModel*>(sort_models[tab_bar->currentIndex()]->sourceModel());
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
344
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
345 const QModelIndex index = source_model->index(selection.indexes().first().row());
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
346 Anime::Anime* anime = source_model->GetAnimeFromIndex(index);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
347
63
3d2decf093bb *: fix many clang warnings
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
348 InformationDialog* dialog = new InformationDialog(
77
6f7385bd334c *: update
Paper <mrpapersonic@gmail.com>
parents: 76
diff changeset
349 *anime, [this, anime] { UpdateAnime(anime->GetId()); }, this);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
350
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
351 dialog->show();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
352 dialog->raise();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
353 dialog->activateWindow();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
354 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
355
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
356 void AnimeListPage::paintEvent(QPaintEvent*) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
357 QStylePainter p(this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
358
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
359 QStyleOptionTabWidgetFrame opt;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
360 InitStyle(&opt);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
361 opt.rect = panelRect;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
362 p.drawPrimitive(QStyle::PE_FrameTabWidget, opt);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
363 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
364
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
365 void AnimeListPage::resizeEvent(QResizeEvent* e) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
366 QWidget::resizeEvent(e);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
367 SetupLayout();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
368 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
369
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
370 void AnimeListPage::showEvent(QShowEvent*) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
371 SetupLayout();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
372 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
373
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
374 void AnimeListPage::InitBasicStyle(QStyleOptionTabWidgetFrame* option) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
375 if (!option)
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
376 return;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
377
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
378 option->initFrom(this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
379 option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, nullptr, this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
380 option->shape = QTabBar::RoundedNorth;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
381 option->tabBarRect = tab_bar->geometry();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
382 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
383
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
384 void AnimeListPage::InitStyle(QStyleOptionTabWidgetFrame* option) const {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
385 if (!option)
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
386 return;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
387
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
388 InitBasicStyle(option);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
389
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
390 // int exth = style()->pixelMetric(QStyle::PM_TabBarBaseHeight, nullptr, this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
391 QSize t(0, tree_view->frameWidth());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
392 if (tab_bar->isVisibleTo(this)) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
393 t = tab_bar->sizeHint();
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
394 t.setWidth(width());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
395 }
46
d0adc4aedfc8 *: update...
Paper <mrpapersonic@gmail.com>
parents: 19
diff changeset
396
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
397 option->tabBarSize = t;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
398
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
399 QRect selected_tab_rect = tab_bar->tabRect(tab_bar->currentIndex());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
400 selected_tab_rect.moveTopLeft(selected_tab_rect.topLeft() + option->tabBarRect.topLeft());
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
401 option->selectedTabRect = selected_tab_rect;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
402
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
403 option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, nullptr, this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
404 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
405
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
406 void AnimeListPage::SetupLayout() {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
407 QStyleOptionTabWidgetFrame option;
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
408 InitStyle(&option);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
409
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
410 QRect tabRect = style()->subElementRect(QStyle::SE_TabWidgetTabBar, &option, this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
411 tabRect.setLeft(tabRect.left() + 1);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
412 panelRect = style()->subElementRect(QStyle::SE_TabWidgetTabPane, &option, this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
413 QRect contentsRect = style()->subElementRect(QStyle::SE_TabWidgetTabContents, &option, this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
414
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
415 tab_bar->setGeometry(tabRect);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
416 tree_view->parentWidget()->setGeometry(contentsRect);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
417 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
418
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
419 AnimeListPage::AnimeListPage(QWidget* parent) : QWidget(parent) {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
420 /* Tab bar */
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
421 tab_bar = new QTabBar(this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
422 tab_bar->setExpanding(false);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
423 tab_bar->setDrawBase(false);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
424
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
425 /* Tree view... */
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
426 QWidget* tree_widget = new QWidget(this);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
427 tree_view = new QTreeView(tree_widget);
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
428 tree_view->setItemDelegate(new AnimeListPageDelegate(tree_view));
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
429 tree_view->setUniformRowHeights(true);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
430 tree_view->setAllColumnsShowFocus(false);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
431 tree_view->setAlternatingRowColors(true);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
432 tree_view->setSortingEnabled(true);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
433 tree_view->setSelectionMode(QAbstractItemView::ExtendedSelection);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
434 tree_view->setItemsExpandable(false);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
435 tree_view->setRootIsDecorated(false);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
436 tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
437 tree_view->setFrameShape(QFrame::NoFrame);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
438
83
d02fdf1d6708 *: huuuge update
Paper <mrpapersonic@gmail.com>
parents: 81
diff changeset
439 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
440 tab_bar->addTab(Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])) + " (" +
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
441 QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")");
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
442 sort_models[i] = new AnimeListPageSortFilter(tree_view);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
443 sort_models[i]->setSourceModel(new AnimeListPageModel(this, Anime::ListStatuses[i]));
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
444 sort_models[i]->setSortRole(Qt::UserRole);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
445 sort_models[i]->setSortCaseSensitivity(Qt::CaseInsensitive);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
446 }
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
447 tree_view->setModel(sort_models[0]);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
448
68
2417121d894e *: normalize usage of layouts
Paper <mrpapersonic@gmail.com>
parents: 65
diff changeset
449 QHBoxLayout* layout = new QHBoxLayout(tree_widget);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
450 layout->addWidget(tree_view);
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 52
diff changeset
451 layout->setContentsMargins(0, 0, 0, 0);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
452
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
453 /* Double click stuff */
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
454 connect(tree_view, &QAbstractItemView::doubleClicked, this, &AnimeListPage::ItemDoubleClicked);
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
455 connect(tree_view, &QWidget::customContextMenuRequested, this, &AnimeListPage::DisplayListMenu);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
456
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
457 /* Enter & return keys */
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
458 connect(new QShortcut(Qt::Key_Return, tree_view, nullptr, nullptr, Qt::WidgetShortcut), &QShortcut::activated, this,
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
459 &AnimeListPage::ItemDoubleClicked);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
460
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
461 connect(new QShortcut(Qt::Key_Enter, tree_view, nullptr, nullptr, Qt::WidgetShortcut), &QShortcut::activated, this,
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
462 &AnimeListPage::ItemDoubleClicked);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
463
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
464 tree_view->header()->setStretchLastSection(false);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
465 tree_view->header()->setContextMenuPolicy(Qt::CustomContextMenu);
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
466 connect(tree_view->header(), &QWidget::customContextMenuRequested, this, &AnimeListPage::DisplayColumnHeaderMenu);
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
467
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
468 connect(tab_bar, &QTabBar::currentChanged, this, [this](int index) {
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
469 if (sort_models[index])
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
470 tree_view->setModel(sort_models[index]);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
471 });
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
472
69
27a19dd6cba1 *: fix up some stuff
Paper <mrpapersonic@gmail.com>
parents: 68
diff changeset
473 SetColumnDefaults();
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
474 setFocusPolicy(Qt::TabFocus);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
475 setFocusProxy(tab_bar);
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
476 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
477
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
478 void AnimeListPage::RefreshList() {
83
d02fdf1d6708 *: huuuge update
Paper <mrpapersonic@gmail.com>
parents: 81
diff changeset
479 for (unsigned int i = 0; i < sort_models.size(); i++)
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
480 reinterpret_cast<AnimeListPageModel*>(sort_models[i]->sourceModel())->RefreshList();
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
481 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
482
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
483 void AnimeListPage::RefreshTabs() {
83
d02fdf1d6708 *: huuuge update
Paper <mrpapersonic@gmail.com>
parents: 81
diff changeset
484 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
485 tab_bar->setTabText(i, Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])) + " (" +
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
486 QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")");
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
487 }
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
488
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
489 void AnimeListPage::Refresh() {
15
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
490 RefreshList();
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
491 RefreshTabs();
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
492 }
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
493
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
494 /* This function, really, really should not be called.
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
495 Ever. Why would you ever need to clear the anime list?
cde8f67a7c7d *: update, megacommit :)
Paper <mrpapersonic@gmail.com>
parents: 11
diff changeset
496 Also, this sucks. */
64
fe719c109dbc *: update
Paper <mrpapersonic@gmail.com>
parents: 63
diff changeset
497 void AnimeListPage::Reset() {
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
498 while (tab_bar->count())
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
499 tab_bar->removeTab(0);
83
d02fdf1d6708 *: huuuge update
Paper <mrpapersonic@gmail.com>
parents: 81
diff changeset
500 for (unsigned int i = 0; i < sort_models.size(); i++)
10
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
501 delete sort_models[i];
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
502 }
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
503
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
504 #include "gui/pages/moc_anime_list.cpp"