diff options
Diffstat (limited to 'endless/eosmainarea.c')
-rw-r--r-- | endless/eosmainarea.c | 435 |
1 files changed, 0 insertions, 435 deletions
diff --git a/endless/eosmainarea.c b/endless/eosmainarea.c deleted file mode 100644 index 81920d8..0000000 --- a/endless/eosmainarea.c +++ /dev/null @@ -1,435 +0,0 @@ -/* Copyright 2013 Endless Mobile, Inc. */ - -#include "config.h" -#include "eosmainarea-private.h" - -#include <gtk/gtk.h> - -/* - * SECTION:main_area - * @short_description: The main area for your application, under the top bar. - * @title: EosMainArea - * - * EosMainArea has three areas it manages for you: the left toolbar area, the - * right action area, and the center content area. They can be set with the - * toolbar, actions and content properties. You will just about always want to - * set the content widget to display something, but the toolbar and action - * area will not appear unless set. - */ - -typedef struct { - GtkWidget *toolbox; - GtkWidget *content; - GtkWidget *actions_standin; - guint actions_visible : 1; -} EosMainAreaPrivate; - -G_DEFINE_TYPE_WITH_PRIVATE (EosMainArea, eos_main_area, GTK_TYPE_CONTAINER) - -static void -eos_main_area_get_preferred_width (GtkWidget *widget, - gint *minimal, - gint *natural) -{ - EosMainArea *self = EOS_MAIN_AREA (widget); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - - GtkWidget *toolbox = priv->toolbox; - GtkWidget *content = priv->content; - *minimal = *natural = 0; - - if ((toolbox && gtk_widget_get_visible (toolbox)) || - priv->actions_visible) - { - gint toolbox_minimal, toolbox_natural; - gtk_widget_get_preferred_width (toolbox, - &toolbox_minimal, &toolbox_natural); - - *minimal += 2 * toolbox_minimal; - *natural += 2 * toolbox_natural; - } - - if (content && gtk_widget_get_visible (content)) - { - gint content_minimal, content_natural; - gtk_widget_get_preferred_width (content, - &content_minimal, &content_natural); - - *minimal += content_minimal; - *natural += content_natural; - } -} - -static void -eos_main_area_get_preferred_height (GtkWidget *widget, - gint *minimal, - gint *natural) -{ - EosMainArea *self = EOS_MAIN_AREA (widget); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - - GtkWidget *toolbox = priv->toolbox; - GtkWidget *content = priv->content; - *minimal = *natural = 0; - - if (toolbox && gtk_widget_get_visible (toolbox)) - { - gint toolbox_minimal, toolbox_natural; - gtk_widget_get_preferred_height (toolbox, - &toolbox_minimal, &toolbox_natural); - - *minimal = MAX (*minimal, toolbox_minimal); - *natural = MAX (*natural, toolbox_natural); - } - - if (content && gtk_widget_get_visible (content)) - { - gint content_minimal, content_natural; - gtk_widget_get_preferred_height (content, - &content_minimal, &content_natural); - - *minimal = MAX (*minimal, content_minimal); - *natural = MAX (*natural, content_natural); - } -} - -/* Don't size width for height or height for width, at least for now... */ -static void -eos_main_area_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - EosMainArea *self = EOS_MAIN_AREA (widget); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - - GtkWidget *toolbox = priv->toolbox; - GtkWidget *content = priv->content; - - gtk_widget_set_allocation (widget, allocation); - - gint num_sidebars = 0; - gboolean content_visible = content && gtk_widget_get_visible (content); - gboolean toolbox_visible = toolbox && gtk_widget_get_visible (toolbox); - if (toolbox_visible) - num_sidebars++; - if (priv->actions_visible) - num_sidebars++; - - gint toolbox_min_width = 0, toolbox_nat_width = 0; - gint toolbox_min_height, toolbox_nat_height; - if (toolbox_visible) - { - gtk_widget_get_preferred_width (toolbox, - &toolbox_min_width, &toolbox_nat_width); - gtk_widget_get_preferred_height (toolbox, - &toolbox_min_height, &toolbox_nat_height); - } - - gint content_min_width = 0, content_nat_width = 0; - gint content_min_height, content_nat_height; - if (content_visible) - { - gtk_widget_get_preferred_width (content, - &content_min_width, &content_nat_width); - gtk_widget_get_preferred_height (content, - &content_min_height, &content_nat_height); - } - - /* Calculate width of sidebars. We allocate space in the following order: - Sidebars min width, content min width, sidebars natural width, content - natural width. */ - gint sidebar_width = 0; - gint total_sidebars_width = allocation->width - content_min_width; - if (num_sidebars > 0) - { - if (allocation->width < toolbox_min_width * num_sidebars) - { - sidebar_width = allocation->width / num_sidebars; - } - else if (content_visible && - total_sidebars_width < toolbox_nat_width * num_sidebars) - { - sidebar_width = total_sidebars_width / num_sidebars; - } - else - { - sidebar_width = toolbox_nat_width; - } - } - - /* Allocate size */ - gint x = allocation->x; - gint y = allocation->y; - if (toolbox_visible) - { - GtkAllocation toolbox_allocation; - toolbox_allocation.x = x; - toolbox_allocation.y = y; - toolbox_allocation.width = sidebar_width; - toolbox_allocation.height = MIN (toolbox_nat_height, allocation->height); - gtk_widget_size_allocate (toolbox, &toolbox_allocation); - x += toolbox_allocation.width; - } - if (priv->actions_visible) - { - GtkAllocation actions_allocation; - actions_allocation.x = allocation->x + allocation->width - sidebar_width; - actions_allocation.y = y; - actions_allocation.width = sidebar_width; - actions_allocation.height = allocation->height; - gtk_widget_size_allocate (priv->actions_standin, - &actions_allocation); - } - if (content_visible) - { - GtkAllocation content_allocation; - content_allocation.x = x; - content_allocation.y = y; - content_allocation.width = MAX (0, - allocation->width - num_sidebars * sidebar_width); - content_allocation.height = allocation->height; - gtk_widget_size_allocate (content, &content_allocation); - } -} - -static void -eos_main_area_add (GtkContainer *container, - GtkWidget *widget) -{ - EosMainArea *self = EOS_MAIN_AREA (container); - - /* Print out warning message?? */ - - eos_main_area_set_content(self, widget); -} - -static void -eos_main_area_remove (GtkContainer *container, - GtkWidget *widget) -{ - EosMainArea *self = EOS_MAIN_AREA(container); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - - if (priv->content == widget) - eos_main_area_set_content (self, NULL); - else if (priv->toolbox == widget) - eos_main_area_set_toolbox (self, NULL); -} - -static void -eos_main_area_forall(GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - EosMainArea *self = EOS_MAIN_AREA (container); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - - if (priv->toolbox) - (*callback) (priv->toolbox, callback_data); - - if (priv->content) - (*callback) (priv->content, callback_data); - - if (include_internals && priv->actions_visible) - (*callback) (priv->actions_standin, callback_data); -} - -static void -eos_main_area_destroy (GtkWidget *widget) -{ - EosMainArea *self = EOS_MAIN_AREA (widget); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - - gtk_widget_destroy (priv->actions_standin); - - GTK_WIDGET_CLASS (eos_main_area_parent_class)->destroy (widget); -} - -static void -eos_main_area_class_init (EosMainAreaClass *klass) -{ - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); - - widget_class->get_preferred_width = eos_main_area_get_preferred_width; - widget_class->get_preferred_height = eos_main_area_get_preferred_height; - widget_class->size_allocate = eos_main_area_size_allocate; - widget_class->destroy = eos_main_area_destroy; - - container_class->forall = eos_main_area_forall; - container_class->add = eos_main_area_add; - container_class->remove = eos_main_area_remove; -} - -static void -eos_main_area_init (EosMainArea *self) -{ - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - gtk_widget_set_has_window(GTK_WIDGET(self), FALSE); - - priv->actions_standin = gtk_event_box_new (); - g_object_ref_sink (priv->actions_standin); - GdkRGBA red = { 1.0, 0.0, 0.0, 1.0 }; - gtk_widget_override_background_color (priv->actions_standin, - GTK_STATE_FLAG_NORMAL, - &red); - gtk_widget_show (priv->actions_standin); -} - -/* Internal Public API */ - -/* - * eos_main_area_new: - * - * Creates a main area. It is invisible by default. - * - * Returns: a pointer to the main area widget. - */ -GtkWidget * -eos_main_area_new (void) -{ - return GTK_WIDGET (g_object_new (EOS_TYPE_MAIN_AREA, NULL)); -} - - -/* - * eos_main_area_set_toolbox: - * @self: a #EosMainArea - * @toolbox: the toolbox widget to be displayed on left of content. - * - * Adds the toolbox widget to the main area. Passing %NULL will hide the - * toolbox area. - */ -void -eos_main_area_set_toolbox (EosMainArea *self, - GtkWidget *toolbox) -{ - g_return_if_fail (EOS_IS_MAIN_AREA (self)); - g_return_if_fail (toolbox == NULL || GTK_IS_WIDGET (toolbox)); - - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - GtkWidget *self_widget = GTK_WIDGET (self); - - if (priv->toolbox == toolbox) - return; - - if (priv->toolbox) - gtk_widget_unparent (priv->toolbox); - - priv->toolbox = toolbox; - if (toolbox) - { - gtk_widget_set_parent (toolbox, self_widget); - gtk_widget_show (toolbox); - } -} - -/* - * eos_main_area_get_toolbox: - * @self: a #EosMainArea - * - * Retrieves the toolbox widget for the main area. - * - * Return value: (transfer none): the toolbox widget, - * or %NULL if there is none - */ -GtkWidget * -eos_main_area_get_toolbox (EosMainArea *self) -{ - g_return_val_if_fail (EOS_IS_MAIN_AREA (self), NULL); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - return priv->toolbox; -} - -/* - * eos_main_area_set_content: - * @self: a #EosMainArea - * @content: the content widget to be displayed in the center. - * - * Adds the content widget to the main area. - */ -void -eos_main_area_set_content (EosMainArea *self, - GtkWidget *content) -{ - g_return_if_fail (EOS_IS_MAIN_AREA (self)); - g_return_if_fail (content == NULL || GTK_IS_WIDGET (content)); - g_return_if_fail (content == NULL || gtk_widget_get_parent (content) == NULL); - - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - GtkWidget *self_widget = GTK_WIDGET (self); - - if (priv->content == content) - return; - - if (priv->content) - gtk_widget_unparent (priv->content); - - priv->content = content; - if (content) - gtk_widget_set_parent (content, self_widget); -} - -/* - * eos_main_area_get_content: - * @self: a #EosMainArea - * - * Retrieves the content widget for the main area. - * - * Return value: (transfer none): the content widget, - * or %NULL if there is none - */ -GtkWidget * -eos_main_area_get_content (EosMainArea *self) -{ - g_return_val_if_fail (EOS_IS_MAIN_AREA (self), NULL); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - return priv->content; -} - -/* - * eos_main_area_set_actions: - * @self: a #EosMainArea - * @actions: %TRUE if there will be actions area on right of content. - * - * Sets whether an actions area should be displayed on the right of the - * content. For now just a boolean eventually a widget/list of actions or - * something. - */ -void -eos_main_area_set_actions (EosMainArea *self, - gboolean actions_visible) -{ - g_return_if_fail (EOS_IS_MAIN_AREA (self)); - - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - GtkWidget *self_widget = GTK_WIDGET (self); - - actions_visible = actions_visible != FALSE; - - if (priv->actions_visible == actions_visible) - return; - - priv->actions_visible = actions_visible; - - if (priv->actions_visible) - gtk_widget_set_parent (priv->actions_standin, self_widget); - else - gtk_widget_unparent (priv->actions_standin); -} - -/* - * eos_main_area_get_actions: - * @self: a #EosMainArea - * - * Retrieves the actions boolean value. See set_actions. - * - * Return value: stand in actions boolean, for now. - */ -gboolean -eos_main_area_get_actions (EosMainArea *self) -{ - g_return_val_if_fail (EOS_IS_MAIN_AREA (self), FALSE); - EosMainAreaPrivate *priv = eos_main_area_get_instance_private (self); - return priv->actions_visible; -} |