vcl/unx/gtk3/gtkinst.cxx |   53 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 40 insertions(+), 13 deletions(-)

New commits:
commit ed2e37de2d2d26d996e001a3eaade802a2d716fa
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Jul 22 15:29:34 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Jul 22 21:06:23 2022 +0200

    gtk: honour disabled columns from set_column_editable for start_editing
    
    Change-Id: I3b49254b9bdaee1e10e82cc2cff0c4cbf52f74fc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137363
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 08cc2b6a7ef1..05a0622577c2 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -15890,32 +15890,59 @@ public:
 
     virtual void start_editing(const weld::TreeIter& rIter) override
     {
-        GtkTreeViewColumn* pColumn = 
GTK_TREE_VIEW_COLUMN(g_list_nth_data(m_pColumns, m_nTextView));
-        assert(pColumn && "wrong column");
-
         const GtkInstanceTreeIter& rGtkIter = static_cast<const 
GtkInstanceTreeIter&>(rIter);
         GtkTreePath* path = gtk_tree_model_get_path(m_pTreeModel, 
const_cast<GtkTreeIter*>(&rGtkIter.iter));
 
-        // allow editing of cells which are not usually editable, so we can 
have double click
-        // do its usual row-activate but if we explicitly want to edit (remote 
files dialog)
+        GtkTreeViewColumn* pColumn = nullptr;
+
+        for (GList* pEntry = g_list_first(m_pColumns); pEntry; pEntry = 
g_list_next(pEntry))
+        {
+            GtkTreeViewColumn* pTestColumn = 
GTK_TREE_VIEW_COLUMN(pEntry->data);
+
+            // see if this column is editable
+            gboolean is_editable(false);
+            GList *pRenderers = 
gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(pTestColumn));
+            for (GList* pRenderer = g_list_first(pRenderers); pRenderer; 
pRenderer = g_list_next(pRenderer))
+            {
+                GtkCellRenderer* pCellRenderer = 
GTK_CELL_RENDERER(pRenderer->data);
+                if (GTK_IS_CELL_RENDERER_TEXT(pCellRenderer))
+                {
+                    g_object_get(pCellRenderer, "editable", &is_editable, 
nullptr);
+                    if (is_editable)
+                    {
+                        pColumn = pTestColumn;
+                        break;
+                    }
+                }
+            }
+            g_list_free(pRenderers);
+
+            if (is_editable)
+                break;
+        }
+
+        // if nothing explicit editable, allow editing of cells which are not
+        // usually editable, so we can have double click do its usual
+        // row-activate but if we explicitly want to edit (remote files dialog)
         // we can still do that
-        GList *pRenderers = 
gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(pColumn));
-        for (GList* pRenderer = g_list_first(pRenderers); pRenderer; pRenderer 
= g_list_next(pRenderer))
+        if (!pColumn)
         {
-            GtkCellRenderer* pCellRenderer = 
GTK_CELL_RENDERER(pRenderer->data);
-            if (GTK_IS_CELL_RENDERER_TEXT(pCellRenderer))
+            pColumn = GTK_TREE_VIEW_COLUMN(g_list_nth_data(m_pColumns, 
m_nTextView));
+            assert(pColumn && "wrong column");
+
+            GList *pRenderers = 
gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(pColumn));
+            for (GList* pRenderer = g_list_first(pRenderers); pRenderer; 
pRenderer = g_list_next(pRenderer))
             {
-                gboolean is_editable(false);
-                g_object_get(pCellRenderer, "editable", &is_editable, nullptr);
-                if (!is_editable)
+                GtkCellRenderer* pCellRenderer = 
GTK_CELL_RENDERER(pRenderer->data);
+                if (GTK_IS_CELL_RENDERER_TEXT(pCellRenderer))
                 {
                     g_object_set(pCellRenderer, "editable", true, 
"editable-set", true, nullptr);
                     g_object_set_data(G_OBJECT(pCellRenderer), 
"g-lo-RestoreNonEditable", reinterpret_cast<gpointer>(true));
                     break;
                 }
             }
+            g_list_free(pRenderers);
         }
-        g_list_free(pRenderers);
 
         gtk_tree_view_scroll_to_cell(m_pTreeView, path, pColumn, false, 0, 0);
         gtk_tree_view_set_cursor(m_pTreeView, path, pColumn, true);

Reply via email to