159 lines
5.5 KiB
Python
159 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
project: GarageCalc1
|
|
file: utils.py
|
|
summary: helper functions
|
|
"""
|
|
|
|
# Standard library imports
|
|
import sys
|
|
import os
|
|
|
|
# Third party imports
|
|
from PySide2.QtWidgets import QMessageBox, QApplication, QMainWindow, QTableWidgetItem, QStatusBar
|
|
from PySide2 import QtCore
|
|
from PySide2.QtGui import QIcon, QPixmap
|
|
from PySide2.QtCore import QFile, QSize, Qt
|
|
from PySide2.QtUiTools import QUiLoader
|
|
|
|
# local globals
|
|
STD_COL_WIDTH: int = 7
|
|
|
|
# local imports
|
|
import icons_rc
|
|
|
|
def resource_path(relative_path):
|
|
""" Get absolute path to resource, works for dev and for PyInstaller """
|
|
try:
|
|
# PyInstaller creates a temp folder and stores path in _MEIPASS
|
|
base_path = sys._MEIPASS
|
|
except Exception:
|
|
base_path = os.path.abspath(".")
|
|
|
|
return os.path.join(base_path, relative_path)
|
|
|
|
def show_about(ini_file="", opened_file=""):
|
|
if not opened_file:
|
|
opened_file = ""
|
|
|
|
qApp = QApplication.instance()
|
|
msg = QMessageBox()
|
|
msg.setIconPixmap(QPixmap(u":ICONS/ICON_APP"))
|
|
|
|
text = "<p align='center'><h1>" + qApp.applicationDisplayName() + " " + \
|
|
"<br>" + qApp.applicationVersion() + "</h1>" + \
|
|
"<br>" + qApp.applicationName() + "<br>" + \
|
|
"<br>" + qApp.translate("main", "Calculates available garage space") + "<br>" + \
|
|
"<br>" + qApp.translate("utils", "Idea") + ": Balazs Fabian" + "<br>" + \
|
|
"<br>" + qApp.copyright + "<br>" \
|
|
"<br> <a href='" + qApp.website + "'>" + qApp.website + "</a></p>"
|
|
|
|
text = text + "<p align='center'>" + qApp.translate("utils", "Used icons") + ": 'Cute Color' " + qApp.translate("utils", "from") + " <a href='https://icons8.com/'>Icons8</a></p>"
|
|
text = text + "<p align='center'>" + qApp.translate("utils", "Currently opened file") + ": <br>" + opened_file + " </p>"
|
|
text = text + "<p align='center'>" + qApp.translate("utils", "Location of the Ini-file") + ": <br>" + ini_file + " </p>"
|
|
text = text + "<p align='center'>Python " + qApp.translate("utils", "Version") + ": " + f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} {sys.version_info.releaselevel}"
|
|
text = text + "<br>" + f"{sys.executable}" + "<br>"
|
|
text = text + "<br>Qt " + qApp.translate("utils", "Version") + ": " + f"{QtCore.__version__}"
|
|
|
|
msg.setText(text)
|
|
msg.setWindowTitle("About")
|
|
msg.setStandardButtons(QMessageBox.Ok)
|
|
|
|
msg.exec_()
|
|
|
|
def str_iff(input: str, output1: str, output2: str, output3: str) -> str:
|
|
""" Return outputs based on length of given input """
|
|
str_ret = ""
|
|
str_length = len(input)
|
|
|
|
if str_length < 0:
|
|
str_ret = output1
|
|
|
|
if str_length == 0:
|
|
str_ret = output2
|
|
|
|
if str_length > 0:
|
|
str_ret = output3
|
|
|
|
return str_ret
|
|
|
|
def fit_col_widths(table, worksheet):
|
|
try:
|
|
model = table.model().sourceModel()
|
|
except AttributeError:
|
|
model = table.model()
|
|
|
|
max_col_lengths = []
|
|
dict_max_col_length = {}
|
|
sel_indexes = table.selectedIndexes()
|
|
sel_rows_idx = table.selectionModel().selectedRows()
|
|
sel_rows = []
|
|
for sel_index in sel_rows_idx:
|
|
sel_rows.append(sel_index.row())
|
|
|
|
for col_ind in range(model.columnCount()):
|
|
cur_item_length = 0
|
|
lengths = []
|
|
|
|
# get column header
|
|
row = 0
|
|
col_header_text = str(model.headerData(col_ind, Qt.Horizontal))
|
|
if not table.isColumnHidden(col_ind): # export only visible column headers
|
|
cur_item_length = len(col_header_text)
|
|
lengths.append(cur_item_length)
|
|
|
|
# get columns data lengths
|
|
row = 1
|
|
# iterate over all rows
|
|
for row_ind in range(model.rowCount()):
|
|
if row_ind in sel_rows:
|
|
item = model.item(row_ind, col_ind)
|
|
if item:
|
|
cur_item_text = item.text()
|
|
cur_item_length = len(cur_item_text)
|
|
else:
|
|
cur_item_length = 0
|
|
|
|
if not table.isColumnHidden(col_ind): # export only visible column headers
|
|
lengths.append(cur_item_length)
|
|
|
|
if not table.isColumnHidden(col_ind): # export only visible column headers
|
|
dict_max_col_length[col_ind] = lengths
|
|
|
|
col_ind = 0
|
|
for col in dict_max_col_length:
|
|
lengths = dict_max_col_length[col]
|
|
col_width = max(lengths)
|
|
|
|
## special: enlage first col
|
|
if col == 0:
|
|
col_width = 20
|
|
# debug info
|
|
# print(f"worksheet.set_column({col_ind} -> {col_width})")
|
|
# worksheet.write(29, col_ind, col_width)
|
|
## debug info
|
|
if col_width > STD_COL_WIDTH: # anticipated default size
|
|
worksheet.set_column(col_ind, col_ind, col_width*1.25)
|
|
col_ind += 1
|
|
|
|
def convert_uom_to_length(val, unit_in, unit_out):
|
|
SI = {'mm':0.001, 'cm':0.01, 'm':1.0}
|
|
return val*SI[unit_in]/SI[unit_out]
|
|
|
|
def convert_uom_to_mass(val, unit_in, unit_out):
|
|
SI = {'g':0.001, 'kg':1.0}
|
|
return val*SI[unit_in]/SI[unit_out]
|
|
|
|
def optimizeTableLayout(table):
|
|
for col in range(table.columnCount()): # optimize column width
|
|
table.resizeColumnToContents(col)
|
|
table.resizeRowsToContents() # optimize row height
|
|
|
|
def table_has_items(tablewidget):
|
|
for row in range(tablewidget.rowCount()):
|
|
for col in range(tablewidget.columnCount()):
|
|
item = tablewidget.item(row, col)
|
|
if item:
|
|
return True
|
|
|
|
return False |