GH-922 improve version select dialogs
This commit is contained in:
		@@ -21,8 +21,6 @@
 | 
			
		||||
#include "ui_CopyInstanceDialog.h"
 | 
			
		||||
 | 
			
		||||
#include "Platform.h"
 | 
			
		||||
#include "dialogs/VersionSelectDialog.h"
 | 
			
		||||
#include "dialogs/ProgressDialog.h"
 | 
			
		||||
#include "dialogs/IconPickerDialog.h"
 | 
			
		||||
 | 
			
		||||
#include "BaseVersion.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
#include <QHeaderView>
 | 
			
		||||
 | 
			
		||||
#include <dialogs/ProgressDialog.h>
 | 
			
		||||
#include "CustomMessageBox.h"
 | 
			
		||||
#include "Platform.h"
 | 
			
		||||
 | 
			
		||||
#include <BaseVersion.h>
 | 
			
		||||
@@ -46,6 +47,7 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList *vlist, QString title,
 | 
			
		||||
	ui->listView->setModel(m_proxyModel);
 | 
			
		||||
	ui->listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
 | 
			
		||||
	ui->listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::Stretch);
 | 
			
		||||
	ui->sneakyProgressBar->setHidden(true);
 | 
			
		||||
 | 
			
		||||
	if (!cancelable)
 | 
			
		||||
	{
 | 
			
		||||
@@ -58,6 +60,11 @@ void VersionSelectDialog::setEmptyString(QString emptyString)
 | 
			
		||||
	ui->listView->setEmptyString(emptyString);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::setEmptyErrorString(QString emptyErrorString)
 | 
			
		||||
{
 | 
			
		||||
	ui->listView->setEmptyErrorString(emptyErrorString);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VersionSelectDialog::~VersionSelectDialog()
 | 
			
		||||
{
 | 
			
		||||
	delete ui;
 | 
			
		||||
@@ -77,26 +84,89 @@ int VersionSelectDialog::exec()
 | 
			
		||||
	{
 | 
			
		||||
		loadList();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (m_proxyModel->rowCount() == 0)
 | 
			
		||||
		{
 | 
			
		||||
			ui->listView->setEmptyMode(VersionListView::String);
 | 
			
		||||
		}
 | 
			
		||||
		preselect();
 | 
			
		||||
	}
 | 
			
		||||
	return QDialog::exec();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::closeEvent(QCloseEvent * event)
 | 
			
		||||
{
 | 
			
		||||
	if(loadTask)
 | 
			
		||||
	{
 | 
			
		||||
		loadTask->abort();
 | 
			
		||||
		loadTask->deleteLater();
 | 
			
		||||
		loadTask = nullptr;
 | 
			
		||||
	}
 | 
			
		||||
	QDialog::closeEvent(event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::loadList()
 | 
			
		||||
{
 | 
			
		||||
	if(loadTask)
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	loadTask = m_vlist->getLoadTask();
 | 
			
		||||
	if (!loadTask)
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	connect(loadTask, &Task::finished, this, &VersionSelectDialog::onTaskFinished);
 | 
			
		||||
	connect(loadTask, &Task::progress, this, &VersionSelectDialog::changeProgress);
 | 
			
		||||
	loadTask->start();
 | 
			
		||||
	ui->sneakyProgressBar->setHidden(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::onTaskFinished()
 | 
			
		||||
{
 | 
			
		||||
	if (!loadTask->successful())
 | 
			
		||||
	{
 | 
			
		||||
		CustomMessageBox::selectable(this, tr("Error"),
 | 
			
		||||
									 tr("List update failed:\n%1").arg(loadTask->failReason()),
 | 
			
		||||
									 QMessageBox::Warning)->show();
 | 
			
		||||
		if (m_proxyModel->rowCount() == 0)
 | 
			
		||||
		{
 | 
			
		||||
			ui->listView->setEmptyMode(VersionListView::ErrorString);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if (m_proxyModel->rowCount() == 0)
 | 
			
		||||
	{
 | 
			
		||||
		ui->listView->setEmptyMode(VersionListView::String);
 | 
			
		||||
	}
 | 
			
		||||
	ui->sneakyProgressBar->setHidden(true);
 | 
			
		||||
	loadTask->deleteLater();
 | 
			
		||||
	loadTask = nullptr;
 | 
			
		||||
	preselect();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::changeProgress(qint64 current, qint64 total)
 | 
			
		||||
{
 | 
			
		||||
	ui->sneakyProgressBar->setMaximum(total);
 | 
			
		||||
	ui->sneakyProgressBar->setValue(current);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::preselect()
 | 
			
		||||
{
 | 
			
		||||
	if(preselectedAlready)
 | 
			
		||||
		return;
 | 
			
		||||
	preselectedAlready = true;
 | 
			
		||||
	selectRecommended();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::selectRecommended()
 | 
			
		||||
{
 | 
			
		||||
	auto idx = m_proxyModel->getRecommended();
 | 
			
		||||
	if(idx.isValid())
 | 
			
		||||
	{
 | 
			
		||||
		ui->listView->selectionModel()->setCurrentIndex(idx,QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
 | 
			
		||||
		ui->listView->scrollTo(idx, QAbstractItemView::PositionAtCenter);
 | 
			
		||||
	}
 | 
			
		||||
	return QDialog::exec();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VersionSelectDialog::loadList()
 | 
			
		||||
{
 | 
			
		||||
	Task *loadTask = m_vlist->getLoadTask();
 | 
			
		||||
	if (!loadTask)
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	ProgressDialog *taskDlg = new ProgressDialog(this);
 | 
			
		||||
	loadTask->setParent(taskDlg);
 | 
			
		||||
	taskDlg->exec(loadTask);
 | 
			
		||||
	delete taskDlg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BaseVersionPtr VersionSelectDialog::selectedVersion() const
 | 
			
		||||
 
 | 
			
		||||
@@ -46,19 +46,34 @@ public:
 | 
			
		||||
	void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
 | 
			
		||||
	void setExactFilter(BaseVersionList::ModelRoles role, QString filter);
 | 
			
		||||
	void setEmptyString(QString emptyString);
 | 
			
		||||
	void setEmptyErrorString(QString emptyErrorString);
 | 
			
		||||
	void setResizeOn(int column);
 | 
			
		||||
	void setUseLatest(const bool useLatest);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    virtual void closeEvent ( QCloseEvent* );
 | 
			
		||||
 | 
			
		||||
private
 | 
			
		||||
slots:
 | 
			
		||||
	void on_refreshButton_clicked();
 | 
			
		||||
 | 
			
		||||
	void onTaskFinished();
 | 
			
		||||
	void changeProgress(qint64 current, qint64 total);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	Ui::VersionSelectDialog *ui;
 | 
			
		||||
	void preselect();
 | 
			
		||||
	void selectRecommended();
 | 
			
		||||
 | 
			
		||||
	BaseVersionList *m_vlist;
 | 
			
		||||
private:
 | 
			
		||||
	Ui::VersionSelectDialog *ui = nullptr;
 | 
			
		||||
 | 
			
		||||
	VersionProxyModel *m_proxyModel;
 | 
			
		||||
	BaseVersionList *m_vlist = nullptr;
 | 
			
		||||
 | 
			
		||||
	VersionProxyModel *m_proxyModel = nullptr;
 | 
			
		||||
 | 
			
		||||
	int resizeOnColumn = 0;
 | 
			
		||||
 | 
			
		||||
	Task * loadTask = nullptr;
 | 
			
		||||
 | 
			
		||||
	bool preselectedAlready = false;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,16 @@
 | 
			
		||||
     </attribute>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QProgressBar" name="sneakyProgressBar">
 | 
			
		||||
     <property name="value">
 | 
			
		||||
      <number>24</number>
 | 
			
		||||
     </property>
 | 
			
		||||
     <property name="format">
 | 
			
		||||
      <string notr="true">%p%</string>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <layout class="QHBoxLayout" name="horizontalLayout">
 | 
			
		||||
     <item>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user