82 Commits

Author SHA1 Message Date
Hixie
60177a71ab Scoped focus, so you can have a dialog with input controls and not lose your focus in the background.
This introduces a GlobalKey registry so that you can tell when a key
has gone away (so you can unfocus dead dialogs).

Also I added an assert that you're not calling setState() during a
build. It turns out that doing so means you have a bug, because since
you're dirty already (you're building), you won't get rebuilt.

The focus code itself is gnarly. It uses a Component and an internal
Inherited TagNode to manage the focus state, and does crazy things
like updating its state during build to pretend retroactively that it
was built with some other state, once someone asks for focus the first
time (i.e. the first time it's examined, so you can't tell that it was
in a different state before). It does this so that it can autofocus
controls which otherwise wouldn't be focused.

This moves all the focus management into Navigator and showDialog(),
so the complexity is all buried deep and not visible to apps,
hopefully.

To do something like two tabs that each have an Input widget that
needs to be focused when you switch panes, you'd need to have two
Focus objects, one in each tab, and you need to set their autofocus to
true (maybe that should be the default?).
2015-07-24 18:18:04 -07:00
Hixie
df7fdb5b12 pushDialog(navigator, (navigator) => new Dialog(...)).then((result) => process(result)); 2015-07-24 17:40:41 -07:00
Collin Jackson
82f5f14b98 Move dialog into its own class 2015-07-24 15:16:40 -07:00
Ian Hickson
051655fa6d Merge pull request #278 from Hixie/nav-dialogs
Use the navigator to stack dialogs.
2015-07-24 15:02:20 -07:00
Hixie
db63850e42 Fix test breakage (stocks test imports stocks app differently than a recent checkin expected). 2015-07-24 14:54:56 -07:00
Hixie
ac6342ab8a Use the navigator to stack dialogs.
This removes the need to manually include the dialog builder in the main window's build() function.
It also removes the need to track if a dialog is visible.

Other changes:
- I made dialog.dart a bit more readable.
- I renamed transitionFinished to fullyOpaque since that's what actually matters.
- I made Routes track if they're opaque. Eventually this should probably be more configurable when creating the route.

Directions for Future Research:
- Use this for focus management somehow.
- The popup menu should use something like this.
- We should factor the following out into a showDialog() function that returns a future for the dialog's exit result:
    navigator.push(new DialogRoute(builder: (navigator, route) { ... }));
- Maybe navigator.pop() should take a value to return to that Future.
2015-07-24 14:33:09 -07:00
Adam Barth
c6fe01eda3 Merge pull request #274 from jimsimon/examples-as-libraries
Examples as libraries
2015-07-24 14:23:39 -07:00
Viktor Lidholt
45399c7a53 Fixes formatting and abstraction in GameMath 2015-07-24 12:59:08 -07:00
Viktor Lidholt
ab2b791866 Optimizes ColorSequence 2015-07-24 12:39:02 -07:00
Jim Simon
3089686eeb Converted examples to libraries
Converted demo launcher example to library

Converted fitness example to library

Converted hello world example to library

Converted mine digger example to library

Converted stocks example to library
2015-07-24 12:27:27 -07:00
Viktor Lidholt
2e2331ab5e Merge branch 'master' of github.com:domokit/sky_engine
Conflicts:
	sky/sdk/example/game/lib/particle_system.dart
2015-07-24 12:17:18 -07:00
Viktor Lidholt
53c66a5f4c Optimizations to particle systems. Uses single instance of Random and faster atan2 function. 2015-07-24 12:14:22 -07:00
Eric Seidel
4f8de2ee82 Merge pull request #271 from eseidelGoogle/draw_atlas
Use Skia's drawAtlas now that we've rolled to a newer Skia
2015-07-24 11:27:15 -07:00
Hans Muller
9ac347da62 Dismissable animation simplifications; added backgrounds to CardCollection cards 2015-07-24 11:15:37 -07:00
Eric Seidel
7a1e3bb389 Use Skia's drawAtlas now that we've rolled to a newer Skia
Roll was ff8bbe4e1674ae57f2ea3a2841a37a9c099beac8
This is another step in fixing #138

