Merge pull request #2 from RustamGamidov/resize-button
button: add uiButtonSetMinSize to avoid very small buttons
This commit is contained in:
commit
7e671da5d0
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef H_COMMON_GENERAL
|
||||||
|
#define H_COMMON_GENERAL
|
||||||
|
|
||||||
|
int max(int first, int second)
|
||||||
|
{
|
||||||
|
return (first < second) ? second : first;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,5 +1,36 @@
|
||||||
// 13 august 2015
|
// 13 august 2015
|
||||||
#import "uipriv_darwin.h"
|
#import "uipriv_darwin.h"
|
||||||
|
#import "../common/general.h"
|
||||||
|
|
||||||
|
@interface libui_NSButton : NSButton
|
||||||
|
@property int minWidth;
|
||||||
|
@property int minHeight;
|
||||||
|
- (id)initWithFrame:(NSRect)frameRect;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation libui_NSButton
|
||||||
|
|
||||||
|
- (id)initWithFrame:(NSRect)frameRect
|
||||||
|
{
|
||||||
|
self = [super initWithFrame: frameRect];
|
||||||
|
if (self) {
|
||||||
|
self.minHeight = -1;
|
||||||
|
self.minWidth = -1;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSSize)intrinsicContentSize
|
||||||
|
{
|
||||||
|
NSSize s;
|
||||||
|
|
||||||
|
s = [super intrinsicContentSize];
|
||||||
|
s.width = max(self.minWidth, s.width);
|
||||||
|
s.height = max(self.minHeight, s.height);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
struct uiButton {
|
struct uiButton {
|
||||||
uiDarwinControl c;
|
uiDarwinControl c;
|
||||||
|
@ -78,6 +109,20 @@ void uiButtonSetText(uiButton *b, const char *text)
|
||||||
[b->button setTitle:uiprivToNSString(text)];
|
[b->button setTitle:uiprivToNSString(text)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uiButtonSetMinSize(uiButton *b, int width, int height)
|
||||||
|
{
|
||||||
|
libui_NSButton *libui_btn = (libui_NSButton *)b->button;
|
||||||
|
libui_btn.minWidth = width;
|
||||||
|
libui_btn.minHeight = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiButtonPreferredSize(uiButton *b, int *width, int *height)
|
||||||
|
{
|
||||||
|
NSSize s = b->button.intrinsicContentSize;
|
||||||
|
*width = s.width;
|
||||||
|
*height = s.height;
|
||||||
|
}
|
||||||
|
|
||||||
void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
|
void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
|
||||||
{
|
{
|
||||||
b->onClicked = f;
|
b->onClicked = f;
|
||||||
|
@ -95,7 +140,7 @@ uiButton *uiNewButton(const char *text)
|
||||||
|
|
||||||
uiDarwinNewControl(uiButton, b);
|
uiDarwinNewControl(uiButton, b);
|
||||||
|
|
||||||
b->button = [[NSButton alloc] initWithFrame:NSZeroRect];
|
b->button = [[libui_NSButton alloc] initWithFrame:NSZeroRect];
|
||||||
[b->button setTitle:uiprivToNSString(text)];
|
[b->button setTitle:uiprivToNSString(text)];
|
||||||
[b->button setButtonType:NSMomentaryPushInButton];
|
[b->button setButtonType:NSMomentaryPushInButton];
|
||||||
[b->button setBordered:YES];
|
[b->button setBordered:YES];
|
||||||
|
|
|
@ -37,6 +37,11 @@ static uiControl *makeBasicControlsPage(void)
|
||||||
uiBoxAppend(hbox,
|
uiBoxAppend(hbox,
|
||||||
uiControl(uiNewCheckbox("Checkbox")),
|
uiControl(uiNewCheckbox("Checkbox")),
|
||||||
0);
|
0);
|
||||||
|
uiButton *btn = uiNewButton("Wide");
|
||||||
|
uiButtonSetMinSize(btn, 150, -1);
|
||||||
|
uiBoxAppend(hbox,
|
||||||
|
uiControl(btn),
|
||||||
|
0);
|
||||||
|
|
||||||
uiBoxAppend(vbox,
|
uiBoxAppend(vbox,
|
||||||
uiControl(uiNewLabel("This is a label. Right now, labels can only span one line.")),
|
uiControl(uiNewLabel("This is a label. Right now, labels can only span one line.")),
|
||||||
|
|
2
ui.h
2
ui.h
|
@ -144,6 +144,8 @@ _UI_EXTERN char *uiButtonText(uiButton *b);
|
||||||
_UI_EXTERN void uiButtonSetText(uiButton *b, const char *text);
|
_UI_EXTERN void uiButtonSetText(uiButton *b, const char *text);
|
||||||
_UI_EXTERN void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *b, void *data), void *data);
|
_UI_EXTERN void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *b, void *data), void *data);
|
||||||
_UI_EXTERN uiButton *uiNewButton(const char *text);
|
_UI_EXTERN uiButton *uiNewButton(const char *text);
|
||||||
|
_UI_EXTERN void uiButtonSetMinSize(uiButton *b, int width, int height);
|
||||||
|
_UI_EXTERN void uiButtonPreferredSize(uiButton *b, int *width, int *height);
|
||||||
|
|
||||||
typedef struct uiBox uiBox;
|
typedef struct uiBox uiBox;
|
||||||
#define uiBox(this) ((uiBox *) (this))
|
#define uiBox(this) ((uiBox *) (this))
|
||||||
|
|
|
@ -33,6 +33,18 @@ void uiButtonSetText(uiButton *b, const char *text)
|
||||||
gtk_button_set_label(b->button, text);
|
gtk_button_set_label(b->button, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uiButtonSetMinSize(uiButton *b, int width, int height)
|
||||||
|
{
|
||||||
|
gtk_widget_set_size_request(b->widget, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiButtonPreferredSize(uiButton *b, int *width, int *height)
|
||||||
|
{
|
||||||
|
gtk_widget_show(b->widget);
|
||||||
|
gtk_widget_get_preferred_height(b->widget, NULL, height);
|
||||||
|
gtk_widget_get_preferred_width(b->widget, NULL, width);
|
||||||
|
}
|
||||||
|
|
||||||
void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
|
void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
|
||||||
{
|
{
|
||||||
b->onClicked = f;
|
b->onClicked = f;
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
// 7 april 2015
|
// 7 april 2015
|
||||||
#include "uipriv_windows.hpp"
|
#include "uipriv_windows.hpp"
|
||||||
|
#include "../common/general.h"
|
||||||
|
|
||||||
struct uiButton {
|
struct uiButton {
|
||||||
uiWindowsControl c;
|
uiWindowsControl c;
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
void (*onClicked)(uiButton *, void *);
|
void (*onClicked)(uiButton *, void *);
|
||||||
void *onClickedData;
|
void *onClickedData;
|
||||||
|
int minHeight;
|
||||||
|
int minWidth;
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL onWM_COMMAND(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult)
|
static BOOL onWM_COMMAND(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult)
|
||||||
|
@ -44,8 +47,8 @@ static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height)
|
||||||
size.cx = 0; // explicitly ask for ideal size
|
size.cx = 0; // explicitly ask for ideal size
|
||||||
size.cy = 0;
|
size.cy = 0;
|
||||||
if (SendMessageW(b->hwnd, BCM_GETIDEALSIZE, 0, (LPARAM) (&size)) != FALSE) {
|
if (SendMessageW(b->hwnd, BCM_GETIDEALSIZE, 0, (LPARAM) (&size)) != FALSE) {
|
||||||
*width = size.cx;
|
*width = max(size.cx, (LONG)(b->minWidth));
|
||||||
*height = size.cy;
|
*height = max(size.cy, (LONG)(b->minHeight));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +60,9 @@ static void uiButtonMinimumSize(uiWindowsControl *c, int *width, int *height)
|
||||||
uiWindowsGetSizing(b->hwnd, &sizing);
|
uiWindowsGetSizing(b->hwnd, &sizing);
|
||||||
uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &y);
|
uiWindowsSizingDlgUnitsToPixels(&sizing, NULL, &y);
|
||||||
*height = y;
|
*height = y;
|
||||||
|
|
||||||
|
*width = max(*width, b->minWidth);
|
||||||
|
*height = max(y, b->minHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void defaultOnClicked(uiButton *b, void *data)
|
static void defaultOnClicked(uiButton *b, void *data)
|
||||||
|
@ -76,6 +82,18 @@ void uiButtonSetText(uiButton *b, const char *text)
|
||||||
uiWindowsControlMinimumSizeChanged(uiWindowsControl(b));
|
uiWindowsControlMinimumSizeChanged(uiWindowsControl(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uiButtonSetMinSize(uiButton *b, int width, int height)
|
||||||
|
{
|
||||||
|
b->minHeight = height;
|
||||||
|
b->minWidth = width;
|
||||||
|
uiWindowsControlMinimumSizeChanged(uiWindowsControl(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiButtonPreferredSize(uiButton *b, int *width, int *height)
|
||||||
|
{
|
||||||
|
uiButtonMinimumSize(uiWindowsControl(b), width, height);
|
||||||
|
}
|
||||||
|
|
||||||
void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
|
void uiButtonOnClicked(uiButton *b, void (*f)(uiButton *, void *), void *data)
|
||||||
{
|
{
|
||||||
b->onClicked = f;
|
b->onClicked = f;
|
||||||
|
@ -88,6 +106,8 @@ uiButton *uiNewButton(const char *text)
|
||||||
WCHAR *wtext;
|
WCHAR *wtext;
|
||||||
|
|
||||||
uiWindowsNewControl(uiButton, b);
|
uiWindowsNewControl(uiButton, b);
|
||||||
|
b->minHeight = -1;
|
||||||
|
b->minWidth = -1;
|
||||||
|
|
||||||
wtext = toUTF16(text);
|
wtext = toUTF16(text);
|
||||||
b->hwnd = uiWindowsEnsureCreateControlHWND(0,
|
b->hwnd = uiWindowsEnsureCreateControlHWND(0,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// 21 april 2016
|
// 21 april 2016
|
||||||
|
#define NOMINMAX
|
||||||
#include "winapi.hpp"
|
#include "winapi.hpp"
|
||||||
#include "../ui.h"
|
#include "../ui.h"
|
||||||
#include "../ui_windows.h"
|
#include "../ui_windows.h"
|
||||||
|
|
Loading…
Reference in New Issue