Skip to content

Commit f0ddf68

Browse files
authored
Merge pull request #53 from NuiCpp/devel
Resizeable utility completed.
2 parents 1fed7bc + db17bb3 commit f0ddf68

File tree

5 files changed

+88
-46
lines changed

5 files changed

+88
-46
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include <nui/frontend/val.hpp>
4+
5+
namespace Nui
6+
{
7+
enum class ResizeableEdge
8+
{
9+
Right,
10+
Bottom
11+
};
12+
13+
void makeResizeable(Nui::val const& element, ResizeableEdge edge = ResizeableEdge::Right);
14+
}

nui/js/make_resizeable.js

Lines changed: 0 additions & 46 deletions
This file was deleted.

nui/js/make_resizeable.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
const makeResizeable = (element: HTMLElement, borderSize: number, edge?: "right" | "bottom") => {
2+
edge = edge || "right";
3+
4+
let pos: number;
5+
const resizer = (() => {
6+
if (edge === "right") {
7+
return (x: number, y: number, w: number, h: number) => {
8+
const dx = -(pos - x);
9+
pos = x;
10+
element.style.width = (w + dx) + "px";
11+
};
12+
}
13+
else if (edge === "bottom") {
14+
return (x: number, y: number, w: number, h: number) => {
15+
const dy = -(pos - y);
16+
pos = y;
17+
element.style.height = (h + dy) + "px";
18+
};
19+
}
20+
else {
21+
throw new Error("Invalid edge");
22+
}
23+
})();
24+
25+
const resize = (e: MouseEvent) => {
26+
const w = parseInt(getComputedStyle(element, '').width);
27+
const h = parseInt(getComputedStyle(element, '').height);
28+
29+
resizer(e.x, e.y, w, h);
30+
}
31+
32+
element.addEventListener("mousedown", (e: MouseEvent) => {
33+
if (!(e.target instanceof Element))
34+
return;
35+
36+
const w = parseInt(getComputedStyle(e.target as Element, '').width);
37+
const h = parseInt(getComputedStyle(e.target as Element, '').height);
38+
39+
if (edge == "right") {
40+
if (w - e.x < borderSize + 1 /*rounding tolerance*/) {
41+
pos = e.x;
42+
document.addEventListener("mousemove", resize, false);
43+
}
44+
}
45+
else if (edge == "bottom") {
46+
if (h - e.y < borderSize + 1 /*rounding tolerance*/) {
47+
pos = e.y;
48+
document.addEventListener("mousemove", resize, false);
49+
}
50+
}
51+
}, false);
52+
53+
document.addEventListener("mouseup", () => {
54+
document.removeEventListener("mousemove", resize, false);
55+
}, false);
56+
}
57+
58+
!('nui_lib' in globalThis) && (globalThis.nui_lib = {});
59+
globalThis.nui_lib.makeResizeable = makeResizeable;
60+
61+
export default makeResizeable;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <nui/frontend/extensions/make_resizeable.hpp>
2+
3+
namespace Nui
4+
{
5+
void makeResizeable(Nui::val const& element, ResizeableEdge edge)
6+
{
7+
Nui::val::global("nui_lib")["makeResizeable"](
8+
element,
9+
Nui::val{5},
10+
Nui::val{edge == ResizeableEdge::Right ? std::string{"right"} : std::string{"bottom"}});
11+
}
12+
}

nui/src/nui/frontend/frontend_sources.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ set(NUI_FRONTEND_SOURCES_RELATIVE
66
components/dialog.cpp
77
dom/dom.cpp
88
event_system/event_context.cpp
9+
extensions/make_resizeable.cpp
910
filesystem/file_dialog.cpp
1011
filesystem/file.cpp
1112
utility/fragment_listener.cpp

0 commit comments

Comments
 (0)