Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 30, 2008, 3:02:03 PM (16 years ago)
Author:
rgrieder
Message:
  • fixed the InputBufferListener bug in a proper way It looks a little bit ugly, but at least it's got a new feature: You don't need to derive from InputBufferListener (removed it)
  • commented the shader hack in Model.cc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/core/InputBuffer.h

    r1461 r1486  
    4040namespace orxonox
    4141{
    42     class _CoreExport InputBufferListener
    43     {};
     42    class BaseInputBufferListenerTuple
     43    {
     44    public:
     45        BaseInputBufferListenerTuple(bool bListenToAllChanges, bool bOnlySingleInput,
     46            bool trueKeyFalseChar, char _char, KeyCode::Enum key)
     47            : bListenToAllChanges_(bListenToAllChanges), bOnlySingleInput_(bOnlySingleInput),
     48              trueKeyFalseChar_(trueKeyFalseChar), char_(_char), key_(key)
     49        { }
     50        virtual void callFunction() = 0;
     51        bool bListenToAllChanges_;
     52        bool bOnlySingleInput_;
     53        bool trueKeyFalseChar_;
     54        char char_;
     55        KeyCode::Enum key_;
     56    };
     57
     58    template <class T>
     59    class InputBufferListenerTuple : public BaseInputBufferListenerTuple
     60    {
     61    public:
     62        InputBufferListenerTuple(T* listener, void (T::*function)(), bool bListenToAllChanges,
     63            bool bOnlySingleInput, bool trueKeyFalseChar, char _char, KeyCode::Enum key)
     64            : BaseInputBufferListenerTuple(bListenToAllChanges, bOnlySingleInput, trueKeyFalseChar, _char, key),
     65              listener_(listener), function_(function)
     66        { }
     67        void InputBufferListenerTuple::callFunction()
     68        {
     69            (listener_->*function_)();
     70        }
     71        T* listener_;
     72        void (T::*function_)();
     73    };
    4474
    4575    class _CoreExport InputBuffer : public KeyHandler, public OrxonoxClass
    4676    {
    47         struct InputBufferListenerTuple
    48         {
    49             InputBufferListener* listener_;
    50             void (InputBufferListener::*function_)();
    51             bool bListenToAllChanges_;
    52             bool bOnlySingleInput_;
    53             bool trueKeyFalseChar_;
    54             char char_;
    55             KeyCode::Enum key_;
    56         };
    57 
    5877        public:
    5978            InputBuffer();
     
    6584            void registerListener(T* listener, void (T::*function)(), bool bOnlySingleInput)
    6685            {
    67                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned};
    68                 // TODO: this is a major hack!!!
    69                 // Fix it properly
    70                 *((int*)(&newListener.listener_)) = (int)(listener);
    71 
    72                 this->listeners_.insert(this->listeners_.end(), newListener);
     86                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned);
     87                this->listeners_.insert(this->listeners_.end(), newTuple);
    7388            }
    7489            template <class T>
    7590            void registerListener(T* listener, void (T::*function)() const, bool bOnlySingleInput)
    7691            {
    77                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned};
    78                 *((int*)(&newListener.listener_)) = (int)(listener);
    79                 this->listeners_.insert(this->listeners_.end(), newListener);
     92                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned);
     93                this->listeners_.insert(this->listeners_.end(), newTuple);
    8094            }
    81 
    8295            template <class T>
    8396            void registerListener(T* listener, void (T::*function)(), char _char, bool bOnlySingleInput)
    8497            {
    85                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned};
    86                 *((int*)(&newListener.listener_)) = (int)(listener);
    87                 this->listeners_.insert(this->listeners_.end(), newListener);
     98                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned);
     99                this->listeners_.insert(this->listeners_.end(), newTuple);
    88100            }
    89101            template <class T>
    90102            void registerListener(T* listener, void (T::*function)() const, char _char, bool bOnlySingleInput)
    91103            {
    92                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned};
    93                 *((int*)(&newListener.listener_)) = (int)(listener);
    94                 this->listeners_.insert(this->listeners_.end(), newListener);
     104                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned);
     105                this->listeners_.insert(this->listeners_.end(), newTuple);
    95106            }
    96107
     
    98109            void registerListener(T* listener, void (T::*function)(), KeyCode::Enum key)
    99110            {
    100                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, true, true, '\0', key};
    101                 *((int*)(&newListener.listener_)) = (int)(listener);
    102                 this->listeners_.insert(this->listeners_.end(), newListener);
     111                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, true, true, '\0', key);
     112                this->listeners_.insert(this->listeners_.end(), newTuple);
    103113            }
    104114            template <class T>
    105115            void registerListener(T* listener, void (T::*function)() const, KeyCode::Enum key)
    106116            {
    107                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, true, true, '\0', key};
    108                 *((int*)(&newListener.listener_)) = (int)(listener);
    109                 this->listeners_.insert(this->listeners_.end(), newListener);
     117                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, true, true, '\0', key);
     118                this->listeners_.insert(this->listeners_.end(), newTuple);
    110119            }
    111120
    112             void unregisterListener(InputBufferListener* listener);
     121            template <class T>
     122            void unregisterListener(T* listener)
     123            {
     124                for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
     125                {
     126                    InputBufferListenerTuple<T>* refListener = dynamic_cast<InputBufferListenerTuple<T>*>(*it);
     127                    if (refListener && refListener->listener_ == listener)
     128                        this->listeners_.erase(it++);
     129                    else
     130                        it++;
     131                }
     132            }
    113133
    114134            void set(const std::string& input, bool update = true);
     
    151171
    152172            std::string buffer_;
    153             std::list<InputBufferListenerTuple> listeners_;
     173            std::list<BaseInputBufferListenerTuple*> listeners_;
    154174            std::string allowedChars_;
    155175            unsigned int cursor_;
Note: See TracChangeset for help on using the changeset viewer.