summaryrefslogblamecommitdiff
path: root/src/keyboardconfig.h
blob: 79719518b6ffc1d84236867e8517e58b1f27f3d8 (plain) (tree)
1
2
3
4
5
6
7


                                                                    

                                                    
  
                                             


















                                                                         
                         
 
                       
                    

              
                 

                 

                






                                                    






















                                                               




                                                                       
                                    





























                                                                        
                                                






                                                                         











                                                                            

                                                                  
                                                                   

           













                                                                            
                                               









                                                                            
                                             









                                                                    

                                                      

                                                             

                                                               

                           



                                                   





                                                                              
                                                                                 


                                                                            
                                    




                               
/*
 *  Custom keyboard shortcuts configuration
 *  Copyright (C) 2007  Joshua Langley <joshlangley@optusnet.com.au>
 *  Copyright (C) 2009-2010  The Mana Developers
 *  Copyright (C) 2011-2012  The ManaPlus Developers
 *
 *  This file is part of The ManaPlus Client.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef KEYBOARDCONFIG_H
#define KEYBOARDCONFIG_H

#include <SDL_types.h>
#include <SDL_keyboard.h>

#include "inputevent.h"
#include "keydata.h"

#include <map>
#include <string>
#include <vector>

union SDL_Event;

typedef std::vector<int> KeysVector;
typedef KeysVector::iterator KeysVectorIter;
typedef KeysVector::const_iterator KeysVectorCIter;

typedef std::map<int, KeysVector> KeyToActionMap;
typedef KeyToActionMap::iterator KeyToActionMapIter;

enum KeyTypes
{
    INPUT_UNKNOWN = 0,
    INPUT_KEYBOARD = 1,
    INPUT_MOUSE = 2,
    INPUT_JOYSTICK = 3
};

struct KeyItem
{
    KeyItem() : type(-1), value(-1)
    { }

    KeyItem(int type0, int value0) : type(type0), value(value0)
    { }

    int type;

    int value;
};

#define KeyFunctionSize 3

/**
 * Each key represents a key function. Such as 'Move up', 'Attack' etc.
 */
struct KeyFunction
{
    KeyItem values[KeyFunctionSize];
};

class Setup_Keyboard;

class KeyboardConfig
{
    public:
        /**
         * Initializes the keyboard config explicitly.
         */
        void init();

        /**
         * Retrieve the key values from config file.
         */
        void retrieve();

        /**
         * Store the key values to config file.
         */
        void store();

        /**
         * Make the keys their default values.
         */
        void makeDefault();

        /**
         * Determines if any key assignments are the same as each other.
         */
        bool hasConflicts(int &key1, int &key2);

        /**
         * Calls a function back so the key re-assignment(s) can be seen.
         */
        void callbackNewKey();

        /**
         * Get the index of the new key to be assigned.
         */
        int getNewKeyIndex() const
        { return mNewKeyIndex; }

        /**
         * Get the enable flag, which will stop the user from doing actions.
         */
        bool isEnabled() const
        { return mEnabled; }

        /**
         * Get the key function index by providing the keys value.
         */
        int getKeyIndex(const SDL_Event &event, int grp = 1) const;

        /**
         * Set the enable flag, which will stop the user from doing actions.
         */
        void setEnabled(bool flag)
        { mEnabled = flag; }

        /**
         * Set the index of the new key to be assigned.
         */
        void setNewKeyIndex(int value)
        { mNewKeyIndex = value; }

        /**
         * Set the value of the new key.
         */
        void setNewKey(const SDL_Event &event);

        /**
         * Set a reference to the key setup window.
         */
        void setSetupKeyboard(Setup_Keyboard *setupKey)
        { mSetupKey = setupKey; }

        /**
         * Checks if the key is active, by providing the key function index.
         */
        bool isActionActive(int index) const;

        /**
         * Takes a snapshot of all the active keys.
         */
        void refreshActiveKeys();

        std::string getKeyValueString(int index) const;

        std::string getKeyShortString(const std::string &key) const;

        std::string getKeyStringLong(int index) const;

        SDLKey getKeyFromEvent(const SDL_Event &event) const;

        int getKeyValueFromEvent(const SDL_Event &event) const;

        void unassignKey();

        void updateKeyActionMap();

        bool triggerAction(const SDL_Event &event);

    private:
        int mNewKeyIndex;              /**< Index of new key to be assigned */
        bool mEnabled;                 /**< Flag to respond to key input */

        Setup_Keyboard *mSetupKey;     /**< Reference to setup window */

        KeyFunction mKey[Input::KEY_TOTAL];   /**< Pointer to all the key data */

        Uint8 *mActiveKeys;            /**< Stores a list of all the keys */

        KeyToActionMap mKeyToAction;
};

extern KeyboardConfig keyboard;

#endif