コード例 #1
0
ファイル: stylepane.py プロジェクト: mardukbp/Formation
    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
コード例 #2
0
    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
コード例 #3
0
ファイル: stylepane.py プロジェクト: ObaraEmmanuel/Formation
    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
コード例 #4
0
 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
     }
コード例 #5
0
ファイル: stylepane.py プロジェクト: mardukbp/Formation
 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, {}))
コード例 #6
0
 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, {}),
     )
コード例 #7
0
 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)
              }), )
コード例 #8
0
ファイル: components.py プロジェクト: ObaraEmmanuel/Formation
 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(),
         )}),
     )
コード例 #9
0
 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
コード例 #10
0
ファイル: eventspane.py プロジェクト: ObaraEmmanuel/Formation
        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())
コード例 #11
0
 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))
コード例 #12
0
 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)
コード例 #13
0
ファイル: editors.py プロジェクト: Shiloli-r/Formation
 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")
コード例 #14
0
 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")
コード例 #15
0
ファイル: components.py プロジェクト: ObaraEmmanuel/Formation
 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)
コード例 #16
0
 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(), )
         }),
     )
コード例 #17
0
    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 = []
コード例 #18
0
ファイル: panels.py プロジェクト: ObaraEmmanuel/Formation
 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
コード例 #19
0
 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
コード例 #20
0
 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()
コード例 #21
0
ファイル: eventspane.py プロジェクト: ObaraEmmanuel/Formation
    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)
コード例 #22
0
ファイル: components.py プロジェクト: ObaraEmmanuel/Formation
 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
コード例 #23
0
ファイル: main.py プロジェクト: Shiloli-r/Formation
 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
     ]
コード例 #24
0
ファイル: panels.py プロジェクト: ObaraEmmanuel/Formation
 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
コード例 #25
0
 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()
コード例 #26
0
ファイル: main.py プロジェクト: mardukbp/Formation
 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")
コード例 #27
0
 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))
コード例 #28
0
    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)
コード例 #29
0
 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")
コード例 #30
0
    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