warehouse-master/widgets.py
Andrew Pimenov 08c87e1c37 initial release
PyQt5 desktop app: PDF label generator (single/2×2/4×4 grids) and
Google Sheets reassembly tracker for laptop inventory management.
2026-06-11 19:14:31 +03:00

129 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from __future__ import annotations
import os
from PyQt5.QtCore import QSettings
from PyQt5.QtGui import QIntValidator
from PyQt5.QtWidgets import (
QComboBox, QDialog, QFileDialog, QFormLayout,
QHBoxLayout, QLabel, QLineEdit, QPushButton, QVBoxLayout, QWidget,
)
class NoScrollComboBox(QComboBox):
def wheelEvent(self, event):
event.ignore()
class RangeRowWidget(QWidget):
def __init__(self, on_action, on_change):
super().__init__()
layout = QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
self.inp_start = QLineEdit()
self.inp_start.setPlaceholderText("Start")
self.inp_start.setValidator(QIntValidator(0, 9_999_999))
self.inp_start.textChanged.connect(on_change)
self.inp_end = QLineEdit()
self.inp_end.setPlaceholderText("End")
self.inp_end.setValidator(QIntValidator(0, 9_999_999))
self.inp_end.textChanged.connect(on_change)
self.btn_add = QPushButton("+")
self.btn_add.setFixedSize(30, 30)
self.btn_add.clicked.connect(lambda: on_action(self, "add"))
self.btn_del = QPushButton("–")
self.btn_del.setFixedSize(30, 30)
self.btn_del.clicked.connect(lambda: on_action(self, "del"))
layout.addWidget(self.inp_start)
layout.addWidget(QLabel("➜"))
layout.addWidget(self.inp_end)
layout.addWidget(self.btn_add)
layout.addWidget(self.btn_del)
def get_values(self) -> tuple[int, int] | None:
s, e = self.inp_start.text(), self.inp_end.text()
if s and e:
return int(s), int(e)
return None
def set_delete_enabled(self, enabled: bool) -> None:
self.btn_del.setEnabled(enabled)
class PreferencesDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.settings = QSettings("WarehouseMaster", "App")
from strings import STRINGS
locale = self.settings.value("locale", "en")
self._t = STRINGS.get(locale, STRINGS["en"])
self.setWindowTitle(self._t["dlg_title"])
self.setFixedSize(450, 290)
self._init_ui()
self._load()
def _init_ui(self):
t = self._t
layout = QVBoxLayout(self)
form = QFormLayout()
self.cb_language = NoScrollComboBox()
self.cb_language.addItems(["English", "Русский"])
form.addRow(t["dlg_language"], self.cb_language)
self.cb_theme = NoScrollComboBox()
self.cb_theme.addItems([t["theme_dark"], t["theme_light"]])
form.addRow(t["dlg_theme"], self.cb_theme)
self.inp_url = QLineEdit()
form.addRow(t["dlg_sheet_url"], self.inp_url)
path_row = QHBoxLayout()
self.inp_path = QLineEdit()
self.inp_path.setReadOnly(True)
btn_browse = QPushButton("...")
btn_browse.setFixedWidth(40)
btn_browse.clicked.connect(self._browse)
path_row.addWidget(self.inp_path)
path_row.addWidget(btn_browse)
form.addRow(t["dlg_save_folder"], path_row)
layout.addLayout(form)
btns = QHBoxLayout()
btn_save = QPushButton(t["btn_save"])
btn_save.clicked.connect(self._save)
btn_cancel = QPushButton(t["btn_cancel"])
btn_cancel.clicked.connect(self.reject)
btns.addStretch()
btns.addWidget(btn_cancel)
btns.addWidget(btn_save)
layout.addLayout(btns)
def _browse(self):
folder = QFileDialog.getExistingDirectory(
self, self._t["dlg_select_folder"], self.inp_path.text()
)
if folder:
self.inp_path.setText(folder)
def _load(self):
locale = self.settings.value("locale", "en")
self.cb_language.setCurrentIndex(0 if locale == "en" else 1)
self.cb_theme.setCurrentIndex(self.settings.value("theme_idx", 0, type=int))
self.inp_path.setText(
self.settings.value("save_path", os.path.join(os.path.expanduser("~"), "Desktop"))
)
self.inp_url.setText(self.settings.value("sheet_url", ""))
def _save(self):
self.settings.setValue("locale", "en" if self.cb_language.currentIndex() == 0 else "ru")
self.settings.setValue("theme_idx", self.cb_theme.currentIndex())
self.settings.setValue("save_path", self.inp_path.text())
self.settings.setValue("sheet_url", self.inp_url.text())
self.accept()