3
0
mirror of https://github.com/britzl/monarch.git synced 2025-11-26 19:00:53 +01:00

Compare commits

...

21 Commits
3.0.0 ... 3.1.0

Author SHA1 Message Date
Jerakin
c7ff068f79 Added editor script to create base setup (#57) 2020-01-16 08:45:48 +01:00
Björn Ritzl
6a92a0b2dd Update ci-workflow.yml 2019-12-10 07:20:41 +01:00
Björn Ritzl
bb1f34149a Check if proxy is missing resources when loading/showing it
Fixes #56
2019-12-10 07:11:30 +01:00
Björn Ritzl
7b20e48424 Update run.sh 2019-10-21 06:36:12 +02:00
Björn Ritzl
a77431600e Update .travis.yml 2019-10-21 06:35:38 +02:00
Björn Ritzl
68cda52c0d Update monarch.lua 2019-09-14 01:25:43 +02:00
Björn Ritzl
81237762be Transition out and in again if showing the same screen twice
Fixes #54
2019-09-14 01:23:14 +02:00
Björn Ritzl
8001d370c2 Delete foo.txt 2019-09-14 01:16:10 +02:00
Björn Ritzl
ac409eb4c8 Update ci-workflow.yml 2019-08-19 07:17:00 +02:00
Björn Ritzl
5f776b0bc4 Update ci-workflow.yml 2019-08-19 07:15:31 +02:00
Björn Ritzl
9a47129135 Removed test 2019-08-19 07:13:03 +02:00
Björn Ritzl
4ea29a9efa Update ci-workflow.yml 2019-08-19 07:12:29 +02:00
Björn Ritzl
fa7cf75d3a Merge branch 'master' of https://github.com/britzl/monarch 2019-08-19 06:18:36 +02:00
Björn Ritzl
bbc4baa5e1 Update foo.txt 2019-08-19 06:18:34 +02:00
Björn Ritzl
0085704614 Update README.md 2019-08-19 06:17:26 +02:00
Björn Ritzl
e37b9bde89 Update .travis.yml 2019-08-13 06:09:07 +02:00
Björn Ritzl
21b16e1473 Create foo.txt 2019-08-09 07:51:44 +02:00
Björn Ritzl
36291f3762 Added test workflow 2019-08-09 07:30:46 +02:00
Björn Ritzl
fd5f82c40b Update ci-workflow.yml 2019-08-09 07:26:07 +02:00
Björn Ritzl
92bddc742b Create ci-workflow.yml 2019-08-09 07:11:15 +02:00
Björn Ritzl
0c0446746c Update README.md 2019-08-05 14:45:40 +02:00
9 changed files with 237 additions and 27 deletions

19
.github/workflows/ci-workflow.yml vendored Normal file
View 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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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")