diff options
Diffstat (limited to 'src/libui_sdl/libui')
-rw-r--r-- | src/libui_sdl/libui/common/control.c | 3 | ||||
-rw-r--r-- | src/libui_sdl/libui/ui.h | 1 | ||||
-rw-r--r-- | src/libui_sdl/libui/ui_unix.h | 7 | ||||
-rw-r--r-- | src/libui_sdl/libui/ui_windows.h | 6 | ||||
-rw-r--r-- | src/libui_sdl/libui/unix/button.c | 2 | ||||
-rw-r--r-- | src/libui_sdl/libui/unix/window.c | 75 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/box.cpp | 9 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/button.cpp | 3 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/colordialog.cpp | 1 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/form.cpp | 6 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/grid.cpp | 6 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/group.cpp | 6 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/tab.cpp | 6 | ||||
-rw-r--r-- | src/libui_sdl/libui/windows/window.cpp | 5 |
14 files changed, 126 insertions, 10 deletions
diff --git a/src/libui_sdl/libui/common/control.c b/src/libui_sdl/libui/common/control.c index f811728..78d1e5f 100644 --- a/src/libui_sdl/libui/common/control.c +++ b/src/libui_sdl/libui/common/control.c @@ -66,8 +66,7 @@ void uiControlSetMinSize(uiControl *c, int w, int h) { c->MinWidth = w; c->MinHeight = h; - - // TODO: resize if needed + (*(c->SetMinSize))(c, w, h); } #define uiControlSignature 0x7569436F diff --git a/src/libui_sdl/libui/ui.h b/src/libui_sdl/libui/ui.h index e78de5e..6e51d44 100644 --- a/src/libui_sdl/libui/ui.h +++ b/src/libui_sdl/libui/ui.h @@ -73,6 +73,7 @@ struct uiControl { void (*Enable)(uiControl *); void (*Disable)(uiControl *); void (*SetFocus)(uiControl *); + void (*SetMinSize)(uiControl*, int, int); int MinWidth, MinHeight; }; diff --git a/src/libui_sdl/libui/ui_unix.h b/src/libui_sdl/libui/ui_unix.h index 23bd538..fac44bc 100644 --- a/src/libui_sdl/libui/ui_unix.h +++ b/src/libui_sdl/libui/ui_unix.h @@ -85,6 +85,11 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool { \ 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) \ @@ -112,6 +117,7 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool uiUnixControlDefaultEnable(type) \ uiUnixControlDefaultDisable(type) \ uiUnixControlDefaultSetFocus(type) \ + uiUnixControlDefaultSetMinSize(type) \ uiUnixControlDefaultSetContainer(type) #define uiUnixControlAllDefaults(type) \ @@ -133,6 +139,7 @@ _UI_EXTERN void uiUnixControlSetContainer(uiUnixControl *, GtkContainer *, gbool 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); diff --git a/src/libui_sdl/libui/ui_windows.h b/src/libui_sdl/libui/ui_windows.h index 3917c97..85c3137 100644 --- a/src/libui_sdl/libui/ui_windows.h +++ b/src/libui_sdl/libui/ui_windows.h @@ -107,6 +107,10 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); { \ 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) \ { \ @@ -158,6 +162,7 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); uiWindowsControlDefaultEnable(type) \ uiWindowsControlDefaultDisable(type) \ uiWindowsControlDefaultSetFocus(type) \ + uiWindowsControlDefaultSetMinSize(type) \ uiWindowsControlDefaultSyncEnableState(type) \ uiWindowsControlDefaultSetParentHWND(type) \ uiWindowsControlDefaultMinimumSizeChanged(type) \ @@ -184,6 +189,7 @@ _UI_EXTERN void uiWindowsControlChildVisibilityChanged(uiWindowsControl *); 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; \ diff --git a/src/libui_sdl/libui/unix/button.c b/src/libui_sdl/libui/unix/button.c index 00a87f4..b0500e3 100644 --- a/src/libui_sdl/libui/unix/button.c +++ b/src/libui_sdl/libui/unix/button.c @@ -50,6 +50,8 @@ 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; } diff --git a/src/libui_sdl/libui/unix/window.c b/src/libui_sdl/libui/unix/window.c index a908f88..a3dde76 100644 --- a/src/libui_sdl/libui/unix/window.c +++ b/src/libui_sdl/libui/unix/window.c @@ -19,6 +19,8 @@ struct uiWindow { uiControl *child; int margined; + + int width, height; int (*onClosing)(uiWindow *, void *); void *onClosingData; @@ -127,6 +129,20 @@ static void uiWindowShow(uiControl *c) // 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 + int width = w->width; + int 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) @@ -134,6 +150,7 @@ uiUnixControlDefaultEnabled(uiWindow) uiUnixControlDefaultEnable(uiWindow) uiUnixControlDefaultDisable(uiWindow) uiUnixControlDefaultSetFocus(uiWindow) +uiUnixControlDefaultSetMinSize(uiWindow) // TODO? uiUnixControlDefaultSetContainer(uiWindow) @@ -269,9 +286,57 @@ void uiWindowSetMargined(uiWindow *w, int margined) setMargined(w->childHolderContainer, w->margined); } +static void onDragDataReceived(GtkWidget* widget, GdkDragContext* ctx, gint x, gint y, GtkSelectionData* data, guint info, guint time, gpointer userdata) +{ + uiWindow* w = (uiWindow*)userdata; + + if (gtk_selection_data_get_length(data) > 0 && gtk_selection_data_get_format(data) == 8) + { + gchar** files = gtk_selection_data_get_uris(data); + if (files != NULL && files[0] != NULL) + { + // TODO: multi file support? + + gboolean success = FALSE; + + gchar* file = g_filename_from_uri(files[0], NULL, NULL); + if (file) + { + if (w->onDropFile) + w->onDropFile(w, file, w->onDropFileData); + + success = TRUE; + g_free(file); + } + + + g_strfreev(files); + gtk_drag_finish(ctx, success, FALSE, time); + return; + } + + if (files != NULL) g_strfreev(files); + gtk_drag_finish(ctx, FALSE, FALSE, time); + } +} + void uiWindowSetDropTarget(uiWindow* w, int drop) { - printf("DRAG DROP TODO!!!!!\n"); + if (!drop) + { + gtk_drag_dest_unset(w->widget); + return; + } + + GtkTargetEntry entry; + entry.target = "text/uri-list"; + entry.flags = GTK_TARGET_OTHER_APP; + entry.info = 1; + + // CHECKME: action copy? + gtk_drag_dest_set(w->widget, GTK_DEST_DEFAULT_ALL, &entry, 1, GDK_ACTION_COPY|GDK_ACTION_MOVE); + + g_signal_connect(w->widget, "drag-data-received", G_CALLBACK(onDragDataReceived), w); } uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, int resizable) @@ -298,6 +363,8 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, w->menubar = makeMenubar(uiWindow(w)); gtk_container_add(w->vboxContainer, w->menubar); } + else + w->menubar = NULL; w->childHolderWidget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); w->childHolderContainer = GTK_CONTAINER(w->childHolderWidget); @@ -307,9 +374,6 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, gtk_widget_set_valign(w->childHolderWidget, GTK_ALIGN_FILL); gtk_box_set_homogeneous(GTK_BOX(w->childHolderWidget), TRUE); gtk_container_add(w->vboxContainer, w->childHolderWidget); - - // set client size proper - gtk_widget_set_size_request(w->childHolderWidget, width, height); // show everything in the vbox, but not the GtkWindow itself gtk_widget_show_all(w->vboxWidget); @@ -332,6 +396,9 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar, g_object_ref(w->widget); gtk_window_set_resizable(w->window, resizable?TRUE:FALSE); + + w->width = width; + w->height = height; return w; } diff --git a/src/libui_sdl/libui/windows/box.cpp b/src/libui_sdl/libui/windows/box.cpp index c306989..5ed8447 100644 --- a/src/libui_sdl/libui/windows/box.cpp +++ b/src/libui_sdl/libui/windows/box.cpp @@ -38,7 +38,6 @@ static void boxRelayout(uiBox *b) int i; int minimumWidth, minimumHeight; int nVisible; - uiWindowsSizing *d; if (b->controls->size() == 0) return; @@ -165,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; @@ -235,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) diff --git a/src/libui_sdl/libui/windows/button.cpp b/src/libui_sdl/libui/windows/button.cpp index 3b12e72..b83d6ec 100644 --- a/src/libui_sdl/libui/windows/button.cpp +++ b/src/libui_sdl/libui/windows/button.cpp @@ -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); diff --git a/src/libui_sdl/libui/windows/colordialog.cpp b/src/libui_sdl/libui/windows/colordialog.cpp index 2efe72c..9c2551a 100644 --- a/src/libui_sdl/libui/windows/colordialog.cpp +++ b/src/libui_sdl/libui/windows/colordialog.cpp @@ -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; diff --git a/src/libui_sdl/libui/windows/form.cpp b/src/libui_sdl/libui/windows/form.cpp index 83ed587..65ef539 100644 --- a/src/libui_sdl/libui/windows/form.cpp +++ b/src/libui_sdl/libui/windows/form.cpp @@ -232,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) diff --git a/src/libui_sdl/libui/windows/grid.cpp b/src/libui_sdl/libui/windows/grid.cpp index 78719ac..0a854c5 100644 --- a/src/libui_sdl/libui/windows/grid.cpp +++ b/src/libui_sdl/libui/windows/grid.cpp @@ -516,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) diff --git a/src/libui_sdl/libui/windows/group.cpp b/src/libui_sdl/libui/windows/group.cpp index f78e7de..9c36da1 100644 --- a/src/libui_sdl/libui/windows/group.cpp +++ b/src/libui_sdl/libui/windows/group.cpp @@ -119,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) diff --git a/src/libui_sdl/libui/windows/tab.cpp b/src/libui_sdl/libui/windows/tab.cpp index ea6209b..93373b0 100644 --- a/src/libui_sdl/libui/windows/tab.cpp +++ b/src/libui_sdl/libui/windows/tab.cpp @@ -164,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) diff --git a/src/libui_sdl/libui/windows/window.cpp b/src/libui_sdl/libui/windows/window.cpp index 44fb306..50a01c6 100644 --- a/src/libui_sdl/libui/windows/window.cpp +++ b/src/libui_sdl/libui/windows/window.cpp @@ -309,6 +309,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) |