Skip to content

Commit 5d7882e

Browse files
author
David Lonie
committed
Merge pull request #1273 from chaosphere2112/toolbar_layout_fixes
Toolbar layout fixes
2 parents 3850d33 + 2c51812 commit 5d7882e

10 files changed

+247
-15
lines changed

Packages/vcs/Lib/vtk_ui/button.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,20 @@ def add_state(self, label=None, image=None, bgcolor=None, fgcolor=None, opacity=
135135
self.states.append(ButtonState(label=label, image=image, bgcolor=bgcolor, fgcolor=fgcolor, opacity=opacity))
136136

137137
def place(self):
138+
138139
width, height = self.get_dimensions()
139140
x, y = self.get_position()
140141
bounds = (x, x + width, y - height, y, 0, 0)
141-
142142
self.repr.SetPlaceFactor(1)
143143
self.repr.PlaceWidget(bounds)
144+
self.repr.Modified()
145+
if self.showing():
146+
# This One Weird Hack will make your Buttons Go In the Right Place - Developers hate it!
147+
# Buttons weren't always getting properly placed (toolbars in toolbars being the canonical example)
148+
# This makes them show up correctly. Weird, but it works.
149+
h_state = self.repr.GetHighlightState()
150+
self.repr.Highlight((h_state + 1) % 3)
151+
self.repr.Highlight(h_state)
144152

145153
text_width, text_height = self.text_widget.get_dimensions()
146154
swidth, sheight = self.interactor.GetRenderWindow().GetSize()
@@ -289,7 +297,7 @@ def in_bounds(self, x, y):
289297
def __advance__(self, point):
290298
state = self.repr.GetState()
291299
self.set_state( (state + 1) % len(self.states) )
292-
#self.clicked(self.widget, "StateChangedEvent") Do we need to call this? I bet we don't.
300+
self.clicked(self.widget, "StateChangedEvent")
293301

294302
def clicked(self, obj, event):
295303
state = self.get_state()
@@ -332,10 +340,7 @@ def __init__(self, interactor, label, on=None, off=None, corner_radius=5, width=
332340
self.label = label
333341

334342
def get_text(self):
335-
if self.get_state() == 0:
336-
return self.label.get_text()[len(on_prefix):]
337-
else:
338-
return self.label.get_text()[len(off_prefix):]
343+
return self.label
339344

340345
def toggle(self, state):
341346
if state == 1:

Packages/vcs/Lib/vtk_ui/toolbar.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
class Toolbar(object):
44

5-
def __init__(self, interactor, label, vertical=True, left=10, top=10, open_label="Open", on_open=None, close_label="Close", button_margin=5, parent=None, save=None):
5+
def __init__(self, interactor, label, vertical=True, left=10, top=10, open_label="Open", on_open=None, close_label="Close", on_close=None, button_margin=5, parent=None, save=None):
66

77
self.save = save
88
self.interactor = interactor
@@ -12,13 +12,13 @@ def __init__(self, interactor, label, vertical=True, left=10, top=10, open_label
1212
self.top = top
1313
self.label = ToggleButton(self.interactor, label, on=self.__on__, off=self.__off__, on_prefix=open_label, off_prefix=close_label, left=self.left - self.margin, top=self.top)
1414
self.on_open = on_open
15+
self.on_close = on_close
1516
self.vertical = vertical
1617

1718
self.open = False
1819

1920
# Increment this as widgets are added
2021
self.width, self.height = self.label.get_dimensions()
21-
self.height += button_margin
2222

2323
self.widgets = []
2424
self.bars = {}
@@ -47,13 +47,15 @@ def __delleft(self):
4747

4848
def __on__(self):
4949
self.open = True
50+
self.show_widgets()
5051
if self.on_open is not None:
5152
self.on_open()
52-
self.show_widgets()
5353

5454
def __off__(self):
5555
self.open = False
5656
self.hide_widgets()
57+
if self.on_close is not None:
58+
self.on_close()
5759

5860
def copy(self, interactor):
5961
t = Toolbar(interactor, self.label.label, vertical=self.vertical, left=self.left - self.margin, top=self.top, button_margin=self.margin)
@@ -87,9 +89,6 @@ def place(self):
8789
self.width += self.margin
8890

8991
for widget in self.widgets:
90-
91-
widget_width, widget_height = widget.get_dimensions()
92-
9392
if self.vertical:
9493
widget.left = self.left
9594
widget.top = self.top + self.height
@@ -107,6 +106,7 @@ def place(self):
107106
self.height += widget_height + self.margin
108107
else:
109108
self.width += widget_width + self.margin
109+
self.label.manager.queue_render()
110110

111111
def get_dimensions(self):
112112
"""
@@ -136,11 +136,10 @@ def hide(self):
136136
self.hide_widgets()
137137

138138
def show_widgets(self):
139+
self.place()
139140
for widget in self.widgets:
140141
widget.show()
141142

142-
self.place()
143-
144143
def hide_widgets(self):
145144
"""
146145
Hides all widgets in this toolbar
@@ -182,7 +181,6 @@ def add_button(self, labels, **kwargs):
182181
kwargs["top"] = self.top
183182

184183
b = Button(self.interactor, **kwargs)
185-
186184
if self.open:
187185
b.show()
188186

@@ -192,6 +190,7 @@ def add_button(self, labels, **kwargs):
192190
self.width = kwargs["left"] + b.get_dimensions()[0]
193191

194192
self.widgets.append(b)
193+
195194
return b
196195

197196

@@ -211,6 +210,18 @@ def add_toolbar(self, label, **kwargs):
211210

212211
if "vertical" not in kwargs:
213212
kwargs["vertical"] = self.vertical
213+
_open = kwargs.get("on_open", None)
214+
def hook_open():
215+
self.place()
216+
if _open:
217+
_open()
218+
_close = kwargs.get("on_close", None)
219+
def hook_close():
220+
self.place()
221+
if _close:
222+
_close()
223+
kwargs["on_open"] = hook_open
224+
kwargs["on_close"] = hook_close
214225

215226
toolbar = Toolbar(self.interactor, label, **kwargs)
216227

testing/vcs/vtk_ui/CMakeLists.txt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,43 @@ cdat_add_test(test_vtk_ui_textbox_blank_text
177177
"${PYTHON_EXECUTABLE}"
178178
${TEST_DIR}/test_vtk_ui_textbox_blank_text.py
179179
)
180+
181+
cdat_add_test(test_vtk_ui_toolbar_label
182+
"${PYTHON_EXECUTABLE}"
183+
${TEST_DIR}/test_vtk_ui_toolbar_label.py
184+
${BASELINE_DIR}/test_vtk_ui_toolbar_label.png
185+
)
186+
187+
cdat_add_test(test_vtk_ui_toolbar_open
188+
"${PYTHON_EXECUTABLE}"
189+
${TEST_DIR}/test_vtk_ui_toolbar_open.py
190+
${BASELINE_DIR}/test_vtk_ui_toolbar_open.png
191+
)
192+
193+
cdat_add_test(test_vtk_ui_toolbar_close
194+
"${PYTHON_EXECUTABLE}"
195+
${TEST_DIR}/test_vtk_ui_toolbar_close.py
196+
${BASELINE_DIR}/test_vtk_ui_toolbar_close.png
197+
)
198+
199+
cdat_add_test(test_vtk_ui_toggle_button_get_text
200+
"${PYTHON_EXECUTABLE}"
201+
${TEST_DIR}/test_vtk_ui_toggle_button_get_text.py
202+
)
203+
204+
cdat_add_test(test_vtk_ui_toolbar_in_toolbar_open
205+
"${PYTHON_EXECUTABLE}"
206+
${TEST_DIR}/test_vtk_ui_toolbar_in_toolbar_open.py
207+
${BASELINE_DIR}/test_vtk_ui_toolbar_in_toolbar_open.png
208+
)
209+
210+
cdat_add_test(test_vtk_ui_toolbar_in_toolbar_closed
211+
"${PYTHON_EXECUTABLE}"
212+
${TEST_DIR}/test_vtk_ui_toolbar_in_toolbar_closed.py
213+
${BASELINE_DIR}/test_vtk_ui_toolbar_in_toolbar_closed.png
214+
)
215+
216+
cdat_add_test(test_vtk_ui_button_state_advance
217+
"${PYTHON_EXECUTABLE}"
218+
${TEST_DIR}/test_vtk_ui_button_state_advance.py
219+
)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
Test button state change
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_button_state_advance(vtk_ui_test):
10+
def do_test(self):
11+
self.win.SetSize(100, 100)
12+
states = [vcs.vtk_ui.ButtonState(label="State %d" % i, fgcolor=(.1 * i + .5, .1 * i + .5, .1 * i + .5), bgcolor=(.5 - .1 * i,.5 - .1 * i,.5 - .1 * i)) for i in range(5)]
13+
14+
b = vcs.vtk_ui.Button(self.inter, states=states, action=self.pass_me, left=0, top=0)
15+
b.show()
16+
17+
b.set_state(1)
18+
b.repr.NextState()
19+
b.widget.InvokeEvent("StateChangedEvent")
20+
21+
22+
def pass_me(self, state):
23+
if state == 2:
24+
print "Button action executed"
25+
self.passed = 0
26+
else:
27+
print state, "Action passed inaccurate state"
28+
from sys import exit
29+
sys.exit(1)
30+
31+
if __name__ == "__main__":
32+
test_vtk_ui_button_state_advance().test()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
Test toggle_button get text
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_toggle_button_get_text(vtk_ui_test):
10+
def do_test(self):
11+
b = vcs.vtk_ui.ToggleButton(self.inter, "Simple label")
12+
b.set_state(1)
13+
assert b.get_text() == "Simple label"
14+
b.set_state(0)
15+
assert b.get_text() == "Simple label"
16+
self.passed = 0
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""
2+
Test toolbar placement and basic appearance
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_toolbar_close(vtk_ui_test):
10+
def do_test(self):
11+
self.win.SetSize(200, 100)
12+
13+
toolbar = vcs.vtk_ui.Toolbar(self.inter, "Test Bar")
14+
toolbar.add_button(["Test Button"])
15+
toolbar.add_button(["Other Test"])
16+
toolbar.label.__advance__(1)
17+
toolbar.label.__advance__(0)
18+
assert toolbar.open == False
19+
toolbar.show()
20+
21+
self.test_file = "test_vtk_ui_toolbar_close.png"
22+
23+
if __name__ == "__main__":
24+
test_vtk_ui_toolbar_close().test()
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
Test toolbar placement inside toolbar
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_toolbar_in_toolbar_closed(vtk_ui_test):
10+
def do_test(self):
11+
self.win.SetSize(200, 250)
12+
13+
toolbar = vcs.vtk_ui.Toolbar(self.inter, "Test Bar")
14+
tb = toolbar.add_toolbar("Sub-bar")
15+
tb.add_button(["first"])
16+
tb.add_button(["second"])
17+
toolbar.add_button(["Test Button"])
18+
toolbar.add_button(["Other Test"])
19+
toolbar.show()
20+
21+
# Open both toolbars
22+
toolbar.label.__advance__(1)
23+
tb.label.__advance__(1)
24+
tb.label.__advance__(0)
25+
26+
self.test_file = "test_vtk_ui_toolbar_in_toolbar_closed.png"
27+
28+
if __name__ == "__main__":
29+
test_vtk_ui_toolbar_in_toolbar_closed().test()
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Test toolbar placement inside toolbar
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_toolbar_in_toolbar_open(vtk_ui_test):
10+
def do_test(self):
11+
self.win.SetSize(200, 250)
12+
13+
toolbar = vcs.vtk_ui.Toolbar(self.inter, "Test Bar")
14+
tb = toolbar.add_toolbar("Sub-bar")
15+
tb.add_button(["first"])
16+
tb.add_button(["second"])
17+
toolbar.add_button(["Test Button"])
18+
toolbar.add_button(["Other Test"])
19+
toolbar.show()
20+
21+
# Open both toolbars
22+
toolbar.label.__advance__(1)
23+
tb.label.__advance__(1)
24+
25+
self.test_file = "test_vtk_ui_toolbar_in_toolbar_open.png"
26+
27+
if __name__ == "__main__":
28+
test_vtk_ui_toolbar_in_toolbar_open().test()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""
2+
Test toolbar placement and basic appearance
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_toolbar_label(vtk_ui_test):
10+
def do_test(self):
11+
self.win.SetSize(200, 100)
12+
13+
toolbar = vcs.vtk_ui.Toolbar(self.inter, "Test Bar")
14+
# Should default to closed; these will help make sure
15+
toolbar.add_button(["Test Button"])
16+
toolbar.add_button(["Other Test"])
17+
assert toolbar.open == False
18+
toolbar.show()
19+
20+
self.test_file = "test_vtk_ui_toolbar_label.png"
21+
22+
if __name__ == "__main__":
23+
test_vtk_ui_toolbar_label().test()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""
2+
Test toolbar placement and basic appearance
3+
"""
4+
import vcs.vtk_ui
5+
6+
7+
from vtk_ui_test import vtk_ui_test
8+
9+
class test_vtk_ui_toolbar_open(vtk_ui_test):
10+
def do_test(self):
11+
self.win.SetSize(200, 100)
12+
13+
toolbar = vcs.vtk_ui.Toolbar(self.inter, "Test Bar")
14+
toolbar.add_button(["Test Button"])
15+
toolbar.add_button(["Other Test"])
16+
toolbar.label.__advance__(1)
17+
assert toolbar.open == True
18+
toolbar.show()
19+
20+
21+
self.test_file = "test_vtk_ui_toolbar_open.png"
22+
23+
if __name__ == "__main__":
24+
test_vtk_ui_toolbar_open().test()

0 commit comments

Comments
 (0)