xed-panel: Clean up the layout of the panels

Make sure the bottom panel lays out properly when we actually have a plugin that
lives there
This commit is contained in:
JosephMcc 2016-12-26 19:32:38 -08:00
parent f9a658f823
commit 26f8139317
2 changed files with 139 additions and 68 deletions

View File

@ -47,6 +47,8 @@ struct _XedPanelPrivate
{ {
GtkOrientation orientation; GtkOrientation orientation;
GtkWidget *main_box;
/* Title bar (vertical panel only) */ /* Title bar (vertical panel only) */
GtkWidget *title_image; GtkWidget *title_image;
GtkWidget *title_label; GtkWidget *title_label;
@ -87,7 +89,7 @@ static GObject *xed_panel_constructor (GType type,
GObjectConstructParam *construct_properties); GObjectConstructParam *construct_properties);
G_DEFINE_TYPE (XedPanel, xed_panel, GTK_TYPE_BOX) G_DEFINE_TYPE (XedPanel, xed_panel, GTK_TYPE_BIN)
static void static void
xed_panel_finalize (GObject *obj) xed_panel_finalize (GObject *obj)
@ -158,6 +160,71 @@ xed_panel_focus_document (XedPanel *panel)
} }
} }
static void
xed_panel_get_size (GtkWidget *widget,
GtkOrientation orientation,
gint *minimum,
gint *natural)
{
GtkBin *bin = GTK_BIN (widget);
GtkWidget *child;
if (minimum)
{
*minimum = 0;
}
if (natural)
{
*natural = 0;
}
child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child))
{
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
gtk_widget_get_preferred_width (child, minimum, natural);
}
else
{
gtk_widget_get_preferred_height (child, minimum, natural);
}
}
}
static void
xed_panel_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural)
{
xed_panel_get_size (widget, GTK_ORIENTATION_HORIZONTAL, minimum, natural);
}
static void
xed_panel_get_preferred_height (GtkWidget *widget,
gint *minimum,
gint *natural)
{
xed_panel_get_size (widget, GTK_ORIENTATION_VERTICAL, minimum, natural);
}
static void
xed_panel_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GtkBin *bin = GTK_BIN (widget);
GtkWidget *child;
GTK_WIDGET_CLASS (xed_panel_parent_class)->size_allocate (widget, allocation);
child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child))
{
gtk_widget_size_allocate (child, allocation);
}
}
static void static void
xed_panel_grab_focus (GtkWidget *w) xed_panel_grab_focus (GtkWidget *w)
{ {
@ -191,23 +258,25 @@ xed_panel_class_init (XedPanelClass *klass)
object_class->get_property = xed_panel_get_property; object_class->get_property = xed_panel_get_property;
object_class->set_property = xed_panel_set_property; object_class->set_property = xed_panel_set_property;
g_object_class_install_property (object_class, widget_class->get_preferred_width = xed_panel_get_preferred_width;
PROP_ORIENTATION, widget_class->get_preferred_height = xed_panel_get_preferred_height;
g_param_spec_enum ("panel-orientation", widget_class->size_allocate = xed_panel_size_allocate;
"Panel Orientation",
"The panel's orientation",
GTK_TYPE_ORIENTATION,
GTK_ORIENTATION_VERTICAL,
G_PARAM_WRITABLE |
G_PARAM_READABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
widget_class->grab_focus = xed_panel_grab_focus; widget_class->grab_focus = xed_panel_grab_focus;
klass->close = xed_panel_close; klass->close = xed_panel_close;
klass->focus_document = xed_panel_focus_document; klass->focus_document = xed_panel_focus_document;
g_object_class_install_property (object_class,
PROP_ORIENTATION,
g_param_spec_enum ("orientation",
"Panel Orientation",
"The panel's orientation",
GTK_TYPE_ORIENTATION,
GTK_ORIENTATION_VERTICAL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
signals[ITEM_ADDED] = signals[ITEM_ADDED] =
g_signal_new ("item_added", g_signal_new ("item_added",
G_OBJECT_CLASS_TYPE (klass), G_OBJECT_CLASS_TYPE (klass),
@ -384,7 +453,9 @@ xed_panel_init (XedPanel *panel)
{ {
panel->priv = XED_PANEL_GET_PRIVATE (panel); panel->priv = XED_PANEL_GET_PRIVATE (panel);
gtk_orientable_set_orientation (GTK_ORIENTABLE (panel), GTK_ORIENTATION_VERTICAL); panel->priv->main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_show (panel->priv->main_box);
gtk_container_add (GTK_CONTAINER (panel), panel->priv->main_box);
} }
static void static void
@ -441,7 +512,7 @@ build_horizontal_panel (XedPanel *panel)
gtk_widget_show_all (box); gtk_widget_show_all (box);
gtk_box_pack_start (GTK_BOX (panel), box, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (panel->priv->main_box), box, TRUE, TRUE, 0);
} }
static void static void
@ -456,7 +527,7 @@ build_vertical_panel (XedPanel *panel)
title_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); title_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
gtk_container_set_border_width (GTK_CONTAINER (title_hbox), 5); gtk_container_set_border_width (GTK_CONTAINER (title_hbox), 5);
gtk_box_pack_start (GTK_BOX (panel), title_hbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (panel->priv->main_box), title_hbox, FALSE, FALSE, 0);
icon_name_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); icon_name_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_pack_start (GTK_BOX (title_hbox), icon_name_hbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (title_hbox), icon_name_hbox, TRUE, TRUE, 0);
@ -477,7 +548,7 @@ build_vertical_panel (XedPanel *panel)
gtk_widget_show_all (title_hbox); gtk_widget_show_all (title_hbox);
gtk_box_pack_start (GTK_BOX (panel), panel->priv->notebook, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (panel->priv->main_box), panel->priv->notebook, TRUE, TRUE, 0);
} }
static GObject * static GObject *

View File

@ -38,12 +38,12 @@ G_BEGIN_DECLS
/* /*
* Type checking and casting macros * Type checking and casting macros
*/ */
#define XED_TYPE_PANEL (xed_panel_get_type()) #define XED_TYPE_PANEL (xed_panel_get_type())
#define XED_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_PANEL, XedPanel)) #define XED_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_PANEL, XedPanel))
#define XED_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_PANEL, XedPanelClass)) #define XED_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_PANEL, XedPanelClass))
#define XED_IS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_PANEL)) #define XED_IS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_PANEL))
#define XED_IS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_PANEL)) #define XED_IS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_PANEL))
#define XED_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_PANEL, XedPanelClass)) #define XED_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_PANEL, XedPanelClass))
/* Private structure type */ /* Private structure type */
typedef struct _XedPanelPrivate XedPanelPrivate; typedef struct _XedPanelPrivate XedPanelPrivate;
@ -55,10 +55,10 @@ typedef struct _XedPanel XedPanel;
struct _XedPanel struct _XedPanel
{ {
GtkBox vbox; GtkBin parent;
/*< private > */ /*< private > */
XedPanelPrivate *priv; XedPanelPrivate *priv;
}; };
/* /*
@ -68,62 +68,62 @@ typedef struct _XedPanelClass XedPanelClass;
struct _XedPanelClass struct _XedPanelClass
{ {
GtkBoxClass parent_class; GtkBinClass parent_class;
void (* item_added) (XedPanel *panel, void (* item_added) (XedPanel *panel,
GtkWidget *item); GtkWidget *item);
void (* item_removed) (XedPanel *panel, void (* item_removed) (XedPanel *panel,
GtkWidget *item); GtkWidget *item);
/* Keybinding signals */ /* Keybinding signals */
void (* close) (XedPanel *panel); void (* close) (XedPanel *panel);
void (* focus_document) (XedPanel *panel); void (* focus_document) (XedPanel *panel);
/* Padding for future expansion */ /* Padding for future expansion */
void (*_xed_reserved1) (void); void (*_xed_reserved1) (void);
void (*_xed_reserved2) (void); void (*_xed_reserved2) (void);
void (*_xed_reserved3) (void); void (*_xed_reserved3) (void);
void (*_xed_reserved4) (void); void (*_xed_reserved4) (void);
}; };
/* /*
* Public methods * Public methods
*/ */
GType xed_panel_get_type (void) G_GNUC_CONST; GType xed_panel_get_type (void) G_GNUC_CONST;
GtkWidget *xed_panel_new (GtkOrientation orientation); GtkWidget *xed_panel_new (GtkOrientation orientation);
void xed_panel_add_item (XedPanel *panel, void xed_panel_add_item (XedPanel *panel,
GtkWidget *item, GtkWidget *item,
const gchar *name, const gchar *name,
GtkWidget *image); GtkWidget *image);
void xed_panel_add_item_with_stock_icon (XedPanel *panel, void xed_panel_add_item_with_stock_icon (XedPanel *panel,
GtkWidget *item, GtkWidget *item,
const gchar *name, const gchar *name,
const gchar *stock_id); const gchar *stock_id);
gboolean xed_panel_remove_item (XedPanel *panel, gboolean xed_panel_remove_item (XedPanel *panel,
GtkWidget *item); GtkWidget *item);
gboolean xed_panel_activate_item (XedPanel *panel, gboolean xed_panel_activate_item (XedPanel *panel,
GtkWidget *item); GtkWidget *item);
gboolean xed_panel_item_is_active (XedPanel *panel, gboolean xed_panel_item_is_active (XedPanel *panel,
GtkWidget *item); GtkWidget *item);
GtkOrientation xed_panel_get_orientation (XedPanel *panel); GtkOrientation xed_panel_get_orientation (XedPanel *panel);
gint xed_panel_get_n_items (XedPanel *panel); gint xed_panel_get_n_items (XedPanel *panel);
/* /*
* Non exported functions * Non exported functions
*/ */
gint _xed_panel_get_active_item_id (XedPanel *panel); gint _xed_panel_get_active_item_id (XedPanel *panel);
void _xed_panel_set_active_item_by_id (XedPanel *panel, void _xed_panel_set_active_item_by_id (XedPanel *panel,
gint id); gint id);
G_END_DECLS G_END_DECLS