summaryrefslogtreecommitdiff
path: root/redo
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
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')
-rw-r--r--redo/containerctrls.go4
-rw-r--r--redo/layout_windows.go4
-rw-r--r--redo/tab_windows.go37
-rw-r--r--redo/window_windows.c2
4 files changed, 27 insertions, 20 deletions
diff --git a/redo/containerctrls.go b/redo/containerctrls.go
index ec44501..9b0c0b1 100644
--- a/redo/containerctrls.go
+++ b/redo/containerctrls.go
@@ -4,8 +4,8 @@ package ui
// Tab is a Control that contains multiple pages of tabs, each containing a single Control.
// You can add and remove tabs from the Tab at any time.
-// TODO rename?
-// TODO implement containerShow()/containerHide() on this
+//
+// [TODO if each tab of your Tab is going to have the same content Controls, then use LikeTab instead, to conserve resources]
type Tab interface {
Control
diff --git a/redo/layout_windows.go b/redo/layout_windows.go
index 58f7872..7d55a58 100644
--- a/redo/layout_windows.go
+++ b/redo/layout_windows.go
@@ -35,6 +35,10 @@ func newLayout(title string, width int, height int, child C.BOOL, control Contro
return l
}
+func (l *layout) setParent(p *controlParent) {
+ C.controlSetParent(l.hwnd, p.hwnd)
+}
+
//export storeWindowHWND
func storeWindowHWND(data unsafe.Pointer, hwnd C.HWND) {
l := (*layout)(data)
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)
diff --git a/redo/window_windows.c b/redo/window_windows.c
index 67a4440..5ed4de9 100644
--- a/redo/window_windows.c
+++ b/redo/window_windows.c
@@ -69,7 +69,7 @@ HWND newWindow(LPWSTR title, int width, int height, BOOL child, void *data)
style = WS_OVERLAPPEDWINDOW;
parent = NULL;
if (child) {
- style = WS_CHILD;
+ style = WS_CHILD | WS_VISIBLE;
parent = msgwin;
}
hwnd = CreateWindowExW(