123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #ifndef _GuiGameListOptionsCtrl_H_
- #define _GuiGameListOptionsCtrl_H_
- #include "gui/controls/guiGameListMenuCtrl.h"
- /// \class GuiGameListOptionsCtrl
- /// A control for showing pages of options that are gamepad friendly.
- class GuiGameListOptionsCtrl : public GuiGameListMenuCtrl
- {
- typedef GuiGameListMenuCtrl Parent;
- protected:
- /// \struct Row
- /// An extension to the parent's row, adding the ability to keep a collection
- /// of options and track status related to them.
- struct Row : public Parent::Row
- {
- Vector<StringTableEntry> mOptions; ///< Collection of options available to display
- S32 mSelectedOption; ///< Index into mOptions pointing at the selected option
- bool mWrapOptions; ///< Determines if options should "wrap around" at the ends
- enum Mode
- {
- Default = 0,
- OptionsList,
- Keybind
- };
- Mode mMode;
- Row() : mSelectedOption(0), mWrapOptions(false), mMode(Mode::Default)
- {
- VECTOR_SET_ASSOCIATION( mOptions );
- }
- };
- public:
- /// Gets the text for the currently selected option of the given row.
- ///
- /// \param rowIndex Index of the row to get the option from.
- /// \return A string representing the text currently displayed as the selected
- /// option on the given row. If there is no such displayed text then the empty
- /// string is returned.
- StringTableEntry getCurrentOption(S32 rowIndex) const;
- /// Attempts to set the given row to the specified selected option. The option
- /// will only be set if the option exists in the control.
- ///
- /// \param rowIndex Index of the row to set an option on.
- /// \param option The option to be made active.
- /// \return True if the row contained the option and was set, false otherwise.
- bool selectOption(S32 rowIndex, StringTableEntry option);
- /// Sets the list of options on the given row.
- ///
- /// \param rowIndex Index of the row to set options on.
- /// \param optionsList A tab separated list of options for the control.
- void setOptions(S32 rowIndex, const char * optionsList);
- /// Adds a row to the control.
- ///
- /// \param label The text to display on the row as a label.
- /// \param optionsList A tab separated list of options for the control.
- /// \param wrapOptions Specify true to allow options to wrap at the ends or
- /// false to prevent wrapping.
- /// \param callback [optional] Name of a script function to use as a callback
- /// when this row is activated. Default NULL means no callback.
- /// \param icon [optional] Index of the icon to use as a marker. Default -1
- /// means no icon will be shown on this row.
- /// \param yPad [optional] An extra amount of height padding before the row.
- /// \param enabled [optional] If this row is initially enabled. Default true.
- void addRow(const char* label, const char* optionsList, bool wrapOptions, const char* callback, S32 icon = -1, S32 yPad = 0, bool enabled = true);
- void onRender(Point2I offset, const RectI &updateRect);
- /// Callback when the mouse button is released.
- ///
- /// \param event A reference to the event that triggered the callback.
- void onMouseUp(const GuiEvent &event);
- /// Callback when a key is pressed.
- ///
- /// \param event The event that triggered this callback.
- bool onKeyDown(const GuiEvent &event);
- /// Callback when a key is repeating.
- ///
- /// \param event The event that triggered this callback.
- bool onKeyRepeat(const GuiEvent &event){ return onKeyDown(event); }
- /// Callback when the gamepad axis is activated.
- ///
- /// \param event A reference to the event that triggered the callback.
- virtual bool onGamepadAxisLeft(const GuiEvent &event);
- /// Callback when the gamepad axis is activated.
- ///
- /// \param event A reference to the event that triggered the callback.
- virtual bool onGamepadAxisRight(const GuiEvent &event);
- virtual void clearRows();
- GuiGameListOptionsCtrl();
- ~GuiGameListOptionsCtrl();
- DECLARE_CONOBJECT(GuiGameListOptionsCtrl);
- DECLARE_DESCRIPTION( "A control for showing pages of options that are gamepad friendly." );
-
- virtual bool onAdd();
- /// Initializes fields accessible through the console.
- static void initPersistFields();
- static const S32 NO_OPTION = -1; ///< Indicates there is no option
- protected:
- /// Checks to make sure our control has a profile of the correct type.
- ///
- /// \return True if the profile is of type GuiGameListOptionsProfile or false
- /// if the profile is of any other type.
- bool hasValidProfile() const;
- /// Enforces the validity of the fields on this control and its profile (if the
- /// profile is valid, see: hasValidProfile).
- void enforceConstraints();
- /// Adds lines around the column divisions to the feedback already provided
- /// in the Parent.
- void onDebugRender(Point2I offset);
- private:
- /// Performs a click on the current option row. The x position is used to
- /// determine if the left or right arrow were clicked. If one was clicked, the
- /// option will be changed. If neither was clicked, the option is unaffected.
- /// This method should only be called when there is an actively selected row.
- ///
- /// \param row The row to perform the click on.
- /// \param xPos The x position of the the click, relative to the control.
- void clickOption(Row * row, S32 xPos);
- /// Changes the option on the currently selected row. If there is no row
- /// selected, this method does nothing.
- ///
- /// \param delta The amount to change the option selection by. Typically this
- /// will be 1 or -1.
- void changeOption(S32 delta);
- /// Changes the option on the given row.
- ///
- /// \param row The row to change the option on.
- /// \param delta The amount to change the option selection by. Typically this
- /// will be 1 or -1.
- void changeOption(Row * row, S32 delta);
- };
- /// \class GuiGameListOptionsProfile
- /// A gui profile with additional fields specific to GuiGameListOptionsCtrl.
- class GuiGameListOptionsProfile : public GuiGameListMenuProfile
- {
- typedef GuiGameListMenuProfile Parent;
- public:
- /// Enforces range constraints on all required fields.
- void enforceConstraints();
- GuiGameListOptionsProfile();
- S32 mColumnSplit; ///< Absolute position of the split between columns
- S32 mRightPad; ///< Extra padding between the right arrow and the hit area
- DECLARE_CONOBJECT(GuiGameListOptionsProfile);
- /// Initializes fields accessible through the console.
- static void initPersistFields();
- };
- #endif
|