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);