Cleaned up "Add feed" and "Edit feed" wizard
[feedingit] / src / config.py
1 #!/usr/bin/env python2.5
2
3
4 # Copyright (c) 2007-2008 INdT.
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Lesser General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 #  This program is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #  GNU Lesser General Public License for more details.
14 #
15 #  You should have received a copy of the GNU Lesser General Public License
16 #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #
18
19 # ============================================================================
20 # Name        : FeedingIt.py
21 # Author      : Yves Marcoz
22 # Version     : 0.6.1
23 # Description : Simple RSS Reader
24 # ============================================================================
25
26 import gtk
27 import hildon
28 from ConfigParser import RawConfigParser
29 from gobject import idle_add
30 from gconf import client_get_default
31 from urllib2 import ProxyHandler
32
33 VERSION = "48"
34
35 section = "FeedingIt"
36 ranges = { "updateInterval":[0.5, 1, 2, 4, 12, 24], "expiry":[24, 48, 72], "fontSize":range(12,24), "orientation":["Automatic", "Landscape", "Portrait"], "artFontSize":[10, 12, 14, 16, 18, 20]}
37 titles = {"updateInterval":"Auto-update interval", "expiry":"Delete articles", "fontSize":"List font size", "orientation":"Display orientation", "artFontSize":"Article font size"}
38 subtitles = {"updateInterval":"Every %s hours", "expiry":"After %s hours", "fontSize":"%s pixels", "orientation":"%s", "artFontSize":"%s pixels"}
39
40 class Config():
41     def __init__(self, parent, configFilename):
42         self.configFilename = configFilename
43         self.parent = parent
44         # Load config
45         self.loadConfig()
46
47         # Backup current settings for later restore
48         self.config_backup = dict(self.config)
49         self.do_restore_backup = True
50
51     def on_save_button_clicked(self, button):
52         self.do_restore_backup = False
53         self.window.destroy()
54
55     def createDialog(self):
56         
57         self.window = gtk.Dialog("Settings", self.parent)
58         self.window.set_geometry_hints(min_height=600)
59
60         save_button = self.window.add_button(gtk.STOCK_SAVE, gtk.RESPONSE_OK)
61         save_button.connect('clicked', self.on_save_button_clicked)
62         #self.window.set_default_size(-1, 600)
63         panArea = hildon.PannableArea()
64         
65         vbox = gtk.VBox(False, 2)
66         self.buttons = {}
67
68         def heading(text):
69             l = gtk.Label()
70             l.set_size_request(-1, 6)
71             vbox.pack_start(l, expand=False)
72             vbox.pack_start(gtk.Frame(text), expand=False)
73
74         def add_setting(setting):
75             picker = hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
76             selector = self.create_selector(ranges[setting], setting)
77             picker.set_selector(selector)
78             picker.set_title(titles[setting])
79             picker.set_text(titles[setting], subtitles[setting] % self.config[setting])
80             picker.set_name('HildonButton-finger')
81             picker.set_alignment(0,0,1,1)
82             self.buttons[setting] = picker
83             vbox.pack_start(picker, expand=False)
84
85         button = hildon.Button(gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL)
86         button.set_label("View Known Issues and Tips")
87         button.connect("clicked", self.button_tips_clicked)
88         button.set_alignment(0,0,1,1)
89         vbox.pack_start(button, expand=False)  
90
91         heading('Display')
92         add_setting('fontSize')
93         add_setting('artFontSize')
94         add_setting('orientation')
95         button = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
96         button.set_label("Hide read feeds")
97         button.set_active(self.config["hidereadfeeds"])
98         button.connect("toggled", self.button_toggled, "hidereadfeeds")
99         vbox.pack_start(button, expand=False)
100
101         button = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
102         button.set_label("Hide read articles")
103         button.set_active(self.config["hidereadarticles"])
104         button.connect("toggled", self.button_toggled, "hidereadarticles")
105         vbox.pack_start(button, expand=False)
106
107
108         heading('Updating')
109         button = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
110         button.set_label("Automatically update feeds")
111         button.set_active(self.config["autoupdate"])
112         button.connect("toggled", self.button_toggled, "autoupdate")
113         vbox.pack_start(button, expand=False)
114         add_setting('updateInterval')
115         add_setting('expiry')
116
117         heading('Network')
118         button = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
119         button.set_label('Cache images')
120         button.set_active(self.config["imageCache"])
121         button.connect("toggled", self.button_toggled, "imageCache")
122         vbox.pack_start(button, expand=False)
123
124         button = hildon.CheckButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
125         button.set_label("Use HTTP proxy")
126         button.set_active(self.config["proxy"])
127         button.connect("toggled", self.button_toggled, "proxy")
128         vbox.pack_start(button, expand=False)
129         
130         panArea.add_with_viewport(vbox)
131         
132         self.window.vbox.add(panArea)
133         self.window.connect("destroy", self.onExit)
134         #self.window.add(self.vbox)
135         self.window.set_default_size(-1, 600)
136         self.window.show_all()
137         return self.window
138
139     def button_tips_clicked(self, *widget):
140         import dbus
141         bus = dbus.SessionBus()
142         proxy = bus.get_object("com.nokia.osso_browser", "/com/nokia/osso_browser/request")
143         iface = dbus.Interface(proxy, 'com.nokia.osso_browser')
144         iface.open_new_window("http://feedingit.marcoz.org/news/?page_id=%s" % VERSION)
145
146     def onExit(self, *widget):
147         # When the dialog is closed without hitting
148         # the "Save" button, restore the configuration
149         if self.do_restore_backup:
150             print 'Restoring configuration'
151             self.config = self.config_backup
152
153         self.saveConfig()
154         self.window.destroy()
155
156     def button_toggled(self, widget, configName):
157         #print "widget", widget.get_active()
158         if (widget.get_active()):
159             self.config[configName] = True
160         else:
161             self.config[configName] = False
162         #print "autoup",  self.autoupdate
163         self.saveConfig()
164         
165     def selection_changed(self, selector, button, setting):
166         current_selection = selector.get_current_text()
167         if current_selection:
168             self.config[setting] = current_selection
169         idle_add(self.updateButton, setting)
170         self.saveConfig()
171         
172     def updateButton(self, setting):
173         self.buttons[setting].set_text(titles[setting], subtitles[setting] % self.config[setting])
174         
175     def loadConfig(self):
176         self.config = {}
177         try:
178             configParser = RawConfigParser()
179             configParser.read(self.configFilename)
180             self.config["fontSize"] = configParser.getint(section, "fontSize")
181             self.config["artFontSize"] = configParser.getint(section, "artFontSize")
182             self.config["expiry"] = configParser.getint(section, "expiry")
183             self.config["autoupdate"] = configParser.getboolean(section, "autoupdate")
184             self.config["updateInterval"] = configParser.getfloat(section, "updateInterval")
185             self.config["orientation"] = configParser.get(section, "orientation")
186             self.config["imageCache"] = configParser.getboolean(section, "imageCache")
187         except:
188             self.config["fontSize"] = 17
189             self.config["artFontSize"] = 14
190             self.config["expiry"] = 24
191             self.config["autoupdate"] = False
192             self.config["updateInterval"] = 4
193             self.config["orientation"] = "Automatic"
194             self.config["imageCache"] = False
195         try:
196             self.config["proxy"] = configParser.getboolean(section, "proxy")
197         except:
198             self.config["proxy"] = True
199         try:
200             self.config["hidereadfeeds"] = configParser.getboolean(section, "hidereadfeeds")
201             self.config["hidereadarticles"] = configParser.getboolean(section, "hidereadarticles")
202         except:
203             self.config["hidereadfeeds"] = False
204             self.config["hidereadarticles"] = False
205         
206     def saveConfig(self):
207         configParser = RawConfigParser()
208         configParser.add_section(section)
209         configParser.set(section, 'fontSize', str(self.config["fontSize"]))
210         configParser.set(section, 'artFontSize', str(self.config["artFontSize"]))
211         configParser.set(section, 'expiry', str(self.config["expiry"]))
212         configParser.set(section, 'autoupdate', str(self.config["autoupdate"]))
213         configParser.set(section, 'updateInterval', str(self.config["updateInterval"]))
214         configParser.set(section, 'orientation', str(self.config["orientation"]))
215         configParser.set(section, 'imageCache', str(self.config["imageCache"]))
216         configParser.set(section, 'proxy', str(self.config["proxy"]))
217         configParser.set(section, 'hidereadfeeds', str(self.config["hidereadfeeds"]))
218         configParser.set(section, 'hidereadarticles', str(self.config["hidereadarticles"]))
219
220         # Writing our configuration file
221         file = open(self.configFilename, 'wb')
222         configParser.write(file)
223         file.close()
224
225     def create_selector(self, choices, setting):
226         #self.pickerDialog = hildon.PickerDialog(self.parent)
227         selector = hildon.TouchSelector(text=True)
228         index = 0
229         for item in choices:
230             iter = selector.append_text(str(item))
231             if str(self.config[setting]) == str(item): 
232                 selector.set_active(0, index)
233             index += 1
234         selector.connect("changed", self.selection_changed, setting)
235         #self.pickerDialog.set_selector(selector)
236         return selector
237         #self.pickerDialog.show_all()
238
239     def getFontSize(self):
240         return self.config["fontSize"]
241     def getArtFontSize(self):
242         return self.config["artFontSize"]
243     def getExpiry(self):
244         return self.config["expiry"]
245     def isAutoUpdateEnabled(self):
246         return self.config["autoupdate"]
247     def getUpdateInterval(self):
248         return float(self.config["updateInterval"])
249     def getReadFont(self):
250         return "sans italic %s" % self.config["fontSize"]
251     def getUnreadFont(self):
252         return "sans %s" % self.config["fontSize"]
253     def getOrientation(self):
254         return ranges["orientation"].index(self.config["orientation"])
255     def getImageCache(self):
256         return self.config["imageCache"]
257     def getProxy(self):
258         if self.config["proxy"] == False:
259             return (False, None)
260         if client_get_default().get_bool('/system/http_proxy/use_http_proxy'):
261             port = client_get_default().get_int('/system/http_proxy/port')
262             http = client_get_default().get_string('/system/http_proxy/host')
263             proxy = ProxyHandler( {"http":"http://%s:%s/"% (http,port)} )
264             return (True, proxy)
265         return (False, None)
266     def getHideReadFeeds(self):
267         return self.config["hidereadfeeds"]
268     def getHideReadArticles(self):
269         return self.config["hidereadarticles"]