This repository has been archived on 2023-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
chocolate-doom-wii/textscreen/txt_label.c
2016-10-30 18:40:00 -04:00

201 lines
3.9 KiB
C

//
// Copyright(C) 2005-2014 Simon Howard
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
#include <stdlib.h>
#include <string.h>
#include "txt_label.h"
#include "txt_gui.h"
#include "txt_io.h"
#include "txt_main.h"
#include "txt_utf8.h"
#include "txt_window.h"
static void TXT_LabelSizeCalc(TXT_UNCAST_ARG(label))
{
TXT_CAST_ARG(txt_label_t, label);
label->widget.w = label->w;
label->widget.h = label->h;
}
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(" ");
}
}
}
static void TXT_LabelDestructor(TXT_UNCAST_ARG(label))
{
TXT_CAST_ARG(txt_label_t, label);
free(label->label);
free(label->lines);
}
txt_widget_class_t txt_label_class =
{
TXT_NeverSelectable,
TXT_LabelSizeCalc,
TXT_LabelDrawer,
NULL,
TXT_LabelDestructor,
NULL,
NULL,
};
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;
}
}
txt_label_t *TXT_NewLabel(char *text)
{
txt_label_t *label;
label = malloc(sizeof(txt_label_t));
TXT_InitWidget(label, &txt_label_class);
label->label = NULL;
label->lines = NULL;
// Default colors
label->bgcolor = -1;
label->fgcolor = -1;
TXT_SetLabel(label, text);
return label;
}
void TXT_SetFGColor(txt_label_t *label, txt_color_t color)
{
label->fgcolor = color;
}
void TXT_SetBGColor(txt_label_t *label, txt_color_t color)
{
label->bgcolor = color;
}