mirror of
https://github.com/britzl/monarch.git
synced 2025-11-26 10:50:55 +01:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7ff068f79 | ||
|
|
6a92a0b2dd | ||
|
|
bb1f34149a | ||
|
|
7b20e48424 | ||
|
|
a77431600e | ||
|
|
68cda52c0d | ||
|
|
81237762be | ||
|
|
8001d370c2 | ||
|
|
ac409eb4c8 | ||
|
|
5f776b0bc4 | ||
|
|
9a47129135 | ||
|
|
4ea29a9efa | ||
|
|
fa7cf75d3a | ||
|
|
bbc4baa5e1 | ||
|
|
0085704614 | ||
|
|
e37b9bde89 | ||
|
|
21b16e1473 | ||
|
|
36291f3762 | ||
|
|
fd5f82c40b | ||
|
|
92bddc742b | ||
|
|
0c0446746c |
19
.github/workflows/ci-workflow.yml
vendored
Normal file
19
.github/workflows/ci-workflow.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
name: CI
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build_and_run:
|
||||
name: Build and run
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: '11'
|
||||
- name: Run.sh
|
||||
env:
|
||||
DEFOLD_USER: bjorn.ritzl@gmail.com
|
||||
DEFOLD_AUTH: foobar
|
||||
DEFOLD_BOOSTRAP_COLLECTION: /test/test.collectionc
|
||||
run: ./.travis/run.sh
|
||||
@@ -15,14 +15,10 @@ addons:
|
||||
language: java
|
||||
|
||||
jdk:
|
||||
- oraclejdk8
|
||||
|
||||
dist: trusty
|
||||
- oraclejdk11
|
||||
|
||||
env:
|
||||
global:
|
||||
- DEFOLD_AUTH=foobar
|
||||
- DEFOLD_USER=bjorn.ritzl@gmail.com
|
||||
- DEFOLD_BOOSTRAP_COLLECTION=/test/test.collectionc
|
||||
|
||||
script:
|
||||
|
||||
@@ -26,11 +26,9 @@ chmod +x dmengine_headless
|
||||
echo "Downloading ${BOB_URL}"
|
||||
curl -o bob.jar ${BOB_URL}
|
||||
|
||||
# Fetch libraries if DEFOLD_AUTH and DEFOLD_USER are set
|
||||
if [ -n "${DEFOLD_AUTH}" ] && [ -n "${DEFOLD_USER}" ]; then
|
||||
echo "Running bob.jar - resolving dependencies"
|
||||
java -jar bob.jar --auth "${DEFOLD_AUTH}" --email "${DEFOLD_USER}" resolve
|
||||
fi
|
||||
# Fetch libraries
|
||||
echo "Running bob.jar - resolving dependencies"
|
||||
java -jar bob.jar --auth "foobar" --email "john@doe.com" resolve
|
||||
|
||||
echo "Running bob.jar - building"
|
||||
java -jar bob.jar --debug build --keep-unused
|
||||
|
||||
13
README.md
13
README.md
@@ -19,6 +19,10 @@ Or point to the ZIP file of a [specific release](https://github.com/britzl/monar
|
||||
# Usage
|
||||
Using Monarch requires that screens are created in a certain way. Once you have one or more screens created you can start navigating between the screens.
|
||||
|
||||
## Editor Script
|
||||
Right click in on a`.gui` file in the outline and selected the menu item, it creates a `.collection` and a `.gui_script` with the same name as the `.gui` file. It adds the file with some basic setup done to them, adding the selected gui script to the created gui scene and in turns adds the gui scene to the newly created collection.
|
||||
|
||||
<img src="/docs/editor_script.gif" width="200px">
|
||||
|
||||
## Creating screens
|
||||
Monarch screens are created in individual collections and either loaded through collection proxies or created through collection factories.
|
||||
@@ -188,6 +192,15 @@ Monarch comes with a system for setting up transitions easily in a gui_script us
|
||||
end
|
||||
end
|
||||
|
||||
It is also possible to assign transitions to multiple nodes:
|
||||
|
||||
function init(self)
|
||||
self.transition = transitions.create() -- note that no node is passed to transition.create()!
|
||||
.show_in(gui.get_node("node1"), transitions.slide_in_right, gui.EASING_OUTQUAD, 0.6, 0)
|
||||
.show_in(gui.get_node("node2"), transitions.slide_in_right, gui.EASING_OUTQUAD, 0.6, 0)
|
||||
end
|
||||
|
||||
|
||||
The predefined transitions provided by ```monarch.transitions.gui``` are:
|
||||
|
||||
* ```slide_in_right```
|
||||
|
||||
BIN
docs/editor_script.gif
Normal file
BIN
docs/editor_script.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
161
monarch/editor-script/make_monarch.editor_script
Normal file
161
monarch/editor-script/make_monarch.editor_script
Normal file
@@ -0,0 +1,161 @@
|
||||
local M = {}
|
||||
|
||||
local collection_template
|
||||
local gui_script_content
|
||||
local gui_file_content
|
||||
|
||||
local function ends_with(str, ending)
|
||||
return ending == "" or str:sub(-#ending) == ending
|
||||
end
|
||||
|
||||
local function file_exists(name)
|
||||
local f=io.open(name,"r")
|
||||
if f~=nil then io.close(f) return true else return false end
|
||||
end
|
||||
|
||||
local function get_filename(path)
|
||||
local main, filename, extension = path:match("(.-)([^\\/]-%.?([^%.\\/]*))$")
|
||||
return main, filename
|
||||
end
|
||||
|
||||
local function create_files(file_path)
|
||||
-- Construct paths
|
||||
local path = editor.get(file_path, "path")
|
||||
local main, filename = get_filename(path)
|
||||
local basename = filename:match("(.+)%..+")
|
||||
local target_collection_path = "." .. main .. basename .. ".collection"
|
||||
local target_gui_script_path = "." .. main .. basename .. ".gui_script"
|
||||
local target_gui_path = "." .. main .. basename .. ".gui"
|
||||
|
||||
-- Create the files if they don't exists
|
||||
if not file_exists(target_collection_path) then
|
||||
local collection_content = collection_template(path, basename)
|
||||
local collection = io.open(target_collection_path, "w")
|
||||
collection:write(collection_content)
|
||||
collection:close()
|
||||
end
|
||||
if not file_exists(target_gui_script_path) then
|
||||
local gui_script = io.open(target_gui_script_path, "w")
|
||||
gui_script:write(gui_script_content)
|
||||
gui_script:close()
|
||||
|
||||
-- Put the gui_script path into the gui file
|
||||
local gui_file = io.open("." .. path, "rb")
|
||||
local gui_text = gui_file:read("*a")
|
||||
gui_file:close()
|
||||
|
||||
gui_text = string.gsub(gui_text, 'script: "%.*"', [[script: "]] .. main .. basename .. ".gui_script" .. [["]])
|
||||
|
||||
gui_file = io.open("." .. path, "w")
|
||||
gui_file:write(gui_text)
|
||||
gui_file:close()
|
||||
end
|
||||
if not file_exists(target_gui_path) then
|
||||
local gui_content = gui_template(path)
|
||||
local gui = io.open(target_gui_path, "w")
|
||||
gui:write(gui_content)
|
||||
gui:close()
|
||||
end
|
||||
end
|
||||
|
||||
function M.get_commands()
|
||||
return {
|
||||
{
|
||||
label="Create Monarch Scene From...",
|
||||
locations = {"Assets"},
|
||||
query = {
|
||||
selection = {type = "resource", cardinality = "one"}
|
||||
},
|
||||
active = function(opts)
|
||||
local path = editor.get(opts.selection, "path")
|
||||
return ends_with(path, ".gui") or ends_with(path, ".collection") or ends_with(path, ".gui_script")
|
||||
end,
|
||||
run = function(opts)
|
||||
create_files(opts.selection)
|
||||
end
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
gui_template = function(gui_script)
|
||||
return [[script: "]].. gui_script .. [["
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
||||
]]
|
||||
end
|
||||
|
||||
gui_script_content = [[local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
end
|
||||
|
||||
function final(self)
|
||||
end
|
||||
|
||||
function update(self, dt)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_reload(self)
|
||||
end
|
||||
]]
|
||||
|
||||
|
||||
collection_template = function(gui_script, name)
|
||||
return [[name: "]].. name .. [["
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"monarch\"\n"
|
||||
" component: \"]].. gui_script .. [[\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" }\n"
|
||||
" rotation {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
""
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale3 {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
}
|
||||
}
|
||||
]]
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
return M
|
||||
@@ -371,6 +371,13 @@ local function preload(screen)
|
||||
screen.preloading = true
|
||||
if screen.proxy then
|
||||
log("preload() proxy")
|
||||
local missing_resources = collectionproxy.missing_resources(screen.proxy)
|
||||
if #missing_resources > 0 then
|
||||
local error_message = ("preload() collection proxy %s is missing resources"):format(tostring(screen.id))
|
||||
log(error_message)
|
||||
screen.preloading = false
|
||||
return false, error_message
|
||||
end
|
||||
screen.wait_for = PROXY_LOADED
|
||||
msg.post(screen.proxy, ASYNC_LOAD)
|
||||
coroutine.yield()
|
||||
@@ -677,16 +684,16 @@ function M.show(id, options, data, cb)
|
||||
-- close all popups, one by one
|
||||
while top.popup do
|
||||
stack[#stack] = nil
|
||||
show_out(top, screen, function()
|
||||
assert(coroutine.resume(co))
|
||||
end)
|
||||
coroutine.yield()
|
||||
show_out(top, screen, callbacks.track())
|
||||
callbacks.yield_until_done()
|
||||
top = stack[#stack]
|
||||
end
|
||||
-- unload and transition out from top
|
||||
-- unless we're showing the same screen as is already visible
|
||||
if top and top.id ~= screen.id then
|
||||
show_out(top, screen, callbacks.track())
|
||||
-- wait until we are done if showing the same screen as is already visible
|
||||
local same_screen = top and top.id == screen.id
|
||||
show_out(top, screen, callbacks.track())
|
||||
if same_screen then
|
||||
callbacks.yield_until_done()
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -817,7 +824,13 @@ function M.is_preloading(id)
|
||||
local screen = screens[id]
|
||||
return screen.preloading
|
||||
end
|
||||
|
||||
function M.is_preloaded(id)
|
||||
assert(id, "You must provide a screen id")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
local screen = screens[id]
|
||||
return screen.preloaded
|
||||
end
|
||||
|
||||
--- Invoke a callback when a specific screen has been preloaded
|
||||
-- This is mainly useful on app start when wanting to show a screen that
|
||||
|
||||
@@ -7,6 +7,10 @@ function M.create()
|
||||
local callback = nil
|
||||
local callback_count = 0
|
||||
|
||||
local function is_done()
|
||||
return callback_count == 0
|
||||
end
|
||||
|
||||
local function invoke_if_done()
|
||||
if callback_count == 0 and callback then
|
||||
local ok, err = pcall(callback)
|
||||
@@ -37,6 +41,17 @@ function M.create()
|
||||
invoke_if_done()
|
||||
end
|
||||
|
||||
function instance.yield_until_done()
|
||||
local co = coroutine.running()
|
||||
callback = function()
|
||||
coroutine.resume(co)
|
||||
end
|
||||
invoke_if_done()
|
||||
if not is_done() then
|
||||
coroutine.yield()
|
||||
end
|
||||
end
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
|
||||
@@ -405,18 +405,13 @@ return function()
|
||||
end)
|
||||
|
||||
it("should be able to preload a screen and always keep it loaded", function()
|
||||
monarch.show(SCREEN_PRELOAD, nil, { count = 1 })
|
||||
monarch.show(SCREEN_PRELOAD)
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
-- first time the screen gets loaded it will increment the count
|
||||
assert(monarch.data(SCREEN_PRELOAD).count == 2)
|
||||
|
||||
monarch.show(SCREEN_PRELOAD, { clear = true }, { count = 1 })
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
-- second time the screen gets shown it will already be loaded and not increment the count
|
||||
assert(monarch.data(SCREEN_PRELOAD).count == 1)
|
||||
monarch.back()
|
||||
assert(wait_until_hidden(SCREEN_PRELOAD), "Screen_preload was never hidden")
|
||||
assert(monarch.is_preloaded(SCREEN_PRELOAD))
|
||||
end)
|
||||
|
||||
|
||||
it("should be able to reload a preloaded screen", function()
|
||||
monarch.show(SCREEN_PRELOAD, nil, { count = 1 })
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
|
||||
Reference in New Issue
Block a user