Code

inkscape-comboboxentry-action:
authortavmjong-free <tavmjong@free.fr>
Tue, 27 Apr 2010 18:24:44 +0000 (20:24 +0200)
committertavmjong-free <tavmjong@free.fr>
Tue, 27 Apr 2010 18:24:44 +0000 (20:24 +0200)
Add option to add extra width to GtkComboBox.
Add names to widgets so styles can be set with RC files.
toolbox.cpp:
Add extra width to font-family GtkComboBox.
Change style of font-family drop-down from menu to list.

src/ink-comboboxentry-action.cpp
src/ink-comboboxentry-action.h
src/widgets/toolbox.cpp

index de0af347c7699e1f117e151f53da8c63f15964c0..cfaf09901ccc3b0dc0cb58fd31d53b5bb025bde5 100644 (file)
@@ -4,6 +4,8 @@
  *   Setting GtkEntryBox width in characters.
  *   Passing a function for formatting cells.
  *   Displaying a warning if text isn't in list.
+ *   Setting names for GtkComboBoxEntry and GtkEntry (actionName_combobox, actionName_entry)
+ *     to allow setting resources.
  *
  * Author(s):
  *   Tavmjong Bah
@@ -46,7 +48,8 @@ enum {
   PROP_MODEL = 1,
   PROP_COMBOBOX,
   PROP_ENTRY,
-  PROP_WIDTH,
+  PROP_ENTRY_WIDTH,
+  PROP_EXTRA_WIDTH,
   PROP_CELL_DATA_FUNC,
   PROP_POPUP
 };
