vim line
[drlaunch] / src / config.py
1 #!/usr/bin/env python
2 # coding=UTF-8
3
4 # Copyright (C) 2010 Stefanos Harhalakis
5 #
6 # This file is part of wifieye.
7 #
8 # wifieye is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # wifieye is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with wifieye.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 # $Id: 0.py 2265 2010-02-21 19:16:26Z v13 $
22
23 __version__ = "$Id: 0.py 2265 2010-02-21 19:16:26Z v13 $"
24
25 import os
26 import pickle
27
28 version = "1.0"
29
30 try:
31     from glib import get_user_config_dir
32 except:
33     def get_user_config_dir():
34         home=os.environ['HOME']
35         if home=='':
36             home="/home/user"
37         cfg="%s/.config" % (home)
38
39         return(cfg)
40
41 def ensure_dir():
42     dir0=get_user_config_dir()
43     dir=dir0+'/drlaunch'
44     if not os.path.exists(dir):
45         os.mkdir(dir)
46     if not os.path.isdir(dir):
47         raise Exception('Failed to ensure directory' + dir)
48
49     return(dir)
50
51 def get_config_fn():
52     dir=ensure_dir()
53     ret=dir + '/config'
54
55     return(ret)
56
57 class Config(object):
58     def __init__(self, id):
59         self.id=id
60
61         self.size = (2,2)
62         self.themebgsize = 96
63         self.iconsize0 = 64
64 ###     self.iconspace = 42     # For 4 icons (height)
65 ##      self.iconspace = 36     # For 8 icons (width)
66
67 #       self.iconsize = 64
68 #       self.iconpadding = 12
69 #       self.iconmargin = 6
70
71         self.apps=None
72         self.indiv=True
73         self.longpress=False
74         self.animate=True
75         self.nobg=False
76         self.themebg=False
77
78         self.setDefaultSizes()
79
80         #self.maxsz=(8,4)
81
82     def setSize(self, sz):
83         maxsz=self.getMaxSize()
84         sz2=(min(sz[0], maxsz[0]), min(sz[1], maxsz[1]))
85         self.size=sz2
86
87     def getSize(self):
88         return(self.size)
89
90     def setDefaultSizes(self):
91         self.iconsize=64
92         self.iconpadding=12
93         self.iconmargin=6
94
95     # Return the maximum grid size
96     def getMaxSize(self):
97         isf=self.getIconSizeFull()
98         retx=int(800/isf)
99         rety=int((480-60)/isf)
100         maxsz=(retx, rety)
101         return(maxsz)
102
103     # Return the maxmimum icon size
104     def getIconSizeRange(self):
105         return((48,128))
106
107     def getIconPaddingRange(self):
108         return((0,32))
109
110     def getIconMarginRange(self):
111         return((0,16))
112
113     def getIconSize(self):
114         return(self.iconsize)
115
116     def setIconSize(self, sz):
117         self.iconsize=sz
118
119     def getIconSpace(self):
120         return((2*self.iconpadding) + (2*self.iconmargin))
121
122     def getIconSizeFull(self):
123         ret=self.iconsize + (2*self.iconpadding) + (2*self.iconmargin)
124         return(ret)
125
126     def getIconMargin(self):
127         return(self.iconmargin)
128
129     def setIconMargin(self, sz):
130         self.iconmargin=sz
131
132     def getIconPadding(self):
133         return(self.iconpadding)
134
135     def setIconPadding(self, sz):
136         self.iconpadding=sz
137
138     def setIndiv(self, indiv):
139         self.indiv=indiv
140
141     def getIndiv(self):
142         return(self.indiv)
143
144     def setLongpress(self, lp):
145         self.longpress=lp
146
147     def getLongpress(self):
148         return(self.longpress)
149
150     def setAnimate(self, ar):
151         self.animate=ar
152
153     def getAnimate(self):
154         return(self.animate)
155
156     def setNoBg(self, nobg):
157         self.nobg=nobg
158
159     def getNoBg(self):
160         return(self.nobg)
161
162     def setThemeBg(self, themebg):
163         self.themebg=themebg
164
165     def getThemeBg(self):
166         return(self.themebg)
167
168     def setApps(self, aps):
169         """ apps is a dictionary of (x,y)=>appname """
170         self.apps=aps
171
172     def getApps(self):
173         if self.apps==None:
174             tmp={
175                 (0,0):  'rtcom-call-ui',
176                 (0,1):  'rtcom-messaging-ui',
177                 (1,0):  'browser',
178                 (1,1):  'osso-addressbook',
179                 }
180             self.setApps(tmp)
181
182         return(self.apps)
183
184     def filterDefault(self, value, default):
185         if value==default:
186             return(-1)
187         else:
188             return(value)
189
190     def provideDefault(self, value, default):
191         if value==-1:
192             return(default)
193         else:
194             return(value)
195
196     def save(self):
197         self.check_init()
198
199         dt=self.load_all()
200
201         if dt==None:
202             dt={
203                 'version':  7,
204                 'data': {},
205                 }
206
207         dt['data'][self.id]={
208             'size':         self.getSize(),
209             'apps':         self.getApps(),
210             'indiv':        self.getIndiv(),
211             'longpress':    self.getLongpress(),
212             'animate':      self.getAnimate(),
213             'nobg':         self.getNoBg(),
214             'themebg':      self.getThemeBg(),
215             'iconsize':     self.filterDefault(self.getIconSize(), 64),
216             'iconpadding':  self.filterDefault(self.getIconPadding(), 12),
217             'iconmargin':   self.filterDefault(self.getIconMargin(), 6),
218             }
219
220         fn=get_config_fn()
221
222         st=pickle.dumps(dt)
223         f=file(fn, 'w')
224         f.write(st)
225         f.close()
226
227     def parse_v1(self, dt0):
228         """ Convert a v1 config to v2 """
229         ret={
230             'version':      2,
231             'data':         {},
232             }
233
234         ret['data'][self.id]={
235             'size':         dt0['size'],
236             'apps':         dt0['apps'],
237             }
238
239         return(ret)
240
241     def parse_v2(self, dt):
242         # Perhaps copy dt?
243
244         dt['version']=3
245
246         for i in dt['data']:
247             dt['data'][i]['indiv']=False
248             dt['data'][i]['size']=(dt['data'][i]['size'], dt['data'][i]['size'])
249             dt['data'][i]['longpress']=True
250
251         return(dt)
252
253     def parse_v3(self, dt):
254         dt['version']=4
255
256         for i in dt['data']:
257             dt['data'][i]['animate']=True
258
259         return(dt)
260
261     def parse_v4(self, dt):
262         dt['version']=5
263
264         for i in dt['data']:
265             dt['data'][i]['nobg']=False
266
267         return(dt)
268
269     def parse_v5(self, dt):
270         dt['version']=6
271
272         for i in dt['data']:
273             dt['data'][i]['themebg']=False
274
275         return(dt)
276
277     def parse_v6(self, dt):
278         dt['version']=7
279
280         for i in dt['data']:
281             dt['data'][i]['iconsize']=-1
282             dt['data'][i]['iconpadding']=-1
283             dt['data'][i]['iconmargin']=-1
284
285         return(dt)
286
287     def load_all(self):
288         fn=get_config_fn()
289
290         try:
291             f=file(fn, 'r')
292             st=f.read()
293             f.close()
294             ret=pickle.loads(st)
295
296             if ret==None:
297                 print "failed to load config"
298                 ret=None
299             else:
300                 if ret['version']==1:
301                     ret=self.parse_v1(ret)
302
303                 if ret['version']==2:
304                     ret=self.parse_v2(ret)
305
306                 if ret['version']==3:
307                     ret=self.parse_v3(ret)
308
309                 if ret['version']==4:
310                     ret=self.parse_v4(ret)
311
312                 if ret['version']==5:
313                     ret=self.parse_v5(ret)
314
315                 if ret['version']==6:
316                     ret=self.parse_v6(ret)
317         except Exception, e:
318             print "config error:", e
319             ret=None
320
321         return(ret)
322
323     def load(self):
324         self.check_init()
325
326         fn=get_config_fn()
327
328         dt0=self.load_all()
329
330         if dt0==None or not dt0['data'].has_key(self.id):
331             return
332
333         dt=dt0['data'][self.id]
334
335         self.setSize(dt['size'])
336         self.setApps(dt['apps'])
337         self.setIndiv(dt['indiv'])
338         self.setLongpress(dt['longpress'])
339         self.setAnimate(dt['animate'])
340         self.setNoBg(dt['nobg'])
341         self.setThemeBg(dt['themebg'])
342         self.setIconSize(self.provideDefault(dt['iconsize'], 64))
343         self.setIconPadding(self.provideDefault(dt['iconpadding'], 12))
344         self.setIconMargin(self.provideDefault(dt['iconmargin'], 6))
345
346     def check_init(self):
347         if self.id==None:
348             import sys
349
350             print "config.init() not done"
351             sys.exit(1)
352
353 def dump(obj):
354     attrs=[attr for attr in dir(obj) if not callable(getattr(obj,attr))]
355
356     print "obj:", obj
357     for attr in attrs:
358         if attr=='__gdoc__' or attr=='__doc__':
359             continue
360         print "  ", attr, ":", getattr(obj, attr)
361
362 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent:
363