Implemented uiPasswordEntry() and uiSearchEntry() on OS X.

This commit is contained in:
Pietro Gagliardi 2016-06-05 20:39:18 -04:00
parent d0be2979e4
commit 4e7d2812bd
1 changed files with 86 additions and 7 deletions

View File

@ -20,6 +20,40 @@
@end @end
// TODO does this have one on its own?
@interface libui_intrinsicWidthNSSecureTextField : NSSecureTextField
@end
@implementation libui_intrinsicWidthNSSecureTextField
- (NSSize)intrinsicContentSize
{
NSSize s;
s = [super intrinsicContentSize];
s.width = textfieldWidth;
return s;
}
@end
// TODO does this have one on its own?
@interface libui_intrinsicWidthNSSearchField : NSSearchField
@end
@implementation libui_intrinsicWidthNSSearchField
- (NSSize)intrinsicContentSize
{
NSSize s;
s = [super intrinsicContentSize];
s.width = textfieldWidth;
return s;
}
@end
struct uiEntry { struct uiEntry {
uiDarwinControl c; uiDarwinControl c;
NSTextField *textfield; NSTextField *textfield;
@ -27,10 +61,16 @@ struct uiEntry {
void *onChangedData; void *onChangedData;
}; };
static BOOL isSearchField(NSTextField *tf)
{
return [tf isKindOfClass:[NSSearchField class]];
}
@interface entryDelegateClass : NSObject<NSTextFieldDelegate> { @interface entryDelegateClass : NSObject<NSTextFieldDelegate> {
struct mapTable *entries; struct mapTable *entries;
} }
- (void)controlTextDidChange:(NSNotification *)note; - (void)controlTextDidChange:(NSNotification *)note;
- (IBAction)onSearch:(id)sender;
- (void)registerEntry:(uiEntry *)e; - (void)registerEntry:(uiEntry *)e;
- (void)unregisterEntry:(uiEntry *)e; - (void)unregisterEntry:(uiEntry *)e;
@end @end
@ -52,21 +92,33 @@ struct uiEntry {
} }
- (void)controlTextDidChange:(NSNotification *)note - (void)controlTextDidChange:(NSNotification *)note
{
[self onSearch:[note object]];
}
- (IBAction)onSearch:(id)sender
{ {
uiEntry *e; uiEntry *e;
e = (uiEntry *) mapGet(self->entries, [note object]); e = (uiEntry *) mapGet(self->entries, sender);
(*(e->onChanged))(e, e->onChangedData); (*(e->onChanged))(e, e->onChangedData);
} }
- (void)registerEntry:(uiEntry *)e - (void)registerEntry:(uiEntry *)e
{ {
mapSet(self->entries, e->textfield, e); mapSet(self->entries, e->textfield, e);
if (isSearchField(e->textfield)) {
[e->textfield setTarget:self];
[e->textfield setAction:@selector(onSearch:)];
} else
[e->textfield setDelegate:self]; [e->textfield setDelegate:self];
} }
- (void)unregisterEntry:(uiEntry *)e - (void)unregisterEntry:(uiEntry *)e
{ {
if (isSearchField(e->textfield))
[e->textfield setTarget:nil];
else
[e->textfield setDelegate:nil]; [e->textfield setDelegate:nil];
mapDelete(self->entries, e->textfield); mapDelete(self->entries, e->textfield);
} }
@ -139,23 +191,28 @@ void finishNewTextField(NSTextField *t, BOOL isEntry)
[[t cell] setScrollable:YES]; [[t cell] setScrollable:YES];
} }
NSTextField *newEditableTextField(void) static NSTextField *realNewEditableTextField(Class class)
{ {
NSTextField *tf; NSTextField *tf;
tf = [[libui_intrinsicWidthNSTextField alloc] initWithFrame:NSZeroRect]; tf = [[class alloc] initWithFrame:NSZeroRect];
[tf setSelectable:YES]; // otherwise the setting is masked by the editable default of YES [tf setSelectable:YES]; // otherwise the setting is masked by the editable default of YES
finishNewTextField(tf, YES); finishNewTextField(tf, YES);
return tf; return tf;
} }
uiEntry *uiNewEntry(void) NSTextField *newEditableTextField(void)
{
return realNewEditableTextField([libui_intrinsicWidthNSTextField class]);
}
static uiEntry *finishNewEntry(Class class)
{ {
uiEntry *e; uiEntry *e;
uiDarwinNewControl(uiEntry, e); uiDarwinNewControl(uiEntry, e);
e->textfield = newEditableTextField(); e->textfield = realNewEditableTextField(class);
if (entryDelegate == nil) { if (entryDelegate == nil) {
entryDelegate = [[entryDelegateClass new] autorelease]; entryDelegate = [[entryDelegateClass new] autorelease];
@ -166,3 +223,25 @@ uiEntry *uiNewEntry(void)
return e; return e;
} }
uiEntry *uiNewEntry(void)
{
return finishNewEntry([libui_intrinsicWidthNSTextField class]);
}
uiEntry *uiNewPasswordEntry(void)
{
return finishNewEntry([libui_intrinsicWidthNSSecureTextField class]);
}
uiEntry *uiNewSearchEntry(void)
{
uiEntry *e;
NSSearchField *s;
e = finishNewEntry([libui_intrinsicWidthNSSearchField class]);
s = (NSSearchField *) (e->textfield);
[s setSendsSearchStringImmediately:NO];
[s setSendsWholeSearchString:NO];
return e;
}