@@ -87,8 +90,12 @@ static void ink_comboboxentry_action_set_property (GObject *object, guint proper
     action->entry = GTK_ENTRY( g_value_get_object( value ));
     break;
 
-  case PROP_WIDTH:
-    action->width = g_value_get_int( value );
+  case PROP_ENTRY_WIDTH:
+    action->entry_width = g_value_get_int( value );
+    break;
+
+  case PROP_EXTRA_WIDTH:
+    action->extra_width = g_value_get_int( value );
     break;
 
   case PROP_CELL_DATA_FUNC:
@@ -123,8 +130,12 @@ static void ink_comboboxentry_action_get_property (GObject *object, guint proper
     g_value_set_object (value, action->entry);
     break;
 
-  case PROP_WIDTH:
-    g_value_set_int (value, action->width);
+  case PROP_ENTRY_WIDTH:
+    g_value_set_int (value, action->entry_width);
+    break;
+
+  case PROP_EXTRA_WIDTH:
+    g_value_set_int (value, action->extra_width);
     break;
 
   case PROP_CELL_DATA_FUNC:
@@ -197,13 +208,22 @@ static void ink_comboboxentry_action_class_init (Ink_ComboBoxEntry_ActionClass *
                                                         (GParamFlags)G_PARAM_READABLE));
   g_object_class_install_property (
                                    gobject_class,
-                                   PROP_WIDTH,
-                                   g_param_spec_int ("width",
+                                   PROP_ENTRY_WIDTH,
+                                   g_param_spec_int ("entry_width",
                                                      "EntryBox width",
                                                      "EntryBox width (characters)",
                                                      -1.0, 100, -1.0,
                                                      (GParamFlags)G_PARAM_READWRITE));
 
+  g_object_class_install_property (
+                                   gobject_class,
+                                   PROP_EXTRA_WIDTH,
+                                   g_param_spec_int ("extra_width",
+                                                     "Extra width",
+                                                     "Extra width (px)",
+                                                     -1.0, 500, -1.0,
+                                                     (GParamFlags)G_PARAM_READWRITE));
+
   g_object_class_install_property (
                                    gobject_class,
                                    PROP_CELL_DATA_FUNC,
@@ -287,7 +307,8 @@ Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new (const gchar   *name,
                                                         const gchar   *tooltip,
                                                         const gchar   *stock_id,
                                                         GtkTreeModel  *model,
-                                                        gint           width,
+                                                        gint           entry_width,
+                                                        gint           extra_width,
                                                         void          *cell_data_func )
 {
   g_return_val_if_fail (name != NULL, NULL);
@@ -298,7 +319,8 @@ Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new (const gchar   *name,
                                                   "tooltip",        tooltip,
                                                   "stock-id",       stock_id,
                                                   "model",          model,
-                                                  "width",          width,
+                                                  "entry_width",    entry_width,
+                                                  "extra_width",    extra_width,
                                                   "cell_data_func", cell_data_func,
                                                   NULL);
 }
@@ -312,9 +334,17 @@ GtkWidget* create_tool_item( GtkAction* action )
 
     Ink_ComboBoxEntry_Action* ink_comboboxentry_action = INK_COMBOBOXENTRY_ACTION( action );
 
+    gchar *action_name = g_strdup( gtk_action_get_name( action ) );
+    gchar *combobox_name = g_strjoin( NULL, action_name, "_combobox", NULL );
+    gchar *entry_name =    g_strjoin( NULL, action_name, "_entry", NULL );
+    g_free( action_name );
+
     item = GTK_WIDGET( gtk_tool_item_new() );
 
     GtkWidget* comboBoxEntry = gtk_combo_box_entry_new_with_model( ink_comboboxentry_action->model, 0 );
+    // Name it so we can muck with it using an RC file
+    gtk_widget_set_name( comboBoxEntry, combobox_name );
+    g_free( combobox_name );
 
     {
         GtkWidget *align = gtk_alignment_new(0, 0.5, 0, 0);
@@ -346,14 +376,28 @@ GtkWidget* create_tool_item( GtkAction* action )
                                           NULL, NULL );
     }
 
+    // Optionally widen the combobox width... which widens the drop-down list in list mode.
+    if( ink_comboboxentry_action->extra_width > 0 ) {
+      GtkRequisition req;
+      gtk_widget_size_request( GTK_WIDGET( ink_comboboxentry_action->combobox ), &req );
+      gtk_widget_set_size_request( GTK_WIDGET( ink_comboboxentry_action->combobox ),
+                                  req.width + ink_comboboxentry_action->extra_width, -1 );
+    }
+
     // Get reference to GtkEntry and fiddle a bit with it.
     GtkWidget *child = gtk_bin_get_child( GTK_BIN(comboBoxEntry) );
+
+    // Name it so we can muck with it using an RC file
+    gtk_widget_set_name( child, entry_name );
+    g_free( entry_name );
+
     if( child && GTK_IS_ENTRY( child ) ) {
+
       ink_comboboxentry_action->entry = GTK_ENTRY(child);
 
       // Change width
-      if( ink_comboboxentry_action->width > 0 ) {
-          gtk_entry_set_width_chars (GTK_ENTRY (child), ink_comboboxentry_action->width );
+      if( ink_comboboxentry_action->entry_width > 0 ) {
+          gtk_entry_set_width_chars (GTK_ENTRY (child), ink_comboboxentry_action->entry_width );
       }
 
       // Add pop-up entry completion if required
@@ -465,13 +509,25 @@ gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* ink
   return found;
 }
 
-void ink_comboboxentry_action_set_width( Ink_ComboBoxEntry_Action* action, gint width ) {
+void ink_comboboxentry_action_set_entry_width( Ink_ComboBoxEntry_Action* action, gint entry_width ) {
 
-  action->width = width;
+  action->entry_width = entry_width;
 
   // Widget may not have been created....
   if( action->entry ) {
-    gtk_entry_set_width_chars( GTK_ENTRY(action->entry), width );
+    gtk_entry_set_width_chars( GTK_ENTRY(action->entry), entry_width );
+  }
+}
+
+void ink_comboboxentry_action_set_extra_width( Ink_ComboBoxEntry_Action* action, gint extra_width ) {
+
+  action->extra_width = extra_width;
+
+  // Widget may not have been created....
+  if( action->combobox ) {
+    GtkRequisition req;
+    gtk_widget_size_request( GTK_WIDGET( action->combobox ), &req );
+    gtk_widget_set_size_request( GTK_WIDGET( action->combobox ), req.width + action->extra_width, -1 );
   }
 }
 
index 031803d8ab43720592fa0fbbdf835f264198fd60..e080e6cdf90a54913d020d04227a7cdbdec2345e 100644 (file)
@@ -4,6 +4,8 @@
  *   Setting GtkEntryBox width in characters.
  *   Passing a function for formatting cells.
  *   Displaying a warning if text isn't in list.
+ *   Setting names for GtkComboBoxEntry and GtkEntry (actionName_combobox, actionName_entry)
+ *     to allow setting resources.
  *
  * Author(s):
  *   Tavmjong Bah
@@ -55,7 +57,8 @@ struct _Ink_ComboBoxEntry_Action {
 
   gint                active;     // Index of active menu item (-1 if not in list).
   gchar              *text;       // Text of active menu item or entry box.
-  gint                width;      // Width of GtkComboBoxEntry in characters.
+  gint                entry_width;// Width of GtkEntry in characters.
+  gint                extra_width;// Extra Width of GtkComboBox.. to widen drop-down list in list mode.
   gboolean            popup;      // Do we pop-up an entry-completion dialog?
   gchar              *warning;    // Text for warning that entry isn't in list.
   gchar              *altx_name;  // Target for Alt-X keyboard shortcut.
@@ -68,12 +71,13 @@ GType ink_comboboxentry_action_get_type (void);
  * Creates a GtkAction subclass that wraps a GtkComboBoxEntry object.
  */
 Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new ( const gchar  *name,
-                                                         const gchar  *label,
-                                                         const gchar  *tooltip,
-                                                         const gchar  *stock_id,
-                                                         GtkTreeModel *model,
-                                                         gint          width = -1,
-                                                         gpointer cell_data_func = NULL );
+                                                        const gchar  *label,
+                                                        const gchar  *tooltip,
+                                                        const gchar  *stock_id,
+                                                        GtkTreeModel *model,
+                                                        gint          entry_width = -1,
+                                                        gint          extra_width = -1,
+                                                        gpointer cell_data_func = NULL );
 
 GtkTreeModel     *ink_comboboxentry_action_get_model( Ink_ComboBoxEntry_Action* action );
 GtkComboBoxEntry *ink_comboboxentry_action_get_comboboxentry( Ink_ComboBoxEntry_Action* action );
@@ -81,7 +85,8 @@ GtkComboBoxEntry *ink_comboboxentry_action_get_comboboxentry( Ink_ComboBoxEntry_
 gchar*   ink_comboboxentry_action_get_active_text( Ink_ComboBoxEntry_Action* action );
 gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* action, const gchar* text );
 
-void     ink_comboboxentry_action_set_width( Ink_ComboBoxEntry_Action* action, gint width );
+void     ink_comboboxentry_action_set_entry_width( Ink_ComboBoxEntry_Action* action, gint entry_width );
+void     ink_comboboxentry_action_set_extra_width( Ink_ComboBoxEntry_Action* action, gint extra_width );
 
 void     ink_comboboxentry_action_popup_enable(  Ink_ComboBoxEntry_Action* action );
 void     ink_comboboxentry_action_popup_disable( Ink_ComboBoxEntry_Action* action );
index 978f19c4c78d8d8dee7cd27ee5d3851ecdb14fb1..2cd96491ec482f4f8bf767363797bb410ee98991 100644 (file)
@@ -6239,15 +6239,19 @@ static void cell_data_func(GtkCellLayout * /*cell_layout*/,
         Glib::ustring sample = prefs->getString("/tools/text/font_sample");
         gchar *const sample_escaped = g_markup_escape_text(sample.data(), -1);
 
-    std::stringstream markup;
-    markup << family_escaped << "  <span foreground='gray' font_family='"
-           << family_escaped << "'>" << sample_escaped << "</span>";
-    g_object_set (G_OBJECT (cell), "markup", markup.str().c_str(), NULL);
+        std::stringstream markup;
+        markup << family_escaped << "  <span foreground='gray' font_family='"
+               << family_escaped << "'>" << sample_escaped << "</span>";
+        g_object_set (G_OBJECT (cell), "markup", markup.str().c_str(), NULL);
 
         g_free(sample_escaped);
     } else {
         g_object_set (G_OBJECT (cell), "markup", family_escaped, NULL);
     }
+    // This doesn't work for two reasons... it set both selected and not selected backgrounds
+    // to white.. which means that white foreground text is invisible. It also only effects
+    // the text region, leaving the padding untouched.
+    // g_object_set (G_OBJECT (cell), "cell-background", "white", "cell-background-set", true, NULL);
 
     g_free(family);
     g_free(family_escaped);
@@ -7171,10 +7175,11 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions
 
         Ink_ComboBoxEntry_Action* act = ink_comboboxentry_action_new( "TextFontFamilyAction",
                                                                       _("Font Family"),
-                                                                      _("Select Font Family"),
+                                                                      _("Select Font Family (Alt-X to access)"),
                                                                       NULL,
                                                                       GTK_TREE_MODEL(model),
-                                                                      -1,                // Set width
+                                                                      -1,                // Entry width
+                                                                      50,                // Extra list width
                                                                       (gpointer)cell_data_func ); // Cell layout
         ink_comboboxentry_action_popup_enable( act ); // Enable entry completion
         gchar *const warning = _("Font not found on system");
@@ -7183,6 +7188,14 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions
         g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(sp_text_fontfamily_value_changed), holder );
         gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
         g_object_set_data( holder, "TextFontFamilyAction", act );
+
+        // Change style of drop-down from menu to list
+        gtk_rc_parse_string (
+            "style \"dropdown-as-list-style\"\n"
+            "{\n"
+            "    GtkComboBox::appears-as-list = 1\n"
+            "}\n"
+            "widget \"*.TextFontFamilyAction_combobox\" style \"dropdown-as-list-style\"");
     }
 
     /* Font size */