From 57507598ccc9c71e51bf37b6f06dcb057feafd74 Mon Sep 17 00:00:00 2001 From: Ferrari Martino Giordano Date: Tue, 16 Apr 2024 16:54:06 +0200 Subject: [PATCH] feat: added support to samples --- autodoc/common.py | 3 +- autodoc/doc_state.py | 1 + viewr/xdsample.py | 192 ++++++++++++++++++++++++++++++------------- 3 files changed, 138 insertions(+), 58 deletions(-) diff --git a/autodoc/common.py b/autodoc/common.py index 42498d8..6c833a0 100644 --- a/autodoc/common.py +++ b/autodoc/common.py @@ -34,8 +34,9 @@ def signal_byte_size(sig): nod = 1 if "NumberOfDimensions" not in sig else int(sig["NumberOfDimensions"]) nod = nod if nod > 0 else 1 noe = noe if noe > 0 else 1 + nos = 1 if "Samples" not in sig else int(sig["Samples"]) bytes = type_bytes_count(sig["Type"]) - tot = noe * nod + tot = noe * nod * nos if "Ranges" in sig: tot = 0 diff --git a/autodoc/doc_state.py b/autodoc/doc_state.py index 4a9fc78..b614616 100644 --- a/autodoc/doc_state.py +++ b/autodoc/doc_state.py @@ -86,6 +86,7 @@ __set_keys__ = ( "Alias", "Type", "DataSource", + "Samples", "NumberOfElements", "NumberOfDimensions", "Ranges", diff --git a/viewr/xdsample.py b/viewr/xdsample.py index c13686d..c6eb6dd 100644 --- a/viewr/xdsample.py +++ b/viewr/xdsample.py @@ -29,6 +29,63 @@ import xdot.ui from gi.repository import Gdk, Gio, GObject, Gtk +class ControlPanel(Gtk.Box): + def __init__(self): + super().__init__(orientation=Gtk.Orientation.VERTICAL, spacing=5) + # Place the control panel in the top right + self.set_halign(Gtk.Align.END) + self.set_valign(Gtk.Align.START) + + # Add the .control-panel CSS class to this widget + context = self.get_style_context() + context.add_class("control-panel") + + def add_group(self, group): + self.pack_start(group, False, False, 0) + + +class ControlPanelGroup(Gtk.Expander): + def __init__(self, title: str): + Gtk.Expander.__init__(self, label=title) + self._inner = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) + + # Set the size request to 200 pixels wide + self.set_size_request(200, -1) + + # Add a bit of margin after the header + self._inner.set_margin_top(5) + + self.add(self._inner) + + def add_row(self, widget): + self._inner.pack_start(widget, False, False, 0) + + +class MyControlPanel(ControlPanel): + def __init__(self): + super().__init__() + self._first_panel = ControlPanelGroup("Some Buttons") + self._first_panel.add_row(Gtk.Button(label="Button 1")) + self._first_panel.add_row(Gtk.Button(label="Button 2")) + self.add_group(self._first_panel) + + self._second_panel = ControlPanelGroup("Extra Settings") + self._second_panel.add_row(Gtk.Button(label="Button 3")) + self._second_panel.add_row(Gtk.Button(label="Button 4")) + self._second_panel.add_row(Gtk.CheckButton.new_with_label("First checkbox")) + self._second_panel.add_row(Gtk.CheckButton.new_with_label("Second checkbox")) + + combo = Gtk.ComboBoxText() + combo.append("first", "First Choice") + combo.append("second", "Second Choice") + combo.append("third", "Third Choice") + combo.append("forth", "This one is quite long") + combo.set_active_id("first") + self._second_panel.add_row(combo) + + self.add_group(self._second_panel) + + def __icon_button__(icon_name: str) -> Gtk.Button: icon = Gio.ThemedIcon(name=icon_name) image = Gtk.Image.new_from_gicon(icon, Gtk.IconSize.BUTTON) @@ -44,59 +101,45 @@ def get_handler_id(obj, signal_name): ) -class MyDotWindow(Gtk.Window): +class MainView(Gtk.Grid): def __init__(self): - super().__init__(title="Test") - self.set_border_width(10) - self.set_default_size(400, 200) + super().__init__() + self.searchbar = Gtk.SearchBar() self.dot = xdot.ui.DotWidget() + self.searchentry = Gtk.SearchEntry() + self.searchbar.connect_entry(self.searchentry) + self.searchbar.add(self.searchentry) - hb = Gtk.HeaderBar() - hb.set_show_close_button(True) - self.set_titlebar(hb) + self.searchentry.connect("search-changed", self.search) + self.searchentry.connect("stop-search", self.search_close) - box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) - Gtk.StyleContext.add_class(box.get_style_context(), "linked") - button = __icon_button__("zoom-in") - button.connect("clicked", self.dot.on_zoom_in) - box.add(button) - button = __icon_button__("zoom-out") - button.connect("clicked", self.dot.on_zoom_out) - box.add(button) - box.add(Gtk.SeparatorToolItem()) - button = __icon_button__("zoom-fit-best") - button.connect("clicked", self.dot.on_zoom_fit) - box.add(button) - button = __icon_button__("zoom-original") - button.connect("clicked", self.dot.on_zoom_100) - box.add(button) + # Create the overlay widget + self._overlay = Gtk.Overlay() - hb.pack_start(box) + # Add our editor and control panel as overlays + self._overlay.add_overlay(self.dot) + self._overlay.add_overlay(MyControlPanel()) - box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) - Gtk.StyleContext.add_class(box.get_style_context(), "linked") - self.search_entry = Gtk.Entry() - self.search_entry.connect("activate", self.search) - self.search_entry.connect("changed", self.search) - self.search_entry.connect("key-press-event", self.search_key_pressed) - self.search_entry.set_placeholder_text("Search...") + self.attach(self.searchbar, 0, 1, 1, 1) + self.attach(self._overlay, 0, 0, 1, 1) + self.dot.set_hexpand(True) + self.dot.set_vexpand(True) - box.add(self.search_entry) - button = __icon_button__("edit-find") - button.connect("clicked", self.search) - box.add(button) - - hb.pack_end(box) - - self.add(self.dot) - - self.set_focus(self.dot) + self.dot.grab_focus() self.dot.connect("clicked", self.on_click) self.dot.disconnect(get_handler_id(self.dot, "key-press-event")) self.dot.connect("key-press-event", self.on_key_pressed) + self.dot.connect("button-press-event", self.on_focus) + + def open_dotcode(self, path): + fp = open(path, "rb") + self.dot.set_dotcode(fp.read(), path) def set_dotcode(self, code): - self.dot.set_dotcode(code) + try: + self.dot.set_dotcode(code) + except AssertionError as e: + print("something wrong:", e) def find_text(self, entry_text): found_items = [] @@ -114,16 +157,18 @@ class MyDotWindow(Gtk.Window): return sorted(found_items, key=operator.methodcaller("get_text")) def search(self, _): - txt = self.search_entry.get_text() + txt = self.searchentry.get_text() if txt: items = self.find_text(txt) self.dot.set_highlight(items, search=True) else: self.dot.set_highlight(None, search=True) - def search_key_pressed(self, _, event): - if event.keyval == 65307: - self.set_focus(self.dot) + def search_close( + self, + _, + ): + self.dot.grab_focus() def on_click(self, _, url, event): print(url, event) @@ -133,9 +178,15 @@ class MyDotWindow(Gtk.Window): if jump is not None: self.dot.animate_to(jump.x, jump.y) + def on_focus(self, widget, _): + self.dot.grab_focus() + def on_key_pressed(self, _, event): if event.keyval in (Gdk.KEY_f, Gdk.KEY_slash): - self.set_focus(self.search_entry) + if self.searchbar.get_search_mode(): + self.searchentry.grab_focus() + else: + self.searchbar.set_search_mode(True) return True if event.keyval == Gdk.KEY_w: self.dot.zoom_to_fit() @@ -167,21 +218,48 @@ class MyDotWindow(Gtk.Window): return True -dotcode = b""" -digraph G { - node [fontname="Hack", shape=rect] - Hello [URL="http://en.wikipedia.org/wiki/Hello"] - World [URL="World,Test - layout.set_attributes(attrs)"] - Test - Hello -> World -} -""" +class MyDotWindow(Gtk.Window): + def __init__(self): + super().__init__(title="Test") + self.set_default_size(400, 200) + self._main_view = MainView() + box = Gtk.VBox() + paned1 = Gtk.Paned() + paned2 = Gtk.Paned() + button1 = Gtk.Button(label="Button1") + button2 = Gtk.Button(label="Button2") + paned1.add1(button1) + paned1.add2(paned2) + paned2.pack1(self._main_view, True, False) + paned2.pack2(button2, False, True) + box.pack_start(paned1, True, True, 0) + + self.add(box) + self.show_all() + + def open_dotcode(self, path): + self._main_view.open_dotcode(path) + + +def install_css(): + screen = Gdk.Screen.get_default() + provider = Gtk.CssProvider() + provider.load_from_data( + b""" + .control-panel { + background-color: rgba(255,255,255, 0.8); + padding: 4px; + border-bottom-left-radius: 4px; + } + """ + ) + Gtk.StyleContext.add_provider_for_screen(screen, provider, 600) def main(): + install_css() window = MyDotWindow() - window.set_dotcode(dotcode) + window.open_dotcode("../output/Test.dot") window.connect("delete-event", Gtk.main_quit) window.show_all() Gtk.main()