summaryrefslogtreecommitdiff
path: root/redo/tab_windows.go
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-08-04 13:13:59 -0400
committerPietro Gagliardi <[email protected]>2014-08-04 13:13:59 -0400
commit0496cf77b52e1713749fe40a8ef1b22f4918ad1d (patch)
tree8635b78a59a0df4c634f523222aea313434eec67 /redo/tab_windows.go
parent950548563dfc284f913e78895eeead6e8a14553a (diff)
Changed Tab on Windows to store each control in a *layout (see previous commit). Now I can throw out containerShow()/containerHide()/Show()/Hide(). This also will let me do the right thing with sizer and dialog base units again, and even get rid of sizer's confusion once and for all!
Diffstat (limited to 'redo/tab_windows.go')
-rw-r--r--redo/tab_windows.go37
1 files changed, 20 insertions, 17 deletions
diff --git a/redo/tab_windows.go b/redo/tab_windows.go
index 20e1ee0..a0cf637 100644
--- a/redo/tab_windows.go
+++ b/redo/tab_windows.go
@@ -12,15 +12,16 @@ import "C"
/*
On Windows, container controls are just regular controls; their children have to be children of the parent window, and changing the contents of a switching container (such as a tab control) must be done manually.
+We'll create a dummy window using the pre-existing Window window class for each tab page. This makes showing and hiding tabs a matter of showing and hiding one control, at the cost of having to do C.moveWindow() in tab.commitResize()... (TODO)
+
TODO
- make sure all tabs cannot be deselected (that is, make sure the current tab can never have index -1)
-- see if we can safely make the controls children of the tab control itself or if that would just screw our subclassing
*/
type tab struct {
_hwnd C.HWND
- tabs []*sizer
- parent C.HWND
+ tabs []*layout
+ parent *controlParent
}
func newTab() Tab {
@@ -36,15 +37,15 @@ func newTab() Tab {
}
func (t *tab) Append(name string, control Control) {
- s := new(sizer)
- t.tabs = append(t.tabs, s)
- s.child = control
+ l := newLayout("", 0, 0, C.TRUE, control)
+ t.tabs = append(t.tabs, l)
if t.parent != nil {
- s.child.setParent(&controlParent{t.parent})
+ l.setParent(t.parent)
}
// initially hide tab 1..n controls; if we don't, they'll appear over other tabs, resulting in weird behavior
if len(t.tabs) != 1 {
- s.child.containerHide()
+ // TODO move these calls to layout itself
+ C.ShowWindow(t.tabs[len(t.tabs) - 1].hwnd, C.SW_HIDE)
}
C.tabAppend(t._hwnd, toUTF16(name))
}
@@ -52,13 +53,13 @@ func (t *tab) Append(name string, control Control) {
//export tabChanging
func tabChanging(data unsafe.Pointer, current C.LRESULT) {
t := (*tab)(data)
- t.tabs[int(current)].child.containerHide()
+ C.ShowWindow(t.tabs[int(current)].hwnd, C.SW_HIDE)
}
//export tabChanged
func tabChanged(data unsafe.Pointer, new C.LRESULT) {
t := (*tab)(data)
- t.tabs[int(new)].child.containerShow()
+ C.ShowWindow(t.tabs[int(new)].hwnd, C.SW_SHOW)
}
func (t *tab) hwnd() C.HWND {
@@ -67,18 +68,18 @@ func (t *tab) hwnd() C.HWND {
func (t *tab) setParent(p *controlParent) {
basesetParent(t, p)
- for _, c := range t.tabs {
- c.child.setParent(p)
+ for _, l := range t.tabs {
+ l.setParent(p)
}
- t.parent = p.hwnd
+ t.parent = p
}
-// TODO actually write this
+// TODO get rid of this
func (t *tab) containerShow() {
basecontainerShow(t)
}
-// TODO actually write this
+// TODO get rid of this
func (t *tab) containerHide() {
basecontainerHide(t)
}
@@ -113,9 +114,11 @@ func (t *tab) commitResize(c *allocation, d *sizing) {
C.tabGetContentRect(t._hwnd, &r)
// and resize tabs
// don't resize just the current tab; resize all tabs!
- for _, s := range t.tabs {
+ for _, l := range t.tabs {
// because each widget is actually a child of the Window, the origin is the one we calculated above
- s.resize(int(r.left), int(r.top), int(r.right - r.left), int(r.bottom - r.top))
+ // we use moveWindow() rather than calling resize() directly
+ // TODO
+ C.moveWindow(l.hwnd, C.int(r.left), C.int(r.top), C.int(r.right - r.left), C.int(r.bottom - r.top))
}
// and now resize the tab control itself
basecommitResize(t, c, d)