Skip to content

TextField

src.text_layers.TextField

Source code in src\text_layers.py
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
class TextField:
    FONT = CardFonts.TITLES
    FONT_ITALIC = CardFonts.RULES_ITALIC
    FONT_BOLD = CardFonts.RULES_BOLD

    def __init__(self, layer: ArtLayer, contents: str = "", **kwargs):
        """A generic TextField, which allows you to set a text layer's contents and text color.

        Args:
            layer: TextItem layer to insert contents.
            contents: Text contents to be inserted.
            color: Font color to use for this TextItem.

        Keyword Args:
            color: Color to apply to the text item.
            font: Font postScriptName to apply to the text item.
            font_mana: Font postScriptName to apply to mana symbol text.
            font_italic: Font postScriptName to apply to italicized text.
            font_bold: Font postScriptName to apply to bold text.
            reference: Reference layer to used for scaling operations.
        """
        self._kwargs = kwargs
        self._layer = layer
        self.contents = contents.replace(
            "\n", "\r")

    """
    * Keyword Arguments
    """

    @cached_property
    def kwargs(self) -> dict:
        """Contains optional parameters to modify text formatting behavior."""
        return self._kwargs

    @cached_property
    def kw_color(self) -> Optional[SolidColor]:
        """Color to apply to the TextItem."""
        return self.kwargs.get('color')

    @cached_property
    def kw_font(self) -> Optional[str]:
        """Font to apply to the root TextItem."""
        return self.kwargs.get('font')

    @cached_property
    def kw_font_mana(self) -> Optional[str]:
        """Font to apply to any mana symbols in the TextItem."""
        return self.kwargs.get('font_mana')

    @cached_property
    def kw_font_italic(self) -> Optional[str]:
        """Font to apply to any italicized text in the TextItem."""
        return self.kwargs.get('font_italic')

    @cached_property
    def kw_font_bold(self) -> Optional[str]:
        """Font to apply to any bold text in the TextItem."""
        return self.kwargs.get('font_bold')

    @cached_property
    def kw_symbol_map(self) -> dict[str, tuple[str, list[ColorObject]]]:
        """Symbol map to use for formatting mana symbols."""
        return self.kwargs.get('symbol_map', CON.symbol_map)

    """
    * Checks
    """

    @cached_property
    def is_text_layer(self) -> bool:
        """Checks if the layer provided is a TextLayer."""
        return bool(self.layer.kind == LayerKind.TextLayer)

    """
    * Core Objects
    """

    @cached_property
    def docref(self) -> Document:
        """The currently active Photoshop document."""
        return APP.activeDocument

    @cached_property
    def doc_selection(self) -> Selection:
        """The Selection object from the active document."""
        return self.docref.selection

    @property
    def layer(self) -> ArtLayer:
        """ArtLayer containing the TextItem."""
        return self._layer

    @cached_property
    def TI(self) -> TextItem:
        """The TextItem object within the ArtLayer."""
        return self.layer.textItem

    @cached_property
    def reference(self) -> Optional[ArtLayer]:
        """A reference layer, typically used for scaling the TextItem."""
        return self.kwargs.get('reference', None)

    @cached_property
    def reference_dims(self) -> Optional[type[LayerDimensions]]:
        """Optional[type[LayerDimensions]]: Dimensions of the scaling reference layer."""
        if isinstance(self.reference, ReferenceLayer):
            return self.reference.dims
        if self.reference:
            return get_layer_dimensions(self.reference)
        return None

    @property
    def input(self) -> str:
        """Raw contents provided to fill the TextItem."""
        return self.contents

    @cached_property
    def color(self) -> SolidColor:
        """A SolidColor object provided, or fallback on current TextItem color."""
        return self.kw_color or get_text_item_color(self.TI)

    @cached_property
    def font(self) -> str:
        """Font provided, or fallback on global constant."""
        return self.kw_font or CON.font_title

    """
    * Methods
    """

    def validate(self):
        """Ensure the Text Layer provided is valid."""
        if self.layer and self.is_text_layer:
            # Layer is valid, select and show it
            select_layer(self.layer, True)
            return True
        with suppress(Exception):
            # Layer provided doesn't exist or isn't a text layer
            name = self.layer.name if self.layer else '[Non-Layer]'
            print(f'Text Field class: {self.__class__.__name__}\n'
                  f'Invalid layer provided: {name}')
            self.layer.visible = False
        return False

    def execute(self):
        """Executes all text actions."""

        # Update TextItem contents
        self.TI.contents = self.input

        # Update color if it was provided manually
        if self.kw_color:
            self.TI.color = self.color

        # Update font manually if mismatch detected
        if self.font != self.FONT:
            self.TI.font = self.font

        # Change to English formatting if needed
        if CFG.force_english_formatting:
            self.TI.language = Language.EnglishUSA

Attributes

TI: TextItem

The TextItem object within the ArtLayer.

color: SolidColor

A SolidColor object provided, or fallback on current TextItem color.

doc_selection: Selection

The Selection object from the active document.

docref: Document

The currently active Photoshop document.

font: str

Font provided, or fallback on global constant.

input: str

Raw contents provided to fill the TextItem.

is_text_layer: bool

Checks if the layer provided is a TextLayer.

kw_color: Optional[SolidColor]

Color to apply to the TextItem.

kw_font: Optional[str]

Font to apply to the root TextItem.

kw_font_bold: Optional[str]

Font to apply to any bold text in the TextItem.

kw_font_italic: Optional[str]

Font to apply to any italicized text in the TextItem.

kw_font_mana: Optional[str]

Font to apply to any mana symbols in the TextItem.

kw_symbol_map: dict[str, tuple[str, list[ColorObject]]]

Symbol map to use for formatting mana symbols.

kwargs: dict

Contains optional parameters to modify text formatting behavior.

layer: ArtLayer

ArtLayer containing the TextItem.

reference: Optional[ArtLayer]

A reference layer, typically used for scaling the TextItem.

reference_dims: Optional[type[LayerDimensions]]

Optional[type[LayerDimensions]]: Dimensions of the scaling reference layer.

Functions

execute()

Executes all text actions.

Source code in src\text_layers.py
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
def execute(self):
    """Executes all text actions."""

    # Update TextItem contents
    self.TI.contents = self.input

    # Update color if it was provided manually
    if self.kw_color:
        self.TI.color = self.color

    # Update font manually if mismatch detected
    if self.font != self.FONT:
        self.TI.font = self.font

    # Change to English formatting if needed
    if CFG.force_english_formatting:
        self.TI.language = Language.EnglishUSA

validate()

Ensure the Text Layer provided is valid.

Source code in src\text_layers.py
187
188
189
190
191
192
193
194
195
196
197
198
199
def validate(self):
    """Ensure the Text Layer provided is valid."""
    if self.layer and self.is_text_layer:
        # Layer is valid, select and show it
        select_layer(self.layer, True)
        return True
    with suppress(Exception):
        # Layer provided doesn't exist or isn't a text layer
        name = self.layer.name if self.layer else '[Non-Layer]'
        print(f'Text Field class: {self.__class__.__name__}\n'
              f'Invalid layer provided: {name}')
        self.layer.visible = False
    return False