| Index: samples-dev/swarm/SwarmViews.dart
|
| diff --git a/samples-dev/swarm/SwarmViews.dart b/samples-dev/swarm/SwarmViews.dart
|
| index d81a38c85d67e17b936a874c280adf3d97afb091..003e544a36cc55194c540c9f7d3a0ee59e8c0467 100644
|
| --- a/samples-dev/swarm/SwarmViews.dart
|
| +++ b/samples-dev/swarm/SwarmViews.dart
|
| @@ -70,13 +70,12 @@ class FrontView extends CompositeView {
|
| headerView = new HeaderView(swarm);
|
| topView.addChild(headerView);
|
|
|
| - sliderMenu = new SliderMenu(swarm.sections.sectionTitles,
|
| - (sectionTitle) {
|
| - swarm.state.moveToNewSection(sectionTitle);
|
| - _onSectionSelected(sectionTitle);
|
| - // Start with no articles selected.
|
| - swarm.state.selectedArticle.value = null;
|
| - });
|
| + sliderMenu = new SliderMenu(swarm.sections.sectionTitles, (sectionTitle) {
|
| + swarm.state.moveToNewSection(sectionTitle);
|
| + _onSectionSelected(sectionTitle);
|
| + // Start with no articles selected.
|
| + swarm.state.selectedArticle.value = null;
|
| + });
|
| topView.addChild(sliderMenu);
|
| addChild(topView);
|
|
|
| @@ -99,8 +98,12 @@ class FrontView extends CompositeView {
|
|
|
| void afterRender(Element node) {
|
| _createSectionViews();
|
| - attachWatch(swarm.state.currentArticle, (e) { _refreshCurrentArticle(); });
|
| - attachWatch(swarm.state.storyMaximized, (e) { _refreshMaximized(); });
|
| + attachWatch(swarm.state.currentArticle, (e) {
|
| + _refreshCurrentArticle();
|
| + });
|
| + attachWatch(swarm.state.storyMaximized, (e) {
|
| + _refreshMaximized();
|
| + });
|
| }
|
|
|
| void _refreshCurrentArticle() {
|
| @@ -121,8 +124,8 @@ class FrontView extends CompositeView {
|
|
|
| headerView.startTransitionToMainView();
|
|
|
| - currentSection.dataSourceView.reattachSubview(
|
| - detachedView.source, detachedView, true);
|
| + currentSection.dataSourceView
|
| + .reattachSubview(detachedView.source, detachedView, true);
|
|
|
| storyView.node.onTransitionEnd.first.then((e) {
|
| currentSection.hidden = false;
|
| @@ -157,8 +160,8 @@ class FrontView extends CompositeView {
|
| // TODO(jmesserly): make this code better
|
| final view = currentSection.findView(source);
|
|
|
| - final newPosition = FxUtil.computeRelativePosition(
|
| - view.node, bottomView.node);
|
| + final newPosition =
|
| + FxUtil.computeRelativePosition(view.node, bottomView.node);
|
| currentSection.dataSourceView.detachSubview(view.source);
|
| detachedView = view;
|
|
|
| @@ -197,8 +200,8 @@ class FrontView extends CompositeView {
|
| void _animateDataSourceToMaximized() {
|
| FxUtil.setWebkitTransform(topView.node, 0, -HeaderView.HEIGHT);
|
| if (detachedView != null) {
|
| - FxUtil.setWebkitTransform(detachedView.node, 0,
|
| - -DataSourceView.TAB_ONLY_HEIGHT);
|
| + FxUtil.setWebkitTransform(
|
| + detachedView.node, 0, -DataSourceView.TAB_ONLY_HEIGHT);
|
| }
|
| }
|
|
|
| @@ -326,7 +329,9 @@ class SwarmBackButton extends View {
|
| Element render() => new Element.html('<div class="back-arrow button"></div>');
|
|
|
| void afterRender(Element node) {
|
| - addOnClick((e) { _backToMain(swarm.state); });
|
| + addOnClick((e) {
|
| + _backToMain(swarm.state);
|
| + });
|
| }
|
| }
|
|
|
| @@ -365,9 +370,13 @@ class HeaderView extends CompositeView {
|
|
|
| void afterRender(Element node) {
|
| // Respond to changes to whether the story is being shown as text or web.
|
| - attachWatch(swarm.state.storyTextMode, (e) { refreshWebStoryButtons(); });
|
| + attachWatch(swarm.state.storyTextMode, (e) {
|
| + refreshWebStoryButtons();
|
| + });
|
|
|
| - _title.addOnClick((e) { _backToMain(swarm.state); });
|
| + _title.addOnClick((e) {
|
| + _backToMain(swarm.state);
|
| + });
|
|
|
| // Wire up the events.
|
| _configButton.addOnClick((e) {
|
| @@ -418,7 +427,6 @@ class HeaderView extends CompositeView {
|
| startTransitionToMainView();
|
| }
|
|
|
| -
|
| /**
|
| * Refreshes whether or not the buttons specific to the display of a story in
|
| * the web perspective are visible.
|
| @@ -433,7 +441,7 @@ class HeaderView extends CompositeView {
|
|
|
| _webBackButton.hidden = webButtonsHidden;
|
| _webForwardButton.hidden = webButtonsHidden;
|
| - _newWindowButton.hidden = webButtonsHidden;
|
| + _newWindowButton.hidden = webButtonsHidden;
|
| }
|
|
|
| void startTransitionToMainView() {
|
| @@ -457,7 +465,6 @@ class HeaderView extends CompositeView {
|
| }
|
| }
|
|
|
| -
|
| /** A back button for the web view of a story that is equivalent to clicking
|
| * "back" in the browser. */
|
| // TODO(rnystrom): We have nearly identical versions of this littered through
|
| @@ -470,7 +477,9 @@ class WebBackButton extends View {
|
| }
|
|
|
| void afterRender(Element node) {
|
| - addOnClick((e) { back(); });
|
| + addOnClick((e) {
|
| + back();
|
| + });
|
| }
|
|
|
| /** Equivalent to [window.history.back] */
|
| @@ -491,7 +500,9 @@ class WebForwardButton extends View {
|
| }
|
|
|
| void afterRender(Element node) {
|
| - addOnClick((e) { forward(); });
|
| + addOnClick((e) {
|
| + forward();
|
| + });
|
| }
|
|
|
| /** Equivalent to [window.history.forward] */
|
| @@ -514,12 +525,11 @@ class DataSourceViewFactory implements ViewFactory<Feed> {
|
| int get height => null; // Width for this view isn't known.
|
| }
|
|
|
| -
|
| /**
|
| * A view for the items from a single data source.
|
| * Shows a title and a list of items.
|
| */
|
| -class DataSourceView extends CompositeView {
|
| +class DataSourceView extends CompositeView {
|
| // TODO(jacobr): make this value be coupled with the CSS file.
|
| static const TAB_ONLY_HEIGHT = 34;
|
|
|
| @@ -527,19 +537,20 @@ class DataSourceView extends CompositeView {
|
| VariableSizeListView<Article> itemsView;
|
|
|
| DataSourceView(this.source, Swarm swarm) : super('query') {
|
| -
|
| // TODO(jacobr): make the title a view or decide it is sane for a subclass
|
| // of component view to manually add some DOM cruft.
|
| - node.nodes.add(new Element.html(
|
| - '<h2>${source.title}</h2>'));
|
| + node.nodes.add(new Element.html('<h2>${source.title}</h2>'));
|
|
|
| // TODO(jacobr): use named arguments when available.
|
| itemsView = addChild(new VariableSizeListView<Article>(
|
| source.articles,
|
| new ArticleViewFactory(swarm),
|
| - true, /* scrollable */
|
| - true, /* vertical */
|
| - swarm.state.currentArticle, /* selectedItem */
|
| + true,
|
| + /* scrollable */
|
| + true,
|
| + /* vertical */
|
| + swarm.state.currentArticle,
|
| + /* selectedItem */
|
| !Device.supportsTouch /* snapToArticles */,
|
| false /* paginate */,
|
| true /* removeClippedViews */,
|
| @@ -562,14 +573,16 @@ class ToggleButton extends View {
|
| List<String> states;
|
|
|
| ToggleButton(this.states)
|
| - : super(),
|
| - onChanged = new EventListeners();
|
| + : super(),
|
| + onChanged = new EventListeners();
|
|
|
| Element render() => new Element.tag('button');
|
|
|
| void afterRender(Element node) {
|
| state = states[0];
|
| - node.onClick.listen((event) { toggle(); });
|
| + node.onClick.listen((event) {
|
| + toggle();
|
| + });
|
| }
|
|
|
| String get state {
|
| @@ -599,8 +612,7 @@ class ArticleViewFactory implements VariableSizeViewFactory<Article> {
|
| Swarm swarm;
|
|
|
| ArticleViewLayout layout;
|
| - ArticleViewFactory(this.swarm)
|
| - : layout = ArticleViewLayout.getSingleton();
|
| + ArticleViewFactory(this.swarm) : layout = ArticleViewLayout.getSingleton();
|
|
|
| View newView(Article item) => new ArticleView(item, swarm, layout);
|
|
|
| @@ -637,9 +649,9 @@ class ArticleViewLayout {
|
|
|
| int width;
|
| static ArticleViewLayout _singleton;
|
| - ArticleViewLayout() :
|
| - measureBodyText = new MeasureText(BODY_FONT),
|
| - measureTitleText = new MeasureText(TITLE_FONT) {
|
| + ArticleViewLayout()
|
| + : measureBodyText = new MeasureText(BODY_FONT),
|
| + measureTitleText = new MeasureText(TITLE_FONT) {
|
| num screenWidth = window.screen.width;
|
| width = DESKTOP_WIDTH;
|
| }
|
| @@ -665,19 +677,18 @@ class ArticleViewLayout {
|
| * titleContainer and snippetContainer may be null in which case the size is
|
| * computed but no actual layout is performed.
|
| */
|
| - ArticleViewMetrics computeLayout(Article item,
|
| - StringBuffer titleBuffer,
|
| - StringBuffer snippetBuffer) {
|
| + ArticleViewMetrics computeLayout(
|
| + Article item, StringBuffer titleBuffer, StringBuffer snippetBuffer) {
|
| int titleWidth = width - BODY_MARGIN_LEFT;
|
|
|
| if (item.hasThumbnail) {
|
| titleWidth = width - TITLE_MARGIN_LEFT;
|
| }
|
|
|
| - final titleLines = measureTitleText.addLineBrokenText(titleBuffer,
|
| - item.title, titleWidth, MAX_TITLE_LINES);
|
| - final bodyLines = measureBodyText.addLineBrokenText(snippetBuffer,
|
| - item.textBody, width - BODY_MARGIN_LEFT, MAX_BODY_LINES);
|
| + final titleLines = measureTitleText.addLineBrokenText(
|
| + titleBuffer, item.title, titleWidth, MAX_TITLE_LINES);
|
| + final bodyLines = measureBodyText.addLineBrokenText(
|
| + snippetBuffer, item.textBody, width - BODY_MARGIN_LEFT, MAX_BODY_LINES);
|
|
|
| int height = bodyLines * LINE_HEIGHT + TOTAL_MARGIN;
|
|
|
| @@ -741,7 +752,6 @@ class ArticleView extends View {
|
| }
|
|
|
| void afterRender(Element node) {
|
| -
|
| // Select this view's item.
|
| addOnClick((e) {
|
| // Mark the item as read, so it shows as read in other views
|
| @@ -791,13 +801,13 @@ class ArticleView extends View {
|
| // Story View.
|
| swarm.frontView.detachedView.itemsView.showView(selArticle);
|
| } else {
|
| - if(swarm.frontView.currentSection.inCurrentView(selArticle)) {
|
| + if (swarm.frontView.currentSection.inCurrentView(selArticle)) {
|
| // Scroll horizontally if needed.
|
| - swarm.frontView.currentSection.dataSourceView.showView(
|
| - selArticle.dataSource);
|
| - DataSourceView dataView = swarm.frontView.currentSection
|
| - .findView(selArticle.dataSource);
|
| - if(dataView != null) {
|
| + swarm.frontView.currentSection.dataSourceView
|
| + .showView(selArticle.dataSource);
|
| + DataSourceView dataView =
|
| + swarm.frontView.currentSection.findView(selArticle.dataSource);
|
| + if (dataView != null) {
|
| dataView.itemsView.showView(selArticle);
|
| }
|
| }
|
| @@ -807,8 +817,8 @@ class ArticleView extends View {
|
|
|
| String getDataUriForImage(final img) {
|
| // TODO(hiltonc,jimhug) eval perf of this vs. reusing one canvas element
|
| - final CanvasElement canvas = new CanvasElement(
|
| - height: img.height, width: img.width);
|
| + final CanvasElement canvas =
|
| + new CanvasElement(height: img.height, width: img.width);
|
|
|
| final CanvasRenderingContext2D ctx = canvas.getContext("2d");
|
| ctx.drawImage(img, 0, 0, img.width, img.height);
|
| @@ -848,8 +858,8 @@ class StoryContentView extends View {
|
| get childViews => [_pagedStory];
|
|
|
| Element render() {
|
| - final storyContent = new Element.html(
|
| - '<div class="story-content">${item.htmlBody}</div>');
|
| + final storyContent =
|
| + new Element.html('<div class="story-content">${item.htmlBody}</div>');
|
| for (Element element in storyContent.querySelectorAll(
|
| "iframe, script, style, object, embed, frameset, frame")) {
|
| element.remove();
|
| @@ -896,9 +906,9 @@ class SectionView extends CompositeView {
|
| final PageState pageState;
|
|
|
| SectionView(this.swarm, this.section, this._viewFactory)
|
| - : super('section-view'),
|
| - loadingText = new View.html('<div class="loading-section"></div>'),
|
| - pageState = new PageState() {
|
| + : super('section-view'),
|
| + loadingText = new View.html('<div class="loading-section"></div>'),
|
| + pageState = new PageState() {
|
| addChild(loadingText);
|
| }
|
|
|
| @@ -912,14 +922,16 @@ class SectionView extends CompositeView {
|
| if (dataSourceView == null) {
|
| // TODO(jacobr): use named arguments when available.
|
| dataSourceView = new ListView<Feed>(
|
| - section.feeds, _viewFactory,
|
| + section.feeds,
|
| + _viewFactory,
|
| true /* scrollable */,
|
| false /* vertical */,
|
| null /* selectedItem */,
|
| true /* snapToItems */,
|
| true /* paginate */,
|
| true /* removeClippedViews */,
|
| - false, /* showScrollbar */
|
| + false,
|
| + /* showScrollbar */
|
| pageState);
|
| dataSourceView.addClass("data-source-view");
|
| addChild(dataSourceView);
|
|
|