aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/openpyxl/styles/styleable.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/openpyxl/styles/styleable.py')
-rw-r--r--.venv/lib/python3.12/site-packages/openpyxl/styles/styleable.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/openpyxl/styles/styleable.py b/.venv/lib/python3.12/site-packages/openpyxl/styles/styleable.py
new file mode 100644
index 00000000..2703096d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/openpyxl/styles/styleable.py
@@ -0,0 +1,151 @@
+# Copyright (c) 2010-2024 openpyxl
+
+from copy import copy
+
+from .numbers import (
+ BUILTIN_FORMATS,
+ BUILTIN_FORMATS_MAX_SIZE,
+ BUILTIN_FORMATS_REVERSE,
+)
+from .proxy import StyleProxy
+from .cell_style import StyleArray
+from .named_styles import NamedStyle
+from .builtins import styles
+
+
+class StyleDescriptor:
+
+ def __init__(self, collection, key):
+ self.collection = collection
+ self.key = key
+
+ def __set__(self, instance, value):
+ coll = getattr(instance.parent.parent, self.collection)
+ if not getattr(instance, "_style"):
+ instance._style = StyleArray()
+ setattr(instance._style, self.key, coll.add(value))
+
+
+ def __get__(self, instance, cls):
+ coll = getattr(instance.parent.parent, self.collection)
+ if not getattr(instance, "_style"):
+ instance._style = StyleArray()
+ idx = getattr(instance._style, self.key)
+ return StyleProxy(coll[idx])
+
+
+class NumberFormatDescriptor:
+
+ key = "numFmtId"
+ collection = '_number_formats'
+
+ def __set__(self, instance, value):
+ coll = getattr(instance.parent.parent, self.collection)
+ if value in BUILTIN_FORMATS_REVERSE:
+ idx = BUILTIN_FORMATS_REVERSE[value]
+ else:
+ idx = coll.add(value) + BUILTIN_FORMATS_MAX_SIZE
+
+ if not getattr(instance, "_style"):
+ instance._style = StyleArray()
+ setattr(instance._style, self.key, idx)
+
+
+ def __get__(self, instance, cls):
+ if not getattr(instance, "_style"):
+ instance._style = StyleArray()
+ idx = getattr(instance._style, self.key)
+ if idx < BUILTIN_FORMATS_MAX_SIZE:
+ return BUILTIN_FORMATS.get(idx, "General")
+ coll = getattr(instance.parent.parent, self.collection)
+ return coll[idx - BUILTIN_FORMATS_MAX_SIZE]
+
+
+class NamedStyleDescriptor:
+
+ key = "xfId"
+ collection = "_named_styles"
+
+
+ def __set__(self, instance, value):
+ if not getattr(instance, "_style"):
+ instance._style = StyleArray()
+ coll = getattr(instance.parent.parent, self.collection)
+ if isinstance(value, NamedStyle):
+ style = value
+ if style not in coll:
+ instance.parent.parent.add_named_style(style)
+ elif value not in coll.names:
+ if value in styles: # is it builtin?
+ style = styles[value]
+ if style not in coll:
+ instance.parent.parent.add_named_style(style)
+ else:
+ raise ValueError("{0} is not a known style".format(value))
+ else:
+ style = coll[value]
+ instance._style = copy(style.as_tuple())
+
+
+ def __get__(self, instance, cls):
+ if not getattr(instance, "_style"):
+ instance._style = StyleArray()
+ idx = getattr(instance._style, self.key)
+ coll = getattr(instance.parent.parent, self.collection)
+ return coll.names[idx]
+
+
+class StyleArrayDescriptor:
+
+ def __init__(self, key):
+ self.key = key
+
+ def __set__(self, instance, value):
+ if instance._style is None:
+ instance._style = StyleArray()
+ setattr(instance._style, self.key, value)
+
+
+ def __get__(self, instance, cls):
+ if instance._style is None:
+ return False
+ return bool(getattr(instance._style, self.key))
+
+
+class StyleableObject:
+ """
+ Base class for styleble objects implementing proxy and lookup functions
+ """
+
+ font = StyleDescriptor('_fonts', "fontId")
+ fill = StyleDescriptor('_fills', "fillId")
+ border = StyleDescriptor('_borders', "borderId")
+ number_format = NumberFormatDescriptor()
+ protection = StyleDescriptor('_protections', "protectionId")
+ alignment = StyleDescriptor('_alignments', "alignmentId")
+ style = NamedStyleDescriptor()
+ quotePrefix = StyleArrayDescriptor('quotePrefix')
+ pivotButton = StyleArrayDescriptor('pivotButton')
+
+ __slots__ = ('parent', '_style')
+
+ def __init__(self, sheet, style_array=None):
+ self.parent = sheet
+ if style_array is not None:
+ style_array = StyleArray(style_array)
+ self._style = style_array
+
+
+ @property
+ def style_id(self):
+ if self._style is None:
+ self._style = StyleArray()
+ return self.parent.parent._cell_styles.add(self._style)
+
+
+ @property
+ def has_style(self):
+ if self._style is None:
+ return False
+ return any(self._style)
+