I can use SelectedItem to have the specific node/row selected but the keyboard focus always defaults to first cell in TreeGridView.
Is there a way to focus on specific cell on TreeGridView init?
I can use SelectedItem to have the specific node/row selected but the keyboard focus always defaults to first cell in TreeGridView.
Is there a way to focus on specific cell on TreeGridView init?
I need this for a custom GetLayer dialog. I plan to add more functionality to it. This is the screencap of what happens when I run the script:
I would like to have the keyboard focus on the SelectedItem row. Any ideas?
import Rhino
import rhinoscriptsyntax as rs
import System
import Eto.Drawing as drawing
import Eto.Forms as forms
class GetLayer(forms.Dialog[bool]):
# Dialog box Class initializer
def __init__(self, title="Select Layer", default="Plans::Text", height = 600):
def Swatch(color=(250,200,100), width = 10, height = 10):
bitmap = drawing.Bitmap(10, 10, drawing.PixelFormat.Format32bppRgb)
col = drawing.Color.FromArgb(color[0], color[1], color[2])
for x in range(1, width - 1):
for y in range(1, height - 1):
bitmap.SetPixel(x, y, col)
return bitmap
def GetCrumbs(path):
crumbs = path.split('::')
layers = []; merged = ''
for i, crumb in enumerate(crumbs):
merged += ('::' if i else '') + crumb
layers.append(merged)
return layers
# Initialize dialog box
self.title = (title if len(title) <= 52 else title[:52] + ' ...')
self.default = default
self.Size = drawing.Size(300, height)
dpi = self.LogicalPixelSize
curx = System.Windows.Forms.Cursor.Position.X
cury = System.Windows.Forms.Cursor.Position.Y
x = (curx - 150 * dpi) / dpi
y = ((cury - height * dpi) / dpi if cury > height else 0)
self.Location = drawing.Point(x, y)
self.WindowStyle= forms.WindowStyle.None
self.BackgroundColor = drawing.Color(0.2,0.2,0.2,1)
# Create controls for the dialog
self.labelTitle = forms.Label(Text = ' ' + self.title)
self.labelTitle.TextColor = drawing.Color(1,1,1,1)
self.filterbox = forms.TextBox(Text = self.default)
self.filterbox.Size = drawing.Size(250,-1)
# Create TreeGridView
self.tree = forms.TreeGridView()
self.tree.Size = drawing.Size(-1, height - 40)
self.tree.SelectedItemChanged += self.EchoCurrent
self.tree.Border = forms.BorderType.Line
self.tree.ShowHeader = False
self.tree.AllowColumnReordering = False
self.tree.GridLines = forms.GridLines.Horizontal
self.tree.KeyDown += self.OnKey
layColumn = forms.GridColumn()
layColumn.Editable = False
layColumn.HeaderText = 'Name'; layColumn.Resizable = False
layColumn.Width = 240
layColumn.DataCell = forms.TextBoxCell(0)
patColumn = forms.GridColumn()
patColumn.Editable = False
patColumn.HeaderText = 'Full Path'; patColumn.Visible = False
patColumn.DataCell = forms.TextBoxCell(1)
self.colColumn = forms.GridColumn()
self.colColumn.Editable = False
self.colColumn.HeaderText = 'Color'; self.colColumn.Resizable = False
self.colColumn.Width = 40
self.colColumn.DataCell = forms.ImageViewCell(2)
self.tree.Columns.Add(layColumn)
self.tree.Columns.Add(patColumn)
self.tree.Columns.Add(self.colColumn)
# Create Tree Nodes
treecollection = forms.TreeGridItemCollection()
layers = rs.LayerNames()
nodes = []; levels = 0
if layers:
for layer in layers: # Create color swatches and store layer properties
level = len(layer.split('::'))
if level > levels: levels = level
expanded = rs.IsLayerExpanded(layer)
color = rs.LayerColor(layer)
item = forms.TreeGridItem(Values=(layer.split('::')[-1], layer, Swatch(color)))
if layer in GetCrumbs(self.default[:-1]): # Expand default layer nodes before selecting
item.Expanded = True
else:
item.Expanded = expanded
if layer == self.default: # Select default layer node
self.tree.SelectedItem = item
nodes.append((level, layer, expanded, item))
for level in range(1, levels + 1): # Arrange layer nodes in hierarchy
for node in nodes:
if node[0] == level:
parent = rs.ParentLayer(node[1])
if parent: # Add as a child node
for ld in nodes:
if parent == ld[1]:
ld[3].Children.Add(node[3])
else: # Add as top level node
treecollection.Add(node[3])
self.tree.DataStore = treecollection
# Create the default button
self.DefaultButton = forms.Button(Text = 'OK')
self.DefaultButton.Click += self.OnOKButtonClick
# Create the abort button
self.AbortButton = forms.Button(Text = 'Cancel')
self.AbortButton.Click += self.OnCloseButtonClick
# Create a table layout and add all the controls
layout = forms.DynamicLayout()
layout.AddRow(self.labelTitle)
layout.AddRow(self.tree)
layout.AddSeparateRow(self.filterbox, self.DefaultButton)
self.Content = layout
self.ShowModal()
def EchoCurrent(self, sender, e):
self.filterbox.Text = self.tree.SelectedItem.GetValue(1)
# Get selected value
def Layer(self):
return self.filterbox.Text
# Close button click handler
def OnCloseButtonClick(self, sender, e):
self.filterbox.Text = self.default
self.Close(False)
# Keyboard Handler
def OnKey(self, sender, e):
if e.Key == forms.Keys.Enter:
self.Close(False)
elif e.Key == forms.Keys.Right:
sender.SelectedItem.Expanded = True
sender.ReloadData()
elif e.Key == forms.Keys.Left:
sender.SelectedItem.Expanded = False
sender.ReloadData()
# OK button click handler
def OnOKButtonClick(self, sender, e):
self.Close(True)
print GetLayer().Layer()