2592 Commits

Author SHA1 Message Date
Matt Perry
3b4093e14e Merge remote-tracking branch 'upstream/master' into performance 2015-07-28 17:23:42 -04:00
Matt Perry
09dc392945 Add an AnimationStatus to AnimationPerformance, and use that in Drawer,
SnackBar, and PopupMenu instead of custom statuses.
2015-07-28 17:23:27 -04:00
Adam Barth
5d15bb5126 Move build() off microtasks
Rather than using a microtask to schedule component build functions, instead
use the scheduler. We now tread building just like layout and painting as a
visual update.
2015-07-28 14:05:21 -07:00
Matt Perry
b79a73136a Refactor AnimationContainer to support drop-in Intentions.
This lets us be flexible in how to animate the properties of the container.
Currently used by SnackBar with a SlideIn intention.
2015-07-28 14:12:17 -04:00
Hans Muller
6a17d1806d When the selected tab changes in a TabBar for which isScrollable:true, animate the selected tab to the center of the viewport, if that's possible.
Added an optional duration: to Scrollable.scrollTo(newOffset, duration: d) which animates the scroll to newOffset.

Refactored the Scrollable implementation a little to make the roles of the "toEnd" and "toOffset" animations clearer.

_handlePointerDown() now stops both animations.

Similarly, we only call settleScrollOffset() from the cancel gesture handlers if the animations aren't already running.
2015-07-28 10:23:34 -07:00
Adam Barth
ff1f08333f Merge pull request #297 from abarth/network_nits
Cleanups to network service
2015-07-27 14:04:08 -07:00
Adam Barth
b9e74071d8 Cleanups to network service
This patch contains some minor improvements to the network service:

- We now cache the connection to the network service so we don't need to spin
  it up for each request.
- We now manage the lifetime of NetworkServiceImpl in the same way as other
  services.

Also, update the workbench sky_tools dependency to the latest version.
2015-07-27 13:50:42 -07:00
Hans Muller
65caad4703 Enable fling scrolling in TabBar 2015-07-27 11:13:37 -07:00
Adam Barth
c420d2c3f4 Fix sky_tool's installing of SkyShell.apk
We were walking over to the realdir too quickly, which meant we lost which
version of the sky_engine package we were supposed to use.
2015-07-27 10:05:16 -07:00
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
f13f8894e4 Fix review feedback from previous checkin.
@abarth doesn't like Futures that explicitly point out they're type-unsafe. :-P
2015-07-24 18:08:04 -07:00
Hixie
1b7aa1153e Fix the lerp the RIGHT way. 2015-07-24 18:05:14 -07:00
Ian Hickson
4f9f5656c7 Merge pull request #281 from Hixie/buttons
Fix the crash for buttons.
2015-07-24 17:55:13 -07:00
Hixie
be5545cf28 Fix the crash for buttons.
Turns out there was a typo in lerpColor.

Fixes #277.
2015-07-24 17:44:20 -07:00
Hixie
df7fdb5b12 pushDialog(navigator, (navigator) => new Dialog(...)).then((result) => process(result)); 2015-07-24 17:40:41 -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
Hans Muller
9ac347da62 Dismissable animation simplifications; added backgrounds to CardCollection cards 2015-07-24 11:15:37 -07:00
Adam Barth
edd9ddccb4 Remove the magic from the Sky package
We now just symlink the lib directory into the packages directory in the output
directory.
2015-07-23 16:52:32 -07:00
Adam Barth
1892149897 Move Material Design Icons to their own package
After this patch, we use pub to manage versioning and fetching the material
design icons.
2015-07-23 14:54:59 -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
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
Hixie
eb90899aab Track global keys globally.
Assert that there are no duplicates.
Export GlobalKey from basic.dart, so that people don't have to import widgets.dart just for that.
Fix the "initialFocus" feature which actually didn't work.
2015-07-23 11:10:04 -07:00
Adam Barth
7224089c9f Merge pull request #230 from abarth/use_dart_http_server
Switch sky_tool to use a Dart-based HTTP server
2015-07-23 09:28:40 -07:00
Hixie
144fe36e25 RenderConstrainedBox was ignoring its additional constraints for its intrinsic size logic when it had no child. 2015-07-23 09:06:34 -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
278e0ab29d Switch sky_tool to use a Dart-based HTTP server
The Python HTTP server was caching too agressively. Instead, use an HTTP server
written in Dart from the sky_tools package.
2015-07-23 00:22:41 -07:00
Ian Hickson
3d41fb8a89 Merge pull request #215 from Hixie/crash-settings
Fix the crash when going to settings after showing the popup menu.
2015-07-22 18:16:08 -07:00
Hixie
bf33f1fcc6 Make center part of toolbar optional. 2015-07-22 15:57:51 -07:00
Hans Muller
571a92ce3b Dismissable provides intrinsic support for resize animation 2015-07-22 12:55:45 -07:00
Hixie
a50b065197 Fix the crash when going to settings after showing the popup menu.
If your constraints are tight when you get laid out, you don't get a
relayout subtree root.

If you don't have a relayout subtree root, and you get marked dirty,
you go through layoutWithoutResize() rather than layout(), so we don't
get a parentUsesSize.

If you're not dirty and your constraints didn't change, layout() skips
your layout.

So then if your initial layout had parentUsesSize:true, and then you
got marked dirty directly, you would set your size with
parentCanUseSize=false, and then later if your parent tried to lay you
out then read your size, it would crash because your size wasn't set
up to allow you to get your size.

The fix is to actually remember the last setting of parentUsesSize,
even in the case of the constraints being tight and you later being
marked as needing layout directly.
2015-07-22 10:10:58 -07:00
Hixie
4dacd69b41 Don't set keys on images, etc, pre-emptively.
In theory, before, if you had the same image twice in a scrolling container, you'd get an assertion with no way around it.
This makes those nodes not bother making keys by default, which is cheaper and more correct.
2015-07-22 10:05:19 -07:00
Adam Barth
3d0b82eb86 Use a null LayoutCallbackBuilderHandle in Release 2015-07-22 10:02:00 -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
Matt Perry
371ef4542b Material animates over 200ms 2015-07-22 11:55:38 -04: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
Adam Barth
136b2709c8 Merge pull request #208 from abarth/fix_type
Fix type error found by dartanalyzer --strong
2015-07-22 07:29:32 -07:00
Adam Barth
bb8b9c611c Fix type error found by dartanalyzer --strong
We were declaring that the function passed to setState should return a
Function. In reality, we want the function to return void (and everyone calls
it with a function that returns void).
2015-07-21 22:42:04 -07:00
Adam Barth
665f6c33a4 Update sky_tool now that sky:// isn't a thing
Instead, just use a normal http URL.
2015-07-21 19:53:25 -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
Hixie
9da399b0e1 Rationalise usage of keys in navigator.dart.
Route (named routes) no longer have a key, and have their own storage for their names.
RouseState no longer has a key, and uses an owner field pointing to a StatefulComponent instead.
As such, RouteBase no longer has a key.

HistoryEntry no longer uses a global int to ensure uniqueness.

Propagated this to stocks app.
2015-07-21 14:58:48 -07:00
Adam Barth
de717bafe9 Images don't appears in VariableHeightScrollables
When we build widgets during layout we weren't notifying those widgets that
they were mounted. Now we notify mount status changes when exiting build phases
inside layout.

Fixes #176
2015-07-21 14:42:21 -07:00
Adam Barth
6b748e653e Fix more analyzer warnings 2015-07-21 13:59:18 -07:00