Added a facility to the OS X port to be notified when a child's visibility has changed; this is necessary for implementing hiding and showing properly.

This commit is contained in:
Pietro Gagliardi 2016-06-14 10:37:19 -04:00
parent 48546f6b44
commit d54f7dd682
9 changed files with 71 additions and 2 deletions

View File

@ -396,6 +396,13 @@ static void uiBoxChildEdgeHuggingChanged(uiDarwinControl *c)
uiDarwinControlDefaultHuggingPriority(uiBox, view) uiDarwinControlDefaultHuggingPriority(uiBox, view)
uiDarwinControlDefaultSetHuggingPriority(uiBox, view) uiDarwinControlDefaultSetHuggingPriority(uiBox, view)
static void uiBoxChildVisibilityChanged(uiDarwinControl *c)
{
uiBox *b = uiBox(c);
[b->view establishOurConstraints];
}
void uiBoxAppend(uiBox *b, uiControl *c, int stretchy) void uiBoxAppend(uiBox *b, uiControl *c, int stretchy)
{ {
// LONGTERM on other platforms // LONGTERM on other platforms

View File

@ -36,6 +36,11 @@ void uiDarwinControlSetHuggingPriority(uiDarwinControl *c, NSLayoutPriority prio
(*(c->SetHuggingPriority))(c, priority, orientation); (*(c->SetHuggingPriority))(c, priority, orientation);
} }
void uiDarwinControlChildVisibilityChanged(uiDarwinControl *c)
{
(*(c->ChildVisibilityChanged))(c);
}
void uiDarwinSetControlFont(NSControl *c, NSControlSize size) void uiDarwinSetControlFont(NSControl *c, NSControlSize size)
{ {
[c setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:size]]]; [c setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:size]]];
@ -68,3 +73,12 @@ void uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl *c)
if (parent != NULL) if (parent != NULL)
uiDarwinControlChildEdgeHuggingChanged(uiDarwinControl(parent)); uiDarwinControlChildEdgeHuggingChanged(uiDarwinControl(parent));
} }
void uiDarwinNotifyVisibilityChanged(uiDarwinControl *c)
{
uiControl *parent;
parent = uiControlParent(uiControl(c));
if (parent != NULL)
uiDarwinControlChildVisibilityChanged(uiDarwinControl(parent));
}

View File

