REFACTORING : implement setter methods for coordinates and zoom to make easier the...
[wifihood] / wifiscanner / wifimap / config.py
1
2 import gconf
3
4 import gtk
5 try :
6     import hildon
7 except :
8     hildon = False
9
10 class Configuration :
11
12     def __init__ ( self , type ) :
13         self._type = type
14         self._client = gconf.client_get_default()
15         self.homedir = self._client.get_string( "/apps/wifihood/basedir" ) or "/home/user/MyDocs"
16         self.homedir = "/tmp"
17         self.dbname = self._client.get_string( "/apps/wifihood/dbname" ) or "wifiscanner.db"
18         self.mapsdir = self._client.get_string( "/apps/wifihood/maps" ) or "/home/user/MyDocs/.maps"
19         self.mapclass = self._client.get_string( "/apps/wifihood/maptype" ) or "OpenStreetMap I"
20         self.lat = self._client.get_float( "/apps/wifihood/latitude" ) or self._client.get_float( "/apps/maemo/maemo-mapper/center_latitude" ) or 40.416
21         self.lon = self._client.get_float( "/apps/wifihood/longitude" ) or self._client.get_float( "/apps/maemo/maemo-mapper/center_longitude" ) or -3.683
22         if self._type == 'map' :
23             self.zoom = self._client.get_int( "/apps/wifihood/map-zoom" ) or self._client.get_float( "/apps/maemo/maemo-mapper/zoom" ) or 15
24         else :
25             self.zoom = self._client.get_int( "/apps/wifihood/%s-zoom" % self._type ) or 16
26
27     def set_latlon ( self , ( lat , lon ) ) :
28         self._client.set_float( "/apps/wifihood/latitude" , lat )
29         self._client.set_float( "/apps/wifihood/longitude" , lon )
30         self.lat , self.lon = lat , lon
31
32     def set_zoom ( self , zoom ) :
33         self._client.set_int( "/apps/wifihood/%s-zoom" % self._type , zoom )
34         self.zoom = zoom
35
36     def save ( self ) :
37         self._client.set_string( "/apps/wifihood/basedir" , self.homedir )
38         self._client.set_string( "/apps/wifihood/dbname" , self.dbname )
39         self._client.set_string( "/apps/wifihood/maps" , self.mapsdir )
40         self._client.set_string( "/apps/wifihood/maptype" , self.mapclass )
41
42
43 class AbstractSettingsWindow :
44
45     def __init__ ( self , config , handler ) :
46         self.set_title( "Wifihood Settings" )
47
48         scrollwin = self.MainArea()
49         scrollwin.show()
50         self.add(scrollwin)
51
52         vbox = gtk.VBox(False, 0)
53         vbox.show()
54         scrollwin.add_with_viewport( vbox )
55
56
57         dbframe = gtk.Frame( label="Database" )
58         dbframe.set_label_align(0 , 0.1)
59         dbframe.show()
60         vbox.pack_start(dbframe, True, True, 0)
61
62         database = gtk.Table(2, 2, False)
63         database.show()
64         dbframe.add(database)
65
66         dblabel = gtk.Label( "Home directory" )
67         dblabel.show()
68         database.attach(dblabel, 0, 1, 0, 1, gtk.EXPAND|gtk.FILL, 0, 0, 5)
69
70         dbvalue = self.Entry()
71         dbvalue.set_text( config.homedir )
72         dbvalue.show()
73         database.attach(dbvalue, 1, 2, 0, 1, gtk.EXPAND|gtk.FILL, 0, 0, 5)
74
75         dblabel = gtk.Label( "Database name" )
76         dblabel.show()
77         database.attach(dblabel, 0, 1, 1, 2, gtk.EXPAND|gtk.FILL, 0, 0, 5)
78
79         dbvalue = self.Entry()
80         dbvalue.set_text( config.dbname )
81         dbvalue.show()
82         database.attach(dbvalue, 1, 2, 1, 2, gtk.EXPAND|gtk.FILL, 0, 0, 5)
83
84
85         mapsframe = gtk.Frame( label="Maps" )
86         mapsframe.set_label_align(0 , 0.1)
87         mapsframe.show()
88         vbox.pack_start(mapsframe, True, True, 0)
89
90         maps = gtk.Table(2, 2, False)
91         maps.show()
92         mapsframe.add(maps)
93
94         button = self.CheckButton()
95         button.set_label( "Use OpenStreet maps" )
96         button.set_active( 1 )
97         button.show()
98         maps.attach(button, 0, 1, 0, 1, gtk.EXPAND|gtk.FILL, 0, 0, 5)
99
100         zoomlevel = self.ZoomButton( "Zoom level" , config , handler )
101         zoomlevel.show()
102         maps.attach(zoomlevel, 1, 2, 0, 1, gtk.EXPAND|gtk.FILL, 0, 0, 5)
103
104
105         gpsframe = gtk.Frame( label="Coordinates" )
106         gpsframe.set_label_align(0 , 0.1)
107         gpsframe.show()
108         vbox.pack_start(gpsframe, True, True, 0)
109
110         gps = gtk.Table(2, 2, False)
111         gps.show()
112         gpsframe.add(gps)
113
114         button = self.CheckButton()
115         button.set_label( "Take initial coordinates from maemo-mapper" )
116         button.show()
117         gps.attach(button, 0, 2, 0, 1, gtk.EXPAND|gtk.FILL) #, 0, 0, 5)
118
119         button = self.CheckButton()
120         button.set_label( "Store changes in coordinates" )
121         button.show()
122         gps.attach(button, 0, 2, 1, 2, gtk.EXPAND|gtk.FILL) #, 0, 0, 5)
123
124
125         dataframe = gtk.Frame( label="Data gathering" )
126         dataframe.set_label_align(0 , 0.1)
127         dataframe.show()
128         vbox.pack_start(dataframe, True, True, 0)
129
130         button = self.CheckButton()
131         button.set_label( "Write full logfile" )
132         button.show()
133         dataframe.add(button)
134
135         self.show()
136
137 if hildon :
138
139   class ZoomDialog ( hildon.TouchSelector ) :
140
141     def __init__ ( self , config , handler ) :
142         hildon.TouchSelector.__init__( self )
143         self.handler = handler
144
145         zooms = gtk.ListStore(str)
146
147         active = index = 0
148         for zoom in range(8,19) :
149             iter = zooms.append()
150             zooms.set( iter , 0 , "%2d" % zoom )
151             if zoom == config.zoom :
152                 active = index
153             index += 1
154
155         column = self.append_text_column( zooms , True )
156
157         # NOTE : with text=True, we must use 1 instead of 0
158         self.set_active( 0 , active )
159
160     def zoomdialog ( self , widget , conf ) :
161         newzoom = int( widget.get_selector().get_current_text() )
162         if self.handler : self.handler( newzoom )
163         conf.set_zoom( newzoom )
164
165   class SettingsWindow ( hildon.StackableWindow , AbstractSettingsWindow ) :
166
167     def __init__ ( self , config , handler=None ) :
168         hildon.StackableWindow.__init__( self )
169         AbstractSettingsWindow.__init__( self , config , handler )
170
171     def ZoomButton ( self , text , config , handler ) :
172         selector = ZoomDialog( config , handler )
173         button = hildon.PickerButton( gtk.HILDON_SIZE_AUTO, hildon.BUTTON_ARRANGEMENT_VERTICAL)
174         button.set_title( text )
175         button.set_selector( selector )
176         button.connect_object( "value-changed", selector.zoomdialog , button , config )
177         return button
178
179     def MainArea ( self ) :
180         return hildon.PannableArea()
181
182     def Entry ( self ) :
183         return hildon.Entry( gtk.HILDON_SIZE_FINGER_HEIGHT )
184
185     def Button ( self , text , value ) :
186         return hildon.Button( gtk.HILDON_SIZE_THUMB_HEIGHT , hildon.BUTTON_ARRANGEMENT_HORIZONTAL , text , "%s" % value )
187
188     def CheckButton ( self ) :
189         return hildon.CheckButton( gtk.HILDON_SIZE_FINGER_HEIGHT )
190
191 else :
192
193   class ZoomDialog ( gtk.Dialog ) :
194
195     def __init__ ( self , config , handler , labelsetter=None ) :
196         gtk.Dialog.__init__( self , "Select zoom level",
197                              None,
198                              gtk.DIALOG_MODAL,
199                              ( gtk.STOCK_OK, gtk.RESPONSE_ACCEPT,
200                                gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT
201                                )
202                              )
203
204         zooms = gtk.ListStore(int)
205         combo = gtk.ComboBox( zooms )
206
207         for zoom in range(8,19) :
208             iter = zooms.append()
209             zooms.set( iter , 0 , zoom )
210             if zoom == config.zoom :
211                 combo.set_active_iter( iter )
212
213         cell = gtk.CellRendererText()
214         combo.pack_start(cell, True)
215         combo.add_attribute(cell, 'text', 0)
216
217         self.vbox.pack_start(combo , True, True, 0)
218
219         self.connect_object( "response", self.response , combo , config , handler , labelsetter )
220
221     def response ( self , combo , response  , config , handler , labelsetter ) :
222         if response == gtk.RESPONSE_ACCEPT :
223             item = combo.get_active_iter()
224             model = combo.get_model()
225             newzoom = model.get(item,0)[0]
226             if labelsetter : labelsetter( newzoom )
227             if handler : handler( newzoom )
228             config.set_zoom( newzoom )
229         self.destroy()
230
231   class SettingsWindow ( gtk.Window , AbstractSettingsWindow ) :
232
233     def __init__ ( self , config , handler=None ) :
234         gtk.Window.__init__( self )
235         AbstractSettingsWindow.__init__( self , config , handler )
236
237     def MainArea ( self ) :
238         scrollwin = gtk.ScrolledWindow()
239         scrollwin.set_size_request(-1, 260)
240         scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
241         return scrollwin
242
243     def Entry ( self ) :
244         return gtk.Entry()
245
246     def Button ( self , label=None ) :
247         return gtk.Button( label )
248
249     def zoomdialog ( self , widget , config , handler ) :
250         dialog = ZoomDialog( config , handler , widget.set_value )
251         dialog.show_all()
252
253     def ZoomButton ( self , text , config , handler ) :
254         class _button ( gtk.Button ) :
255             def __init__ ( self , text , value ) :
256                 gtk.Button.__init__( self )
257                 self._text = text
258                 self.set_value( value )
259             def set_value ( self , value ) :
260                 self._value = value
261                 self.set_label( "%s -- %s" % ( self._text , self._value ) )
262         button = _button( text , config.zoom )
263         button.connect_object( "clicked", self.zoomdialog , button , config , handler )
264         return button
265
266     def CheckButton ( self ) :
267         return gtk.CheckButton()
268
269 if __name__ == "__main__" :
270     config = Configuration( 'scanner' )
271     window = SettingsWindow( config )
272     window.connect("delete_event", gtk.main_quit, None)
273     window.show()
274     gtk.main()