From 28bfc34862513acb8fe9fcd02afca493c2411c02 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 2 Jan 2019 23:34:20 +0100
Subject: Handled collapsing tiles.

---
 src/gtkext/tiledgrid.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 77 insertions(+), 2 deletions(-)

diff --git a/src/gtkext/tiledgrid.c b/src/gtkext/tiledgrid.c
index 0256563..289d358 100644
--- a/src/gtkext/tiledgrid.c
+++ b/src/gtkext/tiledgrid.c
@@ -84,6 +84,9 @@ static grid_tile_t *split_tile(grid_tile_t **, const char *, char, GtkTiledGrid
 /* Tente de mettre la main sur une station d'accueil. */
 static grid_tile_t *find_tile_for_widget(grid_tile_t *, GtkWidget *);
 
+/* Retire une moitié de tuile vide au plein profit de l'autre. */
+static void collapse_tile(grid_tile_t *, grid_tile_t *);
+
 
 
 /* --------------------------- INTERFACE DU COMPOSANT GTK --------------------------- */
@@ -492,6 +495,7 @@ static grid_tile_t *find_suitable_tile(grid_tile_t **tile, const char *path, Gtk
 
 }
 
+
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : tile     = tuile à découper en deux. [OUT]                   *
@@ -569,6 +573,59 @@ static grid_tile_t *split_tile(grid_tile_t **tile, const char *path, char endpoi
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : tile = tuile parente, prochaine victime de promotion.        *
+*                side = côté de tuile amené à disparaître.                    *
+*                                                                             *
+*  Description : Retire une moitié de tuile vide au plein profit de l'autre.  *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void collapse_tile(grid_tile_t *tile, grid_tile_t *side)
+{
+    grid_tile_t *promoted;                  /* Tuile à faire remonter      */
+    GtkWidget *container;                   /* Conteneur à vider           */
+
+    assert(!IS_LEAF_TILE(tile));
+
+    /* Sélection du remplaçant */
+
+    if (side == tile->children[0])
+        promoted = tile->children[1];
+    else
+        promoted = tile->children[0];
+
+    /* Etablissement d'une place nette */
+
+    gtk_container_remove(GTK_CONTAINER(tile->widget), promoted->widget);
+
+    container = gtk_widget_get_parent(tile->widget);
+    gtk_container_remove(GTK_CONTAINER(container), tile->widget);
+
+    delete_tile(side);
+
+    /* Promotion effective */
+
+    tile->widget = promoted->widget;
+
+    tile->path = promoted->path;
+
+    tile->children[0] = promoted->children[0];
+    tile->children[1] = promoted->children[1];
+
+    g_object_ref(G_OBJECT(promoted->widget));
+    gtk_container_add(GTK_CONTAINER(container), tile->widget);
+
+    free(promoted);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : tile   = point de départ des recherches locales.             *
 *                widget = composant graphique à retrouver.                    *
 *                                                                             *
@@ -906,12 +963,30 @@ void gtk_tiled_grid_remove(GtkTiledGrid *tgrid, GPanelItem *panel)
 
     if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(station)) == 0)
     {
-        //delete_panel_node(node);
-
         /* Si le panneau par défaut devient nécessaire */
         if (tgrid->def_panel != NULL && tile->path[0] == 'M' && tile->path[1] == '\0')
             gtk_tiled_grid_add(tgrid, tgrid->def_panel);
 
+        else
+        {
+            /* La racine est concernée ! */
+            if (tile->parent == NULL)
+            {
+                assert(tile == tgrid->tiles);
+
+                g_object_ref(G_OBJECT(tile->widget));
+                gtk_container_remove(GTK_CONTAINER(tgrid), tile->widget);
+
+                delete_tile(tile);
+                tgrid->tiles = NULL;
+
+            }
+
+            else
+                collapse_tile(tile->parent, tile);
+
+        }
+
     }
 
 }
-- 
cgit v0.11.2-87-g4458