@@ -332,27 +332,33 @@ static const char* const TheCommandUsableInNames[] =
332332};
333333
334334// -------------------------------------------------------------------------------
335- // ClickState sets for Command Set Override.
336- enum ClickState CPP_11 (: Int)
335+ // MouseState sets for Command Set Override.
336+ enum MouseState CPP_11 (: Int)
337337{
338- CLICK_NONE = 0 ,
338+ STATE_NONE = 0 ,
339339 LEFT_CLICK ,
340340 RIGHT_CLICK ,
341341 MIDDLE_CLICK ,
342342 LEFT_DOUBLE_CLICK ,
343343 RIGHT_DOUBLE_CLICK ,
344- MIDDLE_DOUBLE_CLICK
344+ MIDDLE_DOUBLE_CLICK ,
345+ SCROLL_DOWN ,
346+ SCROLL_UP ,
347+
348+ MOUSE_STATE_COUNT
345349};
346350
347- static const LookupListRec ClickNames [] =
351+ static const LookupListRec MouseStateNames [] =
348352{
349- { " NONE" , CLICK_NONE },
353+ { " NONE" , STATE_NONE },
350354 { " LEFT_CLICK" , LEFT_CLICK },
351355 { " RIGHT_CLICK" , RIGHT_CLICK },
352356 { " MIDDLE_CLICK" , MIDDLE_CLICK },
353357 { " LEFT_DOUBLE_CLICK" , LEFT_DOUBLE_CLICK },
354358 { " RIGHT_DOUBLE_CLICK" , RIGHT_DOUBLE_CLICK },
355359 { " MIDDLE_DOUBLE_CLICK" , MIDDLE_DOUBLE_CLICK },
360+ { " SCROLL_DOWN" , SCROLL_DOWN },
361+ { " SCROLL_UP" , SCROLL_UP },
356362 { nullptr , 0 }
357363};
358364
@@ -368,9 +374,13 @@ class MetaMapRec : public MemoryPoolObject
368374 MappableKeyModState m_modState; // /< the required state of the ctrl-alt-shift keys
369375 CommandUsableInType m_usableIn; // /< the allowed place the command can be used in
370376 // Next fields are added for Key mapping Dialog
371- AsciiString m_commandModifierKey;
372- ClickState m_commandModifierClickToTrigger;
373- MappableKeyCategories m_category; // /< This is the catagory the key falls under
377+ std::vector<AsciiString> m_commandModifierKeys;
378+ std::vector<AsciiString> m_commandModifierButtonsToTrigger;
379+ Bool m_commandModifierNeedsButtonEnabled;
380+ Bool m_commandModifierIsSingular;
381+ Bool m_commandModifierIsRandom;
382+ Bool m_commandModifierStopsAtTop;
383+ MappableKeyCategories m_category; // /< This is the category the key falls under
374384 UnicodeString m_description; // /< The description string for the keys
375385 UnicodeString m_displayName; // /< The display name of our command
376386};
@@ -396,26 +406,83 @@ class MetaEventTranslator : public GameMessageTranslator
396406 virtual GameMessageDisposition translateGameMessage (const GameMessage *msg);
397407};
398408
409+ struct MouseModifierKeysList
410+ {
411+ std::vector<AsciiString> Keys;
412+ std::vector<AsciiString> KeysButtonNeedsEnable;
413+ std::vector<AsciiString> KeysSingular;
414+ std::vector<AsciiString> KeysRandom;
415+ std::vector<AsciiString> KeysStopsAtTop;
416+
417+ MouseModifierKeysList ()
418+ {
419+ Keys.clear ();
420+ KeysButtonNeedsEnable.clear ();
421+ KeysSingular.clear ();
422+ KeysRandom.clear ();
423+ KeysStopsAtTop.clear ();
424+ }
425+ };
426+
427+ // ------------------------------------------------------------------------------------------------
428+ class MouseModifierKeyTemplate
429+ {
430+ friend class MetaMap ;
431+ private:
432+ MouseState m_mouseState;
433+ Bool m_keyRequireEnabled;
434+ Bool m_isSingular;
435+ Bool m_isRandom;
436+ Bool m_stopsAtTop;
437+ std::vector<AsciiString> m_keys;
438+ std::vector<AsciiString> m_commandButtonsToTrigger;
439+
440+ public:
441+ MouseModifierKeyTemplate ()
442+ {
443+ m_mouseState = STATE_NONE ;
444+ m_keyRequireEnabled = FALSE ;
445+ m_isSingular = FALSE ;
446+ m_isRandom = FALSE ;
447+ m_stopsAtTop = FALSE ;
448+ m_keys.clear ();
449+ m_commandButtonsToTrigger.clear ();
450+ }
451+
452+ void reset ()
453+ {
454+ m_mouseState = STATE_NONE ;
455+ m_keyRequireEnabled = FALSE ;
456+ m_isSingular = FALSE ;
457+ m_isRandom = FALSE ;
458+ m_stopsAtTop = FALSE ;
459+ m_keys.clear ();
460+ m_commandButtonsToTrigger.clear ();
461+ }
462+
463+ static void parseMouseModifierKeyTemplate (INI * ini, void *instance, void * store, const void * /* userData*/ );
464+ };
465+
399466// -----------------------------------------------------------------------------
400467class MetaMap : public SubsystemInterface
401468{
402469 friend class MetaEventTranslator ;
403470
404471private:
472+ MouseModifierKeyTemplate mouseModifierKeyParser;
405473 MetaMapRec *m_metaMaps;
474+
406475 std::vector<MappableKeyType> m_doubleDownKeysVec;
407- std::vector<AsciiString> m_leftClickCommandModifiersMeta;
408- std::vector<AsciiString> m_rightClickCommandModifiersMeta;
409- std::vector<AsciiString> m_middleClickCommandModifiersMeta;
410- std::vector<AsciiString> m_leftDoubleClickCommandModifiersMeta;
411- std::vector<AsciiString> m_rightDoubleClickCommandModifiersMeta;
412- std::vector<AsciiString> m_middleDoubleClickCommandModifiersMeta;
476+
477+ typedef std::hash_map< AsciiString, MouseModifierKeysList, rts::hash<AsciiString>, rts::equal_to<AsciiString> > MouseModifierKeySpecificMap;
478+ MouseModifierKeysList m_mouseModifierKeysUniversal[MOUSE_STATE_COUNT ];
479+ MouseModifierKeySpecificMap m_mouseModifierKeysSpecific[MOUSE_STATE_COUNT ];
413480
414481protected:
415482 GameMessage::Type findGameMessageMetaType (const char * name);
416483 MetaMapRec *getMetaMapRec (GameMessage::Type t);
417484 void pushDoubleDownKeyList (MappableKeyType m);
418- void setClickCommandModifiersMeta ( ClickState clickType, const AsciiString& key );
485+ void doMouseCommandModifierParsing ( );
419486
420487public:
421488
@@ -427,13 +494,14 @@ class MetaMap : public SubsystemInterface
427494 void update () { }
428495
429496 static void parseMetaMap (INI * ini);
497+ static void parseMouseCommandModifierDefinition (INI * ini);
430498
431499 // TheSuperHackers @info Function to generate default key mappings
432500 // for actions that were not found in a CommandMap.ini
433501 static void generateMetaMap ();
434502
435503 const MetaMapRec *getFirstMetaMapRec () const { return m_metaMaps; }
436- const std::vector< AsciiString>& getClickCommandModifiersMeta ( ClickState clickType ) const ;
504+ MouseModifierKeysList getMouseCommandModifiersMeta ( MouseState mouseInput, const AsciiString& commandButtonName ) const ;
437505 Bool hasDoubleDownKey (MappableKeyType m) const ;
438506};
439507
0 commit comments