Added test of sort arrows.
2000-02-11 Christopher James Lahey <clahey@helixcode.com> * test-check.c: Added test of sort arrows. * e-table-col.h, e-table-col.c: Added sort arrows for column headers (It doesn't actually sort. It just displays the arrows.) * e-table-header-item.c: Added display of arrows. svn path=/trunk/; revision=1743
This commit is contained in:
committed by
Chris Lahey
parent
d2fe58c568
commit
4ddf8af33a
@ -1,3 +1,12 @@
|
||||
2000-02-11 Christopher James Lahey <clahey@helixcode.com>
|
||||
|
||||
* test-check.c: Added test of sort arrows.
|
||||
|
||||
* e-table-col.h, e-table-col.c: Added sort arrows for column
|
||||
headers (It doesn't actually sort. It just displays the arrows.)
|
||||
|
||||
* e-table-header-item.c: Added display of arrows.
|
||||
|
||||
2000-02-11 Christopher James Lahey <clahey@helixcode.com>
|
||||
|
||||
* clip.png: Test column header image.
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
/*
|
||||
* E-table-col.c: ETableCol implementation
|
||||
*
|
||||
@ -61,6 +62,8 @@ e_table_col_new (int col_idx, const char *text, int width, int min_width,
|
||||
etc->ecell = ecell;
|
||||
etc->compare = compare;
|
||||
|
||||
etc->arrow = E_TABLE_COL_ARROW_NONE;
|
||||
|
||||
etc->selected = 0;
|
||||
etc->resizeable = resizable;
|
||||
|
||||
@ -90,6 +93,8 @@ e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf, int width, int min_
|
||||
etc->ecell = ecell;
|
||||
etc->compare = compare;
|
||||
|
||||
etc->arrow = E_TABLE_COL_ARROW_NONE;
|
||||
|
||||
etc->selected = 0;
|
||||
etc->resizeable = resizable;
|
||||
|
||||
@ -98,4 +103,16 @@ e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf, int width, int min_
|
||||
return etc;
|
||||
}
|
||||
|
||||
void
|
||||
e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow)
|
||||
{
|
||||
col->arrow = arrow;
|
||||
}
|
||||
|
||||
ETableColArrow
|
||||
e_table_col_get_arrow (ETableCol *col)
|
||||
{
|
||||
return col->arrow;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -12,6 +12,14 @@
|
||||
#define E_IS_TABLE_COL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_COL_TYPE))
|
||||
|
||||
typedef struct _ETableCol ETableCol;
|
||||
typedef struct _ETableColClass ETableColClass;
|
||||
typedef enum _ETableColArrow ETableColArrow;
|
||||
|
||||
enum _ETableColArrow {
|
||||
E_TABLE_COL_ARROW_NONE,
|
||||
E_TABLE_COL_ARROW_UP,
|
||||
E_TABLE_COL_ARROW_DOWN
|
||||
};
|
||||
|
||||
/*
|
||||
* Information about a single column
|
||||
@ -29,23 +37,27 @@ struct _ETableCol {
|
||||
unsigned int resizeable:1;
|
||||
int col_idx;
|
||||
|
||||
ECell *ecell;
|
||||
ETableColArrow arrow;
|
||||
|
||||
ECell *ecell;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct _ETableColClass {
|
||||
GtkObjectClass parent_class;
|
||||
} ETableColClass;
|
||||
};
|
||||
|
||||
GtkType e_table_col_get_type (void);
|
||||
ETableCol *e_table_col_new (int col_idx, const char *text,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
ETableCol *e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
void e_table_col_destroy (ETableCol *etc);
|
||||
GtkType e_table_col_get_type (void);
|
||||
ETableCol *e_table_col_new (int col_idx, const char *text,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
ETableCol *e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
void e_table_col_destroy (ETableCol *etc);
|
||||
void e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow);
|
||||
ETableColArrow e_table_col_get_arrow (ETableCol *col);
|
||||
|
||||
|
||||
#endif /* _E_TABLE_COL_H_ */
|
||||
|
||||
@ -26,6 +26,8 @@
|
||||
/* Padding above and below of the string in the header display */
|
||||
#define PADDING 4
|
||||
|
||||
#define MIN_ARROW_SIZE 10
|
||||
|
||||
/* Defines the tolerance for proximity of the column division to the cursor position */
|
||||
#define TOLERANCE 2
|
||||
|
||||
@ -100,6 +102,8 @@ ethi_font_load (ETableHeaderItem *ethi, char *font)
|
||||
ethi->font = gdk_font_load ("fixed");
|
||||
|
||||
ethi->height = ethi->font->ascent + ethi->font->descent + PADDING;
|
||||
if ( ethi->height < MIN_ARROW_SIZE + 4 + PADDING )
|
||||
ethi->height = MIN_ARROW_SIZE + 4 + PADDING;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -468,6 +472,7 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
{
|
||||
GdkRectangle clip;
|
||||
int xtra;
|
||||
int arrowx;
|
||||
|
||||
gdk_draw_rectangle (
|
||||
drawable, gc, TRUE,
|
||||
@ -478,9 +483,9 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
|
||||
x , y, width, height);
|
||||
|
||||
clip.x = x + 2;
|
||||
clip.y = y + 2;
|
||||
clip.width = width - 4;
|
||||
clip.x = x + PADDING / 2;
|
||||
clip.y = y + PADDING / 2;
|
||||
clip.width = width - PADDING;
|
||||
clip.height = ethi->height;
|
||||
|
||||
gdk_gc_set_clip_rectangle (ethi->gc, &clip);
|
||||
@ -488,12 +493,12 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
if ( col->is_pixbuf ) {
|
||||
xtra = (clip.width - gdk_pixbuf_get_width(col->pixbuf))/2;
|
||||
|
||||
x += xtra + PADDING / 2;
|
||||
xtra += PADDING / 2;
|
||||
|
||||
gdk_pixbuf_render_to_drawable_alpha(col->pixbuf,
|
||||
drawable,
|
||||
0, 0,
|
||||
x, y + (clip.height - gdk_pixbuf_get_height(col->pixbuf)) / 2,
|
||||
x + xtra, y + (clip.height - gdk_pixbuf_get_height(col->pixbuf)) / 2,
|
||||
gdk_pixbuf_get_width(col->pixbuf), gdk_pixbuf_get_height(col->pixbuf),
|
||||
GDK_PIXBUF_ALPHA_FULL, 128,
|
||||
GDK_RGB_DITHER_NORMAL,
|
||||
@ -506,13 +511,34 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
if (xtra < 0)
|
||||
xtra = 0;
|
||||
|
||||
x += xtra + PADDING / 2;
|
||||
xtra += PADDING / 2;
|
||||
|
||||
gdk_draw_text (
|
||||
drawable, ethi->font,
|
||||
ethi->gc, x, y + ethi->height - ethi->font->descent - PADDING / 2,
|
||||
ethi->gc, x + xtra, y + ethi->height - ethi->font->descent - PADDING / 2,
|
||||
col->text, strlen (col->text));
|
||||
}
|
||||
|
||||
switch ( e_table_col_get_arrow(col) ) {
|
||||
case E_TABLE_COL_ARROW_NONE:
|
||||
break;
|
||||
case E_TABLE_COL_ARROW_UP:
|
||||
case E_TABLE_COL_ARROW_DOWN:
|
||||
gtk_paint_arrow (gtk_widget_get_style(GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas)),
|
||||
drawable,
|
||||
GTK_STATE_NORMAL,
|
||||
GTK_SHADOW_OUT,
|
||||
&clip,
|
||||
GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas),
|
||||
"header",
|
||||
e_table_col_get_arrow(col) == E_TABLE_COL_ARROW_UP ? GTK_ARROW_UP : GTK_ARROW_DOWN,
|
||||
TRUE,
|
||||
x + PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
|
||||
y + (ethi->height - MIN_ARROW_SIZE) / 2,
|
||||
MIN_ARROW_SIZE,
|
||||
MIN_ARROW_SIZE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -116,6 +116,7 @@ check_test (void)
|
||||
|
||||
col_1 = e_table_col_new (1, "Item Name", 180, 20, cell_left_just, g_str_equal, TRUE);
|
||||
e_table_header_add_column (e_table_header, col_1, 1);
|
||||
e_table_col_set_arrow ( col_1, E_TABLE_COL_ARROW_DOWN );
|
||||
|
||||
/*
|
||||
* GUI
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
/*
|
||||
* E-table-col.c: ETableCol implementation
|
||||
*
|
||||
@ -61,6 +62,8 @@ e_table_col_new (int col_idx, const char *text, int width, int min_width,
|
||||
etc->ecell = ecell;
|
||||
etc->compare = compare;
|
||||
|
||||
etc->arrow = E_TABLE_COL_ARROW_NONE;
|
||||
|
||||
etc->selected = 0;
|
||||
etc->resizeable = resizable;
|
||||
|
||||
@ -90,6 +93,8 @@ e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf, int width, int min_
|
||||
etc->ecell = ecell;
|
||||
etc->compare = compare;
|
||||
|
||||
etc->arrow = E_TABLE_COL_ARROW_NONE;
|
||||
|
||||
etc->selected = 0;
|
||||
etc->resizeable = resizable;
|
||||
|
||||
@ -98,4 +103,16 @@ e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf, int width, int min_
|
||||
return etc;
|
||||
}
|
||||
|
||||
void
|
||||
e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow)
|
||||
{
|
||||
col->arrow = arrow;
|
||||
}
|
||||
|
||||
ETableColArrow
|
||||
e_table_col_get_arrow (ETableCol *col)
|
||||
{
|
||||
return col->arrow;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -12,6 +12,14 @@
|
||||
#define E_IS_TABLE_COL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TABLE_COL_TYPE))
|
||||
|
||||
typedef struct _ETableCol ETableCol;
|
||||
typedef struct _ETableColClass ETableColClass;
|
||||
typedef enum _ETableColArrow ETableColArrow;
|
||||
|
||||
enum _ETableColArrow {
|
||||
E_TABLE_COL_ARROW_NONE,
|
||||
E_TABLE_COL_ARROW_UP,
|
||||
E_TABLE_COL_ARROW_DOWN
|
||||
};
|
||||
|
||||
/*
|
||||
* Information about a single column
|
||||
@ -29,23 +37,27 @@ struct _ETableCol {
|
||||
unsigned int resizeable:1;
|
||||
int col_idx;
|
||||
|
||||
ECell *ecell;
|
||||
ETableColArrow arrow;
|
||||
|
||||
ECell *ecell;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct _ETableColClass {
|
||||
GtkObjectClass parent_class;
|
||||
} ETableColClass;
|
||||
};
|
||||
|
||||
GtkType e_table_col_get_type (void);
|
||||
ETableCol *e_table_col_new (int col_idx, const char *text,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
ETableCol *e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
void e_table_col_destroy (ETableCol *etc);
|
||||
GtkType e_table_col_get_type (void);
|
||||
ETableCol *e_table_col_new (int col_idx, const char *text,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
ETableCol *e_table_col_new_with_pixbuf (int col_idx, GdkPixbuf *pixbuf,
|
||||
int width, int min_width,
|
||||
ECell *ecell, GCompareFunc compare,
|
||||
gboolean resizable);
|
||||
void e_table_col_destroy (ETableCol *etc);
|
||||
void e_table_col_set_arrow (ETableCol *col, ETableColArrow arrow);
|
||||
ETableColArrow e_table_col_get_arrow (ETableCol *col);
|
||||
|
||||
|
||||
#endif /* _E_TABLE_COL_H_ */
|
||||
|
||||
@ -26,6 +26,8 @@
|
||||
/* Padding above and below of the string in the header display */
|
||||
#define PADDING 4
|
||||
|
||||
#define MIN_ARROW_SIZE 10
|
||||
|
||||
/* Defines the tolerance for proximity of the column division to the cursor position */
|
||||
#define TOLERANCE 2
|
||||
|
||||
@ -100,6 +102,8 @@ ethi_font_load (ETableHeaderItem *ethi, char *font)
|
||||
ethi->font = gdk_font_load ("fixed");
|
||||
|
||||
ethi->height = ethi->font->ascent + ethi->font->descent + PADDING;
|
||||
if ( ethi->height < MIN_ARROW_SIZE + 4 + PADDING )
|
||||
ethi->height = MIN_ARROW_SIZE + 4 + PADDING;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -468,6 +472,7 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
{
|
||||
GdkRectangle clip;
|
||||
int xtra;
|
||||
int arrowx;
|
||||
|
||||
gdk_draw_rectangle (
|
||||
drawable, gc, TRUE,
|
||||
@ -478,9 +483,9 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
|
||||
x , y, width, height);
|
||||
|
||||
clip.x = x + 2;
|
||||
clip.y = y + 2;
|
||||
clip.width = width - 4;
|
||||
clip.x = x + PADDING / 2;
|
||||
clip.y = y + PADDING / 2;
|
||||
clip.width = width - PADDING;
|
||||
clip.height = ethi->height;
|
||||
|
||||
gdk_gc_set_clip_rectangle (ethi->gc, &clip);
|
||||
@ -488,12 +493,12 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
if ( col->is_pixbuf ) {
|
||||
xtra = (clip.width - gdk_pixbuf_get_width(col->pixbuf))/2;
|
||||
|
||||
x += xtra + PADDING / 2;
|
||||
xtra += PADDING / 2;
|
||||
|
||||
gdk_pixbuf_render_to_drawable_alpha(col->pixbuf,
|
||||
drawable,
|
||||
0, 0,
|
||||
x, y + (clip.height - gdk_pixbuf_get_height(col->pixbuf)) / 2,
|
||||
x + xtra, y + (clip.height - gdk_pixbuf_get_height(col->pixbuf)) / 2,
|
||||
gdk_pixbuf_get_width(col->pixbuf), gdk_pixbuf_get_height(col->pixbuf),
|
||||
GDK_PIXBUF_ALPHA_FULL, 128,
|
||||
GDK_RGB_DITHER_NORMAL,
|
||||
@ -506,13 +511,34 @@ draw_button (ETableHeaderItem *ethi, ETableCol *col,
|
||||
if (xtra < 0)
|
||||
xtra = 0;
|
||||
|
||||
x += xtra + PADDING / 2;
|
||||
xtra += PADDING / 2;
|
||||
|
||||
gdk_draw_text (
|
||||
drawable, ethi->font,
|
||||
ethi->gc, x, y + ethi->height - ethi->font->descent - PADDING / 2,
|
||||
ethi->gc, x + xtra, y + ethi->height - ethi->font->descent - PADDING / 2,
|
||||
col->text, strlen (col->text));
|
||||
}
|
||||
|
||||
switch ( e_table_col_get_arrow(col) ) {
|
||||
case E_TABLE_COL_ARROW_NONE:
|
||||
break;
|
||||
case E_TABLE_COL_ARROW_UP:
|
||||
case E_TABLE_COL_ARROW_DOWN:
|
||||
gtk_paint_arrow (gtk_widget_get_style(GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas)),
|
||||
drawable,
|
||||
GTK_STATE_NORMAL,
|
||||
GTK_SHADOW_OUT,
|
||||
&clip,
|
||||
GTK_WIDGET(GNOME_CANVAS_ITEM(ethi)->canvas),
|
||||
"header",
|
||||
e_table_col_get_arrow(col) == E_TABLE_COL_ARROW_UP ? GTK_ARROW_UP : GTK_ARROW_DOWN,
|
||||
TRUE,
|
||||
x + PADDING / 2 + clip.width - MIN_ARROW_SIZE - 2,
|
||||
y + (ethi->height - MIN_ARROW_SIZE) / 2,
|
||||
MIN_ARROW_SIZE,
|
||||
MIN_ARROW_SIZE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -116,6 +116,7 @@ check_test (void)
|
||||
|
||||
col_1 = e_table_col_new (1, "Item Name", 180, 20, cell_left_just, g_str_equal, TRUE);
|
||||
e_table_header_add_column (e_table_header, col_1, 1);
|
||||
e_table_col_set_arrow ( col_1, E_TABLE_COL_ARROW_DOWN );
|
||||
|
||||
/*
|
||||
* GUI
|
||||
|
||||
Reference in New Issue
Block a user