213 lines
7.8 KiB
Python
213 lines
7.8 KiB
Python
import tkinter as tk
|
|
from tkinter import ttk, messagebox
|
|
from persistencia.excecoes import EntidadeNaoEncontradaException
|
|
|
|
from modelo.pet import Pet
|
|
from visao.componentes.dialogo_adicionar_pet import DialogoAdicionarPet, DialogoEditarPet
|
|
|
|
class FramePet(tk.Frame):
|
|
def __init__(self, master=None, bd=None):
|
|
super().__init__(master, bg="#1e1e1e")
|
|
self.bd = bd
|
|
self._criar_layout()
|
|
|
|
def _criar_layout(self):
|
|
titulo_label = tk.Label(
|
|
self,
|
|
text="GERENCIAR PETS",
|
|
font=("Arial", 24, "bold"),
|
|
bg="#1e1e1e",
|
|
fg="white"
|
|
)
|
|
titulo_label.pack(pady=20)
|
|
|
|
# Frame de busca
|
|
busca_frame = tk.Frame(self, bg="#1e1e1e")
|
|
busca_frame.pack(pady=5, padx=20, fill="x")
|
|
|
|
tk.Label(busca_frame, text="Buscar por ID, Nome ou Espécie:", bg="#1e1e1e", fg="white").pack(side="left", padx=(0, 5))
|
|
self.entry_busca = tk.Entry(busca_frame, bg="#2c2c2c", fg="white", insertbackground="white", width=40)
|
|
self.entry_busca.pack(side="left", fill="x", expand=True)
|
|
self.entry_busca.bind("<Return>", lambda event: self._realizar_busca())
|
|
|
|
btn_buscar = tk.Button(busca_frame, text="Buscar", command=self._realizar_busca, bg="#1f6aa5", fg="white", relief="flat")
|
|
btn_buscar.pack(side="left", padx=5)
|
|
|
|
btn_limpar = tk.Button(busca_frame, text="Limpar", command=self._limpar_busca, bg="#555555", fg="white", relief="flat")
|
|
btn_limpar.pack(side="left", padx=5)
|
|
|
|
# Estilo para a Treeview
|
|
style = ttk.Style()
|
|
style.theme_use("default")
|
|
style.configure("Treeview",
|
|
background="#2c2c2c", # Cor de fundo da Treeview
|
|
foreground="white",
|
|
rowheight=25, # Altura da linha
|
|
fieldbackground="#2c2c2c",
|
|
bordercolor="#2c2c2c",
|
|
borderwidth=0)
|
|
style.map('Treeview', background=[('selected', '#1f6aa5')])
|
|
|
|
style.configure("Treeview.Heading",
|
|
background="#2c2c2c",
|
|
foreground="white",
|
|
font=("Arial", 12, "bold"),
|
|
relief="flat")
|
|
style.map("Treeview.Heading",
|
|
background=[('active', '#3c3c3c')])
|
|
|
|
# Frame para a Treeview e Scrollbar
|
|
tree_container = tk.Frame(self, bg="#1e1e1e")
|
|
tree_container.pack(pady=10, padx=20, fill="both", expand=True)
|
|
|
|
self.tree = ttk.Treeview(tree_container, columns=("id", "nome", "especie"), show="headings")
|
|
self.tree.heading("id", text="ID")
|
|
self.tree.heading("nome", text="Nome", anchor="w")
|
|
self.tree.heading("especie", text="Espécie", anchor="w")
|
|
|
|
self.tree.column("id", width=100, anchor="center", stretch=tk.NO)
|
|
self.tree.column("nome", stretch=tk.YES)
|
|
self.tree.column("especie", stretch=tk.YES)
|
|
|
|
scrollbar = ttk.Scrollbar(tree_container, orient="vertical", command=self.tree.yview)
|
|
self.tree.configure(yscrollcommand=scrollbar.set)
|
|
|
|
self.tree.pack(side="left", fill="both", expand=True)
|
|
scrollbar.pack(side="right", fill="y")
|
|
|
|
self.popular_treeview()
|
|
|
|
# Frame para os botões de ação
|
|
botoes_frame = tk.Frame(self, bg="#1e1e1e")
|
|
botoes_frame.pack(pady=10, padx=20, fill="x")
|
|
|
|
# Botão Adicionar
|
|
btn_adicionar = tk.Button(
|
|
botoes_frame,
|
|
text="Adicionar",
|
|
command=self.adicionar_pet,
|
|
bg="#4CAF50",
|
|
fg="white",
|
|
font=("Arial", 12),
|
|
relief="flat",
|
|
padx=10,
|
|
pady=5
|
|
)
|
|
btn_adicionar.pack(side="left", padx=5)
|
|
|
|
# Botão Alterar
|
|
btn_alterar = tk.Button(
|
|
botoes_frame,
|
|
text="Alterar",
|
|
command=self.alterar_pet,
|
|
bg="#ffc107", # Cor amarela para edição
|
|
fg="white",
|
|
font=("Arial", 12),
|
|
relief="flat",
|
|
padx=10,
|
|
pady=5
|
|
)
|
|
btn_alterar.pack(side="left", padx=5)
|
|
|
|
# Botão Apagar
|
|
btn_apagar = tk.Button(
|
|
botoes_frame,
|
|
text="Apagar",
|
|
command=self.apagar_pet,
|
|
bg="#f44336",
|
|
fg="white",
|
|
font=("Arial", 12),
|
|
relief="flat",
|
|
padx=10,
|
|
pady=5
|
|
)
|
|
btn_apagar.pack(side="left", padx=5)
|
|
|
|
def popular_treeview(self, lista_pets=None):
|
|
for i in self.tree.get_children():
|
|
self.tree.delete(i)
|
|
|
|
if lista_pets is None:
|
|
lista_pets = self.bd.pets.listar_todos()
|
|
|
|
for pet in lista_pets:
|
|
self.tree.insert("", "end", values=(pet.id, pet.nome, pet.especie))
|
|
|
|
def adicionar_pet(self):
|
|
dialog = DialogoAdicionarPet(self)
|
|
if dialog.result:
|
|
nome = dialog.result["nome"]
|
|
especie = dialog.result["especie"]
|
|
proximo_id = self.bd.obter_proximo_id_pet()
|
|
novo_pet = Pet(proximo_id, nome, especie)
|
|
self.bd.pets.inserir(novo_pet)
|
|
self.popular_treeview()
|
|
messagebox.showinfo("Sucesso", "Pet adicionado com sucesso.")
|
|
|
|
def alterar_pet(self):
|
|
selecionado = self.tree.selection()
|
|
if not selecionado:
|
|
messagebox.showwarning("Aviso", "Por favor, selecione um pet para alterar.")
|
|
return
|
|
|
|
item = self.tree.item(selecionado[0])
|
|
id_pet, _, _ = item['values']
|
|
|
|
try:
|
|
pet_atual = self.bd.pets.buscar_por_id(id_pet)
|
|
if not pet_atual:
|
|
messagebox.showerror("Erro", "Pet não encontrado no banco de dados.")
|
|
return
|
|
|
|
dialog = DialogoEditarPet(self, pet_atual)
|
|
self.wait_window(dialog)
|
|
|
|
if dialog.result:
|
|
pet_atual.nome = dialog.result["nome"]
|
|
pet_atual.especie = dialog.result["especie"]
|
|
self.bd.pets.alterar(pet_atual.id, pet_atual)
|
|
self.popular_treeview()
|
|
messagebox.showinfo("Sucesso", "Pet alterado com sucesso.")
|
|
except EntidadeNaoEncontradaException as e:
|
|
messagebox.showerror("Erro", f"Não foi possível alterar: {e}\nA lista será atualizada.")
|
|
self.popular_treeview()
|
|
|
|
def apagar_pet(self):
|
|
selecionado = self.tree.selection()
|
|
if not selecionado:
|
|
messagebox.showwarning("Aviso", "Por favor, selecione um pet para apagar.")
|
|
return
|
|
|
|
item = self.tree.item(selecionado[0])
|
|
id_pet, nome_pet, _ = item['values'] # Ignora a espécie, que agora está na treeview
|
|
|
|
msg = (f"Tem certeza que deseja apagar '{nome_pet}'?\n"
|
|
"AVISO: O pet será removido de todas as adoções existentes.")
|
|
|
|
if messagebox.askyesno("Confirmar Exclusão", msg, icon='warning'):
|
|
try:
|
|
self.bd.remover_pet(id_pet)
|
|
self.popular_treeview()
|
|
messagebox.showinfo("Sucesso", "Pet apagado com sucesso.")
|
|
except EntidadeNaoEncontradaException as e:
|
|
messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.")
|
|
self.popular_treeview()
|
|
|
|
def _realizar_busca(self):
|
|
termo_busca = self.entry_busca.get().strip().lower()
|
|
if not termo_busca:
|
|
self.popular_treeview()
|
|
return
|
|
|
|
todos_pets = self.bd.pets.listar_todos()
|
|
resultados = [
|
|
p for p in todos_pets if
|
|
termo_busca in str(p.id) or
|
|
termo_busca in p.nome.lower() or
|
|
termo_busca in p.especie.lower()
|
|
]
|
|
self.popular_treeview(resultados)
|
|
|
|
def _limpar_busca(self):
|
|
self.entry_busca.delete(0, tk.END)
|
|
self.popular_treeview() |