mirror of
https://github.com/britzl/monarch.git
synced 2025-11-26 19:00:53 +01:00
Compare commits
7 Commits
dev-improv
...
4.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e13660d63 | ||
|
|
0191a4e540 | ||
|
|
c601174b9d | ||
|
|
66d2c98ccc | ||
|
|
e8249229b9 | ||
|
|
2eb67bf29d | ||
|
|
fe8341263a |
2
.github/workflows/ci-workflow.yml
vendored
2
.github/workflows/ci-workflow.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: '11'
|
||||
java-version: '17'
|
||||
- name: Run.sh
|
||||
env:
|
||||
DEFOLD_USER: bjorn.ritzl@gmail.com
|
||||
|
||||
43
README.md
43
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)** - 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()`.
|
||||
* **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()`.
|
||||
* **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)** - 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)).
|
||||
* **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)).
|
||||
* **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,18 +161,30 @@ 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 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:
|
||||
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)`
|
||||
|
||||
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 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
|
||||
function init(self)
|
||||
monarch.on_focus_changed("foobar", function(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).
|
||||
@@ -180,10 +192,3 @@ 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`.
|
||||
|
||||
@@ -189,6 +189,32 @@ Post a message to a visible screen. If the screen is created through a collectio
|
||||
* `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)
|
||||
Set a function to be called when `msg.post()` is called on a specific screen. 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 the screen receives a message using `msg.post`
|
||||
|
||||
|
||||
## monarch.debug()
|
||||
Enable verbose logging of the internals of Monarch.
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# 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. 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:
|
||||
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:
|
||||
|
||||
* `transition_show_in` (constant defined as `monarch.TRANSITION.SHOW_IN`)
|
||||
* `transition_show_out` (constant defined as `monarch.TRANSITION.SHOW_OUT`)
|
||||
@@ -8,6 +10,11 @@ You can add optional transitions when navigating between screens. The default be
|
||||
|
||||
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:
|
||||
@@ -20,15 +27,17 @@ 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
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
local 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)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(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!")
|
||||
@@ -40,7 +49,7 @@ It is also possible to assign transitions to multiple nodes:
|
||||
|
||||
```lua
|
||||
function init(self)
|
||||
self.transition = transitions.create() -- note that no node is passed to transition.create()!
|
||||
local 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
|
||||
@@ -111,7 +120,7 @@ end
|
||||
```
|
||||
|
||||
## Screen stack info and transitions
|
||||
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:
|
||||
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:
|
||||
|
||||
```lua
|
||||
function on_message(self, message_id, message, sender)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 83 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 92 KiB |
@@ -5,11 +5,13 @@ function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
gui.set_render_order(15)
|
||||
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
local 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)
|
||||
@@ -27,5 +29,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
|
||||
@@ -21,16 +21,6 @@ embedded_instances {
|
||||
" value: \"menu\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\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"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
@@ -146,11 +136,6 @@ embedded_instances {
|
||||
" value: \"pregame\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"pregame:/go#pregame\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
@@ -211,11 +196,6 @@ embedded_instances {
|
||||
" value: \"game\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"game:/go#game\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
@@ -287,16 +267,6 @@ 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"
|
||||
@@ -376,11 +346,6 @@ embedded_instances {
|
||||
" value: \"true\"\n"
|
||||
" type: PROPERTY_TYPE_BOOLEAN\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"confirm:/go#confirm\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
|
||||
@@ -7,11 +7,13 @@ function init(self)
|
||||
self.no = gui.get_node("no_button")
|
||||
gui.set_render_order(15)
|
||||
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
local 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)
|
||||
@@ -35,5 +37,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
|
||||
@@ -3,11 +3,12 @@ local transitions = require "monarch.transitions.gui"
|
||||
|
||||
function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
|
||||
|
||||
local data = monarch.data(hash("game"))
|
||||
gui.set_text(gui.get_node("level"), tostring(data.level))
|
||||
|
||||
self.transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
local transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
monarch.on_transition("game", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@@ -21,5 +22,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
|
||||
@@ -8,7 +8,8 @@ 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)
|
||||
|
||||
self.transition = transitions.fade_in_out(gui.get_node("root"), 0.6, 0)
|
||||
local transition = transitions.fade_in_out(gui.get_node("root"), 0.6, 0)
|
||||
monarch.on_transition("menu", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@@ -28,7 +29,7 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
if message_id == monarch.FOCUS.GAINED then
|
||||
gui.set_text(gui.get_node("timestamp"), os.date())
|
||||
end
|
||||
|
||||
@@ -9,12 +9,13 @@ function init(self)
|
||||
gui.set_render_order(14)
|
||||
|
||||
gui.animate(gui.get_node("spinner"), gui.PROP_ROTATION, vmath.vector3(0, 0, -360), gui.EASING_INOUTQUAD, 2, 0, nil, gui.PLAYBACK_LOOP_FORWARD)
|
||||
|
||||
self.transition = transitions.create(gui.get_node("root"))
|
||||
|
||||
local 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)
|
||||
@@ -39,5 +40,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
|
||||
@@ -5,8 +5,9 @@ function init(self)
|
||||
msg.post(".", "acquire_input_focus")
|
||||
self.play = gui.get_node("play_button")
|
||||
self.back = gui.get_node("back_button")
|
||||
|
||||
self.transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
|
||||
local transition = transitions.in_right_out_left(gui.get_node("root"), 0.6, 0)
|
||||
monarch.on_transition("pregame", transition)
|
||||
end
|
||||
|
||||
function on_input(self, action_id, action)
|
||||
@@ -26,5 +27,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
|
||||
@@ -58,11 +58,6 @@ embedded_instances {
|
||||
" value: \"window1\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"window1:/go\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
@@ -123,11 +118,6 @@ embedded_instances {
|
||||
" value: \"window2\"\n"
|
||||
" type: PROPERTY_TYPE_HASH\n"
|
||||
" }\n"
|
||||
" properties {\n"
|
||||
" id: \"transition_url\"\n"
|
||||
" value: \"window2:/go\"\n"
|
||||
" type: PROPERTY_TYPE_URL\n"
|
||||
" }\n"
|
||||
" property_decls {\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
|
||||
@@ -47,7 +47,7 @@ nodes {
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
adjust_mode: ADJUST_MODE_STRETCH
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
|
||||
@@ -2,14 +2,24 @@ local monarch = require "monarch.monarch"
|
||||
local transitions = require "monarch.transitions.gui"
|
||||
|
||||
function init(self)
|
||||
print("window2", msg.url())
|
||||
self.transition = transitions.create(gui.get_node("bg"))
|
||||
.show_in(transitions.slide_in_right, gui.EASING_LINEAR, 0.3, 0)
|
||||
.show_out(transitions.slide_out_left, gui.EASING_LINEAR, 0.3, 0)
|
||||
.back_in(transitions.slide_in_left, gui.EASING_LINEAR, 0.3, 0)
|
||||
.back_out(transitions.slide_out_right, gui.EASING_LINEAR, 0.3, 0)
|
||||
|
||||
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)
|
||||
@@ -21,5 +31,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
@@ -47,7 +47,7 @@ nodes {
|
||||
xanchor: XANCHOR_NONE
|
||||
yanchor: YANCHOR_NONE
|
||||
pivot: PIVOT_CENTER
|
||||
adjust_mode: ADJUST_MODE_FIT
|
||||
adjust_mode: ADJUST_MODE_STRETCH
|
||||
layer: ""
|
||||
inherit_alpha: true
|
||||
slice9 {
|
||||
|
||||
@@ -2,14 +2,16 @@ local monarch = require "monarch.monarch"
|
||||
local transitions = require "monarch.transitions.gui"
|
||||
|
||||
function init(self)
|
||||
print("window2", msg.url())
|
||||
self.transition = transitions.create(gui.get_node("bg"))
|
||||
.show_in(transitions.slide_in_right, gui.EASING_LINEAR, 0.3, 0)
|
||||
.show_out(transitions.slide_out_left, gui.EASING_LINEAR, 0.3, 0)
|
||||
.back_in(transitions.slide_in_left, gui.EASING_LINEAR, 0.3, 0)
|
||||
.back_out(transitions.slide_out_right, gui.EASING_LINEAR, 0.3, 0)
|
||||
|
||||
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)
|
||||
@@ -21,5 +23,5 @@ function on_input(self, action_id, action)
|
||||
end
|
||||
|
||||
function on_message(self, message_id, message, sender)
|
||||
self.transition.handle(message_id, message, sender)
|
||||
monarch.on_message(message_id, message, sender)
|
||||
end
|
||||
@@ -5,7 +5,7 @@ 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
|
||||
|
||||
[bootstrap]
|
||||
main_collection = /example/slidingwindow/slidingwindow.collectionc
|
||||
main_collection = /example/advanced/advanced.collectionc
|
||||
|
||||
[input]
|
||||
game_binding = /input/game.input_bindingc
|
||||
|
||||
@@ -3,16 +3,25 @@ local async = require "monarch.utils.async"
|
||||
|
||||
local M = {}
|
||||
|
||||
local CONTEXT = hash("monarch_context")
|
||||
local PROXY_LOADED = hash("proxy_loaded")
|
||||
local PROXY_UNLOADED = hash("proxy_unloaded")
|
||||
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 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")
|
||||
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__")
|
||||
|
||||
-- transition messages
|
||||
M.TRANSITION = {}
|
||||
@@ -81,10 +90,13 @@ local function assign(to, from)
|
||||
return to
|
||||
end
|
||||
|
||||
local function cowait(delay)
|
||||
local function cowait(screen, delay)
|
||||
log("cowait()", screen.id, 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()
|
||||
@@ -134,23 +146,49 @@ local function notify_transition_listeners(message_id, message)
|
||||
end
|
||||
end
|
||||
|
||||
local function screen_from_proxy(proxy)
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.proxy == proxy then
|
||||
return screen
|
||||
local function find_screen(url_to_find)
|
||||
local function find(url)
|
||||
for _,screen in pairs(screens) do
|
||||
if 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 screen_from_script()
|
||||
local url = msg.url()
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.script == url then
|
||||
return screen
|
||||
local function find_transition_screen(url_to_find)
|
||||
local function find(url)
|
||||
for _,screen in pairs(screens) do
|
||||
if screen.transition_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_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)
|
||||
@@ -234,12 +272,6 @@ 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")
|
||||
@@ -249,6 +281,15 @@ 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.path == DEPRECATED then
|
||||
screen.transition_url = nil
|
||||
end
|
||||
if screen.focus_url.path == DEPRECATED then
|
||||
screen.focus_url = nil
|
||||
end
|
||||
if screen.receiver_url.path == DEPRECATED then
|
||||
screen.receiver_url = nil
|
||||
end
|
||||
if screen.auto_preload then
|
||||
M.preload(id)
|
||||
end
|
||||
@@ -271,10 +312,6 @@ 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")
|
||||
@@ -283,6 +320,13 @@ 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
|
||||
@@ -296,6 +340,7 @@ function M.unregister(id)
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
log("unregister()", id)
|
||||
local screen = screens[id]
|
||||
screens[id] = nil
|
||||
-- remove screen from stack
|
||||
for i = #stack, 1, -1 do
|
||||
@@ -303,16 +348,20 @@ function M.unregister(id)
|
||||
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, ACQUIRE_INPUT_FOCUS)
|
||||
msg.post(screen.script, MSG_ACQUIRE_INPUT_FOCUS)
|
||||
elseif screen.factory then
|
||||
for id,instance in pairs(screen.factory_ids) do
|
||||
msg.post(instance, ACQUIRE_INPUT_FOCUS)
|
||||
msg.post(instance, MSG_ACQUIRE_INPUT_FOCUS)
|
||||
end
|
||||
end
|
||||
screen.input = true
|
||||
@@ -330,10 +379,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, RELEASE_INPUT_FOCUS)
|
||||
msg.post(screen.script, MSG_RELEASE_INPUT_FOCUS)
|
||||
elseif screen.factory then
|
||||
for id,instance in pairs(screen.factory_ids) do
|
||||
msg.post(instance, RELEASE_INPUT_FOCUS)
|
||||
msg.post(instance, MSG_RELEASE_INPUT_FOCUS)
|
||||
end
|
||||
end
|
||||
screen.input = false
|
||||
@@ -343,24 +392,25 @@ end
|
||||
|
||||
local function change_context(screen)
|
||||
log("change_context()", screen.id)
|
||||
screen.wait_for = CONTEXT
|
||||
msg.post(screen.script, CONTEXT, { id = screen.id })
|
||||
screen.wait_for = WAITFOR_CONTEXT
|
||||
msg.post(screen.script, MSG_CONTEXT, { id = screen.id })
|
||||
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, DISABLE)
|
||||
msg.post(screen.proxy, MSG_DISABLE)
|
||||
screen.loaded = false
|
||||
end
|
||||
screen.preloaded = true
|
||||
else
|
||||
screen.wait_for = PROXY_UNLOADED
|
||||
msg.post(screen.proxy, UNLOAD)
|
||||
screen.wait_for = WAITFOR_PROXY_UNLOADED
|
||||
msg.post(screen.proxy, MSG_UNLOAD)
|
||||
coroutine.yield()
|
||||
screen.loaded = false
|
||||
screen.preloaded = false
|
||||
@@ -384,8 +434,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(0)
|
||||
cowait(0)
|
||||
cowait(screen, 0)
|
||||
cowait(screen, 0)
|
||||
end
|
||||
|
||||
|
||||
@@ -408,9 +458,13 @@ local function preload(screen)
|
||||
screen.preloading = false
|
||||
return false, error_message
|
||||
end
|
||||
screen.wait_for = PROXY_LOADED
|
||||
msg.post(screen.proxy, ASYNC_LOAD)
|
||||
screen.wait_for = WAITFOR_PROXY_LOADED
|
||||
msg.post(screen.proxy, MSG_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
|
||||
@@ -418,6 +472,9 @@ 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
|
||||
@@ -449,7 +506,7 @@ local function load(screen)
|
||||
end
|
||||
|
||||
if screen.proxy then
|
||||
msg.post(screen.proxy, ENABLE)
|
||||
msg.post(screen.proxy, MSG_ENABLE)
|
||||
elseif screen.factory then
|
||||
screen.factory_ids = collectionfactory.create(screen.factory)
|
||||
screen.transition_url = screen.factory_ids[screen.transition_id]
|
||||
@@ -462,8 +519,9 @@ end
|
||||
|
||||
local function transition(screen, message_id, message, wait)
|
||||
log("transition()", screen.id)
|
||||
if screen.unregistered then return end
|
||||
if screen.transition_url then
|
||||
screen.wait_for = M.TRANSITION.DONE
|
||||
screen.wait_for = WAITFOR_TRANSITION_DONE
|
||||
msg.post(screen.transition_url, message_id, message)
|
||||
if wait then
|
||||
coroutine.yield()
|
||||
@@ -485,14 +543,15 @@ 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(0)
|
||||
cowait(0)
|
||||
cowait(screen, 0)
|
||||
cowait(screen, 0)
|
||||
else
|
||||
log("focus_lost() no focus url - ignoring")
|
||||
end
|
||||
@@ -612,6 +671,8 @@ local function show_in(screen, previous_screen, reload, add_to_stack, wait_for_t
|
||||
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)
|
||||
transition(screen, M.TRANSITION.SHOW_IN, { previous_screen = previous_screen and previous_screen.id }, wait_for_transition)
|
||||
screen.visible = true
|
||||
@@ -636,6 +697,8 @@ 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)
|
||||
@@ -1127,30 +1190,58 @@ end
|
||||
|
||||
|
||||
function M.on_message(message_id, message, sender)
|
||||
if message_id == PROXY_LOADED then
|
||||
local screen = screen_from_proxy(sender)
|
||||
if message_id == MSG_PROXY_LOADED then
|
||||
local screen = find_screen(sender)
|
||||
assert(screen, "Unable to find screen for loaded proxy")
|
||||
if screen.wait_for == PROXY_LOADED then
|
||||
if screen.wait_for == WAITFOR_PROXY_LOADED then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == PROXY_UNLOADED then
|
||||
local screen = screen_from_proxy(sender)
|
||||
elseif message_id == MSG_PROXY_UNLOADED then
|
||||
local screen = find_screen(sender)
|
||||
assert(screen, "Unable to find screen for unloaded proxy")
|
||||
if screen.wait_for == PROXY_UNLOADED then
|
||||
if screen.wait_for == WAITFOR_PROXY_UNLOADED then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == CONTEXT then
|
||||
local screen = screen_from_script()
|
||||
elseif message_id == MSG_CONTEXT then
|
||||
local screen = find_screen(sender)
|
||||
assert(screen, "Unable to find screen for current script url")
|
||||
if screen.wait_for == CONTEXT then
|
||||
if screen.wait_for == WAITFOR_CONTEXT then
|
||||
assert(coroutine.resume(screen.co))
|
||||
end
|
||||
elseif message_id == M.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
|
||||
local screen = find_transition_screen(sender)
|
||||
assert(screen, "Unable to find screen for transition")
|
||||
if screen.wait_for == WAITFOR_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
|
||||
|
||||
@@ -1197,6 +1288,57 @@ function M.set_timestep_below_popup(id, 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 a function to call when a screen is sent a message using monarch.post()
|
||||
-- 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 the message listener function with
|
||||
-- @param fn Message listener function
|
||||
function M.on_post(id, fn)
|
||||
assert(id, "You must provide a screen id")
|
||||
assert(fn, "You must provide a post receiver function")
|
||||
id = tohash(id)
|
||||
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
|
||||
local screen = screens[id]
|
||||
screen.receiver_url = msg.url()
|
||||
screen.receiver_fn = fn
|
||||
end
|
||||
|
||||
local function url_to_key(url)
|
||||
return (url.socket or hash("")) .. (url.path or hash("")) .. (url.fragment or hash(""))
|
||||
end
|
||||
|
||||
@@ -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(""))
|
||||
go.property("focus_id", hash(""))
|
||||
go.property("transition_id", hash("__DEPRECATED__"))
|
||||
go.property("focus_id", hash("__DEPRECATED__"))
|
||||
go.property("preload", false)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ function init(self)
|
||||
monarch = require "monarch.monarch"
|
||||
assert(not self.popup_on_popup or (self.popup_on_popup and self.popup), "Popup on Popups can only be set if the Popup flag is set")
|
||||
assert(self.screen_factory ~= msg.url(), "You must specify either a factory URL")
|
||||
|
||||
|
||||
local settings = {
|
||||
popup = self.popup,
|
||||
popup_on_popup = self.popup_on_popup,
|
||||
|
||||
@@ -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())
|
||||
go.property("focus_url", msg.url())
|
||||
go.property("receiver_url", msg.url())
|
||||
go.property("transition_url", msg.url("__DEPRECATED__"))
|
||||
go.property("focus_url", msg.url("__DEPRECATED__"))
|
||||
go.property("receiver_url", msg.url("__DEPRECATED__"))
|
||||
go.property("preload", false)
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ function init(self)
|
||||
assert(not self.popup_on_popup or (self.popup_on_popup and self.popup), "Popup on Popups can only be set if the Popup flag is set")
|
||||
assert(self.screen_proxy ~= url, "You must specify either a proxy URL")
|
||||
assert(self.timestep_below_popup >= 0, "Timestep must be positive")
|
||||
|
||||
|
||||
local settings = {
|
||||
popup = self.popup,
|
||||
popup_on_popup = self.popup_on_popup,
|
||||
|
||||
@@ -20,10 +20,10 @@ local LAYOUT_CHANGED = hash("layout_changed")
|
||||
function M.window_resized(width, height)
|
||||
WIDTH = width
|
||||
HEIGHT = height
|
||||
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)
|
||||
LEFT = vmath.vector3(-WIDTH, 0, 0)
|
||||
RIGHT = vmath.vector3(WIDTH, 0, 0)
|
||||
TOP = vmath.vector3(0, HEIGHT, 0)
|
||||
BOTTOM = vmath.vector3(0, - HEIGHT, 0)
|
||||
end
|
||||
|
||||
M.window_resized(tonumber(sys.get_config("display.width")), tonumber(sys.get_config("display.height")))
|
||||
@@ -173,10 +173,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,7 +254,11 @@ local function create()
|
||||
return instance
|
||||
end
|
||||
|
||||
return instance
|
||||
return setmetatable(instance, {
|
||||
__call = function(t, ...)
|
||||
return instance.handle(...)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
function M.create(node)
|
||||
|
||||
Reference in New Issue
Block a user