[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: Zoom combo for integrated UI toolbar




On 9/22/07, Lars Clausen <lars raeder dk> wrote:
On Sat, 2007-09-22 at 08:49 -0500, Patrick Hallinan wrote:
>         Yours does look better than the existing one, so I'm
>         all for replacing it and reducing the duplicate code.
>
> Thanks!  If you want I can try to make the change.

Please do.  I've committed your patch, so you can work off of that.


Here's the patch.
Index: app/display.c
===================================================================
--- app/display.c	(revision 3796)
+++ app/display.c	(working copy)
@@ -68,25 +68,21 @@
 static void
 update_zoom_status(DDisplay *ddisp)
 {
+  GtkWidget *combo_entry;
+  GtkWidget *entry;
   gchar* zoom_text;
+  
+  gchar *format = is_integrated_ui ()? "%.0f%%" : "%.1f%%";
 
-  if (is_integrated_ui ())
-  {
-    zoom_text = g_strdup_printf("%.0f%%",
-	   ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM);
+  zoom_text = g_strdup_printf (format, ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM);
 
-    integrated_ui_toolbar_set_zoom_text (ddisp->common_toolbar, zoom_text);  
-  }
-  else
-  {
-    GtkWidget *zoomcombo;
-    zoom_text = g_strdup_printf("%.1f%%",
-	     ddisp->zoom_factor * 100.0 / DDISPLAY_NORMAL_ZOOM);
-    zoomcombo = ddisp->zoom_status;
-    gtk_entry_set_text(GTK_ENTRY(gtk_object_get_user_data(GTK_OBJECT(zoomcombo))),
-		       zoom_text);
-  }
+  /* Just for clarity */
+  combo_entry = ddisp->zoom_status;
 
+  entry = gtk_bin_get_child (GTK_BIN (combo_entry));
+
+  gtk_entry_set_text (GTK_ENTRY (entry), zoom_text);
+  
   g_free(zoom_text); /* Copied by gtk_entry_set_text */
 }
 
@@ -785,6 +781,8 @@
   Rectangle *visible;
   real width, height;
 
+  if (ddisp == NULL) return;
+
   visible = &ddisp->visible;
 
   width = (visible->right - visible->left)/magnify;
Index: app/interface.c
===================================================================
--- app/interface.c	(revision 3796)
+++ app/interface.c	(working copy)
@@ -47,6 +47,9 @@
 
 #include "pixmaps/missing.xpm"
 
+/* Zoom Constants */
+#define DIA_ZOOM_FIT    _("Fit")
+
 /* HB: file dnd stuff lent by The Gimp, not fully understood but working ...
  */
 enum
@@ -292,117 +295,114 @@
   return FALSE;
 }
 
-void
-view_zoom_set (float factor)
+/**
+ * Sets zoom for text entered in the zoom combo entry
+ * @param Zoom combo's GtkEntry.
+ * @param user_data Unused optional data. 
+ */
+static void
+dia_zoom_combo_activate (GtkWidget *entry, 
+                         gpointer   user_data)
 {
-  DDisplay *ddisp;
-  real scale;
-  Point middle;
-  Rectangle *visible;
+    const gchar *text =  gtk_entry_get_text (GTK_ENTRY (entry));
+    float        zoom_percent;
 
-  ddisp = ddisplay_active();
-  if (!ddisp) return;
+    if (sscanf (text, "%f", &zoom_percent) == 1)
+    {
+        view_zoom_set (10.0 * zoom_percent);
 
-  visible = &ddisp->visible;
-  middle.x = visible->left*0.5 + visible->right*0.5;
-  middle.y = visible->top*0.5 + visible->bottom*0.5;
-
-  scale = ((real) factor)/1000.0 * DDISPLAY_NORMAL_ZOOM;
-
-  ddisplay_zoom(ddisp, &middle, scale / ddisp->zoom_factor);  
+        /* TODO Decide if the focus should be put back on the canvas after a manual zoom entry */
+    }
 }
 
 static void
