241 lines
7.3 KiB
C
241 lines
7.3 KiB
C
|
// Copyright (C) 2007 Id Software, Inc.
|
||
|
//
|
||
|
|
||
|
#ifndef __GAME_GUIS_USERINTERFACEEDITW_H__
|
||
|
#define __GAME_GUIS_USERINTERFACEEDITW_H__
|
||
|
|
||
|
#include "UserInterfaceTypes.h"
|
||
|
#include "UIEditHelper.h"
|
||
|
|
||
|
//===============================================================
|
||
|
//
|
||
|
// sdUIEditW
|
||
|
//
|
||
|
//===============================================================
|
||
|
|
||
|
extern const char sdUITemplateFunctionInstance_IdentifierEditW[];
|
||
|
|
||
|
SD_UI_PUSH_CLASS_TAG( sdUIEditW )
|
||
|
SD_UI_CLASS_INFO_TAG(
|
||
|
/* ============ */
|
||
|
"The wide edit window type has the same functionality as the regular edit window, but it supports wide strings for non ASCII input. " \
|
||
|
"It is mainly used when typing messages to friends or in the chat window.\n\n" \
|
||
|
|
||
|
"Templates are used to decrease the amount of text needed to create an edit box, the _editw/_editw_scroll and _end_edit/_end_editw_scroll templates should be used."
|
||
|
/* ============ */
|
||
|
)
|
||
|
SD_UI_CLASS_EXAMPLE_TAG(
|
||
|
/* ============ */
|
||
|
" _editw_scroll( MessageMemberMessage, 0, 0, 100, 60 )\n" \
|
||
|
" \tproperties {\n" \
|
||
|
" \t\tvec2 textAlignment = TA_LEFT, TA_VCENTER;\n" \
|
||
|
" \t\tfloat maxTextLength = 512;\n" \
|
||
|
" \t}\n" \
|
||
|
" _end_editw_scroll\n"
|
||
|
/* ============ */
|
||
|
)
|
||
|
SD_UI_POP_CLASS_TAG
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
alias = "editw";
|
||
|
)
|
||
|
class sdUIEditW :
|
||
|
public sdUIWindow {
|
||
|
friend class sdUIEditHelper< sdUIEditW, idWStr, wchar_t >;
|
||
|
public:
|
||
|
SD_UI_DECLARE_CLASS( sdUIEditW )
|
||
|
|
||
|
enum eEditFlag {
|
||
|
EF_INTEGERS_ONLY = BITT< sdUIWindow::NEXT_WINDOW_FLAG + 0 >::VALUE,
|
||
|
EF_ALLOW_DECIMAL = BITT< sdUIWindow::NEXT_WINDOW_FLAG + 1 >::VALUE,
|
||
|
EF_UPPERCASE = BITT< sdUIWindow::NEXT_WINDOW_FLAG + 2 >::VALUE,
|
||
|
EF_MULTILINE = BITT< sdUIWindow::NEXT_WINDOW_FLAG + 3 >::VALUE,
|
||
|
};
|
||
|
|
||
|
typedef enum editEvent_e {
|
||
|
EE_INPUT_FAILED = WE_NUM_EVENTS + 1,
|
||
|
EE_NUM_EVENTS,
|
||
|
} editEvent_t;
|
||
|
|
||
|
sdUIEditW();
|
||
|
virtual ~sdUIEditW();
|
||
|
|
||
|
virtual void InitProperties();
|
||
|
virtual const char* GetScopeClassName() const { return "sdUIEditW"; }
|
||
|
|
||
|
virtual void FinalDraw();
|
||
|
|
||
|
virtual bool PostEvent( const sdSysEvent* event );
|
||
|
|
||
|
virtual sdUIFunctionInstance* GetFunction( const char* name );
|
||
|
virtual bool RunNamedMethod( const char* name, sdUIFunctionStack& stack );
|
||
|
void Script_ClearText( sdUIFunctionStack& stack );
|
||
|
void Script_IsWhitespace( sdUIFunctionStack& stack );
|
||
|
void Script_InsertText( sdUIFunctionStack& stack );
|
||
|
void Script_SurroundSelection( sdUIFunctionStack& stack );
|
||
|
void Script_AnySelected( sdUIFunctionStack& stack );
|
||
|
void Script_SelectAll( sdUIFunctionStack& stack );
|
||
|
|
||
|
virtual void OnLanguageInit();
|
||
|
virtual void OnLanguageShutdown();
|
||
|
|
||
|
virtual void OnGainFocus( void );
|
||
|
virtual void OnLoseFocus( void );
|
||
|
|
||
|
sdBounds2D GetDrawRect() const;
|
||
|
|
||
|
|
||
|
static void InitFunctions( void );
|
||
|
static void ShutdownFunctions( void ) { editFunctions.DeleteContents(); }
|
||
|
static const sdUITemplateFunction< sdUIEditW >* FindFunction( const char* name );
|
||
|
|
||
|
virtual void EnumerateEvents( const char* name, const idList<unsigned short>& flags, idList< sdUIEventInfo >& events, const idTokenCache& tokenCache );
|
||
|
virtual int GetMaxEventTypes( void ) const { return EE_NUM_EVENTS; }
|
||
|
virtual const char* GetEventNameForType( int event ) const { return ( event < ( WE_NUM_EVENTS + 1 )) ? sdUIWindow::GetEventNameForType( event ): eventNames[ event - WE_NUM_EVENTS - 1 ]; }
|
||
|
|
||
|
|
||
|
protected:
|
||
|
virtual void DrawLocal();
|
||
|
virtual void ApplyLayout();
|
||
|
virtual void EndLevelLoad();
|
||
|
|
||
|
private:
|
||
|
void ClearText();
|
||
|
static bool CharIsPrintable( wchar_t c ) { return c >= 0x20; }
|
||
|
const wchar_t* GetCursorText() const;
|
||
|
|
||
|
void OnEditTextChanged( const idWStr& oldValue, const idWStr& newValue );
|
||
|
void OnReadOnlyChanged( const float oldValue, const float newValue );
|
||
|
void OnCursorNameChanged( const idStr& oldValue, const idStr& newValue );
|
||
|
void OnOverwriteCursorNameChanged( const idStr& oldValue, const idStr& newValue );
|
||
|
void OnFlagsChanged( const float oldValue, const float newValue );
|
||
|
|
||
|
void DrawIndicator();
|
||
|
//void DrawComposition();
|
||
|
void DrawCandidateReadingWindow( bool reading );
|
||
|
|
||
|
protected:
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Object/Edit Text";
|
||
|
desc = "Editable text displayed within the object.";
|
||
|
editor = "editText";
|
||
|
datatype = "wstring";
|
||
|
)
|
||
|
sdWStringProperty editText;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Object/Max Length";
|
||
|
desc = "Maximum allowed length for the text";
|
||
|
editor = "edit";
|
||
|
datatype = "float";
|
||
|
)
|
||
|
sdFloatProperty maxTextLength;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Object/Read Only";
|
||
|
desc = "Don't allow editing of the text";
|
||
|
editor = "edit";
|
||
|
datatype = "float";
|
||
|
)
|
||
|
sdFloatProperty readOnly;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Object/Password";
|
||
|
desc = "Display text as a series of *s";
|
||
|
editor = "edit";
|
||
|
datatype = "float";
|
||
|
)
|
||
|
sdFloatProperty password;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Drawing/Cursor";
|
||
|
desc = "Normal editing mode cursor";
|
||
|
editor = "edit";
|
||
|
datatype = "String";
|
||
|
)
|
||
|
sdStringProperty cursorName;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Drawing/Overwrite Cursor";
|
||
|
desc = "Insert mode cursor";
|
||
|
editor = "edit";
|
||
|
datatype = "String";
|
||
|
)
|
||
|
sdStringProperty overwriteCursorName;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Drawing/IME Fill Color";
|
||
|
desc = "RGBA of the IME rectangle.";
|
||
|
editor = "edit";
|
||
|
option1 = "{editorComponents} {r,g,b,a}";
|
||
|
option2 = "{editorSeparator} {,}";
|
||
|
datatype = "vec4";
|
||
|
aliasdatatype = "color";
|
||
|
)
|
||
|
sdVec4Property IMEFillColor;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Drawing/IME Border Color";
|
||
|
desc = "RGBA of the IME rectangle border.";
|
||
|
editor = "edit";
|
||
|
option1 = "{editorComponents} {r,g,b,a}";
|
||
|
option2 = "{editorSeparator} {,}";
|
||
|
datatype = "vec4";
|
||
|
aliasdatatype = "color";
|
||
|
)
|
||
|
sdVec4Property IMEBorderColor;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Drawing/IME Selection Color";
|
||
|
desc = "RGBA of the IME selection rectangle.";
|
||
|
editor = "edit";
|
||
|
option1 = "{editorComponents} {r,g,b,a}";
|
||
|
option2 = "{editorSeparator} {,}";
|
||
|
datatype = "vec4";
|
||
|
aliasdatatype = "color";
|
||
|
)
|
||
|
sdVec4Property IMESelectionColor;
|
||
|
|
||
|
SD_UI_PROPERTY_TAG(
|
||
|
title = "Drawing/IME Text Color";
|
||
|
desc = "RGBA of the IME text.";
|
||
|
editor = "edit";
|
||
|
option1 = "{editorComponents} {r,g,b,a}";
|
||
|
option2 = "{editorSeparator} {,}";
|
||
|
datatype = "vec4";
|
||
|
aliasdatatype = "color";
|
||
|
)
|
||
|
sdVec4Property IMETextColor;
|
||
|
|
||
|
sdVec2Property scrollAmount;
|
||
|
sdFloatProperty scrollAmountMax;
|
||
|
sdFloatProperty lineHeight;
|
||
|
|
||
|
protected:
|
||
|
static idHashMap< sdUITemplateFunction< sdUIEditW >* > editFunctions;
|
||
|
static const char* eventNames[ EE_NUM_EVENTS - WE_NUM_EVENTS ];
|
||
|
|
||
|
private:
|
||
|
uiDrawPart_t cursor;
|
||
|
uiDrawPart_t overwriteCursor;
|
||
|
|
||
|
bool drawIME;
|
||
|
bool composing;
|
||
|
idWStr compositionString;
|
||
|
|
||
|
sdUIEditHelper< sdUIEditW, idWStr, wchar_t > helper;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
============
|
||
|
sdUIEditW::GetDrawRect
|
||
|
============
|
||
|
*/
|
||
|
ID_INLINE sdBounds2D sdUIEditW::GetDrawRect() const {
|
||
|
sdBounds2D rect( GetWorldRect() );
|
||
|
rect.TranslateSelf( textOffset.GetValue() );
|
||
|
rect.GetMaxs() -= ( textOffset.GetValue() * 2.0f );
|
||
|
return rect;
|
||
|
}
|
||
|
|
||
|
#endif // ! __GAME_GUIS_USERINTERFACEEDITW_H__
|