summaryrefslogtreecommitdiff
path: root/public/panorama/textinput/textinput_dualtouch.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/panorama/textinput/textinput_dualtouch.h')
-rw-r--r--public/panorama/textinput/textinput_dualtouch.h228
1 files changed, 228 insertions, 0 deletions
diff --git a/public/panorama/textinput/textinput_dualtouch.h b/public/panorama/textinput/textinput_dualtouch.h
new file mode 100644
index 0000000..f7cb4ab
--- /dev/null
+++ b/public/panorama/textinput/textinput_dualtouch.h
@@ -0,0 +1,228 @@
+//=========== Copyright Valve Corporation, All rights reserved. ===============//
+//
+// Purpose: QWERTY keyboard text entry method for Steam controller
+//=============================================================================//
+
+#ifndef PANORAMA_TEXTINPUT_DUALTOUCH_H
+#define PANORAMA_TEXTINPUT_DUALTOUCH_H
+
+#include "panorama/textinput/textinput.h"
+#include "panorama/controls/panel2d.h"
+#include "panorama/controls/label.h"
+#include "panorama/input/iuiinput.h"
+#include "mathlib/beziercurve.h"
+#include "tier1/utlptr.h"
+#include "panorama/uischeduleddel.h"
+
+namespace panorama
+{
+
+ // Forward declaration
+ class CTextInputDualTouch;
+ class CTextEntry;
+ class ITextInputSuggest;
+ class CLabel;
+
+ // this weights the frequency of words typed without any possible typos above
+ // autocorrected words, as otherwise if you legitimately type 'test' it'll
+ // auto-correct into 'rest'
+ static const float k_flExactWordFrequencyWeight = 1.2f;
+
+ class CTextInputDualTouch : public panorama::CTextInputHandler
+ {
+ DECLARE_PANEL2D( CTextInputDualTouch, panorama::CPanel2D );
+
+ public:
+ // Constructor
+ CTextInputDualTouch( panorama::IUIWindow *pParent, const CTextInputHandlerSettings &settings, ITextInputControl *pTextControl );
+ CTextInputDualTouch( panorama::CPanel2D *parent, const CTextInputHandlerSettings &settings, ITextInputControl *pTextControl );
+
+ // Destructor
+ ~CTextInputDualTouch();
+
+ // CTextInputHandler overrides
+ virtual void OpenHandler() OVERRIDE;
+ virtual void CloseHandlerImpl( bool bCommitText ) OVERRIDE;
+ virtual ETextInputHandlerType_t GetType() OVERRIDE;
+ virtual ITextInputControl *GetControlInterface() OVERRIDE;
+ virtual void SuggestWord( const wchar_t *pwch, int ich ) OVERRIDE;
+ virtual void SetYButtonAction( const char *pchLabel, IUIEvent *pEvent ) OVERRIDE;
+
+ static void GetSupportedLanguages( CUtlVector<ELanguage> &vecLangs );
+
+ private:
+ static const int k_DualTouchRowCount = 4;
+ static const int k_DualTouchColumnCount = 11;
+ static const int k_SuggestionCount = 4;
+
+ enum EDualTouchModifier_t
+ {
+ k_EDualTouchModifierNone = 0,
+ k_EDualTouchModifierShift = 1,
+ k_EDualTouchModifierAlt = 2,
+ k_EDualTouchModifierCount = 3,
+ };
+
+ class CTouchPad
+ {
+ public:
+ bool Initialize( CTextInputDualTouch *pParent, const char *pointerID, const char *padID,
+ IUIEngine::EHapticFeedbackPosition eHapticsPosition );
+ void UpdatePointerState( bool bPointersEnabled, uint32 nTextureID );
+ void OnTouch( void );
+ void OnRelease( void );
+ bool OnMove( float touchX, float touchY );
+ void OnButtonDown( void );
+
+ SteamPadPointer_t m_renderPointerState;
+
+ CPanel2D *m_pPointerPanel;
+ CPanel2D *m_pPadPanel;
+ CPanel2D *m_pHoverKey; // what key are we currently hovering over?
+ CPanel2D *m_pLastHoverKey; // what was the last key we were hovering over? this will either match m_pHoverKey or have the last value m_pHoverKey had if its currently nullptr
+ CUtlVector< IUIPanel * > m_vecTouchKeys;
+ bool m_bFingerOnPad;
+
+ float m_hoverX;
+ float m_hoverY;
+
+ CTextInputDualTouch *m_pTextInputDualTouch;
+
+ IUIEngine::EHapticFeedbackPosition m_eHapticsPosition;
+ };
+
+ void Initialize( const CTextInputHandlerSettings &settings, ITextInputControl *pTextControl );
+ void SetMode( ETextInputMode_t mode );
+
+ // CPanel2D overrides
+ virtual bool OnGamePadUp( const panorama::GamePadData_t &code ) OVERRIDE;
+ virtual bool OnGamePadDown( const panorama::GamePadData_t &code ) OVERRIDE;
+ virtual bool OnGamePadAnalog( const panorama::GamePadData_t &code ) OVERRIDE;
+ virtual bool OnKeyTyped( const KeyData_t &unichar ) OVERRIDE;
+ virtual bool OnKeyDown( const KeyData_t &code ) OVERRIDE;
+ virtual bool OnKeyUp( const KeyData_t &code ) OVERRIDE;
+
+ void UpdateSteamPadPointers( void );
+ bool OnPropertyTransitionEnd( const CPanelPtr< IUIPanel > &pPanel, CStyleSymbol prop );
+ bool OnRemoveStyleFromLinkedKeys( CPanelPtr<CPanel2D> pPanel, const char *pszStyle );
+
+ bool TouchPadClicked( CTouchPad* pTouchPad );
+
+ // Listen for focus lost
+ bool HandleInputFocusLost( const panorama::CPanelPtr< panorama::IUIPanel > &ptrPanel );
+ bool OnActiveControllerTypeChanged( EActiveControllerType eActiveControllerType );
+
+ bool BConvertNextSpaceToPeriod( void );
+ bool TypeWchar( uchar16 wch, const char *pUTFf8Char = NULL );
+ bool TypeKeyDown( panorama::KeyCode eCode );
+
+ bool SwitchLanguage( void );
+ bool LoadInputConfigurationFile( ELanguage language );
+ bool LoadInputConfigurationFile( char const *szConfigFile, const char *szConfigRootDir );
+ bool LoadConfigurationBuffer( char const *pszIncoming );
+
+ void SetModifierKeyState( EDualTouchModifier_t modifier, bool bIsButtonPressEvent );
+ EDualTouchModifier_t CalculateDesiredModifierState() const;
+ void ApplyCurrentModifierLayout();
+
+ void TouchKeyClicked( CPanel2D *pTouchKey, CTouchPad *pTouchPad );
+
+ // Process scheduled key repeat
+ void ScheduleKeyRepeats( panorama::GamePadCode eCode );
+ void CancelOutstandingRepeats() { ScheduleKeyRepeats( XK_NULL ); }
+
+ void ScheduledKeyRepeatFunction();
+
+ // auto-suggestion
+ void ClearSuggestionVisual( void )
+ {
+ for ( int i = 0; i < k_SuggestionCount; i++ )
+ {
+ m_pSuggestionLabels[i]->SetText( "" );
+ }
+ }
+ void ClearSuggestionState( bool bFlush = true )
+ {
+ // flush what we have into the buffer
+ if ( bFlush && m_vecPossibleWordsBeingTyped.Count() )
+ {
+ CStrAutoEncode s( m_vecPossibleWordsBeingTyped[0] );
+ m_pTextInputControl->InsertCharactersAtCursor( s.ToWString(), V_wcslen( s.ToWString() ) );
+ }
+ m_vecPossibleWordsBeingTyped.Purge();
+ ClearSuggestionVisual();
+ UpdateTextPreview();
+ }
+ void ProcessSuggestions( void );
+ void ApplySuggestion( int iSuggestion );
+ void UpdateTextPreview( void );
+
+ bool PerformBackspace( void );
+
+ void CursorMove( const panorama::GamePadData_t &code );
+ void DisableCursorMode( void );
+
+ private:
+ void ChangeTouchkeyStyle( CPanel2D *pTouchKey, const char *pchStyle, bool bAddStyle );
+
+ public:
+ ITextInputControl *m_pTextInputControl; // control interface for moving text input between a control and daisy wheel
+
+ CPanel2D *m_pBodyContainer;
+
+ IUIEvent *m_pYbuttonAction; // the action to fire if the Y button is hit
+ CLabel *m_pYButtonText; // label for ybutton text
+ CLabel *m_pLang;
+
+ CLabel *m_pSuggestionLabels[k_SuggestionCount];
+ CUtlVector< CUtlString > m_vecPossibleWordsBeingTyped;
+
+ ELanguage m_language; // currently loaded language
+
+ ITextInputSuggest *m_pSuggest; // suggestion engine
+
+ CTextEntry *m_pTextPreview;
+
+ bool m_bDoubleSpaceToDotSpace;
+ bool m_bOnlySpacesEnteredSinceBackspace;
+
+ ETextInputMode_t m_mode;
+
+ bool m_bAutoComplete;
+ bool m_bDisplaySuggestions;
+ bool m_bHidePreviewField;
+ bool m_bAutoCaps;
+
+ // This controls the direct-rendered steampad crosshairs; we can only
+ // have them up while we're not animating around, otherwise use higher-latency
+ // panel crosshairs
+ bool m_bSteamPadPointersEnabled;
+ IImageSource *m_pSteamPadPointerImage;
+
+ CTouchPad m_leftTouchPad;
+ CTouchPad m_rightTouchPad;
+
+ CUtlVector< CTouchPad * > m_vecTouchPads;
+
+ uchar32 m_keyLayout[k_DualTouchColumnCount][k_DualTouchRowCount][k_EDualTouchModifierCount];
+ EDualTouchModifier_t m_currentModifier;
+ int m_iCharactersTypedSinceModifierStateChanged;
+
+ // Tracking key repeats
+ CCubicBezierCurve< Vector2D > m_repeatCurve; // Curve for key repeats
+ double m_repeatStartTime; // Time when the key was initially pressed
+ double m_repeatNextTime; // Time when the key will repeat next
+ panorama::GamePadCode m_repeatGamePadCode; // Which key was pressed (low level, for key-up tracking)
+ uint32 m_repeatCounter; // How many key repeats have happened
+ panorama::CUIScheduledDel m_repeatFunction; // Scheduled function triggering key repeats
+
+ bool m_bCursorMode;
+ CPanel2D *m_pCursorKey;
+ bool m_bUseTouchPads;
+
+ bool m_bModifierKeysHeld[ k_EDualTouchModifierCount ];
+ };
+
+} // namespace panorama
+
+#endif // PANORAMA_TEXTINPUT_DUALTOUCH_H \ No newline at end of file