def __init__(self, master, studio, **cnf): super().__init__(master, studio, **cnf) self.body = ScrolledFrame(self, **self.style.dark) self.body.pack(side="top", fill="both", expand=True) self._toggle_btn = Button(self._header, image=get_icon_image("chevron_down", 15, 15), **self.style.dark_button, width=25, height=25) self._toggle_btn.pack(side="right") self._toggle_btn.on_click(self._toggle) self._search_btn = Button(self._header, image=get_icon_image("search", 15, 15), width=25, height=25, **self.style.dark_button) self._search_btn.pack(side="right") self._search_btn.on_click(self.start_search) self.groups = [] self._identity_group = self.add_group(IdentityGroup) self._layout_group = self.add_group(LayoutGroup) self._attribute_group = self.add_group(AttributeGroup) self._empty_frame = Frame(self.body) self.show_empty() self._current = None self._expanded = False
def __init__(self, master, studio=None, **cnf): super().__init__(master, studio, **cnf) self._toggle_btn = Button(self._header, image=get_icon_image("chevron_down", 15, 15), **self.style.button, width=25, height=25) self._toggle_btn.pack(side="right") self._toggle_btn.on_click(self._toggle) self._search_btn = Button( self._header, **self.style.button, image=get_icon_image("search", 15, 15), width=25, height=25, ) self._search_btn.pack(side="right") self._search_btn.on_click(self.start_search) self.body = Frame(self, **self.style.surface) self.body.pack(side="top", fill="both", expand=True) self._empty_label = Label(self.body, **self.style.text_passive) self._selected = None self._expanded = False self._tree = None
def setup_style_pane(self): self.body = ScrolledFrame(self, **self.style.surface) self.body.pack(side="top", fill="both", expand=True) self._toggle_btn = Button(self.get_header(), image=get_icon_image("chevron_down", 15, 15), **self.style.button, width=25, height=25) self._toggle_btn.pack(side="right") self._toggle_btn.on_click(self._toggle) self._search_btn = Button(self.get_header(), image=get_icon_image("search", 15, 15), width=25, height=25, **self.style.button) self._search_btn.pack(side="right") self._search_btn.on_click(self.start_search) self.groups = [] self._empty_frame = Frame(self.body) self.show_empty() self._current = None self._expanded = False self._is_loading = False self._search_query = None
def __init__(self, master, studio=None, **cnf): super().__init__(master, **cnf) self.update_defaults() self.__class__._instance = self if not self.__class__._view_mode: self.__class__._view_mode = StringVar(None, self.get_pref('mode')) self.__class__._transparency_flag = t = BooleanVar(None, self.get_pref('inactive_transparency')) self.__class__._side = side = StringVar(None, self.get_pref('side')) t.trace_add("write", lambda *_: self.set_pref('inactive_transparency', t.get())) self.studio = studio self._header = Frame(self, **self.style.dark, **self.style.dark_highlight_dim, height=30) self._header.pack(side="top", fill="x") self._header.pack_propagate(0) self._header.allow_drag = True Label(self._header, **self.style.dark_text_passive, text=self.name).pack(side="left") self._min = Button(self._header, image=get_icon_image("close", 15, 15), **self.style.dark_button, width=25, height=25) self._min.pack(side="right") self._min.on_click(self.minimize) self._pref = MenuButton(self._header, **self.style.dark_button) self._pref.configure(image=get_icon_image("settings", 15, 15)) self._pref.pack(side="right") self._pref.tooltip("Options") self._search_bar = SearchBar(self._header, height=20) self._search_bar.on_query_clear(self.on_search_clear) self._search_bar.on_query_change(self.on_search_query) menu = self.make_menu(( ("cascade", "View Mode", None, None, {"menu": ( ("radiobutton", "Docked", None, self.open_as_docked, {"variable": self._view_mode, "value": "docked"}), ("radiobutton", "Window", None, self.open_as_window, {"variable": self._view_mode, "value": "window"}), )}), ("cascade", "Position", None, None, {"menu": ( ("radiobutton", "Left", None, lambda: self.reposition("left"), {"variable": self._side, "value": "left"}), ("radiobutton", "Right", None, lambda: self.reposition("right"), {"variable": self._side, "value": "right"}), )}), EnableIf(lambda: self._view_mode.get() == 'window', ("cascade", "Window options", None, None, {"menu": ( ( "checkbutton", "Transparent when inactive", None, None, {"variable": self._transparency_flag}), )})), ("command", "Close", get_icon_image("close", 14, 14), self.minimize, {}), ("separator",), *self.create_menu() ), self._pref) self._pref.config(menu=menu) # self._pref.on_click(self.minimize) self.config(**self.style.dark) self.indicator = None self.window_handle = None self.on_focus(self._on_focus_get) self.on_focus_lost(self._on_focus_release) self.on_close(self.close_window) self._mode_map = { 'window': self.open_as_window, 'docked': self.open_as_docked }
def create_menu(self): return (("command", "Search", get_icon_image("search", 14, 14), self.start_search, {}), ("command", "Expand all", get_icon_image("chevron_down", 14, 14), self.expand_all, {}), ("command", "Collapse all", get_icon_image("chevron_up", 14, 14), self.collapse_all, {}))
def create_menu(self): return ( ("cascade", "Add", get_icon_image("add", 14, 14), None, { "menu": self._get_add_menu() }), ("command", "Delete", get_icon_image("delete", 14, 14), self._delete, {}), ("command", "Search", get_icon_image("search", 14, 14), self.start_search, {}), )
def _get_layouts_as_menu(self): layout_templates = [("radiobutton", i.name, get_icon_image(i.icon, 14, 14), functools.partial(self._switch_layout, i), { "value": i.name, "variable": self.layout_var }) for i in self.LAYOUTS] return (("cascade", "Change layout", get_icon_image("grid", 14, 14), None, { "menu": (layout_templates) }), )
def create_menu(self): return ( ( "command", "Reload custom widgets", get_icon_image("rotate_clockwise", 14, 14), self._reload_custom, {} ), ( "command", "Search", get_icon_image("search", 14, 14), self.start_search, {} ), ("cascade", "Widget set", get_icon_image("blank", 14, 14), None, {"menu": ( *self._widget_sets_as_menu(), )}), )
def _load_images(self): if self.__icons_loaded: return color = self.style.colors["secondary1"] cls = self.__class__ cls.EXPANDED_ICON = get_icon_image("chevron_down", 14, 14, color=color) cls.COLLAPSED_ICON = get_icon_image("chevron_right", 14, 14, color=color) cls.BLANK = get_icon_image("blank", 14, 14) cls.__icons_loaded = True
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 __init__(self, master=None, **config): super().__init__(master, **config) self.widget: PseudoWidget = config.get("widget") self.widget.node = self self.name_pad.configure(text=self.widget.id) self.icon_pad.configure( image=get_icon_image(self.widget.icon, 15, 15))
def get_tool_menu(cls, studio=None, hide_unsupported=True): """ Get all tools functionality as a dynamic menu template that adjusts to expose only tool functionality available based current studio state such as selected widget. :param studio: :param hide_unsupported: Set to false to to disable and not hide unavailable tool functionality :return: tuple of menu templates """ templates = () manipulator = ShowIf if hide_unsupported else EnableIf for tool in cls._tools: template = tool.get_menu(studio) # If tool does not provide a menu ignore it if len(template) < 1: continue # if tool has more than one template entry use a cascade menu # otherwise use if only a single item is available, use as is if len(template) > 1: icon = get_icon_image(tool.icon, 14, 14) if isinstance( tool.icon, str) else tool.icon template = ('cascade', tool.name, icon, None, { 'menu': template }) else: template = template[0] templates += (manipulator(lambda: tool.supports(studio.selected), template), ) # prepend a separator for context menus if len(templates) and hide_unsupported: templates = (('separator', ), ) + templates return tuple(templates)
def render(self): Label(self, **self.style.dark_text, anchor="w", image=get_icon_image(self.value.icon, 14, 14), text=" " + self.value.name, compound='left').pack(fill="x")
def _message(self, text, icon=None): # set default icon to INFO if icon is None: icon = self.ICON_INFO Label(self, **self.style.text, text=text, anchor="w", compound="left", wrap=600, justify="left", pady=5, padx=15, image=get_icon_image(icon, 50, 50) ).pack(side="top", fill="x")
def __init__(self, master, pref_, path, desc, **extra): super(CustomPathControl, self).__init__(master, pref_, path, desc, **extra) clear_btn = self.create_action( get_icon_image("close", 17, 17), self._clear_all, "Clear all" ) clear_btn.pack(side="right", fill="y", padx=5) clear_btn.configure(**self.style.highlight_active) self._list.set_mode(self._list.MULTI_MODE)
def create_menu(self): return ( ("command", "Search", get_icon_image("search", 14, 14), self.start_search, {}), ("cascade", "Widget set", None, None, { "menu": (*self._widget_sets_as_menu(), ) }), )
def __init__(self, master, studio=None, **cnf): super().__init__(master, studio, **cnf) f = Frame(self, **self.style.dark) f.pack(side="top", fill="both", expand=True, pady=4) f.pack_propagate(0) self._variable_pane = ScrolledFrame(f, width=150) self._variable_pane.place(x=0, y=0, relwidth=0.4, relheight=1) self._detail_pane = ScrolledFrame(f, width=150) self._detail_pane.place(relx=0.4, y=0, relwidth=0.6, relheight=1, x=15, width=-20) self._search_btn = Button(self._header, image=get_icon_image("search", 15, 15), width=25, height=25, **self.style.dark_button) self._search_btn.pack(side="right") self._search_btn.on_click(self.start_search) self._add = MenuButton(self._header, **self.style.dark_button) self._add.configure(image=get_icon_image("add", 15, 15)) self._add.pack(side="right") self._delete_btn = Button(self._header, image=get_icon_image("delete", 15, 15), width=25, height=25, **self.style.dark_button) self._delete_btn.pack(side="right") self._delete_btn.on_click(self._delete) self._var_types_menu = self.make_menu(self._get_add_menu(), self._add) self._add.config(menu=self._var_types_menu) self._selected = None self._links = {} self._overlay = Label(f, **self.style.dark_text_passive, text="Add variables", compound="top") self._overlay.configure(image=get_icon_image("add", 25, 25)) self._show_overlay(True) self._editors = []
def __init__(self, master=None, **cnf): super().__init__(master, **cnf, image=get_icon_image("eye", 15, 15)) self.tooltip("Pick Font") self.bind_all('<Button-1>', self.pick, add='+') self.bind_all('<Motion>', self._render, add='+') self.active = False self._grabbed = None self._window = None self._indicator = None
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 _show_overlay(self, flag=True, **kwargs): if flag: kwargs["text"] = kwargs.get("text", self._empty_message) kwargs["image"] = kwargs.get("image", get_icon_image("add", 25, 25)) self._overlay.lift() self._overlay.configure(**kwargs) self._overlay.place(x=0, y=0, relwidth=1, relheight=1) else: self._overlay.place_forget()
def __init__(self, master, studio, **cnf): super().__init__(master, studio, **cnf) self.header = Frame(self, **self.style.surface) self.header.pack(side="top", fill="x") for i, title in enumerate(("Sequence", "Handler", "Add", " " * 3)): Label( self.header, **self.style.text_passive, text=title, anchor="w", ).grid(row=0, column=i, sticky='ew') # set the first two columns to expand evenly for column in range(2): self.header.grid_columnconfigure(column, weight=1, uniform=1) self.bindings = BindingsTable(self) self.bindings.on_value_change(self.modify_item) self.bindings.on_item_delete(self.delete_item) self.bindings.pack(fill="both", expand=True) self._add = Button(self._header, **self.style.button, width=25, height=25, image=get_icon_image("add", 15, 15)) self._add.pack(side="right") self._add.tooltip("Add event binding") self._add.on_click(self.add_new) self._search_btn = Button( self._header, **self.style.button, image=get_icon_image("search", 15, 15), width=25, height=25, ) self._search_btn.pack(side="right") self._search_btn.on_click(self.start_search) self._empty_frame = Label(self.bindings, **self.style.text_passive) self._show_empty(self.NO_SELECTION_MSG)
def __init__(self, master, component: PseudoWidget.__class__, _=None): super().__init__(master) self.config(**self.style.surface) self._icon = Label(self, **self.style.text_accent, image=get_icon_image(component.icon, 15, 15)) self._icon.pack(side="left") self._text = Label(self, **self.style.text, anchor="w", text=component.display_name) self._text.pack(side="left", fill="x") self.bind("<Enter>", self.select) self.bind("<Leave>", self.deselect) self.component = component self.allow_drag = True
def get_features_as_menu(self): # For each feature we create a menu template # The command value is the self.maximize method which will reopen the feature return [ ( "command", # Type f.name, get_icon_image(f.icon, 14, 14), # Label, image functools.partial(f.toggle), # Command built from feature {}) for f in self.features ]
def __init__(self, master=None, **cnf): super().__init__(master, **cnf, image=get_icon_image("colorpicker", 15, 15)) self.tooltip('Pick color from anywhere') self.image = None self.on_click(self.start) self._window = None self._on_pick = None self._color_win = None self._body = None self.active = False self._grabbed = None
def __init__(self, master=None, **config): super().__init__(master, **config) self.widget = config.get("widget") self.widget.bind('<Map>', self.on_map, add=True) self.widget.bind('<Unmap>', self.on_unmap, add=True) setattr(self.widget, "_dbg_node", self) equiv = common.get_studio_equiv(self.widget) icon = equiv.icon if equiv else 'play' self.name_pad.configure(text=self.extract_name(self.widget)) self.icon_pad.configure(image=get_icon_image(icon, 15, 15)) self._loaded = False if not self.widget.winfo_ismapped(): self.on_unmap()
def _create_recent_menu(self, menu): # Dynamically create recent file menu every time menu is posted menu.image = get_icon_image("close", 14, 14) menu.config(**self.style.dark_context_menu) recent = pref.get_recent() for path, label in recent: menu.add("command", label=label, command=functools.partial(self.open_recent, path)) menu.add("command", label="Clear", image=menu.image, command=pref.clear_recent, compound="left")
def _show_progress(self, **kw): self.title(kw.get("title", self.title())) text = kw.get('message', 'progress') icon = None if kw.get('icon'): icon = get_icon_image(kw.get('icon'), 50, 50) Label(self, **self.style.text, text=text, anchor="w", compound="left", wrap=600, justify="left", pady=5, padx=15, image=icon ).pack(side="top", fill="x") self.progress = ProgressBar(self) self.progress.pack(side='top', fill='x', padx=20, pady=20) self.progress.mode(kw.get('mode', ProgressBar.DETERMINATE)) self.progress.color(kw.get('colors', self.style.colors.get('accent', 'white'))) self.progress.interval(kw.get('interval', ProgressBar.DEFAULT_INTERVAL))
def on_search_query(self, query): matches = [] self._variable_pane.clear_children() for item in self.variables: if query in item.name: self._show(item) matches.append(item) if not len(matches): self._show_overlay(True, text="No matches found", image=get_icon_image("search", 25, 25)) else: self.select(matches[0]) self._show_overlay(False)
def __init__(self, master, var, name=None): super().__init__(master) self.var = var self.var_handle: VariableItem = getattr(var, "handle", None) if self.var_handle: self.var_handle._slave_items.append(self) self._name = self.var_handle.name else: self.var.handle = self self._name = name self._slave_items = [] self.configure(**self.style.text, text=self._with_padding(self._name), image=get_icon_image(self.icon, 15, 15), compound="left", anchor="w")
def __init__(self, master, studio=None, **cnf): super().__init__(master, studio, **cnf) self._tree = ComponentTreeView(self) self._tree.pack(side="top", fill="both", expand=True, pady=4) # self._tree.sample() self._tree.on_select(self._trigger_select) self._toggle_btn = Button(self._header, image=get_icon_image("chevron_down", 15, 15), **self.style.dark_button, width=25, height=25) self._toggle_btn.pack(side="right") self._toggle_btn.on_click(self._toggle) self._selected = None self._expanded = False self.studio.designer.node = self._tree