@ -476,6 +476,13 @@ static void uiFormChildEdgeHuggingChanged(uiDarwinControl *c)
uiDarwinControlDefaultHuggingPriority(uiForm, view) uiDarwinControlDefaultHuggingPriority(uiForm, view)
uiDarwinControlDefaultSetHuggingPriority(uiForm, view) uiDarwinControlDefaultSetHuggingPriority(uiForm, view)
static void uiFormChildVisibilityChanged(uiDarwinControl *c)
{
uiForm *f = uiForm(c);
[f->view establishOurConstraints];
}
void uiFormAppend(uiForm *f, const char *label, uiControl *c, int stretchy) void uiFormAppend(uiForm *f, const char *label, uiControl *c, int stretchy)
{ {
// LONGTERM on other platforms // LONGTERM on other platforms

View File

@ -590,6 +590,13 @@ static void uiGridChildEdgeHuggingChanged(uiDarwinControl *c)
uiDarwinControlDefaultHuggingPriority(uiGrid, view) uiDarwinControlDefaultHuggingPriority(uiGrid, view)
uiDarwinControlDefaultSetHuggingPriority(uiGrid, view) uiDarwinControlDefaultSetHuggingPriority(uiGrid, view)
static void uiGridChildVisibilityChanged(uiDarwinControl *c)
{
uiGrid *g = uiGrid(c);
[g->view establishOurConstraints];
}
static gridChild *toChild(uiControl *c, int xspan, int yspan, int hexpand, uiAlign halign, int vexpand, uiAlign valign) static gridChild *toChild(uiControl *c, int xspan, int yspan, int hexpand, uiAlign halign, int vexpand, uiAlign valign)
{ {
gridChild *gc; gridChild *gc;

View File

@ -117,6 +117,13 @@ static void uiGroupSetHuggingPriority(uiDarwinControl *c, NSLayoutPriority prior
uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl(g)); uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl(g));
} }
static void uiGroupChildVisibilityChanged(uiDarwinControl *c)
{
uiGroup *g = uiGroup(c);
groupRelayout(g);
}
char *uiGroupTitle(uiGroup *g) char *uiGroupTitle(uiGroup *g)
{ {
return uiDarwinNSStringToText([g->box title]); return uiDarwinNSStringToText([g->box title]);

View File

@ -180,6 +180,13 @@ static void uiTabSetHuggingPriority(uiDarwinControl *c, NSLayoutPriority priorit
uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl(t)); uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl(t));
} }
static void uiTabChildVisibilityChanged(uiDarwinControl *c)
{
uiTab *t = uiTab(c);
tabRelayout(t);
}
void uiTabAppend(uiTab *t, const char *name, uiControl *child) void uiTabAppend(uiTab *t, const char *name, uiControl *child)
{ {
uiTabInsertAt(t, name, [t->pages count], child); uiTabInsertAt(t, name, [t->pages count], child);

View File

@ -187,6 +187,13 @@ uiDarwinControlDefaultHuggingPriority(uiWindow, window)
uiDarwinControlDefaultSetHuggingPriority(uiWindow, window) uiDarwinControlDefaultSetHuggingPriority(uiWindow, window)
// end TODO // end TODO
static void uiWindowChildVisibilityChanged(uiDarwinControl *c)
{
uiWindow *w = uiWindow(c);
windowRelayout(w);
}
char *uiWindowTitle(uiWindow *w) char *uiWindowTitle(uiWindow *w)
{ {
return uiDarwinNSStringToText([w->window title]); return uiDarwinNSStringToText([w->window title]);

View File

@ -2,6 +2,7 @@
#include "test.h" #include "test.h"
// TODO add a test for childless windows // TODO add a test for childless windows
// TODO add tests for contianers with all controls hidden
static uiGroup *newg(const char *n, int s) static uiGroup *newg(const char *n, int s)
{ {

View File

@ -24,6 +24,7 @@ struct uiDarwinControl {
void (*ChildEdgeHuggingChanged)(uiDarwinControl *); void (*ChildEdgeHuggingChanged)(uiDarwinControl *);
NSLayoutPriority (*HuggingPriority)(uiDarwinControl *, NSLayoutConstraintOrientation); NSLayoutPriority (*HuggingPriority)(uiDarwinControl *, NSLayoutConstraintOrientation);
void (*SetHuggingPriority)(uiDarwinControl *, NSLayoutPriority, NSLayoutConstraintOrientation); void (*SetHuggingPriority)(uiDarwinControl *, NSLayoutPriority, NSLayoutConstraintOrientation);
void (*ChildVisibilityChanged)(uiDarwinControl *);
}; };
#define uiDarwinControl(this) ((uiDarwinControl *) (this)) #define uiDarwinControl(this) ((uiDarwinControl *) (this))
// TODO document // TODO document
@ -34,6 +35,7 @@ _UI_EXTERN BOOL uiDarwinControlHugsBottom(uiDarwinControl *);
_UI_EXTERN void uiDarwinControlChildEdgeHuggingChanged(uiDarwinControl *); _UI_EXTERN void uiDarwinControlChildEdgeHuggingChanged(uiDarwinControl *);
_UI_EXTERN NSLayoutPriority uiDarwinControlHuggingPriority(uiDarwinControl *, NSLayoutConstraintOrientation); _UI_EXTERN NSLayoutPriority uiDarwinControlHuggingPriority(uiDarwinControl *, NSLayoutConstraintOrientation);
_UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPriority, NSLayoutConstraintOrientation); _UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPriority, NSLayoutConstraintOrientation);
_UI_EXTERN void uiDarwinControlChildVisibilityChanged(uiDarwinControl *);
#define uiDarwinControlDefaultDestroy(type, handlefield) \ #define uiDarwinControlDefaultDestroy(type, handlefield) \
static void type ## Destroy(uiControl *c) \ static void type ## Destroy(uiControl *c) \
@ -72,12 +74,14 @@ _UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPri
{ \ { \
uiDarwinControl(c)->visible = YES; \ uiDarwinControl(c)->visible = YES; \
[type(c)->handlefield setHidden:NO]; \ [type(c)->handlefield setHidden:NO]; \
uiDarwinNotifyVisibilityChanged(uiDarwinControl(c)); \
} }
#define uiDarwinControlDefaultHide(type, handlefield) \ #define uiDarwinControlDefaultHide(type, handlefield) \
static void type ## Hide(uiControl *c) \ static void type ## Hide(uiControl *c) \
{ \ { \
uiDarwinControl(c)->visible = NO; \ uiDarwinControl(c)->visible = NO; \
[type(c)->handlefield setHidden:YES]; \ [type(c)->handlefield setHidden:YES]; \
uiDarwinNotifyVisibilityChanged(uiDarwinControl(c)); \
} }
#define uiDarwinControlDefaultEnabled(type, handlefield) \ #define uiDarwinControlDefaultEnabled(type, handlefield) \
static int type ## Enabled(uiControl *c) \ static int type ## Enabled(uiControl *c) \
@ -102,7 +106,7 @@ _UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPri
if (uiDarwinShouldStopSyncEnableState(c, enabled)) \ if (uiDarwinShouldStopSyncEnableState(c, enabled)) \
return; \ return; \
if ([type(c)->handlefield respondsToSelector:@selector(setEnabled:)]) \ if ([type(c)->handlefield respondsToSelector:@selector(setEnabled:)]) \
[((id) type(c)->handlefield) setEnabled:enabled]; /* id cast to make compiler happy; thanks mikeash in irc.freenode.net/#macdev */ \ [((id) (type(c)->handlefield)) setEnabled:enabled]; /* id cast to make compiler happy; thanks mikeash in irc.freenode.net/#macdev */ \
} }
#define uiDarwinControlDefaultSetSuperview(type, handlefield) \ #define uiDarwinControlDefaultSetSuperview(type, handlefield) \
static void type ## SetSuperview(uiDarwinControl *c, NSView *superview) \ static void type ## SetSuperview(uiDarwinControl *c, NSView *superview) \
@ -138,6 +142,11 @@ _UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPri
{ \ { \
[type(c)->handlefield setContentHuggingPriority:priority forOrientation:orientation]; \ [type(c)->handlefield setContentHuggingPriority:priority forOrientation:orientation]; \
} }
#define uiDarwinControlDefaultChildVisibilityChanged(type, handlefield) \
static void type ## ChildVisibilityChanged(uiDarwinControl *c) \
{ \
/* do nothing */ \
}
#define uiDarwinControlAllDefaultsExceptDestroy(type, handlefield) \ #define uiDarwinControlAllDefaultsExceptDestroy(type, handlefield) \
uiDarwinControlDefaultHandle(type, handlefield) \ uiDarwinControlDefaultHandle(type, handlefield) \
@ -156,7 +165,8 @@ _UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPri
uiDarwinControlDefaultHugsBottom(type, handlefield) \ uiDarwinControlDefaultHugsBottom(type, handlefield) \
uiDarwinControlDefaultChildEdgeHuggingChanged(type, handlefield) \ uiDarwinControlDefaultChildEdgeHuggingChanged(type, handlefield) \
uiDarwinControlDefaultHuggingPriority(type, handlefield) \ uiDarwinControlDefaultHuggingPriority(type, handlefield) \
uiDarwinControlDefaultSetHuggingPriority(type, handlefield) uiDarwinControlDefaultSetHuggingPriority(type, handlefield) \
uiDarwinControlDefaultChildVisibilityChanged(type, handlefield)
#define uiDarwinControlAllDefaults(type, handlefield) \ #define uiDarwinControlAllDefaults(type, handlefield) \
uiDarwinControlDefaultDestroy(type, handlefield) \ uiDarwinControlDefaultDestroy(type, handlefield) \
@ -183,6 +193,7 @@ _UI_EXTERN void uiDarwinControlSetHuggingPriority(uiDarwinControl *, NSLayoutPri
uiDarwinControl(var)->ChildEdgeHuggingChanged = type ## ChildEdgeHuggingChanged; \ uiDarwinControl(var)->ChildEdgeHuggingChanged = type ## ChildEdgeHuggingChanged; \
uiDarwinControl(var)->HuggingPriority = type ## HuggingPriority; \ uiDarwinControl(var)->HuggingPriority = type ## HuggingPriority; \
uiDarwinControl(var)->SetHuggingPriority = type ## SetHuggingPriority; \ uiDarwinControl(var)->SetHuggingPriority = type ## SetHuggingPriority; \
uiDarwinControl(var)->ChildVisibilityChanged = type ## ChildVisibilityChanged; \
uiDarwinControl(var)->visible = YES; \ uiDarwinControl(var)->visible = YES; \
uiDarwinControl(var)->enabled = YES; uiDarwinControl(var)->enabled = YES;
// TODO document // TODO document
@ -199,6 +210,7 @@ _UI_EXTERN BOOL uiDarwinShouldStopSyncEnableState(uiDarwinControl *, BOOL);
// TODO document // TODO document
_UI_EXTERN void uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl *); _UI_EXTERN void uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl *);
_UI_EXTERN void uiDarwinNotifyVisibilityChanged(uiDarwinControl *c);
// TODO document // TODO document
// TODO document that values should not be cached // TODO document that values should not be cached