Started the Mac OS X implementation of Area.OpenTextFieldAt().

This commit is contained in:
Pietro Gagliardi 2014-08-22 22:32:31 -04:00
parent c7268f8fee
commit 89ea8f5cbb
4 changed files with 86 additions and 6 deletions

View File

@ -3,6 +3,7 @@
package ui
import (
"fmt"
"image"
"unsafe"
)
@ -14,17 +15,21 @@ import "C"
type area struct {
*areabase
_id C.id
scroller *scroller
_id C.id
scroller *scroller
textfield C.id
textfielddone *event
}
func newArea(ab *areabase) Area {
a := &area{
areabase: ab,
textfielddone: newEvent(),
}
a._id = C.newArea(unsafe.Pointer(a))
a.scroller = newScroller(a._id, false) // no border on Area
a.SetSize(a.width, a.height)
a.textfield = C.newAreaTextField(a._id, unsafe.Pointer(a))
return a
}
@ -53,6 +58,33 @@ func (a *area) RepaintAll() {
C.areaRepaintAll(a._id)
}
func (a *area) OpenTextFieldAt(x, y int) {
if x < 0 || x >= a.width || y < 0 || y >= a.height {
panic(fmt.Errorf("point (%d,%d) outside Area in Area.OpenTextFieldAt()", x, y))
}
C.areaTextFieldOpen(a.textfield, C.intptr_t(x), C.intptr_t(y))
}
func (a *area) TextFieldText() string {
return C.GoString(C.textFieldText(a.textfield))
}
func (a *area) SetTextFieldText(text string) {
ctext := C.CString(text)
defer C.free(unsafe.Pointer(ctext))
C.textFieldSetText(a.textfield, ctext)
}
func (a *area) OnTextFieldDismissed(f func()) {
a.textfielddone.set(f)
}
//export areaTextFieldDismissed
func areaTextFieldDismissed(data unsafe.Pointer) {
a := (*area)(unsafe.Pointer(data))
a.textfielddone.fire()
}
//export areaView_drawRect
func areaView_drawRect(self C.id, rect C.struct_xrect, data unsafe.Pointer) {
a := (*area)(data)

View File

@ -6,6 +6,7 @@
#define toNSEvent(x) ((NSEvent *) (x))
#define toNSView(x) ((NSView *) (x))
#define toNSTextField(x) ((NSTextField *) (x))
#define toNSInteger(x) ((NSInteger) (x))
#define fromNSInteger(x) ((intptr_t) (x))
@ -203,3 +204,44 @@ void areaRepaintAll(id view)
{
[toNSView(view) display];
}
@interface goAreaTextField : NSTextField {
@public
void *goarea;
}
@end
@implementation goAreaTextField
/*
- (BOOL)resignFirstResponder
{
[self setHidden:YES];
areaTextFieldDismissed(self->goarea);
return [super resignFirstResponder];
}
*/
@end
id newAreaTextField(id area, void *goarea)
{
goAreaTextField *tf;
tf = [[goAreaTextField alloc] initWithFrame:NSZeroRect];
finishNewTextField((id) tf, YES);
[toNSView(area) addSubview:tf];
[tf setHidden:YES];
tf->goarea = goarea;
return (id) tf;
}
void areaTextFieldOpen(id textfield, intptr_t x, intptr_t y)
{
NSTextField *tf = toNSTextField(textfield);
[tf sizeToFit];
// TODO
[tf setFrameSize:NSMakeSize(150, 20)];
[tf setFrameOrigin:NSMakePoint((CGFloat) x, (CGFloat) y)];
[tf setHidden:NO];
[[tf window] makeFirstResponder:tf];
}

View File

@ -106,8 +106,11 @@ void checkboxSetChecked(id c, BOOL checked)
}
// also good for labels
static id finishNewTextField(NSTextField *t, BOOL bordered)
// not static because area_darwin.m uses it
id finishNewTextField(id _t, BOOL bordered)
{
NSTextField *t = toNSTextField(_t);
// same for text fields, password fields, and labels
setStandardControlFont((id) t);
// these three are the same across text fields, password fields, and labels; the only difference is the setBezeled: value, and it's only different on labels
@ -131,7 +134,7 @@ id newTextField(void)
NSTextField *t;
t = [[NSTextField alloc] initWithFrame:NSZeroRect];
return finishNewTextField(t, YES);
return finishNewTextField((id) t, YES);
}
id newPasswordField(void)
@ -139,7 +142,7 @@ id newPasswordField(void)
NSSecureTextField *t;
t = [[NSSecureTextField alloc] initWithFrame:NSZeroRect];
return finishNewTextField(toNSTextField(t), YES);
return finishNewTextField((id) t, YES);
}
void textfieldSetDelegate(id textfield, void *t)
@ -219,7 +222,7 @@ id newLabel(void)
[l setEditable:NO];
[l setSelectable:NO];
[l setDrawsBackground:NO];
return finishNewTextField(l, NO);
return finishNewTextField((id) l, NO);
}
id newGroup(id container)

View File

@ -66,6 +66,7 @@ extern id newCheckbox(void);
extern void checkboxSetDelegate(id, void *);
extern BOOL checkboxChecked(id);
extern void checkboxSetChecked(id, BOOL);
extern id finishNewTextField(id, BOOL);
extern id newTextField(void);
extern id newPasswordField(void);
extern void textfieldSetDelegate(id, void *);
@ -127,6 +128,8 @@ extern uintptr_t pressedMouseButtons(void);
extern uintptr_t keyCode(id);
extern void areaRepaint(id, struct xrect);
extern void areaRepaintAll(id);
extern id newAreaTextField(id, void *);
extern void areaTextFieldOpen(id, intptr_t, intptr_t);
/* common_darwin.m */
extern void disableAutocorrect(id);