psa: implemented settings
authorYves Marcoz <yves@marcoz.org>
Tue, 22 Nov 2011 05:56:10 +0000 (21:56 -0800)
committerYves Marcoz <yves@marcoz.org>
Tue, 22 Nov 2011 05:56:10 +0000 (21:56 -0800)
34 files changed:
psa_harmattan/feedingit/build-deb.log
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/changelog
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/DEBIAN/control
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/DEBIAN/md5sums
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/doc/feedingit/changelog.Debian.gz
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/config.py
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/debugging.py
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/feedingit.py
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/ArticleViewer.qml
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/Feeds.qml
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/main.qml
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/rules
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/config.py
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/debugging.py
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/pysrc/feedingit.py
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/ArticleViewer.qml
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/Feeds.qml
psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/qml/main.qml
psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1.debian.tar.gz
psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1.dsc
psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1_all.deb
psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1_i386.changes
psa_harmattan/feedingit/deb_dist/feedingit_0.1.0.orig.tar.gz
psa_harmattan/feedingit/pysrc/config.py
psa_harmattan/feedingit/pysrc/debugging.py
psa_harmattan/feedingit/pysrc/feedingit.py
psa_harmattan/feedingit/qml/AddFeed.qml
psa_harmattan/feedingit/qml/ArticleViewer.qml
psa_harmattan/feedingit/qml/AutomaticUpdate.qml [new file with mode: 0644]
psa_harmattan/feedingit/qml/Feeds.qml
psa_harmattan/feedingit/qml/Settings.qml
psa_harmattan/feedingit/qml/SettingsPage.qml [new file with mode: 0644]
psa_harmattan/feedingit/qml/SwitchSetting.qml [new file with mode: 0644]
psa_harmattan/feedingit/qml/main.qml

index 04b612f..8cabead 100644 (file)
@@ -68,15 +68,18 @@ creating /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmatta
 copying qml/Feeds.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/Articles.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/TestWebview.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
+copying qml/SwitchSetting.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/FeedingIt.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/Categories.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/TextInputClear.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
+copying qml/SettingsPage.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/ArticleViewer.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/MainPage.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/main.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/Settings.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/ArticleDisplay.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/AddFeed.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
+copying qml/storage.js -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 copying qml/feedSearch.js -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml
 creating /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common
 copying qml/common/AddCat.qml -> /scratchbox/users/ymarcoz/home/ymarcoz/workspace/feedingit/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/feedingit/qml/common
index 9d02832..47705a0 100644 (file)
@@ -2,4 +2,4 @@ feedingit (0.1.0-1) unstable; urgency=low
 
   * source package automatically created by stdeb 0.6.0+git
 
- -- Yves <yves@marcoz.org>  Tue, 15 Nov 2011 22:13:06 -0800
+ -- Yves <yves@marcoz.org>  Mon, 21 Nov 2011 21:11:33 -0800
index 2d47aca..235a7b3 100644 (file)
@@ -2,7 +2,7 @@ Package: feedingit
 Version: 0.1.0-1
 Architecture: all
 Maintainer: Yves <yves@marcoz.org>
-Installed-Size: 772
+Installed-Size: 796
 Depends: python-pyside.qtgui, python-pyside.qtopengl, python-pyside.qtdeclarative, python-dbus, python-gconf
 Breaks: python (<< 2.6)
 Section: user/development
index 4c3ec6c..ba11d1c 100644 (file)
@@ -1,29 +1,31 @@
 4420c31f88de68fe6e1b7637abb06196  usr/bin/feedingit
 6a42e9aebedfd157062bd5a9616dc935  usr/share/applications/feedingit.desktop
 eda8cc6ffe8d842d6dfe0244b01b3042  usr/share/dbus-1/services/feedingit_status.service
-b0694ac13e871b46b2a598a20aea01f7  usr/share/doc/feedingit/changelog.Debian.gz
+5c7f442c0e8c3d7c05597d9684796864  usr/share/doc/feedingit/changelog.Debian.gz
 bac2be6ae9673ee5096e20e8b714c9cd  usr/share/feedingit/BeautifulSoup.py
 8f6e980f2e1154103a90763be6c00dc4  usr/share/feedingit/XmlHandler.py
 d41d8cd98f00b204e9800998ecf8427e  usr/share/feedingit/__init__.py
-6b5296119ef6bc859c3e3a8706fa7f0d  usr/share/feedingit/config.py
-9cf859c8297e4b0e8466cb5861eb75e7  usr/share/feedingit/debugging.py
+68a56a1175b749024474aa1df2ebf650  usr/share/feedingit/config.py
+b4b00de5dccaf56d81a9dab1eeac63e1  usr/share/feedingit/debugging.py
 fae02e730b76761d43a626fe19828d5e  usr/share/feedingit/download.py
-6227346488fba33c8222965dd3b23690  usr/share/feedingit/feedingit.py
+cc95b9d73b6905e9aa9f16c62bbb60c6  usr/share/feedingit/feedingit.py
 afa4f462892136f59beaf96b6bf1cf96  usr/share/feedingit/feedparser.py
 c1a0c0a9ccefd64d1e27bddb817c72a3  usr/share/feedingit/httpprogresshandler.py
 f1e9ba0f44786f513659a7fa3111fc8a  usr/share/feedingit/jobmanager.py
 0201faa30d34c58d71f36ab42a7a8233  usr/share/feedingit/mainthread.py
 d9c0665dfdd5cf19f1529ce88af95134  usr/share/feedingit/opml.py
-26c43c6f67a53f45078ecbd66d895ddd  usr/share/feedingit/opml_lib.py
-38643cdd42bdb32d373eba77fb9cb355  usr/share/feedingit/qml/AddFeed.qml
+7c3358bb2e3cba866248e75556a159d3  usr/share/feedingit/opml_lib.py
+4ef0e77dd5685db3a51306fd7ccf585f  usr/share/feedingit/qml/AddFeed.qml
 af27062fdba0bc7a3df92116e8340d19  usr/share/feedingit/qml/ArticleDisplay.qml
-80858d581189fcf00ab1c6192be87e27  usr/share/feedingit/qml/ArticleViewer.qml
+9b095f75f329ce61bd4170b0037dc9c4  usr/share/feedingit/qml/ArticleViewer.qml
 15083e9a1fac05c8efaaa085dfabcbcb  usr/share/feedingit/qml/Articles.qml
 8f480702a2107a8017fdd94226b9b7d4  usr/share/feedingit/qml/Categories.qml
 cd30f5eaec0885358261d7a96bfaf8cd  usr/share/feedingit/qml/FeedingIt.qml
-02784496485eb5547a1ad48c043bb2a9  usr/share/feedingit/qml/Feeds.qml
+3f5a5feca57160c2956a38579a325816  usr/share/feedingit/qml/Feeds.qml
 bec5fe4599a3ad5799ed96d7ed81fb5f  usr/share/feedingit/qml/MainPage.qml
