5 from PySide import QtGui
6 from PySide import QtDeclarative
8 from os import mkdir, remove, stat, environ
9 from os.path import isfile, isdir, exists
11 from gconf import client_get_default
13 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
14 from PySide import QtOpenGL, QtCore
16 from rss_sqlite import Listing
17 CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit"
18 #CONFIGDIR = "/home/user/.feedingit"
21 logger = logging.getLogger(__name__)
24 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
26 from cgi import escape
29 class Controller(QtCore.QObject):
31 def __init__(self, listing):
32 QtCore.QObject.__init__(self)
33 from XmlHandler import XmlHandler
34 self._handler = XmlHandler(listing)
36 @QtCore.Slot(str,str, result=str)
37 def getArticle(self, key, article):
38 feed = listing.getFeed(key)
40 file = codecs.open(feed.getContentLink(article), "r", "utf-8")
41 html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
44 html = u"<html><body>Error retrieving article</body></html>"
47 @QtCore.Slot(str, result=str)
48 def getFeedsXml(self, catid):
49 return self._handler.generateFeedsXml(catid)
51 @QtCore.Slot(str,result=str)
52 def getArticlesXml(self, key):
53 #onlyUnread = arguments.get("onlyUnread","False")
54 return self._handler.generateArticlesXml(key, config.getHideReadArticles())
56 @QtCore.Slot(result=str)
57 def getCategoryXml(self):
58 return self._handler.generateCategoryXml()
60 @QtCore.Slot(QtCore.QObject)
61 def feedClicked(self, wrapper):
62 #print 'User clicked on:', wrapper._key
63 #articlesModel.updateModel(wrapper._key)
67 def updateFeed(self, key):
68 listing.updateFeed(key)
72 for catid in listing.getListOfCategories():
73 for feed in listing.getSortedListOfKeys("Manual", category=catid):
74 listing.updateFeed(feed)
77 def updateCategory(self, catid):
78 for feed in listing.getSortedListOfKeys("Manual", category=catid):
79 listing.updateFeed(feed)
81 @QtCore.Slot(str,str,str)
82 def addFeed(self, title, url, catid):
83 listing.addFeed(title,url, category=catid)
86 def addCategory(self, name):
87 listing.addCategory(name)
90 def removeFeed(self, key):
91 listing.removeFeed(key)
94 def removeCategory(self, catid):
95 listing.removeCategory(catid)
98 def markAllAsRead(self, key):
99 feed = listing.getFeed(key)
102 @QtCore.Slot(str, str)
103 def setEntryRead(self, key, articleid):
104 feed = listing.getFeed(key)
105 feed.setEntryRead(articleid)
106 listing.updateUnread(key)
108 @QtCore.Slot(str, result=str)
109 def getConfig(self, item):
110 if (item == "hideReadFeed"):
112 if (item == "hideReadArticles"):
116 @QtCore.Slot(str, str)
117 def populateFileDialog(self, path, type):
120 for file in glob.glob(path+type):
122 root.addFileNotification(file, os.path.basename(file))
124 @QtCore.Slot(str, result=int)
125 def importOpml(self, filename):
126 from opml_lib import parseOpml
127 file = open(filename, "r")
128 feeds = parseOpml(file.read())
130 for (title, url) in feeds:
131 listing.addFeed(title, url)
134 @QtCore.Slot(str, result=str)
135 def exportOpml(self, filename="/home/user/MyDocs/feedingit-export.opml"):
136 logger.debug("ExportOpmlData: %s" % filename)
137 from opml_lib import getOpmlText
139 str = getOpmlText(listing)
140 file = open(filename, "w")
145 logger.debug("Error exporting: %s" % filename)
148 @QtCore.Slot(str, result=bool)
149 def getBooleanSetting(self, setting):
150 if (setting == "theme"):
151 return config.getTheme()
152 elif (setting == "imageCache" ):
153 return config.getImageCache()
154 elif (setting == "hideReadFeeds"):
155 return config.getHideReadFeeds()
156 elif (setting == "hideReadArticles"):
157 return config.getHideReadArticles()
161 @QtCore.Slot(str, bool)
162 def setBooleanSetting(self, setting, value):
163 if (setting == "theme"):
164 config.setTheme(value)
165 elif (setting == "imageCache" ):
166 config.setImageCache(value)
167 elif (setting == "hideReadFeeds"):
168 config.setHideReadFeeds(value)
169 elif (setting == "hideReadArticles"):
170 config.setHideReadArticles(value)
175 if not isdir(CONFIGDIR):
179 logger.error("Error: Can't create configuration directory")
183 from config import Config
185 config = Config(None,CONFIGDIR+"config.ini")
188 listing = Listing(config, CONFIGDIR)
193 from jobmanager import JobManager
196 app = QtGui.QApplication(sys.argv)
197 view = QtDeclarative.QDeclarativeView()
199 controller = Controller(listing)
202 rc = view.rootContext()
204 rc.setContextProperty('controller', controller)
206 # Comment the two lines below if you don't want to use OpenGL for QML rendering or if it is not supported
207 #glw = QtOpenGL.QGLWidget()
208 #view.setViewport(glw)
210 if os.path.exists('/usr/share/feedingit/qml'):
211 glw = QtOpenGL.QGLWidget()
212 view.setViewport(glw)
213 view.setSource('/usr/share/feedingit/qml/main.qml')
214 view.showFullScreen()
216 view.setSource(os.path.join('qml','main.qml'))
218 #view.setSource(os.path.join('qml','FeedingIt.qml'))
219 root = view.rootObject()
221 #view.showFullScreen()
223 sys.exit(app.exec_())
225 if __name__ == "__main__":