Add label class.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 494
This commit is contained in:
Simon Howard 2006-05-20 21:36:28 +00:00
parent 56912a4dcc
commit 27307fa2d7
3 changed files with 155 additions and 0 deletions

View file

@ -11,6 +11,7 @@ libtextscreen_a_SOURCES = \
txt_io.c txt_io.h \
txt_main.c txt_main.h \
txt_button.c txt_button.h \
txt_label.c txt_label.h \
txt_separator.c txt_separator.h\
txt_table.c txt_table.h \
txt_widget.c txt_widget.h \

110
textscreen/txt_label.c Normal file
View file

@ -0,0 +1,110 @@
#include <string.h>
#include "txt_label.h"
#include "txt_io.h"
#include "txt_main.h"
#include "txt_widget.h"
#include "txt_window.h"
static void TXT_LabelSizeCalc(txt_widget_t *widget, int *w, int *h)
{
txt_label_t *label = (txt_label_t *) widget;
*w = label->w;
*h = label->h;
}
static void TXT_LabelDrawer(txt_widget_t *widget, int w, int selected)
{
txt_label_t *label = (txt_label_t *) widget;
int i;
int origin_x, origin_y;
TXT_BGColor(TXT_COLOR_BLUE, 0);
TXT_FGColor(TXT_COLOR_BRIGHT_WHITE);
TXT_GetXY(&origin_x, &origin_y);
for (i=0; i<label->h; ++i)
{
TXT_GotoXY(origin_x, origin_y + i);
TXT_DrawString(label->lines[i]);
}
}
static void TXT_LabelDestructor(txt_widget_t *widget)
{
txt_label_t *label = (txt_label_t *) widget;
free(label->label);
free(label->lines);
free(label);
}
txt_widget_class_t txt_label_class =
{
TXT_LabelSizeCalc,
TXT_LabelDrawer,
NULL,
TXT_LabelDestructor,
};
static void TXT_SplitLabel(txt_label_t *label)
{
char *p;
int y;
// Work out how many lines in this label
label->h = 1;
for (p = label->label; *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)
{
if (strlen(label->lines[y]) > label->w)
label->w = strlen(label->lines[y]);
}
}
txt_label_t *TXT_NewLabel(char *text)
{
txt_label_t *label;
label = malloc(sizeof(txt_label_t));
label->widget.widget_class = &txt_label_class;
label->widget.selectable = 0;
label->widget.visible = 1;
label->label = strdup(text);
TXT_SplitLabel(label);
return label;
}

44
textscreen/txt_label.h Normal file
View file

@ -0,0 +1,44 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id$
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2006 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.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
// 02111-1307, USA.
//
#ifndef TXT_LABEL_H
#define TXT_LABEL_H
typedef struct txt_label_s txt_label_t;
#include "txt_widget.h"
struct txt_label_s
{
txt_widget_t widget;
char *label;
char **lines;
int w, h;
};
txt_label_t *TXT_NewLabel(char *label);
#endif /* #ifndef TXT_LABEL_H */