magscope.settings
=================

.. py:module:: magscope.settings


Attributes
----------

.. autoapisummary::

   magscope.settings.DEFAULT_GUI_ACCENT_COLOR
   magscope.settings.GUI_ACCENT_COLOR_SETTING
   magscope.settings.GUI_LIVE_PLOT_PROGRESS_BAR_SETTING
   magscope.settings.PREFERENCES_BUNDLE_VERSION
   magscope.settings.TRACKING_OPTIONS_QSETTINGS_GROUP
   magscope.settings.TRACKING_OPTIONS_QSETTINGS_KEY
   magscope.settings._HEX_COLOR_RE
   magscope.settings.DEFAULT_TRACKING_OPTIONS


Classes
-------

.. autoapisummary::

   magscope.settings.SettingSpec
   magscope.settings.MagScopeSettings


Functions
---------

.. autoapisummary::

   magscope.settings.normalize_hex_color
   magscope.settings.default_tracking_options
   magscope.settings._coerce_tracking_int_value
   magscope.settings._coerce_tracking_float_value
   magscope.settings._coerce_tracking_bool_value
   magscope.settings.tracking_options_from_mapping
   magscope.settings.tracking_options_from_qsettings
   magscope.settings.save_tracking_options_to_qsettings
   magscope.settings.build_preferences_bundle
   magscope.settings.load_preferences_bundle_mapping
   magscope.settings.export_preferences_bundle
   magscope.settings.import_preferences_bundle


Module Contents
---------------

.. py:data:: DEFAULT_GUI_ACCENT_COLOR
   :value: '#78c7ff'


.. py:data:: GUI_ACCENT_COLOR_SETTING
   :value: 'gui accent color'


.. py:data:: GUI_LIVE_PLOT_PROGRESS_BAR_SETTING
   :value: 'gui live plot progress bar'


.. py:data:: PREFERENCES_BUNDLE_VERSION
   :value: 1


.. py:data:: TRACKING_OPTIONS_QSETTINGS_GROUP
   :value: 'TrackingOptions'


.. py:data:: TRACKING_OPTIONS_QSETTINGS_KEY
   :value: 'options_yaml'


.. py:data:: _HEX_COLOR_RE

.. py:data:: DEFAULT_TRACKING_OPTIONS
   :type:  dict[str, Any]

.. py:function:: normalize_hex_color(value: str) -> str

.. py:function:: default_tracking_options() -> dict[str, Any]

.. py:function:: _coerce_tracking_int_value(raw: Any, *, name: str, fallback: int, minimum: int | None = None, enforce_odd: bool = False) -> int

.. py:function:: _coerce_tracking_float_value(raw: Any, *, name: str, fallback: float, minimum: float | None = None) -> float

.. py:function:: _coerce_tracking_bool_value(raw: Any, *, fallback: bool) -> bool

.. py:function:: tracking_options_from_mapping(loaded: Any) -> dict[str, Any]

.. py:function:: tracking_options_from_qsettings() -> dict[str, Any]

.. py:function:: save_tracking_options_to_qsettings(options: Mapping[str, Any]) -> None

.. py:function:: build_preferences_bundle(*, magscope_settings: MagScopeSettings, tracking_options: Mapping[str, Any], appearance_layout: Mapping[str, Any] | None = None) -> dict[str, Any]

.. py:function:: load_preferences_bundle_mapping(data: Any) -> dict[str, Any]

.. py:function:: export_preferences_bundle(path: str | os.PathLike[str], *, magscope_settings: MagScopeSettings, tracking_options: Mapping[str, Any], appearance_layout: Mapping[str, Any] | None = None) -> None

.. py:function:: import_preferences_bundle(path: str | os.PathLike[str]) -> dict[str, Any]

