| Index: client/samples/swarm/SwarmState.dart
|
| ===================================================================
|
| --- client/samples/swarm/SwarmState.dart (revision 3770)
|
| +++ client/samples/swarm/SwarmState.dart (working copy)
|
| @@ -1,297 +0,0 @@
|
| -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -/**
|
| - * The top-level class for the UI state. UI state is essentially a "model" from
|
| - * the view's perspective but whose data just describes the UI itself. It
|
| - * contains data like the currently selected story, etc.
|
| - */
|
| -// TODO(jimhug): Split the two classes here into framework and app-specific.
|
| -class SwarmState extends UIState {
|
| - /** Core data source for the app. */
|
| - final Sections _dataModel;
|
| -
|
| - /**
|
| - * Which article the user is currently viewing, or null if they aren't
|
| - * viewing an Article.
|
| - */
|
| - final ObservableValue<Article> currentArticle;
|
| - /**
|
| - * Which article the user currently has selected (for traversing articles
|
| - * via keyboard shortcuts).
|
| - */
|
| - final ObservableValue<Article> selectedArticle;
|
| -
|
| - /**
|
| - * True if the story view is maximized and the top and bottom UI elements
|
| - * are hidden.
|
| - */
|
| - final ObservableValue<bool> storyMaximized;
|
| -
|
| - /**
|
| - * True if the maximized story, if any, is being displayed in text mode
|
| - * rather than as an embedded web-page.
|
| - */
|
| - final ObservableValue<bool> storyTextMode;
|
| -
|
| - /**
|
| - * Which article the user currently has selected (by keyboard shortcuts),
|
| - * or null if an article isn't selected by the keyboard.
|
| - */
|
| - BiIterator<Article> _articleIterator;
|
| -
|
| - /**
|
| - * Which feed is currently selected (for keyboard shortcuts).
|
| - */
|
| - BiIterator<Feed> _feedIterator;
|
| -
|
| - /**
|
| - * Which section is currently selected (for keyboard shortcuts).
|
| - */
|
| - BiIterator<Section> _sectionIterator;
|
| -
|
| - SwarmState(this._dataModel)
|
| - : super(),
|
| - currentArticle = new ObservableValue<Article>(null),
|
| - selectedArticle = new ObservableValue<Article>(null),
|
| - storyMaximized = new ObservableValue<bool>(false),
|
| - storyTextMode = new ObservableValue<bool>(true) {
|
| - startHistoryTracking();
|
| - // TODO(efortuna): consider having this class just hold observable
|
| - // currentIndecies instead of iterators with observablevalues..
|
| - _sectionIterator = new BiIterator<Section>(_dataModel.sections);
|
| - _feedIterator = new BiIterator<Feed>(_sectionIterator.current.feeds);
|
| - _articleIterator =
|
| - new BiIterator<Article>(_feedIterator.current.articles);
|
| -
|
| - currentArticle.addChangeListener((e) {
|
| - _articleIterator.jumpToValue(currentArticle.value);
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Registers an event to fire on any state change
|
| - *
|
| - * TODO(jmesserly): fix this so we don't have to enumerate all of our fields
|
| - * again. One idea here is UIState becomes Observable, Observables have
|
| - * parents and notifications bubble up the parent chain.
|
| - */
|
| - void addChangeListener(ChangeListener listener) {
|
| - _sectionIterator.currentIndex.addChangeListener(listener);
|
| - _feedIterator.currentIndex.addChangeListener(listener);
|
| - _articleIterator.currentIndex.addChangeListener(listener);
|
| - currentArticle.addChangeListener(listener);
|
| - }
|
| -
|
| - Map<String, String> toHistory() {
|
| - final data = {};
|
| - data['section'] = currentSection.id;
|
| - data['feed'] = currentFeed.id;
|
| - if (currentArticle.value != null) {
|
| - data['article'] = currentArticle.value.id;
|
| - }
|
| - return data;
|
| - }
|
| -
|
| - void loadFromHistory(Map values) {
|
| - // TODO(jimhug): There's a better way of doing this...
|
| - if (values['section'] != null) {
|
| - _sectionIterator.jumpToValue(_dataModel.
|
| - findSectionById(values['section']));
|
| - } else {
|
| - _sectionIterator = new BiIterator<Section>(_dataModel.sections);
|
| - }
|
| - if (values['feed'] != null && currentSection != null) {
|
| - _feedIterator.jumpToValue(currentSection.findFeed(values['feed']));
|
| - } else {
|
| - _feedIterator = new BiIterator<Feed>(_sectionIterator.current.feeds);
|
| - }
|
| - if (values['article'] != null && currentFeed != null) {
|
| - currentArticle.value = currentFeed.findArticle(values['article']);
|
| - _articleIterator.jumpToValue(currentArticle.value);
|
| - } else {
|
| - _articleIterator =
|
| - new BiIterator<Article>(_feedIterator.current.articles);
|
| - currentArticle.value = null;
|
| - }
|
| -
|
| - storyMaximized.value = false;
|
| - }
|
| -
|
| - /**
|
| - * Move the currentArticle pointer to the next item in the Feed.
|
| - */
|
| - void goToNextArticle() {
|
| - currentArticle.value = _articleIterator.next();
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| -
|
| - /**
|
| - * Move the currentArticle pointer to the previous item in the Feed.
|
| - */
|
| - void goToPreviousArticle() {
|
| - currentArticle.value = _articleIterator.previous();
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| -
|
| - /**
|
| - * Move the selectedArticle pointer to the next item in the Feed.
|
| - */
|
| - void goToNextSelectedArticle() {
|
| - selectedArticle.value = _articleIterator.next();
|
| - }
|
| -
|
| - /**
|
| - * Move the selectedArticle pointer to the previous item in the Feed.
|
| - */
|
| - void goToPreviousSelectedArticle() {
|
| - selectedArticle.value = _articleIterator.previous();
|
| - }
|
| -
|
| - /**
|
| - * Move the pointers for selectedArticle to point to the next
|
| - * Feed.
|
| - */
|
| - void goToNextFeed() {
|
| - var newFeed = _feedIterator.next();
|
| - int oldIndex = _articleIterator.currentIndex.value;
|
| -
|
| - _articleIterator = new BiIterator<Article>(newFeed.articles,
|
| - _articleIterator.currentIndex.listeners);
|
| -
|
| - _articleIterator.currentIndex.value = oldIndex;
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| -
|
| - /**
|
| - * Move the pointers for selectedArticle to point to the previous
|
| - * DataSource.
|
| - */
|
| - void goToPreviousFeed() {
|
| - var newFeed = _feedIterator.previous();
|
| - int oldIndex = _articleIterator.currentIndex.value;
|
| -
|
| - _articleIterator = new BiIterator<Article>(newFeed.articles,
|
| - _articleIterator.currentIndex.listeners);
|
| - _articleIterator.currentIndex.value = oldIndex;
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| -
|
| - /**
|
| - * Move to the next section (page) of feeds in the UI.
|
| - * @param index the previous index (how far down in a given feed)
|
| - * from the Source we are moving from.
|
| - * This method takes sliderMenu in the event that it needs to move
|
| - * to a previous section, it can notify the UI to update.
|
| - */
|
| - void goToNextSection(SliderMenu sliderMenu) {
|
| - //TODO(efortuna): move sections?
|
| - var oldSection = currentSection;
|
| - int oldIndex = _articleIterator.currentIndex.value;
|
| - sliderMenu.selectNext(true);
|
| - // This check prevents our selector from wrapping around when we try to
|
| - // go to the "next section", but we're already at the last section.
|
| - if (oldSection != _sectionIterator.current) {
|
| - _feedIterator = new BiIterator<Feed>(_sectionIterator.current.feeds,
|
| - _feedIterator.currentIndex.listeners);
|
| - _articleIterator =
|
| - new BiIterator<Article>(_feedIterator.current.articles,
|
| - _articleIterator.currentIndex.listeners);
|
| - _articleIterator.currentIndex.value = oldIndex;
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Move to the previous section (page) of feeds in the UI.
|
| - * @param index the previous index (how far down in a given feed)
|
| - * from the Source we are moving from.
|
| - * @param oldSection the original starting section (before the slider
|
| - * menu moved)
|
| - * This method takes sliderMenu in the event that it needs to move
|
| - * to a previous section, it can notify the UI to update.
|
| - */
|
| - void goToPreviousSection(SliderMenu sliderMenu) {
|
| - //TODO(efortuna): don't pass sliderMenu here. Just update in view!
|
| - var oldSection = currentSection;
|
| - int oldIndex = _articleIterator.currentIndex.value;
|
| - sliderMenu.selectPrevious(true);
|
| -
|
| - // This check prevents our selector from wrapping around when we try to
|
| - // go to the "previous section", but we're already at the first section.
|
| - if (oldSection != _sectionIterator.current) {
|
| - _feedIterator = new BiIterator<Feed>(_sectionIterator.current.feeds,
|
| - _feedIterator.currentIndex.listeners);
|
| - // Jump to back of feed set if we are moving backwards through sections.
|
| - _feedIterator.currentIndex.value = _feedIterator.list.length - 1;
|
| - _articleIterator =
|
| - new BiIterator<Article>(_feedIterator.current.articles,
|
| - _articleIterator.currentIndex.listeners);
|
| - _articleIterator.currentIndex.value = oldIndex;
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Set the selected story as the current story (for viewing in the larger
|
| - * Story View.)
|
| - */
|
| - void selectStoryAsCurrent() {
|
| - currentArticle.value = _articleIterator.current;
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| -
|
| - /**
|
| - * Remove our currentArticle selection, to move back to the Main Grid view.
|
| - */
|
| - void clearCurrentArticle() {
|
| - currentArticle.value = null;
|
| - }
|
| -
|
| - /**
|
| - * Set the selectedArticle as the first item in that section (UI page).
|
| - */
|
| - void goToFirstArticleInSection() {
|
| - selectedArticle.value = _articleIterator.current;
|
| - }
|
| -
|
| - /**
|
| - * Returns true if the UI is currently in the Story View state.
|
| - */
|
| - bool get inMainView() => currentArticle.value == null;
|
| -
|
| - /**
|
| - * Returns true if we currently have an Article selected (for keyboard
|
| - * shortcuts browsing).
|
| - */
|
| - bool get hasArticleSelected() => selectedArticle.value != null;
|
| -
|
| - /**
|
| - * Mark the current article as read
|
| - */
|
| - bool markCurrentAsRead() {
|
| - currentArticle.value.unread.value = false;
|
| - }
|
| -
|
| - /**
|
| - * The user has moved to a new section (page). This can occur either
|
| - * if the user clicked on a section page, or used keyboard shortcuts.
|
| - * The default behavior is to move to the first article in the first
|
| - * column. The location of the selected item depends on the previous
|
| - * selected item location if the user used keyboard shortcuts. These
|
| - * are manipulated in goToPrevious/NextSection().
|
| - */
|
| - void moveToNewSection(String sectionTitle) {
|
| - _sectionIterator.currentIndex.value =
|
| - _dataModel.findSectionIndex(sectionTitle);
|
| - _feedIterator = new BiIterator<Feed>(_sectionIterator.current.feeds,
|
| - _feedIterator.currentIndex.listeners);
|
| - _articleIterator =
|
| - new BiIterator<Article>(_feedIterator.current.articles,
|
| - _articleIterator.currentIndex.listeners);
|
| - }
|
| -
|
| - Section get currentSection() => _sectionIterator.current;
|
| - Feed get currentFeed() => _feedIterator.current;
|
| -}
|
|
|