diff options
author | Rory MacQueen <rorymacqueen@gmail.com> | 2013-07-22 17:11:57 -0700 |
---|---|---|
committer | Philip Chimento <philip.chimento@gmail.com> | 2013-07-26 18:17:37 -0700 |
commit | e0f36b294218a655f3617057386da30e90a78aad (patch) | |
tree | a19810423e78ffb51b56ed9f2e09ed32d3fa6d67 | |
parent | 748d03fb2e468acd0fcb9661a9ec794f9cfe921c (diff) |
Added presenter
Added the presenter class to the domain specific app to complete MVP design
[endlessm/eos-sdk#175]
4 files changed, 80 insertions, 173 deletions
diff --git a/wikipedia/src/endless_wikipedia/PrebuiltWikipediaApplication.js b/wikipedia/src/endless_wikipedia/PrebuiltWikipediaApplication.js index 40e6bc7..be0bdc5 100644 --- a/wikipedia/src/endless_wikipedia/PrebuiltWikipediaApplication.js +++ b/wikipedia/src/endless_wikipedia/PrebuiltWikipediaApplication.js @@ -4,7 +4,9 @@ const Lang = imports.lang; const Gtk = imports.gi.Gtk; const EndlessWikipedia = imports.endless_wikipedia.EndlessWikipedia; -const WikipediaModel = imports.models.WikipediaModel; +const DomainWikiView = imports.views.domain_wiki_view; +const DomainWikiModel = imports.models.domain_wiki_model; +const DomainWikiPresenter = imports.presenters.domain_wiki_presenter; const _ = function(x) { return x; }; @@ -20,103 +22,41 @@ const PrebuiltWikipediaApplication = new Lang.Class({ vfunc_startup: function() { this.parent(); + this._domain_wiki_view = new DomainWikiView.DomainWikiView(this); + this._domain_wiki_presenter = new DomainWikiPresenter.DomainWikiPresenter(this._domain_wiki_model, this._domain_wiki_view); + + this._domain_wiki_view.set_categories(categories); + + this._domain_wiki_view.connect('category-chosen', Lang.bind(this, this._onCategoryClicked)); + this._domain_wiki_view.connect('article-chosen', Lang.bind(this, this._onArticleClicked)); //this._view = new WikipediaView.WikipediaView(this); - //this._presenter = new WikipediaPresenter.WikipediaPresenter(this._model, this._view); - - // Front page - this._front_page = new EndlessWikipedia.PrebuiltFrontPage({ - title: this._model.application_name - }); - this._front_page.setCategories(this._model.getCategories()); - this._front_page.connect('category-chosen', - Lang.bind(this, this._onCategoryClicked)); - - // Category page - this._category_page = new Gtk.Grid({ - orientation: Gtk.Orientation.HORIZONTAL - }); - this._category_view = new EndlessWikipedia.PrebuiltCategoryPage(); - // _category_article_list is eventually going to be the same widget as - // _article_list, so that's why it's not built into the - // PrebuiltCategoryPage - this._category_article_list = new EndlessWikipedia.ArticleList({ - halign: Gtk.Align.END, - hexpand: false - }); - this._category_page.add(this._category_view); - this._category_page.add(this._category_article_list); - - this._category_back_button = new EndlessWikipedia.BackButton({ - label: _('START') - }); - this._category_back_button.show(); - - this._category_article_list.connect('article-chosen', - Lang.bind(this, this._onArticleClicked)); - this._category_back_button.connect('clicked', - Lang.bind(this, this._onCategoryBackClicked)); - - // Article page - this._article_page = new Gtk.Grid({ - orientation: Gtk.Orientation.HORIZONTAL - }); - this._article_view = new EndlessWikipedia.PrebuiltArticlesPage(); - this._article_list = new EndlessWikipedia.ArticleList({ - halign: Gtk.Align.START, - hexpand: false - }); - this._article_page.add(this._article_list); - this._article_page.add(this._article_view); - - this._article_back_button = new EndlessWikipedia.BackButton(); - this._article_back_button.show(); - - this._article_list.connect('article-chosen', - Lang.bind(this, this._onArticleClicked)); - this._article_back_button.connect('clicked', - Lang.bind(this, this._onArticleBackClicked)); - - // Build window - this._window = new Endless.Window({ - title: this._model.application_name, - application: this - }); - this._window.page_manager.transition_duration = 200; // ms - this._window.page_manager.add(this._front_page, { - name: 'front' - }); - this._window.page_manager.add(this._category_page, { - name: 'category', - left_topbar_widget: this._category_back_button - }); - this._window.page_manager.add(this._article_page, { - name: 'article', - left_topbar_widget: this._article_back_button - }) - this._window.show_all(); }, _onCategoryClicked: function(page, title, index) { - let category = this.getCategories()[index]; - let articles = this.getArticlesForCategoryIndex(index); + this._current_category = index; + let category = this._domain_wiki_model.getCategories()[index]; + let articles = this._domain_wiki_model.getArticlesForCategoryIndex(index); - this._category_view.title = category.title; - this._category_view.description = category.content; - this._category_article_list.setArticles(articles); - this._article_list.setArticles(articles); - this._article_back_button.label = category.title.toUpperCase(); + let titles = new Array(); + for(let i = 0; i < articles.length; i++){ + titles.push(articles[i].title); + } + + this._domain_wiki_view.set_category_info(category, titles); + + this._domain_wiki_view.transition_page(Endless.PageManagerTransitionType.SLIDE_LEFT, 'category'); - this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_LEFT; - this._window.page_manager.visible_page_name = 'category'; }, - _onArticleClicked: function(article_list, title, uri) { - this._article_view.title = title; - this._article_view.article_uri = uri; + _onArticleClicked: function(article_list, title, index) { + // Need to know which category this came from!! + //this._article_view.title = title; + //this._article_view.article_uri = uri; + let articles = this._domain_wiki_model.getArticlesForCategoryIndex(this._current_category); + this._domain_wiki_view.set_article_info(articles[index]); + this._domain_wiki_view.transition_page(Endless.PageManagerTransitionType.SLIDE_LEFT, 'article'); - this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_LEFT; - this._window.page_manager.visible_page_name = 'article'; }, _onCategoryBackClicked: function(button) { diff --git a/wikipedia/src/endless_wikipedia/WikipediaApplication.js b/wikipedia/src/endless_wikipedia/WikipediaApplication.js index 2893203..faac464 100644 --- a/wikipedia/src/endless_wikipedia/WikipediaApplication.js +++ b/wikipedia/src/endless_wikipedia/WikipediaApplication.js @@ -51,7 +51,7 @@ const WikipediaApplication = new Lang.Class({ vfunc_startup: function() { this.parent(); - this._domain_wiki_model = new DomainWikiModel.DomainWikiModel(this._application_uri); + this._domain_wiki_model = new DomainWikiModel.DomainWikiModel(); //let category_file = Gio.File.new_for_uri(this._application_uri); //let [success, category_json, etag] = category_file.load_contents(null); //this._categories = JSON.parse(category_json); diff --git a/wikipedia/src/models/WikipediaModel.js b/wikipedia/src/models/WikipediaModel.js deleted file mode 100644 index 81e7c51..0000000 --- a/wikipedia/src/models/WikipediaModel.js +++ /dev/null @@ -1,84 +0,0 @@ -const Endless = imports.gi.Endless; -const Gio = imports.gi.Gio; -const GObject = imports.gi.GObject; -const Json = imports.gi.Json; -const Lang = imports.lang; - -// Local libraries -const CategoryModel = imports.models.category_model; -const Utils = imports.utils; -const JsonUtils = imports.models.utils.json_utils; - -const CONTENT_DIRECTORY = Endless.getCurrentFileDir() + "/../../data/"; -const DEFAULT_METADATA_FILE = CONTENT_DIRECTORY + "pt-BR-brazil.json"; - -const WikipediaModel = new Lang.Class({ - Name: "WikipediaModel", - Extends: GObject.Object, - Properties: { - // resource:// URI for the categories JSON file - 'image-uri': GObject.ParamSpec.string('image-uri', - 'Category file URI', - 'URI for image of this cateogry', - GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE | GObject.ParamFlags.CONSTRUCT_ONLY, - ''), - - // Name of the Wikipedia-based application, e.g. 'Brazil', 'Math' - 'application-name': GObject.ParamSpec.string('application-name', - 'Application name', - 'Name of the Wikipedia-based application', - GObject.ParamFlags.READABLE, - '') - }, - - _init: function(filename) { - let jsonFile; - if(filename){ - filename = CONTENT_DIRECTORY + filename - } - jsonFile = filename || DEFAULT_METADATA_FILE; - - this._categories = new Array(); - - this.initFromJsonFile(jsonFile); - }, - - initFromJsonFile: function(filename) { - try { - - let app_content = JSON.parse(Utils.load_file (filename)); - this._application_name = app_content['app_name']; - this._image_uri = app_content['image_uri']; - this._lang_code = filename.substring(0, 2); - let categories = app_content['categories']; - let cat_length = categories.length - for(let i = 0; i < cat_length; i++){ - let category = categories[i]; - this.addCategory(category); - } - - } catch (e) { - throw e; - } - }, - - addCategory: function(category){ - let name = category['category_name']; - let description = category['content_text']; - let image_uri = category['image_uri']; - let articles = category['articles']; - this._categories.push(new CategoryModel.CategoryModel(name, description, image_uri, articles)); - }, - - getCategories: function() { - return this._categories; - }, - - get application_name(){ - return this._application_name; - }, - - get image_uri(){ - return this._image_uri; - } -}); diff --git a/wikipedia/src/presenters/domain_wiki_presenter.js b/wikipedia/src/presenters/domain_wiki_presenter.js new file mode 100644 index 0000000..2ac07f3 --- /dev/null +++ b/wikipedia/src/presenters/domain_wiki_presenter.js @@ -0,0 +1,51 @@ +const Lang = imports.lang; +const GObject = imports.gi.GObject; + +const DomainWikiPresenter = new Lang.Class({ + Name: "DomainWikiPresenter", + Extends: GObject.Object, + + _init: function(model, view) { + this._domain_wiki_model = model; + this._domain_wiki_view = view; + this._domain_wiki_view.set_presenter(this) + this._domain_wiki_view.connect('category-chosen', Lang.bind(this, this._onCategoryClicked)); + this._domain_wiki_view.connect('article-chosen', Lang.bind(this, this._onArticleClicked)); + + let categories = this._domain_wiki_model.getCategories(); + + this._domain_wiki_view.set_categories(categories); + }, + + _onCategoryClicked: function(page, title, index) { + this._current_category = index; + let category = this._domain_wiki_model.getCategories()[index]; + let articles = this._domain_wiki_model.getArticlesForCategoryIndex(index); + + let titles = new Array(); + for(let i = 0; i < articles.length; i++){ + titles.push(articles[i].title); + } + + this._domain_wiki_view.set_category_info(category, titles); + + this._domain_wiki_view.transition_page(Endless.PageManagerTransitionType.SLIDE_LEFT, 'category'); + }, + + _onArticleClicked: function(article_list, title, index) { + let articles = this._domain_wiki_model.getArticlesForCategoryIndex(this._current_category); + this._domain_wiki_view.set_article_info(articles[index]); + this._domain_wiki_view.transition_page(Endless.PageManagerTransitionType.SLIDE_LEFT, 'article'); + + }, + + _onCategoryBackClicked: function(button) { + this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_RIGHT; + this._window.page_manager.visible_page_name = 'front'; + }, + + _onArticleBackClicked: function(button) { + this._window.page_manager.transition_type = Endless.PageManagerTransitionType.SLIDE_RIGHT; + this._window.page_manager.visible_page_name = 'category'; + } +});
\ No newline at end of file |