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
12 # import python dbus GLib mainloop support
13 import dbus.mainloop.glib
14 # Enable glib main loop support
15 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
17 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
18 from PySide import QtOpenGL, QtCore
20 from rss_sqlite import Listing
21 CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit/"
22 #CONFIGDIR = "/home/user/.feedingit"
25 logger = logging.getLogger(__name__)
28 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
30 from cgi import escape
33 class Controller(QtCore.QObject):
35 def __init__(self, listing):
36 QtCore.QObject.__init__(self)
37 from XmlHandler import XmlHandler
38 self._handler = XmlHandler(listing)
40 def update_progress(self, percent_complete,
41 completed, in_progress, queued,
42 bytes_downloaded, bytes_updated, bytes_per_second,
44 logger.info(feed_updated)
45 total = completed + in_progress + queued
46 root.updateProgress(total, completed)
48 def update_started(self):
51 def update_finished(self):
54 @QtCore.Slot(str,str, result=str)
55 def getArticle(self, key, article):
56 feed = listing.getFeed(key)
58 file = codecs.open(feed.getContentLink(article), "r", "utf-8")
59 html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
62 html = u"<html><body>Error retrieving article</body></html>"
65 @QtCore.Slot(str, result=str)
66 def getFeedsXml(self, catid):
67 return self._handler.generateFeedsXml(catid)
69 @QtCore.Slot(str,result=str)
70 def getArticlesXml(self, key):
71 #onlyUnread = arguments.get("onlyUnread","False")
72 return self._handler.generateArticlesXml(key, config.getHideReadArticles())
74 @QtCore.Slot(result=str)
75 def getCategoryXml(self):
76 return self._handler.generateCategoryXml()
78 @QtCore.Slot(QtCore.QObject)
79 def feedClicked(self, wrapper):
80 #print 'User clicked on:', wrapper._key
81 #articlesModel.updateModel(wrapper._key)
85 def updateFeed(self, key):
86 listing.updateFeed(key)
90 for catid in listing.getListOfCategories():
91 for feed in listing.getSortedListOfKeys("Manual", category=catid):
92 listing.updateFeed(feed)
95 def updateCategory(self, catid):
96 for feed in listing.getSortedListOfKeys("Manual", category=catid):
97 listing.updateFeed(feed)
99 @QtCore.Slot(str,str,str)
100 def addFeed(self, title, url, catid):
101 listing.addFeed(title,url, category=catid)
104 def addCategory(self, name):
105 listing.addCategory(name)
108 def removeFeed(self, key):
109 listing.removeFeed(key)
112 def removeCategory(self, catid):
113 listing.removeCategory(catid)
116 def markAllAsRead(self, key):
117 feed = listing.getFeed(key)
119 listing.updateUnread(key)
121 @QtCore.Slot(str, str)
122 def setEntryRead(self, key, articleid):
123 feed = listing.getFeed(key)
124 feed.setEntryRead(articleid)
125 listing.updateUnread(key)
127 @QtCore.Slot(str, result=str)
128 def getConfig(self, item):
129 if (item == "hideReadFeed"):
131 if (item == "hideReadArticles"):
135 @QtCore.Slot(str, str)
136 def populateFileDialog(self, path, type):
139 for file in glob.glob(path+type):
141 root.addFileNotification(file, os.path.basename(file))
143 @QtCore.Slot(str, result=int)
144 def importOpml(self, filename):
145 from opml_lib import parseOpml
146 file = open(filename, "r")
147 feeds = parseOpml(file.read())
149 for (title, url) in feeds:
150 listing.addFeed(title, url)
153 @QtCore.Slot(str, result=str)
154 def exportOpml(self, filename="/home/user/MyDocs/feedingit-export.opml"):
155 logger.debug("ExportOpmlData: %s" % filename)
156 from opml_lib import getOpmlText
158 str = getOpmlText(listing)
159 file = open(filename, "w")
164 logger.debug("Error exporting: %s" % filename)
167 @QtCore.Slot(str, result=bool)
168 def getBooleanSetting(self, setting):
169 if (setting == "theme"):
170 return config.getTheme()
171 elif (setting == "imageCache" ):
172 return config.getImageCache()
173 elif (setting == "hideReadFeeds"):
174 return config.getHideReadFeeds()
175 elif (setting == "hideReadArticles"):
176 return config.getHideReadArticles()
177 elif (setting == "autoupdate"):
178 return config.isAutoUpdateEnabled()
182 @QtCore.Slot(str, bool)
183 def setBooleanSetting(self, setting, value):
184 if (setting == "theme"):
185 config.setTheme(value)
186 elif (setting == "imageCache" ):
187 config.setImageCache(value)
188 elif (setting == "hideReadFeeds"):
189 config.setHideReadFeeds(value)
190 elif (setting == "hideReadArticles"):
191 config.setHideReadArticles(value)
192 elif (setting == "autoupdate"):
193 config.setAutoUpdateEnabled(value)
198 if not isdir(CONFIGDIR):
202 logger.error("Error: Can't create configuration directory")
206 from config import Config
208 config = Config(None,CONFIGDIR+"config.ini")
211 listing = Listing(config, CONFIGDIR)
216 from jobmanager import JobManager
219 app = QtGui.QApplication(sys.argv)
220 view = QtDeclarative.QDeclarativeView()
222 controller = Controller(listing)
224 # listen on dbus for download update progress
225 bus = dbus.SessionBus()
226 bus.add_signal_receiver(handler_function=controller.update_progress,
228 signal_name='UpdateProgress',
229 dbus_interface='org.marcoz.feedingit',
230 path='/org/marcoz/feedingit/update')
231 bus.add_signal_receiver(handler_function=controller.update_started,
233 signal_name='UpdateStarted',
234 dbus_interface='org.marcoz.feedingit',
235 path='/org/marcoz/feedingit/update')
236 bus.add_signal_receiver(handler_function=controller.update_finished,
238 signal_name='UpdateFinished',
239 dbus_interface='org.marcoz.feedingit',
240 path='/org/marcoz/feedingit/update')
243 rc = view.rootContext()
245 rc.setContextProperty('controller', controller)
247 # Comment the two lines below if you don't want to use OpenGL for QML rendering or if it is not supported
248 #glw = QtOpenGL.QGLWidget()
249 #view.setViewport(glw)
251 if os.path.exists('/usr/share/feedingit/qml'):
252 glw = QtOpenGL.QGLWidget()
253 view.setViewport(glw)
254 view.setSource('/usr/share/feedingit/qml/main.qml')
255 view.showFullScreen()
257 view.setSource(os.path.join('qml','main.qml'))
259 #view.setSource(os.path.join('qml','FeedingIt.qml'))
260 root = view.rootObject()
262 #view.showFullScreen()
264 sys.exit(app.exec_())
266 if __name__ == "__main__":