-1c500d41d190f8f8c6d478fda117bb28  usr/share/feedingit/qml/Settings.qml
+54e67ad61b7d3cdf39fa532caaa73ed8  usr/share/feedingit/qml/Settings.qml
+e38d52fab962c2b3afb6d7e17a1f525a  usr/share/feedingit/qml/SettingsPage.qml
+1ea79be910afd546622a21125d7828ff  usr/share/feedingit/qml/SwitchSetting.qml
 aa3fc0a4edbd17d93a9dc5c39c433c3d  usr/share/feedingit/qml/TestWebview.qml
 508fde19c7bb7bc4892bd6642fbcb7d3  usr/share/feedingit/qml/TextInputClear.qml
 cef5ae4af926a759f4a233336c00f017  usr/share/feedingit/qml/common/AddCat.qml
@@ -58,7 +60,8 @@ af11b73b195513d08c17723b41db0b04  usr/share/feedingit/qml/common/images/wmBackIc
 1c7751b124aa1bdf4b89ec76cdf815a2  usr/share/feedingit/qml/i18n/FeedingIt.ts
 7790a99425dd7c1046e6ae3b1ee72a03  usr/share/feedingit/qml/i18n/qml_en.qm
 1674fcce45bcf3319e61d19a9adf4fdd  usr/share/feedingit/qml/i18n/qml_en.ts
-82ce3a19141362b7c01968f69ccdaaff  usr/share/feedingit/qml/main.qml
+2bbcf082ceb0e97171bab040e8fba0a2  usr/share/feedingit/qml/main.qml
+40606cd0365957b1607a2bf2cf3bc030  usr/share/feedingit/qml/storage.js
 e3b4184531f29bbf86d812f9b8adacc2  usr/share/feedingit/rss_sqlite.py
 721777a26cd2a5b8466ce2aa2b99fad7  usr/share/feedingit/update_feeds.py
 6ccf12dc4379e91800ae8505b2e86082  usr/share/feedingit/updatedbus.py
index 0fad49e..2fbf474 100644 (file)
Binary files a/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/doc/feedingit/changelog.Debian.gz and b/psa_harmattan/feedingit/deb_dist/feedingit-0.1.0/debian/feedingit/usr/share/doc/feedingit/changelog.Debian.gz differ
index 9f7ec81..47ceaca 100644 (file)
@@ -226,6 +226,10 @@ class Config():
             self.config["feedsort"] = configParser.get(section, "feedsort")
         except:
             self.config["feedsort"] = "Manual"
+        try:
+            self.config["theme"] = configParser.get(section, "theme")
+        except:
+            self.config["theme"] = True
         
     def saveConfig(self):
         configParser = RawConfigParser()
@@ -242,6 +246,7 @@ class Config():
         configParser.set(section, 'hidereadarticles', str(self.config["hidereadarticles"]))
         configParser.set(section, 'extBrowser', str(self.config["extBrowser"]))
         configParser.set(section, 'feedsort', str(self.config["feedsort"]))
+        configParser.set(section, 'theme', str(self.config["theme"]))
 
         # Writing our configuration file
         file = open(self.configFilename, 'wb')
@@ -271,6 +276,8 @@ class Config():
         return self.config["artFontSize"]
     def getExpiry(self):
         return self.config["expiry"]
+    def setExpiry(self, expiry):
+        self.config["expiry"] = expiry
     def isAutoUpdateEnabled(self):
         return self.config["autoupdate"]
     def getUpdateInterval(self):
@@ -279,10 +286,16 @@ class Config():
         return "sans italic %s" % self.config["fontSize"]
     def getUnreadFont(self):
         return "sans %s" % self.config["fontSize"]
-    def getOrientation(self):
+    def getOrientation(self, index):
         return ranges["orientation"].index(self.config["orientation"])
+    def getOrientationChoices(self):
+        return ranges["orientation"]
+    def setOrientation(self, choice):
+        self.config["orientation"] = index 
     def getImageCache(self):
         return self.config["imageCache"]
+    def setImageCache(self, cache):
+        self.config["imageCache"] = bool(cache) 
     @mainthread
     def getProxy(self):
         if self.config["proxy"] == False:
@@ -295,9 +308,21 @@ class Config():
         return (False, None)
     def getHideReadFeeds(self):
         return self.config["hidereadfeeds"]
+    def setHideReadFeeds(self, setting):
+        self.config["hidereadfeeds"] = bool(setting)
     def getHideReadArticles(self):
         return self.config["hidereadarticles"]
+    def setHideReadArticles(self, setting):
+        self.config["hidereadarticles"] = bool(setting)
     def getOpenInExternalBrowser(self):
         return self.config["extBrowser"]
     def getFeedSortOrder(self):
         return self.config["feedsort"]
+    def getFeedSortOrderChoices(self):
+        return ranges["feedsort"]
+    def setFeedSortOrder(self, setting):
+        self.config["feedsort"] = setting
+    def getTheme(self):
+        return self.config["theme"]
+    def setTheme(self, theme):
+        self.config["theme"] = bool(theme)
index 7330871..1f6d71b 100644 (file)
@@ -34,7 +34,7 @@ def my_excepthook(exctype, value, tb):
         % (''.join(traceback.format_exception(exctype, value, tb)),))
     original_excepthook(exctype, value, tb)
 
-def init(dot_directory, debug=False, max_logfiles=1, program_name=None):
+def init(dot_directory, debug=True, max_logfiles=1, program_name=None):
     if not os.path.isabs(dot_directory):
         dot_directory = os.path.join(os.path.expanduser("~"), dot_directory)
 
index 952b5e0..d2060e8 100644 (file)
@@ -8,6 +8,7 @@ import os
 from os import mkdir, remove, stat, environ
 from os.path import isfile, isdir, exists
 import codecs
+from gconf import client_get_default
 
 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
 from PySide import QtOpenGL,  QtCore
@@ -17,7 +18,7 @@ CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit"
 #CONFIGDIR = "/home/user/.feedingit"
 
 import logging
-#logger = logging.getLogger(__name__)
+logger = logging.getLogger(__name__)
 
 import debugging
 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
@@ -50,7 +51,7 @@ class Controller(QtCore.QObject):
     @QtCore.Slot(str,result=str)
     def getArticlesXml(self, key):
         #onlyUnread = arguments.get("onlyUnread","False")
-        return self._handler.generateArticlesXml(key, "False")
+        return self._handler.generateArticlesXml(key, config.getHideReadArticles())
     
     @QtCore.Slot(result=str)
     def getCategoryXml(self):
@@ -112,6 +113,14 @@ class Controller(QtCore.QObject):
             return "False"
         return ""
     
+    @QtCore.Slot(str, str)
+    def populateFileDialog(self, path, type):
+        import glob
+        import os.path
+        for file in glob.glob(path+type):
+            logger.debug(file)
+            root.addFileNotification(file, os.path.basename(file))
+    
     @QtCore.Slot(str, result=int)
     def importOpml(self, filename):
         from opml_lib import parseOpml
@@ -135,6 +144,31 @@ class Controller(QtCore.QObject):
         except:
             logger.debug("Error exporting: %s" % filename)
             return "error"
