77from photoshop .api ._layerSet import LayerSet
88from photoshop .api .enumerations import ElementPlacement
99
10- from src import APP , CFG
10+ from src import CFG
1111from src .cards import strip_reminder_text
1212from src .enums .layers import LAYERS
1313from src .enums .mtg import Rarity
1414from 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+ )
1620from src .helpers .colors import GradientConfig , get_pinline_gradient , get_rgb
1721from src .helpers .effects import apply_fx
1822from 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