Better text entry support for setup menu

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2366 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2006-05-20 00:37:08 +00:00
parent ae0623cf83
commit e7c01297dd
2 changed files with 95 additions and 12 deletions
+92 -10
View File
@@ -9,6 +9,7 @@ WIDGET *widget_focus = NULL;
#define WIDGET_ACTIVE_COLOR BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x00), 0x0E)
#define WIDGET_INACTIVE_COLOR BUILD_COLOR (MAKE_RGB15 (0x18, 0x18, 0x1F), 0x09)
#define WIDGET_INACTIVE_SELECTED_COLOR BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)
#define WIDGET_CURSOR_COLOR BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x00), 0x00)
void
DrawShadowedBox(PRECT r, COLOR bg, COLOR dark, COLOR medium)
@@ -354,6 +355,8 @@ Widget_DrawTextEntry (WIDGET *_self, int x, int y)
selected = WIDGET_ACTIVE_COLOR;
inactive = WIDGET_INACTIVE_COLOR;
BatchGraphics ();
t.baseline.x = x;
t.baseline.y = y;
t.align = ALIGN_LEFT;
@@ -373,22 +376,101 @@ Widget_DrawTextEntry (WIDGET *_self, int x, int y)
/* Force string termination */
self->value[WIDGET_TEXTENTRY_WIDTH-1] = 0;
t.baseline.x = 160;
t.baseline.y = y;
t.align = ALIGN_CENTER;
t.valign = VALIGN_BOTTOM;
t.CharCount = ~0;
t.CharCount = utf8StringCount (self->value);
t.pStr = self->value;
if (widget_focus == _self)
{
oldtext = SetContextForeGroundColor (selected);
if (!(self->state & WTE_EDITING))
{ // normal or selected state
t.baseline.x = 160;
t.align = ALIGN_CENTER;
if (widget_focus == _self)
{
oldtext = SetContextForeGroundColor (selected);
}
else
{
oldtext = SetContextForeGroundColor (inactive);
}
font_DrawText (&t);
}
else
{
oldtext = SetContextForeGroundColor (inactive);
}
font_DrawText (&t);
{ // editing state
COUNT i;
RECT text_r;
BYTE char_deltas[WIDGET_TEXTENTRY_WIDTH];
PBYTE pchar_deltas;
RECT r;
SIZE leading;
t.baseline.x = 90;
t.align = ALIGN_LEFT;
// calc background box dimensions
// XXX: this may need some tuning, especially if a
// different font is used. The font 'leading' values
// are not what they should be.
#define BOX_VERT_OFFSET 2
GetContextFontLeading (&leading);
r.corner.x = t.baseline.x - 1;
r.corner.y = t.baseline.y - leading + BOX_VERT_OFFSET;
r.extent.width = ScreenWidth - r.corner.x - 10;
r.extent.height = leading + 2;
TextRect (&t, &text_r, char_deltas);
#if 0
// XXX: this should potentially be used in ChangeCallback
if ((text_r.extent.width + 2) >= r.extent.width)
{ // the text does not fit the input box size and so
// will not fit when displayed later
UnbatchGraphics ();
// disallow the change
return (FALSE);
}
#endif
oldtext = SetContextForeGroundColor (selected);
DrawFilledRectangle (&r);
// calculate the cursor position and draw it
pchar_deltas = char_deltas;
for (i = self->cursor_pos; i > 0; --i)
r.corner.x += (SIZE)*pchar_deltas++;
if (self->cursor_pos < t.CharCount) /* cursor mid-line */
--r.corner.x;
if (self->state & WTE_BLOCKCUR)
{ // Use block cursor for keyboardless systems
if (self->cursor_pos == t.CharCount)
{ // cursor at end-line -- use insertion point
r.extent.width = 1;
}
else if (self->cursor_pos + 1 == t.CharCount)
{ // extra pixel for last char margin
r.extent.width = (SIZE)*pchar_deltas + 2;
}
else
{ // normal mid-line char
r.extent.width = (SIZE)*pchar_deltas + 1;
}
}
else
{ // Insertion point cursor
r.extent.width = 1;
}
// position cursor within input field rect
++r.corner.x;
++r.corner.y;
r.extent.height -= 2;
SetContextForeGroundColor (WIDGET_CURSOR_COLOR);
DrawFilledRectangle (&r);
SetContextForeGroundColor (inactive);
font_DrawText (&t);
}
UnbatchGraphics ();
SetContextFontEffect (oldFontEffect);
SetContextFont (oldfont);
SetContextForeGroundColor (oldtext);
+3 -2
View File
@@ -450,7 +450,8 @@ OnTextEntryEvent (WIDGET_TEXTENTRY *widget)
TEXTENTRY_STATE tes;
UNICODE revert_buf[256];
widget->cursor_pos = 0;
// position cursor at the end of text
widget->cursor_pos = utf8StringCount (widget->value);
widget->state = WTE_EDITING;
redraw_menu ();
@@ -468,7 +469,7 @@ OnTextEntryEvent (WIDGET_TEXTENTRY *widget)
tes.ChangeCallback = OnTextEntryChange;
tes.FrameCallback = OnTextEntryFrame;
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
SetMenuSounds (0, MENU_SOUND_SELECT);
if (!DoTextEntry (&tes))
{ // editing failed (canceled) -- revert the changes
utf8StringCopy (widget->value, widget->maxlen, revert_buf);