+        
+    @QtCore.Slot(str, result=bool)
+    def getBooleanSetting(self, setting):
+        if (setting == "theme"):
+            return config.getTheme()
+        elif (setting == "imageCache" ):
+            return config.getImageCache()
+        elif (setting == "hideReadFeeds"):
+            return config.getHideReadFeeds()
+        elif (setting == "hideReadArticles"):
+            return config.getHideReadArticles()
+        else:
+            return 'True'
+        
+    @QtCore.Slot(str, bool)
+    def setBooleanSetting(self, setting, value):
+        if (setting == "theme"):
+            config.setTheme(value)
+        elif (setting == "imageCache" ):
+            config.setImageCache(value)
+        elif (setting == "hideReadFeeds"):
+            config.setHideReadFeeds(value)
+        elif (setting == "hideReadArticles"):
+            config.setHideReadArticles(value)
+        config.saveConfig()
 
 def main():
 
@@ -164,6 +198,7 @@ def main():
 
     controller = Controller(listing)
  
+    global root
     rc = view.rootContext()
  
     rc.setContextProperty('controller', controller)
@@ -181,6 +216,7 @@ def main():
         view.setSource(os.path.join('qml','main.qml'))
         view.show()
         #view.setSource(os.path.join('qml','FeedingIt.qml'))
+    root = view.rootObject()
 
     #view.showFullScreen()
     #view.show()
