https://github.com/andrewarrow/goal
a CLI version of auto layout in go
https://github.com/andrewarrow/goal
autolayout go golang swift
Last synced: 3 months ago
JSON representation
a CLI version of auto layout in go
- Host: GitHub
- URL: https://github.com/andrewarrow/goal
- Owner: andrewarrow
- License: mit
- Created: 2022-08-21T14:18:59.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2022-08-25T23:42:40.000Z (almost 4 years ago)
- Last Synced: 2024-12-31T04:02:43.274Z (over 1 year ago)
- Topics: autolayout, go, golang, swift
- Language: Go
- Homepage:
- Size: 46.9 KB
- Stars: 1
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# GOAL
Go Auto Layout
https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html
Try and implement a CLI version of auto layout in go.
Goal (pun intended) is to try and learn auto layout in a deep way.
# Example Screenshot

# Example Json
```
{
"root": {
"id": "root",
"subviews": [
{
"id": "view1",
"class": "UIView",
"leading": {"equal": "root.leading", constant: 33},
"top": {"equal": "root.top", constant: 33},
"trailing": {"equal": "root.trailing", constant: -33},
"bottom": {"equal": "root.bottom", constant: -33},
"subviews": [
{
"id": "view2",
"class": "UIView",
"leading": {"equal": "view1.leading", constant: 33},
"top": {"equal": "view1.top", constant: 33},
"trailing": {"equal": "label1.trailing", constant: 33},
"bottom: {"equal": "view1.bottom", constant: -33},
"subviews": [
{
"id": "label1",
"class": "UILabel",
"text": "Hello"
"leading": {"equal": "view2.leading", constant: 33},
"top": {"equal": "view2.top", constant: 33},
}
]
},
{
"id": "view3",
"class": "UIView",
"leading": {"equal": "label1.leading", constant: 99},
"top": {"equal": "view1.top", constant: 33},
"trailing": {"equal": "label2.trailing", constant: 33},
"bottom: {"equal": "view1.bottom", constant: -33},
"subviews": [
{
"id": "label2",
"class": "UILabel",
"text": "There"
"leading": {"equal": "view3.leading", constant: 33},
"top": {"equal": "view3.top", constant: 33},
}
]
}
]
}
]
}
}
```
# Example Swift
```
let view1 = UIView()
view1.backgroundColor = .cyan
view1.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(view1)
let view2 = UIView()
view2.backgroundColor = .orange
view2.translatesAutoresizingMaskIntoConstraints = false
view1.addSubview(view2)
let view3 = UIView()
view3.backgroundColor = .red
view3.translatesAutoresizingMaskIntoConstraints = false
view1.addSubview(view3)
let label1 = UILabel()
label1.text = "Hello"
label1.textColor = .black
label1.translatesAutoresizingMaskIntoConstraints = false
view2.addSubview(label1)
let label2 = UILabel()
label2.text = "There"
label2.textColor = .white
label2.translatesAutoresizingMaskIntoConstraints = false
view3.addSubview(label2)
NSLayoutConstraint.activate([
view1.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 33),
view1.topAnchor.constraint(equalTo: view.topAnchor, constant: 33),
view1.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -33),
view1.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -33),
])
NSLayoutConstraint.activate([
label1.leadingAnchor.constraint(equalTo: view2.leadingAnchor, constant: 33),
label1.topAnchor.constraint(equalTo: view2.topAnchor, constant: 33),
])
NSLayoutConstraint.activate([
view2.leadingAnchor.constraint(equalTo: view1.leadingAnchor, constant: 33),
view2.topAnchor.constraint(equalTo: view1.topAnchor, constant: 33),
view2.trailingAnchor.constraint(equalTo: label1.trailingAnchor, constant: 33),
view2.bottomAnchor.constraint(equalTo: view1.bottomAnchor, constant: -33),
])
NSLayoutConstraint.activate([
label2.leadingAnchor.constraint(equalTo: view3.leadingAnchor, constant: 33),
label2.topAnchor.constraint(equalTo: view3.topAnchor, constant: 33),
])
NSLayoutConstraint.activate([
view3.leadingAnchor.constraint(equalTo: label1.leadingAnchor, constant: 99),
view3.topAnchor.constraint(equalTo: view1.topAnchor, constant: 33),
view3.trailingAnchor.constraint(equalTo: label2.trailingAnchor, constant: 33),
view3.bottomAnchor.constraint(equalTo: view1.bottomAnchor, constant: -33),
])
```
# Render Example
```
+---------------------------------------------------+
| |
| +---------------------------------------------+ |
| | | |
| | +---------+ +---------+ | |
| | | | | | | |
| | | Hello | | There | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | +---------+ +---------+ | |
| | | |
| +---------------------------------------------+ |
| |
+---------------------------------------------------+
```
# Running
```
os/goal $ ./goal
goal run # use examples/layout.json with cols=60 and rows=30
goal run ~/layout.json 80 40 # use passed in file, cols, and rows
```