-zoom_activate_callback(GtkWidget *item, gpointer user_data) {
-  DDisplay *ddisp = (DDisplay *)user_data;
-  const gchar *zoom_text =
-      gtk_entry_get_text(GTK_ENTRY(gtk_object_get_user_data(GTK_OBJECT(ddisp->zoom_status))));
-  float zoom_amount, magnify;
-  gchar *zoomamount = g_object_get_data(G_OBJECT(item), "zoomamount");
-  if (zoomamount != NULL) {
-    zoom_text = zoomamount;
-  }
+dia_zoom_combo_selection_changed (GtkComboBox *combo,
+                                  gpointer     user_data)
+{
+    /* 
+     * We call gtk_combo_get_get_active() so that typing in the combo entry
+     * doesn't get handled as a selection change                           
+     */
+    if (gtk_combo_box_get_active (combo) != -1)
+    {
+        DDisplay *ddisp;
+        float zoom_percent;
+        gchar * text = gtk_combo_box_get_active_text (combo);
 
-  if (sscanf(zoom_text, "%f", &zoom_amount) == 1) {
-    Point middle;
-    Rectangle *visible;
+        if (sscanf (text, "%f", &zoom_percent) == 1)
+        {
+            view_zoom_set (zoom_percent * 10.0);
+        }
+        else if (g_strcasecmp (text, DIA_ZOOM_FIT) == 0)
+        {
+            view_show_all_callback (NULL);
+        }
+        
+        g_free (text);
 
-    magnify = (zoom_amount*DDISPLAY_NORMAL_ZOOM/100.0)/ddisp->zoom_factor;
-    if (fabs(magnify - 1.0) > 0.000001) {
-      visible = &ddisp->visible;
-      middle.x = visible->left*0.5 + visible->right*0.5;
-      middle.y = visible->top*0.5 + visible->bottom*0.5;
-      ddisplay_zoom(ddisp, &middle, magnify);
+        /* Force focus back to the canvas */
+        ddisp = ddisplay_active ();
+        if (ddisp)
+        {
+            gtk_widget_grab_focus (ddisp->canvas);
+        }
     }
-  }
 }
 
-static void
-zoom_add_zoom_amount(GtkWidget *menu, gchar *text, DDisplay *ddisp) {
-  GtkWidget *menuitem = gtk_menu_item_new_with_label(text);
-  gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
-  g_signal_connect(GTK_OBJECT(menuitem), 
-		     "activate", G_CALLBACK(zoom_activate_callback),
-		     ddisp);
-  g_object_set_data(G_OBJECT(menuitem), "zoomamount", text);
-}
+GtkWidget *create_zoom_combo (void)
+{
+  GtkWidget *combo_entry;
+  GtkWidget *entry;
 
-static void
-zoom_popup_menu(GtkWidget *button, GdkEventButton *event, gpointer user_data) {
-  /* display_set_active(ddisp); */
-  /* ddisplay_popup_menu(ddisp, event); */
+  combo_entry = GTK_WIDGET (gtk_combo_box_entry_new_text ());
 
-  GtkMenu *menu = GTK_MENU(user_data);
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), DIA_ZOOM_FIT);
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("800%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("400%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("300%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("200%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("150%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("100%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("75%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("50%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("25%"));
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combo_entry), _("10%"));
 
-  gtk_menu_popup(menu, NULL, NULL, NULL, NULL, 
-		 event->button, event->time);
-  /* stop the signal emission so the button doesn't grab the
-   * pointer from us */
-  gtk_signal_emit_stop_by_name(GTK_OBJECT(button), "button_press_event");
-}
+  GTK_WIDGET_UNSET_FLAGS(combo_entry, GTK_CAN_FOCUS);
 
-static GtkWidget*
-create_zoom_widget(DDisplay *ddisp) { 
-  GtkWidget *combo;
-  GtkWidget *entry;
-  GtkWidget *menu;
-  GtkWidget *button;
-  GtkWidget *arrow;
+  g_signal_connect (G_OBJECT (combo_entry), 
+                    "changed",
+                    G_CALLBACK (dia_zoom_combo_selection_changed), 
+                    NULL);
 
-  combo = gtk_hbox_new(FALSE, 0);
-  entry = gtk_entry_new();
+  /* Get the combo_entry's GtkEntry child to set the width for the widget */
+  entry = gtk_bin_get_child (GTK_BIN (combo_entry));
+  gtk_entry_set_width_chars (GTK_ENTRY (entry), 6);
+
   g_signal_connect (GTK_OBJECT (entry), "activate",
-		    G_CALLBACK(zoom_activate_callback),
-		      ddisp);
-  gtk_box_pack_start_defaults(GTK_BOX(combo), entry);
-  gtk_object_set_user_data(GTK_OBJECT(combo), entry);
-  gtk_entry_set_width_chars(GTK_ENTRY(entry), 8);
-  gtk_widget_show(entry);
+                    G_CALLBACK(dia_zoom_combo_activate),
+                    NULL);
+  return combo_entry;
+}
 
-  button = gtk_button_new();
-  GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
-  arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT);
-  gtk_container_add(GTK_CONTAINER(button), arrow);
-  gtk_box_pack_start_defaults(GTK_BOX(combo), button);
-  gtk_object_set_user_data(GTK_OBJECT(combo), entry);
-  gtk_widget_show_all(button);
+void
+view_zoom_set (float factor)
+{
+  DDisplay *ddisp;
+  real scale;
+  Point middle;
+  Rectangle *visible;
 
-  menu = gtk_menu_new();
-  zoom_add_zoom_amount(menu, "800%", ddisp);
-  zoom_add_zoom_amount(menu, "400%", ddisp);
-  zoom_add_zoom_amount(menu, "200%", ddisp);
-  zoom_add_zoom_amount(menu, "100%", ddisp);
-  zoom_add_zoom_amount(menu, "50%", ddisp);
-  zoom_add_zoom_amount(menu, "25%", ddisp);
-  zoom_add_zoom_amount(menu, "12%", ddisp);
+  ddisp = ddisplay_active();
+  if (!ddisp) return;
 
-  gtk_widget_show_all(menu);
+  visible = &ddisp->visible;
+  middle.x = visible->left*0.5 + visible->right*0.5;
+  middle.y = visible->top*0.5 + visible->bottom*0.5;
 
-  g_signal_connect (GTK_OBJECT (button), "button_press_event",
-		    G_CALLBACK(zoom_popup_menu),
-		      menu);
+  scale = ((real) factor)/1000.0 * DDISPLAY_NORMAL_ZOOM;
 
-  return combo;
+  ddisplay_zoom(ddisp, &middle, scale / ddisp->zoom_factor);  
 }
 
 static gboolean
