static void TXT_InputBoxDrawer(TXT_UNCAST_ARG(inputbox)) { TXT_CAST_ARG(txt_inputbox_t, inputbox); int focused; int i; int chars; int w; focused = inputbox->widget.focused; w = inputbox->widget.w; // Select the background color based on whether we are currently // editing, and if not, whether the widget is focused. if (inputbox->editing && focused) { TXT_BGColor(TXT_COLOR_BLACK, 0); } else { TXT_SetWidgetBG(inputbox); } if (!inputbox->editing) { // If not editing, use the current value from inputbox->value. SetBufferFromValue(inputbox); } // If string size exceeds the widget's width, show only the end. if (TXT_UTF8_Strlen(inputbox->buffer) > w - 1) { TXT_DrawString("\xae"); TXT_DrawUTF8String( TXT_UTF8_SkipChars(inputbox->buffer, TXT_UTF8_Strlen(inputbox->buffer) - w + 2)); chars = w - 1; } else { TXT_DrawUTF8String(inputbox->buffer); chars = TXT_UTF8_Strlen(inputbox->buffer); } if (chars < w && inputbox->editing && focused) { TXT_BGColor(TXT_COLOR_BLACK, 1); TXT_DrawString("_"); ++chars; } for (i=chars; i < w; ++i) { TXT_DrawString(" "); } }
void TXT_SetLabel(txt_label_t *label, char *value) { char *p; unsigned int y; // Free back the old label free(label->label); free(label->lines); // Set the new value label->label = strdup(value); // Work out how many lines in this label label->h = 1; for (p = value; *p != '\0'; ++p) { if (*p == '\n') { ++label->h; } } // Split into lines label->lines = malloc(sizeof(char *) * label->h); label->lines[0] = label->label; y = 1; for (p = label->label; *p != '\0'; ++p) { if (*p == '\n') { label->lines[y] = p + 1; *p = '\0'; ++y; } } label->w = 0; for (y=0; y<label->h; ++y) { unsigned int line_len; line_len = TXT_UTF8_Strlen(label->lines[y]); if (line_len > label->w) label->w = line_len; } }
static void AddCharacter(txt_inputbox_t *inputbox, int key) { char *end, *p; if (TXT_UTF8_Strlen(inputbox->buffer) < inputbox->size) { // Add character to the buffer end = inputbox->buffer + strlen(inputbox->buffer); p = TXT_EncodeUTF8(end, key); *p = '\0'; } }
static void Backspace(txt_inputbox_t *inputbox) { unsigned int len; char *p; len = TXT_UTF8_Strlen(inputbox->buffer); if (len > 0) { p = TXT_UTF8_SkipChars(inputbox->buffer, len - 1); *p = '\0'; } }
static void TXT_SeparatorSizeCalc(TXT_UNCAST_ARG(separator)) { TXT_CAST_ARG(txt_separator_t, separator); if (separator->label != NULL) { // Minimum width is the string length + two spaces for padding separator->widget.w = TXT_UTF8_Strlen(separator->label) + 2; } else { separator->widget.w = 0; } separator->widget.h = 1; }
static void TXT_JoystickAxisDrawer(TXT_UNCAST_ARG(joystick_axis)) { TXT_CAST_ARG(txt_joystick_axis_t, joystick_axis); char buf[JOYSTICK_AXIS_WIDTH + 1]; int i; if (*joystick_axis->axis < 0) { M_StringCopy(buf, "(none)", sizeof(buf)); } else if (IS_BUTTON_AXIS(*joystick_axis->axis)) { int neg, pos; neg = BUTTON_AXIS_NEG(*joystick_axis->axis); pos = BUTTON_AXIS_POS(*joystick_axis->axis); M_snprintf(buf, sizeof(buf), "BUTTONS #%i+#%i", neg, pos); } else if (IS_HAT_AXIS(*joystick_axis->axis)) { int hat, dir; hat = HAT_AXIS_HAT(*joystick_axis->axis); dir = HAT_AXIS_DIRECTION(*joystick_axis->axis); M_snprintf(buf, sizeof(buf), "HAT #%i (%s)", hat, dir == HAT_AXIS_HORIZONTAL ? "horizontal" : "vertical"); } else { M_snprintf(buf, sizeof(buf), "AXIS #%i", *joystick_axis->axis); } TXT_SetWidgetBG(joystick_axis); TXT_FGColor(TXT_COLOR_BRIGHT_WHITE); TXT_DrawString(buf); for (i = TXT_UTF8_Strlen(buf); i < joystick_axis->widget.w; ++i) { TXT_DrawString(" "); } }
static void TXT_LabelDrawer(TXT_UNCAST_ARG(label)) { TXT_CAST_ARG(txt_label_t, label); unsigned int x, y; int origin_x, origin_y; unsigned int align_indent = 0; unsigned int w; w = label->widget.w; if (label->bgcolor >= 0) { TXT_BGColor(label->bgcolor, 0); } if (label->fgcolor >= 0) { TXT_FGColor(label->fgcolor); } TXT_GetXY(&origin_x, &origin_y); for (y=0; y<label->h; ++y) { // Calculate the amount to indent this line due to the align // setting switch (label->widget.align) { case TXT_HORIZ_LEFT: align_indent = 0; break; case TXT_HORIZ_CENTER: align_indent = (label->w - strlen(label->lines[y])) / 2; break; case TXT_HORIZ_RIGHT: align_indent = label->w - strlen(label->lines[y]); break; } // Draw this line TXT_GotoXY(origin_x, origin_y + y); // Gap at the start for (x=0; x<align_indent; ++x) { TXT_DrawString(" "); } // The string itself TXT_DrawUTF8String(label->lines[y]); x += TXT_UTF8_Strlen(label->lines[y]); // Gap at the end for (; x<w; ++x) { TXT_DrawString(" "); } } }