Re: How to make a button look like a treeview column title? [Was: How to use the treeview column title style for a button?]



Bastiaan Veelo wrote:
The reason why this is not going to work (for the windows theme at
least, GTK+ 2.10) is a hard-coded check on the type of widget->parent in draw_box() on line 1929 of msw_style.c:

So I faked the parent widget through some evil hacking in the expose function below. It works, for now.


#include <gtk/gtk.h>

G_BEGIN_DECLS

#define GTK_TYPE_HEADER                 (gtk_header_get_type ())
#define GTK_HEADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_HEADER, GtkMenuSheet)) #define GTK_HEADER_CLASS(klass) G_TYPE_CHECK_CLASS_CAST ((klass, GTK_TYPE_HEADER, GtkMenuSheetClass)) #define GTK_IS_HEADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_HEADER)) #define GTK_IS_HEADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HEADER)) #define GTK_HEADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_HEADER, GtkMenuSheetClass))

typedef struct _GtkHeader               GtkHeader;
typedef struct _GtkHeaderClass          GtkHeaderClass;

struct _GtkHeader
{
 GtkButton parent;
};

struct _GtkHeaderClass
{
 GtkButtonClass parent_class;
};

G_END_DECLS

GType            gtk_header_get_type                 (void) G_GNUC_CONST;
GtkWidget       *gtk_header_sheet_new                ();
static gboolean gtk_header_expose (GtkWidget *widget, GdkEventExpose *event);

static void
gtk_header_class_init (GtkHeaderClass *class)
{
 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 widget_class->expose_event = gtk_header_expose;
}

static void
gtk_header_init (GtkHeader *header)
{
}

/* GType Methods */

G_DEFINE_TYPE (GtkHeader, gtk_header, GTK_TYPE_BUTTON)

GType
gtk_header_type ()
{
 static GType header_type = 0;

 if (!header_type)
 {
   static const GTypeInfo header_info =
   {
     sizeof (GtkHeaderClass),
             NULL, /* base_init */
             NULL, /* base_finalize */
             (GClassInitFunc) gtk_header_class_init,
             NULL, /* class_finalize */
             NULL, /* class_data */
             sizeof (GtkHeader),
             0,    /* n_preallocs */
             (GInstanceInitFunc) gtk_header_init,
   };

   header_type = g_type_register_static (GTK_TYPE_BUTTON,
                                         "GtkHeader",
                                         &header_info,
                                         0);
 }
 return header_type;
}

static gboolean
gtk_header_expose (GtkWidget      *widget,
                  GdkEventExpose *event)
{
 static GtkWidget *treeview = NULL;
 if (!treeview) treeview = gtk_tree_view_new();

/* Trick draw_box() in msw_style.c on line 1929 into thinking that our parent
    is a GtkTreeView. This works on MS Windows and GTK+ 2.10.6, but it may
fail miserably when used with other themes or other versions of GTK+. */
 GtkWidget *real_parent = widget->parent;
 widget->parent = treeview;
(* GTK_WIDGET_CLASS (gtk_header_parent_class)->expose_event) (widget, event);
 widget->parent = real_parent;

 return FALSE;
}

GtkWidget*
gtk_header_new (void)
{
 return g_object_new (GTK_TYPE_HEADER, NULL);
}

int main( int   argc,
         char *argv[] )
{
 gtk_init (&argc, &argv);

 GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 g_signal_connect (window, "destroy",
                   G_CALLBACK (gtk_widget_destroyed), &window);

 GtkWidget *header = gtk_header_new();
 gtk_button_set_label (GTK_BUTTON (header), "Header");
 /* Not sure whether the folowwing is necessary. */
GtkStyle *style = gtk_rc_get_style_by_paths (gtk_widget_get_settings (header),
                                              NULL,
                                              "*.GtkTreeView.GtkButton",
                                              GTK_TYPE_BUTTON);
 gtk_widget_set_style (header, style);
 gtk_container_add (GTK_CONTAINER (window), header);

 gtk_widget_show_all(window);
 gtk_main ();

 return 0;
}





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