Fix for config saving.
[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 = "0.8"
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.iconsize = 64
64 #       self.iconspace = 42     # For 4 icons (height)
65         self.iconspace = 36     # For 8 icons (width)
66         self.apps=None
67         self.indiv=True
68         self.longpress=False
69         self.animate=True
70         self.nobg=False
71         self.themebg=False
72
73         self.maxsz=(8,4)
74
75     def setSize(self, sz):
76         self.size=sz
77
78     def getSize(self):
79         return(self.size)
80
81     def getMaxSize(self):
82         return(self.maxsz)
83
84     def getIconSize(self):
85         return(self.iconsize)
86
87     def setIndiv(self, indiv):
88         self.indiv=indiv
89
90     def getIndiv(self):
91         return(self.indiv)
92
93     def setLongpress(self, lp):
94         self.longpress=lp
95
96     def getLongpress(self):
97         return(self.longpress)
98
99     def setAnimate(self, ar):
100         self.animate=ar
101
102     def getAnimate(self):
103         return(self.animate)
104
105     def setNoBg(self, nobg):
106         self.nobg=nobg
107
108     def getNoBg(self):
109         return(self.nobg)
110
111     def setThemeBg(self, themebg):
112         self.themebg=themebg
113
114     def getThemeBg(self):
115         return(self.themebg)
116
117     def setApps(self, aps):
118         """ apps is a dictionary of (x,y)=>appname """
119         self.apps=aps
120
121     def getApps(self):
122         if self.apps==None:
123             tmp={
124                 (0,0):  'rtcom-call-ui',
125                 (0,1):  'rtcom-messaging-ui',
126                 (1,0):  'browser',
127                 (1,1):  'osso-addressbook',
128                 }
129             self.setApps(tmp)
130
131         return(self.apps)
132
133     def save(self):
134         self.check_init()
135
136         dt=self.load_all()
137
138         if dt==None:
139             dt={
140                 'version':  6,
141                 'data': {},
142                 }
143
144         dt['data'][self.id]={
145             'size':         self.getSize(),
146             'apps':         self.getApps(),
147             'indiv':        self.getIndiv(),
148             'longpress':    self.getLongpress(),
149             'animate':      self.getAnimate(),
150             'nobg':         self.getNoBg(),
151             'themebg':      self.getThemeBg(),
152             }
153
154         fn=get_config_fn()
155
156         st=pickle.dumps(dt)
157         f=file(fn, 'w')
158         f.write(st)
159         f.close()
160
161     def parse_v1(self, dt0):
162         """ Convert a v1 config to v2 """
163         ret={
164             'version':      2,
165             'data':         {},
166             }
167
168         ret['data'][self.id]={
169             'size':         dt0['size'],
170             'apps':         dt0['apps'],
171             }
172
173         return(ret)
174
175     def parse_v2(self, dt):
176         # Perhaps copy dt?
177
178         dt['version']=3
179
180         for i in dt['data']:
181             dt['data'][i]['indiv']=False
182             dt['data'][i]['size']=(dt['data'][i]['size'], dt['data'][i]['size'])
183             dt['data'][i]['longpress']=True
184
185         return(dt)
186
187     def parse_v3(self, dt):
188         dt['version']=4
189
190         for i in dt['data']:
191             dt['data'][i]['animate']=True
192
193         return(dt)
194
195     def parse_v4(self, dt):
196         dt['version']=5
197
198         for i in dt['data']:
199             dt['data'][i]['nobg']=False
200
201         return(dt)
202
203     def parse_v5(self, dt):
204         dt['version']=6
205
206         for i in dt['data']:
207             dt['data'][i]['themebg']=False
208
209         return(dt)
210
211     def load_all(self):
212         fn=get_config_fn()
213
214         try:
215             f=file(fn, 'r')
216             st=f.read()
217             f.close()
218             ret=pickle.loads(st)
219
220             if ret==None:
221                 ret=None
222             else:
223                 if ret['version']==1:
224                     ret=parse_v1(ret)
225
226                 if ret['version']==2:
227                     ret=parse_v2(ret)
228
229                 if ret['version']==3:
230                     ret=parse_v3(ret)
231
232                 if ret['version']==4:
233                     ret=parse_v4(ret)
234
235                 if ret['version']==5:
236                     ret=parse_v5(ret)
237         except:
238             ret=None
239
240         return(ret)
241
242     def load(self):
243         self.check_init()
244
245         fn=get_config_fn()
246
247         dt0=self.load_all()
248
249         if dt0==None or not dt0['data'].has_key(self.id):
250             return
251
252         dt=dt0['data'][self.id]
253
254         self.setSize(dt['size'])
255         self.setApps(dt['apps'])
256         self.setIndiv(dt['indiv'])
257         self.setLongpress(dt['longpress'])
258         self.setAnimate(dt['animate'])
259         self.setNoBg(dt['nobg'])
260         self.setThemeBg(dt['themebg'])
261
262     def check_init(self):
263         if self.id==None:
264             import sys
265
266             print "config.init() not done"
267             sys.exit(1)
268
269 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent:
270