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