diff options
-rw-r--r-- | include/vcl/treelistentry.hxx | 4 | ||||
-rw-r--r-- | include/vcl/weld.hxx | 2 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 7 | ||||
-rw-r--r-- | vcl/source/treelist/treelistbox.cxx | 3 | ||||
-rw-r--r-- | vcl/source/treelist/treelistentry.cxx | 4 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 24 |
6 files changed, 41 insertions, 3 deletions
diff --git a/include/vcl/treelistentry.hxx b/include/vcl/treelistentry.hxx index 456a99c3fd67..8cc808bb09c1 100644 --- a/include/vcl/treelistentry.hxx +++ b/include/vcl/treelistentry.hxx @@ -60,6 +60,7 @@ class VCL_DLLPUBLIC SvTreeListEntry SvTreeListEntries m_Children; sal_uLong nAbsPos; sal_uLong nListPos; + sal_uInt32 mnExtraIndent; ItemsType m_Items; void* pUserData; SvTLEntryFlags nEntryFlags; @@ -115,6 +116,9 @@ public: void SetTextColor( std::optional<Color> xColor ) { mxTextColor = xColor; } std::optional<Color> const & GetTextColor() const { return mxTextColor; } + void SetExtraIndent(sal_uInt32 nExtraIndent) { mnExtraIndent = nExtraIndent; } + sal_uInt32 GetExtraIndent() const { return mnExtraIndent; } + SvTreeListEntry* GetParent() const { return pParent; } SvTreeListEntry* NextSibling() const; diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 936484a31d0c..838fb2729f04 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -931,6 +931,8 @@ public: virtual bool get_row_expanded(const TreeIter& rIter) const = 0; virtual bool get_children_on_demand(const TreeIter& rIter) const = 0; virtual void set_children_on_demand(const TreeIter& rIter, bool bChildrenOnDemand) = 0; + //visually indent this row as if it was at get_iter_depth() + nIndentLevel + virtual void set_extra_row_indent(const TreeIter& rIter, int nIndentLevel) = 0; virtual void expand_row(const TreeIter& rIter) = 0; virtual void collapse_row(const TreeIter& rIter) = 0; virtual void set_text(const TreeIter& rIter, const OUString& rStr, int col = -1) = 0; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 5fa320af8dbc..7fc78bf5ef0b 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -3885,6 +3885,13 @@ public: set_toggle(rVclIter.iter, eState, col); } + virtual void set_extra_row_indent(const weld::TreeIter& rIter, int nIndentLevel) override + { + weld::TreeIter& rNonConstIter = const_cast<weld::TreeIter&>(rIter); + SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rNonConstIter); + rVclIter.iter->SetExtraIndent(nIndentLevel); + } + void set_text_emphasis(SvTreeListEntry* pEntry, bool bOn, int col) { ++col; //skip dummy/expander column diff --git a/vcl/source/treelist/treelistbox.cxx b/vcl/source/treelist/treelistbox.cxx index c17c9c78a0eb..6c25d2fd658e 100644 --- a/vcl/source/treelist/treelistbox.cxx +++ b/vcl/source/treelist/treelistbox.cxx @@ -2986,7 +2986,6 @@ tools::Rectangle SvTreeListBox::GetFocusRect( SvTreeListEntry* pEntry, long nLin return aRect; } - sal_IntPtr SvTreeListBox::GetTabPos( SvTreeListEntry* pEntry, SvLBoxTab* pTab) { assert(pTab); @@ -2997,7 +2996,7 @@ sal_IntPtr SvTreeListBox::GetTabPos( SvTreeListEntry* pEntry, SvLBoxTab* pTab) nDepth = nDepth * static_cast<sal_uInt16>(nIndent); nPos += static_cast<sal_IntPtr>(nDepth); } - return nPos; + return nPos + (pEntry->GetExtraIndent() * nIndent); } SvLBoxItem* SvTreeListBox::GetItem_Impl( SvTreeListEntry* pEntry, long nX, diff --git a/vcl/source/treelist/treelistentry.cxx b/vcl/source/treelist/treelistentry.cxx index 8d397d228a9b..d380866cfc7a 100644 --- a/vcl/source/treelist/treelistentry.cxx +++ b/vcl/source/treelist/treelistentry.cxx @@ -51,6 +51,7 @@ SvTreeListEntry::SvTreeListEntry() : pParent(nullptr) , nAbsPos(0) , nListPos(0) + , mnExtraIndent(0) , pUserData(nullptr) , nEntryFlags(SvTLEntryFlags::NONE) , maBackColor(Application::GetSettings().GetStyleSettings().GetWindowColor()) @@ -89,7 +90,8 @@ void SvTreeListEntry::Clone(SvTreeListEntry* pSource) { nListPos &= 0x80000000; nListPos |= ( pSource->nListPos & 0x7fffffff); - nAbsPos = pSource->nAbsPos; + nAbsPos = pSource->nAbsPos; + mnExtraIndent = pSource->mnExtraIndent; m_Items.clear(); for (auto const& it : pSource->m_Items) diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 23dc0c65825a..a044fd906289 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -8622,6 +8622,8 @@ private: std::map<int, int> m_aWeightMap; // map from text column to sensitive column std::map<int, int> m_aSensitiveMap; + // map from text column to indent column + std::map<int, int> m_aIndentMap; // currently expanding parent that logically, but not currently physically, // contain placeholders o3tl::sorted_vector<GtkTreeIter, CompareGtkTreeIter> m_aExpandingPlaceHolderParents; @@ -9182,6 +9184,19 @@ private: } } + int get_expander_size() const + { + gint nExpanderSize; + gint nHorizontalSeparator; + + gtk_widget_style_get(GTK_WIDGET(m_pTreeView), + "expander-size", &nExpanderSize, + "horizontal-separator", &nHorizontalSeparator, + nullptr); + + return nExpanderSize + (nHorizontalSeparator/ 2); + } + public: GtkInstanceTreeView(GtkTreeView* pTreeView, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) : GtkInstanceContainer(GTK_CONTAINER(pTreeView), pBuilder, bTakeOwnership) @@ -9221,6 +9236,7 @@ public: m_nTextCol = nIndex; m_aWeightMap[nIndex] = -1; m_aSensitiveMap[nIndex] = -1; + m_aIndentMap[nIndex] = -1; g_signal_connect(G_OBJECT(pCellRenderer), "editing-started", G_CALLBACK(signalCellEditingStarted), this); g_signal_connect(G_OBJECT(pCellRenderer), "editing-canceled", G_CALLBACK(signalCellEditingCanceled), this); g_signal_connect(G_OBJECT(pCellRenderer), "edited", G_CALLBACK(signalCellEdited), this); @@ -9256,6 +9272,8 @@ public: a.second = nIndex++; for (auto& a : m_aSensitiveMap) a.second = nIndex++; + for (auto& a : m_aIndentMap) + a.second = nIndex++; ensure_drag_begin_end(); @@ -9775,6 +9793,12 @@ public: } } + virtual void set_extra_row_indent(const weld::TreeIter& rIter, int nIndentLevel) override + { + const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter); + set(rGtkIter.iter, m_aIndentMap[m_nTextCol], nIndentLevel * get_expander_size()); + } + virtual void set_text_emphasis(const weld::TreeIter& rIter, bool bOn, int col) override { const GtkInstanceTreeIter& rGtkIter = static_cast<const GtkInstanceTreeIter&>(rIter); |