@@ -655,7 +655,8 @@
   ddisp->menu_bar = NULL;
 
   /* Stand-alone window Zoom status/menu */
-  ddisp->zoom_status = NULL;
+  ddisp->zoom_status = g_object_get_data (G_OBJECT (ui.toolbar), 
+                                          DIA_INTEGRATED_UI_MAIN_TOOLBAR_ZOOM_COMBO);
 
   /* Stand-alone window Grid on/off button */
   ddisp->grid_status = NULL;
@@ -908,7 +909,8 @@
   */
 
   /* Zoom status pseudo-optionmenu */
-  ddisp->zoom_status = create_zoom_widget(ddisp);
+  ddisp->zoom_status = create_zoom_combo ();
+
   zoom_hbox = gtk_hbox_new(FALSE, 0);
   zoom_label = gtk_label_new(_("Zoom"));
   gtk_box_pack_start (GTK_BOX(zoom_hbox), zoom_label,
Index: app/interface.h
===================================================================
--- app/interface.h	(revision 3796)
+++ app/interface.h	(working copy)
@@ -67,6 +67,8 @@
 
 GtkWidget *interface_get_toolbox_shell(void);
 
+GtkWidget *create_zoom_combo (void);
+
 void tool_select_callback(GtkWidget *widget, gpointer data);
 void create_integrated_ui (void);
 void create_tree_window(void);
Index: app/menus.c
===================================================================
--- app/menus.c	(revision 3796)
+++ app/menus.c	(working copy)
@@ -49,12 +49,9 @@
 #define DIA_SHOW_TEAROFFS TRUE
 
 /* Integrated UI Toolbar Constants */
-#define DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO  "dia-integrated-toolbar-zoom-combo_entry"
 #define DIA_INTEGRATED_TOOLBAR_SNAP_GRID   "dia-integrated-toolbar-snap-grid"
 #define DIA_INTEGRATED_TOOLBAR_OBJECT_SNAP "dia-integrated-toolbar-object-snap"
 
-#define ZOOM_FIT        _("Fit")
-
 static void plugin_callback (GtkWidget *widget, gpointer data);
 
 static GtkWidget * 
@@ -408,27 +405,6 @@
   }
 }
 