R=viktork@google.com
2015-07-24 11:11:30 -07:00
Collin Jackson
9f6fc78ceb Fix the new item dialog for fitness app 2015-07-24 10:27:16 -07:00
Viktor Lidholt
2bccb1890d Merge pull request #249 from vlidholt/master
Adds test case for drawAtlas in games
2015-07-23 14:44:37 -07:00
Viktor Lidholt
f3e51d9f05 Adds test case for drawAtlas in games 2015-07-23 14:39:39 -07:00
Hixie
2694d67551 Add a dialog to the address book app to test scoped focus. 2015-07-23 14:06:12 -07:00
Adam Barth
8a64baca3d Merge pull request #241 from abarth/sky_shell_apk
Create a SkyShell.apk
2015-07-23 13:32:15 -07:00
Viktor Lidholt
765881f264 Merge pull request #223 from vlidholt/master
Adds custom play button with texture to demo game
2015-07-23 13:30:25 -07:00
Viktor Lidholt
9a834384f1 Adds custom play button with texture to demo game 2015-07-23 13:27:17 -07:00
Adam Barth
c14ba33667 Create a SkyShell.apk
This CL introduces a SkyShell.apk that is separate from the SkyDemo.apk that we
upload to the store to show our demos.  The SkyShell.apk is just an empty shell
that can run Sky applications on Android.
2015-07-23 13:26:01 -07:00
Hixie
4e2893802d Remove the scheduleBuild() API.
I've noticed an anti-pattern emerge where people call scheduleBuild()
when they think they've changed enough state that they should rebuild,
instead of just wrapping their changes in setState(). This leads to
them missing state changes, having extraneous scheduleBuild() calls,
and other similar bugs.

By removing scheduleBuild(), the only way to actually schedule a build
now is to call setState(), and hopefully that'll make it much clearer
that you're only supposed to do this when you change state.
2015-07-23 12:55:48 -07:00
Eric Seidel
8998132d94 Add C++ based support for drawAtlas
This is supposed to make Viktor's game faster, but it's not clear
to me that it actually does.  I've left the code
using the dart version of drawAtlas for now until Viktor can
verify that it looks correct.

I also added a wrapper for SkFilterQuality in the process of
debugging SkCanvas.drawAtlas since all drawAtlas examples
in Skia use FilterQuality.low.  The bug which blocked me for
so long turned out to be that SkCanvas.drawAtlas doesn't
draw anything if antialiasing is turned on.

Issue #138.

R=abarth@google.com
2015-07-23 09:25:10 -07:00
Adam Barth
5aeff1ac1d Merge pull request #233 from abarth/fix_analyzer
Fix analyzer warnings
2015-07-23 08:56:10 -07:00
Adam Barth
59798b982e Fix analyzer warnings
- Remove unused imports
 - Remove unused, broken constructor for MineDiggerApp
2015-07-23 08:54:51 -07:00
Hixie
3aa0437ff2 Rename defaultFocus to initialFocus. 2015-07-23 08:43:40 -07:00
Eric Seidel
4da276710f Focus support.
This patch provides a class to manage focus, Focus, and a class to
manage ownership of the keyboard, KeyboardHandle.

Inherited (in widgets.dart) is adjusted to support subclasses that
need to copy state from instance to instance.

A GlobalKey key type is introduced that is basically the same as
UniqueKey. Component classes that need a globally-unique key can
specify that their 'key' constructor argument is a GlobalKey.

Focus
-----

You can use `Focus.at(this)` to determine if you, a Component, are
currently focused.

You can use `Focus.moveTo(this)` to take the focus or give it to a
particular component.

For this to work, there has to be a Focus class in the widget
hierarchy.

Currently, there can only be one Focus class, because nested scopes
aren't supported. We should add support for that in a future patch.
See issue #229.

KeyboardHandle
--------------

Instead of directly interacting with the keyboard service, you now ask
for a KeyboardHandle using `_keyboard.show(client)`. This returns a
KeyboardHandle class. On that class, you can call `handle.release()`
when you want to hide the keyboard. If `handle.attached` is still
true, and you need to reshow the keyboard after the user hid it, then
you can can `handle.showByRequest()`.

The point of this is that the `keyboard.show()` method maintains the
invariant that only one KeyboardHandle is live at a time.

There are some issues with the keyboard service that I filed as a
result of doing this patch: #226 #227
2015-07-23 08:43:40 -07:00
Adam Barth
3331d44f2d Don't try to access the network in Stocks test
Accessing the network created a race condition that would sometimes cause other
tests to fail.
2015-07-23 08:39:42 -07:00
Hans Muller
571a92ce3b Dismissable provides intrinsic support for resize animation 2015-07-22 12:55:45 -07:00
Viktor Lidholt
35b5ecf873 Merge branch 'master' of github.com:domokit/sky_engine 2015-07-22 10:37:55 -07:00
Viktor Lidholt
34e1268f1f Adds scoring and level up in game demo 2015-07-22 10:37:28 -07:00
Collin Jackson
eced8b3cbd Fix build 2015-07-22 10:28:43 -07:00
Collin Jackson
ad569a2393 Merge remote-tracking branch 'dk/master' into meal
Conflicts:
	sky/sdk/example/fitness/lib/feed.dart
