Source code for pyface.data_view.value_types.numeric_value

# (C) Copyright 2005-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!

import locale
from math import inf

from traits.api import Callable, Float

from pyface.data_view.data_view_errors import DataViewSetError
from .editable_value import EditableValue


[docs]def format_locale(value): return "{:n}".format(value)
[docs]class NumericValue(EditableValue): """ Data channels for a numeric value. """ #: The minimum value for the numeric value. minimum = Float(-inf) #: The maximum value for the numeric value. maximum = Float(inf) #: A function that converts to the numeric type. evaluate = Callable() #: A function that converts the required type to a string for display. format = Callable(format_locale, update_value_type=True) #: A function that converts the required type from a display string. unformat = Callable(locale.delocalize)
[docs] def is_valid(self, model, row, column, value): """ Whether or not the value within the specified range. Parameters ---------- model : AbstractDataModel The data model holding the data. row : sequence of int The row in the data model being queried. column : sequence of int The column in the data model being queried. value : Any The value to validate. Returns ------- is_valid : bool Whether or not the value is valid. """ try: return self.minimum <= value <= self.maximum except Exception: return False
[docs] def get_editor_value(self, model, row, column): """ Get the numerical value for the editor to use. This uses the evaluate method to convert the underlying value to a number. Parameters ---------- model : AbstractDataModel The data model holding the data. row : sequence of int The row in the data model being queried. column : sequence of int The column in the data model being queried. Returns ------- editor_value : number Whether or not the value is editable. """ # evaluate is needed to convert numpy types to python types so # Qt recognises them return self.evaluate(model.get_value(row, column))
[docs] def get_text(self, model, row, column): """ Get the display text from the underlying value. Parameters ---------- model : AbstractDataModel The data model holding the data. row : sequence of int The row in the data model being queried. column : sequence of int The column in the data model being queried. Returns ------- text : str The text to display. """ return self.format(model.get_value(row, column))
[docs] def set_text(self, model, row, column, text): """ Set the text of the underlying value. Parameters ---------- model : AbstractDataModel The data model holding the data. row : sequence of int The row in the data model being queried. column : sequence of int The column in the data model being queried. text : str The text to set. Raises ------- DataViewSetError If the value cannot be set. """ try: value = self.evaluate(self.unformat(text)) except ValueError: raise DataViewSetError( "Can't evaluate value: {!r}".format(text) ) self.set_editor_value(model, row, column, value)
[docs]class IntValue(NumericValue): """ Data channels for an integer value. """ evaluate = Callable(int)
[docs]class FloatValue(NumericValue): """ Data channels for a floating point value. """ evaluate = Callable(float)