pspp-cvs
[Top][All Lists]
Advanced

[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;
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]