104 lines
4.3 KiB
Python
104 lines
4.3 KiB
Python
import tkinter as tk
|
|
from tkinter import ttk, messagebox
|
|
from datetime import datetime
|
|
|
|
class DialogoEditarAdocao(tk.Toplevel):
|
|
def __init__(self, parent, bd, adocao_atual):
|
|
super().__init__(parent)
|
|
self.bd = bd
|
|
self.adocao_atual = adocao_atual
|
|
self.result = None
|
|
|
|
self.title("Editar Adoção")
|
|
self.geometry("400x450")
|
|
self.configure(bg="#1e1e1e")
|
|
self.transient(parent)
|
|
self.grab_set()
|
|
|
|
ids_pets_adotados = set()
|
|
for adocao in self.bd.adocoes.listar_todos():
|
|
for item in adocao.itens:
|
|
ids_pets_adotados.add(item.pet.id)
|
|
|
|
ids_pets_desta_adocao = {item.pet.id for item in self.adocao_atual.itens}
|
|
|
|
self.pessoas = self.bd.pessoas.listar_todos()
|
|
self.pets = [p for p in self.bd.pets.listar_todos() if p.id not in ids_pets_adotados or p.id in ids_pets_desta_adocao]
|
|
|
|
self._criar_widgets()
|
|
self._preencher_dados()
|
|
|
|
def _criar_widgets(self):
|
|
main_frame = tk.Frame(self, bg="#1e1e1e", padx=20, pady=20)
|
|
main_frame.pack(fill="both", expand=True)
|
|
|
|
tk.Label(main_frame, text="Adotante:", bg="#1e1e1e", fg="white").pack(anchor="w")
|
|
self.combo_pessoas = ttk.Combobox(main_frame, values=[p.nome for p in self.pessoas], state="readonly")
|
|
self.combo_pessoas.pack(fill="x", pady=(0, 10))
|
|
|
|
tk.Label(main_frame, text="Selecione os Pets (use Ctrl ou Shift para múltiplos):", bg="#1e1e1e", fg="white").pack(anchor="w")
|
|
|
|
pet_frame = tk.Frame(main_frame)
|
|
pet_frame.pack(fill="both", expand=True, pady=(0, 10))
|
|
|
|
self.listbox_pets = tk.Listbox(pet_frame, selectmode=tk.MULTIPLE, bg="#2c2c2c", fg="white", selectbackground="#1f6aa5")
|
|
for pet in self.pets:
|
|
self.listbox_pets.insert(tk.END, f"{pet.nome} ({pet.especie})")
|
|
|
|
scrollbar = ttk.Scrollbar(pet_frame, orient="vertical", command=self.listbox_pets.yview)
|
|
self.listbox_pets.configure(yscrollcommand=scrollbar.set)
|
|
|
|
self.listbox_pets.pack(side="left", fill="both", expand=True)
|
|
scrollbar.pack(side="right", fill="y")
|
|
|
|
tk.Label(main_frame, text="Data da Adoção (DD-MM-AAAA):", bg="#1e1e1e", fg="white").pack(anchor="w")
|
|
self.entry_data = tk.Entry(main_frame, bg="#2c2c2c", fg="white", insertbackground="white")
|
|
self.entry_data.pack(fill="x", pady=(0, 20))
|
|
|
|
botoes_frame = tk.Frame(main_frame, bg="#1e1e1e")
|
|
botoes_frame.pack(fill="x")
|
|
|
|
btn_ok = tk.Button(botoes_frame, text="Salvar", command=self._on_ok, bg="#4CAF50", fg="white", relief="flat")
|
|
btn_ok.pack(side="right", padx=(10, 0))
|
|
|
|
btn_cancelar = tk.Button(botoes_frame, text="Cancelar", command=self.destroy, bg="#f44336", fg="white", relief="flat")
|
|
btn_cancelar.pack(side="right")
|
|
|
|
def _preencher_dados(self):
|
|
try:
|
|
idx_pessoa = [p.id for p in self.pessoas].index(self.adocao_atual.adotante.id)
|
|
self.combo_pessoas.current(idx_pessoa)
|
|
except (ValueError, AttributeError):
|
|
pass
|
|
|
|
ids_pets_adotados = {item.pet.id for item in self.adocao_atual.itens}
|
|
for i, pet in enumerate(self.pets):
|
|
if pet.id in ids_pets_adotados:
|
|
self.listbox_pets.selection_set(i)
|
|
|
|
if self.adocao_atual.itens:
|
|
self.entry_data.insert(0, self.adocao_atual.itens[0].data)
|
|
|
|
def _on_ok(self):
|
|
idx_pessoa = self.combo_pessoas.current()
|
|
if idx_pessoa == -1:
|
|
messagebox.showerror("Erro", "Por favor, selecione um adotante.", parent=self)
|
|
return
|
|
|
|
indices_pets = self.listbox_pets.curselection()
|
|
if not indices_pets:
|
|
messagebox.showerror("Erro", "Por favor, selecione pelo menos um pet.", parent=self)
|
|
return
|
|
|
|
data_str = self.entry_data.get()
|
|
try:
|
|
datetime.strptime(data_str, "%d-%m-%Y")
|
|
except ValueError:
|
|
messagebox.showerror("Erro de Formato", "A data deve estar no formato DD/MM/AAAA.", parent=self)
|
|
return
|
|
|
|
pessoa_selecionada = self.pessoas[idx_pessoa]
|
|
pets_selecionados = [self.pets[i] for i in indices_pets]
|
|
|
|
self.result = {"pessoa": pessoa_selecionada, "pets": pets_selecionados, "data": data_str}
|
|
self.destroy() |