import tkinter as tk from tkinter import ttk, messagebox 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): # Título da seção 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("", 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() 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'] 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.") 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 if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pet}'?"): self.bd.pets.remover(id_pet) self.popular_treeview() messagebox.showinfo("Sucesso", "Pet apagada com sucesso.") 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()