[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Pspp-cvs] pspp lib/gtksheet/ChangeLog lib/gtksheet/gsheet...
From: |
John Darrington |
Subject: |
[Pspp-cvs] pspp lib/gtksheet/ChangeLog lib/gtksheet/gsheet... |
Date: |
Sat, 07 Jul 2007 01:52:44 +0000 |
CVSROOT: /sources/pspp
Module name: pspp
Changes by: John Darrington <jmd> 07/07/07 01:52:44
Modified files:
lib/gtksheet : ChangeLog gsheet-column-iface.c
gsheet-column-iface.h gsheet-row-iface.c
gsheet-row-iface.h gtksheet.c gtksheet.h
src/ui/gui : ChangeLog psppire-data-store.c
Log message:
Added a tooltip like feature to display variables' labels when the
mouse hovers
over a column title in the datasheet.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/ChangeLog?cvsroot=pspp&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gsheet-column-iface.c?cvsroot=pspp&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gsheet-column-iface.h?cvsroot=pspp&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gsheet-row-iface.c?cvsroot=pspp&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gsheet-row-iface.h?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gtksheet.c?cvsroot=pspp&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gtksheet.h?cvsroot=pspp&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/ChangeLog?cvsroot=pspp&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-data-store.c?cvsroot=pspp&r1=1.39&r2=1.40
Patches:
Index: lib/gtksheet/ChangeLog
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/ChangeLog,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- lib/gtksheet/ChangeLog 3 Jul 2007 05:49:53 -0000 1.13
+++ lib/gtksheet/ChangeLog 7 Jul 2007 01:52:44 -0000 1.14
@@ -1,3 +1,9 @@
+07 July 2007 John Darrington <address@hidden>
+
+ * gsheet-column-iface.c gsheet-column-iface.h gsheet-row-iface.c
+ gsheet-row-iface.h gtksheet.c gtksheet.h: Added a "subtitle"
+ feature on row/column titles, which shows tooltip-like popups.
+
03 July 2007 John Darrington <address@hidden>
* gtksheet.c gtksheet.h: Removed the autoscroll-on-select feature
Index: lib/gtksheet/gsheet-column-iface.c
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gsheet-column-iface.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- lib/gtksheet/gsheet-column-iface.c 8 Jun 2007 04:53:45 -0000 1.7
+++ lib/gtksheet/gsheet-column-iface.c 7 Jul 2007 01:52:44 -0000 1.8
@@ -176,6 +176,16 @@
return (G_SHEET_COLUMN_GET_IFACE (column)->get_justification) (column, col);
}
+inline gchar *
+g_sheet_column_get_subtitle (const GSheetColumn *column, gint col)
+{
+ g_return_val_if_fail (G_IS_SHEET_COLUMN (column), NULL);
+
+ if ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_subtitle)
+ return NULL;
+
+ return (G_SHEET_COLUMN_GET_IFACE (column)->get_subtitle) (column, col);
+}
Index: lib/gtksheet/gsheet-column-iface.h
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gsheet-column-iface.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- lib/gtksheet/gsheet-column-iface.h 8 Jun 2007 04:53:45 -0000 1.5
+++ lib/gtksheet/gsheet-column-iface.h 7 Jul 2007 01:52:44 -0000 1.6
@@ -72,6 +72,8 @@
GtkStateType (*get_button_state)(const GSheetColumn *geo, gint col);
gchar * (*get_button_label)(const GSheetColumn *geo, gint col);
+ gchar * (*get_subtitle)(const GSheetColumn *geo, gint col);
+
gboolean (*get_button_visibility)(const GSheetColumn *geo,
gint col);
const GtkSheetChild * (*get_button_child)(const GSheetColumn *geo,
@@ -102,6 +104,8 @@
inline GtkSheetButton *g_sheet_column_get_button(const GSheetColumn *gcolumn,
gint col);
+gchar *g_sheet_column_get_subtitle (const GSheetColumn *, gint);
+
inline GtkJustification g_sheet_column_get_justification(const GSheetColumn
*gcolumn, gint col);
Index: lib/gtksheet/gsheet-row-iface.c
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gsheet-row-iface.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- lib/gtksheet/gsheet-row-iface.c 8 Jun 2007 04:53:45 -0000 1.6
+++ lib/gtksheet/gsheet-row-iface.c 7 Jul 2007 01:52:44 -0000 1.7
@@ -172,6 +172,19 @@
return button;
}
+inline gchar *
+g_sheet_row_get_subtitle (const GSheetRow *row_geo, gint row)
+{
+ g_return_val_if_fail (G_IS_SHEET_ROW (row_geo), NULL);
+
+ if ( ! G_SHEET_ROW_GET_IFACE (row_geo)->get_subtitle )
+ return NULL;
+
+ return (G_SHEET_ROW_GET_IFACE (row_geo)->get_subtitle) (row_geo, row);
+}
+
+
+
gint
g_sheet_row_get_row_count(const GSheetRow *geo, gpointer data)
Index: lib/gtksheet/gsheet-row-iface.h
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gsheet-row-iface.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- lib/gtksheet/gsheet-row-iface.h 8 Jun 2007 04:53:45 -0000 1.4
+++ lib/gtksheet/gsheet-row-iface.h 7 Jul 2007 01:52:44 -0000 1.5
@@ -72,6 +72,8 @@
gchar * (*get_button_label)(const GSheetRow *geo, gint row,
gpointer);
+ gchar * (*get_subtitle) (const GSheetRow *geo, gint row);
+
gboolean (*get_button_visibility)(const GSheetRow *geo,
gint row, gpointer);
@@ -120,6 +122,9 @@
gint first, gint n_rows);
+gchar *g_sheet_row_get_subtitle (const GSheetRow *row_geo, gint row);
+
+
G_END_DECLS
#endif /* __G_SHEET_ROW_IFACE_H__ */
Index: lib/gtksheet/gtksheet.c
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gtksheet.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- lib/gtksheet/gtksheet.c 3 Jul 2007 05:49:53 -0000 1.18
+++ lib/gtksheet/gtksheet.c 7 Jul 2007 01:52:44 -0000 1.19
@@ -96,6 +96,7 @@
#define CELL_SPACING 1
#define DRAG_WIDTH 6
#define TIMEOUT_FLASH 200
+#define TIMEOUT_HOVER 300
#define TIME_INTERVAL 8
#define COLUMN_MIN_WIDTH 10
#define MINROWS 1
@@ -1167,6 +1168,8 @@
gdk_color_parse ("gray", &sheet->grid_color);
gdk_color_alloc (gdk_colormap_get_system (), &sheet->grid_color);
sheet->show_grid = TRUE;
+
+ sheet->motion_events = 0;
}
@@ -3803,6 +3806,10 @@
return GTK_STATE_NORMAL;
}
+/* Convert X, Y (in pixels) to *ROW, *COLUMN (in cell coords)
+ -1 indicates the title buttons.
+ If the function returns FALSE, then the results will be unreliable.
+*/
gboolean
gtk_sheet_get_pixel_info (GtkSheet *sheet,
gint x,
@@ -3810,25 +3817,43 @@
gint *row,
gint *column)
{
- gint trow = -1;
- gint tcol = -1;
+ gint trow, tcol;
+ *row = -G_MAXINT;
+ *column = -G_MAXINT;
g_return_val_if_fail (sheet != NULL, 0);
g_return_val_if_fail (GTK_IS_SHEET (sheet), 0);
/* bounds checking, return false if the user clicked
on a blank area */
+ if (y < 0)
+ return FALSE;
+
+ if (x < 0)
+ return FALSE;
+
+ if ( y < sheet->column_title_area.height + sheet->column_title_area.y)
+ *row = -1;
+
+ else
+ {
trow = ROW_FROM_YPIXEL (sheet, y);
- if (trow >= yyy_row_count (sheet))
+ if (trow > yyy_row_count (sheet))
return FALSE;
*row = trow;
+ }
+ if ( x < sheet->row_title_area.width + sheet->row_title_area.x)
+ *column = -1;
+ else
+ {
tcol = COLUMN_FROM_XPIXEL (sheet, x);
- if (tcol >= xxx_column_count (sheet))
+ if (tcol > xxx_column_count (sheet))
return FALSE;
*column = tcol;
+ }
return TRUE;
}
@@ -5271,6 +5296,159 @@
return TRUE;
}
+/* Shamelessly lifted from gtktooltips */
+static gboolean
+gtk_sheet_subtitle_paint_window (GtkWidget *tip_window)
+{
+ GtkRequisition req;
+
+ gtk_widget_size_request (tip_window, &req);
+ gtk_paint_flat_box (tip_window->style, tip_window->window,
+ GTK_STATE_NORMAL, GTK_SHADOW_OUT,
+ NULL, GTK_WIDGET(tip_window), "tooltip",
+ 0, 0, req.width, req.height);
+
+ return FALSE;
+}
+
+static GtkSheetHoverTitle *
+create_hover_window (void)
+{
+ GtkSheetHoverTitle *hw = malloc (sizeof (*hw));
+
+ hw->window = gtk_window_new (GTK_WINDOW_POPUP);
+
+ gtk_window_set_type_hint (GTK_WINDOW (hw->window),
+ GDK_WINDOW_TYPE_HINT_TOOLTIP);
+
+ gtk_widget_set_app_paintable (hw->window, TRUE);
+ gtk_window_set_resizable (GTK_WINDOW (hw->window), FALSE);
+ gtk_widget_set_name (hw->window, "gtk-tooltips");
+ gtk_container_set_border_width (GTK_CONTAINER (hw->window), 4);
+
+ g_signal_connect (hw->window,
+ "expose_event",
+ G_CALLBACK (gtk_sheet_subtitle_paint_window),
+ NULL);
+
+ hw->label = gtk_label_new (NULL);
+
+
+ gtk_label_set_line_wrap (GTK_LABEL (hw->label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (hw->label), 0.5, 0.5);
+
+ gtk_container_add (GTK_CONTAINER (hw->window), hw->label);
+
+ gtk_widget_show (hw->label);
+
+ g_signal_connect (hw->window,
+ "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &hw->window);
+
+ return hw;
+}
+
+#define HOVER_WINDOW_Y_OFFSET 2
+
+static void
+show_subtitle (GtkSheet *sheet, gint row, gint column, const gchar *subtitle)
+{
+ gint x, y;
+ gint px, py;
+ gint width;
+
+ if ( ! subtitle )
+ return;
+
+ if ( ! sheet->hover_window)
+ {
+ sheet->hover_window = create_hover_window ();
+ gtk_widget_add_events (GTK_WIDGET (sheet), GDK_LEAVE_NOTIFY_MASK);
+
+ g_signal_connect_swapped (sheet, "leave-notify-event",
+ G_CALLBACK (gtk_widget_hide),
+ sheet->hover_window->window);
+ }
+
+ gtk_label_set_text (GTK_LABEL (sheet->hover_window->label),
+ subtitle);
+
+
+ sheet->hover_window->row = row;
+ sheet->hover_window->column = column;
+
+ gdk_window_get_origin (GTK_WIDGET (sheet)->window, &x, &y);
+
+ gtk_widget_get_pointer (GTK_WIDGET (sheet), &px, &py);
+
+ gtk_widget_show (sheet->hover_window->window);
+
+ width = GTK_WIDGET (sheet->hover_window->label)->allocation.width;
+
+ if (row == -1 )
+ {
+ x += px;
+ x -= width / 2;
+ y += sheet->column_title_area.y;
+ y += sheet->column_title_area.height;
+ y += HOVER_WINDOW_Y_OFFSET;
+ }
+
+ if ( column == -1 )
+ {
+ y += py;
+ x += sheet->row_title_area.x;
+ x += sheet->row_title_area.width * 2 / 3.0;
+ }
+
+ gtk_window_move (GTK_WINDOW (sheet->hover_window->window),
+ x, y);
+}
+
+static gboolean
+motion_timeout_callback (gpointer data)
+{
+ GtkSheet *sheet = GTK_SHEET (data);
+ if ( --sheet->motion_events == 0 )
+ {
+ gint x, y;
+ gint row, column;
+ gtk_widget_get_pointer (GTK_WIDGET (sheet), &x, &y);
+
+ if ( gtk_sheet_get_pixel_info (sheet, x, y, &row, &column) )
+ {
+ if ( column == -1 && row == -1 )
+ return FALSE;
+
+ if ( column == -1)
+ {
+ GSheetRow *row_geo = sheet->row_geometry;
+ gchar *text;
+
+ text = g_sheet_row_get_subtitle (row_geo, row);
+
+ show_subtitle (sheet, row, column, text);
+ g_free (text);
+ }
+
+ if ( row == -1)
+ {
+ GSheetColumn *col_geo = sheet->column_geometry;
+ gchar *text;
+
+ text = g_sheet_column_get_subtitle (col_geo, column);
+
+ show_subtitle (sheet, row, column, text );
+
+ g_free (text);
+ }
+ }
+ }
+
+ return FALSE;
+}
+
static gint
gtk_sheet_motion (GtkWidget * widget,
GdkEventMotion * event)
@@ -5291,6 +5469,26 @@
x = event->x;
y = event->y;
+ if (!sheet->hover_window || ! GTK_WIDGET_VISIBLE
(sheet->hover_window->window))
+ {
+ sheet->motion_events++;
+ g_timeout_add (TIMEOUT_HOVER, motion_timeout_callback, sheet);
+ }
+ else
+ {
+ gint row, column;
+ gint wx, wy;
+ gtk_widget_get_pointer (widget, &wx, &wy);
+
+ if ( gtk_sheet_get_pixel_info (sheet, wx, wy, &row, &column) )
+ {
+ if ( row != sheet->hover_window->row || column !=
sheet->hover_window->column)
+ {
+ gtk_widget_hide (sheet->hover_window->window);
+ }
+ }
+ }
+
if (event->window == sheet->column_title_window &&
gtk_sheet_columns_resizable (sheet))
{
@@ -5467,7 +5665,8 @@
/*use half of column width resp. row height as threshold to
expand selection*/
- col_threshold = COLUMN_LEFT_XPIXEL (sheet,current_col)+xxx_column_width
(sheet,current_col)/2;
+ col_threshold = COLUMN_LEFT_XPIXEL (sheet,current_col) +
+ xxx_column_width (sheet,current_col) / 2;
if (column > 0)
{
if (x < col_threshold)
@@ -5505,7 +5704,6 @@
if (aux.row0 + row >= 0 && aux.rowi + row < yyy_row_count (sheet) &&
aux.col0 + column >= 0 && aux.coli + column < xxx_column_count
(sheet))
{
-
aux = sheet->drag_range;
sheet->drag_range = sheet->range;
@@ -5526,8 +5724,6 @@
return TRUE;
}
-
-
gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
if (sheet->state == GTK_SHEET_NORMAL && row == sheet->active_cell.row &&
Index: lib/gtksheet/gtksheet.h
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gtksheet.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- lib/gtksheet/gtksheet.h 3 Jul 2007 05:49:53 -0000 1.9
+++ lib/gtksheet/gtksheet.h 7 Jul 2007 01:52:44 -0000 1.10
@@ -84,6 +84,7 @@
typedef struct _GtkSheetClass GtkSheetClass;
typedef struct _GtkSheetCellAttr GtkSheetCellAttr;
typedef struct _GtkSheetCell GtkSheetCell;
+typedef struct _GtkSheetHoverTitle GtkSheetHoverTitle;
struct _GtkSheetCellAttr
@@ -103,6 +104,12 @@
gint col;
};
+struct _GtkSheetHoverTitle
+{
+ GtkWidget *window;
+ GtkWidget *label;
+ gint row, column;
+};
struct _GtkSheet{
GtkContainer container;
@@ -222,6 +229,10 @@
/* clipped range */
GtkSheetRange clip_range;
+
+ /* Used for the subtitle (popups) */
+ gint motion_events;
+ GtkSheetHoverTitle *hover_window;
};
struct _GtkSheetClass
Index: src/ui/gui/ChangeLog
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/ChangeLog,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- src/ui/gui/ChangeLog 3 Jul 2007 05:49:53 -0000 1.62
+++ src/ui/gui/ChangeLog 7 Jul 2007 01:52:44 -0000 1.63
@@ -1,3 +1,8 @@
+2007-07-07 John Darrington <address@hidden>
+
+ * psppire-data-store.c: Added a tooltip like feature to display
+ the label of variables.
+
2007-07-03 John Darrington <address@hidden>
* data-editor.c data-sheet.c: Turned off autoscrolling, and
Index: src/ui/gui/psppire-data-store.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-data-store.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- src/ui/gui/psppire-data-store.c 5 Jul 2007 04:00:12 -0000 1.39
+++ src/ui/gui/psppire-data-store.c 7 Jul 2007 01:52:44 -0000 1.40
@@ -747,6 +747,27 @@
}
+static gchar *
+geometry_get_column_subtitle (const GSheetColumn *geom, gint unit)
+{
+ gchar *text;
+ const struct variable *v ;
+ PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
+
+ if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
+ return NULL;
+
+ v = psppire_dict_get_variable (ds->dict, unit);
+
+ if ( ! var_has_label (v))
+ return NULL;
+
+ text = pspp_locale_to_utf8 (var_get_label (v), -1, 0);
+
+ return text;
+}
+
+
static gboolean
geometry_get_sensitivity (const GSheetColumn *geom, gint unit)
{
@@ -766,6 +787,7 @@
iface->get_sensitivity = geometry_get_sensitivity;
iface->get_justification = geometry_get_justification;
iface->get_button_label = geometry_get_column_button_label;
+ iface->get_subtitle = geometry_get_column_subtitle;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pspp-cvs] pspp lib/gtksheet/ChangeLog lib/gtksheet/gsheet...,
John Darrington <=