mirror of
https://github.com/britzl/monarch.git
synced 2025-06-27 18:37:46 +02:00
Compare commits
No commits in common. "master" and "3.3.0" have entirely different histories.
10
.github/workflows/ci-workflow.yml
vendored
10
.github/workflows/ci-workflow.yml
vendored
@ -7,13 +7,13 @@ jobs:
|
||||
name: Build and run
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
||||
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: '21.0.5+11.0.LTS'
|
||||
distribution: 'temurin'
|
||||
java-version: '11'
|
||||
- name: Run.sh
|
||||
env:
|
||||
DEFOLD_USER: bjorn.ritzl@gmail.com
|
||||
DEFOLD_AUTH: foobar
|
||||
run: ./.test/run.sh
|
||||
DEFOLD_BOOSTRAP_COLLECTION: /test/test.collectionc
|
||||
run: ./.travis/run.sh
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -9,6 +9,3 @@ build
|
||||
builtins
|
||||
.internal
|
||||
luacov.report.out
|
||||
/.editor_settings
|
||||
manifest.private.der
|
||||
manifest.public.der
|
||||
|
42
.luacheckrc
Normal file
42
.luacheckrc
Normal file
@ -0,0 +1,42 @@
|
||||
std = "max"
|
||||
files['.luacheckrc'].global = false
|
||||
unused_args = false
|
||||
|
||||
globals = {
|
||||
"sys",
|
||||
"go",
|
||||
"gui",
|
||||
"label",
|
||||
"render",
|
||||
"crash",
|
||||
"sprite",
|
||||
"sound",
|
||||
"tilemap",
|
||||
"spine",
|
||||
"particlefx",
|
||||
"physics",
|
||||
"factory",
|
||||
"collectionfactory",
|
||||
"iac",
|
||||
"msg",
|
||||
"vmath",
|
||||
"url",
|
||||
"http",
|
||||
"image",
|
||||
"json",
|
||||
"zlib",
|
||||
"iap",
|
||||
"push",
|
||||
"facebook",
|
||||
"hash",
|
||||
"hash_to_hex",
|
||||
"pprint",
|
||||
"init",
|
||||
"final",
|
||||
"update",
|
||||
"on_input",
|
||||
"on_message",
|
||||
"on_reload",
|
||||
"window",
|
||||
"unityads"
|
||||
}
|
30
.travis.yml
Normal file
30
.travis.yml
Normal file
@ -0,0 +1,30 @@
|
||||
sudo: required
|
||||
|
||||
dist: bionic
|
||||
|
||||
script:
|
||||
- sudo unlink /usr/bin/gcc && sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc
|
||||
- gcc --version
|
||||
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- gcc-5
|
||||
- g++-5
|
||||
|
||||
language: java
|
||||
|
||||
jdk:
|
||||
- oraclejdk11
|
||||
|
||||
env:
|
||||
global:
|
||||
- DEFOLD_BOOSTRAP_COLLECTION=/test/test.collectionc
|
||||
|
||||
script:
|
||||
- "./.travis/run.sh"
|
||||
|
||||
after_success:
|
||||
- bash <(curl -s https://codecov.io/bash)
|
@ -5,6 +5,7 @@ else
|
||||
PLATFORM="$1"
|
||||
fi
|
||||
|
||||
|
||||
echo "${PLATFORM}"
|
||||
|
||||
# {"version": "1.2.89", "sha1": "5ca3dd134cc960c35ecefe12f6dc81a48f212d40"}
|
||||
@ -15,28 +16,26 @@ echo "Using Defold dmengine_headless version ${SHA1}"
|
||||
# Create dmengine_headless and bob.jar URLs
|
||||
DMENGINE_URL="http://d.defold.com/archive/${SHA1}/engine/${PLATFORM}/dmengine_headless"
|
||||
BOB_URL="http://d.defold.com/archive/${SHA1}/bob/bob.jar"
|
||||
DMENGINE_FILE=dmengine_headless_${SHA1}
|
||||
BOB_FILE=bob_${SHA1}.jar
|
||||
|
||||
# Download dmengine_headless
|
||||
if ! [ -f ${DMENGINE_FILE} ]; then
|
||||
echo "Downloading ${DMENGINE_URL} to ${DMENGINE_FILE}"
|
||||
curl -L -o ${DMENGINE_FILE} ${DMENGINE_URL}
|
||||
chmod +x ${DMENGINE_FILE}
|
||||
fi
|
||||
echo "Downloading ${DMENGINE_URL}"
|
||||
curl -o dmengine_headless ${DMENGINE_URL}
|
||||
chmod +x dmengine_headless
|
||||
|
||||
# Download bob.jar
|
||||
if ! [ -f ${BOB_FILE} ]; then
|
||||
echo "Downloading ${BOB_URL} to ${BOB_FILE}"
|
||||
curl -L -o ${BOB_FILE} ${BOB_URL}
|
||||
fi
|
||||
echo "Downloading ${BOB_URL}"
|
||||
curl -o bob.jar ${BOB_URL}
|
||||
|
||||
# Fetch libraries
|
||||
echo "Running ${BOB_FILE} - resolving dependencies"
|
||||
java -jar ${BOB_FILE} --auth "foobar" --email "john@doe.com" resolve
|
||||
echo "Running bob.jar - resolving dependencies"
|
||||
java -jar bob.jar --auth "foobar" --email "john@doe.com" resolve
|
||||
|
||||
echo "Running ${BOB_FILE} - building"
|
||||
java -jar ${BOB_FILE} --debug build --settings=test.settings
|
||||
echo "Running bob.jar - building"
|
||||
java -jar bob.jar --debug build --keep-unused
|
||||
|
||||
echo "Starting ${DMENGINE_FILE}"
|
||||
./${DMENGINE_FILE}
|
||||
echo "Starting dmengine_headless"
|
||||
if [ -n "${DEFOLD_BOOSTRAP_COLLECTION}" ]; then
|
||||
./dmengine_headless --config=bootstrap.main_collection=${DEFOLD_BOOSTRAP_COLLECTION}
|
||||
else
|
||||
./dmengine_headless
|
||||
fi
|
60
CHANGELOG.md
Normal file
60
CHANGELOG.md
Normal file
@ -0,0 +1,60 @@
|
||||
## Monarch 2.8.0 [britzl released 2018-06-10]
|
||||
NEW: Prevent show/hide operations while busy showing/hiding another screen
|
||||
FIX: Make sure to properly finish active transitions when layout changes
|
||||
|
||||
## Monarch 2.7.0 [britzl released 2018-06-04]
|
||||
NEW: Added monarch.top([offset]) and monarch.bottom([offset]) to get screen id of top and bottom screens (w. optional offset)
|
||||
NEW: Transition messages now contain `next_screen` or `previous_screen`
|
||||
|
||||
## Monarch 2.6.1 [britzl released 2018-06-04]
|
||||
FIX: Check if screen has already been preloaded before trying to preload it again (the callback will still be invoked).
|
||||
|
||||
## Monarch 2.6.0 [britzl released 2018-06-03]
|
||||
NEW: monarch.preload() to load but not show a screen. Useful for content heavy screens that you wish to show without delay.
|
||||
|
||||
## Monarch 2.5.0 [britzl released 2018-06-01]
|
||||
NEW: Transitions will send a `transition_done` message to the creator of the transition to notify that the transition has finished. The `message` will contain which transition that was finished.
|
||||
|
||||
## Monarch 2.4.0 [britzl released 2018-05-26]
|
||||
NEW: Screen transitions are remembered so that they can be replayed when the screen layout changes.
|
||||
|
||||
## Monarch 2.3.0 [britzl released 2018-03-24]
|
||||
CHANGE: The functions in monarch.lua that previously only accepted a hash as screen id now also accepts strings (and does the conversion internally)
|
||||
|
||||
## Monarch 2.2.0 [britzl released 2018-03-19]
|
||||
NEW: Transitions now handle layout changes (via `layout_changed` message)
|
||||
NEW: Transitions can now be notified of changes in window size using transition.window_resize(width, height)
|
||||
|
||||
## Monarch 2.1 [britzl released 2017-12-27]
|
||||
NEW: Added Popup on Popup flag that allows a popup to be shown on top of another popup
|
||||
|
||||
## Monarch 2.0 [britzl released 2017-12-08]
|
||||
BREAKING CHANGE: If you are using custom screen transitions (ie your own transition functions) you need to make a change to the function. The previous function signature was ```(node, to, easing, duration, delay, url)``` where ```url``` was the URL to where the ```transition_done``` message was supposed to be posted. The new function signature for a transition function is: ```(node, to, easing, duration, delay, cb)``` where ```cb``` is a function that should be invoked when the transition is completed.
|
||||
|
||||
FIX: Fixed issues related to screen transitions.
|
||||
FIX: Code cleanup to reduce code duplication.
|
||||
FIX: Improved documentation regarding transitions.
|
||||
|
||||
## Monarch 1.4 [britzl released 2017-12-06]
|
||||
FIX: Several bugfixes for specific corner cases.
|
||||
|
||||
## Monarch 1.3 [britzl released 2017-12-01]
|
||||
FIX: monarch.back(data, cb) set the data on the previous screen not the new current screen.
|
||||
NEW: monarch.is_top(id)
|
||||
NEW: monarch.get_stack()
|
||||
NEW: monarch.in_stack(id)
|
||||
|
||||
## Monarch 1.2 [britzl released 2017-11-28]
|
||||
NEW: Message id constants exposed from the Monarch module
|
||||
NEW: Focus lost/gained contains id of next/previous screen
|
||||
|
||||
## Monarch 1.1 [britzl released 2017-11-22]
|
||||
FIX: Bugfixes for transitions and state under certain circumstances
|
||||
NEW: Added 'reload' option to show() command.
|
||||
|
||||
## Monarch 1.0 [britzl released 2017-09-28]
|
||||
First public stable release
|
||||
|
||||
## Monarch 0.9 [britzl released 2017-09-17]
|
||||
|
||||
|
33
README.md
33
README.md
@ -37,9 +37,9 @@ For proxies the recommended setup is to create one game object per screen and pe
|
||||
* **Timestep below Popup (number)** - Timestep to set on screen proxy when it is below a popup. This is useful when pausing animations and gameplay while a popup is open.
|
||||
* **Screen Keeps Input Focus When Below Popup (boolean)** - Check this if the screen should keep input focus when it is below a popup.
|
||||
* **Others Keep Input Focus When Below Screen (boolean)** - Check this if other screens should keep input focus when below this screen.
|
||||
* **Transition Url (url)** - **DEPRECATED** Optional URL to post messages to when the screen is about to be shown/hidden. Use this to trigger a transition (see the section on [transitions](#transitions)).
|
||||
* **Focus Url (url)** - **DEPRECATED** Optional URL to post messages to when the screen gains or loses focus (see the section on [screen focus](#screen-focus-gainloss)).
|
||||
* **Receiver Url (url)** - **DEPRECATED** Optional URL to post messages to using `monarch.post()`.
|
||||
* **Transition Url (url)** - Optional URL to post messages to when the screen is about to be shown/hidden. Use this to trigger a transition (see the section on [transitions](#transitions)).
|
||||
* **Focus Url (url)** - Optional URL to post messages to when the screen gains or loses focus (see the section on [screen focus](#screen-focus-gainloss)).
|
||||
* **Receiver Url (url)** - Optional URL to post messages to using `monarch.post()`.
|
||||
* **Preload (boolean)** - Check this if the screen should be preloaded and kept loaded at all times. For a collection proxy it means that it will be async loaded but not enabled at all times while not visible. This can also temporarily be achieved through the `monarch.preload()` function.
|
||||
|
||||

|
||||
@ -53,8 +53,8 @@ For factories the recommended setup is to create one game object per screen and
|
||||
* **Popup on Popup (boolean)** - Check this if the screen is a [popup](#popups) and it can be shown on top of other popups.
|
||||
* **Screen Keeps Input Focus When Below Popup (boolean)** - Check this if the screen should keep input focus when it is below a popup.
|
||||
* **Others Keep Input Focus When Below Screen (boolean)** - Check this if other screens should keep input focus when below this screen.
|
||||
* **Transition Id (hash)** - **DEPRECATED** Optional id of the game object to send a message to when the screen is about to be shown/hidden. Use this to trigger a transition (see the section on [transitions](#transitions)).
|
||||
* **Focus Id (hash)** - **DEPRECATED** Optional id of the game object to send a message to when the screen gains or loses focus (see the section on [screen focus](#screen-focus-gainloss)).
|
||||
* **Transition Id (hash)** - Optional id of the game object to send a message to when the screen is about to be shown/hidden. Use this to trigger a transition (see the section on [transitions](#transitions)).
|
||||
* **Focus Id (hash)** - Optional id of the game object to send a message to when the screen gains or loses focus (see the section on [screen focus](#screen-focus-gainloss)).
|
||||
* **Preload (boolean)** - Check this if the screen should be preloaded and kept loaded at all times. For a collection factory this means that its resources will be dynamically loaded at all times. This can also temporarily be achieved through the `monarch.preload()` function.
|
||||
|
||||

|
||||
@ -161,30 +161,18 @@ You can add optional transitions when navigating between screens. This is [descr
|
||||
|
||||
|
||||
## Screen focus gain/loss
|
||||
Monarch will send focus gain and focus loss messages if a focus change listener has been set using `monarch.on_focus_change(screen_id, fn)`
|
||||
Monarch will send focus gain and focus loss messages if a `Focus Url` (proxy) or `Focus Id` (collectionfactory) was provided when the screen was created. The focus gained message will contain the id of the previous screen and the focus loss message will contain the id of the next screen. Example:
|
||||
|
||||
DEPRECATED: ~~Monarch will send focus gain and focus loss messages if a `Focus Url` (proxy) or `Focus Id` (collectionfactory) was provided when the screen was created.~~
|
||||
|
||||
The focus gained message will contain the id of the previous screen and the focus loss message will contain the id of the next screen. Example:
|
||||
|
||||
```lua
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
monarch.on_focus_changed("foobar", function(message_id, message, sender)
|
||||
function on_message(self, message_id, message, sender)
|
||||
if message_id == monarch.FOCUS.GAINED then
|
||||
print("Focus gained, previous screen: ", message.id)
|
||||
elseif message_id == monarch.FOCUS.LOST then
|
||||
print("Focus lost, next screen: ", message.id)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
```
|
||||
|
||||
|
||||
## Callbacks
|
||||
Both the `monarch.show()` and `monarch.back()` functions take an optional callback function that will be invoked when the `transition_show_in` (or the `transition_back_in` in the case of a `monarch.back()` call) transition is completed. The transition is considered completed when a `transition_done` message has been received (see section on [transitions](#transitions) above).
|
||||
@ -192,3 +180,10 @@ Both the `monarch.show()` and `monarch.back()` functions take an optional callba
|
||||
|
||||
## Monarch API
|
||||
The full [Monarch API is documented here](/README_API.md).
|
||||
|
||||
|
||||
## Monarch FAQ
|
||||
|
||||
**Q**: Why am I getting `ERROR GAMEOBJECT: The collection 'default' could not be created since there is already a socket with the same name`?
|
||||
|
||||
**A**: Each collection that you use must be given a unique id. In this case you have more than one collection loaded with the id `default`. Select the root of each collection in the Outline panel and change the Name field in the properties panel from the default value of `default`.
|
||||
|
@ -33,38 +33,21 @@ Hide a screen that has been shown using the `no_stack` option. If used on a scre
|
||||
* `success` (boolean) - True if the process of hiding the screen was started successfully.
|
||||
|
||||
|
||||
## monarch.clear([callback])
|
||||
Clear the stack of screens completely. Any visible screen will be hidden by navigating back out from them. This operation will be added to the queue if Monarch is busy.
|
||||
|
||||
**PARAMETERS**
|
||||
* `callback` (function) - Optional function to call when the stack has been cleared.
|
||||
|
||||
|
||||
## monarch.back([options], [data], [callback])
|
||||
## monarch.back([data], [callback])
|
||||
Go back to a previous Monarch screen. This operation will be added to the queue if Monarch is busy.
|
||||
|
||||
**PARAMETERS**
|
||||
* `options` (table) - Options when showing the new screen (see below).
|
||||
* `data` (table) - Optional data to associate with the screen you are going back to. Retrieve using `monarch.data()`.
|
||||
* `callback` (function) - Optional function to call when the previous screen is visible.
|
||||
|
||||
The options table can contain the following fields:
|
||||
|
||||
* `sequential` (boolean) - If the `sequential` flag is set Monarch will start loading the screen only after the previous screen finished transitioning out.
|
||||
|
||||
|
||||
## monarch.preload(screen_id, [options], [callback])
|
||||
## monarch.preload(screen_id, [callback])
|
||||
Preload a Monarch screen. This will load but not enable the screen. This is useful for content heavy screens that you wish to be able to show without having to wait for it load. This operation will be added to the queue if Monarch is busy.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen to preload.
|
||||
* `options` (table)
|
||||
* `callback` (function) - Optional function to call when the screen is preloaded.
|
||||
|
||||
The options table can contain the following fields:
|
||||
|
||||
* `keep_loaded` (boolean) - If the `keep_loaded` flag is set Monarch will keep the screen preloaded even after a `hide()` or `back()` navigation event that normally would unload the screen.
|
||||
|
||||
|
||||
## monarch.is_preloading(screen_id)
|
||||
Check if a Monarch screen is preloading (via monarch.preload() or the Preload screen setting).
|
||||
@ -159,14 +142,6 @@ Check if a Monarch screen is visible.
|
||||
* `exists` (boolean) - True if the screen is visible.
|
||||
|
||||
|
||||
## monarch.set_timestep_below_popup(screen_id, timestep)
|
||||
Set the timestep to apply for a screen when below a popup.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen to change timestep setting for
|
||||
* `timestep` (number) - Timestep to apply
|
||||
|
||||
|
||||
## monarch.add_listener([url])
|
||||
Add a URL that will be notified of navigation events.
|
||||
|
||||
@ -182,7 +157,7 @@ Remove a previously added listener.
|
||||
|
||||
|
||||
## monarch.post(screen_id, message_id, [message])
|
||||
Post a message to a visible screen. The screen must have set a message listener using `monarch.on_post()`.
|
||||
Post a message to a visible screen. If the screen is created through a collection proxy it must have specified a receiver url. If the screen is created through a collection factory the function will post the message to all game objects within the collection.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen to post message to
|
||||
@ -194,41 +169,6 @@ Post a message to a visible screen. The screen must have set a message listener
|
||||
* `error` (string|nil) - Error message if unable to send message
|
||||
|
||||
|
||||
## monarch.on_transition(screen_id, fn)
|
||||
Set a function to be called when a screen should transition in our out. The function will receive (message_id, message, sender) with `message_id` being one of the transition constants.
|
||||
IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from the same script as this function was called.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen
|
||||
* `fn` (function) - The function to call when a transition should start
|
||||
|
||||
|
||||
## monarch.on_focus_change(screen_id, fn)
|
||||
Set a function to be called when a screen gains or loses focus. The function will receive (message_id, message, sender) with `message_id` being one of the focus change constants.
|
||||
IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from the same script as this function was called.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen
|
||||
* `fn` (function) - The function to call screen focus changes
|
||||
|
||||
|
||||
## monarch.on_post(screen_id, fn_or_url)
|
||||
Set either a function to be called when `msg.post()` is called on a specific screen or a URL where the message is sent.
|
||||
|
||||
IMPORTANT! If you provide a function you must also make sure to call `monarch.on_message(message_id, message, sender)` from the same script as this function was called.
|
||||
|
||||
**PARAMETERS**
|
||||
* `screen_id` (string|hash) - Id of the screen
|
||||
* `fn_or_url` (function) - The function to call or URL to send message to
|
||||
|
||||
|
||||
## monarch.has_missing_resources(screen_id)
|
||||
Check if a screen has any missing resources. If the screen is loaded by a collection proxy with Load Dynamically this will use `collectionproxy.missing_resources()`. For other cases this function will always return false.
|
||||
|
||||
**RETURN**
|
||||
* `result` (boolean) - true if the screen has missing resources
|
||||
|
||||
|
||||
## monarch.debug()
|
||||
Enable verbose logging of the internals of Monarch.
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
# Transitions
|
||||
You can add optional transitions when navigating between screens. The default behavior is that screen navigation is instant but if you have defined a transition for a screen Monarch will wait until the transition is completed before proceeding.
|
||||
|
||||
Transitions are configured through the `monarch.on_transition(screen_id, fn)` function. The function defines for which screen to configure transitions and sets a function to be called when a transition should be started. This function must accept (message_id, message, sender) as arguments, with `message_id` defining which type of transition to start:
|
||||
You can add optional transitions when navigating between screens. The default behavior is that screen navigation is instant but if you have defined a transition for a screen Monarch will wait until the transition is completed before proceeding. The `Transition Url` (proxy) or `Transition Id` (collectionfactory) property described above should be the URL/Id to a script with an `on_message` handlers for the following messages:
|
||||
|
||||
* `transition_show_in` (constant defined as `monarch.TRANSITION.SHOW_IN`)
|
||||
* `transition_show_out` (constant defined as `monarch.TRANSITION.SHOW_OUT`)
|
||||
@ -10,11 +8,6 @@ Transitions are configured through the `monarch.on_transition(screen_id, fn)` fu
|
||||
|
||||
When a transition is completed it is up to the developer to send a `transition_done` (constant `monarch.TRANSITION.DONE`) message back to the sender to indicate that the transition is completed and that Monarch can continue the navigation sequence.
|
||||
|
||||
## Transition URL
|
||||
This property is deprecated and will be removed in a future version of Monarch.
|
||||
|
||||
~~It is also possible to configure transitions through the `Transition Url` (proxy) or `Transition Id` (collectionfactory) property. This property must be the URL/Id to a script with an `on_message` handlers for the transition messages mentioned above.~~
|
||||
|
||||
|
||||
## Predefined transitions
|
||||
Monarch comes with a system for setting up transitions easily in a gui_script using the `monarch.transitions.gui` module. Example:
|
||||
@ -27,17 +20,15 @@ function init(self)
|
||||
-- create transitions for the node 'root'
|
||||
-- the node will slide in/out from left and right with
|
||||
-- a specific easing, duration and delay
|
||||
local transition = transitions.create(gui.get_node("root"))
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
.show_in(transitions.slide_in_right, gui.EASING_OUTQUAD, 0.6, 0)
|
||||
.show_out(transitions.slide_out_left, gui.EASING_INQUAD, 0.6, 0)
|
||||
.back_in(transitions.slide_in_left, gui.EASING_OUTQUAD, 0.6, 0)
|
||||
.back_out(transitions.slide_out_right, gui.EASING_INQUAD, 0.6, 0)
|
||||
|
||||
monarch.on_transition("foobar", transition)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
-- you can also check when a transition has completed:
|
||||
if message_id == monarch.TRANSITION.DONE and message.transition == monarch.TRANSITION.SHOW_IN then
|
||||
print("Show in done!")
|
||||
@ -49,7 +40,7 @@ It is also possible to assign transitions to multiple nodes:
|
||||
|
||||
```lua
|
||||
function init(self)
|
||||
local transition = transitions.create() -- note that no node is passed to transition.create()!
|
||||
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
|
||||
@ -114,13 +105,13 @@ end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
if message_id == hash("my_resize_message") then
|
||||
transition.window_resized(message.width, message.height)
|
||||
self.transition.window_resized(message.width, message.height)
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
## Screen stack info and transitions
|
||||
The transition message sent transition listener script contains additional information about the transition. For the `transition_show_in` and `transition_back_out` messages the message contains the previous screen id:
|
||||
The transition message sent to the Transition Url specified in the screen configuration contains additional information about the transition. For the `transition_show_in` and `transition_back_out` messages the message contains the previous screen id:
|
||||
|
||||
```lua
|
||||
function on_message(self, message_id, message, sender)
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 29 KiB |
Binary file not shown.
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 30 KiB |
@ -4,7 +4,7 @@ embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"about\"\n"
|
||||
" component: \"/example/advanced/about.gui\"\n"
|
||||
" component: \"/example/about.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/about.gui_script"
|
||||
script: "/example/about.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -5,13 +5,11 @@ function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
gui.set_render_order(15)
|
||||
|
||||
local transition = transitions.create(gui.get_node("root"))
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
.show_in(transitions.slide_in_top, gui.EASING_OUTQUAD, 0.6, 0)
|
||||
.show_out(transitions.slide_out_top, gui.EASING_INQUAD, 0.6, 0)
|
||||
.back_in(transitions.slide_in_top, gui.EASING_OUTQUAD, 0.6, 0)
|
||||
.back_out(transitions.slide_out_top, gui.EASING_INQUAD, 0.6, 0)
|
||||
|
||||
monarch.on_transition("about", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@ -29,5 +27,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
end
|
@ -1,289 +0,0 @@
|
||||
name: "basic"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "screen1"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.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"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"screen1\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/basic/screen1.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\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
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "basic"
|
||||
data: "components {\n"
|
||||
" id: \"basic\"\n"
|
||||
" component: \"/example/basic/basic.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"
|
||||
" property_decls {\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
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "screen2"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.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"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"screen2\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/basic/screen2.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\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
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "popup1"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.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"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"popup1\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"popup\"\n"
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/basic/popup1.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\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
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "popup2"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.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"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"popup2\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"popup\"\n"
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/basic/popup2.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\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
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
msg.post("#", "show_screen1")
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
if message_id == hash("show_screen1") then
|
||||
monarch.show("screen1")
|
||||
end
|
||||
end
|
@ -1,39 +0,0 @@
|
||||
name: "popup1"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"popup1\"\n"
|
||||
" component: \"/example/basic/popup1.gui\"\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"
|
||||
" property_decls {\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
|
||||
}
|
||||
}
|
@ -1,385 +0,0 @@
|
||||
script: "/example/basic/popup1.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 400.0
|
||||
y: 400.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.5019608
|
||||
y: 0.6
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "root"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_MANUAL
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "showpopup2"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
parent: "root"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "SHOW POPUP 2"
|
||||
font: "example"
|
||||
id: "showtext"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "showpopup2"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: -100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "closepopup"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
parent: "root"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "CLOSE"
|
||||
font: "example"
|
||||
id: "closetext"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "closepopup"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 40.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "THIS IS POPUP 1"
|
||||
font: "example"
|
||||
id: "id"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "root"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
@ -1,16 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
gui.set_render_order(14)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.pressed then
|
||||
if gui.pick_node(gui.get_node("showpopup2"), action.x, action.y) then
|
||||
monarch.show("popup2")
|
||||
elseif gui.pick_node(gui.get_node("closepopup"), action.x, action.y) then
|
||||
monarch.back()
|
||||
end
|
||||
end
|
||||
end
|
@ -1,39 +0,0 @@
|
||||
name: "popup2"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"popup2\"\n"
|
||||
" component: \"/example/basic/popup2.gui\"\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"
|
||||
" property_decls {\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
|
||||
}
|
||||
}
|
@ -1,385 +0,0 @@
|
||||
script: "/example/basic/popup2.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 400.0
|
||||
y: 400.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.5019608
|
||||
y: 0.7019608
|
||||
z: 0.7019608
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "root"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_MANUAL
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "showpopup2"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
parent: "root"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "SHOW POPUP 2"
|
||||
font: "example"
|
||||
id: "showtext"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "showpopup2"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 40.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "THIS IS POPUP 2"
|
||||
font: "example"
|
||||
id: "id"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "root"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: -100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "closepopup"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
parent: "root"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "CLOSE"
|
||||
font: "example"
|
||||
id: "closetext"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "closepopup"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
@ -1,16 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
gui.set_render_order(15)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.pressed then
|
||||
if gui.pick_node(gui.get_node("showpopup2"), action.x, action.y) then
|
||||
monarch.show("popup2")
|
||||
elseif gui.pick_node(gui.get_node("closepopup"), action.x, action.y) then
|
||||
monarch.back()
|
||||
end
|
||||
end
|
||||
end
|
@ -1,37 +0,0 @@
|
||||
name: "screen1"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"screen1\"\n"
|
||||
" component: \"/example/basic/screen1.gui\"\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
|
||||
}
|
||||
}
|
@ -1,325 +0,0 @@
|
||||
script: "/example/basic/screen1.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "showscreen2"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "SHOW SCREEN 2"
|
||||
font: "example"
|
||||
id: "showscreen2text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "showscreen2"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 10.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 40.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "THIS IS SCREEN 1"
|
||||
font: "example"
|
||||
id: "id"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_S
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 450.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "showpopup1"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "SHOW POPUP 1"
|
||||
font: "example"
|
||||
id: "showpopup1text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "showpopup1"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
@ -1,15 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.pressed then
|
||||
if gui.pick_node(gui.get_node("showscreen2"), action.x, action.y) then
|
||||
monarch.show("screen2")
|
||||
elseif gui.pick_node(gui.get_node("showpopup1"), action.x, action.y) then
|
||||
monarch.show("popup1")
|
||||
end
|
||||
end
|
||||
end
|
@ -1,37 +0,0 @@
|
||||
name: "screen2"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"screen2\"\n"
|
||||
" component: \"/example/basic/screen2.gui\"\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
|
||||
}
|
||||
}
|
@ -1,325 +0,0 @@
|
||||
script: "/example/basic/screen2.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "backbutton"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "BACK"
|
||||
font: "example"
|
||||
id: "text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "backbutton"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 10.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 40.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "THIS IS SCREEN 2"
|
||||
font: "example"
|
||||
id: "id"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_S
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 450.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "showpopup1"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_AUTO
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "SHOW POPUP 1"
|
||||
font: "example"
|
||||
id: "showpopup1text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "showpopup1"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
@ -1,15 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.pressed then
|
||||
if gui.pick_node(gui.get_node("backbutton"), action.x, action.y) then
|
||||
monarch.back()
|
||||
elseif gui.pick_node(gui.get_node("showpopup1"), action.x, action.y) then
|
||||
monarch.show("popup1")
|
||||
end
|
||||
end
|
||||
end
|
@ -4,7 +4,7 @@ embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"confirm\"\n"
|
||||
" component: \"/example/advanced/confirm.gui\"\n"
|
||||
" component: \"/example/confirm.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/confirm.gui_script"
|
||||
script: "/example/confirm.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -7,13 +7,11 @@ function init(self)
|
||||
self.no = gui.get_node("no_button")
|
||||
gui.set_render_order(15)
|
||||
|
||||
local transition = transitions.create(gui.get_node("root"))
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
.show_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0)
|
||||
.show_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0)
|
||||
.back_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0)
|
||||
.back_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0)
|
||||
|
||||
monarch.on_transition("confirm", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@ -29,7 +27,7 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
elseif gui.pick_node(self.no, action.x, action.y) then
|
||||
print("no")
|
||||
monarch.back(nil, nil, function()
|
||||
monarch.back(function()
|
||||
print("back from popup done")
|
||||
end)
|
||||
end
|
||||
@ -37,5 +35,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
end
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/debug.gui_script"
|
||||
script: "/example/debug.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -1,4 +1,4 @@
|
||||
name: "advanced"
|
||||
name: "example"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "menu"
|
||||
@ -21,15 +21,22 @@ embedded_instances {
|
||||
" value: \"menu\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_id\"\n"
|
||||
" value: \"/go\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"focus_id\"\n"
|
||||
" value: \"/go\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/example/advanced/menu.collection\\\"\\n"
|
||||
" data: \"prototype: \\\"/example/menu.collection\\\"\\n"
|
||||
"load_dynamically: true\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
@ -65,7 +72,7 @@ embedded_instances {
|
||||
id: "main"
|
||||
data: "components {\n"
|
||||
" id: \"main\"\n"
|
||||
" component: \"/example/advanced/advanced.script\"\n"
|
||||
" component: \"/example/main.script\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
@ -77,12 +84,10 @@ embedded_instances {
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"components {\n"
|
||||
" id: \"gui\"\n"
|
||||
" component: \"/example/advanced/debug.gui\"\n"
|
||||
" component: \"/example/debug.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
@ -94,8 +99,6 @@ embedded_instances {
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
""
|
||||
position {
|
||||
@ -136,13 +139,16 @@ embedded_instances {
|
||||
" value: \"pregame\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"pregame:/go#pregame\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/advanced/pregame.collection\\\"\\n"
|
||||
" data: \"collection: \\\"/example/pregame.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
@ -196,13 +202,16 @@ embedded_instances {
|
||||
" value: \"game\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"game:/go#game\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/advanced/game.collection\\\"\\n"
|
||||
" data: \"collection: \\\"/example/game.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
@ -267,17 +276,25 @@ embedded_instances {
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"about:/go#about\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"focus_url\"\n"
|
||||
" value: \"about:/go#about\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"preload\"\n"
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/advanced/about.collection\\\"\\n"
|
||||
" data: \"collection: \\\"/example/about.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
@ -346,13 +363,16 @@ embedded_instances {
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"confirm:/go#confirm\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/advanced/confirm.collection\\\"\\n"
|
||||
" data: \"collection: \\\"/example/confirm.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
@ -406,15 +426,12 @@ embedded_instances {
|
||||
" value: \"background\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/example/advanced/background.collection\\\"\\n"
|
||||
" data: \"prototype: \\\"/example/background.collection\\\"\\n"
|
||||
"load_dynamically: false\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
@ -4,7 +4,7 @@ embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"game\"\n"
|
||||
" component: \"/example/advanced/game.gui\"\n"
|
||||
" component: \"/example/game.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/game.gui_script"
|
||||
script: "/example/game.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -7,8 +7,7 @@ function init(self)
|
||||
local data = monarch.data(hash("game"))
|
||||
gui.set_text(gui.get_node("level"), tostring(data.level))
|
||||
|
||||
local transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
monarch.on_transition("game", transition)
|
||||
self.transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@ -22,5 +21,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
end
|
@ -4,7 +4,7 @@ embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"menu\"\n"
|
||||
" component: \"/example/advanced/menu.gui\"\n"
|
||||
" component: \"/example/menu.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
||||
@ -16,8 +16,6 @@ embedded_instances {
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
""
|
||||
position {
|
||||
@ -78,15 +76,12 @@ embedded_instances {
|
||||
" value: \"/go\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/example/advanced/popup.collection\\\"\\n"
|
||||
" data: \"prototype: \\\"/example/popup.collection\\\"\\n"
|
||||
"load_dynamically: false\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/menu.gui_script"
|
||||
script: "/example/menu.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -8,8 +8,7 @@ function init(self)
|
||||
|
||||
gui.animate(gui.get_node("spinner"), gui.PROP_ROTATION, vmath.vector3(0, 0, -360), gui.EASING_INOUTQUAD, 2, 0, nil, gui.PLAYBACK_LOOP_FORWARD)
|
||||
|
||||
local transition = transitions.fade_in_out(gui.get_node("root"), 0.6, 0)
|
||||
monarch.on_transition("menu", transition)
|
||||
self.transition = transitions.fade_in_out(gui.get_node("root"), 0.6, 0)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@ -29,7 +28,7 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
if message_id == monarch.FOCUS.GAINED then
|
||||
gui.set_text(gui.get_node("timestamp"), os.date())
|
||||
end
|
@ -4,7 +4,7 @@ embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"popup\"\n"
|
||||
" component: \"/example/advanced/popup.gui\"\n"
|
||||
" component: \"/example/popup.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/popup.gui_script"
|
||||
script: "/example/popup.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -10,12 +10,11 @@ function init(self)
|
||||
|
||||
gui.animate(gui.get_node("spinner"), gui.PROP_ROTATION, vmath.vector3(0, 0, -360), gui.EASING_INOUTQUAD, 2, 0, nil, gui.PLAYBACK_LOOP_FORWARD)
|
||||
|
||||
local transition = transitions.create(gui.get_node("root"))
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
.show_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0)
|
||||
.show_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0)
|
||||
.back_in(transitions.scale_in, gui.EASING_OUTBACK, 0.3, 0)
|
||||
.back_out(transitions.scale_out, gui.EASING_INBACK, 0.3, 0)
|
||||
monarch.on_transition("popup", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@ -27,7 +26,7 @@ function on_input(self, action_id, action)
|
||||
end)
|
||||
elseif gui.pick_node(self.cancel, action.x, action.y) then
|
||||
print("cancel")
|
||||
monarch.back(nil, nil, function()
|
||||
monarch.back(function()
|
||||
print("back from popup done")
|
||||
end)
|
||||
elseif gui.pick_node(self.about, action.x, action.y) then
|
||||
@ -40,5 +39,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
end
|
@ -4,7 +4,7 @@ embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"pregame\"\n"
|
||||
" component: \"/example/advanced/pregame.gui\"\n"
|
||||
" component: \"/example/pregame.gui\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
" y: 0.0\n"
|
@ -1,4 +1,4 @@
|
||||
script: "/example/advanced/pregame.gui_script"
|
||||
script: "/example/pregame.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
@ -6,8 +6,7 @@ function init(self)
|
||||
self.play = gui.get_node("play_button")
|
||||
self.back = gui.get_node("back_button")
|
||||
|
||||
local transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
monarch.on_transition("pregame", transition)
|
||||
self.transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@ -19,7 +18,7 @@ function on_input(self, action_id, action)
|
||||
end)
|
||||
elseif gui.pick_node(self.back, action.x, action.y) then
|
||||
print("back")
|
||||
monarch.back(nil, nil, function()
|
||||
monarch.back(function()
|
||||
print("back from pregame done")
|
||||
end)
|
||||
end
|
||||
@ -27,5 +26,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
end
|
@ -1,159 +0,0 @@
|
||||
name: "slidingwindow"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"slidingwindow\"\n"
|
||||
" component: \"/example/slidingwindow/slidingwindow.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"
|
||||
" property_decls {\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
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "window1"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.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"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"window1\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/slidingwindow/window1.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\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
|
||||
}
|
||||
}
|
||||
embedded_instances {
|
||||
id: "window2"
|
||||
data: "components {\n"
|
||||
" id: \"screen_proxy\"\n"
|
||||
" component: \"/monarch/screen_proxy.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"
|
||||
" properties {\n"
|
||||
" id: \"screen_id\"\n"
|
||||
" value: \"window2\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
" type: \"collectionproxy\"\n"
|
||||
" data: \"collection: \\\"/example/slidingwindow/window2.collection\\\"\\n"
|
||||
"exclude: false\\n"
|
||||
"\"\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
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
|
||||
function init(self)
|
||||
monarch.debug()
|
||||
msg.post("@render:/", "clear_color", { color = vmath.vector4(0.4, 0.6, 0.8,1.0) })
|
||||
msg.post("#", "init_monarch") -- wait until init() has been called for all screen.script instances
|
||||
monarch.add_listener()
|
||||
end
|
||||
|
||||
function final(self)
|
||||
monarch.remove_listener()
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
if message_id == hash("init_monarch") then
|
||||
monarch.show(hash("window1"))
|
||||
elseif message_id == monarch.SCREEN_TRANSITION_IN_STARTED then
|
||||
print("Monarch screen transition in started", message.screen)
|
||||
elseif message_id == monarch.SCREEN_TRANSITION_IN_FINISHED then
|
||||
print("Monarch screen transition in finished", message.screen)
|
||||
elseif message_id == monarch.SCREEN_TRANSITION_OUT_STARTED then
|
||||
print("Monarch screen transition out started", message.screen)
|
||||
elseif message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED then
|
||||
print("Monarch screen transition out finished", message.screen)
|
||||
elseif message_id == monarch.SCREEN_TRANSITION_FAILED then
|
||||
print("Monarch screen transition failed")
|
||||
end
|
||||
end
|
@ -1,39 +0,0 @@
|
||||
name: "window1"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"window1\"\n"
|
||||
" component: \"/example/slidingwindow/window1.gui\"\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"
|
||||
" property_decls {\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
|
||||
}
|
||||
}
|
@ -1,261 +0,0 @@
|
||||
script: "/example/slidingwindow/window1.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 640.0
|
||||
y: 1136.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.3019608
|
||||
y: 0.3019608
|
||||
z: 0.3019608
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "bg"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_STRETCH
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_MANUAL
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 50.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "button"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
parent: "bg"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_MANUAL
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 50.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "WINDOW 2"
|
||||
font: "example"
|
||||
id: "text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "button"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 338.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 2.0
|
||||
y: 2.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "WINDOW 1"
|
||||
font: "example"
|
||||
id: "title"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "bg"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
@ -1,35 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
local transitions = require "monarch.transitions.gui"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
|
||||
local DURATION = 0.3
|
||||
local transition = transitions.create(gui.get_node("bg"))
|
||||
.show_in(transitions.slide_in_right, gui.EASING_LINEAR, DURATION, 0)
|
||||
.show_out(transitions.slide_out_left, gui.EASING_LINEAR, DURATION, 0)
|
||||
.back_in(transitions.slide_in_left, gui.EASING_LINEAR, DURATION, 0)
|
||||
.back_out(transitions.slide_out_right, gui.EASING_LINEAR, DURATION, 0)
|
||||
|
||||
monarch.on_transition("window1", transition)
|
||||
|
||||
monarch.on_focus_changed("window1", function(message_id, message)
|
||||
if message_id == monarch.FOCUS.GAINED then
|
||||
print("window1 gained focus")
|
||||
elseif message_id == monarch.FOCUS.LOST then
|
||||
print("window1 lost focus")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.released then
|
||||
if gui.pick_node(gui.get_node("button"), action.x, action.y) then
|
||||
monarch.show("window2")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
@ -1,39 +0,0 @@
|
||||
name: "window2"
|
||||
scale_along_z: 0
|
||||
embedded_instances {
|
||||
id: "go"
|
||||
data: "components {\n"
|
||||
" id: \"window2\"\n"
|
||||
" component: \"/example/slidingwindow/window2.gui\"\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"
|
||||
" property_decls {\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
|
||||
}
|
||||
}
|
@ -1,261 +0,0 @@
|
||||
script: "/example/slidingwindow/window2.gui_script"
|
||||
fonts {
|
||||
name: "example"
|
||||
font: "/assets/example.font"
|
||||
}
|
||||
background_color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 320.0
|
||||
y: 568.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 640.0
|
||||
y: 1136.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.3019608
|
||||
y: 0.3019608
|
||||
z: 0.3019608
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "bg"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_STRETCH
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_MANUAL
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 50.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_BOX
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
texture: ""
|
||||
id: "button"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
parent: "bg"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 0.0
|
||||
}
|
||||
clipping_mode: CLIPPING_MODE_NONE
|
||||
clipping_visible: true
|
||||
clipping_inverted: false
|
||||
alpha: 1.0
|
||||
template_node_child: false
|
||||
size_mode: SIZE_MODE_MANUAL
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 50.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "BACK"
|
||||
font: "example"
|
||||
id: "text"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "button"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
nodes {
|
||||
position {
|
||||
x: 0.0
|
||||
y: 338.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
rotation {
|
||||
x: 0.0
|
||||
y: 0.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
scale {
|
||||
x: 2.0
|
||||
y: 2.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
size {
|
||||
x: 200.0
|
||||
y: 100.0
|
||||
z: 0.0
|
||||
w: 1.0
|
||||
}
|
||||
color {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
type: TYPE_TEXT
|
||||
blend_mode: BLEND_MODE_ALPHA
|
||||
text: "WINDOW 2"
|
||||
font: "example"
|
||||
id: "title"
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
outline {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
shadow {
|
||||
x: 1.0
|
||||
y: 1.0
|
||||
z: 1.0
|
||||
w: 1.0
|
||||
}
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
line_break: false
|
||||
parent: "bg"
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
alpha: 1.0
|
||||
outline_alpha: 1.0
|
||||
shadow_alpha: 1.0
|
||||
template_node_child: false
|
||||
text_leading: 1.0
|
||||
text_tracking: 0.0
|
||||
custom_type: 0
|
||||
enabled: true
|
||||
visible: true
|
||||
}
|
||||
material: "/builtins/materials/gui.material"
|
||||
adjust_reference: ADJUST_REFERENCE_PARENT
|
||||
max_nodes: 512
|
@ -1,27 +0,0 @@
|
||||
local monarch = require "monarch.monarch"
|
||||
local transitions = require "monarch.transitions.gui"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
|
||||
local DURATION = 0.3
|
||||
local transition = transitions.create(gui.get_node("bg"))
|
||||
.show_in(transitions.slide_in_right, gui.EASING_LINEAR, DURATION, 0)
|
||||
.show_out(transitions.slide_out_left, gui.EASING_LINEAR, DURATION, 0)
|
||||
.back_in(transitions.slide_in_left, gui.EASING_LINEAR, DURATION, 0)
|
||||
.back_out(transitions.slide_out_right, gui.EASING_LINEAR, DURATION, 0)
|
||||
|
||||
monarch.on_transition("window2", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
if action_id == hash("touch") and action.released then
|
||||
if gui.pick_node(gui.get_node("button"), action.x, action.y) then
|
||||
monarch.back()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
@ -1,11 +1,10 @@
|
||||
[project]
|
||||
title = Monarch
|
||||
version = 0.9
|
||||
dependencies#0 = https://github.com/britzl/deftest/archive/2.7.0.zip
|
||||
dependencies#1 = https://github.com/defold/lua-language-server/releases/download/v0.0.3/release.zip
|
||||
dependencies = https://github.com/britzl/deftest/archive/2.7.0.zip
|
||||
|
||||
[bootstrap]
|
||||
main_collection = /example/advanced/advanced.collectionc
|
||||
main_collection = /example/example.collectionc
|
||||
|
||||
[input]
|
||||
game_binding = /input/game.input_bindingc
|
||||
|
@ -79,8 +79,15 @@ 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
|
||||
|
||||
|
@ -1,27 +1,17 @@
|
||||
local callback_tracker = require "monarch.utils.callback_tracker"
|
||||
local async = require "monarch.utils.async"
|
||||
|
||||
local M = {}
|
||||
|
||||
local WAITFOR_COWAIT = hash("waitfor_cowait")
|
||||
local WAITFOR_CONTEXT = hash("waitfor_monarch_context")
|
||||
local WAITFOR_PROXY_LOADED = hash("waitfor_proxy_loaded")
|
||||
local WAITFOR_PROXY_UNLOADED = hash("waitfor_proxy_unloaded")
|
||||
local WAITFOR_TRANSITION_DONE = hash("waitfor_transition_done")
|
||||
local CONTEXT = hash("monarch_context")
|
||||
local PROXY_LOADED = hash("proxy_loaded")
|
||||
local PROXY_UNLOADED = hash("proxy_unloaded")
|
||||
|
||||
local MSG_CONTEXT = hash("monarch_context")
|
||||
local MSG_PROXY_LOADED = hash("proxy_loaded")
|
||||
local MSG_PROXY_UNLOADED = hash("proxy_unloaded")
|
||||
local MSG_LAYOUT_CHANGED = hash("layout_changed")
|
||||
local MSG_RELEASE_INPUT_FOCUS = hash("release_input_focus")
|
||||
local MSG_ACQUIRE_INPUT_FOCUS = hash("acquire_input_focus")
|
||||
local MSG_ASYNC_LOAD = hash("async_load")
|
||||
local MSG_UNLOAD = hash("unload")
|
||||
local MSG_ENABLE = hash("enable")
|
||||
local MSG_DISABLE = hash("disable")
|
||||
|
||||
|
||||
local DEPRECATED = hash("__DEPRECATED__")
|
||||
local RELEASE_INPUT_FOCUS = hash("release_input_focus")
|
||||
local ACQUIRE_INPUT_FOCUS = hash("acquire_input_focus")
|
||||
local ASYNC_LOAD = hash("async_load")
|
||||
local UNLOAD = hash("unload")
|
||||
local ENABLE = hash("enable")
|
||||
local DISABLE = hash("disable")
|
||||
|
||||
-- transition messages
|
||||
M.TRANSITION = {}
|
||||
@ -43,8 +33,6 @@ M.SCREEN_TRANSITION_OUT_STARTED = hash("monarch_screen_transition_out_started")
|
||||
M.SCREEN_TRANSITION_OUT_FINISHED = hash("monarch_screen_transition_out_finished")
|
||||
M.SCREEN_TRANSITION_FAILED = hash("monarch_screen_transition_failed")
|
||||
|
||||
local WAIT_FOR_TRANSITION = true
|
||||
local DO_NOT_WAIT_FOR_TRANSITION = false
|
||||
|
||||
-- all registered screens
|
||||
local screens = {}
|
||||
@ -59,6 +47,7 @@ local transition_listeners = {}
|
||||
-- monarch is considered busy while there are active transitions
|
||||
local active_transition_count = 0
|
||||
|
||||
|
||||
local function log(...) end
|
||||
|
||||
function M.debug()
|
||||
@ -90,13 +79,10 @@ local function assign(to, from)
|
||||
return to
|
||||
end
|
||||
|
||||
local function cowait(screen, delay)
|
||||
log("cowait()", screen.id, delay)
|
||||
local function cowait(delay)
|
||||
local co = coroutine.running()
|
||||
assert(co, "You must run this from within a coroutine")
|
||||
screen.wait_for = WAITFOR_COWAIT
|
||||
timer.delay(delay, false, function()
|
||||
screen.wait_for = nil
|
||||
assert(coroutine.resume(co))
|
||||
end)
|
||||
coroutine.yield()
|
||||
@ -107,8 +93,8 @@ end
|
||||
local queue = {}
|
||||
|
||||
local function queue_error(message)
|
||||
log("queue() error - clearing queue")
|
||||
print(message)
|
||||
log("queue() error - clearing queue")
|
||||
while next(queue) do
|
||||
table.remove(queue)
|
||||
end
|
||||
@ -120,7 +106,7 @@ process_queue = function()
|
||||
log("queue() busy")
|
||||
return
|
||||
end
|
||||
local action = table.remove(queue, 1)
|
||||
action = table.remove(queue, 1)
|
||||
if not action then
|
||||
log("queue() empty")
|
||||
return
|
||||
@ -146,49 +132,23 @@ local function notify_transition_listeners(message_id, message)
|
||||
end
|
||||
end
|
||||
|
||||
local function find_screen(url_to_find)
|
||||
local function find(url)
|
||||
local function screen_from_proxy(proxy)
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.script == url or screen.proxy == url then
|
||||
if screen.proxy == proxy then
|
||||
return screen
|
||||
end
|
||||
end
|
||||
end
|
||||
return find(msg.url()) or find(url_to_find)
|
||||
end
|
||||
|
||||
local function find_transition_screen(url_to_find)
|
||||
local function find(url)
|
||||
local function screen_from_script()
|
||||
local url = msg.url()
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.transition_url == url or screen.script == url or screen.proxy == url then
|
||||
if screen.script == url then
|
||||
return screen
|
||||
end
|
||||
end
|
||||
end
|
||||
return find(msg.url()) or find(url_to_find)
|
||||
end
|
||||
|
||||
local function find_focus_screen(url_to_find)
|
||||
local function find(url)
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.focus_url == url or screen.script == url or screen.proxy == url then
|
||||
return screen
|
||||
end
|
||||
end
|
||||
end
|
||||
return find(msg.url()) or find(url_to_find)
|
||||
end
|
||||
|
||||
local function find_post_receiver_screen(url_to_find)
|
||||
local function find(url)
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.receiver_url == url or screen.script == url or screen.proxy == url then
|
||||
return screen
|
||||
end
|
||||
end
|
||||
end
|
||||
return find(msg.url()) or find(url_to_find)
|
||||
end
|
||||
|
||||
--- Check if a screen exists in the current screen stack
|
||||
-- @param id (string|hash)
|
||||
@ -221,17 +181,6 @@ end
|
||||
-- @param id (string|hash)
|
||||
-- @return true if the screen is visible
|
||||
function M.is_visible(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)))
|
||||
return screens[id].visible
|
||||
end
|
||||
|
||||
|
||||
--- Check if a screen is loaded
|
||||
-- @param id (string|hash)
|
||||
-- @return true if the screen is loaded
|
||||
function M.is_loaded(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)))
|
||||
@ -283,6 +232,12 @@ end
|
||||
-- keep input focus when below a popup
|
||||
-- * others_keep_input_focus_when_below_screen - If screens below this
|
||||
-- screen should keep input focus
|
||||
-- * transition_url - URL to a script that is responsible for the
|
||||
-- screen transitions
|
||||
-- * focus_url - URL to a script that is to be notified of focus
|
||||
-- lost/gained events
|
||||
-- * receiver_url - URL to a script that is to receive messages sent
|
||||
-- using monarch.send()
|
||||
-- * auto_preload - true if the screen should be automatically preloaded
|
||||
function M.register_proxy(id, proxy, settings)
|
||||
assert(proxy, "You must provide a collection proxy URL")
|
||||
@ -292,15 +247,6 @@ function M.register_proxy(id, proxy, settings)
|
||||
screen.focus_url = settings and settings.focus_url
|
||||
screen.receiver_url = settings and settings.receiver_url
|
||||
screen.auto_preload = settings and settings.auto_preload
|
||||
if screen.transition_url.fragment == DEPRECATED then
|
||||
screen.transition_url = nil
|
||||
end
|
||||
if screen.focus_url.fragment == DEPRECATED then
|
||||
screen.focus_url = nil
|
||||
end
|
||||
if screen.receiver_url.fragment == DEPRECATED then
|
||||
screen.receiver_url = nil
|
||||
end
|
||||
if screen.auto_preload then
|
||||
M.preload(id)
|
||||
end
|
||||
@ -323,6 +269,10 @@ M.register = M.register_proxy
|
||||
-- keep input focus when below a popup
|
||||
-- * others_keep_input_focus_when_below_screen - If screens below this
|
||||
-- screen should keep input focus
|
||||
-- * transition_id - Id of the game object in the collection that is responsible
|
||||
-- for the screen transitions
|
||||
-- * focus_id - Id of the game object in the collection that is to be notified
|
||||
-- of focus lost/gained events
|
||||
-- * auto_preload - true if the screen should be automatically preloaded
|
||||
function M.register_factory(id, factory, settings)
|
||||
assert(factory, "You must provide a collection factory URL")
|
||||
@ -331,13 +281,6 @@ function M.register_factory(id, factory, settings)
|
||||
screen.transition_id = settings and settings.transition_id
|
||||
screen.focus_id = settings and settings.focus_id
|
||||
screen.auto_preload = settings and settings.auto_preload
|
||||
|
||||
if screen.transition_id == DEPRECATED then
|
||||
screen.transition_id = nil
|
||||
end
|
||||
if screen.focus_id == DEPRECATED then
|
||||
screen.focus_id = nil
|
||||
end
|
||||
if screen.auto_preload then
|
||||
M.preload(id)
|
||||
end
|
||||
@ -353,26 +296,16 @@ function M.unregister(id)
|
||||
log("unregister()", id)
|
||||
local screen = screens[id]
|
||||
screens[id] = nil
|
||||
-- remove screen from stack
|
||||
for i = #stack, 1, -1 do
|
||||
if stack[i].id == id then
|
||||
table.remove(stack, i)
|
||||
end
|
||||
end
|
||||
screen.unregistered = true
|
||||
if screen.wait_for then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
end
|
||||
|
||||
local function acquire_input(screen)
|
||||
log("acquire_input()", screen.id)
|
||||
if not screen.input then
|
||||
if screen.proxy then
|
||||
msg.post(screen.script, MSG_ACQUIRE_INPUT_FOCUS)
|
||||
msg.post(screen.script, ACQUIRE_INPUT_FOCUS)
|
||||
elseif screen.factory then
|
||||
for id,instance in pairs(screen.factory_ids) do
|
||||
msg.post(instance, MSG_ACQUIRE_INPUT_FOCUS)
|
||||
msg.post(instance, ACQUIRE_INPUT_FOCUS)
|
||||
end
|
||||
end
|
||||
screen.input = true
|
||||
@ -390,10 +323,10 @@ local function release_input(screen, next_screen)
|
||||
local release_focus = not keep_if_next_is_popup and not keep_when_below_next
|
||||
if release_focus then
|
||||
if screen.proxy then
|
||||
msg.post(screen.script, MSG_RELEASE_INPUT_FOCUS)
|
||||
msg.post(screen.script, RELEASE_INPUT_FOCUS)
|
||||
elseif screen.factory then
|
||||
for id,instance in pairs(screen.factory_ids) do
|
||||
msg.post(instance, MSG_RELEASE_INPUT_FOCUS)
|
||||
msg.post(instance, RELEASE_INPUT_FOCUS)
|
||||
end
|
||||
end
|
||||
screen.input = false
|
||||
@ -403,25 +336,22 @@ end
|
||||
|
||||
local function change_context(screen)
|
||||
log("change_context()", screen.id)
|
||||
screen.wait_for = WAITFOR_CONTEXT
|
||||
msg.post(screen.script, MSG_CONTEXT, { id = screen.id })
|
||||
screen.wait_for = CONTEXT
|
||||
msg.post(screen.script, CONTEXT)
|
||||
coroutine.yield()
|
||||
screen.wait_for = nil
|
||||
end
|
||||
|
||||
local function unload(screen, force)
|
||||
if screen.unregistered then return end
|
||||
if screen.proxy then
|
||||
log("unload() proxy", screen.id)
|
||||
if screen.auto_preload and not force then
|
||||
if screen.loaded then
|
||||
msg.post(screen.proxy, MSG_DISABLE)
|
||||
msg.post(screen.proxy, DISABLE)
|
||||
screen.loaded = false
|
||||
end
|
||||
screen.preloaded = true
|
||||
else
|
||||
screen.wait_for = WAITFOR_PROXY_UNLOADED
|
||||
msg.post(screen.proxy, MSG_UNLOAD)
|
||||
screen.wait_for = PROXY_UNLOADED
|
||||
msg.post(screen.proxy, UNLOAD)
|
||||
coroutine.yield()
|
||||
screen.loaded = false
|
||||
screen.preloaded = false
|
||||
@ -430,10 +360,8 @@ local function unload(screen, force)
|
||||
elseif screen.factory then
|
||||
log("unload() factory", screen.id)
|
||||
for id, instance in pairs(screen.factory_ids) do
|
||||
if go.exists(instance) then
|
||||
go.delete(instance)
|
||||
end
|
||||
end
|
||||
screen.factory_ids = nil
|
||||
if screen.auto_preload and not force then
|
||||
screen.loaded = false
|
||||
@ -447,8 +375,8 @@ local function unload(screen, force)
|
||||
-- we need to wait here in case the unloaded screen contained any screens
|
||||
-- if this is the case we need to let these sub-screens have their final()
|
||||
-- functions called so that they have time to call unregister()
|
||||
cowait(screen, 0)
|
||||
cowait(screen, 0)
|
||||
cowait(0)
|
||||
cowait(0)
|
||||
end
|
||||
|
||||
|
||||
@ -464,19 +392,16 @@ local function preload(screen)
|
||||
screen.preloading = true
|
||||
if screen.proxy then
|
||||
log("preload() proxy")
|
||||
if M.has_missing_resources(screen.id) then
|
||||
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 = WAITFOR_PROXY_LOADED
|
||||
msg.post(screen.proxy, MSG_ASYNC_LOAD)
|
||||
screen.wait_for = PROXY_LOADED
|
||||
msg.post(screen.proxy, ASYNC_LOAD)
|
||||
coroutine.yield()
|
||||
screen.wait_for = nil
|
||||
if screen.unregistered then
|
||||
return false, "Screen was unregistered while loading"
|
||||
end
|
||||
elseif screen.factory then
|
||||
log("preload() factory")
|
||||
if collectionfactory.get_status(screen.factory) == collectionfactory.STATUS_UNLOADED then
|
||||
@ -484,9 +409,6 @@ local function preload(screen)
|
||||
assert(coroutine.resume(screen.co))
|
||||
end)
|
||||
coroutine.yield()
|
||||
if screen.unregistered then
|
||||
return false, "Screen was unregistered while loading"
|
||||
end
|
||||
end
|
||||
|
||||
if collectionfactory.get_status(screen.factory) ~= collectionfactory.STATUS_LOADED then
|
||||
@ -518,30 +440,23 @@ local function load(screen)
|
||||
end
|
||||
|
||||
if screen.proxy then
|
||||
msg.post(screen.proxy, MSG_ENABLE)
|
||||
msg.post(screen.proxy, ENABLE)
|
||||
elseif screen.factory then
|
||||
screen.factory_ids = collectionfactory.create(screen.factory)
|
||||
if screen.transition_id then
|
||||
screen.transition_url = screen.factory_ids[screen.transition_id]
|
||||
end
|
||||
if screen.focus_id then
|
||||
screen.focus_url = screen.factory_ids[screen.focus_id]
|
||||
end
|
||||
end
|
||||
screen.loaded = true
|
||||
screen.preloaded = false
|
||||
return true
|
||||
end
|
||||
|
||||
local function transition(screen, message_id, message, wait)
|
||||
local function transition(screen, message_id, message)
|
||||
log("transition()", screen.id)
|
||||
if screen.unregistered then return end
|
||||
if screen.transition_url then
|
||||
screen.wait_for = WAITFOR_TRANSITION_DONE
|
||||
screen.wait_for = M.TRANSITION.DONE
|
||||
msg.post(screen.transition_url, message_id, message)
|
||||
if wait then
|
||||
coroutine.yield()
|
||||
end
|
||||
screen.wait_for = nil
|
||||
else
|
||||
log("transition() no transition url - ignoring")
|
||||
@ -559,15 +474,13 @@ end
|
||||
|
||||
local function focus_lost(screen, next_screen)
|
||||
log("focus_lost()", screen.id)
|
||||
if screen.unregistered then return end
|
||||
if screen.focus_url then
|
||||
msg.post(screen.focus_url, M.FOCUS.LOST, { id = next_screen and next_screen.id })
|
||||
-- if there's no transition on the screen losing focus and it gets
|
||||
-- unloaded this will happen before the focus_lost message reaches
|
||||
-- the focus_url
|
||||
-- we add a delay to ensure the message queue has time to be processed
|
||||
cowait(screen, 0)
|
||||
cowait(screen, 0)
|
||||
cowait(0)
|
||||
else
|
||||
log("focus_lost() no focus url - ignoring")
|
||||
end
|
||||
@ -625,21 +538,8 @@ local function enable(screen, previous_screen)
|
||||
end)
|
||||
end
|
||||
|
||||
local function show_out(screen, next_screen, wait_for_transition, cb)
|
||||
local function show_out(screen, next_screen, cb)
|
||||
log("show_out()", screen.id)
|
||||
assert(wait_for_transition ~= nil)
|
||||
-- make sure the screen is loaded. scenario:
|
||||
-- show A - stack [A]
|
||||
-- - show_in for A
|
||||
-- show B with no_stack = true - stack [A]
|
||||
-- - show_in for B and show_out for A
|
||||
-- show C
|
||||
-- - show_in for C and show_out for A again!
|
||||
if not screen.loaded then
|
||||
log("show_out() screen was not loaded")
|
||||
cb()
|
||||
return
|
||||
end
|
||||
run_coroutine(screen, cb, function()
|
||||
active_transition_count = active_transition_count + 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_OUT_STARTED, { screen = screen.id, next_screen = next_screen.id })
|
||||
@ -652,8 +552,7 @@ local function show_out(screen, next_screen, wait_for_transition, cb)
|
||||
local next_is_popup = next_screen and next_screen.popup
|
||||
local current_is_popup = screen.popup
|
||||
if (not next_is_popup and not current_is_popup) or (current_is_popup) then
|
||||
transition(screen, M.TRANSITION.SHOW_OUT, { next_screen = next_screen.id }, wait_for_transition)
|
||||
screen.visible = false
|
||||
transition(screen, M.TRANSITION.SHOW_OUT, { next_screen = next_screen.id })
|
||||
unload(screen)
|
||||
elseif next_is_popup then
|
||||
change_timestep(screen)
|
||||
@ -663,9 +562,8 @@ local function show_out(screen, next_screen, wait_for_transition, cb)
|
||||
end)
|
||||
end
|
||||
|
||||
local function show_in(screen, previous_screen, reload, add_to_stack, wait_for_transition, cb)
|
||||
log("show_in()", screen.id, wait_for_transition)
|
||||
assert(wait_for_transition ~= nil)
|
||||
local function show_in(screen, previous_screen, reload, add_to_stack, cb)
|
||||
log("show_in()", screen.id)
|
||||
run_coroutine(screen, cb, function()
|
||||
active_transition_count = active_transition_count + 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_IN_STARTED, { screen = screen.id, previous_screen = previous_screen and previous_screen.id })
|
||||
@ -674,24 +572,18 @@ local function show_in(screen, previous_screen, reload, add_to_stack, wait_for_t
|
||||
log("show_in() reloading", screen.id)
|
||||
unload(screen, reload)
|
||||
end
|
||||
if add_to_stack then
|
||||
stack[#stack + 1] = screen
|
||||
end
|
||||
local ok, err = load(screen)
|
||||
if not ok then
|
||||
log("show_in()", err)
|
||||
if add_to_stack then
|
||||
stack[#stack] = nil
|
||||
end
|
||||
active_transition_count = active_transition_count - 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_FAILED, { screen = screen.id })
|
||||
return
|
||||
end
|
||||
-- wait one frame so that the init() of any script have time to run before starting transitions
|
||||
cowait(screen, 0)
|
||||
if add_to_stack then
|
||||
stack[#stack + 1] = screen
|
||||
end
|
||||
reset_timestep(screen)
|
||||
transition(screen, M.TRANSITION.SHOW_IN, { previous_screen = previous_screen and previous_screen.id }, wait_for_transition)
|
||||
screen.visible = true
|
||||
transition(screen, M.TRANSITION.SHOW_IN, { previous_screen = previous_screen and previous_screen.id })
|
||||
acquire_input(screen)
|
||||
focus_gained(screen, previous_screen)
|
||||
active_transition_count = active_transition_count - 1
|
||||
@ -699,9 +591,8 @@ local function show_in(screen, previous_screen, reload, add_to_stack, wait_for_t
|
||||
end)
|
||||
end
|
||||
|
||||
local function back_in(screen, previous_screen, wait_for_transition, cb)
|
||||
local function back_in(screen, previous_screen, cb)
|
||||
log("back_in()", screen.id)
|
||||
assert(wait_for_transition ~= nil)
|
||||
run_coroutine(screen, cb, function()
|
||||
active_transition_count = active_transition_count + 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_IN_STARTED, { screen = screen.id, previous_screen = previous_screen and previous_screen.id })
|
||||
@ -713,13 +604,10 @@ local function back_in(screen, previous_screen, wait_for_transition, cb)
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_FAILED, { screen = screen.id })
|
||||
return
|
||||
end
|
||||
-- wait one frame so that the init() of any script have time to run before starting transitions
|
||||
cowait(screen, 0)
|
||||
reset_timestep(screen)
|
||||
if previous_screen and not previous_screen.popup then
|
||||
transition(screen, M.TRANSITION.BACK_IN, { previous_screen = previous_screen.id }, wait_for_transition)
|
||||
transition(screen, M.TRANSITION.BACK_IN, { previous_screen = previous_screen.id })
|
||||
end
|
||||
screen.visible = true
|
||||
acquire_input(screen)
|
||||
focus_gained(screen, previous_screen)
|
||||
active_transition_count = active_transition_count - 1
|
||||
@ -727,20 +615,18 @@ local function back_in(screen, previous_screen, wait_for_transition, cb)
|
||||
end)
|
||||
end
|
||||
|
||||
local function back_out(screen, next_screen, wait_for_transition, cb)
|
||||
local function back_out(screen, next_screen, cb)
|
||||
log("back_out()", screen.id)
|
||||
assert(wait_for_transition ~= nil)
|
||||
run_coroutine(screen, cb, function()
|
||||
active_transition_count = active_transition_count + 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_OUT_STARTED, { screen = screen.id, next_screen = next_screen and next_screen.id })
|
||||
active_transition_count = active_transition_count + 1
|
||||
change_context(screen)
|
||||
release_input(screen, next_screen)
|
||||
focus_lost(screen, next_screen)
|
||||
transition(screen, M.TRANSITION.BACK_OUT, { next_screen = next_screen and next_screen.id }, wait_for_transition)
|
||||
if next_screen and screen.popup then
|
||||
reset_timestep(next_screen)
|
||||
end
|
||||
screen.visible = false
|
||||
transition(screen, M.TRANSITION.BACK_OUT, { next_screen = next_screen and next_screen.id })
|
||||
unload(screen)
|
||||
active_transition_count = active_transition_count - 1
|
||||
notify_transition_listeners(M.SCREEN_TRANSITION_OUT_FINISHED, { screen = screen.id, next_screen = next_screen and next_screen.id })
|
||||
@ -793,7 +679,9 @@ function M.show(id, options, data, cb)
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
|
||||
log("show() queuing action", id)
|
||||
queue_action(function(action_done, action_error)
|
||||
log("show()", id)
|
||||
local screen = screens[id]
|
||||
if not screen then
|
||||
action_error(("show() there is no longer a screen with id %s"):format(tostring(id)))
|
||||
@ -831,12 +719,21 @@ function M.show(id, options, data, cb)
|
||||
pop = pop - 1
|
||||
end
|
||||
stack[#stack] = nil
|
||||
async(function(await, resume)
|
||||
await(show_out, top, screen, WAIT_FOR_TRANSITION, resume)
|
||||
end)
|
||||
show_out(top, screen, callbacks.track())
|
||||
callbacks.yield_until_done()
|
||||
top = stack[#stack]
|
||||
end
|
||||
|
||||
-- unload the previous screen and transition out from top
|
||||
-- wait until we are done if showing the same screen as is already visible
|
||||
if top and not top.popup then
|
||||
local same_screen = top and top.id == screen.id
|
||||
show_out(top, screen, callbacks.track())
|
||||
if same_screen or (options and options.sequential) then
|
||||
callbacks.yield_until_done()
|
||||
end
|
||||
end
|
||||
|
||||
-- if the screen we want to show is in the stack
|
||||
-- already and the clear flag is set then we need
|
||||
-- to remove every screen on the stack up until and
|
||||
@ -858,8 +755,8 @@ function M.show(id, options, data, cb)
|
||||
end
|
||||
end
|
||||
|
||||
-- wait until preloaded if it is already preloading
|
||||
-- this can typically happen if you do a show() on app start for a
|
||||
-- show screen, wait until preloaded if it is already preloading
|
||||
-- this can typpically happen if you do a show() on app start for a
|
||||
-- screen that has Preload set to true
|
||||
if M.is_preloading(id) then
|
||||
M.when_preloaded(id, function()
|
||||
@ -867,23 +764,7 @@ function M.show(id, options, data, cb)
|
||||
end)
|
||||
coroutine.yield()
|
||||
end
|
||||
|
||||
-- showing and hiding the same screen?
|
||||
local same_screen = top and top.id == screen.id
|
||||
if same_screen or (options and options.sequential) then
|
||||
if top then
|
||||
async(function(await, resume)
|
||||
await(show_out, top, screen, WAIT_FOR_TRANSITION, resume)
|
||||
end)
|
||||
end
|
||||
show_in(screen, top, options and options.reload, add_to_stack, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
else
|
||||
-- show screen
|
||||
show_in(screen, top, options and options.reload, add_to_stack, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
if add_to_stack and top and not top.popup then
|
||||
show_out(top, screen, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end
|
||||
end
|
||||
show_in(screen, top, options and options.reload, add_to_stack, callbacks.track())
|
||||
|
||||
callbacks.when_done(function()
|
||||
pcallfn(cb)
|
||||
@ -912,7 +793,7 @@ end
|
||||
|
||||
-- Hide a screen. The screen must either be at the top of the stack or
|
||||
-- visible but not added to the stack (through the no_stack option)
|
||||
-- @param id (string|hash) - Id of the screen to .hide
|
||||
-- @param id (string|hash) - Id of the screen to show
|
||||
-- @param cb (function) - Optional callback to invoke when the screen is hidden
|
||||
-- @return true if successfully hiding, false if busy or for some other reason unable to hide the screen
|
||||
function M.hide(id, cb)
|
||||
@ -925,7 +806,7 @@ function M.hide(id, cb)
|
||||
log("hide() you can only hide the screen at the top of the stack", id)
|
||||
return false
|
||||
end
|
||||
return M.back(nil, nil, cb)
|
||||
return M.back(id, cb)
|
||||
else
|
||||
log("hide() queuing action", id)
|
||||
queue_action(function(action_done, action_error)
|
||||
@ -937,7 +818,7 @@ function M.hide(id, cb)
|
||||
action_error(("hide() there is no longer a screen with id %s"):format(tostring(id)))
|
||||
return
|
||||
end
|
||||
back_out(screen, nil, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
back_out(screen, nil, callbacks.track())
|
||||
end
|
||||
callbacks.when_done(function()
|
||||
pcallfn(cb)
|
||||
@ -949,43 +830,10 @@ function M.hide(id, cb)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-- Clear stack completely. Any visible screens will be hidden by navigating back out
|
||||
-- from them.
|
||||
-- @param cb (function) - Optional callback to invoke when the stack has been cleared
|
||||
function M.clear(cb)
|
||||
log("clear() queuing action")
|
||||
|
||||
queue_action(function(action_done, action_error)
|
||||
async(function(await, resume)
|
||||
local top = stack[#stack]
|
||||
while top and top.visible do
|
||||
stack[#stack] = nil
|
||||
await(back_out, top, stack[#stack - 1], WAIT_FOR_TRANSITION, resume)
|
||||
top = stack[#stack]
|
||||
end
|
||||
|
||||
while stack[#stack] do
|
||||
table.remove(stack)
|
||||
end
|
||||
|
||||
pcallfn(cb)
|
||||
pcallfn(action_done)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
-- Go back to the previous screen in the stack.
|
||||
-- @param options (table) - Table with options when backing out from the screen (can be nil).
|
||||
-- Valid values:
|
||||
-- * sequential - Set to true to wait for the current screen to hide itself out before starting the
|
||||
-- back in transition even when transitioning to a different scene ID.
|
||||
|
||||
-- @param data (*) - Optional data to set for the previous screen
|
||||
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again
|
||||
function M.back(options, data, cb)
|
||||
function M.back(data, cb)
|
||||
log("back() queuing action")
|
||||
|
||||
queue_action(function(action_done)
|
||||
@ -996,36 +844,20 @@ function M.back(options, data, cb)
|
||||
local top = stack[#stack]
|
||||
-- if we go back to the same screen we need to first hide it
|
||||
-- and wait until it is hidden before we show it again
|
||||
local same_screen = top and top.id == screen.id
|
||||
if same_screen or (options and options.sequential) then
|
||||
local back_cb = callbacks.track()
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, function()
|
||||
if top and screen.id == top.id then
|
||||
back_out(screen, top, function()
|
||||
if data then
|
||||
top.data = data
|
||||
end
|
||||
back_in(top, screen, WAIT_FOR_TRANSITION, back_cb)
|
||||
back_in(top, screen, callbacks.track())
|
||||
end)
|
||||
else
|
||||
back_out(screen, top, callbacks.track())
|
||||
if top then
|
||||
if data then
|
||||
top.data = data
|
||||
end
|
||||
-- if the screen we are backing out from is a popup and the screen we go
|
||||
-- back to is not a popup we need to let the popup completely hide before
|
||||
-- we start working on the screen we go back to
|
||||
-- we do this to ensure that we do not reset the times step of the screen
|
||||
-- we go back to until it is no longer obscured by the popup
|
||||
if screen.popup and not top.popup then
|
||||
local back_cb = callbacks.track()
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, function()
|
||||
back_in(top, screen, WAIT_FOR_TRANSITION, back_cb)
|
||||
end)
|
||||
else
|
||||
back_in(top, screen, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
end
|
||||
else
|
||||
back_out(screen, top, WAIT_FOR_TRANSITION, callbacks.track())
|
||||
back_in(top, screen, callbacks.track())
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1079,19 +911,12 @@ end
|
||||
--- Preload a screen. This will load but not enable and show a screen. Useful for "heavier" screens
|
||||
-- that you wish to show without any delay.
|
||||
-- @param id (string|hash) - Id of the screen to preload
|
||||
-- @param options (table)
|
||||
-- @param cb (function) - Optional callback to invoke when screen is loaded
|
||||
function M.preload(id, options, cb)
|
||||
function M.preload(id, cb)
|
||||
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)))
|
||||
|
||||
-- support old function signature (id, cb)
|
||||
if type(options) == "function" and not cb then
|
||||
cb = options
|
||||
options = nil
|
||||
end
|
||||
|
||||
log("preload() queuing action", id)
|
||||
queue_action(function(action_done, action_error)
|
||||
log("preload()", id)
|
||||
@ -1102,10 +927,6 @@ function M.preload(id, options, cb)
|
||||
return
|
||||
end
|
||||
|
||||
-- keep_loaded is an option for monarch.preload()
|
||||
-- use it to get the same behavior as the auto preload checkbox
|
||||
screen.auto_preload = screen.auto_preload or options and options.keep_loaded
|
||||
|
||||
if screen.preloaded or screen.loaded then
|
||||
pcallfn(cb)
|
||||
pcallfn(action_done)
|
||||
@ -1132,20 +953,6 @@ function M.preload(id, options, cb)
|
||||
return true -- return true for legacy reasons (before queue existed)
|
||||
end
|
||||
|
||||
--- Check if a screen has missing resources, always returns false for factory
|
||||
-- @param id (string|hash) - Id of the screen to preload
|
||||
function M.has_missing_resources(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]
|
||||
if screen.proxy then
|
||||
local missing_resources = collectionproxy.missing_resources(screen.proxy)
|
||||
return #missing_resources > 0
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
--- Unload a preloaded monarch screen
|
||||
-- @param id (string|hash) - Id of the screen to unload
|
||||
@ -1182,7 +989,7 @@ function M.unload(id, cb)
|
||||
end
|
||||
run_coroutine(screen, when_unloaded, function()
|
||||
change_context(screen)
|
||||
unload(screen, true)
|
||||
unload(screen)
|
||||
end)
|
||||
end)
|
||||
return true -- return true for legacy reasons (before queue existed)
|
||||
@ -1197,8 +1004,8 @@ end
|
||||
-- @return error (string|nil) Error message if unable to send message
|
||||
function M.post(id, message_id, message)
|
||||
assert(id, "You must provide a screen id")
|
||||
if not M.is_loaded(id) then
|
||||
return false, "Unable to post message to screen if it isn't loaded"
|
||||
if not M.is_visible(id) then
|
||||
return false, "Unable to post message to screen if it isn't visible"
|
||||
end
|
||||
|
||||
assert(message_id, "You must provide a message_id")
|
||||
@ -1206,69 +1013,51 @@ function M.post(id, message_id, message)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
|
||||
local screen = screens[id]
|
||||
if screen.proxy then
|
||||
if screen.receiver_url then
|
||||
log("post() sending message to", screen.receiver_url)
|
||||
msg.post(screen.receiver_url, message_id, message)
|
||||
else
|
||||
return false, "Unable to post message since screen has no receiver url specified. Set one using monarch.on_post()."
|
||||
return false, "Unable to post message since screen has no receiver url specified"
|
||||
end
|
||||
else
|
||||
run_coroutine(screen, nil, function()
|
||||
change_context(screen)
|
||||
log("post() sending message to", screen.receiver_url)
|
||||
for id,instance in pairs(screen.factory_ids) do
|
||||
msg.post(instance, message_id, message)
|
||||
end
|
||||
end)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
function M.on_message(message_id, message, sender)
|
||||
if message_id == MSG_PROXY_LOADED then
|
||||
local screen = find_screen(sender)
|
||||
if message_id == PROXY_LOADED then
|
||||
local screen = screen_from_proxy(sender)
|
||||
assert(screen, "Unable to find screen for loaded proxy")
|
||||
if screen.wait_for == WAITFOR_PROXY_LOADED then
|
||||
if screen.wait_for == PROXY_LOADED then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == MSG_PROXY_UNLOADED then
|
||||
local screen = find_screen(sender)
|
||||
elseif message_id == PROXY_UNLOADED then
|
||||
local screen = screen_from_proxy(sender)
|
||||
assert(screen, "Unable to find screen for unloaded proxy")
|
||||
if screen.wait_for == WAITFOR_PROXY_UNLOADED then
|
||||
if screen.wait_for == PROXY_UNLOADED then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == MSG_CONTEXT then
|
||||
local screen = find_screen(sender)
|
||||
elseif message_id == CONTEXT then
|
||||
local screen = screen_from_script()
|
||||
assert(screen, "Unable to find screen for current script url")
|
||||
if screen.wait_for == WAITFOR_CONTEXT then
|
||||
if screen.wait_for == CONTEXT then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == M.TRANSITION.DONE then
|
||||
local screen = find_transition_screen(sender)
|
||||
assert(screen, "Unable to find screen for transition")
|
||||
if screen.wait_for == WAITFOR_TRANSITION_DONE then
|
||||
local screen = screen_from_script()
|
||||
assert(screen, "Unable to find screen for current script url")
|
||||
if screen.wait_for == M.TRANSITION.DONE then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == M.TRANSITION.SHOW_IN
|
||||
or message_id == M.TRANSITION.SHOW_OUT
|
||||
or message_id == M.TRANSITION.BACK_IN
|
||||
or message_id == M.TRANSITION.BACK_OUT
|
||||
then
|
||||
local screen = find_transition_screen(sender)
|
||||
assert(screen, "Unable to find screen for transition")
|
||||
if screen.transition_fn then
|
||||
screen.transition_fn(message_id, message, sender)
|
||||
end
|
||||
elseif message_id == MSG_LAYOUT_CHANGED then
|
||||
local screen = find_screen(sender)
|
||||
if screen and screen.transition_fn then
|
||||
screen.transition_fn(message_id, message, sender)
|
||||
end
|
||||
elseif message_id == M.FOCUS.GAINED
|
||||
or message_id == M.FOCUS.LOST
|
||||
then
|
||||
local screen = find_focus_screen(sender)
|
||||
assert(screen, "Unable to find screen for focus change")
|
||||
if screen.focus_fn then
|
||||
screen.focus_fn(message_id, message, sender)
|
||||
end
|
||||
else
|
||||
local screen = find_post_receiver_screen(sender)
|
||||
if screen and screen.receiver_fn then
|
||||
screen.receiver_fn(message_id, message, sender)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1302,84 +1091,8 @@ function M.bottom(offset)
|
||||
return screen and screen.id
|
||||
end
|
||||
|
||||
|
||||
--- Set the timestep to apply for a screen when below a popup
|
||||
-- @param id (string|hash) Id of the screen to change timestep setting for
|
||||
-- @param timestep (number) Timestep to apply
|
||||
function M.set_timestep_below_popup(id, timestep)
|
||||
assert(id, "You must provide a screen id")
|
||||
assert(timestep, "You must provide a timestep")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
screens[id].timestep_below_popup = timestep
|
||||
end
|
||||
|
||||
|
||||
---
|
||||
-- Set a function to call when a transition should be started
|
||||
-- The function will receive (message_id, message, sender)
|
||||
-- IMPORTANT! You must call monarch.on_message() from the same script as
|
||||
-- this function was called
|
||||
-- @param id Screen id to associate transition with
|
||||
-- @param fn Transition handler function
|
||||
function M.on_transition(id, fn)
|
||||
assert(id, "You must provide a screen id")
|
||||
assert(fn, "You must provide a transition function")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
local screen = screens[id]
|
||||
screen.transition_url = msg.url()
|
||||
screen.transition_fn = fn
|
||||
end
|
||||
|
||||
---
|
||||
-- Set a function to call when a screen gains or loses focus
|
||||
-- The function will receive (message_id, message, sender)
|
||||
-- IMPORTANT! You must call monarch.on_message() from the same script as
|
||||
-- this function was called
|
||||
-- @param id Screen id to associate focus listener function with
|
||||
-- @param fn Focus listener function
|
||||
function M.on_focus_changed(id, fn)
|
||||
assert(id, "You must provide a screen id")
|
||||
assert(fn, "You must provide a focus change function")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
local screen = screens[id]
|
||||
screen.focus_url = msg.url()
|
||||
screen.focus_fn = fn
|
||||
end
|
||||
|
||||
---
|
||||
-- Set either a function to be called when msg.post() is called on a specific
|
||||
-- screen or a URL where the message is sent.
|
||||
-- IMPORTANT! If you provide a function you must also make sure to call
|
||||
-- monarch.on_message(message_id, message, sender) from the same script as
|
||||
-- this function was called.
|
||||
-- @param id Screen id to associate the message listener function with
|
||||
-- @param fn_or_url The function to call or URL to send message to
|
||||
function M.on_post(id, fn_or_url)
|
||||
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]
|
||||
|
||||
local t = type(fn_or_url)
|
||||
if t == "function" then
|
||||
screen.receiver_fn = fn_or_url
|
||||
screen.receiver_url = msg.url()
|
||||
elseif t == "userdata" or t == "string" then
|
||||
screen.receiver_fn = nil
|
||||
screen.receiver_url = fn_or_url
|
||||
else
|
||||
screen.receiver_fn = nil
|
||||
screen.receiver_url = msg.url()
|
||||
end
|
||||
end
|
||||
|
||||
local empty_hash = hash("")
|
||||
|
||||
local function url_to_key(url)
|
||||
return (url.socket or empty_hash) .. (url.path or empty_hash) .. (url.fragment or empty_hash)
|
||||
return (url.socket or hash("")) .. (url.path or hash("")) .. (url.fragment or hash(""))
|
||||
end
|
||||
|
||||
|
||||
@ -1407,9 +1120,4 @@ function M.dump_stack()
|
||||
return s
|
||||
end
|
||||
|
||||
function M.queue_size()
|
||||
return #queue
|
||||
end
|
||||
|
||||
|
||||
return M
|
||||
|
@ -6,8 +6,8 @@ go.property("popup", false)
|
||||
go.property("popup_on_popup", false)
|
||||
go.property("screen_keeps_input_focus_when_below_popup", false)
|
||||
go.property("others_keep_input_focus_when_below_screen", false)
|
||||
go.property("transition_id", hash("__DEPRECATED__"))
|
||||
go.property("focus_id", hash("__DEPRECATED__"))
|
||||
go.property("transition_id", hash(""))
|
||||
go.property("focus_id", hash(""))
|
||||
go.property("preload", false)
|
||||
|
||||
|
||||
|
@ -7,9 +7,9 @@ go.property("popup_on_popup", false)
|
||||
go.property("timestep_below_popup", 1)
|
||||
go.property("screen_keeps_input_focus_when_below_popup", false)
|
||||
go.property("others_keep_input_focus_when_below_screen", false)
|
||||
go.property("transition_url", msg.url("#__DEPRECATED__"))
|
||||
go.property("focus_url", msg.url("#__DEPRECATED__"))
|
||||
go.property("receiver_url", msg.url("#__DEPRECATED__"))
|
||||
go.property("transition_url", msg.url())
|
||||
go.property("focus_url", msg.url())
|
||||
go.property("receiver_url", msg.url())
|
||||
go.property("preload", false)
|
||||
|
||||
|
||||
|
@ -20,10 +20,10 @@ local LAYOUT_CHANGED = hash("layout_changed")
|
||||
function M.window_resized(width, height)
|
||||
WIDTH = width
|
||||
HEIGHT = height
|
||||
LEFT = vmath.vector3(-WIDTH, 0, 0)
|
||||
RIGHT = vmath.vector3(WIDTH, 0, 0)
|
||||
TOP = vmath.vector3(0, HEIGHT, 0)
|
||||
BOTTOM = vmath.vector3(0, - HEIGHT, 0)
|
||||
LEFT = vmath.vector3(-WIDTH * 2, 0, 0)
|
||||
RIGHT = vmath.vector3(WIDTH * 2, 0, 0)
|
||||
TOP = vmath.vector3(0, HEIGHT * 2, 0)
|
||||
BOTTOM = vmath.vector3(0, - HEIGHT * 2, 0)
|
||||
end
|
||||
|
||||
M.window_resized(tonumber(sys.get_config("display.width")), tonumber(sys.get_config("display.height")))
|
||||
@ -121,15 +121,11 @@ local function create()
|
||||
local current_transition = nil
|
||||
|
||||
local function create_transition(transition_id, node, fn, easing, duration, delay)
|
||||
assert(transition_id, "You must provide a valid transition id")
|
||||
assert(node, "You must provide a node")
|
||||
assert(fn, "You must provide a transition function")
|
||||
|
||||
local t = transitions[transition_id]
|
||||
-- find if there's already a transition for the node in
|
||||
-- question and if so update it instead of creating a new
|
||||
-- transition
|
||||
for _,transition in ipairs(t.transitions) do
|
||||
for _,transition in ipairs(t) do
|
||||
if transition.node == node then
|
||||
transition.fn = fn
|
||||
transition.easing = easing
|
||||
@ -173,10 +169,10 @@ local function create()
|
||||
end
|
||||
|
||||
local function start_transition(transition_id, url)
|
||||
url = url or msg.url()
|
||||
local t = transitions[transition_id]
|
||||
table.insert(t.urls, url)
|
||||
if t.in_progress_count == 0 then
|
||||
table.insert(t.urls, msg.url())
|
||||
current_transition = t
|
||||
current_transition.id = transition_id
|
||||
if #t.transitions > 0 then
|
||||
@ -254,11 +250,7 @@ local function create()
|
||||
return instance
|
||||
end
|
||||
|
||||
return setmetatable(instance, {
|
||||
__call = function(t, ...)
|
||||
return instance.handle(...)
|
||||
end
|
||||
})
|
||||
return instance
|
||||
end
|
||||
|
||||
function M.create(node)
|
||||
|
@ -1,47 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
local NOT_STARTED = "not_started"
|
||||
local YIELDED = "yielded"
|
||||
local RESUMED = "resumed"
|
||||
local RUNNING = "running"
|
||||
|
||||
function M.async(fn)
|
||||
local co = coroutine.running()
|
||||
|
||||
local state = NOT_STARTED
|
||||
|
||||
local function await(fn, ...)
|
||||
state = RUNNING
|
||||
fn(...)
|
||||
if state ~= RUNNING then
|
||||
return
|
||||
end
|
||||
state = YIELDED
|
||||
local r = { coroutine.yield() }
|
||||
return unpack(r)
|
||||
end
|
||||
|
||||
local function resume(...)
|
||||
if state ~= RUNNING then
|
||||
state = RUNNING
|
||||
local ok, err = coroutine.resume(co, ...)
|
||||
if not ok then
|
||||
print(err)
|
||||
print(debug.traceback())
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if co then
|
||||
return fn(await, resume)
|
||||
else
|
||||
co = coroutine.create(fn)
|
||||
return resume(await, resume)
|
||||
end
|
||||
end
|
||||
|
||||
return setmetatable(M, {
|
||||
__call = function(t, ...)
|
||||
return M.async(...)
|
||||
end
|
||||
})
|
@ -6,18 +6,13 @@ function M.create()
|
||||
|
||||
local callback = nil
|
||||
local callback_count = 0
|
||||
local all_callbacks_done = false
|
||||
|
||||
local function is_done()
|
||||
return callback_count == 0
|
||||
end
|
||||
|
||||
local function invoke_if_done()
|
||||
if all_callbacks_done then
|
||||
print("Warning: The same callback will be invoked twice from the callback tracker!")
|
||||
end
|
||||
if callback_count == 0 and callback then
|
||||
all_callbacks_done = true
|
||||
local ok, err = pcall(callback)
|
||||
if not ok then print(err) end
|
||||
end
|
||||
@ -46,12 +41,26 @@ function M.create()
|
||||
invoke_if_done()
|
||||
end
|
||||
|
||||
function instance.yield_until_done()
|
||||
local co = coroutine.running()
|
||||
callback = function()
|
||||
local ok, err = coroutine.resume(co)
|
||||
if not ok then
|
||||
print(err)
|
||||
end
|
||||
end
|
||||
invoke_if_done()
|
||||
if not is_done() then
|
||||
coroutine.yield()
|
||||
end
|
||||
end
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
|
||||
return setmetatable(M, {
|
||||
__call = function(_, ...)
|
||||
return M.create()
|
||||
return M.create(...)
|
||||
end
|
||||
})
|
@ -1,2 +0,0 @@
|
||||
[bootstrap]
|
||||
main_collection = /test/test.collectionc
|
@ -4,10 +4,7 @@ function M.seconds(amount)
|
||||
local co = coroutine.running()
|
||||
assert(co, "You must run this from within a coroutine")
|
||||
timer.delay(amount, false, function()
|
||||
local ok, err = coroutine.resume(co)
|
||||
if not ok then
|
||||
print(err)
|
||||
end
|
||||
coroutine.resume(co)
|
||||
end)
|
||||
coroutine.yield()
|
||||
end
|
||||
@ -16,13 +13,10 @@ function M.eval(fn, timeout)
|
||||
local co = coroutine.running()
|
||||
assert(co, "You must run this from within a coroutine")
|
||||
local start = socket.gettime()
|
||||
timer.delay(0.02, true, function(self, handle, time_elapsed)
|
||||
timer.delay(0.01, true, function(self, handle, time_elapsed)
|
||||
if fn() or (timeout and socket.gettime() > (start + timeout)) then
|
||||
timer.cancel(handle)
|
||||
local ok, err = coroutine.resume(co)
|
||||
if not ok then
|
||||
print(err)
|
||||
end
|
||||
coroutine.resume(co)
|
||||
end
|
||||
end)
|
||||
coroutine.yield()
|
||||
|
@ -1,11 +1,5 @@
|
||||
local monarch
|
||||
|
||||
function init(self)
|
||||
monarch = require "monarch.monarch"
|
||||
print("init - screen1", msg.url())
|
||||
monarch.on_post("screen1", function(message_id, message, sender)
|
||||
_G.screen1_on_post = message or true
|
||||
end)
|
||||
print("init - screen1")
|
||||
end
|
||||
|
||||
function final(self)
|
||||
@ -13,8 +7,7 @@ function final(self)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
if message_id == hash("foobar") then
|
||||
_G.screen1_on_message = message or true
|
||||
_G.screen1_foobar = message or true
|
||||
end
|
||||
end
|
||||
|
@ -1,11 +1,5 @@
|
||||
local monarch
|
||||
|
||||
function init(self)
|
||||
monarch = require "monarch.monarch"
|
||||
print("init - screen2", msg.url())
|
||||
monarch.on_post("screen2", function(message_id, message, sender)
|
||||
_G.screen2_on_post = message or true
|
||||
end)
|
||||
print("init - screen2")
|
||||
end
|
||||
|
||||
function final(self)
|
||||
@ -13,8 +7,7 @@ function final(self)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
if message_id == hash("foobar") then
|
||||
_G.screen2_on_message = message or true
|
||||
_G.screen2_foobar = message or true
|
||||
end
|
||||
end
|
||||
|
@ -1,5 +1,5 @@
|
||||
function init(self)
|
||||
local monarch = require "monarch.monarch"
|
||||
local data = monarch.data(hash("screen_preload"))
|
||||
if data then data.count = data.count + 1 end
|
||||
data.count = data.count + 1
|
||||
end
|
||||
|
@ -26,8 +26,6 @@ embedded_instances {
|
||||
" value: \"screen1:/go\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
@ -86,15 +84,12 @@ embedded_instances {
|
||||
" value: \"screen2\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/test/data/screen2.collection\\\"\\n"
|
||||
"load_dynamically: false\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
@ -152,8 +147,6 @@ embedded_instances {
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
@ -222,8 +215,6 @@ embedded_instances {
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
@ -287,8 +278,6 @@ embedded_instances {
|
||||
" value: \"transition1:/go\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
@ -387,15 +376,12 @@ embedded_instances {
|
||||
" value: \"background\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/test/data/background.collection\\\"\\n"
|
||||
"load_dynamically: false\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
@ -453,15 +439,12 @@ embedded_instances {
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/test/data/screen_preload.collection\\\"\\n"
|
||||
"load_dynamically: false\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
@ -519,8 +502,6 @@ embedded_instances {
|
||||
" value: \"focus1:/go#focus1\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"collectionproxy\"\n"
|
||||
|
12
test/msg.lua
12
test/msg.lua
@ -64,17 +64,5 @@ function M.last(url)
|
||||
return messages[#messages]
|
||||
end
|
||||
|
||||
function M.filter(url, fn)
|
||||
local t = {}
|
||||
local messages = M.messages(url)
|
||||
for i=1,#messages do
|
||||
local message = messages[i]
|
||||
if fn(message) then
|
||||
t[#t + 1] = message
|
||||
end
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
|
||||
return M
|
@ -16,15 +16,12 @@ embedded_instances {
|
||||
" z: 0.0\n"
|
||||
" w: 1.0\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"embedded_components {\n"
|
||||
" id: \"screensfactory\"\n"
|
||||
" type: \"collectionfactory\"\n"
|
||||
" data: \"prototype: \\\"/test/data/screens.collection\\\"\\n"
|
||||
"load_dynamically: false\\n"
|
||||
"dynamic_prototype: false\\n"
|
||||
"\"\n"
|
||||
" position {\n"
|
||||
" x: 0.0\n"
|
||||
|
@ -12,6 +12,7 @@ local FOCUS1 = hash("focus1")
|
||||
local BACKGROUND = hash("background")
|
||||
local POPUP1 = hash("popup1")
|
||||
local POPUP2 = hash("popup2")
|
||||
local FOOBAR = hash("foobar")
|
||||
local TRANSITION1 = hash("transition1")
|
||||
|
||||
local function check_stack(expected_screens)
|
||||
@ -38,7 +39,7 @@ return function()
|
||||
|
||||
local screens_instances = {}
|
||||
|
||||
local function is_visible(screen_id)
|
||||
local function is_shown(screen_id)
|
||||
return monarch.is_visible(screen_id)
|
||||
end
|
||||
|
||||
@ -64,6 +65,9 @@ return function()
|
||||
local function wait_until_visible(screen_id)
|
||||
return wait_timeout(is_visible, screen_id)
|
||||
end
|
||||
local function wait_until_shown(screen_id)
|
||||
return wait_timeout(is_shown, screen_id)
|
||||
end
|
||||
local function wait_until_hidden(screen_id)
|
||||
return wait_timeout(is_hidden, screen_id)
|
||||
end
|
||||
@ -73,9 +77,6 @@ return function()
|
||||
local function wait_until_not_busy()
|
||||
return wait_timeout(function() return not monarch.is_busy() end)
|
||||
end
|
||||
local function wait_until_stack(expected_screens)
|
||||
return wait_timeout(function() return check_stack(expected_screens) end)
|
||||
end
|
||||
local function wait_until_loaded(screen_id)
|
||||
wait_until_done(function(done)
|
||||
monarch.when_preloaded(screen_id, done)
|
||||
@ -114,90 +115,75 @@ return function()
|
||||
|
||||
it("should be able to show screens and go back to previous screens", function()
|
||||
monarch.show(SCREEN1_STR)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
|
||||
monarch.back()
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_hidden(SCREEN2), "Screen2 was never hidden")
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
|
||||
monarch.back()
|
||||
assert(wait_until_stack({ }))
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert_stack({ })
|
||||
end)
|
||||
|
||||
it("should be able to replace screens at the top of the stack", function()
|
||||
monarch.show(SCREEN1_STR)
|
||||
assert(wait_until_stack({ SCREEN1 }), "Screen1 was never shown")
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
|
||||
monarch.replace(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN1 }))
|
||||
assert(wait_until_hidden(SCREEN2), "Screen2 was never hidden")
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN1 })
|
||||
end)
|
||||
|
||||
it("should be able to tell if a screen is visible or not", function()
|
||||
assert(not monarch.is_visible(SCREEN1))
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
assert(monarch.is_visible(SCREEN1))
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN2))
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
assert(not monarch.is_visible(SCREEN1))
|
||||
assert(monarch.is_visible(SCREEN2))
|
||||
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 }))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(wait_until_visible(SCREEN2))
|
||||
assert(wait_until_visible(POPUP1))
|
||||
end)
|
||||
|
||||
it("should be able to tell if a screen is loaded or not", function()
|
||||
assert(not monarch.is_loaded(SCREEN1))
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
assert(monarch.is_loaded(SCREEN1))
|
||||
|
||||
monarch.hide(SCREEN1)
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
assert(not monarch.is_loaded(SCREEN1))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2, POPUP1 })
|
||||
assert(not monarch.is_visible(SCREEN1))
|
||||
assert(monarch.is_visible(SCREEN2))
|
||||
assert(monarch.is_visible(POPUP1))
|
||||
end)
|
||||
|
||||
it("should be able to show a screen without adding it to the stack", function()
|
||||
monarch.show(BACKGROUND, { no_stack = true })
|
||||
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
||||
assert(wait_until_stack({ }))
|
||||
assert(wait_until_shown(BACKGROUND), "Background was never shown")
|
||||
assert_stack({ })
|
||||
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
end)
|
||||
|
||||
it("should be able to show a screen without adding it to the stack at any time", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_not_busy())
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
|
||||
monarch.show(BACKGROUND, { no_stack = true })
|
||||
assert(wait_until_not_busy())
|
||||
assert(wait_until_visible(BACKGROUND))
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_not_busy())
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
|
||||
monarch.back()
|
||||
assert(wait_until_not_busy())
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
end)
|
||||
|
||||
it("should be able to hide a screen not added to the stack", function()
|
||||
monarch.show(BACKGROUND, { no_stack = true })
|
||||
assert(wait_until_visible(BACKGROUND), "Background was never shown")
|
||||
assert(wait_until_shown(BACKGROUND), "Background was never shown")
|
||||
assert_stack({ })
|
||||
|
||||
monarch.hide(BACKGROUND)
|
||||
@ -207,31 +193,36 @@ return function()
|
||||
|
||||
it("should be able to hide the top screen", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
|
||||
assert(monarch.hide(SCREEN1) == false)
|
||||
assert(monarch.hide(SCREEN2) == true)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_hidden(SCREEN2), "Screen2 was never hidden")
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
end)
|
||||
|
||||
it("should be able to pass data to a screen when showing it or going back to it", function()
|
||||
local data1 = { foo = "bar" }
|
||||
monarch.show(SCREEN1, nil, data1)
|
||||
assert(wait_until_visible(SCREEN1), "Screen1 was never shown")
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
|
||||
local data2 = { boo = "car" }
|
||||
monarch.show(SCREEN2, nil, data2)
|
||||
assert(wait_until_visible(SCREEN2), "Screen2 was never shown")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
|
||||
assert(monarch.data(SCREEN1) == data1, "Expected data on screen1 doesn't match actual data")
|
||||
assert(monarch.data(SCREEN2) == data2, "Expected data on screen2 doesn't match actual data")
|
||||
|
||||
local data_back = { going = "back" }
|
||||
monarch.back(nil, data_back)
|
||||
assert(wait_until_visible(SCREEN1))
|
||||
monarch.back(data_back)
|
||||
assert(wait_until_shown(SCREEN1))
|
||||
|
||||
assert(monarch.data(SCREEN1) == data_back, "Expected data on screen1 doesn't match actual data")
|
||||
end)
|
||||
@ -239,40 +230,51 @@ return function()
|
||||
|
||||
it("should be able to show the same screen twice", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN1 })
|
||||
end)
|
||||
|
||||
|
||||
it("should be able to clear the stack if trying to show the same screen twice", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
monarch.show(SCREEN1, { clear = true })
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
end)
|
||||
|
||||
|
||||
it("should be able to show one popup on top of another if the Popup On Popup flag is set", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
monarch.show(POPUP2)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1, POPUP2 })
|
||||
end)
|
||||
|
||||
|
||||
it("should be able to queue multiple display commands", function()
|
||||
it("should prevent further operations while hiding/showing a screen", function()
|
||||
monarch.show(SCREEN1)
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
|
||||
assert(monarch.back())
|
||||
assert(monarch.back())
|
||||
assert(wait_until_stack({}), "Stack never became empty")
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert(wait_until_hidden(SCREEN2), "Screen2 was never hidden")
|
||||
end)
|
||||
|
||||
|
||||
@ -290,63 +292,84 @@ return function()
|
||||
|
||||
it("should close any open popups when showing a popup without the Popup On Popup flag", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP2)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP2 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
end)
|
||||
|
||||
|
||||
it("should close any open popups when showing a non-popup", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
monarch.show(POPUP2)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1, POPUP2 })
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_shown(SCREEN2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
end)
|
||||
|
||||
it("should close any open popups when replacing a non-popup", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
monarch.show(POPUP2)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1, POPUP2 })
|
||||
monarch.replace(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN2 }))
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN2 })
|
||||
end)
|
||||
|
||||
it("should replace a popup", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
monarch.replace(POPUP2)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP2 })
|
||||
end)
|
||||
|
||||
it("should replace a pop-up two levels down", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
monarch.show(POPUP2)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1, POPUP2 })
|
||||
monarch.show(POPUP2, { pop = 2 })
|
||||
assert(wait_until_stack({ SCREEN1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP2 })
|
||||
end)
|
||||
|
||||
it("shouldn't over-pop popups", function()
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert_stack({ SCREEN1 })
|
||||
monarch.show(POPUP1)
|
||||
assert(wait_until_stack({ SCREEN1, POPUP1 }))
|
||||
assert(wait_until_shown(POPUP1), "Popup1 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP1 })
|
||||
monarch.show(POPUP2, { pop = 10 })
|
||||
assert(wait_until_stack({ SCREEN1, POPUP2 }))
|
||||
assert(wait_until_shown(POPUP2), "Popup2 was never shown")
|
||||
assert_stack({ SCREEN1, POPUP2 })
|
||||
end)
|
||||
|
||||
it("should be able to get the id of the screen at the top and bottom of the stack", function()
|
||||
@ -356,7 +379,7 @@ return function()
|
||||
assert(monarch.bottom(-1) == nil)
|
||||
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert(monarch.top() == SCREEN1)
|
||||
assert(monarch.top(0) == SCREEN1)
|
||||
assert(monarch.top(1) == nil)
|
||||
@ -365,7 +388,9 @@ return function()
|
||||
assert(monarch.bottom(-1) == nil)
|
||||
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1), "Screen1 was never hidden")
|
||||
assert(wait_until_shown(SCREEN2), "Screen2 was never shown")
|
||||
assert_stack({ SCREEN1, SCREEN2 })
|
||||
assert(monarch.top(0) == SCREEN2)
|
||||
assert(monarch.top(-1) == SCREEN1)
|
||||
assert(monarch.bottom(0) == SCREEN1)
|
||||
@ -374,8 +399,8 @@ return function()
|
||||
|
||||
it("should be busy while transition is running", function()
|
||||
monarch.show(TRANSITION1)
|
||||
assert(wait_until_shown(TRANSITION1), "Transition1 was never shown")
|
||||
assert(monarch.is_busy())
|
||||
assert(wait_until_visible(TRANSITION1), "Transition1 was never shown")
|
||||
assert(wait_until_not_busy())
|
||||
end)
|
||||
|
||||
@ -388,26 +413,12 @@ return function()
|
||||
assert(not monarch.is_preloading(TRANSITION1))
|
||||
end)
|
||||
|
||||
it("should be able to preload a screen and keep it loaded", function()
|
||||
assert(not monarch.is_preloading(TRANSITION1))
|
||||
monarch.preload(TRANSITION1, { keep_loaded = true })
|
||||
wait_until_done(function(done)
|
||||
monarch.when_preloaded(TRANSITION1, done)
|
||||
end)
|
||||
|
||||
monarch.show(TRANSITION1)
|
||||
assert(wait_until_visible(TRANSITION1), "Transition1 was never shown")
|
||||
monarch.back()
|
||||
assert(wait_until_hidden(TRANSITION1), "Transition1 was never hidden")
|
||||
assert(monarch.is_preloaded(TRANSITION1))
|
||||
end)
|
||||
|
||||
it("should ignore any preload calls while busy", function()
|
||||
monarch.show(TRANSITION1)
|
||||
-- previously a call to preload() while also showing a screen would
|
||||
-- lock up monarch. See issue #32
|
||||
monarch.preload(TRANSITION1)
|
||||
assert(wait_until_visible(TRANSITION1), "Transition1 was never shown")
|
||||
assert(wait_until_shown(TRANSITION1), "Transition1 was never shown")
|
||||
end)
|
||||
|
||||
it("should be able to notify listeners of navigation events", function()
|
||||
@ -417,48 +428,54 @@ return function()
|
||||
monarch.add_listener(URL2)
|
||||
|
||||
monarch.show(SCREEN1)
|
||||
assert(mock_msg.messages(URL1)[1].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(mock_msg.messages(URL1)[1].message.screen == SCREEN1)
|
||||
assert(mock_msg.messages(URL2)[1].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(mock_msg.messages(URL2)[1].message.screen == SCREEN1)
|
||||
assert(wait_until_not_busy())
|
||||
assert(mock_msg.messages(URL1)[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
assert(mock_msg.messages(URL1)[2].message.screen == SCREEN1)
|
||||
assert(mock_msg.messages(URL2)[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
assert(mock_msg.messages(URL2)[2].message.screen == SCREEN1)
|
||||
|
||||
monarch.remove_listener(URL2)
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_not_busy())
|
||||
|
||||
assert(#mock_msg.messages(URL1) == 6)
|
||||
assert(#mock_msg.messages(URL2) == 2)
|
||||
assert(mock_msg.messages(URL1)[3].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
||||
assert(mock_msg.messages(URL1)[3].message.screen == SCREEN1)
|
||||
assert(mock_msg.messages(URL1)[4].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(mock_msg.messages(URL1)[4].message.screen == SCREEN2)
|
||||
assert(mock_msg.messages(URL1)[5].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
assert(mock_msg.messages(URL1)[5].message.screen == SCREEN2)
|
||||
assert(mock_msg.messages(URL1)[6].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
||||
assert(mock_msg.messages(URL1)[6].message.screen == SCREEN1)
|
||||
|
||||
monarch.back()
|
||||
assert(wait_until_not_busy())
|
||||
|
||||
local messages = mock_msg.filter(URL1, function(m)
|
||||
return m.message.screen == SCREEN1
|
||||
end)
|
||||
assert(messages[1].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(messages[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
assert(messages[3].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
||||
assert(messages[4].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
||||
assert(messages[5].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(messages[6].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
|
||||
messages = mock_msg.filter(URL2, function(m)
|
||||
return m.message.screen == SCREEN1
|
||||
end)
|
||||
assert(messages[1].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(messages[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
|
||||
messages = mock_msg.filter(URL1, function(m)
|
||||
return m.message.screen == SCREEN2
|
||||
end)
|
||||
assert(messages[1].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(messages[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
assert(messages[3].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
||||
assert(messages[4].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
||||
assert(#mock_msg.messages(URL1) == 10)
|
||||
assert(#mock_msg.messages(URL2) == 2)
|
||||
assert(mock_msg.messages(URL1)[7].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
|
||||
assert(mock_msg.messages(URL1)[7].message.screen == SCREEN2)
|
||||
assert(mock_msg.messages(URL1)[8].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
|
||||
assert(mock_msg.messages(URL1)[8].message.screen == SCREEN1)
|
||||
assert(mock_msg.messages(URL1)[9].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
|
||||
assert(mock_msg.messages(URL1)[9].message.screen == SCREEN1)
|
||||
assert(mock_msg.messages(URL1)[10].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
|
||||
assert(mock_msg.messages(URL1)[10].message.screen == SCREEN2)
|
||||
end)
|
||||
|
||||
it("should be able to show a screen even while it is preloading", function()
|
||||
monarch.show(SCREEN_PRELOAD, nil, { count = 1 })
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
end)
|
||||
|
||||
it("should be able to preload a screen and always keep it loaded", function()
|
||||
monarch.show(SCREEN_PRELOAD)
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
monarch.back()
|
||||
assert(wait_until_hidden(SCREEN_PRELOAD), "Screen_preload was never hidden")
|
||||
assert(monarch.is_preloaded(SCREEN_PRELOAD))
|
||||
@ -466,12 +483,12 @@ return function()
|
||||
|
||||
it("should be able to reload a preloaded screen", function()
|
||||
monarch.show(SCREEN_PRELOAD, nil, { count = 1 })
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
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, reload = true }, { count = 1 })
|
||||
assert(wait_until_visible(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
assert(wait_until_shown(SCREEN_PRELOAD), "Screen_preload was never shown")
|
||||
-- second time the screen gets shown it will be reloaded and increment the count
|
||||
assert(monarch.data(SCREEN_PRELOAD).count == 2)
|
||||
end)
|
||||
@ -482,84 +499,76 @@ return function()
|
||||
_G.focus1_lost = nil
|
||||
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1 }))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
monarch.show(FOCUS1)
|
||||
assert(wait_until_stack({ SCREEN1, FOCUS1 }))
|
||||
assert(wait_until_visible(FOCUS1))
|
||||
assert(wait_until_shown(FOCUS1), "Screen1 was never shown")
|
||||
assert(_G.focus1_gained)
|
||||
monarch.show(SCREEN1)
|
||||
assert(wait_until_stack({ SCREEN1, FOCUS1, SCREEN1 }))
|
||||
assert(wait_until_hidden(FOCUS1))
|
||||
assert(wait_until_shown(SCREEN1), "Screen1 was never shown")
|
||||
assert(wait_until_hidden(FOCUS1), "Focus1 was never hidden")
|
||||
assert(_G.focus1_lost)
|
||||
end)
|
||||
|
||||
|
||||
it("should be able to post messages without message data to visible screens", function()
|
||||
_G.screen1_on_message = nil
|
||||
_G.screen1_on_post = nil
|
||||
_G.screen2_on_message = nil
|
||||
_G.screen2_on_post = nil
|
||||
_G.screen1_foobar = nil
|
||||
_G.screen2_foobar = nil
|
||||
|
||||
-- proxy screen
|
||||
monarch.show(SCREEN1)
|
||||
wait_until_visible(SCREEN1)
|
||||
wait_until_shown(SCREEN1)
|
||||
assert(monarch.post(SCREEN1, "foobar"), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen1_on_message, "Screen1 never received a message")
|
||||
assert(_G.screen1_on_post, "Screen1 never received a callback")
|
||||
assert(_G.screen1_foobar, "Screen1 never received a message")
|
||||
|
||||
-- factory screen
|
||||
monarch.show(SCREEN2)
|
||||
wait_until_visible(SCREEN2)
|
||||
wait_until_shown(SCREEN2)
|
||||
assert(monarch.post(SCREEN2, "foobar"), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen2_on_message, "Screen2 never received a message")
|
||||
assert(_G.screen2_on_post, "Screen2 never received a callback")
|
||||
assert(_G.screen2_foobar, "Screen2 never received a message")
|
||||
end)
|
||||
|
||||
|
||||
it("should be able to post messages with message data to visible screens", function()
|
||||
_G.screen1_on_message = nil
|
||||
_G.screen1_on_post = nil
|
||||
_G.screen2_on_message = nil
|
||||
_G.screen2_on_post = nil
|
||||
_G.screen1_foobar = nil
|
||||
_G.screen2_foobar = nil
|
||||
|
||||
-- proxy screen
|
||||
monarch.show(SCREEN1)
|
||||
wait_until_visible(SCREEN1)
|
||||
wait_until_shown(SCREEN1)
|
||||
assert(monarch.post(SCREEN1, "foobar", { foo = "bar" }), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen1_on_message, "Screen1 never received a message")
|
||||
assert(_G.screen1_on_message.foo == "bar", "Screen1 never received message data")
|
||||
assert(_G.screen1_foobar, "Screen1 never received a message")
|
||||
assert(_G.screen1_foobar.foo == "bar", "Screen1 never received message data")
|
||||
|
||||
-- factory screen
|
||||
monarch.show(SCREEN2)
|
||||
wait_until_visible(SCREEN2)
|
||||
wait_until_shown(SCREEN2)
|
||||
assert(monarch.post(SCREEN2, "foobar", { foo = "bar" }), "Expected monarch.post() to return true")
|
||||
cowait(0.1)
|
||||
assert(_G.screen2_on_message, "Screen2 never received a message")
|
||||
assert(_G.screen2_on_message.foo == "bar", "Screen2 never received message data")
|
||||
assert(_G.screen2_foobar, "Screen2 never received a message")
|
||||
assert(_G.screen2_foobar.foo == "bar", "Screen2 never received message data")
|
||||
end)
|
||||
|
||||
|
||||
it("should not be able to post messages to hidden screens", function()
|
||||
_G.screen1_on_message = nil
|
||||
_G.screen1_on_post = nil
|
||||
_G.screen1_foobar = nil
|
||||
|
||||
monarch.show(SCREEN1)
|
||||
wait_until_shown(SCREEN1)
|
||||
monarch.show(SCREEN2)
|
||||
assert(wait_until_stack({ SCREEN1, SCREEN2 }))
|
||||
assert(wait_until_hidden(SCREEN1))
|
||||
wait_until_shown(SCREEN2)
|
||||
local ok, err = monarch.post(SCREEN1, "foobar")
|
||||
assert(not ok and err, "Expected monarch.post() to return false plus an error message")
|
||||
cowait(0.1)
|
||||
assert(not _G.screen1_on_message, "Screen1 should not have received a message")
|
||||
assert(not _G.screen1_foobar, "Screen1 should not have received a message")
|
||||
end)
|
||||
|
||||
|
||||
it("should not be able to post messages to proxy screens without a receiver url", function()
|
||||
monarch.show(POPUP1)
|
||||
wait_until_visible(POPUP1)
|
||||
wait_until_shown(POPUP1)
|
||||
local ok, err = monarch.post(POPUP1, "foobar")
|
||||
assert(not ok and err, "Expected monarch.post() to return false plus an error message")
|
||||
end)
|
||||
|
@ -8,12 +8,6 @@ local easing = require "monarch.transitions.easings"
|
||||
|
||||
return function()
|
||||
|
||||
local function wait_timeout(fn, ...)
|
||||
local args = { ... }
|
||||
cowait(function() return fn(unpack(args)) end, 5)
|
||||
return fn(...)
|
||||
end
|
||||
|
||||
describe("transitions", function()
|
||||
before(function()
|
||||
mock_msg.mock()
|
||||
@ -28,28 +22,6 @@ describe("transitions", function()
|
||||
end)
|
||||
|
||||
|
||||
it("should replace an existing transition with a new one", function()
|
||||
local one = false
|
||||
function dummy_transition1(node, to, easing, duration, delay, cb)
|
||||
one = true
|
||||
end
|
||||
local two = false
|
||||
function dummy_transition2(node, to, easing, duration, delay, cb)
|
||||
two = true
|
||||
end
|
||||
|
||||
local node = gui.new_box_node(vmath.vector3(), vmath.vector3(100, 100, 0))
|
||||
local duration = 2
|
||||
local t = transitions.create(node)
|
||||
t.show_in(dummy_transition1, easing.OUT, duration, delay or 0)
|
||||
t.show_in(dummy_transition2, easing.OUT, duration, delay or 0)
|
||||
t.handle(monarch.TRANSITION.SHOW_IN)
|
||||
|
||||
wait_timeout(function() return one or two end)
|
||||
assert(two)
|
||||
assert(not one)
|
||||
end)
|
||||
|
||||
it("should replay and immediately finish on layout change", function()
|
||||
function dummy_transition(node, to, easing, duration, delay, cb)
|
||||
print("dummy transition")
|
||||
|
Loading…
x
Reference in New Issue
Block a user