1 #include "VersionSelectWidget.h"
2 #include <QProgressBar>
3 #include <QVBoxLayout>
4 #include "VersionListView.h"
5 #include <QHeaderView>
6 #include <VersionProxyModel.h>
7 #include <dialogs/CustomMessageBox.h>
8
VersionSelectWidget(QWidget * parent)9 VersionSelectWidget::VersionSelectWidget(QWidget* parent)
10 : QWidget(parent)
11 {
12 setObjectName(QStringLiteral("VersionSelectWidget"));
13 verticalLayout = new QVBoxLayout(this);
14 verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
15 verticalLayout->setContentsMargins(0, 0, 0, 0);
16
17 m_proxyModel = new VersionProxyModel(this);
18
19 listView = new VersionListView(this);
20 listView->setObjectName(QStringLiteral("listView"));
21 listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
22 listView->setAlternatingRowColors(true);
23 listView->setRootIsDecorated(false);
24 listView->setItemsExpandable(false);
25 listView->setWordWrap(true);
26 listView->header()->setCascadingSectionResizes(true);
27 listView->header()->setStretchLastSection(false);
28 listView->setModel(m_proxyModel);
29 verticalLayout->addWidget(listView);
30
31 sneakyProgressBar = new QProgressBar(this);
32 sneakyProgressBar->setObjectName(QStringLiteral("sneakyProgressBar"));
33 sneakyProgressBar->setFormat(QStringLiteral("%p%"));
34 verticalLayout->addWidget(sneakyProgressBar);
35 sneakyProgressBar->setHidden(true);
36 connect(listView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &VersionSelectWidget::currentRowChanged);
37
38 QMetaObject::connectSlotsByName(this);
39 }
40
setCurrentVersion(const QString & version)41 void VersionSelectWidget::setCurrentVersion(const QString& version)
42 {
43 m_currentVersion = version;
44 m_proxyModel->setCurrentVersion(version);
45 }
46
setEmptyString(QString emptyString)47 void VersionSelectWidget::setEmptyString(QString emptyString)
48 {
49 listView->setEmptyString(emptyString);
50 }
51
setEmptyErrorString(QString emptyErrorString)52 void VersionSelectWidget::setEmptyErrorString(QString emptyErrorString)
53 {
54 listView->setEmptyErrorString(emptyErrorString);
55 }
56
~VersionSelectWidget()57 VersionSelectWidget::~VersionSelectWidget()
58 {
59 }
60
setResizeOn(int column)61 void VersionSelectWidget::setResizeOn(int column)
62 {
63 listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::ResizeToContents);
64 resizeOnColumn = column;
65 listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::Stretch);
66 }
67
initialize(BaseVersionList * vlist)68 void VersionSelectWidget::initialize(BaseVersionList *vlist)
69 {
70 m_vlist = vlist;
71 m_proxyModel->setSourceModel(vlist);
72 listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
73 listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::Stretch);
74
75 if (!m_vlist->isLoaded())
76 {
77 loadList();
78 }
79 else
80 {
81 if (m_proxyModel->rowCount() == 0)
82 {
83 listView->setEmptyMode(VersionListView::String);
84 }
85 preselect();
86 }
87 }
88
closeEvent(QCloseEvent * event)89 void VersionSelectWidget::closeEvent(QCloseEvent * event)
90 {
91 QWidget::closeEvent(event);
92 }
93
loadList()94 void VersionSelectWidget::loadList()
95 {
96 auto newTask = m_vlist->getLoadTask();
97 if (!newTask)
98 {
99 return;
100 }
101 loadTask = newTask.get();
102 connect(loadTask, &Task::succeeded, this, &VersionSelectWidget::onTaskSucceeded);
103 connect(loadTask, &Task::failed, this, &VersionSelectWidget::onTaskFailed);
104 connect(loadTask, &Task::progress, this, &VersionSelectWidget::changeProgress);
105 if(!loadTask->isRunning())
106 {
107 loadTask->start();
108 }
109 sneakyProgressBar->setHidden(false);
110 }
111
onTaskSucceeded()112 void VersionSelectWidget::onTaskSucceeded()
113 {
114 if (m_proxyModel->rowCount() == 0)
115 {
116 listView->setEmptyMode(VersionListView::String);
117 }
118 sneakyProgressBar->setHidden(true);
119 preselect();
120 loadTask = nullptr;
121 }
122
onTaskFailed(const QString & reason)123 void VersionSelectWidget::onTaskFailed(const QString& reason)
124 {
125 CustomMessageBox::selectable(this, tr("Error"), tr("List update failed:\n%1").arg(reason), QMessageBox::Warning)->show();
126 onTaskSucceeded();
127 }
128
changeProgress(qint64 current,qint64 total)129 void VersionSelectWidget::changeProgress(qint64 current, qint64 total)
130 {
131 sneakyProgressBar->setMaximum(total);
132 sneakyProgressBar->setValue(current);
133 }
134
currentRowChanged(const QModelIndex & current,const QModelIndex &)135 void VersionSelectWidget::currentRowChanged(const QModelIndex& current, const QModelIndex&)
136 {
137 auto variant = m_proxyModel->data(current, BaseVersionList::VersionPointerRole);
138 emit selectedVersionChanged(variant.value<BaseVersionPtr>());
139 }
140
preselect()141 void VersionSelectWidget::preselect()
142 {
143 if(preselectedAlready)
144 return;
145 selectCurrent();
146 if(preselectedAlready)
147 return;
148 selectRecommended();
149 }
150
selectCurrent()151 void VersionSelectWidget::selectCurrent()
152 {
153 if(m_currentVersion.isEmpty())
154 {
155 return;
156 }
157 auto idx = m_proxyModel->getVersion(m_currentVersion);
158 if(idx.isValid())
159 {
160 preselectedAlready = true;
161 listView->selectionModel()->setCurrentIndex(idx,QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
162 listView->scrollTo(idx, QAbstractItemView::PositionAtCenter);
163 }
164 }
165
selectRecommended()166 void VersionSelectWidget::selectRecommended()
167 {
168 auto idx = m_proxyModel->getRecommended();
169 if(idx.isValid())
170 {
171 preselectedAlready = true;
172 listView->selectionModel()->setCurrentIndex(idx,QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
173 listView->scrollTo(idx, QAbstractItemView::PositionAtCenter);
174 }
175 }
176
hasVersions() const177 bool VersionSelectWidget::hasVersions() const
178 {
179 return m_proxyModel->rowCount(QModelIndex()) != 0;
180 }
181
selectedVersion() const182 BaseVersionPtr VersionSelectWidget::selectedVersion() const
183 {
184 auto currentIndex = listView->selectionModel()->currentIndex();
185 auto variant = m_proxyModel->data(currentIndex, BaseVersionList::VersionPointerRole);
186 return variant.value<BaseVersionPtr>();
187 }
188
setExactFilter(BaseVersionList::ModelRoles role,QString filter)189 void VersionSelectWidget::setExactFilter(BaseVersionList::ModelRoles role, QString filter)
190 {
191 m_proxyModel->setFilter(role, new ExactFilter(filter));
192 }
193
setFuzzyFilter(BaseVersionList::ModelRoles role,QString filter)194 void VersionSelectWidget::setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter)
195 {
196 m_proxyModel->setFilter(role, new ContainsFilter(filter));
197 }
198
setFilter(BaseVersionList::ModelRoles role,Filter * filter)199 void VersionSelectWidget::setFilter(BaseVersionList::ModelRoles role, Filter *filter)
200 {
201 m_proxyModel->setFilter(role, filter);
202 }
203