Commit 3bba991e authored by Cedric Roux's avatar Cedric Roux

some work on text list

parent 2fb9ec7d
...@@ -29,8 +29,15 @@ void xy_plot_set_range(gui *gui, widget *this, ...@@ -29,8 +29,15 @@ void xy_plot_set_range(gui *gui, widget *this,
void xy_plot_set_points(gui *gui, widget *this, void xy_plot_set_points(gui *gui, widget *this,
int npoints, float *x, float *y); int npoints, float *x, float *y);
void text_list_add(gui *gui, widget *this, const char *text, int position); void text_list_add(gui *gui, widget *this, const char *text, int position,
int color);
void text_list_del(gui *gui, widget *this, int position); void text_list_del(gui *gui, widget *this, int position);
void text_list_state(gui *_gui, widget *_this,
int *visible_lines, int *start_line, int *number_of_lines);
void text_list_set_start_line(gui *gui, widget *this, int line);
void text_list_get_line(gui *gui, widget *this, int line,
char **text, int *color);
void text_list_set_color(gui *gui, widget *this, int line, int color);
void gui_loop(gui *gui); void gui_loop(gui *gui);
...@@ -42,9 +49,9 @@ int new_color(gui *gui, char *color); ...@@ -42,9 +49,9 @@ int new_color(gui *gui, char *color);
/* notifications */ /* notifications */
/* known notifications: /* known notifications:
* - text_list: * - text_list:
* - scrollup { } * - scrollup { void *: NULL }
* - scrolldown { } * - scrolldown { void *: NULL }
* //- click { int line, int button } * - click { int [2]: line, button }
*/ */
/* same type as in gui_defs.h */ /* same type as in gui_defs.h */
......
...@@ -74,6 +74,7 @@ struct container_widget { ...@@ -74,6 +74,7 @@ struct container_widget {
struct text_list_widget { struct text_list_widget {
struct widget common; struct widget common;
char **text; char **text;
int *color;
int text_count; int text_count;
int wanted_width; int wanted_width;
int wanted_nlines; /* number of lines of text the user wants to see */ int wanted_nlines; /* number of lines of text the user wants to see */
......
...@@ -16,7 +16,7 @@ printf("PAINT text_list %p xywh %d %d %d %d\n", _this, this->common.x, this->com ...@@ -16,7 +16,7 @@ printf("PAINT text_list %p xywh %d %d %d %d\n", _this, this->common.x, this->com
this->common.width, this->common.height); this->common.width, this->common.height);
for (i = 0, j = this->starting_line; for (i = 0, j = this->starting_line;
i < this->allocated_nlines && j < this->text_count; i++, j++) i < this->allocated_nlines && j < this->text_count; i++, j++)
x_draw_clipped_string(g->x, g->xwin, FOREGROUND_COLOR, x_draw_clipped_string(g->x, g->xwin, this->color[j],
this->common.x, this->common.x,
this->common.y + i * this->line_height + this->baseline, this->common.y + i * this->line_height + this->baseline,
this->text[j], this->text[j],
...@@ -44,10 +44,25 @@ static void allocate( ...@@ -44,10 +44,25 @@ static void allocate(
printf("ALLOCATE text_list %p xywh %d %d %d %d nlines %d\n", this, x, y, width, height, this->allocated_nlines); printf("ALLOCATE text_list %p xywh %d %d %d %d nlines %d\n", this, x, y, width, height, this->allocated_nlines);
} }
static void button(gui *g, widget *_this, int x, int y, int button, int up) static void button(gui *_g, widget *_this, int x, int y, int button, int up)
{ {
struct gui *g = _g;
struct text_list_widget *this = _this; struct text_list_widget *this = _this;
printf("BUTTON test_list %p xy %d %d button %d up %d\n", this, x, y, button, up); printf("BUTTON test_list %p xy %d %d button %d up %d\n", _this, x, y, button, up);
/* scroll up */
if (button == 4 && up == 0) {
gui_notify(g, "scrollup", _this, NULL);
}
/* scroll down */
if (button == 5 && up == 0) {
gui_notify(g, "scrolldown", _this, NULL);
}
/* button 1/2/3 click */
if (button >= 1 && button <= 3 && up == 0) {
int line = this->starting_line + y / this->line_height;
if (line >= 0 && line < this->text_count)
gui_notify(g, "click", _this, (int[2]){ line, button });
}
} }
widget *new_text_list(gui *_gui, int width, int nlines, int bgcol) widget *new_text_list(gui *_gui, int width, int nlines, int bgcol)
...@@ -80,7 +95,8 @@ widget *new_text_list(gui *_gui, int width, int nlines, int bgcol) ...@@ -80,7 +95,8 @@ widget *new_text_list(gui *_gui, int width, int nlines, int bgcol)
/* public functions */ /* public functions */
/*************************************************************************/ /*************************************************************************/
void text_list_add(gui *_gui, widget *_this, const char *text, int position) void text_list_add(gui *_gui, widget *_this, const char *text, int position,
int color)
{ {
struct gui *g = _gui; struct gui *g = _gui;
struct text_list_widget *this = _this; struct text_list_widget *this = _this;
...@@ -93,11 +109,16 @@ void text_list_add(gui *_gui, widget *_this, const char *text, int position) ...@@ -93,11 +109,16 @@ void text_list_add(gui *_gui, widget *_this, const char *text, int position)
this->text_count++; this->text_count++;
this->text = realloc(this->text, this->text_count * sizeof(char *)); this->text = realloc(this->text, this->text_count * sizeof(char *));
if (this->text == NULL) OOM; if (this->text == NULL) OOM;
this->color = realloc(this->color, this->text_count * sizeof(int));
if (this->color == NULL) OOM;
memmove(this->text + position + 1, this->text + position, memmove(this->text + position + 1, this->text + position,
(this->text_count-1 - position) * sizeof(char *)); (this->text_count-1 - position) * sizeof(char *));
memmove(this->color + position + 1, this->color + position,
(this->text_count-1 - position) * sizeof(int));
this->text[position] = strdup(text); if (this->text[position] == NULL) OOM; this->text[position] = strdup(text); if (this->text[position] == NULL) OOM;
this->color[position] = color;
send_event(g, DIRTY, this->common.id); send_event(g, DIRTY, this->common.id);
...@@ -121,13 +142,81 @@ void text_list_del(gui *_gui, widget *_this, int position) ...@@ -121,13 +142,81 @@ void text_list_del(gui *_gui, widget *_this, int position)
memmove(this->text + position, this->text + position + 1, memmove(this->text + position, this->text + position + 1,
(this->text_count-1 - position) * sizeof(char *)); (this->text_count-1 - position) * sizeof(char *));
memmove(this->color + position, this->color + position + 1,
(this->text_count-1 - position) * sizeof(int));
this->text_count--; this->text_count--;
this->text = realloc(this->text, this->text_count * sizeof(char *)); this->text = realloc(this->text, this->text_count * sizeof(char *));
if (this->text == NULL) OOM; if (this->text == NULL) OOM;
this->color = realloc(this->color, this->text_count * sizeof(int));
if (this->color == NULL) OOM;
send_event(g, DIRTY, this->common.id); send_event(g, DIRTY, this->common.id);
done: done:
gunlock(g); gunlock(g);
} }
void text_list_state(gui *_gui, widget *_this,
int *visible_lines, int *start_line, int *number_of_lines)
{
struct gui *g = _gui;
struct text_list_widget *this = _this;
glock(g);
*visible_lines = this->allocated_nlines;
*start_line = this->starting_line;
*number_of_lines = this->text_count;
gunlock(g);
}
void text_list_set_start_line(gui *_gui, widget *_this, int line)
{
struct gui *g = _gui;
struct text_list_widget *this = _this;
glock(g);
this->starting_line = line;
send_event(g, DIRTY, this->common.id);
gunlock(g);
}
void text_list_get_line(gui *_gui, widget *_this, int line,
char **text, int *color)
{
struct gui *g = _gui;
struct text_list_widget *this = _this;
glock(g);
if (line < 0 || line >= this->text_count) {
*text = NULL;
*color = -1;
} else {
*text = this->text[line];
*color = this->color[line];
}
gunlock(g);
}
void text_list_set_color(gui *_gui, widget *_this, int line, int color)
{
struct gui *g = _gui;
struct text_list_widget *this = _this;
glock(g);
if (line >= 0 && line < this->text_count) {
this->color[line] = color;
send_event(g, DIRTY, this->common.id);
}
gunlock(g);
}
...@@ -23,7 +23,7 @@ static void _append(struct textlist *this, char *s) ...@@ -23,7 +23,7 @@ static void _append(struct textlist *this, char *s)
text_list_del(this->g, this->w, 0); text_list_del(this->g, this->w, 0);
this->cursize--; this->cursize--;
} }
text_list_add(this->g, this->w, s, -1); text_list_add(this->g, this->w, s, -1, FOREGROUND_COLOR);
this->cursize++; this->cursize++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment