diff --git a/README.md b/README.md index 573e947a..beb1b553 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ This README is being written.
* **17 June 2016** * `uiMainSteps()` no longer takes any arguments and no longer needs to invoke a function to do the work. You still need to call it, but once you do, it will return immediately and you can then get right to your main loop. * **CMake 3.1.0 is now required.** This is due to CMake's rapid development pace in the past few years adding things libui needs to build on as many systems as possible. If your OS is supported by libui but its repositories ship with an older version of CMake, you will need to find an updated one somewhere. + * Added `uiNewVerticalSeparator()` to complement `uiNewHorizontalSeparator()`. * **16 June 2016** * Added `uiWindowContentSize()`, `uiWindowSetContentSize()`, and `uiWindowOnContentSizeChanged()` methods for manipulating uiWindow content sizes. Note the use of "content size"; the size you work with does NOT include window decorations (titlebars, menus, etc.). diff --git a/darwin/separator.m b/darwin/separator.m index fa82aa46..a37a376e 100644 --- a/darwin/separator.m +++ b/darwin/separator.m @@ -3,6 +3,7 @@ // TODO make this intrinsic #define separatorWidth 96 +#define separatorHeight 96 struct uiSeparator { uiDarwinControl c; @@ -26,3 +27,19 @@ uiSeparator *uiNewHorizontalSeparator(void) return s; } + +uiSeparator *uiNewVerticalSeparator(void) +{ + uiSeparator *s; + + uiDarwinNewControl(uiSeparator, s); + + // make the initial height >= initial width to force vertical + s->box = [[NSBox alloc] initWithFrame:NSMakeRect(0, 0, 1, 100)]; + [s->box setBoxType:NSBoxSeparator]; + [s->box setBorderType:NSGrooveBorder]; + [s->box setTransparent:NO]; + [s->box setTitlePosition:NSNoTitle]; + + return s; +} diff --git a/examples/controlgallery/main.c b/examples/controlgallery/main.c index fd9c8ea5..ad22c585 100644 --- a/examples/controlgallery/main.c +++ b/examples/controlgallery/main.c @@ -216,6 +216,10 @@ static uiControl *makeDataChoosersPage(void) uiControl(uiNewColorButton()), 0); + uiBoxAppend(hbox, + uiControl(uiNewVerticalSeparator()), + 0); + vbox = uiNewVerticalBox(); uiBoxSetPadded(vbox, 1); uiBoxAppend(hbox, uiControl(vbox), 1); diff --git a/test/page13.c b/test/page13.c index cda91ce7..5e6fd52c 100644 --- a/test/page13.c +++ b/test/page13.c @@ -47,6 +47,7 @@ static void openTestWindow(uiBox *(*mkf)(void)) BA(uiNewColorButton()); BA(uiNewPasswordEntry()); BA(uiNewSearchEntry()); + BA(uiNewVerticalSeparator()); uiControlShow(uiControl(w)); } diff --git a/test/page15.c b/test/page15.c index 50cf155a..7dd078c7 100644 --- a/test/page15.c +++ b/test/page15.c @@ -148,5 +148,10 @@ uiBox *makePage15(uiWindow *w) uiCheckboxOnToggled(checkbox, borderless, w); uiBoxAppend(page15, uiControl(checkbox), 0); + hbox = newHorizontalBox(); + uiBoxAppend(page15, uiControl(hbox), 1); + + uiBoxAppend(hbox, uiControl(uiNewVerticalSeparator()), 0); + return page15; } diff --git a/ui.h b/ui.h index 7012dc16..036a89c1 100644 --- a/ui.h +++ b/ui.h @@ -206,6 +206,7 @@ _UI_EXTERN uiProgressBar *uiNewProgressBar(void); typedef struct uiSeparator uiSeparator; #define uiSeparator(this) ((uiSeparator *) (this)) _UI_EXTERN uiSeparator *uiNewHorizontalSeparator(void); +_UI_EXTERN uiSeparator *uiNewVerticalSeparator(void); typedef struct uiCombobox uiCombobox; #define uiCombobox(this) ((uiCombobox *) (this)) diff --git a/unix/separator.c b/unix/separator.c index 63217b72..02c75da5 100644 --- a/unix/separator.c +++ b/unix/separator.c @@ -20,3 +20,15 @@ uiSeparator *uiNewHorizontalSeparator(void) return s; } + +uiSeparator *uiNewVerticalSeparator(void) +{ + uiSeparator *s; + + uiUnixNewControl(uiSeparator, s); + + s->widget = gtk_separator_new(GTK_ORIENTATION_VERTICAL); + s->separator = GTK_SEPARATOR(s->widget); + + return s; +} diff --git a/windows/separator.cpp b/windows/separator.cpp index 7c15a6d8..e123e275 100644 --- a/windows/separator.cpp +++ b/windows/separator.cpp @@ -8,6 +8,7 @@ struct uiSeparator { uiWindowsControl c; HWND hwnd; + BOOL vertical; }; uiWindowsControlAllDefaults(uiSeparator) @@ -15,17 +16,25 @@ uiWindowsControlAllDefaults(uiSeparator) // via https://msdn.microsoft.com/en-us/library/windows/desktop/bb226818%28v=vs.85%29.aspx #define separatorHeight 1 +// TODO +#define separatorWidth 1 + static void uiSeparatorMinimumSize(uiWindowsControl *c, int *width, int *height) { uiSeparator *s = uiSeparator(c); uiWindowsSizing sizing; - int y; + int x, y; *width = 1; // TODO + *height = 1; + x = separatorWidth; y = separatorHeight; uiWindowsGetSizing(s->hwnd, &sizing); - uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &y); - *height = y; + uiWindowsSizingDlgUnitsToPixels(&sizing, &x, &y); + if (s->vertical) + *width = x; + else + *height = y; } uiSeparator *uiNewHorizontalSeparator(void) @@ -42,3 +51,19 @@ uiSeparator *uiNewHorizontalSeparator(void) return s; } + +uiSeparator *uiNewVerticalSeparator(void) +{ + uiSeparator *s; + + uiWindowsNewControl(uiSeparator, s); + + s->hwnd = uiWindowsEnsureCreateControlHWND(0, + L"static", L"", + SS_ETCHEDHORZ, + hInstance, NULL, + TRUE); + s->vertical = TRUE; + + return s; +}