This commit is contained in:
Mike Sinkovsky 2021-01-02 10:21:41 -05:00 committed by GitHub
commit 0730d94a1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 124 additions and 7 deletions

View File

@ -57,6 +57,18 @@ void uiControlDisable(uiControl *c)
(*(c->Disable))(c);
}
void uiControlSetFocus(uiControl *c)
{
(*(c->SetFocus))(c);
}
void uiControlSetMinSize(uiControl *c, int w, int h)
{
c->MinWidth = w;
c->MinHeight = h;
(*(c->SetMinSize))(c, w, h);
}
#define uiprivControlSignature 0x7569436F
uiControl *uiAllocControl(size_t size, uint32_t OSsig, uint32_t typesig, const char *typenamestr)
@ -67,6 +79,10 @@ uiControl *uiAllocControl(size_t size, uint32_t OSsig, uint32_t typesig, const c
c->Signature = uiprivControlSignature;
c->OSSignature = OSsig;
c->TypeSignature = typesig;
c->MinWidth = -1;
c->MinHeight = -1;
return c;
}

6
ui.h
View File

@ -91,6 +91,10 @@ struct uiControl {
int (*Enabled)(uiControl *);
void (*Enable)(uiControl *);
void (*Disable)(uiControl *);
void (*SetFocus)(uiControl *);
void (*SetMinSize)(uiControl*, int, int);
int MinWidth, MinHeight;
};
// TOOD add argument names to all arguments
#define uiControl(this) ((uiControl *) (this))
@ -105,6 +109,8 @@ _UI_EXTERN void uiControlHide(uiControl *);
_UI_EXTERN int uiControlEnabled(uiControl *);
_UI_EXTERN void uiControlEnable(uiControl *);
_UI_EXTERN void uiControlDisable(uiControl *);
_UI_EXTERN void uiControlSetFocus(uiControl *);
_UI_EXTERN void uiControlSetMinSize(uiControl *, int w, int h); // -1 = no minimum
_UI_EXTERN uiControl *uiAllocControl(size_t n, uint32_t OSsig, uint32_t typesig, const char *typenamestr);
_UI_EXTERN void uiFreeControl(uiControl *);

View File

@ -83,6 +83,16 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool
{ \
gtk_widget_set_sensitive(type(c)->widget, FALSE); \
}
#define uiUnixControlDefaultSetFocus(type) \
static void type ## SetFocus(uiControl *c) \
{ \
gtk_widget_grab_focus(type(c)->widget); \
}
#define uiUnixControlDefaultSetMinSize(type) \
static void type ## SetMinSize(uiControl *c, int w, int h) \
{ \
gtk_widget_set_size_request(type(c)->widget, w, h); \
}
// TODO this whole addedBefore stuff is a MASSIVE HACK.
#define uiUnixControlDefaultSetContainer(type) \
static void type ## SetContainer(uiUnixControl *c, GtkContainer *container, gboolean remove) \
@ -110,6 +120,8 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool
uiUnixControlDefaultEnabled(type) \
uiUnixControlDefaultEnable(type) \
uiUnixControlDefaultDisable(type) \
uiUnixControlDefaultSetFocus(type) \
uiUnixControlDefaultSetMinSize(type) \
uiUnixControlDefaultSetContainer(type)
#define uiUnixControlAllDefaults(type) \
@ -130,6 +142,8 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool
uiControl(var)->Enabled = type ## Enabled; \
uiControl(var)->Enable = type ## Enable; \
uiControl(var)->Disable = type ## Disable; \
uiControl(var)->SetFocus = type ## SetFocus; \
uiControl(var)->SetMinSize = type ## SetMinSize; \
uiUnixControl(var)->SetContainer = type ## SetContainer;
// TODO document
_UI_EXTERN uiUnixControl *uiUnixAllocControl(size_t n, uint32_t typesig, const char *typenamestr);

View File

@ -102,6 +102,15 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *);
uiWindowsControl(c)->enabled = 0; \
uiWindowsControlSyncEnableState(uiWindowsControl(c), uiControlEnabledToUser(c)); \
}
#define uiWindowsControlDefaultSetFocus(type) \
static void type ## SetFocus(uiControl *c) \
{ \
SetFocus(type(c)->hwnd); \
}
#define uiWindowsControlDefaultSetMinSize(type) \
static void type ## SetMinSize(uiControl *c, int w, int h) \
{ \
}
#define uiWindowsControlDefaultSyncEnableState(type) \
static void type ## SyncEnableState(uiWindowsControl *c, int enabled) \
{ \
@ -152,6 +161,8 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *);
uiWindowsControlDefaultEnabled(type) \
uiWindowsControlDefaultEnable(type) \
uiWindowsControlDefaultDisable(type) \
uiWindowsControlDefaultSetFocus(type) \
uiWindowsControlDefaultSetMinSize(type) \
uiWindowsControlDefaultSyncEnableState(type) \
uiWindowsControlDefaultSetParentHWND(type) \
uiWindowsControlDefaultMinimumSizeChanged(type) \
@ -177,6 +188,8 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *);
uiControl(var)->Enabled = type ## Enabled; \
uiControl(var)->Enable = type ## Enable; \
uiControl(var)->Disable = type ## Disable; \
uiControl(var)->SetFocus = type ## SetFocus; \
uiControl(var)->SetMinSize = type ## SetMinSize; \
uiWindowsControl(var)->SyncEnableState = type ## SyncEnableState; \
uiWindowsControl(var)->SetParentHWND = type ## SetParentHWND; \
uiWindowsControl(var)->MinimumSize = type ## MinimumSize; \

