Skip to content

Commit

Permalink
Refactor|Binding|Client: Moved Binding (Accessor) conditions into the…
Browse files Browse the repository at this point in the history
… data Record
  • Loading branch information
danij-deng committed Nov 12, 2014
1 parent c5757cd commit b6ebb23
Show file tree
Hide file tree
Showing 6 changed files with 290 additions and 230 deletions.
19 changes: 10 additions & 9 deletions doomsday/client/include/ui/b_util.h
Expand Up @@ -20,44 +20,45 @@
#ifndef CLIENT_INPUTSYSTEM_BINDING_UTILITIES_H
#define CLIENT_INPUTSYSTEM_BINDING_UTILITIES_H

#include <de/Record>
#include "dd_types.h"
#include "ddevent.h"
#include "Binding"

class BindContext;

bool B_ParseAxisPosition(BindingCondition::ControlTest &test, float &pos, char const *desc);
bool B_ParseAxisPosition(Binding::ControlTest &test, float &pos, char const *desc);

bool B_ParseButtonState(BindingCondition::ControlTest &test, char const *desc);
bool B_ParseButtonState(Binding::ControlTest &test, char const *desc);

bool B_ParseHatAngle(float &angle, char const *desc);

bool B_ParseBindingCondition(BindingCondition &cond, char const *desc);
bool B_ParseBindingCondition(de::Record &cond, char const *desc);

// ---

de::String B_AxisPositionToString(BindingCondition::ControlTest test, float pos);
de::String B_AxisPositionToString(Binding::ControlTest test, float pos);

de::String B_ButtonStateToString(BindingCondition::ControlTest test);
de::String B_ButtonStateToString(Binding::ControlTest test);

de::String B_HatAngleToString(float angle);

de::String B_ConditionToString(BindingCondition const &cond);
de::String B_ConditionToString(de::Record const &cond);

de::String B_EventToString(ddevent_t const &ev);

// ---

bool B_CheckAxisPosition(BindingCondition::ControlTest test, float testPos, float pos);
bool B_CheckAxisPosition(Binding::ControlTest test, float testPos, float pos);

/**
* @param cond State condition to check.
* @param localNum Local player number.
* @param context Relevant binding context, if any (may be @c nullptr).
*/
bool B_CheckCondition(BindingCondition const *cond, int localNum, BindContext *context);
bool B_CheckCondition(de::Record const *cond, int localNum, BindContext *context);

bool B_EqualConditions(BindingCondition const &a, BindingCondition const &b);
bool B_EqualConditions(de::Record const &a, de::Record const &b);

// ---------------------------------------------------------------------------------

Expand Down
84 changes: 37 additions & 47 deletions doomsday/client/include/ui/binding.h
Expand Up @@ -32,52 +32,36 @@
class Binding : public de::RecordAccessor
{
public:
/**
* Describes a single trigger condition.
*/
struct Condition
/// Base class for binding configuration errors. @ingroup errors
DENG2_ERROR(ConfigureError);

enum ConditionType
{
enum Type
{
Invalid,

GlobalState, ///< Related to the high-level application/game state.

AxisState, ///< An axis control is in a specific position.
ButtonState, ///< A button control is in a specific state.
HatState, ///< A hat control is pointing in a specific direction.
ModifierState, ///< A control modifier is in a specific state.
};
Type type { Invalid };

enum ControlTest
{
None,

AxisPositionWithin,
AxisPositionBeyond,
AxisPositionBeyondPositive,
AxisPositionBeyondNegative,

ButtonStateAny,
ButtonStateDown,
ButtonStateRepeat,
ButtonStateDownOrRepeat,
ButtonStateUp
};
ControlTest test { None };

int device = -1; ///< The relevant input device; otherwise @c -1
int id = -1; ///< device-control / impulse ID; otherwise @c -1.
float pos = 0; ///< Axis-position / hat-angle; otherwise @c 0.
bool negate = false; ///< Test the inverse (e.g., not in a specific state).
bool multiplayer = false; ///< Only for multiplayer.
Invalid,

GlobalState, ///< Related to the high-level application/game state.

AxisState, ///< An axis control is in a specific position.
ButtonState, ///< A button control is in a specific state.
HatState, ///< A hat control is pointing in a specific direction.
ModifierState, ///< A control modifier is in a specific state.
};
typedef QVector<Condition> Conditions;
Conditions conditions; ///< Additional conditions.

/// Base class for binding configuration errors. @ingroup errors
DENG2_ERROR(ConfigureError);
enum ControlTest
{
None,

AxisPositionWithin,
AxisPositionBeyond,
AxisPositionBeyondPositive,
AxisPositionBeyondNegative,

ButtonStateAny,
ButtonStateDown,
ButtonStateRepeat,
ButtonStateDownOrRepeat,
ButtonStateUp
};

public:
Binding() : RecordAccessor(0) {}
Expand All @@ -103,14 +87,23 @@ class Binding : public de::RecordAccessor
/**
* Inserts the default members into the binding. All bindings are required to
* implement this, as it is automatically called when configuring a binding.
*
* All bindings share some common members, so derived classes are required to
* call this before inserting their own members.
*/
virtual void resetToDefaults() = 0;
virtual void resetToDefaults();

/**
* Generates a textual descriptor for the binding, including any state conditions.
*/
virtual de::String composeDescriptor() = 0;

de::Record &addCondition();
int conditionCount() const;
bool hasCondition(int index) const;
de::Record &condition(int index);
de::Record const &condition(int index) const;

/**
* Compare the binding conditions with @a other and return @c true if equivalent.
*/
Expand All @@ -128,7 +121,4 @@ class Binding : public de::RecordAccessor
static void resetIdentifiers();
};

typedef Binding::Condition BindingCondition;
typedef Binding::Conditions BindingConditions;

#endif // CLIENT_INPUTSYSTEM_BINDING_H

0 comments on commit b6ebb23

Please sign in to comment.