import PySimpleGUI as sg

"""
    Columns with a hard coded size that can have elements justified within it.
    
    The Column element can have the size set to a fixed size, but when doing so, PySimpleGUI has
        a limitation that the contents can't be justified using the normal element_justification parameter.
        
    What to do?
    
    The Sizer Element to the rescue.
    
    PySimpleGUI likes to have layouts that size themselves rather than hard coded using a size parameter. The
    Sizer Element enables you to create columns with fixed size by making the contents of your column a fixed size.
    It is an invisible "padding" type of element.  It has a width and a height parameter.


    Copyright 2021 PySimpleGUI
"""


'''
M#"""""""'M                    dP                         
##  mmmm. `M                   88                         
#'        .M 88d888b. .d8888b. 88  .dP  .d8888b. 88d888b. 
M#  MMMb.'YM 88'  `88 88'  `88 88888"   88ooood8 88'  `88 
M#  MMMM'  M 88       88.  .88 88  `8b. 88.  ... 88    88 
M#       .;M dP       `88888P' dP   `YP `88888P' dP    dP 
M#########M
'''


# Let's say this is your layout and you want to center it in a 500 x 300 pixel Column Element.
col_interior = [[sg.Text('My Window')],
              [sg.In()],
              [sg.In()],
              [sg.Button('Go'), sg.Button('Exit'), sg.Cancel(), sg.Ok()]]

# Intuition would be to write it as this:
layout = [[sg.Text('This layout is broken.  The size of the Column is correct, but the elements are not justified')],
          [sg.Column(col_interior, element_justification='c', size=(500, 300), background_color='red')]]

# But when you run it, you'll see that your interior is not centered.

window = sg.Window('Window Title', layout)

window.read(close=True)


'''
M""MMM""MMM""M                   dP                
M  MMM  MMM  M                   88                
M  MMP  MMP  M .d8888b. 88d888b. 88  .dP  .d8888b. 
M  MM'  MM' .M 88'  `88 88'  `88 88888"   Y8ooooo. 
M  `' . '' .MM 88.  .88 88       88  `8b.       88 
M    .d  .dMMM `88888P' dP       dP   `YP `88888P' 
MMMMMMMMMMMMMM
'''

def ColumnFixedSize(layout, size=(None, None), *args, **kwargs):
    # An addition column is needed to wrap the column with the Sizers because the colors will not be set on the space the sizers take
    return sg.Column([[sg.Column([[sg.Sizer(0,size[1]-1), sg.Column([[sg.Sizer(size[0]-2,0)]] + layout, *args, **kwargs, pad=(0,0))]], *args, **kwargs)]],pad=(0,0))

col_interior = [[sg.Text('My Window')],
                [sg.In()],
                [sg.In()],
                [sg.Button('Go'), sg.Button('Exit'), sg.Cancel(), sg.Ok()]]


layout = [[sg.Text('Below is a column that is 500 x 300')],
          [sg.Text('With the interior centered')],
          [ColumnFixedSize(col_interior, size=(500, 300),  background_color='red', element_justification='c', vertical_alignment='t')]]

window = sg.Window('Window Title', layout)

window.read(close=True)