summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRory MacQueen <rorymacqueen@gmail.com>2013-07-22 17:11:57 -0700
committerPhilip Chimento <philip.chimento@gmail.com>2013-07-26 18:17:37 -0700
commite0f36b294218a655f3617057386da30e90a78aad (patch)
treea19810423e78ffb51b56ed9f2e09ed32d3fa6d67
parent748d03fb2e468acd0fcb9661a9ec794f9cfe921c (diff)
Added presenter
Added the presenter class to the domain specific app to complete MVP design [endlessm/eos-sdk#175]
-rw-r--r--wikipedia/src/endless_wikipedia/PrebuiltWikipediaApplication.js116
-rw-r--r--wikipedia/src/endless_wikipedia/WikipediaApplication.js2
-rw-r--r--wikipedia/src/models/WikipediaModel.js84
-rw-r--r--wikipedia/src/presenters/domain_wiki_presenter.js51
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