View File

@ -51,5 +51,7 @@ uiButton *uiNewButton(const char *text)
g_signal_connect(b->widget, "clicked", G_CALLBACK(onClicked), b);
uiButtonOnClicked(b, defaultOnClicked, NULL);
gtk_widget_set_size_request(b->widget, 64, 1);
return b;
}

View File

@ -20,6 +20,9 @@ struct uiWindow {
uiControl *child;
int margined;
int width;
int height;
int (*onClosing)(uiWindow *, void *);
void *onClosingData;
void (*onContentSizeChanged)(uiWindow *, void *);
@ -101,17 +104,36 @@ uiUnixControlDefaultVisible(uiWindow)
static void uiWindowShow(uiControl *c)
{
uiWindow *w = uiWindow(c);
int width;
int height;
// don't use gtk_widget_show_all() as that will show all children, regardless of user settings
// don't use gtk_widget_show(); that doesn't bring to front or give keyboard focus
// (gtk_window_present() does call gtk_widget_show() though)
gtk_window_present(w->window);
// set the size properly
width = w->width;
height = w->height;
if (w->menubar) {
GtkRequisition min, nat;
int menuheight;
gtk_widget_get_preferred_size(w->menubar, &min, &nat);
menuheight = min.height;
if (nat.height > menuheight)
menuheight = nat.height;
height += menuheight;
}
gtk_window_resize(w->window, width, height);
}
uiUnixControlDefaultHide(uiWindow)
uiUnixControlDefaultEnabled(uiWindow)
uiUnixControlDefaultEnable(uiWindow)
uiUnixControlDefaultDisable(uiWindow)
uiUnixControlDefaultSetFocus(uiWindow)
uiUnixControlDefaultSetMinSize(uiWindow)
// TODO?
uiUnixControlDefaultSetContainer(uiWindow)
@ -252,6 +274,8 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
if (hasMenubar) {
w->menubar = uiprivMakeMenubar(uiWindow(w));
gtk_container_add(w->vboxContainer, w->menubar);
} else {
w->menubar = NULL;
}
w->childHolderWidget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);

View File

@ -55,9 +55,11 @@ uiWindowsControlAllDefaults(uiArea)
static void uiAreaMinimumSize(uiWindowsControl *c, int *width, int *height)
{
// TODO
*width = 0;
*height = 0;
*width = c->c.MinWidth;
if (*width < 1) *width = 1;
*height = c->c.MinHeight;
if (*height < 1) *height = 1;
}
ATOM registerAreaClass(HICON hDefaultIcon, HCURSOR hDefaultCursor)

View File

@ -38,7 +38,6 @@ static void boxRelayout(uiBox *b)
int i;
int minimumWidth, minimumHeight;
int nVisible;
uiWindowsSizing *d;
if (b->controls->size() == 0)
return;
@ -143,6 +142,7 @@ uiWindowsControlDefaultHide(uiBox)
uiWindowsControlDefaultEnabled(uiBox)
uiWindowsControlDefaultEnable(uiBox)
uiWindowsControlDefaultDisable(uiBox)
uiWindowsControlDefaultSetFocus(uiBox)
static void uiBoxSyncEnableState(uiWindowsControl *c, int enabled)
{
@ -164,10 +164,8 @@ static void uiBoxMinimumSize(uiWindowsControl *c, int *width, int *height)
// these two contain the largest minimum width and height of all stretchy controls in the box
// all stretchy controls will use this value to determine the final minimum size
int maxStretchyWidth, maxStretchyHeight;
int i;
int minimumWidth, minimumHeight;
int nVisible;
uiWindowsSizing sizing;
*width = 0;
*height = 0;
@ -234,6 +232,12 @@ static void uiBoxMinimumSizeChanged(uiWindowsControl *c)
boxRelayout(b);
}
static void uiBoxSetMinSize(uiControl *c, int w, int h)
{
// checkme
uiBoxMinimumSizeChanged(uiWindowsControl(c));
}
uiWindowsControlDefaultLayoutRect(uiBox)
uiWindowsControlDefaultAssignControlIDZOrder(uiBox)

View File

