Applied the new control sizing system to the GTK+ backend.
This commit is contained in:
parent
6e170ad1db
commit
4a68c3cb7a
|
@ -37,10 +37,10 @@ var window_delete_event_callback = C.GCallback(C.our_window_delete_event_callbac
|
||||||
func our_window_configure_event_callback(widget *C.GtkWidget, event *C.GdkEvent, what C.gpointer) C.gboolean {
|
func our_window_configure_event_callback(widget *C.GtkWidget, event *C.GdkEvent, what C.gpointer) C.gboolean {
|
||||||
// called when the window is resized
|
// called when the window is resized
|
||||||
s := (*sysData)(unsafe.Pointer(what))
|
s := (*sysData)(unsafe.Pointer(what))
|
||||||
if s.container != nil && s.resize != nil { // wait for init
|
if s.container != nil && s.allocate != nil { // wait for init
|
||||||
width, height := gtk_window_get_size(s.widget)
|
width, height := gtk_window_get_size(s.widget)
|
||||||
// top-left is (0,0) so no need for winheight
|
// top-left is (0,0) here
|
||||||
s.doResize(0, 0, width, height, 0)
|
s.resizeWindow(width, height)
|
||||||
}
|
}
|
||||||
// no need to manually redraw everything: since we use gtk_widget_set_size_request(), that queues both resize and redraw for us (thanks Company in irc.gimp.net/#gtk+)
|
// no need to manually redraw everything: since we use gtk_widget_set_size_request(), that queues both resize and redraw for us (thanks Company in irc.gimp.net/#gtk+)
|
||||||
return C.FALSE // continue the event chain
|
return C.FALSE // continue the event chain
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
// +build !windows,!darwin,!plan9
|
||||||
|
|
||||||
|
// 23 february 2014
|
||||||
|
|
||||||
|
package ui
|
||||||
|
|
||||||
|
type sysSizeData struct {
|
||||||
|
cSysSizeData
|
||||||
|
|
||||||
|
// for size calculations
|
||||||
|
// gtk+ needs nothing
|
||||||
|
|
||||||
|
// for the actual resizing
|
||||||
|
shouldVAlignTop bool
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
gtkXMargin = 12
|
||||||
|
gtkYMargin = 12
|
||||||
|
gtkXPadding = 12
|
||||||
|
gtkYPadding = 6
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *sysData) beginResize() (d *sysSizeData) {
|
||||||
|
d = new(sysSizeData)
|
||||||
|
if s.spaced {
|
||||||
|
d.xmargin = gtkXMargin
|
||||||
|
d.ymargin = gtkYMargin
|
||||||
|
d.xpadding = gtkXPadding
|
||||||
|
d.ypadding = gtkYPadding
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sysData) endResize(d *sysSizeData) {
|
||||||
|
// redraw
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sysData) translateAllocationCoords(allocations []*allocation, winwidth, winheight int) {
|
||||||
|
// no need for coordinate conversion with gtk+
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sysData) commitResize(c *allocation, d *sysSizeData) {
|
||||||
|
if s.ctype == c_label && !s.alternate && c.neighbor != nil {
|
||||||
|
c.neighbor.getAuxResizeInfo(d)
|
||||||
|
if d.shouldVAlignTop {
|
||||||
|
// TODO should it be center-aligned to the first line or not
|
||||||
|
gtk_misc_set_alignment(s.widget, 0, 0)
|
||||||
|
} else {
|
||||||
|
gtk_misc_set_alignment(s.widget, 0, 0.5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO merge this here
|
||||||
|
s.setRect(c.x, c.y, c.width, c.height, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sysData) getAuxResizeInfo(d *sysSizeData) {
|
||||||
|
d.shouldVAlignTop = (s.ctype == c_listbox) || (s.ctype == c_area)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GTK+ 3 makes this easy: controls can tell us what their preferred size is!
|
||||||
|
// ...actually, it tells us two things: the "minimum size" and the "natural size".
|
||||||
|
// The "minimum size" is the smallest size we /can/ display /anything/. The "natural size" is the smallest size we would /prefer/ to display.
|
||||||
|
// The difference? Minimum size takes into account things like truncation with ellipses: the minimum size of a label can allot just the ellipses!
|
||||||
|
// So we use the natural size instead.
|
||||||
|
// There is a warning about height-for-width controls, but in my tests this isn't an issue.
|
||||||
|
// For Areas, we manually save the Area size and use that, just to be safe.
|
||||||
|
|
||||||
|
// We don't need to worry about y-offset because label alignment is "vertically center", which GtkLabel does for us.
|
||||||
|
|
||||||
|
func (s *sysData) preferredSize(d *sysSizeData) (width int, height int) {
|
||||||
|
if s.ctype == c_area {
|
||||||
|
return s.areawidth, s.areaheight
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _, width, height = gtk_widget_get_preferred_size(s.widget)
|
||||||
|
return width, height
|
||||||
|
}
|
|
@ -239,6 +239,10 @@ func gtk_entry_get_text(widget *C.GtkWidget) string {
|
||||||
var _emptystring = [1]C.gchar{0}
|
var _emptystring = [1]C.gchar{0}
|
||||||
var emptystring = &_emptystring[0]
|
var emptystring = &_emptystring[0]
|
||||||
|
|
||||||
|
func gtk_misc_set_alignment(widget *C.GtkWidget, x float64, y float64) {
|
||||||
|
C.gtk_misc_set_alignment((*C.GtkMisc)(unsafe.Pointer(widget)), C.gfloat(x), C.gfloat(y))
|
||||||
|
}
|
||||||
|
|
||||||
func gtk_label_new() *C.GtkWidget {
|
func gtk_label_new() *C.GtkWidget {
|
||||||
label := C.gtk_label_new(emptystring)
|
label := C.gtk_label_new(emptystring)
|
||||||
C.gtk_label_set_line_wrap(togtklabel(label), C.FALSE) // turn off line wrap
|
C.gtk_label_set_line_wrap(togtklabel(label), C.FALSE) // turn off line wrap
|
||||||
|
@ -250,14 +254,14 @@ func gtk_label_new() *C.GtkWidget {
|
||||||
// this will valign to the center, which is what the HIG says (https://developer.gnome.org/hig-book/3.4/design-text-labels.html.en) for all controls that label to the side; thankfully this means we don't need to do any extra positioning magic
|
// this will valign to the center, which is what the HIG says (https://developer.gnome.org/hig-book/3.4/design-text-labels.html.en) for all controls that label to the side; thankfully this means we don't need to do any extra positioning magic
|
||||||
// this will also valign to the top
|
// this will also valign to the top
|
||||||
// thanks to mclasen in irc.gimp.net/#gtk+
|
// thanks to mclasen in irc.gimp.net/#gtk+
|
||||||
C.gtk_misc_set_alignment((*C.GtkMisc)(unsafe.Pointer(label)), 0, 0.5)
|
gtk_misc_set_alignment(label, 0, 0.5)
|
||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
func gtk_label_new_standalone() *C.GtkWidget {
|
func gtk_label_new_standalone() *C.GtkWidget {
|
||||||
label := gtk_label_new()
|
label := gtk_label_new()
|
||||||
// this will valign to the top
|
// this will valign to the top
|
||||||
C.gtk_misc_set_alignment((*C.GtkMisc)(unsafe.Pointer(label)), 0, 0)
|
gtk_misc_set_alignment(label, 0, 0)
|
||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
// +build !windows,!darwin,!plan9
|
|
||||||
|
|
||||||
// 23 february 2014
|
|
||||||
|
|
||||||
package ui
|
|
||||||
|
|
||||||
// GTK+ 3 makes this easy: controls can tell us what their preferred size is!
|
|
||||||
// ...actually, it tells us two things: the "minimum size" and the "natural size".
|
|
||||||
// The "minimum size" is the smallest size we /can/ display /anything/. The "natural size" is the smallest size we would /prefer/ to display.
|
|
||||||
// The difference? Minimum size takes into account things like truncation with ellipses: the minimum size of a label can allot just the ellipses!
|
|
||||||
// So we use the natural size instead.
|
|
||||||
// There is a warning about height-for-width controls, but in my tests this isn't an issue.
|
|
||||||
// For Areas, we manually save the Area size and use that, just to be safe.
|
|
||||||
|
|
||||||
// We don't need to worry about y-offset because label alignment is "vertically center", which GtkLabel does for us.
|
|
||||||
|
|
||||||
func (s *sysData) preferredSize() (width int, height int, yoff int) {
|
|
||||||
if s.ctype == c_area {
|
|
||||||
return s.areawidth, s.areaheight, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
_, _, width, height = gtk_widget_get_preferred_size(s.widget)
|
|
||||||
return width, height, 0
|
|
||||||
}
|
|
7
todo.md
7
todo.md
|
@ -1,10 +1,6 @@
|
||||||
ALL:
|
ALL:
|
||||||
- vertical alignment of labels is a botch right now
|
- vertical alignment of labels is a botch right now
|
||||||
- windows: unilaterally applied; not much tow orry about here though
|
|
||||||
- gtk: mostly fine, just that list box labels need to be top-aligned
|
|
||||||
- os x: very very wrong
|
- os x: very very wrong
|
||||||
- will need to make yoff a function of a control and its neighbor to the right for this to work
|
|
||||||
- on gtk+ the yoff function will need to do the text alignment
|
|
||||||
|
|
||||||
MAC OS X:
|
MAC OS X:
|
||||||
- NSComboBox scans the entered text to see if it matches one of the items and returns the index of that item if it does; find out how to suppress this so that it returns -1 unless the item was chosen from the list (like the other platforms)
|
- NSComboBox scans the entered text to see if it matches one of the items and returns the index of that item if it does; find out how to suppress this so that it returns -1 unless the item was chosen from the list (like the other platforms)
|
||||||
|
@ -22,7 +18,8 @@ WINDOWS:
|
||||||
- control sizing is a MAJOR pain
|
- control sizing is a MAJOR pain
|
||||||
- http://stackoverflow.com/questions/24130548/is-there-a-proper-way-to-get-the-preferred-size-of-windows-controls-there-are-s
|
- http://stackoverflow.com/questions/24130548/is-there-a-proper-way-to-get-the-preferred-size-of-windows-controls-there-are-s
|
||||||
- redrawing controls after a window resize on Windows does not work properly
|
- redrawing controls after a window resize on Windows does not work properly
|
||||||
- when adding IsDialogMessage() find out if that make sthe area in the area bounds test automatically focused
|
- when adding IsDialogMessage() find out if that makes the area in the area bounds test automatically focused
|
||||||
|
- vertical alignment of labels can be wrong (I think; need to check again - TODO)
|
||||||
|
|
||||||
UNIX:
|
UNIX:
|
||||||
- figure out how to detect the alt key and mouse buttons above 5 properly for modifiers/Held[]
|
- figure out how to detect the alt key and mouse buttons above 5 properly for modifiers/Held[]
|
||||||
|
|
Loading…
Reference in New Issue