1 |
# Copyright (c) 2005 by Intevation GmbH |
2 |
# Authors: |
3 |
# Jonathan Coles <[email protected]> |
4 |
# |
5 |
# This program is free software under the GPL (>=v2) |
6 |
# Read the file COPYING coming with Thuban for details. |
7 |
|
8 |
"""Raster Layer Properties dialog""" |
9 |
|
10 |
__version__ = "$Revision$" |
11 |
# $Source$ |
12 |
# $Id$ |
13 |
|
14 |
import wx |
15 |
|
16 |
from Thuban import _ |
17 |
from Thuban.UI.layerproperties import LayerProperties |
18 |
from Thuban.Model.resource import has_gdal_support, gdal_support_status |
19 |
|
20 |
from Thuban.version import versions |
21 |
|
22 |
ID_RB_MASK = 4002 |
23 |
|
24 |
class RasterLayerProperties(LayerProperties): |
25 |
|
26 |
def __init__(self, parent, name, layer, *args, **kw): |
27 |
LayerProperties.__init__(self, parent, name, layer) |
28 |
|
29 |
self.old_state = {} |
30 |
self.old_state["mask_type"] = layer.MaskType() |
31 |
|
32 |
LayerProperties.dialog_layout(self) |
33 |
|
34 |
def dialog_layout(self, panel, panelBox): |
35 |
|
36 |
info = self.layer.ImageInfo() |
37 |
|
38 |
if info is None: |
39 |
panelBox.Add( |
40 |
wx.StaticText(panel, -1, |
41 |
_("GDAL image information unavailable. See About box for details.")), |
42 |
0, wx.ALIGN_LEFT | wx.ALL, 4) |
43 |
return |
44 |
|
45 |
|
46 |
# Bounding Box |
47 |
bbox = self.layer.LatLongBoundingBox() |
48 |
if bbox is None: |
49 |
text = _("Extent (lat-lon): None") |
50 |
else: |
51 |
text = _("Extent (lat-lon): (%g, %g, %g, %g)") % tuple(bbox) |
52 |
|
53 |
panelBox.Add(wx.StaticText(panel, -1, text), 0, wx.ALIGN_LEFT|wx.ALL, 4) |
54 |
|
55 |
rasterBox = wx.StaticBoxSizer(wx.StaticBox(panel, -1, |
56 |
_("Image Properties")), wx.VERTICAL) |
57 |
|
58 |
|
59 |
rasterBox.Add( |
60 |
wx.StaticText(panel, -1, |
61 |
_("Source: %s") % self.layer.GetImageFilename()), |
62 |
0, wx.ALIGN_LEFT | wx.ALL, 4) |
63 |
|
64 |
infoBox = wx.BoxSizer(wx.HORIZONTAL) |
65 |
|
66 |
nBands = info["nBands"] |
67 |
|
68 |
self.usePalIndex = nBands == 1 |
69 |
|
70 |
infoBox.Add( |
71 |
wx.StaticText(panel, -1, _("Driver: %s") % info["Driver"]), |
72 |
0, wx.ALIGN_LEFT | wx.RIGHT, 10) |
73 |
infoBox.Add( |
74 |
wx.StaticText(panel, -1, _("Size: %ix%i") % info["Size"]), |
75 |
0, wx.ALIGN_LEFT | wx.RIGHT, 10) |
76 |
infoBox.Add( |
77 |
wx.StaticText(panel, -1, _("Number of Bands: %i") % nBands), |
78 |
0, wx.ALIGN_LEFT | wx.RIGHT, 0) |
79 |
|
80 |
rasterBox.Add(infoBox, 0, wx.ALIGN_LEFT|wx.ALL, 4) |
81 |
|
82 |
# Mask |
83 |
|
84 |
maskBox = wx.BoxSizer(wx.HORIZONTAL) |
85 |
|
86 |
if versions['wxPython-tuple'] < (2,5,3): |
87 |
choices = ["None", "Bitmap", |
88 |
"Alpha (Not support by wxPython %s)" % \ |
89 |
versions['wxPython']] |
90 |
else: |
91 |
choices = ["None", "Bitmap", "Alpha"] |
92 |
|
93 |
self.maskRadioBox = wx.RadioBox(panel, ID_RB_MASK, _("Mask Type"), |
94 |
choices=choices) |
95 |
#self.maskCB = wxCheckBox(panel, -1, _("Use Mask")) |
96 |
maskBox.Add(self.maskRadioBox, 0, wx.RIGHT, 10) |
97 |
|
98 |
self.opBox = wx.BoxSizer(wx.HORIZONTAL) |
99 |
self.opSpinLabel = wx.StaticText(panel, -1, _("Opacity:")) |
100 |
self.opBox.Add(self.opSpinLabel, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 4) |
101 |
self.opSpin = wx.SpinCtrl(panel, -1, |
102 |
str(self.layer.Opacity()*255), |
103 |
initial = self.layer.Opacity()*255, |
104 |
min=0, max=255) |
105 |
self.opBox.Add(self.opSpin, 0, wx.ALL, 4) |
106 |
maskBox.Add(self.opBox, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4) |
107 |
|
108 |
rasterBox.Add(maskBox, 0, wx.ALL, 4) |
109 |
#rasterBox.Add(opBox, 0, wxALL, 4) |
110 |
|
111 |
panelBox.Add(rasterBox, 1, wx.GROW | wx.ALL, 4) |
112 |
|
113 |
self.maskRadioBox.SetSelection(self.old_state["mask_type"]) |
114 |
|
115 |
self.OnMaskSelect(None) |
116 |
|
117 |
self.Bind(wx.EVT_RADIOBOX, self.OnMaskSelect, id=ID_RB_MASK) |
118 |
|
119 |
def OnTry(self, event): |
120 |
self.set_state() |
121 |
|
122 |
def OnOK(self, event): |
123 |
if self.set_state(): |
124 |
self.Close() |
125 |
|
126 |
def OnRevert(self, event): |
127 |
self.maskRadioBox.SetSelection(self.old_state["mask_type"]) |
128 |
self.set_state() |
129 |
|
130 |
def OnMaskSelect(self, event): |
131 |
allowOpacity = self.maskRadioBox.GetSelection()==2 |
132 |
self.opSpin.Enable(allowOpacity) |
133 |
self.opSpinLabel.Enable(allowOpacity) |
134 |
|
135 |
def set_state(self): |
136 |
self.layer.SetMaskType(self.maskRadioBox.GetSelection()) |
137 |
self.layer.SetOpacity(self.opSpin.GetValue()/255.0) |
138 |
return True |