Fix #1077: allow split view with user specified layout
authorColin Clark <colin.clark@cclark.uk>
Sun, 9 Apr 2023 16:02:16 +0000 (17:02 +0100)
committerColin Clark <colin.clark@cclark.uk>
Sun, 9 Apr 2023 16:02:16 +0000 (17:02 +0100)
https://github.com/BestImageViewer/geeqie/issues/1077

Additional layout - 3 horizontal panes

doc/docbook/GuideMainWindowMenus.xml
src/layout-image.cc
src/layout-util.cc
src/typedefs.h

index 68da9cc..326fcc1 100644 (file)
           <para>Splits main image view in two vertical panes.</para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <guimenu>Split</guimenu>
+            <guimenuitem>Triple</guimenuitem>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Splits main image view in three horizontal panes.</para>
+        </listitem>
+      </varlistentry>
       <varlistentry>
         <term>
           <menuchoice>
index 7d79f49..5d22101 100644 (file)
@@ -2354,6 +2354,55 @@ GtkWidget *layout_image_setup_split_hv(LayoutWindow *lw, gboolean horizontal)
 
 }
 
+static GtkWidget *layout_image_setup_split_triple(LayoutWindow *lw)
+{
+       GtkWidget *hpaned1;
+       GtkWidget *hpaned2;
+       GtkAllocation allocation;
+       gint i;
+       gint pane_pos;
+
+       lw->split_mode = SPLIT_TRIPLE;
+
+       layout_image_setup_split_common(lw, 3);
+
+       gtk_widget_get_allocation(lw->utility_paned, &allocation);
+
+       hpaned1 = gtk_hpaned_new();
+       DEBUG_NAME(hpaned1);
+       hpaned2 = gtk_hpaned_new();
+       DEBUG_NAME(hpaned2);
+
+       if (lw->bar && gtk_widget_get_visible(lw->bar))
+               {
+               pane_pos = (gtk_paned_get_position(GTK_PANED(lw->utility_paned))) / 3;
+               }
+       else
+               {
+               pane_pos = allocation.width / 3;
+               }
+
+       gtk_paned_set_position(GTK_PANED(hpaned1), pane_pos);
+       gtk_paned_set_position(GTK_PANED(hpaned2), pane_pos);
+
+       gtk_paned_pack1(GTK_PANED(hpaned1), lw->split_images[0]->widget, TRUE, TRUE);
+       gtk_paned_pack1(GTK_PANED(hpaned2), lw->split_images[1]->widget, TRUE, TRUE);
+       gtk_paned_pack2(GTK_PANED(hpaned2), lw->split_images[2]->widget, TRUE, TRUE);
+       gtk_paned_pack2(GTK_PANED(hpaned1), hpaned2, TRUE, TRUE);
+
+       for (i = 0; i < 3; i++)
+               {
+               gtk_widget_show(lw->split_images[i]->widget);
+               }
+
+       gtk_widget_show(hpaned1);
+       gtk_widget_show(hpaned2);
+
+       lw->split_image_widget = hpaned1;
+
+       return lw->split_image_widget;
+}
+
 GtkWidget *layout_image_setup_split_quad(LayoutWindow *lw)
 {
        GtkWidget *hpaned;
@@ -2401,6 +2450,8 @@ GtkWidget *layout_image_setup_split(LayoutWindow *lw, ImageSplitMode mode)
                        return layout_image_setup_split_hv(lw, TRUE);
                case SPLIT_VERT:
                        return layout_image_setup_split_hv(lw, FALSE);
+               case SPLIT_TRIPLE:
+                       return layout_image_setup_split_triple(lw);
                case SPLIT_QUAD:
                        return layout_image_setup_split_quad(lw);
                case SPLIT_NONE:
index 53549d6..94451a9 100644 (file)
@@ -2652,6 +2652,7 @@ static GtkToggleActionEntry menu_view_dir_toggle_entries[] = {
 static GtkRadioActionEntry menu_split_radio_entries[] = {
   { "SplitHorizontal", NULL,                   N_("_Horizontal"),                      "E",                    N_("Split panes horizontal."),                  SPLIT_HOR },
   { "SplitVertical",   NULL,                   N_("_Vertical"),                        "U",                    N_("Split panes vertical"),                             SPLIT_VERT },
+  { "SplitTriple",     NULL,                   N_("_Triple"),                          NULL,                   N_("Split panes triple"),                               SPLIT_TRIPLE },
   { "SplitQuad",       NULL,                   N_("_Quad"),                            NULL,                   N_("Split panes quad"),                         SPLIT_QUAD },
   { "SplitSingle",     NULL,                   N_("_Single"),                          "Y",                    N_("Single pane"),                              SPLIT_NONE }
 };
@@ -2849,6 +2850,7 @@ static const gchar *menu_ui_description =
 "      <menu action='SplitMenu'>"
 "        <menuitem action='SplitHorizontal'/>"
 "        <menuitem action='SplitVertical'/>"
+"        <menuitem action='SplitTriple'/>"
 "        <menuitem action='SplitQuad'/>"
 "        <menuitem action='SplitSingle'/>"
 "        <separator/>"
index 2c7e6b3..191d437 100644 (file)
@@ -132,6 +132,7 @@ typedef enum {
        SPLIT_NONE = 0,
        SPLIT_VERT,
        SPLIT_HOR,
+       SPLIT_TRIPLE,
        SPLIT_QUAD,
 } ImageSplitMode;