# Copyright (c) 2021-2024  The University of Texas Southwestern Medical Center.
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted for academic and research use only (subject to the
# limitations in the disclaimer below) provided that the following conditions are met:

#      * Redistributions of source code must retain the above copyright notice,
#      this list of conditions and the following disclaimer.

#      * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.

#      * Neither the name of the copyright holders nor the names of its
#      contributors may be used to endorse or promote products derived from this
#      software without specific prior written permission.

# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# Standard Library Imports
from typing import Dict, Any
import tkinter as tk
from tkinter import ttk

# Third Party Imports

# Local Imports


def uniform_grid(cls: Any) -> None:
    """This function is used to equally distribute the columns and rows of a
    tkinter frame.

    Parameters
    ----------
    cls : tk.Frame or ttk.Frame
        The class that is to be distributed.
    """
    cols, rows = cls.grid_size()
    for col in range(cols):
        cls.grid_columnconfigure(col, weight=1)
    for row in range(rows):
        cls.grid_rowconfigure(row, weight=1)

class CommonMethods:
    """This class is a collection of common methods for handling variables, widgets,
    and buttons.
    """

    def get_variables(self) -> Dict[str, Any]:
        """This function returns a dictionary of all the variables that are tied to
        each  widget name.

        The key is the widget name, value is the variable associated.

        Returns
        -------
        variables : dict
            The dictionary that holds the variables.
        """
        variables = {}
        for key, widget in self.inputs.items():
            variables[key] = widget.get()
        return variables

    def get_widgets(self) -> Dict[str, Any]:
        """This function returns the dictionary that holds the widgets.

        The key is the widget name, value is the LabelInput class that has all the data.

        Returns
        -------
        widgets : dict
            The dictionary that holds the widgets.
        """
        return self.inputs

    def get_buttons(self) -> Dict[str, ttk.Button]:
        """Get the buttons of the popup

        This function returns the dictionary that holds the buttons.
        The key is the button name, value is the button.

        Returns
        -------
        buttons : Dict[str, ttk.Button]
            Dictionary of all the buttons
        """
        return self.buttons
