Comments (5)
Thanks for raising the issue @do0g , and for the chat earlier!
To continue from what Jordan said, some initial thoughts...
During the actual process of handling a movement, before the assignFocus()
is called (thus "completing the movement") we provide an opportunity for a callback to fire.
If said callback returns true, instead of assigning the focus and firing the focus
and move
events, we fire a cancelled
event on the instance itself e.g
navigation.on('cancelled', (leaveNode, enterNode) => {
// leaving `leaveNode` and entering `enterNode` was cancelled for reasons...
});
(We can also, at that point, call an onCancelled
hook if one was supplied on the node to be focused.)
navigation.registerNode('myBox', {
parent: 'myContainer',
onCancelled: (leave, enter) => {
// movement from `leave` to `enter` was cancelled, where `enter` is _this_ node itself
}
}
The actual cancellation callback itself should also live against the node that was to be "entered", I'm thinking? Some kind of shouldCancel()
callback.
navigation.registerNode('myBox', {
parent: 'myContainer',
onCancelled: (leave, enter) => {
// movement from `leave` to `enter` was cancelled, where `enter` is _this_ node itself
},
shouldCancel: (leave, enter) : boolean => {
// movement from `leave` to `enter` is happening, here is an opportunity
// to call some business logic to `return false` and stop that movement
}
}
Otherwise, perhaps a shouldCancel()
on the instance itself? And it is called for every movement that happens. Before both in fact.
navigation
.registerNode('root')
.registerNode('box1')
.registerNode('box2')
.registerNode('box3')
navigation.shouldCancel((leave, enter => {
// movement from `leave` to `enter` is happening, here is an opportunity
// to call some business logic to `return true` and stop that movement
})
from lrud.
Interesting use case... I think I would prefer the first described implementation where the move operation provides a callback, and if that callback returns true, the move completes.
from lrud.
Another point worth thinking about is how this interacts (if at all) with the existing "overrides" mechanism.
from lrud.
This looks pretty good to me. Either of the node or instance solutions would probably work for us, but both would be very flexible.
from lrud.
Closing this issue, as it was fixed by #30
from lrud.
Related Issues (20)
- Add a meta field for nodes to freely store data HOT 1
- Moving a node index under the same parent HOT 1
- Focused node becomes unfocused when separate part of tree removed
- LRUD gets confused when encountering empty nodes HOT 1
- Why is a node not considered "focusable" even if it has children that are and even though assignFocus works on said node? HOT 1
- Best way to restore default active child when entering / leaving a parent? HOT 1
- Having an issue in my app related to LRUD clearing `currentFocusNode`
- v5.0.6 not pushed to npm? HOT 1
- Can keyCode be made optional in KeyEvent interface?
- Any body out there know of something similar to this for the Roku platform? (lrud specificly (not javascript))
- failure when using setNodefocusable HOT 1
- Asyncronous adding items at higher index than total list count
- Uncaught RangeError: Maximum call stack size exceeded
- Focus can not jump over last node that is not focusable HOT 1
- Can not focus node that contains only non focusable nodes HOT 1
- Method insertTree incorrectly maintain index when replacing first child HOT 1
- Overrides of children are not cleaned up when unregistering parent node HOT 1
- Registering node with already occupied index makes the index out of sync
- Should I use insertTree or registerTree? HOT 2
- Active parents don't always deactivate when in a nested tree
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from lrud.