static void spaning_renderer_render (GtkCellRenderer *cell, cairo_t *cr, GtkWidget *widget, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) { GiggleSpaningRendererPriv *priv = GET_PRIV (cell); GtkTreeViewColumn *first_column, *last_column; GdkRectangle first_area, last_area; int first = priv->first; int last = priv->last; GdkRectangle real_background_area; GdkRectangle real_cell_area; GList *columns; columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (widget)); if (last < 0) last = g_list_length (columns) - 1; first_column = g_list_nth_data (columns, first); last_column = g_list_nth_data (columns, last); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (first_column)); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (last_column)); gtk_tree_view_get_cell_area (GTK_TREE_VIEW (widget), NULL, first_column, &first_area); gtk_tree_view_get_cell_area (GTK_TREE_VIEW (widget), NULL, last_column, &last_area); real_cell_area.x = first_area.x; real_cell_area.y = cell_area->y; real_cell_area.width = last_area.x + last_area.width - first_area.x; real_cell_area.height = cell_area->height; gtk_tree_view_get_background_area (GTK_TREE_VIEW (widget), NULL, first_column, &first_area); gtk_tree_view_get_background_area (GTK_TREE_VIEW (widget), NULL, last_column, &last_area); real_background_area.x = first_area.x; real_background_area.y = cell_area->y; real_background_area.width = last_area.x + last_area.width - first_area.x; real_background_area.height = cell_area->height; GTK_CELL_RENDERER_CLASS (giggle_spaning_renderer_parent_class)->render (cell, cr, widget, &real_background_area, &real_cell_area, flags); g_list_free (columns); }
gboolean glade_gtk_treeview_add_verify (GladeWidgetAdaptor *adaptor, GtkWidget *container, GtkWidget *child, gboolean user_feedback) { if (!GTK_IS_TREE_VIEW_COLUMN (child)) { if (user_feedback) { GladeWidgetAdaptor *cell_adaptor = glade_widget_adaptor_get_by_type (GTK_TYPE_TREE_VIEW_COLUMN); glade_util_ui_message (glade_app_get_window (), GLADE_UI_INFO, NULL, ONLY_THIS_GOES_IN_THAT_MSG, glade_widget_adaptor_get_title (cell_adaptor), glade_widget_adaptor_get_title (adaptor)); } return FALSE; } return TRUE; }
void glade_gtk_treeview_replace_child (GladeWidgetAdaptor * adaptor, GObject * container, GObject * current, GObject * new_column) { GtkTreeView *view = GTK_TREE_VIEW (container); GList *columns; GtkTreeViewColumn *column; GladeWidget *gcolumn; gint index; if (!GTK_IS_TREE_VIEW_COLUMN (current)) return; column = GTK_TREE_VIEW_COLUMN (current); columns = gtk_tree_view_get_columns (view); index = g_list_index (columns, column); g_list_free (columns); gtk_tree_view_remove_column (view, column); column = GTK_TREE_VIEW_COLUMN (new_column); gtk_tree_view_insert_column (view, column, index); if (gtk_tree_view_get_fixed_height_mode (view)) { gcolumn = glade_widget_get_from_gobject (column); glade_widget_property_set (gcolumn, "sizing", GTK_TREE_VIEW_COLUMN_FIXED); glade_widget_property_set_sensitive (gcolumn, "sizing", FALSE, INSENSITIVE_COLUMN_SIZING_MSG); } glade_gtk_cell_layout_sync_attributes (G_OBJECT (column)); }
static GtkWidget * gtk_cell_layout_get_widget (GtkCellLayout *layout) { if (GTK_IS_TREE_VIEW_COLUMN (layout)) return gtk_tree_view_column_get_tree_view (GTK_TREE_VIEW_COLUMN (layout)); else if (GTK_IS_WIDGET (layout)) return GTK_WIDGET (layout); else return NULL; }
static GtkTreeModel * gtk_cell_layout_get_model (GtkCellLayout *layout) { if (GTK_IS_TREE_VIEW_COLUMN (layout)) return gtk_tree_view_get_model (GTK_TREE_VIEW (gtk_tree_view_column_get_tree_view (GTK_TREE_VIEW_COLUMN (layout)))); else if (GTK_IS_ICON_VIEW (layout)) return gtk_icon_view_get_model (GTK_ICON_VIEW (layout)); else if (GTK_IS_COMBO_BOX (layout)) return gtk_combo_box_get_model (GTK_COMBO_BOX (layout)); else return NULL; }
void glade_gtk_treeview_remove_child (GladeWidgetAdaptor * adaptor, GObject * container, GObject * child) { GtkTreeView *view = GTK_TREE_VIEW (container); GtkTreeViewColumn *column; if (!GTK_IS_TREE_VIEW_COLUMN (child)) return; column = GTK_TREE_VIEW_COLUMN (child); gtk_tree_view_remove_column (view, column); }
static void on_row_activated (GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, SeahorseKeyserverResults *self) { SeahorseObject *obj; g_return_if_fail (SEAHORSE_IS_KEYSERVER_RESULTS (self)); g_return_if_fail (GTK_IS_TREE_VIEW (view)); g_return_if_fail (path != NULL); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column)); obj = seahorse_key_manager_store_get_object_from_path (view, path); if (obj != NULL) seahorse_viewer_show_properties (SEAHORSE_VIEWER (self), obj); }
static gchar * glade_gtk_sheet_layout_get_display_name (GladeBaseEditor *editor, GladeWidget *gchild, gpointer user_data) { GObject *child = glade_widget_get_object (gchild); gchar *name; if (GTK_IS_TREE_VIEW_COLUMN (child)) glade_widget_property_get (gchild, "title", &name); else name = gchild->name; #ifdef GTK_SHEET_DEBUG g_debug("glade_gtk_sheet_layout_get_display_name: called <%s>", name ? name : "NULL"); #endif return g_strdup (name); }
gboolean qtcTreeViewCellIsLeftOfExpanderColumn(GtkTreeView *treeView, GtkTreeViewColumn *column) { // check expander column GtkTreeViewColumn *expanderColumn = gtk_tree_view_get_expander_column(treeView); if (!expanderColumn || column == expanderColumn) { return false; } else { bool found = false; bool isLeft = false; // get all columns GList *columns = gtk_tree_view_get_columns(treeView); for (GList *child = columns;child;child = g_list_next(child)) { if (!GTK_IS_TREE_VIEW_COLUMN(child->data)) { continue; } GtkTreeViewColumn *childCol = GTK_TREE_VIEW_COLUMN(child->data); if (childCol == expanderColumn) { if (found) { isLeft = true; } } else if (found) { break; } else if (column == childCol) { found = true; } } if (columns) { g_list_free(columns); } return isLeft; } }
void glade_gtk_treeview_add_child (GladeWidgetAdaptor * adaptor, GObject * container, GObject * child) { GtkTreeView *view = GTK_TREE_VIEW (container); GtkTreeViewColumn *column; GladeWidget *gcolumn; if (!GTK_IS_TREE_VIEW_COLUMN (child)) return; if (gtk_tree_view_get_fixed_height_mode (view)) { gcolumn = glade_widget_get_from_gobject (child); glade_widget_property_set (gcolumn, "sizing", GTK_TREE_VIEW_COLUMN_FIXED); glade_widget_property_set_sensitive (gcolumn, "sizing", FALSE, INSENSITIVE_COLUMN_SIZING_MSG); } column = GTK_TREE_VIEW_COLUMN (child); gtk_tree_view_append_column (view, column); glade_gtk_cell_layout_sync_attributes (G_OBJECT (column)); }
/** * na_gtk_utils_set_editable: * @widget: the #GtkWdiget. * @editable: whether the @widget is editable or not. * * Try to set a visual indication of whether the @widget is editable or not. * * Having a GtkWidget should be enough, but we also deal with a GtkTreeViewColumn. * So the most-bottom common ancestor is just GObject (since GtkObject having been * deprecated in Gtk+-3.0) * * Note that using 'sensitivity' property is just a work-around because the * two things have distinct semantics: * - editable: whether we are allowed to modify the value (is not read-only) * - sensitive: whether the value is relevant (has a sense in this context) */ void na_gtk_utils_set_editable( GObject *widget, gboolean editable ) { GList *renderers, *irender; /* GtkComboBoxEntry is deprecated from Gtk+3 * see. http://git.gnome.org/browse/gtk+/commit/?id=9612c648176378bf237ad0e1a8c6c995b0ca7c61 * while 'has_entry' property exists since 2.24 */ #if GTK_CHECK_VERSION( 2,24,0 ) if( GTK_IS_COMBO_BOX( widget ) && gtk_combo_box_get_has_entry( GTK_COMBO_BOX( widget ))){ #else if( GTK_IS_COMBO_BOX_ENTRY( widget )){ #endif /* idem as GtkEntry */ gtk_editable_set_editable( GTK_EDITABLE( gtk_bin_get_child( GTK_BIN( widget ))), editable ); g_object_set( G_OBJECT( gtk_bin_get_child( GTK_BIN( widget ))), "can-focus", editable, NULL ); /* disable the listbox button itself */ gtk_combo_box_set_button_sensitivity( GTK_COMBO_BOX( widget ), editable ? GTK_SENSITIVITY_ON : GTK_SENSITIVITY_OFF ); } else if( GTK_IS_COMBO_BOX( widget )){ /* disable the listbox button itself */ gtk_combo_box_set_button_sensitivity( GTK_COMBO_BOX( widget ), editable ? GTK_SENSITIVITY_ON : GTK_SENSITIVITY_OFF ); } else if( GTK_IS_ENTRY( widget )){ gtk_editable_set_editable( GTK_EDITABLE( widget ), editable ); /* removing the frame leads to a disturbing modification of the * height of the control */ /*g_object_set( G_OBJECT( widget ), "has-frame", editable, NULL );*/ /* this prevents the caret to be displayed when we click in the entry */ g_object_set( G_OBJECT( widget ), "can-focus", editable, NULL ); } else if( GTK_IS_TEXT_VIEW( widget )){ g_object_set( G_OBJECT( widget ), "can-focus", editable, NULL ); gtk_text_view_set_editable( GTK_TEXT_VIEW( widget ), editable ); } else if( GTK_IS_TOGGLE_BUTTON( widget )){ /* transforms to a quasi standard GtkButton */ /*g_object_set( G_OBJECT( widget ), "draw-indicator", editable, NULL );*/ /* this at least prevent the keyboard focus to go to the button * (which is better than nothing) */ g_object_set( G_OBJECT( widget ), "can-focus", editable, NULL ); } else if( GTK_IS_TREE_VIEW_COLUMN( widget )){ renderers = gtk_cell_layout_get_cells( GTK_CELL_LAYOUT( GTK_TREE_VIEW_COLUMN( widget ))); for( irender = renderers ; irender ; irender = irender->next ){ if( GTK_IS_CELL_RENDERER_TEXT( irender->data )){ g_object_set( G_OBJECT( irender->data ), "editable", editable, "editable-set", TRUE, NULL ); } } g_list_free( renderers ); } else if( GTK_IS_BUTTON( widget )){ gtk_widget_set_sensitive( GTK_WIDGET( widget ), editable ); } } /** * na_gtk_utils_radio_set_initial_state: * @button: the #GtkRadioButton button which is initially active. * @handler: the corresponding "toggled" handler. * @user_data: the user data associated to the handler. * @editable: whether this radio button group is editable. * @sensitive: whether this radio button group is sensitive. * * This function should be called for the button which is initially active * inside of a radio button group when the radio group may happen to not be * editable. * This function should be called only once for the radio button group. * * It does the following operations: * - set the button as active * - set other buttons of the radio button group as icactive * - set all buttons of radio button group as @editable * * The initially active @button, along with its @handler, are recorded * as properties of the radio button group (actually as properties of each * radio button of the group), so that they can later be used to reset the * initial state. */ void na_gtk_utils_radio_set_initial_state( GtkRadioButton *button, GCallback handler, void *user_data, gboolean editable, gboolean sensitive ) { GSList *group, *ig; GtkRadioButton *other; group = gtk_radio_button_get_group( button ); for( ig = group ; ig ; ig = ig->next ){ other = GTK_RADIO_BUTTON( ig->data ); g_object_set_data( G_OBJECT( other ), NA_TOGGLE_DATA_BUTTON, button ); g_object_set_data( G_OBJECT( other ), NA_TOGGLE_DATA_HANDLER, handler ); g_object_set_data( G_OBJECT( other ), NA_TOGGLE_DATA_USER_DATA, user_data ); g_object_set_data( G_OBJECT( other ), NA_TOGGLE_DATA_EDITABLE, GUINT_TO_POINTER( editable )); na_gtk_utils_set_editable( G_OBJECT( other ), editable ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( other ), FALSE ); gtk_widget_set_sensitive( GTK_WIDGET( other ), sensitive ); } gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( button ), TRUE ); }