diff --git a/src/db/db/dbPCellDeclaration.h b/src/db/db/dbPCellDeclaration.h index 1d68acce1..3687ef71a 100644 --- a/src/db/db/dbPCellDeclaration.h +++ b/src/db/db/dbPCellDeclaration.h @@ -70,7 +70,7 @@ public: * @brief The default constructor */ PCellParameterDeclaration () - : m_hidden (false), m_readonly (false), m_type (t_none), m_range() + : m_hidden (false), m_readonly (false), m_type (t_none) { // .. nothing yet .. } @@ -79,7 +79,7 @@ public: * @brief The constructor with a name */ PCellParameterDeclaration (const std::string &name) - : m_hidden (false), m_readonly (false), m_type (t_none), m_name (name), m_range() + : m_hidden (false), m_readonly (false), m_type (t_none), m_name (name) { // .. nothing yet .. } @@ -88,7 +88,7 @@ public: * @brief The constructor with a name, type and description */ PCellParameterDeclaration (const std::string &name, type t, const std::string &description) - : m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description), m_range() + : m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description) { // .. nothing yet .. } @@ -97,7 +97,7 @@ public: * @brief The constructor with a name, type, description and default value */ PCellParameterDeclaration (const std::string &name, type t, const std::string &description, const tl::Variant &def) - : m_default (def), m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description), m_range() + : m_default (def), m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description) { // .. nothing yet .. } @@ -106,7 +106,7 @@ public: * @brief The constructor with a name, type, description, default value and unit */ PCellParameterDeclaration (const std::string &name, type t, const std::string &description, const tl::Variant &def, const std::string &unit) - : m_default (def), m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description), m_unit (unit), m_range() + : m_default (def), m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description), m_unit (unit) { // .. nothing yet .. } @@ -115,7 +115,7 @@ public: * @brief The constructor with a name, type and description and choice values / choice descriptions */ PCellParameterDeclaration (const std::string &name, type t, const std::string &description, const std::vector &choices, const std::vector &choice_descriptions) - : m_choices (choices), m_choice_descriptions (choice_descriptions), m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description), m_range() + : m_choices (choices), m_choice_descriptions (choice_descriptions), m_hidden (false), m_readonly (false), m_type (t), m_name (name), m_description (description) { // .. nothing yet .. } @@ -249,53 +249,6 @@ public: } /** - * @brief A enum describing the action of range violated - */ - enum Action { - t_Reject = 1, // reject the parameter - t_Accept, // accept the parameter - t_Use_Default // use a default parameter (currently not supported) - }; - - void set_range (const tl::Variant& low, const tl::Variant& high, const tl::Variant& resolution, Action action = t_Reject) - { - m_range = Range(low, high, resolution, action); - } - - typedef struct _Range { - _Range() : - m_low(), - m_high(), - m_resolution(), - m_action(t_Reject) {} - - _Range(const tl::Variant& low, const tl::Variant& high, const tl::Variant& resolution, Action action = t_Reject) : - m_low(low), - m_high(high), - m_resolution(resolution), - m_action(action) {} - - bool operator== (const _Range& other) const - { - return - m_low == other.m_low && - m_high == other.m_high && - m_resolution == other.m_resolution && - m_action == other.m_action; - } - - tl::Variant m_low; - tl::Variant m_high; - tl::Variant m_resolution; - Action m_action; - } Range; - - const tl::optional& get_range() const - { - return m_range; - } - - /** * @brief Getter for the choice descriptions * * The choice descriptions correspond to choice values. The descriptions @@ -315,6 +268,56 @@ public: m_choice_descriptions = choice_descriptions; } + /** + * @brief Sets the minimum value + * + * The minimum value is a visual feature and limits the allowed values for numerical + * entry boxes. This applies to parameters of type int or double. The minimum value + * is not effective if choices are present. + * + * The minimum value is not enforced - for example there is no restriction implemented + * when setting values programmatically. + * + * Setting this attribute to "nil" (the default) implies "no limit". + */ + void set_min_value (const tl::Variant &min) + { + m_min_value = min; + } + + /** + * @brief Gets the minimum value (see \set_min_value) + */ + const tl::Variant &min_value () const + { + return m_min_value; + } + + /** + * @brief Sets the maximum value + * + * The maximum value is a visual feature and limits the allowed values for numerical + * entry boxes. This applies to parameters of type int or double. The maximum value + * is not effective if choices are present. + * + * The maximum value is not enforced - for example there is no restriction implemented + * when setting values programmatically. + * + * Setting this attribute to "nil" (the default) implies "no limit". + */ + void set_max_value (const tl::Variant &max) + { + m_max_value = max; + } + + /** + * @brief Gets the maximum value (see \set_max_value) + */ + const tl::Variant &max_value () const + { + return m_max_value; + } + /** * @brief Equality */ @@ -329,7 +332,8 @@ public: m_name == d.m_name && m_description == d.m_description && m_unit == d.m_unit && - m_range == d.m_range; + m_min_value == d.m_min_value && + m_max_value == d.m_max_value; } private: @@ -340,7 +344,7 @@ private: type m_type; std::string m_name; std::string m_description, m_unit; - tl::optional m_range; + tl::Variant m_min_value, m_max_value; }; /** diff --git a/src/db/db/gsiDeclDbLibrary.cc b/src/db/db/gsiDeclDbLibrary.cc index 2f4c57c11..b73829897 100644 --- a/src/db/db/gsiDeclDbLibrary.cc +++ b/src/db/db/gsiDeclDbLibrary.cc @@ -921,17 +921,43 @@ Class decl_PCellParameterDeclaration ("db", "PCel "entry field in the parameter user interface.\n" "If a range is already set for this parameter the choice will not be added and a warning message is showed.\n" ) + - gsi::method_ext ("set_range", &set_range, gsi::arg ("low"), gsi::arg ("high"), gsi::arg ("resolution"), gsi::arg ("action"), - "@brief Set a range constraint\n" - "This method will set a range constraint to the parameter with 'low' and 'high' as minimum and maximum value.\n" - "This range constraint will only be set if the parameter-, the low- and the high-type are numeric.\n" - "If a choice is already set for this parameter the range will not be set and a warning message is showed.\n" - "The optional parameter 'resolution' will give a desired resolution value (currently not used).\n" - "The optional parameter 'action' determines the action to be invoked.\n" - "This action can be one of three values: REJECT, ACCEPT, USE_DEFAULT. If this failure action\n" - "parameter is not specified, then it will be REJECT by default.\n" - "If a range constraint is violated this parameter is marked wrong with violation hint in the\n" - "parameter user interface.\n" + gsi::method ("min_value", &db::PCellParameterDeclaration::min_value, + "@brief Gets the minimum value allowed\n" + "See \\min_value= for a description of this attribute.\n" + "\n" + "This attribute has been added in version 0.29." + ) + + gsi::method ("min_value=", &db::PCellParameterDeclaration::set_min_value, gsi::arg ("value"), + "@brief Sets the minimum value allowed\n" + "The minimum value is a visual feature and limits the allowed values for numerical\n" + "entry boxes. This applies to parameters of type int or double. The minimum value\n" + "is not effective if choices are present.\n" + "\n" + "The minimum value is not enforced - for example there is no restriction implemented\n" + "when setting values programmatically.\n" + "\n" + "Setting this attribute to \"nil\" (the default) implies \"no limit\".\n" + "\n" + "This attribute has been added in version 0.29." + ) + + gsi::method ("max_value", &db::PCellParameterDeclaration::max_value, + "@brief Gets the maximum value allowed\n" + "See \\max_value= for a description of this attribute.\n" + "\n" + "This attribute has been added in version 0.29." + ) + + gsi::method ("max_value=", &db::PCellParameterDeclaration::set_max_value, gsi::arg ("value"), + "@brief Sets the maximum value allowed\n" + "The maximum value is a visual feature and limits the allowed values for numerical\n" + "entry boxes. This applies to parameters of type int or double. The maximum value\n" + "is not effective if choices are present.\n" + "\n" + "The maximum value is not enforced - for example there is no restriction implemented\n" + "when setting values programmatically.\n" + "\n" + "Setting this attribute to \"nil\" (the default) implies \"no limit\".\n" + "\n" + "This attribute has been added in version 0.29." ) + gsi::method ("choice_values", &db::PCellParameterDeclaration::get_choices, "@brief Returns a list of choice values\n" diff --git a/src/edt/edt/edtPCellParametersPage.cc b/src/edt/edt/edtPCellParametersPage.cc index 7d9c2e4cb..69563b3c0 100644 --- a/src/edt/edt/edtPCellParametersPage.cc +++ b/src/edt/edt/edtPCellParametersPage.cc @@ -398,17 +398,15 @@ PCellParametersPage::setup (lay::LayoutViewBase *view, int cv_index, const db::P inner_grid->addWidget (icon_label, row, 0); m_icon_widgets.push_back (icon_label); m_all_widgets.back ().push_back (icon_label); + std::string range; - if (p->get_range().has_value()) - { - const tl::Variant& low(p->get_range().value().m_low); - const tl::Variant& high(p->get_range().value().m_high); - - range = tl::sprintf( - " [%s, %s]" , - low.is_nil() ? "-\u221e" : low.to_string(), - high.is_nil() ? "\u221e" : high.to_string()); + if (! p->min_value ().is_nil () || ! p->max_value ().is_nil ()) { + range = tl::sprintf ( + " [%s, %s]" , + p->min_value ().is_nil () ? "-\u221e" /*infinity*/ : p->min_value ().to_string (), + p->max_value ().is_nil () ? "\u221e" /*infinity*/ : p->max_value ().to_string () + ); } if (p->get_type () != db::PCellParameterDeclaration::t_callback) { @@ -1109,19 +1107,14 @@ PCellParametersPage::states_from_parameters (db::ParameterStates &states, const } void -PCellParametersPage::check_range(const tl::Variant& value, const db::PCellParameterDeclaration::Range& range) +PCellParametersPage::check_range (const tl::Variant &value, const db::PCellParameterDeclaration &decl) { - if (db::PCellParameterDeclaration::Action(range.m_action) == db::PCellParameterDeclaration::t_Reject) - { - if (!range.m_low.is_nil() && value < range.m_low) - { - throw tl::Exception(tl::to_string (tr("Range violation: value < low"))); - } + if (! decl.min_value ().is_nil () && value < decl.min_value ()) { + throw tl::Exception (tl::sprintf (tl::to_string (tr ("The value is below the minimum allowed value: given value is %s, minimum value is %s")), value.to_string (), decl.min_value ().to_string ())); + } - if (!range.m_high.is_nil() && range.m_high < value) - { - throw tl::Exception(tl::to_string (tr("Range violation: value > high"))); - } + if (! decl.max_value ().is_nil () && value > decl.max_value ()) { + throw tl::Exception (tl::sprintf (tl::to_string (tr ("The value is above the maximum allowed value: given value is %s, maximum value is %s")), value.to_string (), decl.max_value ().to_string ())); } } diff --git a/src/edt/edt/edtPCellParametersPage.h b/src/edt/edt/edtPCellParametersPage.h index 0e961b8e1..a7b528371 100644 --- a/src/edt/edt/edtPCellParametersPage.h +++ b/src/edt/edt/edtPCellParametersPage.h @@ -181,7 +181,7 @@ private: void get_parameters_internal (db::ParameterStates &states, bool &edit_error); std::vector parameter_from_states (const db::ParameterStates &states) const; void states_from_parameters (db::ParameterStates &states, const std::vector ¶meters); - void check_range(const tl::Variant& value, const db::PCellParameterDeclaration::Range& range); + void check_range (const tl::Variant& value, const db::PCellParameterDeclaration &decl); }; } diff --git a/src/gsi/gsi/gsiTypes.h b/src/gsi/gsi/gsiTypes.h index 250a8db2c..cf02ea391 100644 --- a/src/gsi/gsi/gsiTypes.h +++ b/src/gsi/gsi/gsiTypes.h @@ -35,7 +35,6 @@ #include #include #include -#include #if defined(HAVE_QT) #include