From a20b92d76ac7f7207b1d6c7171afbbf08f0648f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Sun, 5 Mar 2017 11:17:30 +0200 Subject: [PATCH] UI|Home: Usability improvements Show a different message when user-selected packages are missing vs. when the game IWAD files are missing. Re-filter savegames for a profile after the selected packages have been changed. Double-clicking saves is no longer possible, as it was a little cumbersome. --- .../client/src/ui/dialogs/packagesdialog.cpp | 11 +++++-- .../src/ui/home/gamepanelbuttonwidget.cpp | 29 ++++++++++--------- .../src/ui/home/packagescolumnwidget.cpp | 9 ++++-- .../client/src/ui/home/savelistwidget.cpp | 10 +++---- 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp b/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp index c366759fe6..3300eae9b5 100644 --- a/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp +++ b/doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp @@ -297,8 +297,15 @@ DENG_GUI_PIMPL(PackagesDialog) } } } - gameDataFiles->setText(_E(l) + String::format("Data file%s: ", dataFiles.size() != 1? "s" : "") + - _E(.) + String::join(dataFiles, _E(l) " and " _E(.))); + if (!dataFiles.isEmpty()) + { + gameDataFiles->setText(_E(l) + String::format("Data file%s: ", dataFiles.size() != 1? "s" : "") + + _E(.) + String::join(dataFiles, _E(l) " and " _E(.))); + } + else + { + gameDataFiles->setText(_E(D) + tr("Locate data file in Data Files settings")); + } } } diff --git a/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp b/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp index 922c90efed..498195fb40 100644 --- a/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp +++ b/doomsday/apps/client/src/ui/home/gamepanelbuttonwidget.cpp @@ -68,6 +68,8 @@ DENG_GUI_PIMPL(GamePanelButtonWidget) return false; } + if (!gameProfile.isPlayable()) return false; + StringList const savePacks = item.loadedPackages(); // Fallback for older saves without package metadata. @@ -109,15 +111,8 @@ DENG_GUI_PIMPL(GamePanelButtonWidget) &PackagesButtonWidget::packageSelectionChanged, [this] (QStringList ids) { - StringList pkgs; - for (auto const &i : ids) pkgs << i; - gameProfile.setPackages(pkgs); - updatePackagesIndicator(); - if (catalog.setPackages(gameProfile.allRequiredPackages())) - { - updateGameTitleImage(); - } - savedItems.refilter(); + gameProfile.setPackages(toStringList(ids)); + self().updateContent(); }); playButton = new ButtonWidget; @@ -274,10 +269,13 @@ void GamePanelButtonWidget::setSelected(bool selected) void GamePanelButtonWidget::updateContent() { - bool const isPlayable = d->game().isPlayable(); + bool const isPlayable = d->gameProfile.isPlayable(); + bool const isGamePlayable = d->game().isPlayableWithDefaultPackages(); playButton().enable(isPlayable); - d->problemIcon->show(!isPlayable); + playButton().show(isPlayable); + updateButtonLayout(); + d->problemIcon->show(!isGamePlayable); d->updatePackagesIndicator(); String meta = !d->gameProfile.isUserCreated()? String::number(d->game().releaseDate().year()) @@ -285,7 +283,7 @@ void GamePanelButtonWidget::updateContent() if (isSelected()) { - if (!d->game().isPlayable()) + if (!isGamePlayable) { meta = _E(D) + tr("Missing data files") + _E(.); } @@ -299,6 +297,11 @@ void GamePanelButtonWidget::updateContent() } } + if (!isPlayable && isGamePlayable) + { + meta = _E(D) + tr("Selected packages missing") + _E(.); + } + label().setText(String(_E(b) "%1\n" _E(l) "%2") .arg(d->gameProfile.name()) .arg(meta)); @@ -309,6 +312,7 @@ void GamePanelButtonWidget::updateContent() { d->updateGameTitleImage(); } + d->savedItems.refilter(); } void GamePanelButtonWidget::unselectSave() @@ -356,7 +360,6 @@ void GamePanelButtonWidget::selectPackages() void GamePanelButtonWidget::clearPackages() { d->gameProfile.setPackages(StringList()); - d->savedItems.refilter(); updateContent(); } diff --git a/doomsday/apps/client/src/ui/home/packagescolumnwidget.cpp b/doomsday/apps/client/src/ui/home/packagescolumnwidget.cpp index dc835f1e3f..8f54d7aec5 100644 --- a/doomsday/apps/client/src/ui/home/packagescolumnwidget.cpp +++ b/doomsday/apps/client/src/ui/home/packagescolumnwidget.cpp @@ -101,8 +101,13 @@ DENG_GUI_PIMPL(PackagesColumnWidget) menu->items() << new ui::ActionItem(/*style().images().image("refresh"), */tr("Refresh"), new CallbackAction([this] () { packages->refreshPackages(); })) - << new ui::SubwidgetItem(tr("Folders"), ui::Left, makePackageFoldersDialog); - return menu; + << new ui::SubwidgetItem(tr("Folders"), ui::Left, [menu] () -> PopupWidget * + { + auto *pop = makePackageFoldersDialog(); + QObject::connect(pop, SIGNAL(closed()), menu, SLOT(close())); + return pop; + }); + return menu; }, ui::Down); } }; diff --git a/doomsday/apps/client/src/ui/home/savelistwidget.cpp b/doomsday/apps/client/src/ui/home/savelistwidget.cpp index 5e8160e7fc..c33fff608c 100644 --- a/doomsday/apps/client/src/ui/home/savelistwidget.cpp +++ b/doomsday/apps/client/src/ui/home/savelistwidget.cpp @@ -35,11 +35,11 @@ DENG_GUI_PIMPL(SaveListWidget) /** * Handles mouse button doubleclicks on the save items. */ - struct DoubleClickHandler : public GuiWidget::IEventHandler + struct ClickHandler : public GuiWidget::IEventHandler { SaveListWidget::Impl *d; - DoubleClickHandler(SaveListWidget::Impl *d) : d(d) {} + ClickHandler(SaveListWidget::Impl *d) : d(d) {} bool handleEvent(GuiWidget &button, Event const &event) { @@ -67,12 +67,12 @@ DENG_GUI_PIMPL(SaveListWidget) } } - if (button.hitTest(mouse) && mouse.state() == MouseEvent::DoubleClick) + /*if (button.hitTest(mouse) && mouse.state() == MouseEvent::DoubleClick) { emit d->self().doubleClicked(d->self().items().find( *d->self().organizer().findItemForWidget(button))); return true; - } + }*/ } return false; } @@ -118,7 +118,7 @@ DENG_GUI_PIMPL(SaveListWidget) toggleSelectedItem(button); emit owner.mouseActivity(); }); - button.addEventHandler(new DoubleClickHandler(this)); + button.addEventHandler(new ClickHandler(this)); auto const &saveItem = item.as(); button.setImage(style().images().image(Game::logoImageForId(saveItem.gameId())));