From 5efa83f8dbda7fed3785e61abd51da252f76a780 Mon Sep 17 00:00:00 2001 From: Griffiths Lott Date: Wed, 22 Feb 2023 11:21:55 -0500 Subject: [PATCH] Fully functional. Has error dialog, dynamic logging, resizable UI --- .gitignore | 4 +- ILParser.py | 2 +- config.json | 1 + errorDialog.py | 70 ++++++++++++++++++++ main.py | 129 ++++++++++++++++++++++++++++++++---- todo.txt | 4 ++ ui.py | 176 ++++++++++++++++++++++++++++++++++++++----------- 7 files changed, 333 insertions(+), 53 deletions(-) create mode 100644 config.json create mode 100644 errorDialog.py create mode 100644 todo.txt diff --git a/.gitignore b/.gitignore index 3d81292..653b988 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ Inputs/ Outputs/ __pycache__/ *.csv -*.log \ No newline at end of file +*.log +.vscode/ +*.xlsx \ No newline at end of file diff --git a/ILParser.py b/ILParser.py index 40722d0..0f186de 100644 --- a/ILParser.py +++ b/ILParser.py @@ -4,7 +4,7 @@ from logging import debug, DEBUG, basicConfig, warn from typing import Optional, Union -logConfig = basicConfig(filename='ILFormatter.log', encoding='utf-8', level=DEBUG, filemode='w') +#logConfig = basicConfig(filename='ILFormatter.log', encoding='utf-8', level=DEBUG, filemode='w') CONTRACT_NO_REGEX = "\d{3}-\d{7}-\d{3}" class Column: diff --git a/config.json b/config.json new file mode 100644 index 0000000..dd72863 --- /dev/null +++ b/config.json @@ -0,0 +1 @@ +{"loggingLevel": "DEBUG"} \ No newline at end of file diff --git a/errorDialog.py b/errorDialog.py new file mode 100644 index 0000000..9846f72 --- /dev/null +++ b/errorDialog.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'errorDialog.ui' +# +# Created by: PyQt5 UI code generator 5.15.9 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets +from pandas import DataFrame +from typing import Union + + +class ErrorDialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(496, 195) + self.widget = QtWidgets.QWidget(Dialog) + self.widget.setGeometry(QtCore.QRect(10, 10, 471, 181)) + self.widget.setObjectName("widget") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget) + self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.errorLabel = QtWidgets.QLabel(self.widget) + self.errorLabel.setMinimumSize(QtCore.QSize(202, 20)) + font = QtGui.QFont() + font.setPointSize(12) + font.setBold(True) + font.setWeight(75) + self.errorLabel.setFont(font) + self.errorLabel.setObjectName("errorLabel") + self.verticalLayout.addWidget(self.errorLabel) + self.errorDetailLabel = QtWidgets.QLabel(self.widget) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(False) + font.setWeight(50) + self.errorDetailLabel.setFont(font) + self.errorDetailLabel.setObjectName("errorDetailLabel") + self.verticalLayout.addWidget(self.errorDetailLabel) + self.verticalLayout_2.addLayout(self.verticalLayout) + self.textBrowser = QtWidgets.QTextBrowser(self.widget) + self.textBrowser.setObjectName("textBrowser") + self.verticalLayout_2.addWidget(self.textBrowser) + self.okButton = QtWidgets.QDialogButtonBox(self.widget) + self.okButton.setStandardButtons(QtWidgets.QDialogButtonBox.Ok) + self.okButton.setCenterButtons(True) + self.okButton.setObjectName("okButton") + self.verticalLayout_2.addWidget(self.okButton) + + # Actions + self.okButton.clicked.connect(lambda: Dialog.done(1)) + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Error")) + self.errorLabel.setText(_translate("Dialog", "ERROR LABEL:")) + self.errorDetailLabel.setText(_translate("Dialog", "ERROR LABEL")) + + def setFields(self, errorLabel: str, errorDescription: str, errorText: str): + self.errorLabel.setText(errorLabel) + self.errorDetailLabel.setText(errorDescription) + self.textBrowser.setText(errorText) diff --git a/main.py b/main.py index 22ab36f..74db68a 100644 --- a/main.py +++ b/main.py @@ -1,22 +1,61 @@ from ui import Ui_MainWindow +from errorDialog import ErrorDialog import ILParser from PyQt5 import QtWidgets -from logging import debug, DEBUG, basicConfig, warn +from logging import debug, info, warning, exception as logException, error,DEBUG, INFO, WARNING, ERROR, basicConfig, getLogger from sys import argv from typing import Literal, Optional from pandas import DataFrame, ExcelWriter from datetime import datetime as dt +from os import startfile +from json import load, dump +from time import sleep +# Open the config file, create a dict, and set up logging +with open("config.json") as configFile: + config: dict[Literal["loggingLevel"], Literal["ERROR", "WARNING", "INFO", "DEBUG"]] = load(configFile) +basicConfig(filename='ILFormatter.log', encoding='utf-8', level=config["loggingLevel"], filemode='w', force=True) +info(f"Starting with log level: {getLogger().level}") -logConfig = basicConfig(filename='ILFormatter.log', encoding='utf-8', level=DEBUG, filemode='w') +# Change the current log level and save the change to config.json +def change_log_level(newLevel: Literal["ERROR", "WARNING", "INFO", "DEBUG"]): + config["loggingLevel"] = newLevel + with open("config.json", 'w') as configFile: + dump(config, configFile) + getLogger().setLevel(newLevel) + print(f"{now()} | New logging level: {getLogger().level}\n") +# Creates an error dialog pop up +# Based on the ui from errorDialog.py +def open_error_dialog(errorLabel: str, errorDescription: str, errorText: str): + dialog = QtWidgets.QDialog() + dialog.ui = ErrorDialog() + dialog.ui.setupUi(dialog) + dialog.ui.setFields(errorLabel, errorDescription, errorText) + dialog.exec_() + +# Used to easily record uniform timestamps +now = lambda : dt.now().strftime("%H:%M-%S.%f") + +# This class is responable for managing the UI of the application +# and connection it to the functionality of ILParser.py class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, *args, obj=None, **kwargs): debug("MainWindow class init..") super(MainWindow, self).__init__(*args, **kwargs) self.setupUi(self) self.processButton.setEnabled(False) - + self.openButton.setEnabled(False) + + # Fix log level action buttons + level: QtWidgets.QAction + for level in [self.actionError, self.warnAction, self.infoAction, self.debugAction]: + inUse = level.text().upper() == config["loggingLevel"] + level.setEnabled(not inUse) + level.setChecked(inUse) + if inUse: self.logLevel = level + debug(f"Logging Level: {self.logLevel}") + # File Locations self.assetFile = None self.custFile = None @@ -31,12 +70,20 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.finButton.clicked.connect(lambda: self._set_file(lineEdit= self.finLE, selfFile="FIN")) self.outputButton.clicked.connect(lambda: self._set_output()) self.processButton.clicked.connect(lambda: self._process()) + self.openButton.clicked.connect(lambda: self._open_with_default_app(self.outputLocation)) + + # Action Hooks + self.actionError.triggered.connect(lambda: self._switch_log_levels(self.actionError)) + self.warnAction.triggered.connect(lambda: self._switch_log_levels(self.warnAction)) + self.infoAction.triggered.connect(lambda: self._switch_log_levels(self.infoAction)) + self.debugAction.triggered.connect(lambda: self._switch_log_levels(self.debugAction)) def _check_files(self): debug(self.assetFile) debug(self.custFile) debug(self.dobFile) debug(self.finFile) + self.openButton.setEnabled(False) ready = ( self.assetFile != None and self.custFile != None and @@ -46,7 +93,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): ) self.processButton.setEnabled(ready) - def _set_file(self, lineEdit: QtWidgets.QLineEdit, selfFile: Literal["ASSET", "CUST", "DOB", "FIN"]) -> str : + def _set_file(self, lineEdit: QtWidgets.QLineEdit, selfFile: Literal["ASSET", "CUST", "DOB", "FIN"]) -> Optional[str] : selectedFile: list[str] = QtWidgets.QFileDialog.getOpenFileName(self, "OpenFile") debug(f"Selected file: {selectedFile}") lineEdit.setText(selectedFile[0]) @@ -73,34 +120,88 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.outputLE.setText(self.outputLocation if self.outputLocation != None else '') debug(f"Auto set output: {self.outputLocation}") - def _setAssetFile(self): - self.assetFile = self._set_file(self.assetLE) + def _open_with_default_app(self, item): + """ + Opens the linked item with it's default application (excel) + """ + debug(f"_open_with_default_app: {item}") + startfile(item) + + + def _switch_log_levels(self, newLevel: QtWidgets.QAction): + oldLevel: QtWidgets.QAction = self.logLevel + print(f"{now()} | Log Level Changed: {oldLevel.text()} -> {newLevel.text()}") + newLevel.setChecked(True) + oldLevel.setChecked(False) + newLevel.setEnabled(False) + oldLevel.setEnabled(True) + self.logLevel = newLevel + change_log_level(newLevel.text().upper()) + def _parse_file(self, filePath: str, parseColumns: list[ILParser.Column]) -> Optional[DataFrame]: with open(filePath) as file: report = file.read() debug(f"Report: {report}") - data: DataFrame = ILParser.parse(report, parseColumns) + debug(f"Parse Columns:\n{parseColumns}") + try: + data: DataFrame = ILParser.parse(report, parseColumns) + except Exception as e: + logException(f"Failed to parse file-> {filePath} :\n{e}") + open_error_dialog("Parsing Error:",f"Failed to parse file-> {filePath}",repr(e)) + return None debug(f"Data: {data}") if data.empty: + error(f"Dataframe empty -> {filePath} | Returning none") + open_error_dialog("Data Processing Error:",f"Dataframe empty!",filePath) return None else: return data def _process(self): - assetDf: DataFrame = self._parse_file(self.assetFile, ILParser.ASSET_COLS) - debug(assetDf) + assetDf: Optional[DataFrame] = self._parse_file(filePath= self.assetFile, parseColumns= ILParser.ASSET_COLS) + debug(f"AssetDF: {assetDf} | {type(assetDf)} ") + if type(assetDf) != DataFrame: + debug(f"Parse Columns: {ILParser.ASSET_COLS}") + self.assetLE.setText("") + self.assetFile = None + + return None custDf: DataFrame = self._parse_file(self.custFile, ILParser.CUST_COLS) debug(custDf) + if type(custDf) != DataFrame: + debug(f"Parse Columns: {ILParser.CUST_COLS}") + self.custLe.setText("") + self.custFile = None + + return None dobDf: DataFrame = self._parse_file(self.dobFile, ILParser.DOB_COL) debug(dobDf) + if type(dobDf) != DataFrame: + debug(f"Parse Columns: {ILParser.DOB_COL}") + self.dobLE.setText("") + self.dobFile = None + + return None finDf: DataFrame = self._parse_file(self.finFile, ILParser.FIN_COLUMNS) debug(finDf) - with ExcelWriter(self.outputLocation) as writer: - assetDf.to_excel(writer, sheet_name="ASSET") - custDf.to_excel(writer, sheet_name="CUST") - dobDf.to_excel(writer, sheet_name="DOB") - finDf.to_excel(writer, sheet_name="FIN") + if type(finDf) != DataFrame: + debug(f"Parse Columns: {ILParser.FIN_COLUMNS}") + self.finLE.setText("") + self.finFile = None + + return None + try: + with ExcelWriter(self.outputLocation) as writer: + assetDf.to_excel(writer, sheet_name="ASSET") + custDf.to_excel(writer, sheet_name="CUST") + dobDf.to_excel(writer, sheet_name="DOB") + finDf.to_excel(writer, sheet_name="FIN") + except Exception as e: + logException(f"{now()} | Failed to write to excel -> {self.outputLocation} :\n{e}") + open_error_dialog("Failed to Create Excel", f"Failed to write to excel -> {self.outputLocation}", repr(e)) + return None debug("Finished writing to excel.") + self.openButton.setEnabled(True) # Defines the app diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..897a710 --- /dev/null +++ b/todo.txt @@ -0,0 +1,4 @@ +[X] Working log level button +[X] Open file button +[X] Error Dialog +[ ] Directory memory \ No newline at end of file diff --git a/ui.py b/ui.py index fb7c3ec..6df7921 100644 --- a/ui.py +++ b/ui.py @@ -14,76 +14,164 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(520, 314) + MainWindow.resize(518, 267) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QtWidgets.QWidget(MainWindow) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) + self.centralwidget.setSizePolicy(sizePolicy) + self.centralwidget.setMaximumSize(QtCore.QSize(16777215, 219)) self.centralwidget.setObjectName("centralwidget") - self.widget = QtWidgets.QWidget(self.centralwidget) - self.widget.setGeometry(QtCore.QRect(10, 10, 491, 251)) - self.widget.setObjectName("widget") - self.mainVbox = QtWidgets.QVBoxLayout(self.widget) - self.mainVbox.setContentsMargins(0, 0, 0, 0) - self.mainVbox.setObjectName("mainVbox") + self.formLayout = QtWidgets.QFormLayout(self.centralwidget) + self.formLayout.setObjectName("formLayout") + self.gridLayout = QtWidgets.QGridLayout() + self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) + self.gridLayout.setObjectName("gridLayout") self.assetHbox = QtWidgets.QHBoxLayout() + self.assetHbox.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) self.assetHbox.setObjectName("assetHbox") - self.assetButton = QtWidgets.QPushButton(self.widget) + self.assetButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.assetButton.sizePolicy().hasHeightForWidth()) + self.assetButton.setSizePolicy(sizePolicy) self.assetButton.setMinimumSize(QtCore.QSize(99, 27)) self.assetButton.setMaximumSize(QtCore.QSize(99, 27)) self.assetButton.setObjectName("assetButton") self.assetHbox.addWidget(self.assetButton) - self.assetLE = QtWidgets.QLineEdit(self.widget) + self.assetLE = QtWidgets.QLineEdit(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(20) + sizePolicy.setHeightForWidth(self.assetLE.sizePolicy().hasHeightForWidth()) + self.assetLE.setSizePolicy(sizePolicy) + self.assetLE.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.assetLE.setObjectName("assetLE") self.assetHbox.addWidget(self.assetLE) - self.mainVbox.addLayout(self.assetHbox) + self.gridLayout.addLayout(self.assetHbox, 0, 0, 1, 1) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.custButton = QtWidgets.QPushButton(self.widget) + self.custButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.custButton.sizePolicy().hasHeightForWidth()) + self.custButton.setSizePolicy(sizePolicy) self.custButton.setMinimumSize(QtCore.QSize(99, 27)) self.custButton.setMaximumSize(QtCore.QSize(99, 27)) self.custButton.setObjectName("custButton") self.horizontalLayout_2.addWidget(self.custButton) - self.custLe = QtWidgets.QLineEdit(self.widget) + self.custLe = QtWidgets.QLineEdit(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(20) + sizePolicy.setHeightForWidth(self.custLe.sizePolicy().hasHeightForWidth()) + self.custLe.setSizePolicy(sizePolicy) + self.custLe.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.custLe.setObjectName("custLe") self.horizontalLayout_2.addWidget(self.custLe) - self.mainVbox.addLayout(self.horizontalLayout_2) + self.gridLayout.addLayout(self.horizontalLayout_2, 1, 0, 1, 1) self.horizontalLayout_6 = QtWidgets.QHBoxLayout() + self.horizontalLayout_6.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) self.horizontalLayout_6.setObjectName("horizontalLayout_6") - self.dobButton = QtWidgets.QPushButton(self.widget) + self.dobButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.dobButton.sizePolicy().hasHeightForWidth()) + self.dobButton.setSizePolicy(sizePolicy) self.dobButton.setMinimumSize(QtCore.QSize(99, 27)) self.dobButton.setMaximumSize(QtCore.QSize(99, 27)) self.dobButton.setObjectName("dobButton") self.horizontalLayout_6.addWidget(self.dobButton) - self.dobLE = QtWidgets.QLineEdit(self.widget) + self.dobLE = QtWidgets.QLineEdit(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(20) + sizePolicy.setHeightForWidth(self.dobLE.sizePolicy().hasHeightForWidth()) + self.dobLE.setSizePolicy(sizePolicy) + self.dobLE.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.dobLE.setObjectName("dobLE") self.horizontalLayout_6.addWidget(self.dobLE) - self.mainVbox.addLayout(self.horizontalLayout_6) + self.gridLayout.addLayout(self.horizontalLayout_6, 2, 0, 1, 1) self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.finButton = QtWidgets.QPushButton(self.widget) + self.finButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.finButton.sizePolicy().hasHeightForWidth()) + self.finButton.setSizePolicy(sizePolicy) self.finButton.setMinimumSize(QtCore.QSize(99, 27)) self.finButton.setMaximumSize(QtCore.QSize(99, 27)) self.finButton.setObjectName("finButton") self.horizontalLayout_7.addWidget(self.finButton) - self.finLE = QtWidgets.QLineEdit(self.widget) + self.finLE = QtWidgets.QLineEdit(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(20) + sizePolicy.setHeightForWidth(self.finLE.sizePolicy().hasHeightForWidth()) + self.finLE.setSizePolicy(sizePolicy) + self.finLE.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.finLE.setObjectName("finLE") self.horizontalLayout_7.addWidget(self.finLE) - self.mainVbox.addLayout(self.horizontalLayout_7) + self.gridLayout.addLayout(self.horizontalLayout_7, 3, 0, 1, 1) self.horizontalLayout_8 = QtWidgets.QHBoxLayout() + self.horizontalLayout_8.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) self.horizontalLayout_8.setObjectName("horizontalLayout_8") - self.outputButton = QtWidgets.QPushButton(self.widget) + self.outputButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.outputButton.sizePolicy().hasHeightForWidth()) + self.outputButton.setSizePolicy(sizePolicy) self.outputButton.setMinimumSize(QtCore.QSize(99, 27)) self.outputButton.setMaximumSize(QtCore.QSize(99, 27)) self.outputButton.setObjectName("outputButton") self.horizontalLayout_8.addWidget(self.outputButton) - self.outputLE = QtWidgets.QLineEdit(self.widget) + self.outputLE = QtWidgets.QLineEdit(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(20) + sizePolicy.setHeightForWidth(self.outputLE.sizePolicy().hasHeightForWidth()) + self.outputLE.setSizePolicy(sizePolicy) + self.outputLE.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.outputLE.setObjectName("outputLE") self.horizontalLayout_8.addWidget(self.outputLE) - self.mainVbox.addLayout(self.horizontalLayout_8) - self.processButton = QtWidgets.QPushButton(self.widget) + self.gridLayout.addLayout(self.horizontalLayout_8, 4, 0, 1, 1) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) + self.horizontalLayout.setObjectName("horizontalLayout") + self.processButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.processButton.sizePolicy().hasHeightForWidth()) + self.processButton.setSizePolicy(sizePolicy) self.processButton.setObjectName("processButton") - self.mainVbox.addWidget(self.processButton) + self.horizontalLayout.addWidget(self.processButton) + self.openButton = QtWidgets.QPushButton(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.openButton.sizePolicy().hasHeightForWidth()) + self.openButton.setSizePolicy(sizePolicy) + self.openButton.setObjectName("openButton") + self.horizontalLayout.addWidget(self.openButton) + self.gridLayout.addLayout(self.horizontalLayout, 5, 0, 1, 1) + self.formLayout.setLayout(0, QtWidgets.QFormLayout.SpanningRole, self.gridLayout) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 520, 24)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 518, 24)) self.menubar.setObjectName("menubar") self.menuSettings = QtWidgets.QMenu(self.menubar) self.menuSettings.setObjectName("menuSettings") @@ -93,15 +181,27 @@ class Ui_MainWindow(object): self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) - self.actionDebug_2 = QtWidgets.QAction(MainWindow) - self.actionDebug_2.setObjectName("actionDebug_2") - self.actionInfo = QtWidgets.QAction(MainWindow) - self.actionInfo.setObjectName("actionInfo") - self.actionInfo_2 = QtWidgets.QAction(MainWindow) - self.actionInfo_2.setObjectName("actionInfo_2") - self.menuLog_Level.addAction(self.actionInfo) - self.menuLog_Level.addAction(self.actionInfo_2) - self.menuLog_Level.addAction(self.actionDebug_2) + self.debugAction = QtWidgets.QAction(MainWindow) + self.debugAction.setCheckable(True) + self.debugAction.setEnabled(True) + self.debugAction.setObjectName("debugAction") + self.warnAction = QtWidgets.QAction(MainWindow) + self.warnAction.setCheckable(True) + self.warnAction.setEnabled(True) + self.warnAction.setObjectName("warnAction") + self.infoAction = QtWidgets.QAction(MainWindow) + self.infoAction.setCheckable(True) + self.infoAction.setEnabled(True) + self.infoAction.setObjectName("infoAction") + self.actionError = QtWidgets.QAction(MainWindow) + self.actionError.setCheckable(True) + self.actionError.setChecked(True) + self.actionError.setEnabled(False) + self.actionError.setObjectName("actionError") + self.menuLog_Level.addAction(self.actionError) + self.menuLog_Level.addAction(self.warnAction) + self.menuLog_Level.addAction(self.infoAction) + self.menuLog_Level.addAction(self.debugAction) self.menuSettings.addAction(self.menuLog_Level.menuAction()) self.menubar.addAction(self.menuSettings.menuAction()) @@ -117,8 +217,10 @@ class Ui_MainWindow(object): self.finButton.setText(_translate("MainWindow", "Select FIN:")) self.outputButton.setText(_translate("MainWindow", "Select Output")) self.processButton.setText(_translate("MainWindow", "Process Files")) + self.openButton.setText(_translate("MainWindow", "Open File")) self.menuSettings.setTitle(_translate("MainWindow", "Settings")) self.menuLog_Level.setTitle(_translate("MainWindow", "Log Level")) - self.actionDebug_2.setText(_translate("MainWindow", "Debug")) - self.actionInfo.setText(_translate("MainWindow", "Warn")) - self.actionInfo_2.setText(_translate("MainWindow", "Info")) + self.debugAction.setText(_translate("MainWindow", "Debug")) + self.warnAction.setText(_translate("MainWindow", "Warn")) + self.infoAction.setText(_translate("MainWindow", "Info")) + self.actionError.setText(_translate("MainWindow", "Error"))