Skip to content

Commit 0b58c33

Browse files
committed
Prevent Station levels from shrinking too much vertically and fix Adventure text positioning when using fixed font size
1 parent 56ce7e6 commit 0b58c33

1 file changed

Lines changed: 45 additions & 32 deletions

File tree

py/borderless_showcase.py

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
from photoshop.api._layerSet import LayerSet
88
from photoshop.api.enumerations import ElementPlacement
99

10-
from src import APP, CFG
10+
from src import CFG
1111
from src.cards import strip_reminder_text
1212
from src.enums.layers import LAYERS
1313
from src.enums.mtg import Rarity
1414
from src.enums.settings import BorderlessTextbox
15-
from src.helpers.bounds import LayerDimensions, get_layer_dimensions
15+
from src.helpers.bounds import (
16+
LayerDimensions,
17+
get_group_dimensions,
18+
get_layer_dimensions,
19+
)
1620
from src.helpers.colors import GradientConfig, get_pinline_gradient, get_rgb
1721
from src.helpers.effects import apply_fx
1822
from src.helpers.layers import get_reference_layer, getLayer, getLayerSet, select_layer
@@ -635,13 +639,18 @@ def textbox_reference(self) -> ReferenceLayer | None:
635639
requirement_group = self.station_requirement_groups[i]
636640
pt_group = self.station_pt_groups[i]
637641

642+
dims_req_group = get_group_dimensions(requirement_group)
643+
638644
sized = self.adjust_textbox_for_font_size(
639645
base_text_layer=level_text,
640646
base_textbox_reference=textbox_ref,
641647
base_text_wrap_reference=level_text_ref,
642648
divider_layer=None,
643649
oracle_text=details["ability"],
644650
flavor_text=None,
651+
min_top=textbox_ref.dims["bottom"]
652+
- dims_req_group["height"]
653+
- self.rules_text_padding,
645654
alignment_dimension=None,
646655
vertical_padding=(0, self.rules_text_padding / 2),
647656
)
@@ -656,6 +665,8 @@ def textbox_reference(self) -> ReferenceLayer | None:
656665
adjusted_text_layers.insert(0, text_layer)
657666

658667
text_ref = sized[1]
668+
dims_req_group = get_group_dimensions(requirement_group)
669+
next_bottom = min(text_ref.dims["top"], dims_req_group["top"])
659670
next_ref = (
660671
self.textbox_reference_base.duplicate(
661672
self.textbox_reference_base,
@@ -666,8 +677,8 @@ def textbox_reference(self) -> ReferenceLayer | None:
666677
)
667678
temp_shape = create_shape_layer(
668679
(
669-
{"x": 0, "y": text_ref.dims["top"]},
670-
{"x": self.doc_width, "y": text_ref.dims["top"]},
680+
{"x": 0, "y": next_bottom},
681+
{"x": self.doc_width, "y": next_bottom},
671682
{"x": self.doc_width, "y": self.doc_height},
672683
{"x": 0, "y": self.doc_height},
673684
),
@@ -701,7 +712,7 @@ def textbox_reference(self) -> ReferenceLayer | None:
701712
oracle_text=self.layout.oracle_text,
702713
flavor_text=None,
703714
):
704-
rules_text, textbox_ref, _ = sized
715+
rules_text, textbox_ref = sized
705716
self.text_layer_rules = rules_text
706717
ref = textbox_ref
707718
else:
@@ -746,12 +757,12 @@ def textbox_reference(self) -> ReferenceLayer | None:
746757
self.rules_text_font_size, textboxes_to_adjust
747758
)
748759

749-
rules_text, textbox_ref, _ = sized_boxes[0]
760+
rules_text, textbox_ref = sized_boxes[0]
750761
self.text_layer_rules = rules_text
751762
ref = textbox_ref
752763

753764
if self.is_adventure:
754-
rules_text_left, textbox_ref_left, _ = sized_boxes[1]
765+
rules_text_left, textbox_ref_left = sized_boxes[1]
755766

