summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-07-22 15:29:34 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-07-22 21:06:23 +0200
commited2e37de2d2d26d996e001a3eaade802a2d716fa (patch)
tree64aed4c8468d9132a5a38c65041440115262dc03
parentfe38553aef2121f358fb58e450ec69314aad851e (diff)
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 <caolanm@redhat.com>
-rw-r--r--vcl/unx/gtk3/gtkinst.cxx53
1 files changed, 40 insertions, 13 deletions
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);