Skip to content

Commit

Permalink
UI|Client: Improved behavior of VariableChoiceWidget
Browse files Browse the repository at this point in the history
VariableChoiceWidget now correctly handles text and number values separately. It also updates the current selection highlight when the selection is changed.
  • Loading branch information
skyjake committed Oct 7, 2018
1 parent dc9fe6c commit 5671686
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 22 deletions.
10 changes: 5 additions & 5 deletions doomsday/apps/client/src/ui/dialogs/audiosettingsdialog.cpp
Expand Up @@ -92,13 +92,13 @@ DENG_GUI_PIMPL(AudioSettingsDialog)
devPopup->commit();
}

area.add(soundPlugin = new VariableChoiceWidget(App::config("audio.soundPlugin")));
area.add(musicPlugin = new VariableChoiceWidget(App::config("audio.musicPlugin")));
area.add(soundPlugin = new VariableChoiceWidget(App::config("audio.soundPlugin"), VariableChoiceWidget::Text));
area.add(musicPlugin = new VariableChoiceWidget(App::config("audio.musicPlugin"), VariableChoiceWidget::Text));
#if defined (WIN32)
area.add(cdPlugin = new VariableChoiceWidget(App::config("audio.cdPlugin")));
area.add(cdPlugin = new VariableChoiceWidget(App::config("audio.cdPlugin"), VariableChoiceWidget::Text));
#endif

area.add(fmodSpeakerMode = new VariableChoiceWidget(App::config("audio.fmod.speakerMode")));
area.add(fmodSpeakerMode = new VariableChoiceWidget(App::config("audio.fmod.speakerMode"), VariableChoiceWidget::Text));
fmodSpeakerMode->items()
<< new ChoiceItem(tr("Stereo"), "")
<< new ChoiceItem(tr("5.1"), "5.1")
Expand Down Expand Up @@ -140,7 +140,7 @@ DENG_GUI_PIMPL(AudioSettingsDialog)
fmodSpeakerMode->updateFromVariable();

// The audio system needs reinitializing if the plugins are changed.
auto changeFunc = [this] (uint) { audioPluginsChanged = true; };
auto changeFunc = [this](uint) { audioPluginsChanged = true; };
QObject::connect(soundPlugin, &ChoiceWidget::selectionChangedByUser, changeFunc);
QObject::connect(musicPlugin, &ChoiceWidget::selectionChangedByUser, changeFunc);
QObject::connect(fmodSpeakerMode, &ChoiceWidget::selectionChangedByUser, changeFunc);
Expand Down
5 changes: 3 additions & 2 deletions doomsday/apps/client/src/ui/dialogs/logsettingsdialog.cpp
Expand Up @@ -126,8 +126,9 @@ DENG2_PIMPL(LogSettingsDialog)
wgt.label = LabelWidget::newWithText(tr(dom.label) + ":", parent);

// Minimum level for log entries.
parent->add(wgt.level =
new VariableChoiceWidget(Config::get(String("log.filter.%1.minLevel").arg(dom.name))));
parent->add(wgt.level = new VariableChoiceWidget(
Config::get(String("log.filter.%1.minLevel").arg(dom.name)),
VariableChoiceWidget::Number));
wgt.level->setItems(levels);
wgt.level->updateFromVariable();
QObject::connect(wgt.level, SIGNAL(selectionChangedByUser(uint)),
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/client/src/ui/dialogs/uisettingsdialog.cpp
Expand Up @@ -45,7 +45,7 @@ DENG2_PIMPL(UISettingsDialog)
{
auto &area = self().area();

area.add(uiScale = new VariableChoiceWidget(App::config("ui.scaleFactor")));
area.add(uiScale = new VariableChoiceWidget(App::config("ui.scaleFactor"), VariableChoiceWidget::Number));
area.add(uiTranslucency = new VariableToggleWidget(tr("Background Translucency"), App::config("ui.translucency")));
area.add(showAnnotations = new VariableToggleWidget(tr("Menu Annotations"), App::config("ui.showAnnotations")));
area.add(showColumnDescription = new VariableToggleWidget(tr("Game Descriptions"), App::config("home.showColumnDescription")));
Expand Down
Expand Up @@ -38,8 +38,11 @@ class LIBAPPFW_PUBLIC VariableChoiceWidget : public ChoiceWidget
/// Thrown when the variable is gone and someone tries to access it. @ingroup errors
DENG2_ERROR(VariableMissingError);

enum VariableType { Number, Text };

public:
VariableChoiceWidget(Variable &variable, String const &name = String());
VariableChoiceWidget(Variable &variable, VariableType variableType,
String const &name = String());

Variable &variable() const;

Expand Down
9 changes: 3 additions & 6 deletions doomsday/sdk/libappfw/src/widgets/choicewidget.cpp
Expand Up @@ -235,12 +235,9 @@ PopupMenuWidget &ChoiceWidget::popup()

void ChoiceWidget::setSelected(Data::Pos pos)
{
if (d->selected != pos)
{
d->selected = pos;
d->updateButtonWithSelection();
d->updateItemHighlight();
}
d->selected = pos;
d->updateButtonWithSelection();
d->updateItemHighlight();
}

bool ChoiceWidget::isValidSelection() const
Expand Down
19 changes: 12 additions & 7 deletions doomsday/sdk/libappfw/src/widgets/variablechoicewidget.cpp
Expand Up @@ -23,14 +23,17 @@

namespace de {

/// @todo Add support for TextValue in addition to NumberValue.
DENG2_PIMPL(VariableChoiceWidget),
DENG2_OBSERVES(Variable, Deletion),
DENG2_OBSERVES(Variable, Change )
{
Variable *var;
VariableType variableType;

Impl(Public *i, Variable &variable) : Base(i), var(&variable)
Impl(Public *i, Variable &variable, VariableType vt)
: Base(i)
, var(&variable)
, variableType(vt)
{
updateFromVariable();

Expand All @@ -40,9 +43,9 @@ DENG2_OBSERVES(Variable, Change )

void updateFromVariable()
{
if (!var) return;
if (!var || self().items().isEmpty()) return;

if (is<TextValue>(var->value()))
if (variableType == Text)
{
self().setSelected(self().items().findData(var->value().asText()));
}
Expand All @@ -57,7 +60,7 @@ DENG2_OBSERVES(Variable, Change )
if (!var) return;

var->audienceForChange() -= this;
if (is<TextValue>(var->value()))
if (variableType == Text)
{
var->set(TextValue(self().selectedItem().data().toString()));
}
Expand All @@ -80,8 +83,10 @@ DENG2_OBSERVES(Variable, Change )
}
};

VariableChoiceWidget::VariableChoiceWidget(Variable &variable, String const &name)
: ChoiceWidget(name), d(new Impl(this, variable))
VariableChoiceWidget::VariableChoiceWidget(Variable &variable, VariableType variableType,
String const &name)
: ChoiceWidget(name)
, d(new Impl(this, variable, variableType))
{
connect(this, SIGNAL(selectionChangedByUser(uint)),
this, SLOT(setVariableFromWidget()));
Expand Down

0 comments on commit 5671686

Please sign in to comment.