1"""
2@package nviz.preferences
3
4@brief Nviz (3D view) preferences window
5
6Classes:
7 - preferences::NvizPreferencesDialog
8
9(C) 2008-2011 by the GRASS Development Team
10
11This program is free software under the GNU General Public License
12(>=v2). Read the file COPYING that comes with GRASS for details.
13
14@author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
15@author Enhancements by Michael Barton <michael.barton asu.edu>
16@author Anna Kratochvilova <KratochAnna seznam.cz> (Google SoC 2011)
17"""
18
19import os
20import copy
21
22import wx
23import wx.lib.colourselect as csel
24
25from core import globalvar
26from core.settings import UserSettings
27from gui_core.preferences import PreferencesBaseDialog
28from gui_core.wrap import SpinCtrl, Button, CheckBox, StaticText, \
29    StaticBox
30
31
32class NvizPreferencesDialog(PreferencesBaseDialog):
33    """Nviz preferences dialog"""
34
35    def __init__(self, parent, giface, title=_("3D view default settings"),
36                 settings=UserSettings):
37        PreferencesBaseDialog.__init__(
38            self,
39            parent=parent,
40            title=title,
41            giface=giface,
42            settings=settings)
43        self.SetIcon(
44            wx.Icon(
45                os.path.join(
46                    globalvar.ICONDIR,
47                    'grass_nviz.ico'),
48                wx.BITMAP_TYPE_ICO))
49
50        self.toolWin = self.parent.nviz
51
52        # create notebook pages
53        self._createViewPage(self.notebook)
54        self._createFlyPage(self.notebook)
55        self._createLightPage(self.notebook)
56        self._createSurfacePage(self.notebook)
57        self._createVectorPage(self.notebook)
58
59        self.SetMinSize(self.GetBestSize())
60        self.SetSize(self.size)
61        self.btnDefault.SetToolTip(
62            _("Revert settings to default, changes are not applied"))
63
64    def _createViewPage(self, notebook):
65        """Create notebook page for view settings"""
66        panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
67
68        notebook.AddPage(page=panel,
69                         text=" %s " % _("View"))
70
71        pageSizer = wx.BoxSizer(wx.VERTICAL)
72
73        box = StaticBox(parent=panel, id=wx.ID_ANY,
74                        label=" %s " % (_("View")))
75        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
76        gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
77        row = 0
78        # perspective
79        pvals = UserSettings.Get(group='nviz', key='view', subkey='persp')
80        ipvals = UserSettings.Get(
81            group='nviz',
82            key='view',
83            subkey='persp',
84            settings_type='internal')
85        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
86                                 label=_("Perspective:")),
87                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
88        gridSizer.Add(
89            StaticText(
90                parent=panel, id=wx.ID_ANY, label=_("value:")), pos=(
91                row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
92
93        pval = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
94                        initial=pvals['value'],
95                        min=ipvals['min'],
96                        max=ipvals['max'])
97        self.winId['nviz:view:persp:value'] = pval.GetId()
98        gridSizer.Add(pval, pos=(row, 2),
99                      flag=wx.ALIGN_CENTER_VERTICAL)
100
101        gridSizer.Add(
102            StaticText(
103                parent=panel, id=wx.ID_ANY, label=_("step:")), pos=(
104                row, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
105
106        pstep = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
107                         initial=pvals['step'],
108                         min=ipvals['min'],
109                         max=ipvals['max'] - 1)
110        self.winId['nviz:view:persp:step'] = pstep.GetId()
111        gridSizer.Add(pstep, pos=(row, 4),
112                      flag=wx.ALIGN_CENTER_VERTICAL)
113        row += 1
114
115        # position
116        posvals = UserSettings.Get(group='nviz', key='view', subkey='position')
117        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
118                                 label=_("Position:")),
119                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
120        gridSizer.Add(
121            StaticText(
122                parent=panel, id=wx.ID_ANY, label=_("x:")), pos=(
123                row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
124
125        px = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
126                      initial=posvals['x'] * 100,
127                      min=0,
128                      max=100)
129        self.winId['nviz:view:position:x'] = px.GetId()
130        gridSizer.Add(px, pos=(row, 2),
131                      flag=wx.ALIGN_CENTER_VERTICAL)
132
133        gridSizer.Add(
134            StaticText(
135                parent=panel, id=wx.ID_ANY, label="y:"), pos=(
136                row, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
137
138        py = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
139                      initial=posvals['y'] * 100,
140                      min=0,
141                      max=100)
142        self.winId['nviz:view:position:y'] = py.GetId()
143        gridSizer.Add(py, pos=(row, 4),
144                      flag=wx.ALIGN_CENTER_VERTICAL)
145        row += 1
146
147        # height is computed dynamically
148
149        # twist
150        tvals = UserSettings.Get(group='nviz', key='view', subkey='twist')
151        itvals = UserSettings.Get(
152            group='nviz',
153            key='view',
154            subkey='twist',
155            settings_type='internal')
156        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
157                                 label=_("Twist:")),
158                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
159        gridSizer.Add(
160            StaticText(
161                parent=panel, id=wx.ID_ANY, label=_("value:")), pos=(
162                row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
163
164        tval = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
165                        initial=tvals['value'],
166                        min=itvals['min'],
167                        max=itvals['max'])
168        self.winId['nviz:view:twist:value'] = tval.GetId()
169        gridSizer.Add(tval, pos=(row, 2),
170                      flag=wx.ALIGN_CENTER_VERTICAL)
171        row += 1
172
173        # z-exag
174        zvals = UserSettings.Get(group='nviz', key='view', subkey='z-exag')
175        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
176                                 label=_("Z-exag:")),
177                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
178        gridSizer.Add(
179            StaticText(
180                parent=panel, id=wx.ID_ANY, label=_("value:")), pos=(
181                row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
182
183        zval = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
184                        initial=zvals['value'],
185                        min=-1e6,
186                        max=1e6)
187        self.winId['nviz:view:z-exag:value'] = zval.GetId()
188        gridSizer.Add(zval, pos=(row, 2),
189                      flag=wx.ALIGN_CENTER_VERTICAL)
190
191        boxSizer.Add(gridSizer, proportion=1,
192                     flag=wx.ALL | wx.EXPAND, border=3)
193        pageSizer.Add(boxSizer, proportion=0,
194                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
195                      border=3)
196
197        box = StaticBox(parent=panel, id=wx.ID_ANY,
198                        label=" %s " % (_("Image Appearance")))
199        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
200        gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
201
202        # background color
203        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
204                                 label=_("Background color:")),
205                      pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
206
207        color = csel.ColourSelect(
208            panel,
209            id=wx.ID_ANY,
210            colour=UserSettings.Get(
211                group='nviz',
212                key='view',
213                subkey=[
214                    'background',
215                    'color']),
216            size=globalvar.DIALOG_COLOR_SIZE)
217        color.SetName('GetColour')
218        self.winId['nviz:view:background:color'] = color.GetId()
219        gridSizer.Add(color, pos=(0, 1))
220
221        gridSizer.AddGrowableCol(0)
222        boxSizer.Add(gridSizer, proportion=1,
223                     flag=wx.ALL | wx.EXPAND, border=5)
224        pageSizer.Add(boxSizer, proportion=0,
225                      flag=wx.EXPAND | wx.ALL,
226                      border=5)
227
228        panel.SetSizer(pageSizer)
229
230        return panel
231
232    def _createFlyPage(self, notebook):
233        """Create notebook page for view settings"""
234        panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
235
236        notebook.AddPage(page=panel,
237                         text=" %s " % _("Fly-through"))
238        pageSizer = wx.BoxSizer(wx.VERTICAL)
239        # fly throuhg mode
240        box = StaticBox(parent=panel, id=wx.ID_ANY,
241                        label=" %s " % (_("Fly-through mode")))
242        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
243        gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
244
245        # move exag
246        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
247                                 label=_("Move exag:")),
248                      pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
249
250        moveExag = SpinCtrl(
251            panel, id=wx.ID_ANY, min=1, max=20, initial=UserSettings.Get(
252                group='nviz', key='fly', subkey=[
253                    'exag', 'move']), size=(
254                65, -1))
255        self.winId['nviz:fly:exag:move'] = moveExag.GetId()
256        gridSizer.Add(moveExag, pos=(0, 1))
257
258        # turn exag
259        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
260                                 label=_("Turn exag:")),
261                      pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
262
263        turnExag = SpinCtrl(
264            panel, id=wx.ID_ANY, min=1, max=20, initial=UserSettings.Get(
265                group='nviz', key='fly', subkey=[
266                    'exag', 'turn']), size=(
267                65, -1))
268        self.winId['nviz:fly:exag:turn'] = turnExag.GetId()
269        gridSizer.Add(turnExag, pos=(1, 1))
270
271        gridSizer.AddGrowableCol(0)
272        boxSizer.Add(gridSizer, proportion=1,
273                     flag=wx.ALL | wx.EXPAND, border=5)
274        pageSizer.Add(boxSizer, proportion=0,
275                      flag=wx.EXPAND | wx.ALL,
276                      border=5)
277
278        panel.SetSizer(pageSizer)
279
280        return panel
281
282    def _createLightPage(self, notebook):
283        """Create notebook page for light settings"""
284        panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
285
286        notebook.AddPage(page=panel,
287                         text=" %s " % _("Lighting"))
288
289        pageSizer = wx.BoxSizer(wx.VERTICAL)
290
291        box = StaticBox(parent=panel, id=wx.ID_ANY,
292                        label=" %s " % (_("Light")))
293        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
294        gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
295
296        # position
297        posvals = UserSettings.Get(
298            group='nviz', key='light', subkey='position')
299        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
300                                 label=_("Position:")),
301                      pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
302        gridSizer.Add(
303            StaticText(
304                parent=panel, id=wx.ID_ANY, label=_("x:")), pos=(
305                0, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
306
307        px = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
308                      initial=posvals['x'] * 100,
309                      min=-100,
310                      max=100)
311        self.winId['nviz:light:position:x'] = px.GetId()
312        gridSizer.Add(px, pos=(0, 2),
313                      flag=wx.ALIGN_CENTER_VERTICAL)
314
315        gridSizer.Add(
316            StaticText(
317                parent=panel, id=wx.ID_ANY, label="y:"), pos=(
318                0, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
319
320        py = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
321                      initial=posvals['y'] * 100,
322                      min=-100,
323                      max=100)
324        self.winId['nviz:light:position:y'] = py.GetId()
325        gridSizer.Add(py, pos=(0, 4),
326                      flag=wx.ALIGN_CENTER_VERTICAL)
327
328        gridSizer.Add(
329            StaticText(
330                parent=panel, id=wx.ID_ANY, label=_("z:")), pos=(
331                0, 5), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
332
333        pz = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
334                      initial=posvals['z'],
335                      min=0,
336                      max=100)
337        self.winId['nviz:light:position:z'] = pz.GetId()
338        gridSizer.Add(pz, pos=(0, 6),
339                      flag=wx.ALIGN_CENTER_VERTICAL)
340
341        # brightness
342        brightval = UserSettings.Get(
343            group='nviz', key='light', subkey='bright')
344        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
345                                 label=_("Brightness:")),
346                      pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
347
348        bright = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
349                          initial=brightval,
350                          min=0,
351                          max=100)
352        self.winId['nviz:light:bright'] = bright.GetId()
353        gridSizer.Add(bright, pos=(1, 2),
354                      flag=wx.ALIGN_CENTER_VERTICAL)
355
356        # ambient
357        ambval = UserSettings.Get(group='nviz', key='light', subkey='ambient')
358        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
359                                 label=_("Ambient:")),
360                      pos=(2, 0), flag=wx.ALIGN_CENTER_VERTICAL)
361
362        amb = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
363                       initial=ambval,
364                       min=0,
365                       max=100)
366        self.winId['nviz:light:ambient'] = amb.GetId()
367        gridSizer.Add(amb, pos=(2, 2),
368                      flag=wx.ALIGN_CENTER_VERTICAL)
369
370        # light color
371        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
372                                 label=_("Color:")),
373                      pos=(3, 0), flag=wx.ALIGN_CENTER_VERTICAL)
374
375        color = csel.ColourSelect(
376            panel, id=wx.ID_ANY, colour=UserSettings.Get(
377                group='nviz', key='light', subkey='color'),
378            size=globalvar.DIALOG_COLOR_SIZE)
379        color.SetName('GetColour')
380        self.winId['nviz:light:color'] = color.GetId()
381        gridSizer.Add(color, pos=(3, 2))
382
383        boxSizer.Add(gridSizer, proportion=1,
384                     flag=wx.ALL | wx.EXPAND, border=5)
385        pageSizer.Add(boxSizer, proportion=0,
386                      flag=wx.EXPAND | wx.ALL,
387                      border=5)
388
389        panel.SetSizer(pageSizer)
390
391        return panel
392
393    def _createSurfacePage(self, notebook):
394        """Create notebook page for surface settings"""
395        panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
396
397        notebook.AddPage(page=panel,
398                         text=" %s " % _("Surface"))
399
400        pageSizer = wx.BoxSizer(wx.VERTICAL)
401
402        # draw
403
404        box = StaticBox(parent=panel, id=wx.ID_ANY,
405                        label=" %s " % (_("Draw")))
406        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
407        gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
408
409        # mode
410        gridSizer.Add(
411            StaticText(
412                parent=panel,
413                id=wx.ID_ANY,
414                label=_("Mode:")),
415            flag=wx.ALIGN_CENTER_VERTICAL,
416            pos=(
417                0,
418                0))
419        mode = wx.Choice(parent=panel, id=wx.ID_ANY, size=(-1, -1),
420                         choices=[_("coarse"),
421                                  _("fine"),
422                                  _("both")])
423        self.winId['nviz:surface:draw:mode'] = mode.GetId()
424        mode.SetName('GetSelection')
425        mode.SetSelection(UserSettings.Get(group='nviz', key='surface',
426                                           subkey=['draw', 'mode']))
427        gridSizer.Add(mode, flag=wx.ALIGN_CENTER_VERTICAL,
428                      pos=(0, 1))
429
430        # fine
431        gridSizer.Add(
432            StaticText(
433                parent=panel,
434                id=wx.ID_ANY,
435                label=_("Fine mode:")),
436            flag=wx.ALIGN_CENTER_VERTICAL,
437            pos=(
438                1,
439                0))
440        res = UserSettings.Get(
441            group='nviz', key='surface', subkey=[
442                'draw', 'res-fine'])
443        gridSizer.Add(
444            StaticText(
445                parent=panel,
446                id=wx.ID_ANY,
447                label=_("resolution:")),
448            flag=wx.ALIGN_CENTER_VERTICAL,
449            pos=(
450                1,
451                1))
452        fine = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
453                        initial=res,
454                        min=1,
455                        max=100)
456        self.winId['nviz:surface:draw:res-fine'] = fine.GetId()
457
458        gridSizer.Add(fine, flag=wx.ALIGN_CENTER_VERTICAL,
459                      pos=(1, 2))
460
461        # coarse
462        gridSizer.Add(
463            StaticText(
464                parent=panel,
465                id=wx.ID_ANY,
466                label=_("Coarse mode:")),
467            flag=wx.ALIGN_CENTER_VERTICAL,
468            pos=(
469                2,
470                0))
471        res = UserSettings.Get(
472            group='nviz', key='surface', subkey=[
473                'draw', 'res-coarse'])
474        gridSizer.Add(
475            StaticText(
476                parent=panel,
477                id=wx.ID_ANY,
478                label=_("resolution:")),
479            flag=wx.ALIGN_CENTER_VERTICAL,
480            pos=(
481                2,
482                1))
483        coarse = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
484                          initial=res,
485                          min=1,
486                          max=100)
487        self.winId['nviz:surface:draw:res-coarse'] = coarse.GetId()
488
489        gridSizer.Add(coarse, flag=wx.ALIGN_CENTER_VERTICAL,
490                      pos=(2, 2))
491        # style
492        gridSizer.Add(
493            StaticText(
494                parent=panel,
495                id=wx.ID_ANY,
496                label=_("style:")),
497            flag=wx.ALIGN_CENTER_VERTICAL,
498            pos=(
499                3,
500                1))
501        style = wx.Choice(parent=panel, id=wx.ID_ANY, size=(-1, -1),
502                          choices=[_("wire"),
503                                   _("surface")])
504        self.winId['nviz:surface:draw:style'] = style.GetId()
505        style.SetName('GetSelection')
506        style.SetSelection(UserSettings.Get(group='nviz', key='surface',
507                                            subkey=['draw', 'style']))
508        self.winId['nviz:surface:draw:style'] = style.GetId()
509
510        gridSizer.Add(style, flag=wx.ALIGN_CENTER_VERTICAL,
511                      pos=(3, 2))
512        # wire color
513        gridSizer.Add(
514            StaticText(
515                parent=panel,
516                id=wx.ID_ANY,
517                label=_("wire color:")),
518            flag=wx.ALIGN_CENTER_VERTICAL,
519            pos=(
520                4,
521                1))
522        color = csel.ColourSelect(
523            panel, id=wx.ID_ANY, colour=UserSettings.Get(
524                group='nviz', key='surface', subkey=[
525                    'draw', 'wire-color']), size=globalvar.DIALOG_COLOR_SIZE)
526        color.SetName('GetColour')
527        self.winId['nviz:surface:draw:wire-color'] = color.GetId()
528        gridSizer.Add(color, flag=wx.ALIGN_CENTER_VERTICAL,
529                      pos=(4, 2))
530
531        boxSizer.Add(gridSizer, proportion=1,
532                     flag=wx.ALL | wx.EXPAND, border=5)
533        pageSizer.Add(boxSizer, proportion=0,
534                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
535                      border=5)
536
537        panel.SetSizer(pageSizer)
538
539        return panel
540
541    def _createVectorPage(self, notebook):
542        """Create notebook page for vector settings"""
543        panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
544
545        notebook.AddPage(page=panel,
546                         text=" %s " % _("Vector"))
547
548        pageSizer = wx.BoxSizer(wx.VERTICAL)
549
550        # vector lines
551        box = StaticBox(parent=panel, id=wx.ID_ANY,
552                        label=" %s " % (_("Vector lines")))
553        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
554        gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
555
556        row = 0
557        # icon size
558        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
559                                 label=_("Width:")),
560                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
561
562        iwidth = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
563                          initial=12,
564                          min=1,
565                          max=100)
566        self.winId['nviz:vector:lines:width'] = iwidth.GetId()
567        iwidth.SetValue(UserSettings.Get(group='nviz', key='vector',
568                                         subkey=['lines', 'width']))
569        gridSizer.Add(iwidth, pos=(row, 1),
570                      flag=wx.ALIGN_CENTER_VERTICAL)
571
572        # icon color
573        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
574                                 label=_("Color:")),
575                      pos=(row, 4), flag=wx.ALIGN_CENTER_VERTICAL)
576        icolor = csel.ColourSelect(panel, id=wx.ID_ANY,
577                                   size=globalvar.DIALOG_COLOR_SIZE)
578        icolor.SetName('GetColour')
579        self.winId['nviz:vector:lines:color'] = icolor.GetId()
580        icolor.SetColour(UserSettings.Get(group='nviz', key='vector',
581                                          subkey=['lines', 'color']))
582        gridSizer.Add(icolor, flag=wx.ALIGN_CENTER_VERTICAL,
583                      pos=(row, 5))
584        boxSizer.Add(gridSizer, proportion=1,
585                     flag=wx.ALL | wx.EXPAND, border=5)
586        pageSizer.Add(boxSizer, proportion=0,
587                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
588                      border=5)
589
590        # vector points
591        box = StaticBox(parent=panel, id=wx.ID_ANY,
592                        label=" %s " % (_("Vector points")))
593        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
594        gridSizer = wx.GridBagSizer(vgap=3, hgap=5)
595
596        row = 0
597        # icon size
598        autosize = CheckBox(parent=panel, label=_("Automatic size"))
599        autosize.SetToolTip(_("Icon size is set automatically based on landscape dimensions."))
600        gridSizer.Add(autosize, pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
601        self.winId['nviz:vector:points:autosize'] = autosize.GetId()
602        autosize.SetValue(UserSettings.Get(group='nviz', key='vector',
603                                           subkey=['points', 'autosize']))
604
605        row += 1
606        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
607                                 label=_("Size:")),
608                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
609
610        isize = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
611                         initial=100,
612                         min=1,
613                         max=1e6)
614        self.winId['nviz:vector:points:size'] = isize.GetId()
615        isize.SetValue(UserSettings.Get(group='nviz', key='vector',
616                                        subkey=['points', 'size']))
617        gridSizer.Add(isize, pos=(row, 1),
618                      flag=wx.ALIGN_CENTER_VERTICAL)
619
620        # icon symbol
621        row += 1
622        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
623                                 label=_("Marker:")),
624                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
625        isym = wx.Choice(
626            parent=panel, id=wx.ID_ANY, size=(100, -1),
627            choices=UserSettings.Get(
628                group='nviz', key='vector', subkey=['points', 'marker'],
629                settings_type='internal'))
630        isym.SetName("GetSelection")
631        self.winId['nviz:vector:points:marker'] = isym.GetId()
632        isym.SetSelection(UserSettings.Get(group='nviz', key='vector',
633                                           subkey=['points', 'marker']))
634        gridSizer.Add(isym, flag=wx.ALIGN_CENTER_VERTICAL,
635                      pos=(row, 1))
636
637        # icon color
638        row += 1
639        gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
640                                 label=_("Color:")),
641                      pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
642        icolor = csel.ColourSelect(panel, id=wx.ID_ANY,
643                                   size=globalvar.DIALOG_COLOR_SIZE)
644        icolor.SetName('GetColour')
645        self.winId['nviz:vector:points:color'] = icolor.GetId()
646        icolor.SetColour(UserSettings.Get(group='nviz', key='vector',
647                                          subkey=['points', 'color']))
648        gridSizer.Add(icolor, flag=wx.ALIGN_CENTER_VERTICAL,
649                      pos=(row, 1))
650
651        boxSizer.Add(gridSizer, proportion=1,
652                     flag=wx.ALL | wx.EXPAND, border=5)
653        pageSizer.Add(boxSizer, proportion=0,
654                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
655                      border=5)
656
657        panel.SetSizer(pageSizer)
658
659        return panel
660
661    def OnDefault(self, event):
662        """Button 'Set to default' pressed"""
663        self.settings.userSettings = copy.deepcopy(
664            self.settings.defaultSettings)
665
666        # update widgets
667        for gks in self.winId.keys():
668            subkey1 = None
669            try:
670                group, key, subkey = gks.split(':')
671                value = self.settings.Get(group, key, subkey)
672            except ValueError:
673                group, key, subkey, subkey1 = gks.split(':')
674                value = self.settings.Get(group, key, [subkey, subkey1])
675            if subkey == 'position':
676                if subkey1 in ('x', 'y'):
677                    value = float(value) * 100
678            win = self.FindWindowById(self.winId[gks])
679            if win.GetName() == 'GetSelection':
680                value = win.SetSelection(value)
681            else:
682                value = win.SetValue(value)
683
684    def OnApply(self, event):
685        """Apply Nviz settings for current session"""
686        for item in self.winId.keys():
687            try:
688                group, key, subkey = item.split(':')
689                subkey1 = None
690            except ValueError:
691                group, key, subkey, subkey1 = item.split(':')
692
693            id = self.winId[item]
694            win = self.FindWindowById(id)
695            if win.GetName() == 'GetSelection':
696                value = win.GetSelection()
697            elif win.GetName() == 'GetColour':
698                value = tuple(win.GetValue())
699            else:
700                value = win.GetValue()
701
702            if subkey == 'position':
703                if subkey1 in ('x', 'y'):
704                    value = float(value) / 100
705            if subkey1:
706                self.settings.Set(group, value, key, [subkey, subkey1])
707            else:
708                self.settings.Set(group, value, key, subkey)
709
710        self.toolWin.LoadSettings()
711
712    def OnSave(self, event):
713        """Save button pressed
714
715        Apply changes and save settings to configuration file
716        """
717        self.OnApply(None)
718        fileSettings = {}
719        UserSettings.ReadSettingsFile(settings=fileSettings)
720        fileSettings['nviz'] = UserSettings.Get(group='nviz')
721
722        UserSettings.SaveToFile(fileSettings)
723        self.parent._gconsole.WriteLog(
724            _('3D view settings saved to file <%s>.') % UserSettings.filePath)
725
726        self.Destroy()
727