Skip to content

Commit fce2fc2

Browse files
authored
Feature - API: Some initial compositional components (#483)
* Add width/height as properties on Image * Some additional compositional components * Fix warning * Fix more warnings * Fix remaining warnings
1 parent b788103 commit fce2fc2

File tree

8 files changed

+94
-9
lines changed

8 files changed

+94
-9
lines changed

src/UI/ImageNode.re

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,43 @@
11
open Revery_Core;
2-
open Revery_Draw;
2+
3+
module Draw = Revery_Draw;
34

45
module Layout = Layout;
56
module LayoutTypes = Layout.LayoutTypes;
67

78
open Node;
89

10+
let uiToDrawResizeMode: ImageResizeMode.t => Revery_Draw.ImageResizeMode.t =
11+
rm =>
12+
switch (rm) {
13+
| Stretch => Revery_Draw.ImageResizeMode.Stretch
14+
| Repeat => Revery_Draw.ImageResizeMode.Repeat
15+
};
16+
917
class imageNode (imagePath: string) = {
1018
as _this;
1119
val mutable src = imagePath;
1220
inherit (class node)() as _super;
21+
val _opacity: ref(float) = ref(1.0);
1322
val _resizeMode: ref(ImageResizeMode.t) = ref(ImageResizeMode.Stretch);
1423
pub! draw = (parentContext: NodeDrawContext.t) => {
1524
/* Draw background first */
1625
_super#draw(parentContext);
1726
let dimensions = _this#measurements();
1827
let world = _this#getWorldTransform();
19-
let style = _this#getStyle();
2028

21-
Image.drawImage(
29+
Draw.Image.drawImage(
2230
~imagePath=src,
2331
~transform=world,
2432
~width=float_of_int(dimensions.width),
2533
~height=float_of_int(dimensions.height),
26-
~resizeMode=_resizeMode^,
34+
~resizeMode=uiToDrawResizeMode(_resizeMode^),
2735
~tint=Colors.white,
28-
~opacity=style.opacity,
36+
~opacity=_opacity^,
2937
(),
3038
);
3139
};
40+
pub setOpacity = f => _opacity := f;
3241
pub setResizeMode = (mode: ImageResizeMode.t) => {
3342
_resizeMode := mode;
3443
};

src/UI/ImageResizeMode.re

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type t =
2+
| Stretch
3+
| Repeat;

src/UI/Primitives.re

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,22 @@ module Text = {
230230
module Image = {
231231
let component = React.nativeComponent("Image");
232232

233+
let getStyles: (option(int), option(int), Style.t) => Style.t =
234+
(w, h, style) => {
235+
let style =
236+
switch (w) {
237+
| Some(v) => {...style, width: v}
238+
| None => style
239+
};
240+
241+
let style =
242+
switch (h) {
243+
| Some(v) => {...style, height: v}
244+
| None => style
245+
};
246+
style;
247+
};
248+
233249
let make =
234250
(
235251
~key=?,
@@ -238,17 +254,21 @@ module Image = {
238254
~onMouseUp=?,
239255
~onMouseWheel=?,
240256
~ref=?,
241-
~resizeMode=Revery_Draw.ImageResizeMode.Stretch,
242-
~style=Style.emptyImageStyle,
257+
~resizeMode=ImageResizeMode.Stretch,
258+
~opacity=1.0,
259+
~width=?,
260+
~height=?,
243261
~src="",
262+
~style,
244263
children,
245264
) =>
246265
component(~key?, hooks =>
247266
(
248267
hooks,
249268
{
250269
make: () => {
251-
let styles = Style.create(~style, ());
270+
let styles =
271+
Style.create(~style, ()) |> getStyles(width, height);
252272
let events =
253273
NodeEvents.make(
254274
~ref?,
@@ -259,13 +279,15 @@ module Image = {
259279
(),
260280
);
261281
let node = PrimitiveNodeFactory.get().createImageNode(src);
282+
node#setOpacity(opacity);
262283
node#setEvents(events);
263284
node#setStyle(styles);
264285
node#setResizeMode(resizeMode);
265286
Obj.magic(node);
266287
},
267288
configureInstance: (~isFirstRender as _, node) => {
268-
let styles = Style.create(~style, ());
289+
let styles =
290+
Style.create(~style, ()) |> getStyles(width, height);
269291
let events =
270292
NodeEvents.make(
271293
~ref?,
@@ -277,6 +299,7 @@ module Image = {
277299
);
278300
let imgNode: ImageNode.imageNode = Obj.magic(node);
279301
imgNode#setResizeMode(resizeMode);
302+
imgNode#setOpacity(opacity);
280303
node#setEvents(events);
281304
node#setStyle(styles);
282305
node;
@@ -296,6 +319,8 @@ module Image = {
296319
~resizeMode=?,
297320
~style=Style.emptyImageStyle,
298321
~src="",
322+
~width=?,
323+
~height=?,
299324
~children,
300325
(),
301326
) =>
@@ -308,6 +333,8 @@ module Image = {
308333
~resizeMode?,
309334
~style,
310335
~src,
336+
~width?,
337+
~height?,
311338
React.listToElement(children),
312339
);
313340
};

src/UI/Revery_UI.re

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Performance = Revery_Core.Performance;
66
module Animated = Animated;
77
module Animation = Animation;
88
module AnimationTicker = AnimationTicker;
9+
module ImageResizeMode = ImageResizeMode;
910
module Layout = Layout;
1011
module LayoutTypes = Layout.LayoutTypes;
1112
module Style = Style;

src/UI_Components/Container.re

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
open Revery_UI;
2+
3+
let component = React.component("Container");
4+
5+
let createElement = (~width as w, ~height as h, ~children, ()) =>
6+
component(hooks => {
7+
let style = Style.[width(w), height(h)];
8+
9+
(hooks, <View style> ...children </View>);
10+
});

src/UI_Components/Positioned.re

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
open Revery_UI;
2+
3+
let component = React.component("Positioned");
4+
5+
let createElement = (~top=?, ~left=?, ~right=?, ~bottom=?, ~children, ()) =>
6+
component(hooks => {
7+
let style =
8+
switch (top, left, right, bottom) {
9+
| (Some(t), Some(l), _, _) =>
10+
Style.[position(`Absolute), top(t), left(l)]
11+
| (Some(t), _, Some(r), _) =>
12+
Style.[position(`Absolute), top(t), right(r)]
13+
| (_, _, Some(r), Some(b)) =>
14+
Style.[position(`Absolute), bottom(b), right(r)]
15+
| (_, Some(l), _, Some(b)) =>
16+
Style.[position(`Absolute), bottom(b), left(l)]
17+
| _ => []
18+
};
19+
20+
(hooks, <View style> ...children </View>);
21+
});

src/UI_Components/Revery_UI_Components.re

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
*/
66

77
module Clickable = Clickable;
8+
module Container = Container;
9+
module Stack = Stack;
810
module Button = Button;
11+
module Positioned = Positioned;
912
module ScrollView = ScrollView;
1013
module Slider = Slider;
1114
module Input = Input;

src/UI_Components/Stack.re

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
open Revery_UI;
2+
3+
let component = React.component("Stack");
4+
5+
let style = (w, h) => Style.[position(`Relative), width(w), height(h)];
6+
7+
let createElement = (~width as w, ~height as h, ~children, ()) => {
8+
component(hooks =>
9+
(hooks, <View style={style(w, h)}> ...children </View>)
10+
);
11+
};

0 commit comments

Comments
 (0)