class SearchBar(Frame): def __init__(self, master=None, **cnf): super().__init__(master, **cnf) self.config(**self.style.no_highlight, **self.style.dark) self._entry = Entry(self, **self.style.dark_input) self._clear_btn = Button(self, image=get_icon_image("close", 15, 15), **self.style.dark_button, width=25, height=25) self._clear_btn.pack(side="right", fill="y") self._clear_btn.on_click(self._clear) Label(self, **self.style.dark_text, image=get_icon_image("search", 15, 15)).pack(side="left") self._entry.pack(side="left", fill="both", expand=True, padx=2) self._entry.on_entry(self._change) self._on_change = None self._on_clear = None def focus_set(self): super().focus_set() self._entry.focus_set() def on_query_change(self, func, *args, **kwargs): self._on_change = lambda val: func(val, *args, **kwargs) def on_query_clear(self, func, *args, **kwargs): self._on_clear = lambda: func(*args, **kwargs) def _clear(self, *_): if self._on_clear: self._on_clear() def _change(self, *_): if self._on_change: self._on_change(self._entry.get())
class EventItem(CompoundList.BaseItem): def __init__(self, master, value: EventBinding, index, isolated=False): super().__init__(master, value, index, isolated) self.parent_list = master @property def id(self): return self.value.id def _on_value_change(self): event = EventBinding( self.id, self.sequence.get(), self.handler.get(), self.add_arg.get(), ) self.parent_list._item_changed(event) def _delete_entry(self, *_): self.parent_list._item_deleted(self) # prevent event propagation since item will be deleted return "break" def render(self): self.config(height=40) seq_frame = Frame(self, **self.style.highlight) seq_frame.grid(row=0, column=0, sticky="nsew") seq_frame.pack_propagate(False) self.sequence = Entry(seq_frame, **self.style.input) self.sequence.place(x=0, y=0, relwidth=1, relheight=1, width=-40) self.sequence.set(self.value.sequence) self.sequence.configure(**self.style.no_highlight) self.sequence.focus_set() self.handler = Entry(self, **self.style.input) self.handler.grid(row=0, column=1, sticky="ew") self.handler.set(self.value.handler) self.handler.config(**self.style.highlight) self.add_arg = Checkbutton(self, **self.style.checkbutton) self.add_arg.grid(row=0, column=2, sticky="ew") self.add_arg.set(self.value.add) del_btn = Label(self, **self.style.button, image=get_icon_image("delete", 14, 14)) del_btn.grid(row=0, column=3, sticky='nswe') del_btn.bind("<Button-1>", self._delete_entry) # set the first two columns to expand evenly for column in range(2): self.grid_columnconfigure(column, weight=1, uniform=1) for widget in (self.sequence, self.handler): widget.on_change(self._on_value_change) self.add_arg._var.trace("w", lambda *_: self._on_value_change()) def hide(self): self.pack_forget() def show(self): self.pack(fill="x", pady=1, side="top") def on_hover(self, *_): pass def on_hover_ended(self, *_): pass def update_details(self, value, index): self._index = index self._value = value self.sequence.set(value.sequence) self.handler.set(value.handler) self.add_arg.set(value.add)