* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* SECTION:gtkbox
* @Short_description: A container box
* @Title: GtkBox
- * @See_also: #GtkFrame, #GtkTable, #GtkLayout
+ * @See_also: #GtkFrame, #GtkGrid, #GtkLayout
*
* The GtkBox widget organizes child widgets into a rectangular area.
*
#include "config.h"
#include "gtkbox.h"
+#include "gtkboxprivate.h"
+#include "gtkintl.h"
#include "gtkorientable.h"
-#include "gtksizerequest.h"
-#include "gtktypebuiltins.h"
+#include "gtkorientableprivate.h"
#include "gtkprivate.h"
-#include "gtkintl.h"
-#include "a11y/gtkboxaccessible.h"
+#include "gtktypebuiltins.h"
+#include "gtksizerequest.h"
+#include "gtkwidgetpath.h"
+#include "gtkwidgetprivate.h"
+#include "a11y/gtkcontaineraccessible.h"
enum {
g_type_class_add_private (object_class, sizeof (GtkBoxPrivate));
- gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_BOX_ACCESSIBLE);
+ gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_FILLER);
}
static void
{
case PROP_ORIENTATION:
private->orientation = g_value_get_enum (value);
+ _gtk_orientable_set_style_classes (GTK_ORIENTABLE (box));
gtk_widget_queue_resize (GTK_WIDGET (box));
break;
case PROP_SPACING:
count->before++;
}
-static guint
-gtk_box_get_visible_position (GtkBox *box,
+static gint
+gtk_box_get_visible_position (GtkBox *box,
GtkWidget *child)
{
CountingData count = { child, FALSE, 0, 0 };
- /* forall iterates in visible order */
- gtk_container_forall (GTK_CONTAINER (box),
- count_widget_position,
- &count);
+ /* foreach iterates in visible order */
+ gtk_container_foreach (GTK_CONTAINER (box),
+ count_widget_position,
+ &count);
+
+ /* the child wasn't found, it's likely an internal child of some
+ * subclass, return -1 to indicate that there is no sibling relation
+ * to the regular box children
+ */
+ if (!count.found)
+ return -1;
- g_assert (count.found);
if (box->priv->orientation == GTK_ORIENTATION_HORIZONTAL &&
gtk_widget_get_direction (GTK_WIDGET (box)) == GTK_TEXT_DIR_RTL)
return count.after;
box = GTK_BOX (container);
private = box->priv;
- path = gtk_widget_path_copy (gtk_widget_get_path (GTK_WIDGET (container)));
+ path = _gtk_widget_create_path (GTK_WIDGET (container));
if (gtk_widget_get_visible (child))
{
+ gint position;
+
sibling_path = gtk_widget_path_new ();
/* get_children works in visible order */
gtk_widget_path_append_for_widget (sibling_path, list->data);
}
- g_list_free (children);
- gtk_widget_path_append_with_siblings (path,
- sibling_path,
- gtk_box_get_visible_position (box,
- child));
- gtk_widget_path_unref (sibling_path);
+ g_list_free (children);
+
+ position = gtk_box_get_visible_position (box, child);
+
+ if (position >= 0)
+ gtk_widget_path_append_with_siblings (path, sibling_path, position);
+ else
+ gtk_widget_path_append_for_widget (path, child);
+
+ gtk_widget_path_unref (sibling_path);
}
else
gtk_widget_path_append_for_widget (path, child);
return path;
}
+static void
+gtk_box_invalidate_order_foreach (GtkWidget *widget)
+{
+ _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_SIBLING_POSITION);
+}
+
static void
gtk_box_invalidate_order (GtkBox *box)
{
gtk_container_foreach (GTK_CONTAINER (box),
- (GtkCallback) gtk_widget_reset_style,
+ (GtkCallback) gtk_box_invalidate_order_foreach,
NULL);
}
pack_type = GTK_PACK_START;
if (child_info->pack != pack_type)
{
- child_info->pack = GTK_PACK_END;
+ child_info->pack = pack_type;
gtk_widget_child_notify (child, "pack-type");
gtk_box_invalidate_order (box);
}
{
gboolean was_visible;
- was_visible = gtk_widget_get_visible (widget);
- gtk_widget_unparent (widget);
-
g_signal_handlers_disconnect_by_func (widget,
box_child_visibility_notify_cb,
box);
+ was_visible = gtk_widget_get_visible (widget);
+ gtk_widget_unparent (widget);
+
priv->children = g_list_remove_link (priv->children, children);
g_list_free (children);
g_free (child);