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
15 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
16 from PySide import QtOpenGL, QtCore
18 from rss_sqlite import Listing
19 CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit/"
20 #CONFIGDIR = "/home/user/.feedingit"
23 logger = logging.getLogger(__name__)
26 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
28 from cgi import escape
31 class Controller(QtCore.QObject):
33 def __init__(self, listing):
34 QtCore.QObject.__init__(self)
35 from XmlHandler import XmlHandler
36 self._handler = XmlHandler(listing)
38 def update_progress(self, percent_complete,
39 completed, in_progress, queued,
40 bytes_downloaded, bytes_updated, bytes_per_second,
44 def update_started(self):
47 def update_finished(self):
50 @QtCore.Slot(str,str, result=str)
51 def getArticle(self, key, article):
52 feed = listing.getFeed(key)
54 file = codecs.open(feed.getContentLink(article), "r", "utf-8")
55 html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
58 html = u"<html><body>Error retrieving article</body></html>"
61 @QtCore.Slot(str, result=str)
62 def getFeedsXml(self, catid):
63 return self._handler.generateFeedsXml(catid)
65 @QtCore.Slot(str,result=str)
66 def getArticlesXml(self, key):
67 #onlyUnread = arguments.get("onlyUnread","False")
68 return self._handler.generateArticlesXml(key, config.getHideReadArticles())
70 @QtCore.Slot(result=str)
71 def getCategoryXml(self):
72 return self._handler.generateCategoryXml()
74 @QtCore.Slot(QtCore.QObject)
75 def feedClicked(self, wrapper):
76 #print 'User clicked on:', wrapper._key
77 #articlesModel.updateModel(wrapper._key)
81 def updateFeed(self, key):
82 listing.updateFeed(key)
86 for catid in listing.getListOfCategories():
87 for feed in listing.getSortedListOfKeys("Manual", category=catid):
88 listing.updateFeed(feed)
91 def updateCategory(self, catid):
92 for feed in listing.getSortedListOfKeys("Manual", category=catid):
93 listing.updateFeed(feed)
95 @QtCore.Slot(str,str,str)
96 def addFeed(self, title, url, catid):
97 listing.addFeed(title,url, category=catid)
100 def addCategory(self, name):
101 listing.addCategory(name)
104 def removeFeed(self, key):
105 listing.removeFeed(key)
108 def removeCategory(self, catid):
109 listing.removeCategory(catid)
112 def markAllAsRead(self, key):
113 feed = listing.getFeed(key)
116 @QtCore.Slot(str, str)
117 def setEntryRead(self, key, articleid):
118 feed = listing.getFeed(key)
119 feed.setEntryRead(articleid)
120 listing.updateUnread(key)
122 @QtCore.Slot(str, result=str)
123 def getConfig(self, item):
124 if (item == "hideReadFeed"):
126 if (item == "hideReadArticles"):
130 @QtCore.Slot(str, str)
131 def populateFileDialog(self, path, type):
134 for file in glob.glob(path+type):
136 root.addFileNotification(file, os.path.basename(file))
138 @QtCore.Slot(str, result=int)
139 def importOpml(self, filename):
140 from opml_lib import parseOpml
141 file = open(filename, "r")
142 feeds = parseOpml(file.read())
144 for (title, url) in feeds:
145 listing.addFeed(title, url)
148 @QtCore.Slot(str, result=str)
149 def exportOpml(self, filename="/home/user/MyDocs/feedingit-export.opml"):
150 logger.debug("ExportOpmlData: %s" % filename)
151 from opml_lib import getOpmlText
153 str = getOpmlText(listing)
154 file = open(filename, "w")
159 logger.debug("Error exporting: %s" % filename)
162 @QtCore.Slot(str, result=bool)
163 def getBooleanSetting(self, setting):
164 if (setting == "theme"):
165 return config.getTheme()
166 elif (setting == "imageCache" ):
167 return config.getImageCache()
168 elif (setting == "hideReadFeeds"):
169 return config.getHideReadFeeds()
170 elif (setting == "hideReadArticles"):
171 return config.getHideReadArticles()
172 elif (setting == "autoupdate"):
173 return config.isAutoUpdateEnabled()
177 @QtCore.Slot(str, bool)
178 def setBooleanSetting(self, setting, value):
179 if (setting == "theme"):
180 config.setTheme(value)
181 elif (setting == "imageCache" ):
182 config.setImageCache(value)
183 elif (setting == "hideReadFeeds"):
184 config.setHideReadFeeds(value)
185 elif (setting == "hideReadArticles"):
186 config.setHideReadArticles(value)
187 elif (setting == "autoupdate"):
188 config.setAutoUpdateEnabled(value)
193 if not isdir(CONFIGDIR):
197 logger.error("Error: Can't create configuration directory")
201 from config import Config
203 config = Config(None,CONFIGDIR+"config.ini")
206 listing = Listing(config, CONFIGDIR)
211 from jobmanager import JobManager
214 app = QtGui.QApplication(sys.argv)
215 view = QtDeclarative.QDeclarativeView()
217 controller = Controller(listing)
219 # listen on dbus for download update progress
220 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
221 bus = dbus.SessionBus()
222 # bus.add_signal_receiver(handler_function=self.update_progress,
224 # signal_name='UpdateProgress',
225 # dbus_interface='org.marcoz.feedingit',
226 # path='/org/marcoz/feedingit/update')
227 # bus.add_signal_receiver(handler_function=controller.update_started,
229 # signal_name='UpdateStarted',
230 # dbus_interface='org.marcoz.feedingit',
231 # path='/org/marcoz/feedingit/update')
232 # bus.add_signal_receiver(handler_function=controller.update_finished,
234 # signal_name='UpdateFinished',
235 # dbus_interface='org.marcoz.feedingit',
236 # path='/org/marcoz/feedingit/update')
239 rc = view.rootContext()
241 rc.setContextProperty('controller', controller)
243 # Comment the two lines below if you don't want to use OpenGL for QML rendering or if it is not supported
244 #glw = QtOpenGL.QGLWidget()
245 #view.setViewport(glw)
247 if os.path.exists('/usr/share/feedingit/qml'):
248 glw = QtOpenGL.QGLWidget()
249 view.setViewport(glw)
250 view.setSource('/usr/share/feedingit/qml/main.qml')
251 view.showFullScreen()
253 view.setSource(os.path.join('qml','main.qml'))
255 #view.setSource(os.path.join('qml','FeedingIt.qml'))
256 root = view.rootObject()
258 #view.showFullScreen()
260 sys.exit(app.exec_())
262 if __name__ == "__main__":