Eigene Kennungen ausblenden, Win95-Menüs, verschiebbares Hauptfenster bei offenem Dialog u. a.
Neu: - Eigene Kennungen (eigene Filiale) ausblenden: nicht angezeigt, nicht mitgerechnet, nicht exportiert; per Rechtsklick, Händler-Menü oder Import-Bericht; Händler-Zuordnung hat Vorrang - Menüs im Win95-Stil: wechseln beim Überfahren der Menüleiste, Tastatur, Kontextmenü gleich - Dialoge sperren nur den Inhalt: Hauptfenster bleibt verschiebbar/maximierbar; Dialoge haben eigenen Taskleisten-Eintrag; Klick auf gesperrten Inhalt holt den Dialog nach vorn (blinkt) - Trennlinie zwischen Händler- und Positionsliste sichtbar und ziehbar, Position wird gemerkt - Strg+Rücktaste / Strg+Entf löschen ganze Wörter in allen Eingabefeldern Behoben: - Gedrückte Knöpfe zeigten keine Beschriftung (activeForeground gehört in Tk zur Klasse Background) - Tipp des Tages: Text lief aus dem sichtbaren Bereich - Größenänderung: breiterer Griffbereich mit Ecken, Zeiger wird zuverlässig zurückgesetzt, flüssiger; Verschieben über Windows selbst (inkl. Andocken), Minimieren über Windows - Zeichen, die MS Sans Serif nicht hat (…, ▸, →, •), durch Win95-übliche ersetzt - Menü/Tooltip/Dialog: Größe+Position zusammen setzen (Tk ignoriert sonst die Position) - Suche reagiert erst nach kurzer Tipp-Pause (flüssigeres Tippen) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2b2d5e8580
commit
dcb1d0378c
15 files changed
+1217
-187
No files matched your search
+77
-11
@@ -9,7 +9,7 @@ from provtool.db import CAPS_ANBIETER, CAPS_WERT, Datenbank, Haendler
|
||||
from provtool.gui import win95 as w
|
||||
from provtool.importer import ANBIETER
|
||||
|
||||
# Auswahl im Händler-Dialog: Schlüssel → Anzeige
|
||||
# Auswahl im Händler-Dialog: Schlüssel -> Anzeige
|
||||
KENNUNG_ARTEN = {"freenet": "freenet (Unterhändler-Nr.)", "vodafone": "Vodafone (VO-Nr.)",
|
||||
CAPS_ANBIETER: "Vodafone (Name in GROSSBUCHSTABEN)"}
|
||||
CAPS_TEXT = "Kunden-Nachname komplett in GROSSBUCHSTABEN"
|
||||
@@ -100,7 +100,7 @@ class HaendlerDialog(w.Dialog):
|
||||
r3.pack(fill="both", expand=True)
|
||||
rf = tk.Frame(g3, bg=w.FACE)
|
||||
rf.pack(fill="x", pady=(4, 0))
|
||||
tk.Label(rf, text="Regeln entstehen im Hauptfenster über „Prozent…“.", fg=w.SHADOW).pack(side="left")
|
||||
tk.Label(rf, text="Regeln entstehen im Hauptfenster über „Prozent...“.", fg=w.SHADOW).pack(side="left")
|
||||
w.knopf(rf, "Entfernen", self._regel_weg).pack(side="right")
|
||||
|
||||
unten = tk.Frame(self, bg=w.FACE)
|
||||
@@ -292,7 +292,7 @@ class ProzentDialog(w.Dialog):
|
||||
from provtool.money import apply_percent
|
||||
try:
|
||||
p = parse_percent(self.v.get())
|
||||
self.vorschau.configure(text=f"→ Auszahlung ca. {fmt(apply_percent(self.summe_orig, p))}")
|
||||
self.vorschau.configure(text=f"-> Auszahlung ca. {fmt(apply_percent(self.summe_orig, p))}")
|
||||
except ValueError:
|
||||
self.vorschau.configure(text="(ungültiger Wert)")
|
||||
|
||||
@@ -327,7 +327,7 @@ class AbrechnungenDialog(w.Dialog):
|
||||
k = tk.Frame(self, bg=w.FACE)
|
||||
k.pack(fill="x", padx=10, pady=10)
|
||||
w.knopf(k, "Öffnen", self._oeffnen, breite=10, default="active").pack(side="left")
|
||||
w.knopf(k, "Umbenennen…", self._umbenennen, breite=12).pack(side="left", padx=6)
|
||||
w.knopf(k, "Umbenennen...", self._umbenennen, breite=12).pack(side="left", padx=6)
|
||||
w.knopf(k, "Löschen", self._loeschen, breite=10).pack(side="left")
|
||||
w.knopf(k, "Abbrechen", self.abbrechen, breite=10).pack(side="right")
|
||||
self.bind("<Return>", lambda e: self._oeffnen())
|
||||
@@ -440,7 +440,7 @@ class ImportBericht(w.Dialog):
|
||||
tk.Label(self, text="Nicht zugeordnete Kennungen (kein Händler hinterlegt – z. B. eigene Filiale):",
|
||||
anchor="w").pack(fill="x", padx=10, pady=(10, 2))
|
||||
r2, self.ut = w.scroll_tree(self, columns=("anbieter", "kennung", "anzahl", "summe"), show="headings",
|
||||
height=min(6, len(unbekannt)), selectmode="browse")
|
||||
height=min(6, len(unbekannt)), selectmode="extended")
|
||||
for c, h, b, a in (("anbieter", "Anbieter", 90, "w"), ("kennung", "Kennung", 140, "w"),
|
||||
("anzahl", "Pos.", 50, "e"), ("summe", "Summe", 90, "e")):
|
||||
self.ut.heading(c, text=h)
|
||||
@@ -451,16 +451,82 @@ class ImportBericht(w.Dialog):
|
||||
k = tk.Frame(self, bg=w.FACE)
|
||||
k.pack(fill="x", padx=10, pady=10)
|
||||
if unbekannt:
|
||||
w.knopf(k, "Kennung einem Händler zuordnen…", self._zuordnen).pack(side="left")
|
||||
w.knopf(k, "Kennung einem Händler zuordnen...", self._zuordnen).pack(side="left")
|
||||
w.knopf(k, "Als eigene ausblenden...", self._eigen).pack(side="left", padx=6)
|
||||
w.knopf(k, "OK", self.abbrechen, breite=10, default="active").pack(side="right")
|
||||
self.bind("<Return>", lambda e: self.abbrechen())
|
||||
|
||||
def _zuordnen(self):
|
||||
s = self.ut.selection()
|
||||
if s:
|
||||
self.result = tuple(s[0].split("\t", 1))
|
||||
a, k = s[0].split("\t", 1)
|
||||
self.result = ("zuordnen", a, k)
|
||||
self.destroy()
|
||||
|
||||
def _eigen(self):
|
||||
s = self.ut.selection()
|
||||
if s:
|
||||
self.result = ("eigen", [tuple(x.split("\t", 1)) for x in s])
|
||||
self.destroy()
|
||||
|
||||
|
||||
class EigeneKennungenDialog(w.Dialog):
|
||||
"""Kennungen der eigenen Filiale: Positionen damit werden ausgeblendet und nicht exportiert."""
|
||||
|
||||
def __init__(self, master, db: Datenbank):
|
||||
super().__init__(master, "Eigene Kennungen")
|
||||
self.db, self.geaendert = db, False
|
||||
tk.Label(self, text="Positionen mit diesen Kennungen gehören zur eigenen Filiale. Sie werden\n"
|
||||
"ausgeblendet, nicht mitgerechnet und nicht exportiert.\n"
|
||||
"(Ist eine Kennung einem Händler zugeordnet, hat der Händler Vorrang.)",
|
||||
justify="left", anchor="w").pack(fill="x", padx=10, pady=(10, 4))
|
||||
r, self.tree = w.scroll_tree(self, columns=("anbieter", "wert"), show="headings", height=7,
|
||||
selectmode="extended")
|
||||
self.tree.heading("anbieter", text="Anbieter")
|
||||
self.tree.heading("wert", text="Unterhändler-Nr. / VO-Nr.")
|
||||
self.tree.column("anbieter", width=100)
|
||||
self.tree.column("wert", width=200)
|
||||
r.pack(fill="both", expand=True, padx=10)
|
||||
z = tk.Frame(self, bg=w.FACE)
|
||||
z.pack(fill="x", padx=10, pady=6)
|
||||
self.v_anb = tk.StringVar(value="freenet")
|
||||
ttk.Combobox(z, textvariable=self.v_anb, values=list(ANBIETER.values()), width=10,
|
||||
state="readonly").pack(side="left")
|
||||
self.v_wert = tk.StringVar()
|
||||
e = tk.Entry(z, textvariable=self.v_wert, width=18)
|
||||
e.pack(side="left", padx=4)
|
||||
e.bind("<Return>", lambda ev: self._dazu())
|
||||
w.knopf(z, "Hinzufügen", self._dazu).pack(side="left")
|
||||
w.knopf(z, "Entfernen", self._weg).pack(side="left", padx=4)
|
||||
self.knopfleiste([("Schließen", self.abbrechen)]).pack(pady=(0, 10))
|
||||
self._laden()
|
||||
|
||||
def _laden(self):
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
for a, k in self.db.eigene_kennungen():
|
||||
self.tree.insert("", "end", iid=f"{a}\t{k}", values=(ANBIETER.get(a, a), k))
|
||||
|
||||
def _dazu(self):
|
||||
wert = self.v_wert.get().strip()
|
||||
if not wert:
|
||||
return
|
||||
anb = next((k for k, v in ANBIETER.items() if v == self.v_anb.get()), self.v_anb.get())
|
||||
self.db.eigene_setzen(anb, wert, True)
|
||||
self.v_wert.set("")
|
||||
self.geaendert = True
|
||||
self._laden()
|
||||
|
||||
def _weg(self):
|
||||
for iid in self.tree.selection():
|
||||
a, k = iid.split("\t", 1)
|
||||
self.db.eigene_setzen(a, k, False)
|
||||
self.geaendert = True
|
||||
self._laden()
|
||||
|
||||
def abbrechen(self):
|
||||
self.result = self.geaendert
|
||||
self.destroy()
|
||||
|
||||
|
||||
class KennungZuordnen(w.Dialog):
|
||||
"""Fragt, ob eine Kennung einem bestehenden oder neuen Händler zugeordnet werden soll."""
|
||||
@@ -473,7 +539,7 @@ class KennungZuordnen(w.Dialog):
|
||||
self.v = tk.StringVar(value="__neu__")
|
||||
f = tk.Frame(self, bg=w.FACE)
|
||||
f.pack(fill="x", padx=20)
|
||||
tk.Radiobutton(f, text="Neuem Händler …", variable=self.v, value="__neu__").pack(anchor="w")
|
||||
tk.Radiobutton(f, text="Neuem Händler ...", variable=self.v, value="__neu__").pack(anchor="w")
|
||||
haendler = db.haendler_liste()
|
||||
if haendler:
|
||||
tk.Radiobutton(f, text="Bestehendem Händler:", variable=self.v, value="__alt__").pack(anchor="w")
|
||||
@@ -515,7 +581,7 @@ class HaendlerWaehlen(w.Dialog):
|
||||
self.cb = ttk.Combobox(self, values=list(self._hmap) + [self.KEINER], state="readonly", width=40)
|
||||
self.cb.pack(padx=12, pady=4)
|
||||
tk.Label(self, text="Die feste Zuweisung hat Vorrang vor Kennungen und der GROSSBUCHSTABEN-Regel.\n"
|
||||
"Rückgängig: Rechtsklick ▸ „Automatisch zuordnen“.", justify="left",
|
||||
"Rückgängig: Rechtsklick > „Automatisch zuordnen“.", justify="left",
|
||||
fg=w.SHADOW).pack(fill="x", padx=12)
|
||||
self.bind("<Return>", lambda e: self._ok())
|
||||
self.knopfleiste([("OK", self._ok), ("Abbrechen", self.abbrechen)]).pack(pady=12)
|
||||
@@ -571,7 +637,7 @@ class ExportDialog(w.Dialog):
|
||||
tk.Label(g, text="Zielordner:").grid(row=1, column=0, sticky="w")
|
||||
self.v_ordner = tk.StringVar(value=settings.get("export_ordner") or "")
|
||||
tk.Entry(g, textvariable=self.v_ordner, width=40).grid(row=1, column=1, sticky="we", pady=2)
|
||||
w.knopf(g, "Durchsuchen…", self._ordner).grid(row=1, column=2, padx=(4, 0))
|
||||
w.knopf(g, "Durchsuchen...", self._ordner).grid(row=1, column=2, padx=(4, 0))
|
||||
self.v_anb = tk.BooleanVar(value=settings.get("export_pro_anbieter", True))
|
||||
self.v_kopf = tk.BooleanVar(value=settings.get("export_kopfzeile", False))
|
||||
self.v_sum = tk.BooleanVar(value=settings.get("export_summe", True))
|
||||
@@ -637,7 +703,7 @@ class EinstellungenDialog(w.Dialog):
|
||||
row=0, column=0, columnspan=2, sticky="w")
|
||||
self.v = tk.StringVar(value=db_pfad)
|
||||
tk.Entry(g, textvariable=self.v, width=56).grid(row=1, column=0, sticky="we", pady=4)
|
||||
w.knopf(g, "Ändern…", self._waehlen).grid(row=1, column=1, padx=(4, 0))
|
||||
w.knopf(g, "Ändern...", self._waehlen).grid(row=1, column=1, padx=(4, 0))
|
||||
tk.Label(g, text="Tipp: Liegt die Datei auf einem Netzlaufwerk, können mehrere PCs dieselben\n"
|
||||
"Händler nutzen – aber bitte nicht gleichzeitig damit arbeiten.",
|
||||
justify="left", fg=w.SHADOW).grid(row=2, column=0, columnspan=2, sticky="w")
|
||||
|
||||
Reference in new issue
Block a user