From a51793a460112730f0fed3d58dcc3c4b2393553e Mon Sep 17 00:00:00 2001 From: Tofe Date: Wed, 29 Feb 2012 22:24:03 +0100 Subject: [PATCH] Settings dialog infrastructure There is now a basic infrastructure for building settings dialogs. --- qml/QuickNewsReader/content/images/apply.png | Bin 0 -> 2901 bytes qml/QuickNewsReader/content/images/cancel.png | Bin 0 -> 3809 bytes qml/QuickNewsReader/content/images/rss.png | Bin 0 -> 1737 bytes qml/QuickNewsReader/content/images/settings.png | Bin 0 -> 4724 bytes qml/QuickNewsReader/content/js/SettingsStorage.js | 56 +++++++++++ .../content/modelimpl/FavoriteFeedsSourceModel.qml | 2 + .../content/modelimpl/LeMondeSequenceNews.qml | 1 + .../content/modelimpl/LeMondeSourceModel.qml | 34 ++++++- .../content/modelitf/SourceModel.qml | 2 + qml/QuickNewsReader/content/view/Categories.qml | 30 +++++- qml/QuickNewsReader/content/view/FancyButton.qml | 61 ++++++++++++ .../content/view/FavoriteRssConfig.qml | 8 ++ qml/QuickNewsReader/content/view/News.qml | 3 + qml/QuickNewsReader/content/view/NewsComments.qml | 61 ++++++++++++ qml/QuickNewsReader/content/view/NewsDelegate.qml | 3 +- qml/QuickNewsReader/content/view/NewsDetail.qml | 80 +++++++++------- .../content/view/SourceConfigDialog.qml | 98 ++++++++++++++++++++ .../content/view/SourceDelegate.qml | 11 ++- qml/QuickNewsReader/main.qml | 12 +++ qtc_packaging/debian_fremantle/control | 2 +- 20 files changed, 426 insertions(+), 38 deletions(-) create mode 100644 qml/QuickNewsReader/content/images/apply.png create mode 100644 qml/QuickNewsReader/content/images/cancel.png create mode 100755 qml/QuickNewsReader/content/images/rss.png create mode 100644 qml/QuickNewsReader/content/images/settings.png create mode 100644 qml/QuickNewsReader/content/js/SettingsStorage.js create mode 100644 qml/QuickNewsReader/content/view/FancyButton.qml create mode 100644 qml/QuickNewsReader/content/view/FavoriteRssConfig.qml create mode 100644 qml/QuickNewsReader/content/view/NewsComments.qml create mode 100644 qml/QuickNewsReader/content/view/SourceConfigDialog.qml diff --git a/qml/QuickNewsReader/content/images/apply.png b/qml/QuickNewsReader/content/images/apply.png new file mode 100644 index 0000000000000000000000000000000000000000..01334d037c2ff1728695bc44a5b05c34d0a7e570 GIT binary patch literal 2901 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 Xf;YdHLVvB600000NkvXXu0mjf9PBv3 literal 0 HcmV?d00001 diff --git a/qml/QuickNewsReader/content/images/rss.png b/qml/QuickNewsReader/content/images/rss.png new file mode 100755 index 0000000000000000000000000000000000000000..d64c669c7589d3a886682dbd1f3c83b716a420f5 GIT binary patch literal 1737 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 Yq1q?y|Ka>L{)7misj8<^qhuZaKa 0) { + res = "OK"; + } else { + res = "Error"; + } + } + ); + // The function returns “OK” if it was successful, or “Error” if it wasn't + return res; +} + +// This function is used to retrieve a setting from the database +function getSetting(setting) { + var db = getDatabase(); + var res=""; + db.transaction(function(tx) { + var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]); + if (rs.rows.length > 0) { + res = rs.rows.item(0).value; + } else { + res = "Unknown"; + } + }) + // The function returns “Unknown” if the setting was not found in the database + // For more advanced projects, this should probably be handled through error codes + return res +} + diff --git a/qml/QuickNewsReader/content/modelimpl/FavoriteFeedsSourceModel.qml b/qml/QuickNewsReader/content/modelimpl/FavoriteFeedsSourceModel.qml index fbbf451..cd6b9a0 100644 --- a/qml/QuickNewsReader/content/modelimpl/FavoriteFeedsSourceModel.qml +++ b/qml/QuickNewsReader/content/modelimpl/FavoriteFeedsSourceModel.qml @@ -19,4 +19,6 @@ SourceModel { } loading: newsModel.loading + hasSettings: true + settingsComponent: "FavoriteRssConfig.qml" } diff --git a/qml/QuickNewsReader/content/modelimpl/LeMondeSequenceNews.qml b/qml/QuickNewsReader/content/modelimpl/LeMondeSequenceNews.qml index 48c0a0c..c59f227 100644 --- a/qml/QuickNewsReader/content/modelimpl/LeMondeSequenceNews.qml +++ b/qml/QuickNewsReader/content/modelimpl/LeMondeSequenceNews.qml @@ -15,4 +15,5 @@ XmlListModel { XmlRole { name: "link"; query: "lien_web/string()" } XmlRole { name: "description"; query: "description_appel/string()" } XmlRole { name: "detailedContent"; query: "contenu/string()" } + XmlRole { name: "commentURL"; query: "commentaires/url_commentaires/string()" } } diff --git a/qml/QuickNewsReader/content/modelimpl/LeMondeSourceModel.qml b/qml/QuickNewsReader/content/modelimpl/LeMondeSourceModel.qml index 7fd5e3f..7a2b54d 100644 --- a/qml/QuickNewsReader/content/modelimpl/LeMondeSourceModel.qml +++ b/qml/QuickNewsReader/content/modelimpl/LeMondeSourceModel.qml @@ -7,12 +7,14 @@ SourceModel { listViews: [ { viewComponent: 'content/view/Categories.qml', viewId: 'categoriesRect' } , { viewComponent: 'content/view/News.qml', viewId: 'newsRect' }, - { viewComponent: 'content/view/NewsDetail.qml', viewId: 'newsDetailRect' } + { viewComponent: 'content/view/NewsDetail.qml', viewId: 'newsDetailRect' }, + { viewComponent: 'content/view/NewsComments.qml', viewId: 'newsCommentsRect' } ] listModels: [ categoriesModel, newsModel, - newsModel + newsModelDetail, + newsModelDetailComments ] function getSeqId(categoryIndex) @@ -24,10 +26,38 @@ SourceModel { return "" } + function getNewsModelItem(prop) + { + var newsIndex = currentPath[2] + + if( typeof newsModel.get(newsIndex) != "undefined" ) + if( typeof newsModel.get(newsIndex)[prop] != "undefined" ) + return newsModel.get(newsIndex)[prop] + + return "" + } + property variant categoriesModel: LeMondeSequencesList { } property variant newsModel: LeMondeSequenceNews { seqid: getSeqId(currentPath[1]) } + property variant newsModelDetail: QtObject { + property variant parentModel: newsModel + property int sourceDepth: 3 + + property string urllink: getNewsModelItem('link') + property string htmlcontent: getNewsModelItem('detailedContent') + property string title: getNewsModelItem('title') + property string image: getNewsModelItem('image') + } + property variant newsModelDetailComments: QtObject { + property variant parentModel: newsModel + property int sourceDepth: 4 + + property string commentURL: "http://www.lemonde.fr" + getNewsModelItem('commentURL') + property string title: getNewsModelItem('title') + property string image: getNewsModelItem('image') + } loading: categoriesModel.loading || newsModel.loading } diff --git a/qml/QuickNewsReader/content/modelitf/SourceModel.qml b/qml/QuickNewsReader/content/modelitf/SourceModel.qml index 5e6bb0a..1b5484f 100644 --- a/qml/QuickNewsReader/content/modelitf/SourceModel.qml +++ b/qml/QuickNewsReader/content/modelitf/SourceModel.qml @@ -5,6 +5,8 @@ QtObject { property string name: "Source" property bool loading + property bool hasSettings: false + property string settingsComponent property variant listViews; property variant listModels; diff --git a/qml/QuickNewsReader/content/view/Categories.qml b/qml/QuickNewsReader/content/view/Categories.qml index bca890e..695b752 100644 --- a/qml/QuickNewsReader/content/view/Categories.qml +++ b/qml/QuickNewsReader/content/view/Categories.qml @@ -12,12 +12,40 @@ Rectangle { x: 0; y: 0 width: 220; height: window.height model: currentSource.listModels[componentDepth-1] - footer: quitButtonDelegate + footer: getFooter() delegate: CategoryDelegate { } highlight: Rectangle { color: "steelblue" } highlightMoveSpeed: 9999999 + + function getFooter() + { + return componentDepth === 1 && currentSource.hasSettings ? settingsButtonDelegate : null + } } ScrollBar { scrollArea: categories; height: categories.height; width: 8; anchors.right: categories.right } Component.onCompleted: categories.currentIndex = -1 + + Component { + id: settingsButtonDelegate + Item { + width: categories.width; height: 70 + + FancyButton { + icon: "../images/settings.png" + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: -2 + + /* + onClicked: { + if (editMenu.visible) { + editMenu.opacity = 0.0 + } else { + editMenu.opacity = 0.8 + } + }*/ + } + } + } } diff --git a/qml/QuickNewsReader/content/view/FancyButton.qml b/qml/QuickNewsReader/content/view/FancyButton.qml new file mode 100644 index 0000000..8d73db1 --- /dev/null +++ b/qml/QuickNewsReader/content/view/FancyButton.qml @@ -0,0 +1,61 @@ +/* This file is part of MeeGoFrames Component Library + * Copyright (C) 2011 Martin Grimme + * + * This program is free software; you can redistribute it, even commercially, + * as long as this copyright notice remains in place. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + + +import Qt 4.7 + +Rectangle { + + property alias icon: imageLabel.source + + signal clicked() + + id: button + width: 70 + height: 70 + + radius: 3 + color: "#a0000000" + + + states: [ + State { + name: "pressed" + when: mouseArea.pressed + PropertyChanges { + target: button + color: "#606060" + scale: 0.9 + } + } + ] + + Behavior on color { + ColorAnimation { duration: 100 } + } + + Behavior on scale { + NumberAnimation { duration: 100 } + } + + Image { + anchors.centerIn: parent + id: imageLabel + visible: source != "" + anchors.horizontalCenter: parent.horizontalCenter + } + + MouseArea { + id: mouseArea + anchors.fill: parent + onClicked: parent.clicked() + } +} diff --git a/qml/QuickNewsReader/content/view/FavoriteRssConfig.qml b/qml/QuickNewsReader/content/view/FavoriteRssConfig.qml new file mode 100644 index 0000000..ebf283c --- /dev/null +++ b/qml/QuickNewsReader/content/view/FavoriteRssConfig.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Rectangle { + width: 100 + height: 62 + + color: "blue" +} diff --git a/qml/QuickNewsReader/content/view/News.qml b/qml/QuickNewsReader/content/view/News.qml index 1e4f022..cc71822 100644 --- a/qml/QuickNewsReader/content/view/News.qml +++ b/qml/QuickNewsReader/content/view/News.qml @@ -10,6 +10,9 @@ Item { width: newsRect.width; height: window.height model: currentSource.listModels[componentDepth-1] delegate: NewsDelegate { } + highlight: Rectangle { color: "steelblue" } } ScrollBar { scrollArea: list; height: list.height; width: 8; anchors.right: list.right } + + Component.onCompleted: list.currentIndex = -1 } diff --git a/qml/QuickNewsReader/content/view/NewsComments.qml b/qml/QuickNewsReader/content/view/NewsComments.qml new file mode 100644 index 0000000..3da859c --- /dev/null +++ b/qml/QuickNewsReader/content/view/NewsComments.qml @@ -0,0 +1,61 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Item { + id: newsCommentsRect + width: window.width; height: window.height + + function getNewsModelItem(prop) + { + if( typeof currentSource.listModels[componentDepth-1] != "undefined" ) + if( typeof currentSource.listModels[componentDepth-1][prop] != "undefined" ) + return currentSource.listModels[componentDepth-1][prop] + + return "" + } + + property string commentURL: getNewsModelItem('commentURL') + property string title: getNewsModelItem('title') + property string image: getNewsModelItem('image') + + VisualItemModel { + id: itemModel + + Column { + id: column + x: 0; y: 0 + width: newsCommentsRect.width +// height: newsCommentsRect.height + + Row { + id: titleRow + spacing: 5 + + Image { + id: detailImage + source: image + } + + Text { + anchors.verticalCenter: detailImage.verticalCenter + text: title; width: column.width - detailImage.width - 10; wrapMode: Text.WordWrap + font { bold: true; family: "Helvetica"; pointSize: 16 } + } + } + + WebView { + id: newsCommentsWebView + width: newsCommentsRect.width + url: commentURL + preferredWidth: window.width +// preferredHeight: parent.height - titleRow.height + } + } + } + ListView { + id: itemListView + anchors.fill: newsCommentsRect + model: itemModel + } + ScrollBar { scrollArea: itemListView; height: itemListView.height; width: 8; anchors.right: itemListView.right } +} diff --git a/qml/QuickNewsReader/content/view/NewsDelegate.qml b/qml/QuickNewsReader/content/view/NewsDelegate.qml index 82cfd63..d51f3ee 100644 --- a/qml/QuickNewsReader/content/view/NewsDelegate.qml +++ b/qml/QuickNewsReader/content/view/NewsDelegate.qml @@ -67,6 +67,7 @@ Item { } Text { + anchors.verticalCenter: detailImage.verticalCenter text: description; width: column.width - detailImage.width - 10; wrapMode: Text.WordWrap font.family: "Helvetica" } @@ -76,7 +77,7 @@ Item { MouseArea { anchors.fill: delegate - onDoubleClicked: { + onClicked: { if (typeof detailedContent != "undefined") { var currentSourceDepth = delegate.ListView.view.model.sourceDepth diff --git a/qml/QuickNewsReader/content/view/NewsDetail.qml b/qml/QuickNewsReader/content/view/NewsDetail.qml index 22f60a1..da55341 100644 --- a/qml/QuickNewsReader/content/view/NewsDetail.qml +++ b/qml/QuickNewsReader/content/view/NewsDetail.qml @@ -7,47 +7,73 @@ Item { function getNewsModelItem(prop) { - var newsIndex = listSourceModel[window.currentSourceIndex].currentPath[componentDepth-1] - if( typeof currentSource.listModels[componentDepth-1] != "undefined" ) - if( typeof currentSource.listModels[componentDepth-1].get(newsIndex) != "undefined" ) - if( typeof currentSource.listModels[componentDepth-1].get(newsIndex)[prop] != "undefined" ) - return currentSource.listModels[componentDepth-1].get(newsIndex)[prop] + if( typeof currentSource.listModels[componentDepth-1][prop] != "undefined" ) + return currentSource.listModels[componentDepth-1][prop] return "" } - property string urllink: getNewsModelItem('link') - property string htmlcontent: getNewsModelItem('detailedContent') + property string urllink: getNewsModelItem('urllink') + property string htmlcontent: getNewsModelItem('htmlcontent') property string title: getNewsModelItem('title') property string image: getNewsModelItem('image') VisualItemModel { id: itemModel - Column { - id: column - x: 10; y: 10 - width: newsDetailRect.width - 20 + Item { + x: 0; y: 0 + width: newsDetailRect.width + height: column.height + + Column { + id: column + x: 0; y: 0 + width: parent.width - 20 + + Row { + spacing: 5 - Row { - spacing: 5 + Image { + id: detailImage + source: image + } - Image { - id: detailImage - source: image + Text { + anchors.verticalCenter: detailImage.verticalCenter + text: title; width: column.width - detailImage.width - 10; wrapMode: Text.WordWrap + font { bold: true; family: "Helvetica"; pointSize: 16 } + } } Text { - text: title; width: column.width - detailImage.width - 10; wrapMode: Text.WordWrap - font { bold: true; family: "Helvetica"; pointSize: 16 } + id: detailText + text: htmlcontent; width: newsDetailRect.width - 20; wrapMode: Text.WordWrap + font.family: "Helvetica" } } - Text { - id: detailText - text: htmlcontent; width: newsDetailRect.width - 20; wrapMode: Text.WordWrap - font.family: "Helvetica" + MouseArea { + anchors.fill: column + + onClicked: { + var currentSourceDepth = currentSource.listModels[componentDepth-1].sourceDepth + + // here we remove everything in viewsModel after index "currentSourceDepth" + while(window.windowViewsModel.count>currentSourceDepth+1) + window.windowViewsModel.remove(window.windowViewsModel.count-1) + + var path = listSourceModel[window.currentSourceIndex].currentPath + path[currentSourceDepth] = index + listSourceModel[window.currentSourceIndex].currentPath = path + + window.windowViewsModel.append({ component: listSourceModel[window.currentSourceIndex].listViews[currentSourceDepth].viewComponent, + componentId: listSourceModel[window.currentSourceIndex].listViews[currentSourceDepth].viewId, + componentDepth: currentSourceDepth+1 }) + + window.windowViewsList.currentIndex = currentSourceDepth+1; + } } } } @@ -57,14 +83,4 @@ Item { model: itemModel } ScrollBar { scrollArea: itemListView; height: itemListView.height; width: 8; anchors.right: itemListView.right } -/* - WebView { - id: newsDetailWebView - anchors.fill: parent - html: htmlcontent - url: urllink - preferredWidth: window.width - preferredHeight: window.height - } -*/ } diff --git a/qml/QuickNewsReader/content/view/SourceConfigDialog.qml b/qml/QuickNewsReader/content/view/SourceConfigDialog.qml new file mode 100644 index 0000000..72e53b3 --- /dev/null +++ b/qml/QuickNewsReader/content/view/SourceConfigDialog.qml @@ -0,0 +1,98 @@ +import QtQuick 1.0 +import "../modelitf" + +Rectangle { + id: configDialog + anchors.fill: parent + color: "#00000000" + visible: false + state: "hidden" + + property string configViewComponent + + //property SourceModel model; + //property SourceConfigComponentView viewComponent; + + states: [ + State { + name: "showSourceConfig" + + // In this state, we bring the configuration UI of the source + PropertyChanges { target: configDialog; color: "#d0000000" } + PropertyChanges { target: sourceConfigLoader; opacity: 1 } + PropertyChanges { target: sourceConfigLoader; source: configViewComponent } + + AnchorChanges { target: quitApplyConfigButton; anchors.left: undefined; anchors.right: configDialog.right } + AnchorChanges { target: quitCancelConfigButton; anchors.right: undefined; anchors.left: configDialog.left } + } + ] + + transitions: [ + Transition { + from: "hidden" + to: "showSourceConfig" + + SequentialAnimation { + // Show the dialog + PropertyAction { target: configDialog; property: "visible"; value: true } + // Bring the UI elements + ParallelAnimation { + AnchorAnimation { duration: 500 } + ColorAnimation { duration: 400 } + } + } + }, + Transition { + from: "showSourceConfig" + to: "hidden" + + SequentialAnimation { + // Move out the UI elements + ParallelAnimation { + AnchorAnimation { duration: 500 } + ColorAnimation { duration: 400 } + } + // Hide the dialog + PropertyAction { target: configDialog; property: "visible"; value: false } + } + } + ] + + Loader { + id: sourceConfigLoader + opacity: 0 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: quitApplyConfigButton.top + + Behavior on opacity { + NumberAnimation { duration: 1000; easing.type: Easing.InOutQuad } + } + } + + FancyButton { + id: quitApplyConfigButton + icon: "../images/apply.png" + anchors.bottom: parent.bottom + anchors.left: parent.right + + onClicked: { + // Store the configuration of this source, and disappear + configDialog.state = "hidden" + } + } + + FancyButton { + id: quitCancelConfigButton + icon: "../images/cancel.png" + anchors.bottom: parent.bottom + anchors.right: parent.left + + onClicked: { + // Store the configuration of this source, and disappear + configDialog.state = "hidden" + } + } + +} diff --git a/qml/QuickNewsReader/content/view/SourceDelegate.qml b/qml/QuickNewsReader/content/view/SourceDelegate.qml index e3e72e0..8824282 100644 --- a/qml/QuickNewsReader/content/view/SourceDelegate.qml +++ b/qml/QuickNewsReader/content/view/SourceDelegate.qml @@ -73,6 +73,15 @@ Item { MouseArea { anchors.fill: delegate + + onPressAndHold: { + // show the configuration for this journal + if( listSourceModel[index].hasSettings ) + { + window.showConfigDialog(listSourceModel[index].settingsComponent) + } + } + onClicked: { if( delegate.ListView.view.currentIndex !== index ) { @@ -86,7 +95,7 @@ Item { componentId: listSourceModel[index].listViews[0].viewId, componentDepth: 1 }) - listSourceModel[window.currentSourceIndex].currentPath = [index] + listSourceModel[index].currentPath = [index] window.currentSourceIndex = index diff --git a/qml/QuickNewsReader/main.qml b/qml/QuickNewsReader/main.qml index 2a72511..0c41d95 100644 --- a/qml/QuickNewsReader/main.qml +++ b/qml/QuickNewsReader/main.qml @@ -41,6 +41,18 @@ Rectangle { } } + function showConfigDialog(settingsComponent) { + configDialog.configViewComponent = settingsComponent + configDialog.state = "showSourceConfig" + } + + SourceConfigDialog { + id:configDialog + } + +/* +*/ + Component { id: quitButtonDelegate Item { diff --git a/qtc_packaging/debian_fremantle/control b/qtc_packaging/debian_fremantle/control index 7d98fd8..dda4359 100644 --- a/qtc_packaging/debian_fremantle/control +++ b/qtc_packaging/debian_fremantle/control @@ -1,5 +1,5 @@ Source: quicknewsreader -Section: web +Section: user/network Version: 0.2-0 Priority: optional Maintainer: Christophe CHAPUIS -- 1.7.9.5