From 23da9ac149c3b7899a39e477858b42da06f0d73b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 28 Oct 2016 21:21:05 +0200 Subject: [PATCH] Add a pop-up tooltip over event names that are truncated --- .../Controls/TreeListView/TreeListNode.cs | 6 ++ .../Controls/TreeListView/TreeListPainter.cs | 9 ++ .../Controls/TreeListView/TreeListView.cs | 96 +++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/renderdocui/Controls/TreeListView/TreeListNode.cs b/renderdocui/Controls/TreeListView/TreeListNode.cs index be9cc8844..2a3ae951a 100644 --- a/renderdocui/Controls/TreeListView/TreeListNode.cs +++ b/renderdocui/Controls/TreeListView/TreeListNode.cs @@ -22,6 +22,7 @@ namespace TreelistView int m_treeColumn = -1; int m_id = -1; object m_tag = null; + bool m_clippedText = false; bool m_bold = false; bool m_italic = false; float m_treeLineWidth = 0.0f; @@ -64,6 +65,11 @@ namespace TreelistView m_hasChildren = value; } } + public bool ClippedText + { + get { return m_clippedText; } + set { m_clippedText = value; } + } public Image Image { get { return m_image; } diff --git a/renderdocui/Controls/TreeListView/TreeListPainter.cs b/renderdocui/Controls/TreeListView/TreeListPainter.cs index 6997e779a..47a797157 100644 --- a/renderdocui/Controls/TreeListView/TreeListPainter.cs +++ b/renderdocui/Controls/TreeListView/TreeListPainter.cs @@ -264,6 +264,15 @@ namespace TreelistView TextRenderer.DrawText(dc, datastring, f, cellRect, color, flags); + Size sz = TextRenderer.MeasureText(dc, datastring, f, new Size(1000000, 10000), flags); + + int treecolumn = node.TreeColumn; + if (treecolumn < 0) + treecolumn = node.OwnerView.TreeColumn; + + if (column.Index == treecolumn) + node.ClippedText = (sz.Width > cellRect.Width || sz.Height > cellRect.Height); + if (disposefont != null) disposefont.Dispose(); } } diff --git a/renderdocui/Controls/TreeListView/TreeListView.cs b/renderdocui/Controls/TreeListView/TreeListView.cs index b1c8f45a6..6cf2aa819 100644 --- a/renderdocui/Controls/TreeListView/TreeListView.cs +++ b/renderdocui/Controls/TreeListView/TreeListView.cs @@ -195,6 +195,17 @@ namespace TreelistView this.BackColor = SystemColors.Window; this.TabStop = true; + m_tooltip = new ToolTip(); + m_tooltip.InitialDelay = 0; + m_tooltip.UseAnimation = false; + m_tooltip.UseFading = false; + + m_tooltipNode = null; + m_tooltipTimer = new Timer(); + m_tooltipTimer.Stop(); + m_tooltipTimer.Interval = 500; + m_tooltipTimer.Tick += new EventHandler(tooltipTick); + m_rowPainter = new RowPainter(); m_cellPainter = new CellPainter(this); @@ -204,6 +215,70 @@ namespace TreelistView m_columns = new TreeListColumnCollection(this); AddScrollBars(); } + + void tooltipTick(object sender, EventArgs e) + { + m_tooltipTimer.Stop(); + + if(m_tooltipNode == null) + return; + + Node node = m_tooltipNode; + + int visibleRowIndex = NodeCollection.GetVisibleNodeIndex(node); + + Rectangle rowRect = CalcRowRectangle(visibleRowIndex); + rowRect.X = RowHeaderWidth() - HScrollValue(); + rowRect.Width = Columns.ColumnsWidth; + + // draw the current node + foreach (TreeListColumn col in Columns.VisibleColumns) + { + if (col.Index == GetTreeColumn(node)) + { + Rectangle cellRect = rowRect; + cellRect.X = col.CalculatedRect.X - HScrollValue(); + + int lineindet = 10; + // add left margin + cellRect.X += Columns.Options.LeftMargin; + + // add indent size + cellRect.X += GetIndentSize(node) + 5; + + cellRect.X += lineindet; + + Rectangle plusminusRect = GetPlusMinusRectangle(node, col, visibleRowIndex); + + if (!ViewOptions.ShowLine && (!ViewOptions.ShowPlusMinus || (!ViewOptions.PadForPlusMinus && plusminusRect == Rectangle.Empty))) + cellRect.X -= (lineindet + 5); + + if (SelectedImage != null && (NodesSelection.Contains(node) || FocusedNode == node)) + cellRect.X += (SelectedImage.Width + 2); + + Image icon = GetHoverNodeBitmap(node); + + if (icon != null) + cellRect.X += (icon.Width + 2); + + string datastring = ""; + + object data = GetData(node, col); + + if(data == null) + data = ""; + + if (CellPainter.CellDataConverter != null) + datastring = CellPainter.CellDataConverter(col, data); + else + datastring = data.ToString(); + + if(datastring.Length > 0) + m_tooltip.Show(datastring, this, cellRect.X, cellRect.Y); + } + } + } + public void RecalcLayout() { if (m_firstVisibleNode == null) @@ -266,6 +341,9 @@ namespace TreelistView renderdoc.StaticExports.LogText("Couldn't create any handles!"); } + ToolTip m_tooltip; + Node m_tooltipNode; + Timer m_tooltipTimer; VScrollBar m_vScroll; HScrollBar m_hScroll; Panel m_hScrollFiller; @@ -715,6 +793,18 @@ namespace TreelistView else Cursor = Cursors.Arrow; + if (!this.DesignMode && clickedNode != null && clickedNode.ClippedText) + { + m_tooltipNode = clickedNode; + m_tooltipTimer.Start(); + } + else + { + m_tooltipNode = null; + m_tooltip.Hide(this); + m_tooltipTimer.Stop(); + } + if (GetHoverNodeBitmap(clickedNode) != null && GetNodeBitmap(clickedNode) != GetHoverNodeBitmap(clickedNode)) Invalidate(); @@ -833,12 +923,18 @@ namespace TreelistView } protected override void OnLeave(EventArgs e) { + m_tooltipNode = null; + m_tooltip.Hide(this); + m_tooltipTimer.Stop(); base.OnLeave(e); Invalidate(); } protected override void OnLostFocus(EventArgs e) { + m_tooltipNode = null; + m_tooltip.Hide(this); + m_tooltipTimer.Stop(); base.OnLostFocus(e); Invalidate(); }