756767
self.text_layer_rules_adventure = rules_text_left
757768
self.textbox_reference_adventure = textbox_ref_left
@@ -905,7 +916,7 @@ def name_normal_pinline_shape(self) -> ArtLayer | None:
905916
def twins_horizontal_delta(self) -> float | int:
906917
if self.name_normal_pinline_shape:
907918
dims = get_layer_dimensions(self.name_normal_pinline_shape)
908-
return APP.activeDocument.width - 2 * dims["center_x"]
919+
return self.doc_width - 2 * dims["center_x"]
909920
return 0
910921

911922
@cached_property
@@ -1292,7 +1303,7 @@ def adjust_textbox_for_font_size(
12921303
]
12931304
| None = "center_y",
12941305
vertical_padding: tuple[float | int, float | int] | None = None,
1295-
) -> tuple[ArtLayer, ReferenceLayer, float] | None:
1306+
) -> tuple[ArtLayer, ReferenceLayer] | None:
12961307
"""Calculates the required size for rules textbox when the rules text has a fixed font size."""
12971308
min_top = min_top if min_top is not None else self.doc_height
12981309
vertical_padding = (
@@ -1345,6 +1356,11 @@ def adjust_textbox_for_font_size(
13451356
offset=-vertical_padding[1],
13461357
)
13471358

1359+
dims_shaped_text = get_layer_dimensions(shaped_text)
1360+
if align_to is None and (delta := min_top - dims_shaped_text["top"]) < 0:
1361+
shaped_text.translate(0, delta)
1362+
alignment_dimension = "center_y"
1363+
13481364
# Apply shape to the text that offsets PT elements but allows overflow at bottom
13491365
if self.requires_text_shaping and self.pt_text_reference:
13501366
dims_initial_shape = get_layer_dimensions(shaped_text)
@@ -1386,7 +1402,7 @@ def adjust_textbox_for_font_size(
13861402
# delta := check_reference_overlap(
13871403
# shaped_text,
13881404
# self.textbox_overflow_reference.bounds,
1389-
# docsel=APP.activeDocument.selection,
1405+
# docsel=self.docref.selection,
13901406
# )
13911407
# )
13921408
< 0
@@ -1462,18 +1478,17 @@ def adjust_textbox_for_font_size(
14621478
alignment_dimension = None
14631479

14641480
dims_text_ref_shape = get_layer_dimensions(shaped_text)
1481+
# Take padding into account when centering text
1482+
chosen_top_a, chosen_top_b = (
1483+
(dims_text_ref_shape["top"], calculated_top)
1484+
if (calculated_top := dims_text_ref_shape["top"] + vertical_padding[0])
1485+
< min_top
1486+
else (min_top, min_top)
1487+
)
14651488
align_y = (
14661489
align_to
14671490
if align_to is not None
1468-
else dims_text_ref_shape["top"]
1469-
+ (
1470-
(
1471-
dims_textbox_ref["bottom"]
1472-
- dims_text_ref_shape["top"]
1473-
- vertical_padding[0]
1474-
)
1475-
/ 2
1476-
)
1491+
else chosen_top_a + ((dims_textbox_ref["bottom"] - chosen_top_b) / 2)
14771492
)
14781493

14791494
if align_to is not None or alignment_dimension:
@@ -1519,12 +1534,11 @@ def adjust_textbox_for_font_size(
15191534
hide=True,
15201535
)
15211536
),
1522-
align_y,
15231537
)
15241538

15251539
def adjust_textboxes_for_font_size(
15261540
self, font_size: int | float, textbox_args: list[TextboxSizingArgs]
1527-
) -> list[tuple[ArtLayer, ReferenceLayer, float]]:
1541+
) -> list[tuple[ArtLayer, ReferenceLayer]]:
15281542
"""
15291543
Adjusts multiple textboxes, whose bottom edges are aligned horizontally,
15301544
to font size so that all the textboxes will end up with the same height.
@@ -1538,10 +1552,9 @@ def adjust_textboxes_for_font_size(
15381552
reverse=True,
15391553
)
15401554

1541-
sizes: list[tuple[ArtLayer, ReferenceLayer, float]] = []
1542-
tallest_top: float | int = 0
1555+
sizes: list[tuple[ArtLayer, ReferenceLayer]] = []
1556+
tallest_top: float | int = self.doc_height
15431557
tallest_height: float | int = 0
1544-
tallest_align: float = 0
15451558
tallest_idx: int = -1
15461559
# First pass of sizing
15471560
for idx, arg in enumerate(textbox_args_sorted):
@@ -1570,15 +1583,14 @@ def adjust_textboxes_for_font_size(
15701583
) > tallest_height:
15711584
tallest_top = sized[1].dims["top"] - height_padding
15721585
tallest_height = height
1573-
tallest_align = sized[2]
15741586
tallest_idx = idx
15751587
else:
15761588
raise ValueError(
15771589
f"Textbox sizing failed for {arg['base_text_layer'].name}"
15781590
)
15791591

15801592
# Resize all shorter layers to match the tallest
1581-
for idx, ((layer, ref, _), arg) in enumerate(
1593+
for idx, ((layer, ref), arg) in enumerate(
15821594
zip(sizes.copy(), textbox_args_sorted)
15831595
):
15841596
orig_idx = textbox_args.index(arg)
@@ -1590,15 +1602,16 @@ def adjust_textboxes_for_font_size(
15901602
height_padding = arg.get("height_padding", 0) or 0
15911603
layer.remove()
15921604
ref.remove()
1605+
min_top = tallest_top + height_padding
15931606
sized = self.adjust_textbox_for_font_size(
15941607
base_text_layer=arg["base_text_layer"],
15951608
base_textbox_reference=arg["base_textbox_reference"],
15961609
base_text_wrap_reference=arg["base_text_wrap_reference"],
15971610
divider_layer=arg["divider_layer"],
15981611
oracle_text=arg["oracle_text"],
15991612
flavor_text=arg["flavor_text"],
1600-
min_top=tallest_top + height_padding,
1601-
align_to=tallest_align,
1613+
min_top=min_top,
1614+
align_to=min_top + (tallest_height - height_padding) / 2,
16021615
)
16031616
if sized:
16041617
sizes[orig_idx] = sized
@@ -1916,7 +1929,7 @@ def flip_split_layers(self, layers: list[ArtLayer | None]) -> None:
19161929
if (layer_a := layers[0]) and (layer_b := layers[1]):
19171930
dims_a = get_layer_dimensions(layer_a)
19181931
dims_b = get_layer_dimensions(layer_b)
1919-
half_doc_width: float | int = APP.activeDocument.width / 2
1932+
half_doc_width: float | int = self.doc_width / 2
19201933
delta = half_doc_width - (dims_b["left"] - half_doc_width) - dims_a["right"]
19211934
for layer in layers:
19221935
if layer:
@@ -1949,7 +1962,7 @@ def typeline_pinlines_layers(self) -> list[ArtLayer | None]:
19491962
) and self.flip_twins:
19501963
flip_layer(layer, FlipDirection.Horizontal)
19511964
dims = get_layer_dimensions(layer)
1952-
layer.translate(APP.activeDocument.width - 2 * dims["center_x"], 0)
1965+
layer.translate(self.doc_width - 2 * dims["center_x"], 0)
19531966

19541967
return [layer]
19551968

@@ -2108,8 +2121,8 @@ def adjust_split_textboxes_to_font_size(self):
21082121
self.rules_text_font_size, args
21092122
)
21102123

2111-
self.text_layers_rules = [layer for layer, _, _ in sized_boxes]
2112-
self.textbox_references = [ref for _, ref, _ in sized_boxes]
2124+
self.text_layers_rules = [layer for layer, _ in sized_boxes]
2125+
self.textbox_references = [ref for _, ref in sized_boxes]
21132126

21142127
# endregion Split
21152128

0 commit comments

Comments
 (0)