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