bool GetCellAtPos (int x, int y, out TreePath path, out TreeViewColumn col, out CellRenderer cellRenderer) { int cx, cy; if (tree.GetPathAtPos (x, y, out path, out col, out cx, out cy)) { tree.GetCellArea (path, col); foreach (CellRenderer cr in col.CellRenderers) { int xo, w; col.CellGetPosition (cr, out xo, out w); if (cr.Visible && cx >= xo && cx < xo + w) { cellRenderer = cr; return true; } } } cellRenderer = null; return false; }
public CellTooltipWindow (TreeView tree, TreeViewColumn col, TreePath path) { this.tree = tree; this.col = col; NudgeHorizontal = true; Events |= Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.EnterNotifyMask | Gdk.EventMask.LeaveNotifyMask; Gdk.Rectangle rect = tree.GetCellArea (path, col); rect.Inflate (2, 2); if (!tree.Model.GetIter (out iter, path)) { Hide (); return; } col.CellSetCellData (tree.Model, iter, false, false); int x = 0; int th = 0; CellRenderer[] renderers = col.CellRenderers; foreach (CellRenderer cr in renderers) { int sp, wi, he, xo, yo; col.CellGetPosition (cr, out sp, out wi); Gdk.Rectangle crect = new Gdk.Rectangle (x, rect.Y, wi, rect.Height); cr.GetSize (tree, ref crect, out xo, out yo, out wi, out he); if (cr != renderers [renderers.Length - 1]) x += crect.Width + col.Spacing + 1; else x += wi + 1; if (he > th) th = he; } SetSizeRequest (x, th + 2); }