2015-07-22 10:21:48 -07:00
mpcomplete
2c84154b75 Merge pull request #211 from mpcomplete/rm.builder.3
Make SnackBar animate itself.

This introduces a bit of a regression - the FloatingActionButton no longer animates. I'm not sure yet how to animated the FAB along with the SnackBar. Maybe some notion of anchoring a node to another.

Also remove last use of AnimationBuilder.
2015-07-22 12:29:57 -04:00
Hixie
74575775bd Introduce an explicit Key type.
This fixes some theoretical bugs whereby we were using hashCode to try
to get unique keys for objects, but really we wanted object identity.
It also lays the groundwork for a new GlobalKey concept.

I tried to keep the impact on the code minimal, which is why the "Key"
constructor is actually a factory that returns a StringKey. The code
has this class hierarchy:

```
   KeyBase
    |
   Key--------------+---------------+
    |               |               |
   StringKey    ObjectKey       UniqueKey
```

...where the constructors are Key and Key.stringify (StringKey),
Key.fromObjectIdentity (ObjectKey), and Key.unique (UniqueKey).

We could instead of factory methods use regular constructors with the
following hierarchy:

```
   KeyBase
    |
   LocalKey---------+---------------+
    |               |               |
   Key      ObjectIdentityKey   UniqueKey
```

...with constructors Key, Key.stringify, ObjectIdentityKey, and
UniqueKey, but I felt that that was maybe a more confusing hierarchy.
I don't have a strong opinion on this.
2015-07-22 09:14:06 -07:00
Viktor Lidholt
bb0c8bb13e Merge pull request #202 from vlidholt/master
Fixes issues with invalidating matrix for SpriteBox & adds HUD to demo game
2015-07-22 09:01:39 -07:00
Viktor Lidholt
6a6567d776 Fixes formatting and removes redundant code in sprites 2015-07-22 08:59:14 -07:00
Matt Perry
b31e06a5d6 Make SnackBar animate itself. 2015-07-22 11:53:57 -04:00
Matt Perry
839e997e78 rebase 2015-07-22 11:52:34 -04:00
Ian Hickson
b215e4d6c0 Merge pull request #205 from Hixie/minedigger
Many code improvements to Mine Digger.
2015-07-22 08:23:55 -07:00
Adam Barth
73123a3c08 Merge pull request #201 from eseidelGoogle/fuzz_crashes
Fix 2 crashes found by Hixie's fuzzer.
2015-07-21 19:59:24 -07:00
Hixie
4d2902f219 Many code improvements to Mine Digger.
Text styles are now a global constant instead of being initialised dynamically.
There are now sufficient text styles for 8 mines around a square.
I coallesced Game and MineDiggerApp.
Used an enum instead of constants for the cell state.
Used setState() instead of scheduleBuild().
Used an O(N) algorithm for mine laying instead of the previous potentially-never-ending algorithm.
Moved the listener on the cells to the app, so that the logic survives a rebuild.
Various other minor changes.
2015-07-21 17:24:51 -07:00
Collin Jackson
1f768ce2ba First pass at adding meal tracking to fitness app 2015-07-21 17:13:00 -07:00
Viktor Lidholt
972417f54e Merge branch 'master' of github.com:domokit/sky_engine 2015-07-21 16:46:14 -07:00
Viktor Lidholt
271812259b Fixes issues in demo game and adds heads up display 2015-07-21 16:45:53 -07:00
Viktor Lidholt
b26bae8a45 Fixes issues with invalidating matrix for SpriteBox 2015-07-21 16:42:51 -07:00
Eric Seidel
8f85f34d27 Fix 2 crashers found by Hixie's fuzzer.
The first one is that we weren't setting up a
FontCachePurgePreventer during drawText.  It's not clear
that this is the correct fix, since Blink doesn't have
this FontCachePurgePreventer here either, but it's also
possible that they would hit this same ASSERT and just
not care (since ASSERTs are disabled on clusterfuzz).

The second fix is making ExceptionState actually track
whether it has thrown an exception or not. The c++ code
was depending on this working in order to return early
from dom functions and not crash!

R=abarth@google.com
2015-07-21 16:29:04 -07:00
Hixie
6d304c03ac Remove redundant operator== and hashCode functions in card example.
It turns out that we aren't really using these. The identity logic is sufficient.

Also, add some asserts for a crash I had once but couldn't reproduce, in case that helps catch it next time.
2015-07-21 15:26:54 -07:00