mirror of
https://github.com/Kapendev/parin.git
synced 2025-04-27 05:29:53 +03:00
Overlapping ui items work now.
This commit is contained in:
parent
2603bf6d76
commit
a24b98b26f
3 changed files with 41 additions and 12 deletions
|
@ -15,11 +15,11 @@ bool update(float dt) {
|
||||||
// Set the margin between subsequent UI items.
|
// Set the margin between subsequent UI items.
|
||||||
setUiMargin(2);
|
setUiMargin(2);
|
||||||
setUiStartPoint(Vec2(8));
|
setUiStartPoint(Vec2(8));
|
||||||
// Create a layout for arranging subsequent UI items.
|
// Create a horizontal layout for arranging subsequent UI items.
|
||||||
useUiLayout(Layout.h);
|
useUiLayout(Layout.h);
|
||||||
uiText(textSize, "Cool Button", UiButtonOptions(Alignment.left));
|
uiText(textSize, "Cool Button", UiButtonOptions(Alignment.left));
|
||||||
if (uiButton(buttonSize, "")) println("Cool");
|
if (uiButton(buttonSize, "")) println("Cool");
|
||||||
// Create a new layout under the previous layout.
|
// Create a new horizontal layout under the previous layout.
|
||||||
useUiLayout(Layout.h);
|
useUiLayout(Layout.h);
|
||||||
uiText(textSize, "Super Button", UiButtonOptions(Alignment.left));
|
uiText(textSize, "Super Button", UiButtonOptions(Alignment.left));
|
||||||
if (uiButton(buttonSize, "")) println("Super");
|
if (uiButton(buttonSize, "")) println("Super");
|
||||||
|
|
|
@ -2335,7 +2335,7 @@ void drawText(Font font, IStr text, Vec2 position, DrawOptions options = DrawOpt
|
||||||
textOffsetY += font.lineSpacing;
|
textOffsetY += font.lineSpacing;
|
||||||
codepointIndex += 1; // Adding the new line.
|
codepointIndex += 1; // Adding the new line.
|
||||||
}
|
}
|
||||||
codepointIndex -= text[$ - 1] != '\n'; // Removing one extra new line.
|
// codepointIndex -= text[$ - 1] != '\n'; // Removing one extra new line.
|
||||||
rl.rlPopMatrix();
|
rl.rlPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,7 @@
|
||||||
// Version: v0.0.29
|
// Version: v0.0.29
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
// TODO: Think about overlapping UI items.
|
// TODO: Think about theming and other ui item types.
|
||||||
// TODO: Add way to get item point for some stuff. This is nice when making lists.
|
|
||||||
|
|
||||||
/// The `ui` module functions as a immediate mode UI library.
|
/// The `ui` module functions as a immediate mode UI library.
|
||||||
module parin.ui;
|
module parin.ui;
|
||||||
|
@ -73,8 +72,10 @@ struct UiState {
|
||||||
Vec2 viewportPoint;
|
Vec2 viewportPoint;
|
||||||
Vec2 viewportSize;
|
Vec2 viewportSize;
|
||||||
Vec2 viewportScale = Vec2(1.0f);
|
Vec2 viewportScale = Vec2(1.0f);
|
||||||
|
|
||||||
Vec2 startPoint;
|
Vec2 startPoint;
|
||||||
short margin;
|
short margin;
|
||||||
|
|
||||||
Layout layout;
|
Layout layout;
|
||||||
Vec2 layoutStartPoint;
|
Vec2 layoutStartPoint;
|
||||||
Vec2 layoutStartPointOffest;
|
Vec2 layoutStartPointOffest;
|
||||||
|
@ -90,22 +91,27 @@ struct UiState {
|
||||||
short clickedItemId;
|
short clickedItemId;
|
||||||
short draggedItemId;
|
short draggedItemId;
|
||||||
short focusedItemId;
|
short focusedItemId;
|
||||||
|
short previousMaxHotItemId;
|
||||||
|
short previousMaxHotItemIdBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepareUi() {
|
void prepareUi() {
|
||||||
setUiViewportState(Vec2(), resolution, Vec2(1.0f));
|
setUiViewportState(Vec2(), resolution, Vec2(1.0f));
|
||||||
uiState.startPoint = Vec2();
|
uiState.startPoint = Vec2();
|
||||||
uiState.margin = 0;
|
uiState.margin = 0;
|
||||||
|
|
||||||
uiState.layout = Layout.v;
|
uiState.layout = Layout.v;
|
||||||
uiState.layoutStartPoint = Vec2();
|
uiState.layoutStartPoint = Vec2();
|
||||||
uiState.layoutStartPointOffest = Vec2();
|
uiState.layoutStartPointOffest = Vec2();
|
||||||
uiState.layoutMaxItemSize = Vec2();
|
uiState.layoutMaxItemSize = Vec2();
|
||||||
|
|
||||||
uiState.itemPoint = Vec2();
|
uiState.itemPoint = Vec2();
|
||||||
uiState.itemSize = Vec2();
|
uiState.itemSize = Vec2();
|
||||||
uiState.itemId = 0;
|
uiState.itemId = 0;
|
||||||
uiState.hotItemId = 0;
|
uiState.hotItemId = 0;
|
||||||
uiState.activeItemId = 0;
|
uiState.activeItemId = 0;
|
||||||
uiState.clickedItemId = 0;
|
uiState.clickedItemId = 0;
|
||||||
|
uiState.previousMaxHotItemId = uiState.previousMaxHotItemIdBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 uiMouse() {
|
Vec2 uiMouse() {
|
||||||
|
@ -141,7 +147,6 @@ void setUiViewportState(Vec2 point, Vec2 size, Vec2 scale) {
|
||||||
uiState.viewportPoint = point;
|
uiState.viewportPoint = point;
|
||||||
uiState.viewportSize = size;
|
uiState.viewportSize = size;
|
||||||
uiState.viewportScale = scale;
|
uiState.viewportScale = scale;
|
||||||
|
|
||||||
if (uiState.mouseClickAction.isPressed) {
|
if (uiState.mouseClickAction.isPressed) {
|
||||||
uiState.mousePressedPoint = uiMouse;
|
uiState.mousePressedPoint = uiMouse;
|
||||||
}
|
}
|
||||||
|
@ -152,8 +157,8 @@ Vec2 uiStartPoint() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void setUiStartPoint(Vec2 value) {
|
void setUiStartPoint(Vec2 value) {
|
||||||
uiState.itemSize = Vec2();
|
|
||||||
uiState.startPoint = value;
|
uiState.startPoint = value;
|
||||||
|
uiState.itemSize = Vec2();
|
||||||
uiState.layoutStartPoint = value;
|
uiState.layoutStartPoint = value;
|
||||||
uiState.layoutStartPointOffest = Vec2();
|
uiState.layoutStartPointOffest = Vec2();
|
||||||
uiState.layoutMaxItemSize = Vec2();
|
uiState.layoutMaxItemSize = Vec2();
|
||||||
|
@ -194,6 +199,14 @@ void useUiLayout(Layout value) {
|
||||||
uiState.layout = value;
|
uiState.layout = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec2 uiLayoutStartPoint() {
|
||||||
|
return uiState.layoutStartPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2 uiLayoutPoint() {
|
||||||
|
return uiState.layoutStartPoint + uiState.layoutStartPointOffest;
|
||||||
|
}
|
||||||
|
|
||||||
bool isUiItemHot() {
|
bool isUiItemHot() {
|
||||||
return uiState.itemId == uiState.hotItemId;
|
return uiState.itemId == uiState.hotItemId;
|
||||||
}
|
}
|
||||||
|
@ -230,7 +243,15 @@ Vec2 uiDragOffset() {
|
||||||
return uiState.itemDragOffset;
|
return uiState.itemDragOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int uiFocus() {
|
bool isUiItemFocused() {
|
||||||
|
return uiState.itemId == uiState.focusedItemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isUiFocused() {
|
||||||
|
return uiState.focusedItemId > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
short uiFocus() {
|
||||||
return uiState.focusedItemId;
|
return uiState.focusedItemId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +310,9 @@ void updateUiState(Vec2 itemPoint, Vec2 itemSize, bool isHot, bool isActive, boo
|
||||||
case Layout.v: uiState.layoutStartPointOffest.y += uiState.itemSize.y + uiState.margin; break;
|
case Layout.v: uiState.layoutStartPointOffest.y += uiState.itemSize.y + uiState.margin; break;
|
||||||
case Layout.h: uiState.layoutStartPointOffest.x += uiState.itemSize.x + uiState.margin; break;
|
case Layout.h: uiState.layoutStartPointOffest.x += uiState.itemSize.x + uiState.margin; break;
|
||||||
}
|
}
|
||||||
if (isHot) uiState.hotItemId = uiState.itemId;
|
if (isHot) {
|
||||||
|
uiState.hotItemId = uiState.itemId;
|
||||||
|
}
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
uiState.activeItemId = uiState.itemId;
|
uiState.activeItemId = uiState.itemId;
|
||||||
uiState.focusedItemId = uiState.itemId;
|
uiState.focusedItemId = uiState.itemId;
|
||||||
|
@ -307,7 +330,7 @@ void updateUiState(Vec2 itemPoint, Vec2 itemSize, bool isHot, bool isActive, boo
|
||||||
|
|
||||||
void updateUiText(Vec2 size, IStr text, UiButtonOptions options = UiButtonOptions()) {
|
void updateUiText(Vec2 size, IStr text, UiButtonOptions options = UiButtonOptions()) {
|
||||||
if (options.font.isEmpty) options.font = engineFont;
|
if (options.font.isEmpty) options.font = engineFont;
|
||||||
auto point = uiState.layoutStartPoint + uiState.layoutStartPointOffest;
|
auto point = uiLayoutPoint;
|
||||||
auto maxSize = measureTextSize(options.font, text);
|
auto maxSize = measureTextSize(options.font, text);
|
||||||
if (maxSize.x < size.x) maxSize.x = size.x;
|
if (maxSize.x < size.x) maxSize.x = size.x;
|
||||||
if (maxSize.y < size.y) maxSize.y = size.y;
|
if (maxSize.y < size.y) maxSize.y = size.y;
|
||||||
|
@ -333,7 +356,7 @@ bool updateUiButton(Vec2 size, IStr text, UiButtonOptions options = UiButtonOpti
|
||||||
if (options.font.isEmpty) options.font = engineFont;
|
if (options.font.isEmpty) options.font = engineFont;
|
||||||
auto m = uiMouse;
|
auto m = uiMouse;
|
||||||
auto id = uiState.itemId + 1;
|
auto id = uiState.itemId + 1;
|
||||||
auto point = uiState.layoutStartPoint + uiState.layoutStartPointOffest;
|
auto point = uiLayoutPoint;
|
||||||
auto maxSize = measureTextSize(options.font, text);
|
auto maxSize = measureTextSize(options.font, text);
|
||||||
if (maxSize.x < size.x) maxSize.x = size.x;
|
if (maxSize.x < size.x) maxSize.x = size.x;
|
||||||
if (maxSize.y < size.y) maxSize.y = size.y;
|
if (maxSize.y < size.y) maxSize.y = size.y;
|
||||||
|
@ -343,6 +366,12 @@ bool updateUiButton(Vec2 size, IStr text, UiButtonOptions options = UiButtonOpti
|
||||||
m.x < point.x + maxSize.x &&
|
m.x < point.x + maxSize.x &&
|
||||||
m.y >= point.y &&
|
m.y >= point.y &&
|
||||||
m.y < point.y + maxSize.y;
|
m.y < point.y + maxSize.y;
|
||||||
|
if (isHot) {
|
||||||
|
uiState.previousMaxHotItemIdBuffer = cast(short) id;
|
||||||
|
}
|
||||||
|
if (uiState.previousMaxHotItemId) {
|
||||||
|
isHot = isHot && id == uiState.previousMaxHotItemId;
|
||||||
|
}
|
||||||
auto isActive = isHot && uiState.mouseClickAction.isDown;
|
auto isActive = isHot && uiState.mouseClickAction.isDown;
|
||||||
auto isClicked = isHot;
|
auto isClicked = isHot;
|
||||||
if (uiState.isActOnPress) {
|
if (uiState.isActOnPress) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue