diff --git a/doomsday/libdeng2/include/de/core/system.h b/doomsday/libdeng2/include/de/core/system.h index eea5a5a728..03c021c62b 100644 --- a/doomsday/libdeng2/include/de/core/system.h +++ b/doomsday/libdeng2/include/de/core/system.h @@ -50,7 +50,7 @@ class DENG2_PUBLIC System : DENG2_OBSERVES(Clock, TimeChange) public: System(Flags const &behavior = DefaultBehavior); - void setBehavior(Flags const &behavior); + void setBehavior(Flags const &behavior, FlagOp operation = SetFlags); Flags behavior() const; diff --git a/doomsday/libdeng2/include/de/libdeng2.h b/doomsday/libdeng2/include/de/libdeng2.h index cc67877139..dd17154427 100644 --- a/doomsday/libdeng2/include/de/libdeng2.h +++ b/doomsday/libdeng2/include/de/libdeng2.h @@ -392,6 +392,15 @@ enum FlagOp { ReplaceFlags = 2 ///< Specified flags become the new set of flags, replacing all previous flags. }; +template +void applyFlagOperation(FlagsType &flags, FlagsType const &newFlags, FlagOp operation) { + switch(operation) { + case SetFlags: flags |= newFlags; break; + case UnsetFlags: flags &= ~newFlags; break; + case ReplaceFlags: flags = newFlags; break; + } +} + /** * All serialization in all contexts use a common protocol version number. * Whenever anything changes in serialization, the protocol version needs to be diff --git a/doomsday/libdeng2/include/de/widgets/widget.h b/doomsday/libdeng2/include/de/widgets/widget.h index e99dcb3037..58b9d32473 100644 --- a/doomsday/libdeng2/include/de/widgets/widget.h +++ b/doomsday/libdeng2/include/de/widgets/widget.h @@ -77,8 +77,8 @@ class DENG2_PUBLIC Widget void show(bool doShow = true); inline void hide() { show(false); } - void enable(bool yes = true) { setBehavior(Disabled, !yes); } - void disable(bool yes = true) { setBehavior(Disabled, yes); } + void enable(bool yes = true) { setBehavior(Disabled, yes? UnsetFlags : SetFlags); } + void disable(bool yes = true) { setBehavior(Disabled, yes? SetFlags : UnsetFlags); } bool isHidden() const; inline bool isEnabled() const { return !behavior().testFlag(Disabled); } @@ -90,7 +90,7 @@ class DENG2_PUBLIC Widget * @param behavior Flags. * @param set @c true to set, @c false to clear. */ - void setBehavior(Behaviors behavior, bool set = true); + void setBehavior(Behaviors behavior, FlagOp operation = SetFlags); Behaviors behavior() const; diff --git a/doomsday/libdeng2/src/core/system.cpp b/doomsday/libdeng2/src/core/system.cpp index 46a25f207b..5e343a04ec 100644 --- a/doomsday/libdeng2/src/core/system.cpp +++ b/doomsday/libdeng2/src/core/system.cpp @@ -33,9 +33,9 @@ System::System(Flags const &behavior) : d(new Instance(this)) d->behavior = behavior; } -void System::setBehavior(Flags const &behavior) +void System::setBehavior(Flags const &behavior, FlagOp operation) { - d->behavior = behavior; + applyFlagOperation(d->behavior, behavior, operation); } System::Flags System::behavior() const diff --git a/doomsday/libdeng2/src/widgets/widget.cpp b/doomsday/libdeng2/src/widgets/widget.cpp index 8da78aab9b..bd158998da 100644 --- a/doomsday/libdeng2/src/widgets/widget.cpp +++ b/doomsday/libdeng2/src/widgets/widget.cpp @@ -140,19 +140,12 @@ bool Widget::isHidden() const void Widget::show(bool doShow) { - setBehavior(Hidden, !doShow); + setBehavior(Hidden, doShow? UnsetFlags : SetFlags); } -void Widget::setBehavior(Behaviors behavior, bool set) +void Widget::setBehavior(Behaviors behavior, FlagOp operation) { - if(set) - { - d->behavior |= behavior; - } - else - { - d->behavior &= ~behavior; - } + applyFlagOperation(d->behavior, behavior, operation); } Widget::Behaviors Widget::behavior() const diff --git a/doomsday/libshell/src/menuwidget.cpp b/doomsday/libshell/src/menuwidget.cpp index d30c07db54..d890e5cfa9 100644 --- a/doomsday/libshell/src/menuwidget.cpp +++ b/doomsday/libshell/src/menuwidget.cpp @@ -115,7 +115,7 @@ MenuWidget::MenuWidget(Preset preset, String const &name) switch(preset) { case Popup: - setBehavior(HandleEventsOnlyWhenFocused, true); + setBehavior(HandleEventsOnlyWhenFocused); setClosable(true); d->cycleCursor = true; hide();