Launcher: Maintain aircraft selection better
- when launching or toggling settings, try to keep the current aircraft selected and in-view.
This commit is contained in:
parent
b0ee3f98f3
commit
4befe0e6ea
2 changed files with 52 additions and 7 deletions
|
@ -303,7 +303,7 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_ratingsFilter) {
|
if (!m_onlyShowInstalled && m_ratingsFilter) {
|
||||||
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
|
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
|
||||||
for (int i=0; i<4; ++i) {
|
for (int i=0; i<4; ++i) {
|
||||||
if (m_ratings[i] > index.data(AircraftRatingRole + i).toInt()) {
|
if (m_ratings[i] > index.data(AircraftRatingRole + i).toInt()) {
|
||||||
|
@ -475,6 +475,9 @@ QtLauncher::QtLauncher() :
|
||||||
m_aircraftProxy = new AircraftProxyModel(this);
|
m_aircraftProxy = new AircraftProxyModel(this);
|
||||||
connect(m_ui->ratingsFilterCheck, &QAbstractButton::toggled,
|
connect(m_ui->ratingsFilterCheck, &QAbstractButton::toggled,
|
||||||
m_aircraftProxy, &AircraftProxyModel::setRatingFilterEnabled);
|
m_aircraftProxy, &AircraftProxyModel::setRatingFilterEnabled);
|
||||||
|
connect(m_ui->ratingsFilterCheck, &QAbstractButton::toggled,
|
||||||
|
this, &QtLauncher::maybeRestoreAircraftSelection);
|
||||||
|
|
||||||
connect(m_ui->onlyShowInstalledCheck, &QAbstractButton::toggled,
|
connect(m_ui->onlyShowInstalledCheck, &QAbstractButton::toggled,
|
||||||
m_aircraftProxy, &AircraftProxyModel::setInstalledFilterEnabled);
|
m_aircraftProxy, &AircraftProxyModel::setInstalledFilterEnabled);
|
||||||
connect(m_ui->aircraftFilter, &QLineEdit::textChanged,
|
connect(m_ui->aircraftFilter, &QLineEdit::textChanged,
|
||||||
|
@ -554,6 +557,13 @@ QtLauncher::QtLauncher() :
|
||||||
connect(m_ui->pathsButton, &QPushButton::clicked,
|
connect(m_ui->pathsButton, &QPushButton::clicked,
|
||||||
this, &QtLauncher::onEditPaths);
|
this, &QtLauncher::onEditPaths);
|
||||||
|
|
||||||
|
// after any kind of reset, try to restore selection and scroll
|
||||||
|
// to match the m_selectedAircraft. This needs to be delayed
|
||||||
|
// fractionally otherwise the scrollTo seems to be ignored,
|
||||||
|
// unfortunately.
|
||||||
|
connect(m_aircraftProxy, &AircraftProxyModel::modelReset,
|
||||||
|
this, &QtLauncher::delayedAircraftModelReset);
|
||||||
|
|
||||||
restoreSettings();
|
restoreSettings();
|
||||||
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
@ -616,9 +626,30 @@ void QtLauncher::restoreSettings()
|
||||||
m_aircraftProxy->setRatingFilterEnabled(m_ui->ratingsFilterCheck->isChecked());
|
m_aircraftProxy->setRatingFilterEnabled(m_ui->ratingsFilterCheck->isChecked());
|
||||||
m_aircraftProxy->setRatings(m_ratingFilters);
|
m_aircraftProxy->setRatings(m_ratingFilters);
|
||||||
|
|
||||||
|
updateSelectedAircraft();
|
||||||
|
maybeRestoreAircraftSelection();
|
||||||
|
|
||||||
m_ui->commandLineArgs->setPlainText(settings.value("additional-args").toString());
|
m_ui->commandLineArgs->setPlainText(settings.value("additional-args").toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtLauncher::delayedAircraftModelReset()
|
||||||
|
{
|
||||||
|
QTimer::singleShot(1, this, &QtLauncher::maybeRestoreAircraftSelection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtLauncher::maybeRestoreAircraftSelection()
|
||||||
|
{
|
||||||
|
QModelIndex aircraftIndex = m_aircraftModel->indexOfAircraftURI(m_selectedAircraft);
|
||||||
|
QModelIndex proxyIndex = m_aircraftProxy->mapFromSource(aircraftIndex);
|
||||||
|
if (proxyIndex.isValid()) {
|
||||||
|
m_ui->aircraftList->selectionModel()->setCurrentIndex(proxyIndex,
|
||||||
|
QItemSelectionModel::ClearAndSelect);
|
||||||
|
m_ui->aircraftList->selectionModel()->select(proxyIndex,
|
||||||
|
QItemSelectionModel::ClearAndSelect);
|
||||||
|
m_ui->aircraftList->scrollTo(proxyIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QtLauncher::saveSettings()
|
void QtLauncher::saveSettings()
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
@ -848,6 +879,15 @@ void QtLauncher::onAircraftInstalledCompleted(QModelIndex index)
|
||||||
maybeUpdateSelectedAircraft(index);
|
maybeUpdateSelectedAircraft(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtLauncher::onRatingsFilterToggled()
|
||||||
|
{
|
||||||
|
QModelIndex aircraftIndex = m_aircraftModel->indexOfAircraftURI(m_selectedAircraft);
|
||||||
|
QModelIndex proxyIndex = m_aircraftProxy->mapFromSource(aircraftIndex);
|
||||||
|
if (proxyIndex.isValid()) {
|
||||||
|
m_ui->aircraftList->scrollTo(proxyIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QtLauncher::onAircraftInstallFailed(QModelIndex index, QString errorMessage)
|
void QtLauncher::onAircraftInstallFailed(QModelIndex index, QString errorMessage)
|
||||||
{
|
{
|
||||||
qWarning() << Q_FUNC_INFO << index.data(AircraftURIRole) << errorMessage;
|
qWarning() << Q_FUNC_INFO << index.data(AircraftURIRole) << errorMessage;
|
||||||
|
@ -870,6 +910,10 @@ void QtLauncher::onAircraftSelected(const QModelIndex& index)
|
||||||
|
|
||||||
void QtLauncher::onRequestPackageInstall(const QModelIndex& index)
|
void QtLauncher::onRequestPackageInstall(const QModelIndex& index)
|
||||||
{
|
{
|
||||||
|
// also select, otherwise UI is confusing
|
||||||
|
m_selectedAircraft = index.data(AircraftURIRole).toUrl();
|
||||||
|
updateSelectedAircraft();
|
||||||
|
|
||||||
QString pkg = index.data(AircraftPackageIdRole).toString();
|
QString pkg = index.data(AircraftPackageIdRole).toString();
|
||||||
simgear::pkg::PackageRef pref = globals->packageRoot()->getPackageById(pkg.toStdString());
|
simgear::pkg::PackageRef pref = globals->packageRoot()->getPackageById(pkg.toStdString());
|
||||||
if (pref->isInstalled()) {
|
if (pref->isInstalled()) {
|
||||||
|
@ -1029,12 +1073,7 @@ void QtLauncher::onRembrandtToggled(bool b)
|
||||||
void QtLauncher::onShowInstalledAircraftToggled(bool b)
|
void QtLauncher::onShowInstalledAircraftToggled(bool b)
|
||||||
{
|
{
|
||||||
m_ui->ratingsFilterCheck->setEnabled(!b);
|
m_ui->ratingsFilterCheck->setEnabled(!b);
|
||||||
if (b) {
|
maybeRestoreAircraftSelection();
|
||||||
// don't filter installed aircraft by rating
|
|
||||||
m_aircraftProxy->setRatingFilterEnabled(false);
|
|
||||||
} else {
|
|
||||||
m_aircraftProxy->setRatingFilterEnabled(m_ui->ratingsFilterCheck->isChecked());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtLauncher::onSubsytemIdleTimeout()
|
void QtLauncher::onSubsytemIdleTimeout()
|
||||||
|
|
|
@ -104,6 +104,12 @@ private:
|
||||||
|
|
||||||
simgear::pkg::PackageRef packageForAircraftURI(QUrl uri) const;
|
simgear::pkg::PackageRef packageForAircraftURI(QUrl uri) const;
|
||||||
|
|
||||||
|
void maybeRestoreAircraftSelection();
|
||||||
|
// need to wait after a model reset before restoring selection and
|
||||||
|
// scrolling, to give the view time it seems.
|
||||||
|
void delayedAircraftModelReset();
|
||||||
|
void onRatingsFilterToggled();
|
||||||
|
|
||||||
QScopedPointer<Ui::Launcher> m_ui;
|
QScopedPointer<Ui::Launcher> m_ui;
|
||||||
AircraftProxyModel* m_aircraftProxy;
|
AircraftProxyModel* m_aircraftProxy;
|
||||||
AircraftItemModel* m_aircraftModel;
|
AircraftItemModel* m_aircraftModel;
|
||||||
|
|
Loading…
Add table
Reference in a new issue