예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
    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)
예제 #8
0
def _test_FloatSpinCtrl_changeRange():
    frame = wx.GetApp().GetTopWindow()
    spin  = floatspin.FloatSpinCtrl(frame)
    _test_widget_changeRange(spin)
예제 #9
0
def _test_FloatSpinCtrl_logic_integer():
    frame = wx.GetApp().GetTopWindow()
    spin  = floatspin.FloatSpinCtrl(frame, style=floatspin.FSC_INTEGER)
    _test_widget_logic_integer(spin)
예제 #10
0
def _test_FloatSpinCtrl_logic():
    frame = wx.GetApp().GetTopWindow()
    spin  = floatspin.FloatSpinCtrl(frame)
    _test_widget_logic(spin)
예제 #11
0
    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()
예제 #12
0
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
예제 #13
0
    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)