Skip to content

Commit

Permalink
Add stackview and more
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladislav Prusakov committed Jun 21, 2024
1 parent 82753cb commit e82ac22
Show file tree
Hide file tree
Showing 26 changed files with 594 additions and 192 deletions.
100 changes: 79 additions & 21 deletions Sources/AdaEditor/UI/EditorWindow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,92 @@

import AdaEngine

struct ContentView: Widget {
var body: some Widget {
HStack(spacing: 8) {

Color.red

VStack {
Color.green

Color.blue
}

// VStack(spacing: 8) {
// Color.yellow
//
// Color.blue
// }

// VStack(spacing: 8) {
// Color.red
//
// Color.green
// }
}
}
}

class EditorWindow: UIWindow {
override func windowDidReady() {
self.backgroundColor = .white
//

let view = UIWidgetView(rootView: ContentView())
view.autoresizingRules = [.flexibleWidth, .flexibleHeight]
self.addSubview(view)

// let blueView = UIView(frame: Rect(origin: Point(x: 0, y: 0), size: Size(width: 50, height: 50)))
// blueView.backgroundColor = .blue
//
// let redView = UIView(frame: Rect(origin: Point(x: 25, y: 25), size: Size(width: 50, height: 50)))
// redView.zIndex = 1
// redView.backgroundColor = .red
//
// let redView1 = UIView(frame: Rect(origin: Point(x: 0, y: 0), size: Size(width: 10, height: 10)))
// redView1.backgroundColor = .green
//

// self.addSubview(blueView)
// self.addSubview(redView)
//
// redView.addSubview(redView1)
//
// let control = UIButton(frame: Rect(origin: Point(x: 20, y: 20), size: Size(width: 50, height: 50)))
// control.addAction(UIEventAction {
// print("Pressed")
// }, for: .touchDown)
//
// control.setBackgroundColor(.red.opacity(0.5), for: .selected)
// control.setBackgroundColor(.red, for: .normal)
//
// self.addSubview(control)

let control = UIButton(frame: Rect(origin: Point(x: 20, y: 20), size: Size(width: 50, height: 50)))
control.addAction(UIEventAction {
print("Pressed")
}, for: .touchDown)

control.setBackgroundColor(.red.opacity(0.5), for: .selected)
control.setBackgroundColor(.red, for: .normal)
// let greenView = UIView()
// greenView.backgroundColor = .orange
//
// let nestedStack = UIStackView(.vertical, children: [
// redView,
// greenView
// ])
//
// nestedStack.spacing = 8
//
// let stack = UIStackView(.horizontal, children: [
// blueView,
// nestedStack
// ])
//
// stack.spacing = 8
//
// stack.backgroundColor = .green.opacity(0.3)
// stack.autoresizingRules = [.flexibleWidth, .flexibleHeight]
//
// self.addSubview(stack)

self.addSubview(control)
// FIXME: SceneView doesnt render when UI does
// let scene = TilemapScene()
// let sceneView = SceneView(scene: scene, frame: Rect(origin: Point(x: 60, y: 60), size: Size(width: 250, height: 250)))
// sceneView.backgroundColor = .red
// self.addSubview(sceneView)

// let label = UILabel(frame: Rect(origin: Point(x: 20, y: 20), size: Size(width: 20, height: 20)))
// label.backgroundColor = .red
Expand All @@ -44,15 +102,15 @@ class EditorWindow: UIWindow {
}

override func draw(in rect: Rect, with context: GUIRenderContext) {
let size: Float = 100

let count = Int(rect.width / size)

var x: Float = rect.minX

for i in 0 ..< count {
context.drawRect(.init(x: x, y: 50, width: size, height: size), color: Color.random())
x += size
}
// let size: Float = 100
//
// let count = Int(rect.width / size)
//
// var x: Float = rect.minX
//
// for _ in 0 ..< count {
// context.drawRect(.init(x: x, y: 50, width: size, height: size), color: Color.random())
// x += size
// }
}
}
4 changes: 0 additions & 4 deletions Sources/AdaEngine/Platforms/Apple/macOS/MacApplication.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,8 @@ import AppKit
import MetalKit

final class MacApplication: Application {

// Timer that synced with display refresh rate.
private let displayLink: DisplayLink

override init(argc: Int32, argv: UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>) throws {
self.displayLink = DisplayLink(on: .main)!
try super.init(argc: argc, argv: argv)
self.windowManager = MacOSWindowManager()

Expand Down
1 change: 0 additions & 1 deletion Sources/AdaEngine/Scene/Components/CameraComponent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
//
// Created by v.prusakov on 11/2/21.
//
//

import Math

Expand Down
3 changes: 3 additions & 0 deletions Sources/AdaEngine/Scene/Scene.swift
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ open class Scene: Resource, @unchecked Sendable {

// MARK: - Internal methods

@MainActor
func readyIfNeeded() async {
if self.isReady {
return
Expand All @@ -171,6 +172,7 @@ open class Scene: Resource, @unchecked Sendable {
await self.ready()
}

@MainActor
func ready() async {
// TODO: In the future we need minimal scene plugin for headless mode.
if self.instantiateDefaultPlugin {
Expand All @@ -187,6 +189,7 @@ open class Scene: Resource, @unchecked Sendable {
}

/// Update scene world and systems by delta time.
@MainActor
func update(_ deltaTime: TimeInterval) async {
if self.isUpdating {
assertionFailure("Can't update scene twice")
Expand Down
2 changes: 2 additions & 0 deletions Sources/AdaEngine/Text/TextLayoutManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public struct TextContainer: Hashable {

}

// TODO: Fix Font size

/// An object that coordinates the layout and display of text characters.
/// TextLayoutManager maps unicods characters codes to glyphs.
public final class TextLayoutManager {
Expand Down
5 changes: 4 additions & 1 deletion Sources/AdaEngine/UI/DSL/HStack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@

public struct HStack<Content: Widget>: Widget, WidgetNodeBuilder {

let spacing: Float
let content: Content

public init(@WidgetBuilder content: () -> Content) {
public init(spacing: Float = 0, @WidgetBuilder content: () -> Content) {
self.spacing = spacing
self.content = content()
}

Expand All @@ -20,6 +22,7 @@ public struct HStack<Content: Widget>: Widget, WidgetNodeBuilder {
func makeWidgetNode(context: Context) -> WidgetNode {
return WidgetStackContainerNode(
axis: .horizontal,
spacing: spacing,
content: self,
buildNodesBlock: {
let containerNode = (self.content as? WidgetNodeBuilder)?.makeWidgetNode(context: context) as? WidgetContainerNode
Expand Down
42 changes: 36 additions & 6 deletions Sources/AdaEngine/UI/DSL/Modifiers/FrameModifier.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct FrameWidget<Content: Widget>: Widget, WidgetNodeBuilder {
}

func makeWidgetNode(context: Context) -> WidgetNode {
RectangleWidgetNode(rect: .zero, stackIndex: 0, content: content)
return FrameWidgetNode(frameRule: self.frame, content: self)
}
}

Expand All @@ -39,6 +39,16 @@ struct FrameWidgetModifier: WidgetModifier {

}

class FrameWidgetNode: WidgetNode {

let frameRule: FrameWidgetModifier.Frame

init(frameRule: FrameWidgetModifier.Frame, content: any Widget) {
self.frameRule = frameRule
super.init(content: content)
}
}

// MARK: - Visibility

public extension Widget {
Expand Down Expand Up @@ -66,7 +76,7 @@ struct OnAppearWidget<Content: Widget>: Widget, WidgetNodeBuilder {
}

func makeWidgetNode(context: Context) -> WidgetNode {
let node = WidgetNodeVisibility(stackIndex: 0, content: content)
let node = WidgetNodeVisibility(content: content)
node.onAppear = self.onAppear
return node
}
Expand All @@ -88,7 +98,7 @@ struct OnDisappearWidget<Content: Widget>: Widget, WidgetNodeBuilder {
}

func makeWidgetNode(context: Context) -> WidgetNode {
let node = WidgetNodeVisibility(stackIndex: 0, content: content)
let node = WidgetNodeVisibility(content: content)
node.onDisappear = self.onDisappear
return node
}
Expand Down Expand Up @@ -126,8 +136,28 @@ struct BackgroundWidget<Content: Widget>: Widget, WidgetNodeBuilder {
}

func makeWidgetNode(context: Context) -> WidgetNode {
let node = WidgetNodeVisibility(stackIndex: 0, content: content)
return node
return WidgetNodeVisibility(content: content)
}

}

@MainActor
class CanvasWidgetNode: WidgetNode {

typealias RenderBlock = (GUIRenderContext, Rect) -> Void

let drawBlock: RenderBlock

init(content: any Widget, drawBlock: @escaping RenderBlock) {
self.drawBlock = drawBlock
super.init(content: content)
}

override func draw(with context: GUIRenderContext) {
self.drawBlock(context, self.frame)
}

override func sizeThatFits(_ proposal: ProposedViewSize) -> Size {
return Size(width: proposal.width ?? 0, height: proposal.height ?? 0)
}

}
16 changes: 9 additions & 7 deletions Sources/AdaEngine/UI/DSL/Nodes/TextWidgetNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
class TextWidgetNode: WidgetNode {

var text: String = ""
var font: FontResource = .system()

override func performLayout() {

var font: Font = .system(size: 17)

init(text: String, font: Font, content: any Widget) {
self.text = text
self.font = font
super.init(content: content)
}
override func renderNode(context: GUIRenderContext) {


override func sizeThatFits(_ proposal: ProposedViewSize) -> Size {
return .zero
}
}
6 changes: 3 additions & 3 deletions Sources/AdaEngine/UI/DSL/Nodes/UIViewWidgetNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ final class UIViewWidgetNode: WidgetNode {
self.makeUIView = makeUIView
self.updateUIView = updateUIView

super.init(stackIndex: 0, content: content)
super.init(content: content)
}

override func performLayout() {
Expand All @@ -34,7 +34,7 @@ final class UIViewWidgetNode: WidgetNode {
super.invalidateContent()
}

override func renderNode(context: GUIRenderContext) {
// view?.draw(in: self.rect, with: context)
override func draw(with context: GUIRenderContext) {
view?.draw(with: context)
}
}
Loading

0 comments on commit e82ac22

Please sign in to comment.