summaryrefslogtreecommitdiff
path: root/endless/eosmainarea.c
diff options
context:
space:
mode:
authorMatt Watson <mattdangerw@gmail.com>2013-04-23 16:52:07 -0700
committerP. F. Chimento <philip.chimento@gmail.com>2013-05-16 12:17:09 +0200
commita794887dcf3c0f2245fcf62d5daaff639d97de5b (patch)
tree88fa84178722f862d189e923c7f5996e019f32ed /endless/eosmainarea.c
parent427f93e0ce3d39b5c7f55d1ea963851cc1209fa5 (diff)
Main area toolbox now allocated to left of content
Still very basic. Not much fancy sizing happening yet. [endlessm/eos-sdk#10]
Diffstat (limited to 'endless/eosmainarea.c')
-rw-r--r--endless/eosmainarea.c132
1 files changed, 116 insertions, 16 deletions
diff --git a/endless/eosmainarea.c b/endless/eosmainarea.c
index c4f2fdd..0c1d779 100644
--- a/endless/eosmainarea.c
+++ b/endless/eosmainarea.c
@@ -30,10 +30,29 @@ eos_main_area_get_preferred_width (GtkWidget *widget,
gint *natural)
{
EosMainArea *self = EOS_MAIN_AREA (widget);
+ GtkWidget *toolbox = self->priv->toolbox;
GtkWidget *content = self->priv->content;
+ *minimal = *natural = 0;
+
+ if (toolbox && gtk_widget_get_visible (toolbox))
+ {
+ gint toolbox_minimal, toolbox_natural;
+ gtk_widget_get_preferred_width (toolbox,
+ &toolbox_minimal, &toolbox_natural);
+
+ *minimal += toolbox_minimal;
+ *natural += toolbox_natural;
+ }
if (content && gtk_widget_get_visible (content))
- gtk_widget_get_preferred_width(content, minimal, natural);
+ {
+ gint content_minimal, content_natural;
+ gtk_widget_get_preferred_width (content,
+ &content_minimal, &content_natural);
+
+ *minimal += content_minimal;
+ *natural += content_natural;
+ }
}
static void
@@ -42,10 +61,29 @@ eos_main_area_get_preferred_height (GtkWidget *widget,
gint *natural)
{
EosMainArea *self = EOS_MAIN_AREA (widget);
+ GtkWidget *toolbox = self->priv->toolbox;
GtkWidget *content = self->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))
- gtk_widget_get_preferred_height(content, minimal, natural);
+ {
+ 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);
+ }
}
static void
@@ -54,12 +92,7 @@ eos_main_area_get_preferred_width_for_height (GtkWidget *widget,
gint *minimal,
gint *natural)
{
- EosMainArea *self = EOS_MAIN_AREA (widget);
- GtkWidget *content = self->priv->content;
-
- if (content && gtk_widget_get_visible (content))
- gtk_widget_get_preferred_width_for_height (content, for_height,
- minimal, natural);
+ eos_main_area_get_preferred_width(widget, minimal, natural);
}
static void
@@ -68,24 +101,91 @@ eos_main_area_get_preferred_height_for_width (GtkWidget *widget,
gint *minimal,
gint *natural)
{
- EosMainArea *self = EOS_MAIN_AREA (widget);
- GtkWidget *content = self->priv->content;
-
- if (content && gtk_widget_get_visible (content))
- gtk_widget_get_preferred_width_for_height (content, for_width,
- minimal, natural);
+ eos_main_area_get_preferred_height(widget, minimal, natural);
}
+// Don't size width for height or height for width, at least for now...
static void
eos_main_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
EosMainArea *self = EOS_MAIN_AREA (widget);
+ GtkWidget *toolbox = self->priv->toolbox;
GtkWidget *content = self->priv->content;
gtk_widget_set_allocation (widget, allocation);
- if (content && gtk_widget_get_visible (content))
- gtk_widget_size_allocate (content, allocation);
+
+ gint available_space = allocation->width;
+ gint toolbox_width = 0, content_width = 0;
+ gboolean content_visible = content && gtk_widget_get_visible (content);
+ gboolean toolbox_visible = toolbox && gtk_widget_get_visible (toolbox);
+
+ gint toolbox_min_width, toolbox_nat_width;
+ 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, content_nat_width;
+ 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 space
+ if (available_space && toolbox_visible)
+ {
+ toolbox_width = MIN (available_space, toolbox_min_width);
+ available_space -= toolbox_width;
+ }
+ if (available_space && content_visible)
+ {
+ content_width = MIN (available_space, content_min_width);
+ available_space -= content_width;
+ }
+ if (available_space && toolbox_visible)
+ {
+ toolbox_width = MIN (available_space + toolbox_min_width,
+ toolbox_nat_width);
+ available_space = available_space + toolbox_min_width - toolbox_width;
+ }
+ if (available_space && content_visible)
+ {
+ content_width = MIN (available_space + content_min_width,
+ content_nat_width);
+ available_space = available_space + content_min_width - content_width;
+ }
+
+ // allocate space
+ 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 = toolbox_width;
+ toolbox_allocation.height = MIN (toolbox_nat_height, allocation->height);
+ gtk_widget_size_allocate (toolbox, &toolbox_allocation);
+ x += toolbox_allocation.width;
+ }
+ if (content_visible)
+ {
+ GtkAllocation content_allocation;
+ content_allocation.x = x;
+ content_allocation.y = y;
+ content_allocation.width = content_width;
+ content_allocation.height = MIN (content_nat_height, allocation->height);
+ gtk_widget_size_allocate (content, &content_allocation);
+ }
}
static void