}
static void
-midori_view_update_label_size (GtkWidget* label,
- gint size)
+midori_view_update_tab_title (GtkWidget* label,
+ gint size,
+ gdouble angle)
{
gint width;
sokoke_widget_get_text_size (label, "M", &width, NULL);
- gtk_widget_set_size_request (label, width * size, -1);
- gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+ if (angle == 0.0 || angle == 360.0)
+ {
+ gtk_widget_set_size_request (label, width * size, -1);
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+ }
+ else
+ {
+ gtk_widget_set_size_request (label, -1, width * size);
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_NONE);
+ }
+ gtk_label_set_angle (GTK_LABEL (label), angle);
+}
+
+static void
+gtk_box_repack (GtkBox* box,
+ GtkWidget* child)
+{
+ GtkWidget* old_box;
+ gboolean expand, fill;
+ guint padding;
+ GtkPackType pack_type;
+
+ old_box = gtk_widget_get_parent (child);
+ g_return_if_fail (GTK_IS_BOX (old_box));
+
+ gtk_box_query_child_packing (GTK_BOX (old_box), child,
+ &expand, &fill, &padding, &pack_type);
+
+ g_object_ref (child);
+ gtk_container_remove (GTK_CONTAINER (old_box), child);
+ if (pack_type == GTK_PACK_START)
+ gtk_box_pack_start (box, child, expand, fill, padding);
+ else
+ gtk_box_pack_end (box, child, expand, fill, padding);
+ g_object_unref (child);
+}
+
+static void
+midori_view_tab_label_parent_set (GtkWidget* tab_label,
+ GtkObject* old_parent,
+ MidoriView* view)
+{
+ GtkWidget* parent;
+
+ if (old_parent)
+ /* FIXME: Disconnect orientation notification */;
+
+ if (!(parent = gtk_widget_get_parent (tab_label)))
+ return;
+
+ if (GTK_IS_NOTEBOOK (parent))
+ {
+ GtkPositionType pos;
+ gdouble old_angle, angle;
+ GtkWidget* box;
+
+ pos = gtk_notebook_get_tab_pos (GTK_NOTEBOOK (parent));
+ old_angle = gtk_label_get_angle (GTK_LABEL (view->tab_title));
+ switch (pos)
+ {
+ case GTK_POS_LEFT:
+ angle = 90.0;
+ break;
+ case GTK_POS_RIGHT:
+ angle = 270.0;
+ break;
+ default:
+ angle = 0.0;
+ }
+
+ if (old_angle != angle)
+ {
+ if (angle == 0.0)
+ box = gtk_hbox_new (FALSE, 1);
+ else
+ box = gtk_vbox_new (FALSE, 1);
+ gtk_box_repack (GTK_BOX (box), view->tab_icon);
+ gtk_box_repack (GTK_BOX (box), view->tab_title);
+ gtk_box_repack (GTK_BOX (box), view->tab_close);
+
+ gtk_container_remove (GTK_CONTAINER (tab_label),
+ gtk_bin_get_child (GTK_BIN (tab_label)));
+ gtk_container_add (GTK_CONTAINER (tab_label), GTK_WIDGET (box));
+ gtk_widget_show (box);
+ }
+
+ midori_view_update_tab_title (view->tab_title, 10, angle);
+
+ /* FIXME: Connect orientation notification */
+ }
}
/**
* Retrieves a proxy tab label that is typically used when
* adding the view to a notebook.
*
+ * Note that the label actually adjusts its orientation
+ * to the according tab position when used in a notebook.
+ *
* The label is created on the first call and will be updated to reflect
* changes of the loading progress and title.
*
gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE);
hbox = gtk_hbox_new (FALSE, 1);
gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (hbox));
- midori_view_update_label_size (view->tab_title, 10);
+ midori_view_update_tab_title (view->tab_title, 10, 0.0);
view->tab_close = gtk_button_new ();
gtk_button_set_relief (GTK_BUTTON (view->tab_close), GTK_RELIEF_NONE);
g_signal_connect (view->tab_label, "destroy",
G_CALLBACK (gtk_widget_destroyed),
&view->tab_label);
+
+ g_signal_connect (view->tab_label, "parent-set",
+ G_CALLBACK (midori_view_tab_label_parent_set),
+ view);
}
return view->tab_label;
}