-/**
- * Sets the zoom text for the toolbar
- * @param toolbar Integrated UI toolbar.
- * @param text Current zoom percentage for the active window 
- */
-void integrated_ui_toolbar_set_zoom_text (GtkToolbar *toolbar, const gchar * text)
-{
-  if (toolbar)
-  {
-    GtkComboBoxEntry *combo_entry = g_object_get_data (G_OBJECT (toolbar), 
-                                                       DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO);
-    
-    if (combo_entry)
-    {
-        GtkWidget * entry = gtk_bin_get_child (GTK_BIN (combo_entry));
-
-        gtk_entry_set_text (GTK_ENTRY (entry), text);
-    }
-  }
-}
-
 /** 
  * Adds a widget to the toolbar making sure that it doesn't take any excess space, and
  * vertically centers it.
@@ -451,45 +427,6 @@
     gtk_widget_show (w);
 }
 
-static void
-integrated_ui_toolbar_zoom_activate (GtkWidget *item, 
-                                     gpointer   user_data)
-{
-    const gchar *text =  gtk_entry_get_text (GTK_ENTRY (item));
-    float        zoom_percent;
-
-    if (sscanf (text, "%f", &zoom_percent) == 1)
-    {
-        view_zoom_set (10.0 * zoom_percent);
-    }
-}
-
-static void
-integrated_ui_toolbar_zoom_combo_selection_changed (GtkComboBox *combo,
-                                                    gpointer     user_data)
-{
-    /* 
-     * We call gtk_combo_get_get_active() so that typing in the combo entry
-     * doesn't get handled as a selection change                           
-     */
-    if (gtk_combo_box_get_active (combo) != -1)
-    {
-        float zoom_percent;
-        gchar * text = gtk_combo_box_get_active_text (combo);
-
-        if (sscanf (text, "%f", &zoom_percent) == 1)
-        {
-            view_zoom_set (zoom_percent * 10.0);
-        }
-        else if (g_strcasecmp (text, ZOOM_FIT) == 0)
-        {
-            view_show_all_callback (NULL);
-        }
-        
-        g_free (text);
-    }
-}
-
 /**
  * Create the toolbar for the integrated UI
  * @return Main toolbar (GtkToolbar*) for the integrated UI main window
@@ -516,38 +453,12 @@
   g_free (uifile);  
 
   /* Zoom Combo Box Entry */
-  w = gtk_combo_box_entry_new_text ();
-
+  w = create_zoom_combo ();
+  integrated_ui_toolbar_add_custom_item (toolbar, w);
   g_object_set_data (G_OBJECT (toolbar), 
-                     DIA_INTEGRATED_TOOLBAR_ZOOM_COMBO,
+                     DIA_INTEGRATED_UI_MAIN_TOOLBAR_ZOOM_COMBO,
                      w);
-  integrated_ui_toolbar_add_custom_item (toolbar, w);
  
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), ZOOM_FIT);
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("800%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("400%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("300%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("200%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("150%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("100%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("75%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("50%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("25%"));
-  gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("10%"));
-
-  g_signal_connect (G_OBJECT (w), 
-                    "changed",
-		            G_CALLBACK (integrated_ui_toolbar_zoom_combo_selection_changed), 
-                    NULL);
-  
-  /* Get the combo's GtkEntry child to set the width for the widget */
-  w = gtk_bin_get_child (GTK_BIN (w));
-  gtk_entry_set_width_chars (GTK_ENTRY (w), 6);
-  
-  g_signal_connect (GTK_OBJECT (w), "activate",
-		            G_CALLBACK(integrated_ui_toolbar_zoom_activate),
-		            NULL);
-  
   /* Seperator */
   sep = gtk_separator_tool_item_new ();
   gtk_toolbar_insert (toolbar, sep, -1);
Index: app/menus.h
===================================================================
--- app/menus.h	(revision 3796)
+++ app/menus.h	(working copy)
@@ -97,5 +97,11 @@
 #define VIEW_MAIN_TOOLBAR_ACTION     "ViewMainToolbar"
 #define VIEW_MAIN_STATUSBAR_ACTION   "ViewMainStatusbar"
 
+/* 
+ * Used for retrieving the zoom combo widget from the integrated UI's toolbar.
+ * This is not applicable to the distributed UI.
+ */
+#define DIA_INTEGRATED_UI_MAIN_TOOLBAR_ZOOM_COMBO    "main-toolbar-zoom-combo"
+
 #endif /* MENUS_H */
 
Index: autogen.sh
===================================================================
--- autogen.sh	(revision 3796)
+++ autogen.sh	(working copy)
@@ -88,7 +88,7 @@
     echo "$@" >&2
 }
 
-conf_flags="--enable-maintainer-mode --enable-db2html"
+conf_flags="--enable-maintainer-mode --enable-debug=yes"
 if test x$NOCONFIGURE = x; then
     if [ "$#" = 0 ]; then
       printerr "**Warning**: I am going to run \`configure' with no arguments."


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]