@ -32,6 +32,7 @@ uiWindowsControlAllDefaultsExceptDestroy(uiButton)
// from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing
#define buttonHeight 14
#define buttonMinWidth 64
static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height)
{
@ -45,6 +46,7 @@ static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height)
size.cy = 0;
if (SendMessageW(b->hwnd, BCM_GETIDEALSIZE, 0, (LPARAM) (&size)) != FALSE) {
*width = size.cx;
if (*width < buttonMinWidth) *width = buttonMinWidth;
*height = size.cy;
return;
}
@ -53,6 +55,7 @@ static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height)
// Microsoft says to use a fixed width for all buttons; this isn't good enough
// use the text width instead, with some edge padding
*width = uiWindowsWindowTextWidth(b->hwnd) + (2 * GetSystemMetrics(SM_CXEDGE));
if (*width < buttonMinWidth) *width = buttonMinWidth;
y = buttonHeight;
uiWindowsGetSizing(b->hwnd, &sizing);
uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &y);

View File

@ -87,7 +87,6 @@ static void hsv2RGB(double h, double s, double v, double *r, double *g, double *
int h60;
double x;
double m;
double c1, c2;
c = v * s;
hPrime = h * 6;

View File

@ -147,6 +147,7 @@ uiWindowsControlDefaultHide(uiForm)
uiWindowsControlDefaultEnabled(uiForm)
uiWindowsControlDefaultEnable(uiForm)
uiWindowsControlDefaultDisable(uiForm)
uiWindowsControlDefaultSetFocus(uiForm)
static void uiFormSyncEnableState(uiWindowsControl *c, int enabled)
{
@ -231,6 +232,12 @@ static void uiFormMinimumSizeChanged(uiWindowsControl *c)
formRelayout(f);
}
static void uiFormSetMinSize(uiControl *c, int w, int h)
{
// checkme
uiFormMinimumSizeChanged(uiWindowsControl(c));
}
uiWindowsControlDefaultLayoutRect(uiForm)
uiWindowsControlDefaultAssignControlIDZOrder(uiForm)

View File

@ -436,6 +436,7 @@ uiWindowsControlDefaultHide(uiGrid)
uiWindowsControlDefaultEnabled(uiGrid)
uiWindowsControlDefaultEnable(uiGrid)
uiWindowsControlDefaultDisable(uiGrid)
uiWindowsControlDefaultSetFocus(uiGrid)
static void uiGridSyncEnableState(uiWindowsControl *c, int enabled)
{
@ -515,6 +516,12 @@ static void uiGridMinimumSizeChanged(uiWindowsControl *c)
gridRelayout(g);
}
static void uiGridSetMinSize(uiControl *c, int w, int h)
{
// checkme
uiGridMinimumSizeChanged(uiWindowsControl(c));
}
uiWindowsControlDefaultLayoutRect(uiGrid)
uiWindowsControlDefaultAssignControlIDZOrder(uiGrid)

View File

@ -75,6 +75,7 @@ uiWindowsControlDefaultHide(uiGroup)
uiWindowsControlDefaultEnabled(uiGroup)
uiWindowsControlDefaultEnable(uiGroup)
uiWindowsControlDefaultDisable(uiGroup)
uiWindowsControlDefaultSetFocus(uiGroup)
static void uiGroupSyncEnableState(uiWindowsControl *c, int enabled)
{
@ -118,6 +119,12 @@ static void uiGroupMinimumSizeChanged(uiWindowsControl *c)
groupRelayout(g);
}
static void uiGroupSetMinSize(uiControl *c, int w, int h)
{
// checkme
uiGroupMinimumSizeChanged(uiWindowsControl(c));
}
uiWindowsControlDefaultLayoutRect(uiGroup)
uiWindowsControlDefaultAssignControlIDZOrder(uiGroup)

View File

@ -112,6 +112,7 @@ uiWindowsControlDefaultHide(uiTab)
uiWindowsControlDefaultEnabled(uiTab)
uiWindowsControlDefaultEnable(uiTab)
uiWindowsControlDefaultDisable(uiTab)
uiWindowsControlDefaultSetFocus(uiTab)
static void uiTabSyncEnableState(uiWindowsControl *c, int enabled)
{
@ -163,6 +164,12 @@ static void uiTabMinimumSizeChanged(uiWindowsControl *c)
tabRelayout(t);
}
static void uiTabSetMinSize(uiControl *c, int w, int h)
{
// checkme
uiTabMinimumSizeChanged(uiWindowsControl(c));
}
uiWindowsControlDefaultLayoutRect(uiTab)
uiWindowsControlDefaultAssignControlIDZOrder(uiTab)

View File

@ -232,6 +232,7 @@ static void uiWindowHide(uiControl *c)
uiWindowsControlDefaultEnabled(uiWindow)
uiWindowsControlDefaultEnable(uiWindow)
uiWindowsControlDefaultDisable(uiWindow)
uiWindowsControlDefaultSetFocus(uiWindow)
// TODO we need to do something about undocumented fields in the OS control types
uiWindowsControlDefaultSyncEnableState(uiWindow)
// TODO
@ -273,6 +274,11 @@ static void uiWindowLayoutRect(uiWindowsControl *c, RECT *r)
uiWindowsEnsureGetClientRect(w->hwnd, r);
}
static void uiWindowSetMinSize(uiControl *c, int w, int h)
{
// TODO: relayout, eventually
}
uiWindowsControlDefaultAssignControlIDZOrder(uiWindow)
static void uiWindowChildVisibilityChanged(uiWindowsControl *c)