mirror of
https://github.com/Horizontal42/warehouse-master.git
synced 2026-11-10 16:02:07 +03:00
PyQt5 desktop app: PDF label generator (single/2×2/4×4 grids) and Google Sheets reassembly tracker for laptop inventory management.
129 lines
4.4 KiB
Python
129 lines
4.4 KiB
Python
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()
|