.. py:class:: SettingSpec

   .. py:attribute:: key
      :type:  str


   .. py:attribute:: value_type
      :type:  type | tuple[type, Ellipsis]


   .. py:attribute:: default
      :type:  Any | None
      :value: None



   .. py:attribute:: display_name
      :type:  str | None
      :value: None



   .. py:attribute:: minimum
      :type:  float | None
      :value: None



   .. py:attribute:: maximum
      :type:  float | None
      :value: None



   .. py:attribute:: must_be_even
      :type:  bool
      :value: False



   .. py:attribute:: validator
      :type:  Callable[[Any], Any] | None
      :value: None



   .. py:method:: coerce(value: Any) -> Any


   .. py:method:: default_value() -> Any


   .. py:property:: _candidate_types
      :type: tuple[type, Ellipsis]



   .. py:property:: label
      :type: str



.. py:class:: MagScopeSettings(values: Mapping[str, Any] | None = None, *, persistence_available: bool = True, persistence_enabled: bool = False)

   Bases: :py:obj:`MutableMapping`\ [\ :py:obj:`str`\ , :py:obj:`Any`\ ]


   A MutableMapping is a generic container for associating
   key/value pairs.

   This class provides concrete generic implementations of all
   methods except for __getitem__, __setitem__, __delitem__,
   __iter__, and __len__.


   .. py:attribute:: _QSETTINGS_ORGANIZATION
      :value: 'MagScope'



   .. py:attribute:: _QSETTINGS_APPLICATION
      :value: 'MagScope'



   .. py:attribute:: _QSETTINGS_GROUP
      :value: 'MagScopeSettings'



   .. py:attribute:: _MAG_SCOPE_PANEL_EXCLUDED_KEYS


   .. py:attribute:: _SETTING_SPECS
      :type:  dict[str, SettingSpec]


   .. py:attribute:: _persistence_enabled
      :value: False



   .. py:attribute:: _persistence_listeners
      :type:  list[Callable[[MagScopeSettings], None]]
      :value: []



   .. py:attribute:: persistence_available
      :value: True



   .. py:attribute:: _values
      :type:  dict[str, Any]


   .. py:method:: _load_defaults() -> dict[str, Any]
      :classmethod:



   .. py:method:: _qsettings() -> PyQt6.QtCore.QSettings
      :classmethod:



   .. py:method:: _load_qsettings_values() -> dict[str, Any]


   .. py:method:: _update_persistence_availability(available: bool) -> None


   .. py:method:: add_persistence_listener(callback: Callable[[MagScopeSettings], None]) -> None


   .. py:method:: from_qsettings(values: Mapping[str, Any] | None = None) -> MagScopeSettings
      :classmethod:



   .. py:method:: save_to_qsettings() -> None


   .. py:method:: reset_to_defaults() -> None


   .. py:method:: to_dict() -> dict[str, Any]


   .. py:method:: clone() -> MagScopeSettings


   .. py:method:: persistent_copy() -> MagScopeSettings


   .. py:method:: _coerce_setting(key: str, value: Any) -> Any


   .. py:method:: update(mapping: Mapping[str, Any] | Iterable[tuple[str, Any]] = (), **kwargs: Any) -> None

      D.update([E, ]**F) -> None.  Update D from mapping/iterable E and F.
      If E present and has a .keys() method, does:     for k in E.keys(): D[k] = E[k]
      If E present and lacks .keys() method, does:     for (k, v) in E: D[k] = v
      In either case, this is followed by: for k, v in F.items(): D[k] = v



   .. py:method:: __getitem__(key: str) -> Any


   .. py:method:: __setitem__(key: str, value: Any) -> None


   .. py:method:: __delitem__(key: str) -> None


   .. py:method:: __iter__()


   .. py:method:: __len__()


   .. py:method:: export_yaml(path: str | os.PathLike[str]) -> None


   .. py:method:: import_yaml(path: str | os.PathLike[str]) -> MagScopeSettings
      :classmethod:



   .. py:method:: spec_for(key: str) -> SettingSpec
      :classmethod:



   .. py:method:: defined_keys() -> Iterable[str]
      :classmethod:



   .. py:method:: magscope_panel_keys() -> Iterable[str]
      :classmethod:



