def _test_FloatSpinCtrl_nolimit(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame, style=floatspin.FSC_NO_LIMIT) spin.SetRange(0, 100) values = [-100, -50, -1, 0, 1, 50, 99, 100, 101, 150, 200] for v in values: spin.SetValue(v) assert spin.GetValue() == v
def _test_FloatSpinCtrl_text(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame) sim = wx.UIActionSimulator() spin.SetRange(0, 100) result = [0] def handler(ev): result[0] = ev.value enter = [False] def enterHandler(ev): enter[0] = True spin.Bind(floatspin.EVT_FLOATSPIN, handler) spin.Bind(wx.EVT_TEXT_ENTER, enterHandler) # input, expected testcases = [ ( '', 0), ( '1', 1), ( '5', 5), ('Baba', 5), ( '0', 0), ( '20', 20), ('-423', 0), ( '99', 99), ('1055', 100), ( '25', 25), ( '25.42', 25.42), ] realYield() for text, expected in testcases: oldValue = spin.GetValue() result[0] = None enter[0] = False simtext(sim, spin.textCtrl, text) assert spin.GetValue() == expected try: float(text) assert enter[0] except: assert not enter[0] if oldValue == expected: assert result[0] is None else: assert result[0] == expected
def _test_FloatSpinCtrl_spinButtons(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame, value=0, minValue=0, maxValue=100, increment=1, evDelta=0.01) ev = mock.MagicMock() # The FloatSpinCtrl class throttles the # rate at which spin button events are # processed, so we have to wait between # triggering events. time.sleep(0.05) spin._FloatSpinCtrl__onSpinDown(ev) assert spin.GetValue() == 0 time.sleep(0.05) spin._FloatSpinCtrl__onSpinUp(ev) assert spin.GetValue() == 1 time.sleep(0.05) spin._FloatSpinCtrl__onSpinDown(ev) assert spin.GetValue() == 0 spin.SetValue(100) time.sleep(0.05) spin._FloatSpinCtrl__onSpinUp(ev) assert spin.GetValue() == 100 results = [None] def handler(ev): results[0] = ev.value spin.Bind(floatspin.EVT_FLOATSPIN, handler) time.sleep(0.05) spin.SetValue(50) spin._FloatSpinCtrl__onSpinUp(ev) wx.Yield() assert results[0] == 51 results[0] = None time.sleep(0.05) spin.SetValue(50) spin._FloatSpinCtrl__onSpinDown(ev) wx.Yield() assert results[0] == 49
def _test_FloatSpinCtrl_KeyDownUp(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame) sim = wx.UIActionSimulator() spin.SetRange(0, 100) result = [0] def handler(ev): result[0] = ev.value spin.Bind(floatspin.EVT_FLOATSPIN, handler) # initialValue, key, expected testcases = [ (50, wx.WXK_UP, 51), (50, wx.WXK_DOWN, 49), (1, wx.WXK_UP, 2), (1, wx.WXK_DOWN, 0), (0, wx.WXK_UP, 1), (0, wx.WXK_DOWN, 0), (99, wx.WXK_UP, 100), (99, wx.WXK_DOWN, 98), (100, wx.WXK_UP, 100), (100, wx.WXK_DOWN, 99), ] spin.textCtrl.SetFocus() realYield() for value, key, expected in testcases: result[0] = None spin.SetValue(value) simkey(sim, spin.textCtrl, key) assert spin.GetValue() == expected if expected != value: assert result[0] == expected else: assert result[0] is None
def _test_FloatSpinCtrl_TextLoseFocus(): frame = wx.GetApp().GetTopWindow() sim = wx.UIActionSimulator() spin = floatspin.FloatSpinCtrl(frame) dummy = wx.TextCtrl(frame) spin.SetRange(0, 100) result = [None] def handler(ev): result[0] = ev.value spin.Bind(floatspin.EVT_FLOATSPIN, handler) testcases = [ ( '1', 1), ( '5', 5), ('Baba', 5), ( '0', 0), ( '20', 20), ('-423', 0), ( '99', 99), ('1055', 100), ( '25', 25), ( '25.42', 25.42), ] for text, expected in testcases: oldValue = spin.GetValue() result[0] = None spin.textCtrl.SetFocus() simtext(sim, spin.textCtrl, text, enter=False) simfocus(spin, dummy) assert spin.GetValue() == expected if oldValue == expected: assert result[0] is None else: assert result[0] == expected
def _test_FloatSpinCtrl_mouseWheel(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame, style=floatspin.FSC_MOUSEWHEEL) spin.SetRange(0, 100) ev = mock.MagicMock() testcases = [ ( 1, wx.MOUSE_WHEEL_VERTICAL, 1), (-1, wx.MOUSE_WHEEL_VERTICAL, -1), ( 1, wx.MOUSE_WHEEL_HORIZONTAL, -1), (-1, wx.MOUSE_WHEEL_HORIZONTAL, 1)] results = [None] def handler(ev): results[0] = ev.value spin.Bind(floatspin.EVT_FLOATSPIN, handler) for rot, axis, expected in testcases: results[0] = None time.sleep(0.05) spin.SetValue(50) ev.GetWheelAxis.return_value = axis ev.GetWheelRotation.return_value = rot spin._FloatSpinCtrl__onMouseWheel(ev) wx.Yield() assert results[0] == 50 + expected assert spin.GetValue() == 50 + expected
def __init__(self, parent, overlayList, displayCtx, frame): fslpanel.FSLeyesPanel.__init__(self, parent, overlayList, displayCtx, frame, kbFocus=True) # Whenever the selected overlay changes, # a reference to it and its DisplayOpts # instance is stored, as property listeners # are registered on it (and need to be # de-registered later on). self.__registeredOverlay = None self.__registeredDisplay = None self.__registeredOpts = None self.__column1 = wx.Panel(self) self.__column2 = wx.Panel(self) self.__info = wxhtml.HtmlWindow(self) # HTMLWindow does not use # the parent font by default, # so we force it to at least # have the parent font size self.__info.SetStandardFonts(self.GetFont().GetPointSize()) self.__worldLabel = wx.StaticText( self.__column1, label=strings.labels[self, 'worldLocation']) self.__volumeLabel = wx.StaticText( self.__column1, label=strings.labels[self, 'volume']) self.__voxelLabel = wx.StaticText( self.__column2, label=strings.labels[self, 'voxelLocation']) worldX, worldY, worldZ = props.makeListWidgets( self.__column1, self, 'worldLocation', slider=False, spin=True, showLimits=False, mousewheel=True) voxelX, voxelY, voxelZ = props.makeListWidgets( self.__column2, self, 'voxelLocation', slider=False, spin=True, spinWidth=7, showLimits=False, mousewheel=True) self.__worldX = worldX self.__worldY = worldY self.__worldZ = worldZ self.__voxelX = voxelX self.__voxelY = voxelY self.__voxelZ = voxelZ self.__volume = floatspin.FloatSpinCtrl( self.__column2, width=7, style=floatspin.FSC_MOUSEWHEEL | floatspin.FSC_INTEGER) self.__column1Sizer = wx.BoxSizer(wx.VERTICAL) self.__column2Sizer = wx.BoxSizer(wx.VERTICAL) self.__sizer = wx.BoxSizer(wx.HORIZONTAL) self.__column1Sizer.Add(self.__worldLabel, flag=wx.EXPAND) self.__column1Sizer.Add(self.__worldX, flag=wx.EXPAND) self.__column1Sizer.Add(self.__worldY, flag=wx.EXPAND) self.__column1Sizer.Add(self.__worldZ, flag=wx.EXPAND) self.__column1Sizer.Add(self.__volumeLabel, flag=wx.ALIGN_RIGHT) self.__column2Sizer.Add(self.__voxelLabel, flag=wx.EXPAND) self.__column2Sizer.Add(self.__voxelX, flag=wx.EXPAND) self.__column2Sizer.Add(self.__voxelY, flag=wx.EXPAND) self.__column2Sizer.Add(self.__voxelZ, flag=wx.EXPAND) self.__column2Sizer.Add(self.__volume, flag=wx.EXPAND) self.__sizer.Add(self.__column1, flag=wx.EXPAND) self.__sizer.Add((5, -1)) self.__sizer.Add(self.__column2, flag=wx.EXPAND) self.__sizer.Add((5, -1)) self.__sizer.Add(self.__info, flag=wx.EXPAND, proportion=1) self.__column1.SetSizer(self.__column1Sizer) self.__column2.SetSizer(self.__column2Sizer) self .SetSizer(self.__sizer) self.overlayList.addListener('overlays', self.name, self.__selectedOverlayChanged) self.displayCtx .addListener('selectedOverlay', self.name, self.__selectedOverlayChanged) self.displayCtx .addListener('overlayOrder', self.name, self.__overlayOrderChanged) self.displayCtx .addListener('location', self.name, self.__displayLocationChanged) self.addListener( 'voxelLocation', self.name, self.__voxelLocationChanged) self.addListener( 'worldLocation', self.name, self.__worldLocationChanged) self.__selectedOverlayChanged() self.__worldLabel .SetMinSize(self.__calcWorldLabelMinSize()) self.__voxelLabel .SetMinSize(self.__voxelLabel .GetBestSize()) self.__volumeLabel.SetMinSize(self.__volumeLabel.GetBestSize()) self.__column1 .SetMinSize(self.__column1 .GetBestSize()) self.__column2 .SetMinSize(self.__column2 .GetBestSize()) self.__info .SetMinSize((100, 100)) # Keyboard navigation - see FSLeyesPanel self.setNavOrder((self.__worldX, self.__worldY, self.__worldZ, self.__voxelX, self.__voxelY, self.__voxelZ, self.__volume)) self.Layout() self.__minSize = self.__sizer.GetMinSize() self.SetMinSize(self.__minSize)
def _test_FloatSpinCtrl_changeRange(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame) _test_widget_changeRange(spin)
def _test_FloatSpinCtrl_logic_integer(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame, style=floatspin.FSC_INTEGER) _test_widget_logic_integer(spin)
def _test_FloatSpinCtrl_logic(): frame = wx.GetApp().GetTopWindow() spin = floatspin.FloatSpinCtrl(frame) _test_widget_logic(spin)
def __init__(self, parent, title, shape, pixdim): """Create a ``ResampleDialog``. :arg parent: ``wx`` parent object :arg title: Dialog title :arg shape: The original image shape (a tuple of three integers) :arg pixdim: The original image pixdims (a tuple of three floats) """ wx.Dialog.__init__(self, parent, title=title, style=wx.DEFAULT_DIALOG_STYLE) self.__oldShape = tuple(shape) self.__oldPixdim = tuple(pixdim) self.__ok = wx.Button(self, id=wx.ID_OK) self.__reset = wx.Button(self) self.__cancel = wx.Button(self, id=wx.ID_CANCEL) self.__ok.SetLabel(strings.labels[self, 'ok']) self.__reset.SetLabel(strings.labels[self, 'reset']) self.__cancel.SetLabel(strings.labels[self, 'cancel']) voxargs = {'minValue': 1, 'maxValue': 9999, 'increment': 1, 'width': 6} pixargs = { 'minValue': 0.001, 'maxValue': 50, 'increment': 0.5, 'width': 6 } strvox = ['{:d}'.format(p) for p in shape] strpix = ['{:0.2f}'.format(p) for p in pixdim] self.__origVoxLabel = wx.StaticText(self) self.__origPixLabel = wx.StaticText(self) self.__voxLabel = wx.StaticText(self) self.__pixLabel = wx.StaticText(self) self.__origVoxLabel.SetLabel(strings.labels[self, 'origVoxels']) self.__origPixLabel.SetLabel(strings.labels[self, 'origPixdims']) self.__voxLabel.SetLabel(strings.labels[self, 'newVoxels']) self.__pixLabel.SetLabel(strings.labels[self, 'newPixdims']) self.__origVoxx = wx.StaticText(self, label=strvox[0]) self.__origVoxy = wx.StaticText(self, label=strvox[1]) self.__origVoxz = wx.StaticText(self, label=strvox[2]) self.__origPixx = wx.StaticText(self, label=strpix[0]) self.__origPixy = wx.StaticText(self, label=strpix[1]) self.__origPixz = wx.StaticText(self, label=strpix[2]) self.__voxx = floatspin.FloatSpinCtrl(self, value=shape[0], **voxargs) self.__voxy = floatspin.FloatSpinCtrl(self, value=shape[1], **voxargs) self.__voxz = floatspin.FloatSpinCtrl(self, value=shape[2], **voxargs) self.__pixx = floatspin.FloatSpinCtrl(self, value=pixdim[0], **pixargs) self.__pixy = floatspin.FloatSpinCtrl(self, value=pixdim[1], **pixargs) self.__pixz = floatspin.FloatSpinCtrl(self, value=pixdim[2], **pixargs) self.__interpChoices = ['linear', 'nearest', 'cubic'] self.__dtypeChoices = [('float', np.float32), ('uchar', np.uint8), ('sshort', np.int16), ('sint', np.int32), ('double', np.float64)] self.__interpLabels = [ strings.labels[self, c] for c in self.__interpChoices ] self.__dtypeLabels = [ strings.labels[self, c[0]] for c in self.__dtypeChoices ] self.__interpLabel = wx.StaticText(self) self.__dtypeLabel = wx.StaticText(self) self.__smoothLabel = wx.StaticText(self) self.__interp = wx.Choice(self, choices=self.__interpLabels) self.__dtype = wx.Choice(self, choices=self.__dtypeLabels) self.__smooth = wx.CheckBox(self) self.__interp.SetSelection(0) self.__dtype.SetSelection(0) self.__smooth.SetValue(True) self.__interpLabel.SetLabel(strings.labels[self, 'interpolation']) self.__dtypeLabel.SetLabel(strings.labels[self, 'dtype']) self.__smoothLabel.SetLabel(strings.labels[self, 'smoothing']) self.__interp.SetToolTip( wx.ToolTip(tooltips.misc[self, 'interpolation'])) self.__interpLabel.SetToolTip( wx.ToolTip(tooltips.misc[self, 'interpolation'])) self.__dtype.SetToolTip(wx.ToolTip(tooltips.misc[self, 'dtype'])) self.__dtypeLabel.SetToolTip(wx.ToolTip(tooltips.misc[self, 'dtype'])) self.__smooth.SetToolTip(wx.ToolTip(tooltips.misc[self, 'smoothing'])) self.__smoothLabel.SetToolTip( wx.ToolTip(tooltips.misc[self, 'smoothing'])) self.__labelSizer = wx.BoxSizer(wx.HORIZONTAL) self.__xrowSizer = wx.BoxSizer(wx.HORIZONTAL) self.__yrowSizer = wx.BoxSizer(wx.HORIZONTAL) self.__zrowSizer = wx.BoxSizer(wx.HORIZONTAL) self.__interpSizer = wx.BoxSizer(wx.HORIZONTAL) self.__dtypeSizer = wx.BoxSizer(wx.HORIZONTAL) self.__smoothSizer = wx.BoxSizer(wx.HORIZONTAL) self.__btnSizer = wx.BoxSizer(wx.HORIZONTAL) self.__mainSizer = wx.BoxSizer(wx.VERTICAL) self.__labelSizer.Add((10, 10), flag=wx.EXPAND) self.__labelSizer.Add(self.__origVoxLabel, flag=wx.EXPAND, proportion=1) self.__labelSizer.Add((10, 10), flag=wx.EXPAND) self.__labelSizer.Add(self.__origPixLabel, flag=wx.EXPAND, proportion=1) self.__labelSizer.Add((10, 10), flag=wx.EXPAND) self.__labelSizer.Add(self.__voxLabel, flag=wx.EXPAND, proportion=1) self.__labelSizer.Add((10, 10), flag=wx.EXPAND) self.__labelSizer.Add(self.__pixLabel, flag=wx.EXPAND, proportion=1) self.__labelSizer.Add((10, 10), flag=wx.EXPAND) self.__xrowSizer.Add((10, 10), flag=wx.EXPAND) self.__xrowSizer.Add(self.__origVoxx, flag=wx.EXPAND, proportion=1) self.__xrowSizer.Add((10, 10), flag=wx.EXPAND) self.__xrowSizer.Add(self.__origPixx, flag=wx.EXPAND, proportion=1) self.__xrowSizer.Add((10, 10), flag=wx.EXPAND) self.__xrowSizer.Add(self.__voxx, flag=wx.EXPAND, proportion=1) self.__xrowSizer.Add((10, 10), flag=wx.EXPAND) self.__xrowSizer.Add(self.__pixx, flag=wx.EXPAND, proportion=1) self.__xrowSizer.Add((10, 10), flag=wx.EXPAND) self.__yrowSizer.Add((10, 10), flag=wx.EXPAND) self.__yrowSizer.Add(self.__origVoxy, flag=wx.EXPAND, proportion=1) self.__yrowSizer.Add((10, 10), flag=wx.EXPAND) self.__yrowSizer.Add(self.__origPixy, flag=wx.EXPAND, proportion=1) self.__yrowSizer.Add((10, 10), flag=wx.EXPAND) self.__yrowSizer.Add(self.__voxy, flag=wx.EXPAND, proportion=1) self.__yrowSizer.Add((10, 10), flag=wx.EXPAND) self.__yrowSizer.Add(self.__pixy, flag=wx.EXPAND, proportion=1) self.__yrowSizer.Add((10, 10), flag=wx.EXPAND) self.__zrowSizer.Add((10, 10), flag=wx.EXPAND) self.__zrowSizer.Add(self.__origVoxz, flag=wx.EXPAND, proportion=1) self.__zrowSizer.Add((10, 10), flag=wx.EXPAND) self.__zrowSizer.Add(self.__origPixz, flag=wx.EXPAND, proportion=1) self.__zrowSizer.Add((10, 10), flag=wx.EXPAND) self.__zrowSizer.Add(self.__voxz, flag=wx.EXPAND, proportion=1) self.__zrowSizer.Add((10, 10), flag=wx.EXPAND) self.__zrowSizer.Add(self.__pixz, flag=wx.EXPAND, proportion=1) self.__zrowSizer.Add((10, 10), flag=wx.EXPAND) self.__interpSizer.Add((50, 1), flag=wx.EXPAND) self.__interpSizer.Add(self.__interpLabel, flag=wx.EXPAND) self.__interpSizer.Add((10, 1), flag=wx.EXPAND) self.__interpSizer.Add(self.__interp, flag=wx.EXPAND) self.__interpSizer.Add((10, 1), flag=wx.EXPAND, proportion=1) self.__dtypeSizer.Add((50, 1), flag=wx.EXPAND) self.__dtypeSizer.Add(self.__dtypeLabel, flag=wx.EXPAND) self.__dtypeSizer.Add((10, 1), flag=wx.EXPAND) self.__dtypeSizer.Add(self.__dtype, flag=wx.EXPAND) self.__dtypeSizer.Add((10, 1), flag=wx.EXPAND, proportion=1) self.__smoothSizer.Add((50, 1), flag=wx.EXPAND) self.__smoothSizer.Add(self.__smoothLabel, flag=wx.EXPAND) self.__smoothSizer.Add((10, 1), flag=wx.EXPAND) self.__smoothSizer.Add(self.__smooth, flag=wx.EXPAND) self.__smoothSizer.Add((10, 1), flag=wx.EXPAND, proportion=1) self.__btnSizer.Add((10, 1), flag=wx.EXPAND, proportion=1) self.__btnSizer.Add(self.__ok, flag=wx.EXPAND) self.__btnSizer.Add((10, 1), flag=wx.EXPAND) self.__btnSizer.Add(self.__reset, flag=wx.EXPAND) self.__btnSizer.Add((10, 1), flag=wx.EXPAND) self.__btnSizer.Add(self.__cancel, flag=wx.EXPAND) self.__btnSizer.Add((10, 1), flag=wx.EXPAND, proportion=1) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.__mainSizer.Add(self.__labelSizer, flag=wx.EXPAND) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.__mainSizer.Add(self.__xrowSizer, flag=wx.EXPAND) self.__mainSizer.Add(self.__yrowSizer, flag=wx.EXPAND) self.__mainSizer.Add(self.__zrowSizer, flag=wx.EXPAND) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.__mainSizer.Add(self.__interpSizer, flag=wx.EXPAND) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.__mainSizer.Add(self.__dtypeSizer, flag=wx.EXPAND) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.__mainSizer.Add(self.__smoothSizer, flag=wx.EXPAND) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.__mainSizer.Add(self.__btnSizer, flag=wx.EXPAND) self.__mainSizer.Add((10, 10), flag=wx.EXPAND) self.SetSizer(self.__mainSizer) self.__ok.Bind(wx.EVT_BUTTON, self.__onOk) self.__reset.Bind(wx.EVT_BUTTON, self.__onReset) self.__cancel.Bind(wx.EVT_BUTTON, self.__onCancel) self.__voxx.Bind(floatspin.EVT_FLOATSPIN, self.__onVoxel) self.__voxy.Bind(floatspin.EVT_FLOATSPIN, self.__onVoxel) self.__voxz.Bind(floatspin.EVT_FLOATSPIN, self.__onVoxel) self.__pixx.Bind(floatspin.EVT_FLOATSPIN, self.__onPixdim) self.__pixy.Bind(floatspin.EVT_FLOATSPIN, self.__onPixdim) self.__pixz.Bind(floatspin.EVT_FLOATSPIN, self.__onPixdim) self.__ok.SetDefault() self.Layout() self.Fit() self.CentreOnParent()
def _makeSpinBox(parent, hasProps, propObj, propVal, mousewheel, increment, spinWidth): """Used by the :func:`_Number` function. Creates a :class:`.FloatSpinCtrl` and binds it to the given :class:`.PropertyValue` instance. See :func:`_Number` for details on the parameters. """ if not isinstance(propObj, (ptypes.Int, ptypes.Real)): raise TypeError('Unrecognised property type: {}'.format( propObj.__class__.__name__)) def getMinVal(val): if val is not None: return val if isinstance(propObj, ptypes.Int): return -2**31 + 1 elif isinstance(propObj, ptypes.Real): return -sys.float_info.max def getMaxVal(val): if val is not None: return val if isinstance(propObj, ptypes.Int): return 2**31 - 1 elif isinstance(propObj, ptypes.Real): return sys.float_info.max value = propVal.get() minval = propVal.getAttribute('minval') maxval = propVal.getAttribute('maxval') limited = propVal.getAttribute('clamped') isRange = (minval is not None) and (maxval is not None) minval = getMinVal(minval) maxval = getMaxVal(maxval) if mousewheel: style = floatspin.FSC_MOUSEWHEEL else: style = 0 if isinstance(propObj, ptypes.Int): style |= floatspin.FSC_INTEGER if not limited: style |= floatspin.FSC_NO_LIMIT if increment is None: if isinstance(propObj, ptypes.Int): increment = 1 elif isinstance(propObj, ptypes.Real): if isRange: increment = (maxval - minval) / 100.0 else: increment = 0.5 spin = floatspin.FloatSpinCtrl(parent, value=value, minValue=minval, maxValue=maxval, increment=increment, style=style, width=spinWidth) widgets._propBind(hasProps, propObj, propVal, spin, floatspin.EVT_FLOATSPIN) def updateRange(*a): minval = getMinVal(propVal.getAttribute('minval')) maxval = getMaxVal(propVal.getAttribute('maxval')) log.debug('Updating {} range from {}.{}: {} - {}'.format( type(spin).__name__, type(hasProps).__name__, propVal._name, minval, maxval)) spin.SetRange(minval, maxval) listenerName = 'widgets_number_py_updateRange_{}'.format(id(spin)) propVal.addAttributeListener(listenerName, updateRange, weak=False) def onDestroy(ev): propVal.removeAttributeListener(listenerName) ev.Skip() spin.Bind(wx.EVT_WINDOW_DESTROY, onDestroy) return spin
def __init__(self, parent, shape, pixdim, affine, dtype): """Create a ``NewImageDialog``. :arg parent: ``wx`` parent object :arg shape: Tuple of three initial shape values :arg pixdim: Tuple of three initial pixdim values :arg affine: Initial affine, assumed to be a ``(4, 4)`` ``numpy`` array :arg dtype: Initial ``numpy`` dtype. Must be one of ``float32``, ``float64``, ``uint8``, ``int16``, or ``int32``. """ if shape is None: shape = (100, 100, 100) if pixdim is None: pixdim = (1, 1, 1) if affine is None: affine = np.eye(4) if dtype is None: dtype = np.float32 dtypeLabels = ['float', 'uchar', 'sshort', 'sint', 'double'] dtypeValues = [np.float32, np.uint8, np.int16, np.int32, np.float64] dtypeLabels = [strings.labels[self, l] for l in dtypeLabels] if dtype in dtypeValues: dtype = dtypeValues.index(dtype) else: dtype = 0 self.__dtypeValues = dtypeValues wx.Dialog.__init__(self, parent, title=strings.titles[self], style=wx.DEFAULT_DIALOG_STYLE) dtypeLabel = strings.labels[self, 'dtype'] shapeLabel = strings.labels[self, 'shape'] pixdimLabel = strings.labels[self, 'pixdim'] affineLabel = strings.labels[self, 'affine'] linkLabel = strings.labels[self, 'link'] okLabel = strings.labels[self, 'ok'] cancelLabel = strings.labels[self, 'cancel'] self.__dtypeLabel = wx.StaticText(self, label=dtypeLabel) self.__shapeLabel = wx.StaticText(self, label=shapeLabel) self.__pixdimLabel = wx.StaticText(self, label=pixdimLabel) self.__affineLabel = wx.StaticText(self, label=affineLabel) self.__xLabel = wx.StaticText(self, label='X') self.__yLabel = wx.StaticText(self, label='Y') self.__zLabel = wx.StaticText(self, label='Z') self.__dtype = wx.Choice(self, choices=dtypeLabels) self.__ok = wx.Button(self, id=wx.ID_OK, label=okLabel) self.__cancel = wx.Button(self, id=wx.ID_CANCEL, label=cancelLabel) self.__dtype.SetSelection(dtype) shapewidgets = [] pixdimwidgets = [] for i in range(3): shapew = floatspin.FloatSpinCtrl(self, minValue=1, maxValue=2**64 - 1, increment=1, value=shape[i], style=floatspin.FSC_INTEGER) pixdimw = floatspin.FloatSpinCtrl(self, minValue=-100, maxValue=100, increment=0.5, value=pixdim[i]) shapewidgets.append(shapew) pixdimwidgets.append(pixdimw) self.__shapex = shapewidgets[0] self.__shapey = shapewidgets[1] self.__shapez = shapewidgets[2] self.__pixdimx = pixdimwidgets[0] self.__pixdimy = pixdimwidgets[1] self.__pixdimz = pixdimwidgets[2] self.__link = wx.CheckBox(self, label=linkLabel) self.__link.SetValue(True) self.__affine = wxgrid.Grid(self) self.__affine.SetDefaultEditor(wxgrid.GridCellFloatEditor(-1, 2)) self.__affine.CreateGrid(4, 4) self.__affine.HideRowLabels() self.__affine.HideColLabels() for i in range(4): self.__affine.SetColFormatFloat(i, -1, 2) self.affine = affine self.__mainSizer = wx.BoxSizer(wx.VERTICAL) self.__dtypeSizer = wx.BoxSizer(wx.HORIZONTAL) self.__affineSizer = wx.BoxSizer(wx.HORIZONTAL) self.__affineLblSizer = wx.BoxSizer(wx.HORIZONTAL) self.__shapepixSizer = wx.BoxSizer(wx.HORIZONTAL) self.__shapepixGrid = wx.FlexGridSizer(4, 3, 0, 0) self.__buttonSizer = wx.BoxSizer(wx.HORIZONTAL) self.__dtypeSizer.Add((1, 1), proportion=1) self.__dtypeSizer.Add(self.__dtypeLabel) self.__dtypeSizer.Add(self.__dtype) self.__dtypeSizer.Add((1, 1), proportion=1) self.__shapepixGrid.Add((1, 1)) self.__shapepixGrid.Add(self.__shapeLabel) self.__shapepixGrid.Add(self.__pixdimLabel) self.__shapepixGrid.Add(self.__xLabel) self.__shapepixGrid.Add(self.__shapex) self.__shapepixGrid.Add(self.__pixdimx) self.__shapepixGrid.Add(self.__yLabel) self.__shapepixGrid.Add(self.__shapey) self.__shapepixGrid.Add(self.__pixdimy) self.__shapepixGrid.Add(self.__zLabel) self.__shapepixGrid.Add(self.__shapez) self.__shapepixGrid.Add(self.__pixdimz) self.__shapepixSizer.Add((1, 1), proportion=1) self.__shapepixSizer.Add(self.__shapepixGrid) self.__shapepixSizer.Add((1, 1), proportion=1) self.__affineSizer.Add((1, 1), proportion=1) self.__affineSizer.Add(self.__affine) self.__affineSizer.Add((1, 1), proportion=1) self.__affineLblSizer.Add(self.__affineLabel) self.__affineLblSizer.Add((10, 1)) self.__affineLblSizer.Add(self.__link) self.__buttonSizer.Add((1, 1), proportion=1) self.__buttonSizer.Add(self.__ok) self.__buttonSizer.Add(self.__cancel) self.__buttonSizer.Add((1, 1), proportion=1) szargs = {'flag': wx.EXPAND | wx.LEFT | wx.RIGHT, 'border': 5} self.__mainSizer.Add((1, 10)) self.__mainSizer.Add(self.__dtypeSizer, **szargs) self.__mainSizer.Add((1, 10)) self.__mainSizer.Add(self.__shapepixSizer, **szargs) self.__mainSizer.Add((1, 10)) self.__mainSizer.Add(self.__affineLblSizer, **szargs) self.__mainSizer.Add((1, 10)) self.__mainSizer.Add(self.__affineSizer, **szargs) self.__mainSizer.Add((1, 10)) self.__mainSizer.Add(self.__buttonSizer, **szargs) self.__mainSizer.Add((1, 10)) self.SetSizer(self.__mainSizer) self.Layout() self.Fit() self.__ok.SetFocus() self.__pixdimx.Bind(floatspin.EVT_FLOATSPIN, self.__onPixdim) self.__pixdimy.Bind(floatspin.EVT_FLOATSPIN, self.__onPixdim) self.__pixdimz.Bind(floatspin.EVT_FLOATSPIN, self.__onPixdim) self.__affine.Bind(wxgrid.EVT_GRID_CELL_CHANGED, self.__onAffine) self.__link.Bind(wx.EVT_CHECKBOX, self.__onLink)