index ac31e0b..f974ddb 100644 (file)
@@ -110,6 +110,7 @@ Item {
             Item {
                 width: articleViewer.width; height: backRect.height + 3
                 id: listItem
+
                 Rectangle {
                     id: backRect; color: settings.backColour; opacity: index % 2 ? 0.2 : 0.4;
                     height: articleText.height + 22; width: listItem.width;
index 5131cbc..8df8c5e 100644 (file)
@@ -49,7 +49,7 @@ Item {
             //Component.onCompleted: console.log("item:"+feedid + " "+ visible + " "+ height + " " + width)
             id: wrapper;
             //width: wrapper.ListView.view.width;
-            visible: (unread == "0" && feedsItem.hideReadFeeds=="True") ? false : true
+            visible: (unread == "0" && settings.hideReadFeeds) ? false : true
             //visible: true
             height: (visible) ? 86 : 0
             width: parent.width
index 68edc8c..973bbdb 100644 (file)
@@ -1,6 +1,5 @@
 import QtQuick 1.0
 import com.nokia.meego 1.0
-import com.nokia.extras 1.0
 
 PageStackWindow {
     id: window
@@ -10,10 +9,14 @@ PageStackWindow {
     signal longPressFeed(string key)
     signal categoryReloadRequest()
     signal feedReloadRequest()
+    signal addFileSignal(string fullname, string filename)
+
     property string feedid
     property string catid
 
-    Component.onCompleted: theme.inverted= true
+    function addFileNotification(fullname, filename) {
+        window.addFileSignal(fullname,filename)
+    }
 
     onLongPressFeed: {
         unsubscribeFeedMenu.key = key
@@ -41,10 +44,8 @@ PageStackWindow {
         id: myMenu
         visualParent: pageStack
         MenuLayout {
-            MenuItem { text: qsTr("Settings"); onClicked: {}  }
-            MenuItem { text: qsTr("Export Feeds"); onClicked: { var file=controller.exportOpml(); banner.text=qsTr("Feeds exported as "+file); banner.open() }  }
-            MenuItem { text: qsTr("Invert Theme"); onClicked: { theme.inverted = !theme.inverted }  }
-            MenuItem { text: qsTr("Add Feeds"); onClicked: { pageStack.push(addFeedPage)  } }
+            MenuItem { text: qsTr("Settings"); onClicked: {pageStack.push(settingsPage)}  }
+            MenuItem { text: qsTr("Manage Subscriptions"); onClicked: { pageStack.push(addFeedPage)  } }
             MenuItem { text: qsTr("Update All Categories"); onClicked: controller.updateAll(); }
             MenuItem { text: qsTr("About FeedingIt"); onClicked: query.open(); }
         }
@@ -244,15 +245,72 @@ PageStackWindow {
 
     Component {
         id: addFeedPage
-        AddFeed {}
+        AddFeed {
+            id: addFeedItem
+
+            Connections {
+                 target: window
+                 onAddFileSignal: addFeedItem.addFileToDialog(fullname, filename)
+             }
+        }
+    }
+
+    Component {
+        id: settingsPage
+        SettingsPage {
+            id: settingsItem
+            tools: commonTools
+        }
     }
 
     Settings {
         id: settings
     }
 
-    InfoBanner {
+    Rectangle {
         id: banner
+        x: 10
+        width: parent.width - 20
+        height: bannerText.height + 20
+        y: 50
+        z:8
+
+        visible: false
+        radius: 4
+        border.color: "white"
+        color: "black"
+
+        Text {
+            id: bannerText
+            anchors.centerIn: parent
+            font.pixelSize: 24
+            //text: "Test"
+            color: "white"
+            wrapMode: Text.WordWrap;
+        }
+
+        Timer {
+            id: bannerTimer
+            interval: 3000
+            repeat: false
+            running: false
+            onTriggered: banner.visible = false
+        }
+
+        function show(str) {
+            bannerText.text = str;
+            banner.visible = true
+            bannerTimer.start()
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: {
+                bannerTimer.stop()
+                banner.visible= false
+            }
+        }
+
         //text: "This is an info banner with no icon"
     }
 }
index f8633f7..477e834 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/make -f
 
 # This file was automatically generated by stdeb 0.6.0+git at
-# Tue, 15 Nov 2011 22:13:06 -0800
+# Mon, 21 Nov 2011 21:11:33 -0800
 
 %:
        dh $@ --with python2 --buildsystem=python_distutils
index 9f7ec81..47ceaca 100644 (file)
@@ -226,6 +226,10 @@ class Config():
             self.config["feedsort"] = configParser.get(section, "feedsort")
         except:
             self.config["feedsort"] = "Manual"
+        try:
+            self.config["theme"] = configParser.get(section, "theme")
+        except:
+            self.config["theme"] = True
         
     def saveConfig(self):
         configParser = RawConfigParser()
@@ -242,6 +246,7 @@ class Config():
         configParser.set(section, 'hidereadarticles', str(self.config["hidereadarticles"]))
         configParser.set(section, 'extBrowser', str(self.config["extBrowser"]))
         configParser.set(section, 'feedsort', str(self.config["feedsort"]))
+        configParser.set(section, 'theme', str(self.config["theme"]))
 
         # Writing our configuration file
         file = open(self.configFilename, 'wb')
@@ -271,6 +276,8 @@ class Config():
         return self.config["artFontSize"]
     def getExpiry(self):
         return self.config["expiry"]
+    def setExpiry(self, expiry):
+        self.config["expiry"] = expiry
     def isAutoUpdateEnabled(self):
         return self.config["autoupdate"]
     def getUpdateInterval(self):
@@ -279,10 +286,16 @@ class Config():
         return "sans italic %s" % self.config["fontSize"]
     def getUnreadFont(self):
         return "sans %s" % self.config["fontSize"]
-    def getOrientation(self):
+    def getOrientation(self, index):
         return ranges["orientation"].index(self.config["orientation"])
+    def getOrientationChoices(self):
+        return ranges["orientation"]
+    def setOrientation(self, choice):
+        self.config["orientation"] = index 
     def getImageCache(self):
         return self.config["imageCache"]
+    def setImageCache(self, cache):
+        self.config["imageCache"] = bool(cache) 
     @mainthread
     def getProxy(self):
         if self.config["proxy"] == False:
@@ -295,9 +308,21 @@ class Config():
         return (False, None)
     def getHideReadFeeds(self):
         return self.config["hidereadfeeds"]
+    def setHideReadFeeds(self, setting):
+        self.config["hidereadfeeds"] = bool(setting)
     def getHideReadArticles(self):
         return self.config["hidereadarticles"]
+    def setHideReadArticles(self, setting):
+        self.config["hidereadarticles"] = bool(setting)
     def getOpenInExternalBrowser(self):
         return self.config["extBrowser"]
     def getFeedSortOrder(self):
         return self.config["feedsort"]
+    def getFeedSortOrderChoices(self):
+        return ranges["feedsort"]
+    def setFeedSortOrder(self, setting):
+        self.config["feedsort"] = setting
+    def getTheme(self):
+        return self.config["theme"]
+    def setTheme(self, theme):
+        self.config["theme"] = bool(theme)
index 7330871..1f6d71b 100644 (file)
@@ -34,7 +34,7 @@ def my_excepthook(exctype, value, tb):
         % (''.join(traceback.format_exception(exctype, value, tb)),))
     original_excepthook(exctype, value, tb)
 
-def init(dot_directory, debug=False, max_logfiles=1, program_name=None):
+def init(dot_directory, debug=True, max_logfiles=1, program_name=None):
     if not os.path.isabs(dot_directory):
         dot_directory = os.path.join(os.path.expanduser("~"), dot_directory)
 
index 952b5e0..d2060e8 100644 (file)
@@ -8,6 +8,7 @@ import os
 from os import mkdir, remove, stat, environ
 from os.path import isfile, isdir, exists
 import codecs
+from gconf import client_get_default
 
 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
 from PySide import QtOpenGL,  QtCore
@@ -17,7 +18,7 @@ CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit"
 #CONFIGDIR = "/home/user/.feedingit"
 
 import logging
-#logger = logging.getLogger(__name__)
+logger = logging.getLogger(__name__)
 
 import debugging
 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
@@ -50,7 +51,7 @@ class Controller(QtCore.QObject):
     @QtCore.Slot(str,result=str)
     def getArticlesXml(self, key):
         #onlyUnread = arguments.get("onlyUnread","False")
-        return self._handler.generateArticlesXml(key, "False")
+        return self._handler.generateArticlesXml(key, config.getHideReadArticles())
     
     @QtCore.Slot(result=str)
     def getCategoryXml(self):
@@ -112,6 +113,14 @@ class Controller(QtCore.QObject):
             return "False"
         return ""
     
+    @QtCore.Slot(str, str)
+    def populateFileDialog(self, path, type):
+        import glob
+        import os.path
+        for file in glob.glob(path+type):
+            logger.debug(file)
+            root.addFileNotification(file, os.path.basename(file))
+    
     @QtCore.Slot(str, result=int)
     def importOpml(self, filename):
         from opml_lib import parseOpml
@@ -135,6 +144,31 @@ class Controller(QtCore.QObject):
         except:
             logger.debug("Error exporting: %s" % filename)
             return "error"
+        
+    @QtCore.Slot(str, result=bool)
+    def getBooleanSetting(self, setting):
+        if (setting == "theme"):
+            return config.getTheme()
+        elif (setting == "imageCache" ):
+            return config.getImageCache()
+        elif (setting == "hideReadFeeds"):
+            return config.getHideReadFeeds()
+        elif (setting == "hideReadArticles"):
+            return config.getHideReadArticles()
+        else:
+            return 'True'
+        
+    @QtCore.Slot(str, bool)
+    def setBooleanSetting(self, setting, value):
+        if (setting == "theme"):
+            config.setTheme(value)
+        elif (setting == "imageCache" ):
+            config.setImageCache(value)
+        elif (setting == "hideReadFeeds"):
+            config.setHideReadFeeds(value)
+        elif (setting == "hideReadArticles"):
+            config.setHideReadArticles(value)
+        config.saveConfig()
 
 def main():
 
@@ -164,6 +198,7 @@ def main():
 
     controller = Controller(listing)
  
+    global root
     rc = view.rootContext()
  
     rc.setContextProperty('controller', controller)
@@ -181,6 +216,7 @@ def main():
         view.setSource(os.path.join('qml','main.qml'))
         view.show()
         #view.setSource(os.path.join('qml','FeedingIt.qml'))
+    root = view.rootObject()
 
     #view.showFullScreen()
     #view.show()
index ac31e0b..f974ddb 100644 (file)
@@ -110,6 +110,7 @@ Item {
             Item {
                 width: articleViewer.width; height: backRect.height + 3
                 id: listItem
+
                 Rectangle {
                     id: backRect; color: settings.backColour; opacity: index % 2 ? 0.2 : 0.4;
                     height: articleText.height + 22; width: listItem.width;
index 5131cbc..8df8c5e 100644 (file)
@@ -49,7 +49,7 @@ Item {
             //Component.onCompleted: console.log("item:"+feedid + " "+ visible + " "+ height + " " + width)
             id: wrapper;
             //width: wrapper.ListView.view.width;
-            visible: (unread == "0" && feedsItem.hideReadFeeds=="True") ? false : true
+            visible: (unread == "0" && settings.hideReadFeeds) ? false : true
             //visible: true
             height: (visible) ? 86 : 0
             width: parent.width
index 68edc8c..973bbdb 100644 (file)
@@ -1,6 +1,5 @@
 import QtQuick 1.0
 import com.nokia.meego 1.0
-import com.nokia.extras 1.0
 
 PageStackWindow {
     id: window
@@ -10,10 +9,14 @@ PageStackWindow {
     signal longPressFeed(string key)
     signal categoryReloadRequest()
     signal feedReloadRequest()
+    signal addFileSignal(string fullname, string filename)
+
     property string feedid
     property string catid
 
-    Component.onCompleted: theme.inverted= true
+    function addFileNotification(fullname, filename) {
+        window.addFileSignal(fullname,filename)
+    }
 
     onLongPressFeed: {
         unsubscribeFeedMenu.key = key
@@ -41,10 +44,8 @@ PageStackWindow {
         id: myMenu
         visualParent: pageStack
         MenuLayout {
-            MenuItem { text: qsTr("Settings"); onClicked: {}  }
-            MenuItem { text: qsTr("Export Feeds"); onClicked: { var file=controller.exportOpml(); banner.text=qsTr("Feeds exported as "+file); banner.open() }  }
-            MenuItem { text: qsTr("Invert Theme"); onClicked: { theme.inverted = !theme.inverted }  }
-            MenuItem { text: qsTr("Add Feeds"); onClicked: { pageStack.push(addFeedPage)  } }
+            MenuItem { text: qsTr("Settings"); onClicked: {pageStack.push(settingsPage)}  }
+            MenuItem { text: qsTr("Manage Subscriptions"); onClicked: { pageStack.push(addFeedPage)  } }
             MenuItem { text: qsTr("Update All Categories"); onClicked: controller.updateAll(); }
             MenuItem { text: qsTr("About FeedingIt"); onClicked: query.open(); }
         }
@@ -244,15 +245,72 @@ PageStackWindow {
 
     Component {
         id: addFeedPage
-        AddFeed {}
+        AddFeed {
+            id: addFeedItem
+
+            Connections {
+                 target: window
+                 onAddFileSignal: addFeedItem.addFileToDialog(fullname, filename)
+             }
+        }
+    }
+
+    Component {
+        id: settingsPage
+        SettingsPage {
+            id: settingsItem
+            tools: commonTools
+        }
     }
 
     Settings {
         id: settings
     }
 
-    InfoBanner {
+    Rectangle {
         id: banner
+        x: 10
+        width: parent.width - 20
+        height: bannerText.height + 20
+        y: 50
+        z:8
+
+        visible: false
+        radius: 4
+        border.color: "white"
+        color: "black"
+
+        Text {
+            id: bannerText
+            anchors.centerIn: parent
+            font.pixelSize: 24
+            //text: "Test"
+            color: "white"
+            wrapMode: Text.WordWrap;
+        }
+
+        Timer {
+            id: bannerTimer
+            interval: 3000
+            repeat: false
+            running: false
+            onTriggered: banner.visible = false
+        }
+
+        function show(str) {
+            bannerText.text = str;
+            banner.visible = true
+            bannerTimer.start()
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: {
+                bannerTimer.stop()
+                banner.visible= false
+            }
+        }
+
         //text: "This is an info banner with no icon"
     }
 }
index 2416e2f..491ee28 100644 (file)
Binary files a/psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1.debian.tar.gz and b/psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1.debian.tar.gz differ
index 8c202d8..794a41c 100644 (file)
@@ -7,11 +7,11 @@ Maintainer: Yves <yves@marcoz.org>
 Standards-Version: 3.9.1
 Build-Depends: python-all (>= 2.6.6-3), debhelper (>= 7.4.3)
 Checksums-Sha1: 
- c045507274a13c3bea0e1cb6006fea9004ba30b7 178550 feedingit_0.1.0.orig.tar.gz
- a09869b196b8514cf6431eb04ddd98e6e9dd1c39 894 feedingit_0.1.0-1.debian.tar.gz
+ e4330c217f401270d8d72ce61b19738e9bfd2088 181121 feedingit_0.1.0.orig.tar.gz
+ 03bbd591b1f8061782cad693c74bd8998d90873d 892 feedingit_0.1.0-1.debian.tar.gz
 Checksums-Sha256: 
- 92ba00c80c8450eaaae39346abb2a442b5e1714bc396cf7a7267c0b00e74c9df 178550 feedingit_0.1.0.orig.tar.gz
- 2644b6342aa0f4e8e2c9e1a98d3402b446b50ab4f4b85cecd4a14d557854636c 894 feedingit_0.1.0-1.debian.tar.gz
+ e0976e4078949e8f90fb5595ad2e0beac46d6ffdd7777540cdfcf6aabc912c0a 181121 feedingit_0.1.0.orig.tar.gz
+ 7d0569d259111ec8c692a85684605d19f7ace917d3a602b47a6e3925811ff731 892 feedingit_0.1.0-1.debian.tar.gz
 Files: 
- 25f89c7eed2efea44ebc3a15bafd7d8f 178550 feedingit_0.1.0.orig.tar.gz
- 1d29f8a2b74b889cec7df9d63e96bfc8 894 feedingit_0.1.0-1.debian.tar.gz
+ a87f884427e09496169d8d45661888e6 181121 feedingit_0.1.0.orig.tar.gz
+ b7c8797b89ea548c7d22ac74a9552e5b 892 feedingit_0.1.0-1.debian.tar.gz
index d7cdf70..0a7652c 100644 (file)
Binary files a/psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1_all.deb and b/psa_harmattan/feedingit/deb_dist/feedingit_0.1.0-1_all.deb differ
index 07318d1..70f8061 100644 (file)
@@ -1,5 +1,5 @@
 Format: 1.8
-Date: Tue, 15 Nov 2011 22:13:06 -0800
+Date: Mon, 21 Nov 2011 21:11:33 -0800
 Source: feedingit
 Binary: feedingit
 Architecture: source all
@@ -15,17 +15,17 @@ Changes:
  .
    * source package automatically created by stdeb 0.6.0+git
 Checksums-Sha1: 
- a71a6948e1e975888c79be71ca6248b09f7db08e 753 feedingit_0.1.0-1.dsc
- c045507274a13c3bea0e1cb6006fea9004ba30b7 178550 feedingit_0.1.0.orig.tar.gz
- a09869b196b8514cf6431eb04ddd98e6e9dd1c39 894 feedingit_0.1.0-1.debian.tar.gz
- 3dc207cf3b6b6db9193d230ac67d864c1aa09aef 168136 feedingit_0.1.0-1_all.deb
+ 4a31204eed5ce466fd01cfbb01421f33e678374f 753 feedingit_0.1.0-1.dsc
+ e4330c217f401270d8d72ce61b19738e9bfd2088 181121 feedingit_0.1.0.orig.tar.gz
+ 03bbd591b1f8061782cad693c74bd8998d90873d 892 feedingit_0.1.0-1.debian.tar.gz
+ 57723377cfd1516d9747e2b49f2e46fb29dcb998 171812 feedingit_0.1.0-1_all.deb
 Checksums-Sha256: 
- 96d4c7e6525bd5547946f9cf8f7b182d759d34c3d33523955aca28b8583d773c 753 feedingit_0.1.0-1.dsc
- 92ba00c80c8450eaaae39346abb2a442b5e1714bc396cf7a7267c0b00e74c9df 178550 feedingit_0.1.0.orig.tar.gz
- 2644b6342aa0f4e8e2c9e1a98d3402b446b50ab4f4b85cecd4a14d557854636c 894 feedingit_0.1.0-1.debian.tar.gz
- dca845bc6ce162cc9a22dc965a3a60cb182d1135167fbebfa9836a0f869e9ab3 168136 feedingit_0.1.0-1_all.deb
+ e99828280e4a7a5fe3ac36d30943be2197cd9e56f1c83c24b8f6118179d6158d 753 feedingit_0.1.0-1.dsc
+ e0976e4078949e8f90fb5595ad2e0beac46d6ffdd7777540cdfcf6aabc912c0a 181121 feedingit_0.1.0.orig.tar.gz
+ 7d0569d259111ec8c692a85684605d19f7ace917d3a602b47a6e3925811ff731 892 feedingit_0.1.0-1.debian.tar.gz
+ 3b8879e509aca560d19cb147c6f13140b6630980d30b4c50ed5708277f500b54 171812 feedingit_0.1.0-1_all.deb
 Files: 
- 51acff2d37b5d47ce0c7141e228d9084 753 user/development optional feedingit_0.1.0-1.dsc
- 25f89c7eed2efea44ebc3a15bafd7d8f 178550 user/development optional feedingit_0.1.0.orig.tar.gz
- 1d29f8a2b74b889cec7df9d63e96bfc8 894 user/development optional feedingit_0.1.0-1.debian.tar.gz
- 2b3f1acb38b76d65e916f1fbe6baa208 168136 user/development optional feedingit_0.1.0-1_all.deb
+ 8fccb57ce60335a7c8a8a85eb4f4ecb6 753 user/development optional feedingit_0.1.0-1.dsc
+ a87f884427e09496169d8d45661888e6 181121 user/development optional feedingit_0.1.0.orig.tar.gz
+ b7c8797b89ea548c7d22ac74a9552e5b 892 user/development optional feedingit_0.1.0-1.debian.tar.gz
+ f4162b7fec29248b13fc683a1b0c06b0 171812 user/development optional feedingit_0.1.0-1_all.deb
index 198c121..3a40cc4 100644 (file)
Binary files a/psa_harmattan/feedingit/deb_dist/feedingit_0.1.0.orig.tar.gz and b/psa_harmattan/feedingit/deb_dist/feedingit_0.1.0.orig.tar.gz differ
index 9f7ec81..47ceaca 100644 (file)
@@ -226,6 +226,10 @@ class Config():
             self.config["feedsort"] = configParser.get(section, "feedsort")
         except:
             self.config["feedsort"] = "Manual"
+        try:
+            self.config["theme"] = configParser.get(section, "theme")
+        except:
+            self.config["theme"] = True
         
     def saveConfig(self):
         configParser = RawConfigParser()
@@ -242,6 +246,7 @@ class Config():
         configParser.set(section, 'hidereadarticles', str(self.config["hidereadarticles"]))
         configParser.set(section, 'extBrowser', str(self.config["extBrowser"]))
         configParser.set(section, 'feedsort', str(self.config["feedsort"]))
+        configParser.set(section, 'theme', str(self.config["theme"]))
 
         # Writing our configuration file
         file = open(self.configFilename, 'wb')
@@ -271,6 +276,8 @@ class Config():
         return self.config["artFontSize"]
     def getExpiry(self):
         return self.config["expiry"]
+    def setExpiry(self, expiry):
+        self.config["expiry"] = expiry
     def isAutoUpdateEnabled(self):
         return self.config["autoupdate"]
     def getUpdateInterval(self):
@@ -279,10 +286,16 @@ class Config():
         return "sans italic %s" % self.config["fontSize"]
     def getUnreadFont(self):
         return "sans %s" % self.config["fontSize"]
-    def getOrientation(self):
+    def getOrientation(self, index):
         return ranges["orientation"].index(self.config["orientation"])
+    def getOrientationChoices(self):
+        return ranges["orientation"]
+    def setOrientation(self, choice):
+        self.config["orientation"] = index 
     def getImageCache(self):
         return self.config["imageCache"]
+    def setImageCache(self, cache):
+        self.config["imageCache"] = bool(cache) 
     @mainthread
     def getProxy(self):
         if self.config["proxy"] == False:
@@ -295,9 +308,21 @@ class Config():
         return (False, None)
     def getHideReadFeeds(self):
         return self.config["hidereadfeeds"]
+    def setHideReadFeeds(self, setting):
+        self.config["hidereadfeeds"] = bool(setting)
     def getHideReadArticles(self):
         return self.config["hidereadarticles"]
+    def setHideReadArticles(self, setting):
+        self.config["hidereadarticles"] = bool(setting)
     def getOpenInExternalBrowser(self):
         return self.config["extBrowser"]
     def getFeedSortOrder(self):
         return self.config["feedsort"]
+    def getFeedSortOrderChoices(self):
+        return ranges["feedsort"]
+    def setFeedSortOrder(self, setting):
+        self.config["feedsort"] = setting
+    def getTheme(self):
+        return self.config["theme"]
+    def setTheme(self, theme):
+        self.config["theme"] = bool(theme)
index 7330871..1f6d71b 100644 (file)
@@ -34,7 +34,7 @@ def my_excepthook(exctype, value, tb):
         % (''.join(traceback.format_exception(exctype, value, tb)),))
     original_excepthook(exctype, value, tb)
 
-def init(dot_directory, debug=False, max_logfiles=1, program_name=None):
+def init(dot_directory, debug=True, max_logfiles=1, program_name=None):
     if not os.path.isabs(dot_directory):
         dot_directory = os.path.join(os.path.expanduser("~"), dot_directory)
 
index 952b5e0..d2060e8 100644 (file)
@@ -8,6 +8,7 @@ import os
 from os import mkdir, remove, stat, environ
 from os.path import isfile, isdir, exists
 import codecs
+from gconf import client_get_default
 
 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
 from PySide import QtOpenGL,  QtCore
@@ -17,7 +18,7 @@ CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit"
 #CONFIGDIR = "/home/user/.feedingit"
 
 import logging
-#logger = logging.getLogger(__name__)
+logger = logging.getLogger(__name__)
 
 import debugging
 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
@@ -50,7 +51,7 @@ class Controller(QtCore.QObject):
     @QtCore.Slot(str,result=str)
     def getArticlesXml(self, key):
         #onlyUnread = arguments.get("onlyUnread","False")
-        return self._handler.generateArticlesXml(key, "False")
+        return self._handler.generateArticlesXml(key, config.getHideReadArticles())
     
     @QtCore.Slot(result=str)
     def getCategoryXml(self):
@@ -112,6 +113,14 @@ class Controller(QtCore.QObject):
             return "False"
         return ""
     
+    @QtCore.Slot(str, str)
+    def populateFileDialog(self, path, type):
+        import glob
+        import os.path
+        for file in glob.glob(path+type):
+            logger.debug(file)
+            root.addFileNotification(file, os.path.basename(file))
+    
     @QtCore.Slot(str, result=int)
     def importOpml(self, filename):
         from opml_lib import parseOpml
@@ -135,6 +144,31 @@ class Controller(QtCore.QObject):
         except:
             logger.debug("Error exporting: %s" % filename)
             return "error"
+        
+    @QtCore.Slot(str, result=bool)
+    def getBooleanSetting(self, setting):
+        if (setting == "theme"):
+            return config.getTheme()
+        elif (setting == "imageCache" ):
+            return config.getImageCache()
+        elif (setting == "hideReadFeeds"):
+            return config.getHideReadFeeds()
+        elif (setting == "hideReadArticles"):
+            return config.getHideReadArticles()
+        else:
+            return 'True'
+        
+    @QtCore.Slot(str, bool)
+    def setBooleanSetting(self, setting, value):
+        if (setting == "theme"):
+            config.setTheme(value)
+        elif (setting == "imageCache" ):
+            config.setImageCache(value)
+        elif (setting == "hideReadFeeds"):
+            config.setHideReadFeeds(value)
+        elif (setting == "hideReadArticles"):
+            config.setHideReadArticles(value)
+        config.saveConfig()
 
 def main():
 
@@ -164,6 +198,7 @@ def main():
 
     controller = Controller(listing)
  
+    global root
     rc = view.rootContext()
  
     rc.setContextProperty('controller', controller)
@@ -181,6 +216,7 @@ def main():
         view.setSource(os.path.join('qml','main.qml'))
         view.show()
         #view.setSource(os.path.join('qml','FeedingIt.qml'))
+    root = view.rootObject()
 
     #view.showFullScreen()
     #view.show()
index 9c6bc80..f382ae3 100644 (file)
@@ -8,6 +8,11 @@ Page {
     anchors.margins: UiConstants.DefaultMargin
     anchors.fill: parent
 
+    function addFileToDialog(fullname, filename) {
+        fileDialog.model.append({name: filename,
+                                 fullname: fullname})
+    }
+
     TabGroup {
         id: tabGroup
         anchors.fill: parent
@@ -19,29 +24,37 @@ Page {
 
             Column {
                 spacing: 10
+                width: parent.width
 
                 Text {
                     id: searchText
                     font.pixelSize: 22
                     color: "white"
-                    text: "Search for feeds"
+                    text: qsTr("Add a feed by URL, or search by keyword")
                 }
 
                 TextInputClear {
                     id: searchInput
-                    placeHolder: "Enter a search term"
+                    placeHolder: qsTr("Enter a URL or keywords")
                 }
 
                 Button {
                     id: searchButton
                     text: "Search"
-                    onClicked: FeedJS.keywordSearch(searchInput.text)
+                    onClicked: {
+                        var key = searchInput.text
+                        if (key.substring(0, 4) === "http") {
+                            categoryDialog.confirmCategory("", urlInput.text);
+                        } else {
+                            FeedJS.keywordSearch(searchInput.text)
+                        }
+                    }
                 }
             }
 
             SelectionDialog {
                      id: searchDialog
-                     titleText: "Select feed:"
+                     titleText: qsTr("Select feed:")
                      //model: []
                      onSelectedIndexChanged: {
                          if (selectedIndex>=0) {
@@ -57,73 +70,12 @@ Page {
         } //searchTab
 
         Item {
-            id: urlTab
-
-            Column {
-                Text {
-                    id: urlText
-                    font.pixelSize: 22
-                    color: "white"
-                    text: "Enter the feed URL"
-                }
-
-                TextInputClear {
-                    id: urlInput
-                    placeHolder: "Feed URL"
-                    width: parent.width
-                }
-
-                Button {
-                    id: urlButton
-                    text: "Add"
-                    onClicked: {
-                        console.log("Adding "+urlInput.text)
-                        //controller.addFeed("",urlInput.text,1);
-                        categoryDialog.confirmCategory("", urlInput.text);
-                    }
-                    width: 150
-                }
-            }
-
-        } //urlTab
-
-        Item {
-            id: opmlTab
-
-            Column {
-                Text {
-                    id: opmlText
-                    font.pixelSize: 22
-                    color: "white"
-                    text: "Enter the OPML filename in MyDocs folder"
-                }
-
-                TextInputClear {
-                    id: opmlInput
-                    placeHolder: "OPML filename"
-                    width: parent.width
-                }
-
-                Button {
-                    id: opmlButton
-                    text: "Import"
-                    onClicked: {
-                        console.log("Importing "+opmlInput.text)
-                        //controller.addFeed("",urlInput.text,1);
-                        var num = controller.importOpml(opmlInput.text)
-                        banner.text=qsTr("Successfully imported "+num+" feeds.")
-                        banner.open()
-                    }
-                    width: 150
-                }
-            }
-
-        } //opmlTab
-
-        Item {
             id: categoryTab
+            anchors.fill: parent
 
             Column {
+                width: parent.width
+                spacing: 10
                 Text {
                     id: categoryText
                     font.pixelSize: 22
@@ -139,7 +91,7 @@ Page {
 
                 Button {
                     id: categoryButton
-                    text: "Add"
+                    text: "Add Category"
                     onClicked: {
                         if (categoryInput.text != "") {
                             controller.addCategory(categoryInput.text)
@@ -147,7 +99,7 @@ Page {
                             window.categoryReloadRequest()
                         }
                     }
-                    width: 150
+                    //width: 150
                 }
             }
 
@@ -173,25 +125,38 @@ Page {
                     tab: searchTab
                 }
                 TabButton {
-                    text: "URL"
-                    tab: urlTab
-                }
-                TabButton {
-                    text: "Import"
-                    tab: opmlTab
-                }
-                TabButton {
                     text: "Categories"
                     tab: categoryTab
                 }
             }
+            ToolIcon {
+                platformIconId: "toolbar-view-menu"
+                anchors.right: (parent === undefined) ? undefined : parent.right
+                onClicked: (manageFeedsMenu.status == DialogStatus.Closed) ? manageFeedsMenu.open() : manageFeedsMenu.close()
+            }
+        }
 
+    }
+
+    Menu {
+        id: manageFeedsMenu
+        visualParent: pageStack
+        MenuLayout {
+            MenuItem { text: qsTr("Import Feeds From File"); onClicked: {
+                    fileDialog.model.clear()
+                    controller.populateFileDialog("/home/user/MyDocs/","*.*ml")
+                    fileDialog.open()
+                } }
+            MenuItem {
+                text: qsTr("Export Feeds");
+                onClicked: { var file=controller.exportOpml("/home/user/MyDocs/feedingit-export.opml"); banner.show(qsTr("Feeds exported as %1").arg(file)) }
+            }
         }
     }
 
     SelectionDialog {
              id: categoryDialog
-             titleText: "Select category:"
+             titleText: qsTr("Select category:")
              property string feedTitle
              property string feedUrl
 
@@ -238,4 +203,18 @@ Page {
                  categoryDialog.selectedIndex = -1;
              }
     }
+
+    SelectionDialog {
+        id: fileDialog
+        titleText: qsTr("Select a file to import")
+        model: ListModel {
+                id: fileList
+               }
+
+        onSelectedIndexChanged: {
+            var num = controller.importOpml(fileDialog.model.get(fileDialog.selectedIndex).fullname);
+            console.log("Import "+fileDialog.model.get(fileDialog.selectedIndex).fullname)
+            banner.show(qsTr("Successfully imported %1 feeds.").args(num));
+        }
+    }
 }
index ac31e0b..f974ddb 100644 (file)
@@ -110,6 +110,7 @@ Item {
             Item {
                 width: articleViewer.width; height: backRect.height + 3
                 id: listItem
+
                 Rectangle {
                     id: backRect; color: settings.backColour; opacity: index % 2 ? 0.2 : 0.4;
                     height: articleText.height + 22; width: listItem.width;
diff --git a/psa_harmattan/feedingit/qml/AutomaticUpdate.qml b/psa_harmattan/feedingit/qml/AutomaticUpdate.qml
new file mode 100644 (file)
index 0000000..1e29655
--- /dev/null
@@ -0,0 +1,14 @@
+import QtQuick 1.0
+import QtMobility.systeminfo 1.2
+
+AlignedTimer {
+    id: heartbeat
+    maximumInterval: 15
+    minimumInterval: 5
+    onTimeout: {
+        var timestamp = Qt.formatDateTime(new Date(), "hh:mm:ss") + qsTr(" - heartbeat!")
+        console.log(timestamp)
+        prevLabel.text = lastLabel.text
+        lastLabel.text = timestamp
+    }
+}
index 5131cbc..8df8c5e 100644 (file)
@@ -49,7 +49,7 @@ Item {
             //Component.onCompleted: console.log("item:"+feedid + " "+ visible + " "+ height + " " + width)
             id: wrapper;
             //width: wrapper.ListView.view.width;
-            visible: (unread == "0" && feedsItem.hideReadFeeds=="True") ? false : true
+            visible: (unread == "0" && settings.hideReadFeeds) ? false : true
             //visible: true
             height: (visible) ? 86 : 0
             width: parent.width
index e6d7362..19fde9a 100644 (file)
@@ -7,4 +7,11 @@ Item {
     property int secondaryTextSize: 14
 
     property string backColour: theme.inverted? "#dddddd" : "#222222"
+
+    property bool hideReadFeeds: controller.getBooleanSetting("hideReadFeeds")
+    property bool hideReadArticles: controller.getBooleanSetting("hideReadArticles")
+
+    Component.onCompleted: {
+        theme.inverted = controller.getBooleanSetting("theme")
+    }
 }
diff --git a/psa_harmattan/feedingit/qml/SettingsPage.qml b/psa_harmattan/feedingit/qml/SettingsPage.qml
new file mode 100644 (file)
index 0000000..1cc1954
--- /dev/null
@@ -0,0 +1,52 @@
+import QtQuick 1.0
+import com.nokia.meego 1.0
+
+Page {
+    id: settingsPage
+    anchors.margins: UiConstants.DefaultMargin
+    anchors.fill: parent
+
+    Column {
+        width: parent.width
+
+        SwitchSetting {
+            text: qsTr("Use Dark Theme")
+            checked: controller.getBooleanSetting("theme")
+
+            onSwitched: {
+                controller.setBooleanSetting("theme", checked)
+                theme.inverted = checked
+            }
+        }
+
+        SwitchSetting {
+            text: qsTr("Hide Read Feeds")
+            checked: controller.getBooleanSetting("hideReadFeeds")
+
+            onSwitched: {
+                controller.setBooleanSetting("hideReadFeeds", checked)
+                settings.hideReadFeeds = checked
+            }
+        }
+
+        SwitchSetting {
+            text: qsTr("Hide Read Articles")
+            checked: controller.getBooleanSetting("hideReadArticles")
+
+            onSwitched: {
+                controller.setBooleanSetting("hideReadArticles", checked)
+                settings.hideReadArticles = checked
+            }
+        }
+
+        SwitchSetting {
+            text: qsTr("Cache Images")
+            checked: controller.getBooleanSetting("imageCache")
+
+            onSwitched: {
+                controller.setBooleanSetting("imageCache", checked)
+            }
+        }
+    }
+
+}
diff --git a/psa_harmattan/feedingit/qml/SwitchSetting.qml b/psa_harmattan/feedingit/qml/SwitchSetting.qml
new file mode 100644 (file)
index 0000000..960be8e
--- /dev/null
@@ -0,0 +1,25 @@
+import QtQuick 1.0
+import com.nokia.meego 1.0
+
+Row {
+    width: parent.width
+    property alias text: themeText.text
+    property alias checked: themeSwitch.checked
+    signal switched()
+
+    Text {
+        id: themeText
+        color: settings.mainTextColour;
+        font.pointSize: settings.mainTextSize
+        width: parent.width - themeSwitch.width
+    }
+
+    Switch {
+        id: themeSwitch
+
+        onCheckedChanged: {
+            switched()
+            //theme.inverted = checked
+        }
+    }
+}
index 68edc8c..973bbdb 100644 (file)
@@ -1,6 +1,5 @@
 import QtQuick 1.0
 import com.nokia.meego 1.0
-import com.nokia.extras 1.0
 
 PageStackWindow {
     id: window
@@ -10,10 +9,14 @@ PageStackWindow {
     signal longPressFeed(string key)
     signal categoryReloadRequest()
     signal feedReloadRequest()
+    signal addFileSignal(string fullname, string filename)
+
     property string feedid
     property string catid
 
-    Component.onCompleted: theme.inverted= true
+    function addFileNotification(fullname, filename) {
+        window.addFileSignal(fullname,filename)
+    }
 
     onLongPressFeed: {
         unsubscribeFeedMenu.key = key
@@ -41,10 +44,8 @@ PageStackWindow {
         id: myMenu
         visualParent: pageStack
         MenuLayout {
-            MenuItem { text: qsTr("Settings"); onClicked: {}  }
-            MenuItem { text: qsTr("Export Feeds"); onClicked: { var file=controller.exportOpml(); banner.text=qsTr("Feeds exported as "+file); banner.open() }  }
-            MenuItem { text: qsTr("Invert Theme"); onClicked: { theme.inverted = !theme.inverted }  }
-            MenuItem { text: qsTr("Add Feeds"); onClicked: { pageStack.push(addFeedPage)  } }
+            MenuItem { text: qsTr("Settings"); onClicked: {pageStack.push(settingsPage)}  }
+            MenuItem { text: qsTr("Manage Subscriptions"); onClicked: { pageStack.push(addFeedPage)  } }
             MenuItem { text: qsTr("Update All Categories"); onClicked: controller.updateAll(); }
             MenuItem { text: qsTr("About FeedingIt"); onClicked: query.open(); }
         }
@@ -244,15 +245,72 @@ PageStackWindow {
 
     Component {
         id: addFeedPage
-        AddFeed {}
+        AddFeed {
+            id: addFeedItem
+
+            Connections {
+                 target: window
+                 onAddFileSignal: addFeedItem.addFileToDialog(fullname, filename)
+             }
+        }
+    }
+
+    Component {
+        id: settingsPage
+        SettingsPage {
+            id: settingsItem
+            tools: commonTools
+        }
     }
 
     Settings {
         id: settings
     }
 
-    InfoBanner {
+    Rectangle {
         id: banner
+        x: 10
+        width: parent.width - 20
+        height: bannerText.height + 20
+        y: 50
+        z:8
+
+        visible: false
+        radius: 4
+        border.color: "white"
+        color: "black"
+
+        Text {
+            id: bannerText
+            anchors.centerIn: parent
+            font.pixelSize: 24
+            //text: "Test"
+            color: "white"
+            wrapMode: Text.WordWrap;
+        }
+
+        Timer {
+            id: bannerTimer
+            interval: 3000
+            repeat: false
+            running: false
+            onTriggered: banner.visible = false
+        }
+
+        function show(str) {
+            bannerText.text = str;
+            banner.visible = true
+            bannerTimer.start()
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: {
+                bannerTimer.stop()
+                banner.visible= false
+            }
+        }
+
         //text: "This is an info banner with no icon"
     }
 }