ac61424ac1c742793458943f393b6f7ddc493b35
[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:
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     def getMaxSize(self):
96         isf=self.getIconSizeFull()
97         retx=int(800/isf)
98         rety=int((480-60)/isf)
99         maxsz=(retx, rety)
100         return(maxsz)
101
102     def getIconSize(self):
103         return(self.iconsize)
104
105     def setIconSize(self, sz):
106         self.iconsize=sz
107
108     def getIconSpace(self):
109         return((2*self.iconpadding) + (2*self.iconmargin))
110
111     def getIconSizeFull(self):
112         ret=self.iconsize + (2*self.iconpadding) + (2*self.iconmargin)
113         return(ret)
114
115     def getIconMargin(self):
116         return(self.iconmargin)
117
118     def setIconMargin(self, sz):
119         self.iconmargin=sz
120
121     def getIconPadding(self):
122         return(self.iconpadding)
123
124     def setIconPadding(self, sz):
125         self.iconpadding=sz
126
127     def setIndiv(self, indiv):
128         self.indiv=indiv
129
130     def getIndiv(self):
131         return(self.indiv)
132
133     def setLongpress(self, lp):
134         self.longpress=lp
135
136     def getLongpress(self):
137         return(self.longpress)
138
139     def setAnimate(self, ar):
140         self.animate=ar
141
142     def getAnimate(self):
143         return(self.animate)
144
145     def setNoBg(self, nobg):
146         self.nobg=nobg
147
148     def getNoBg(self):
149         return(self.nobg)
150
151     def setThemeBg(self, themebg):
152         self.themebg=themebg
153
154     def getThemeBg(self):
155         return(self.themebg)
156
157     def setApps(self, aps):
158         """ apps is a dictionary of (x,y)=>appname """
159         self.apps=aps
160
161     def getApps(self):
162         if self.apps==None:
163             tmp={
164                 (0,0):  'rtcom-call-ui',
165                 (0,1):  'rtcom-messaging-ui',
166                 (1,0):  'browser',
167                 (1,1):  'osso-addressbook',
168                 }
169             self.setApps(tmp)
170
171         return(self.apps)
172
173     def filterDefault(self, value, default):
174         if value==default:
175             return(-1)
176         else:
177             return(value)
178
179     def provideDefault(self, value, default):
180         if value==-1:
181             return(default)
182         else:
183             return(value)
184
185     def save(self):
186         self.check_init()
187
188         dt=self.load_all()
189
190         if dt==None:
191             dt={
192                 'version':  7,
193                 'data': {},
194                 }
195
196         dt['data'][self.id]={
197             'size':         self.getSize(),
198             'apps':         self.getApps(),
199             'indiv':        self.getIndiv(),
200             'longpress':    self.getLongpress(),
201             'animate':      self.getAnimate(),
202             'nobg':         self.getNoBg(),
203             'themebg':      self.getThemeBg(),
204             'iconsize':     self.filterDefault(self.getIconSize(), 64),
205             'iconpadding':  self.filterDefault(self.getIconPadding(), 12),
206             'iconmargin':   self.filterDefault(self.getIconMargin(), 6),
207             }
208
209         fn=get_config_fn()
210
211         st=pickle.dumps(dt)
212         f=file(fn, 'w')
213         f.write(st)
214         f.close()
215
216     def parse_v1(self, dt0):
217         """ Convert a v1 config to v2 """
218         ret={
219             'version':      2,
220             'data':         {},
221             }
222
223         ret['data'][self.id]={
224             'size':         dt0['size'],
225             'apps':         dt0['apps'],
226             }
227
228         return(ret)
229
230     def parse_v2(self, dt):
231         # Perhaps copy dt?
232
233         dt['version']=3
234
235         for i in dt['data']:
236             dt['data'][i]['indiv']=False
237             dt['data'][i]['size']=(dt['data'][i]['size'], dt['data'][i]['size'])
238             dt['data'][i]['longpress']=True
239
240         return(dt)
241
242     def parse_v3(self, dt):
243         dt['version']=4
244
245         for i in dt['data']:
246             dt['data'][i]['animate']=True
247
248         return(dt)
249
250     def parse_v4(self, dt):
251         dt['version']=5
252
253         for i in dt['data']:
254             dt['data'][i]['nobg']=False
255
256         return(dt)
257
258     def parse_v5(self, dt):
259         dt['version']=6
260
261         for i in dt['data']:
262             dt['data'][i]['themebg']=False
263
264         return(dt)
265
266     def parse_v6(self, dt):
267         dt['version']=7
268
269         for i in dt['data']:
270             dt['data'][i]['iconsize']=-1
271             dt['data'][i]['iconpadding']=-1
272             dt['data'][i]['iconmargin']=-1
273
274         return(dt)
275
276     def load_all(self):
277         fn=get_config_fn()
278
279         try:
280             f=file(fn, 'r')
281             st=f.read()
282             f.close()
283             ret=pickle.loads(st)
284
285             if ret==None:
286                 print "failed to load config"
287                 ret=None
288             else:
289                 if ret['version']==1:
290                     ret=self.parse_v1(ret)
291
292                 if ret['version']==2:
293                     ret=self.parse_v2(ret)
294
295                 if ret['version']==3:
296                     ret=self.parse_v3(ret)
297
298                 if ret['version']==4:
299                     ret=self.parse_v4(ret)
300
301                 if ret['version']==5:
302                     ret=self.parse_v5(ret)
303
304                 if ret['version']==6:
305                     ret=self.parse_v6(ret)
306         except Exception, e:
307             print "config error:", e
308             ret=None
309
310         return(ret)
311
312     def load(self):
313         self.check_init()
314
315         fn=get_config_fn()
316
317         dt0=self.load_all()
318
319         if dt0==None or not dt0['data'].has_key(self.id):
320             return
321
322         dt=dt0['data'][self.id]
323
324         self.setSize(dt['size'])
325         self.setApps(dt['apps'])
326         self.setIndiv(dt['indiv'])
327         self.setLongpress(dt['longpress'])
328         self.setAnimate(dt['animate'])
329         self.setNoBg(dt['nobg'])
330         self.setThemeBg(dt['themebg'])
331         self.setIconSize(self.provideDefault(dt['iconsize'], 64))
332         self.setIconPadding(self.provideDefault(dt['iconpadding'], 12))
333         self.setIconMargin(self.provideDefault(dt['iconmargin'], 6))
334
335     def check_init(self):
336         if self.id==None:
337             import sys
338
339             print "config.init() not done"
340             sys.exit(1)
341
342 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent:
343