Преглед изворни кода

script/dnet: render result of get_info() in View

lunar-mining пре 2 година
родитељ
комит
30327e610f
2 измењених фајлова са 119 додато и 28 уклоњено
  1. 2 0
      script/dnet/main.py
  2. 117 28
      script/dnet/view.py

+ 2 - 0
script/dnet/main.py

@@ -108,6 +108,8 @@ class Dnetview:
         loop = urwid.MainLoop(self.view.ui, self.view.palette,
             unhandled_input=self.unhandled_input,
             event_loop=urwid.AsyncioEventLoop(loop=self.ev))
+
+        #loop.set_alarm_in(2, self.view.update_view)
         loop.run()
 
     def unhandled_input(self, key):

+ 117 - 28
script/dnet/view.py

@@ -39,10 +39,11 @@ class LeftList(urwid.ListBox):
     def load_info(self):
         return InfoWidget(self)
 
-class ServiceView(urwid.WidgetWrap):
+class NodeView(urwid.WidgetWrap):
     def __init__(self, info):
-        test = urwid.Text(f"{info}")
-        super().__init__(test)
+        self.name = info
+        self.text = urwid.Text(f"{self.name}")
+        super().__init__(self.text)
         self._w = urwid.AttrWrap(self._w, None)
         self.update_w()
 
@@ -57,13 +58,17 @@ class ServiceView(urwid.WidgetWrap):
     def update_w(self):
         self._w.focus_attr = 'line'
 
-    def name(self):
-        return "ServiceView"
+    def get_widget(self):
+        return "NodeView"
+
+    def get_name(self):
+        return self.name
 
-class SessionView(urwid.WidgetWrap):
+class ConnectView(urwid.WidgetWrap):
     def __init__(self, info):
-        test = urwid.Text(f"{info}")
-        super().__init__(test)
+        self.name = info
+        self.text = urwid.Text(f"{self.name}")
+        super().__init__(self.text)
         self._w = urwid.AttrWrap(self._w, None)
         self.update_w()
 
@@ -79,12 +84,16 @@ class SessionView(urwid.WidgetWrap):
         self._w.focus_attr = 'line'
 
     def name(self):
-        return "SessionView"
+        return "ConnectView"
 
-class ConnectView(urwid.WidgetWrap):
+    def get_name(self):
+        return self.name
+
+class SlotView(urwid.WidgetWrap):
     def __init__(self, info):
-        test = urwid.Text(f"{info}")
-        super().__init__(test)
+        self.name = info
+        self.text = urwid.Text(f"{self.name}")
+        super().__init__(self.text)
         self._w = urwid.AttrWrap(self._w, None)
         self.update_w()
 
@@ -100,7 +109,10 @@ class ConnectView(urwid.WidgetWrap):
         self._w.focus_attr = 'line'
 
     def name(self):
-        return "ConnectView"
+        return "SlotView"
+
+    def get_name(self):
+        return self.name
 
 class View():
     palette = [
@@ -111,42 +123,119 @@ class View():
     def __init__(self, data):
         #logging.debug(f"dnetview init {data}")
 
+        self.data = data
         info_text = urwid.Text("")
         self.pile = urwid.Pile([info_text])
         scroll = ScrollBar(Scrollable(self.pile))
         rightbox = urwid.LineBox(scroll)
         
-        self.service_info = urwid.Text("")
-        widget = ServiceView(self.service_info)
+        #self.node_info = urwid.Text("")
+        #widget = NodeView(self.node_info)
 
-        self.session_info = urwid.Text("")
-        widget2 = SessionView(self.session_info)
+        #self.connect_info = urwid.Text("")
+        #widget2 = ConnectView(self.connect_info)
 
-        self.connect_info = urwid.Text("")
-        widget3 = ConnectView(self.connect_info)
+        #self.slot_info = urwid.Text("")
+        #widget3 = SlotView(self.slot_info)
 
-        self.listbox_content = [widget, widget2, widget3]
-        self.listbox = LeftList(urwid.SimpleListWalker(self.listbox_content))
-        leftbox = urwid.LineBox(self.listbox)
+        self.listbox_content = []
+        self.listwalker = urwid.SimpleListWalker(self.listbox_content)
+        self.list = LeftList(self.listwalker)
+        leftbox = urwid.LineBox(self.list)
 
         columns = urwid.Columns([leftbox, rightbox], focus_column=0)
         self.ui = urwid.Frame(urwid.AttrWrap( columns, 'body' ))
 
+    #def update_view(self, loop, data):
+    #    data = self.data
+
+    #    logging.debug(len(data.nodes))
+    #    for name, values in data.nodes.items():
+    #        self.node_info = urwid.Text(name)
+    #        widget = NodeView(self.node_info)
+    #        self.listbox_content.append(widget)
+
+    #    #loop.set_alarm_in(2, update_view)
+    #    #await asyncio.sleep(0.1)
+
     async def update_view(self, data):
         while True:
-            logging.debug(f"update_view() received model: {data}")
+            names = []
+            for item in self.listwalker.contents:
+                name = item.get_name()
+                names.append(name)
+
+            for name, values in data.nodes.items():
+                if name in names:
+                    continue
+
+                else:
+                    widget = NodeView(name)
+                    self.listwalker.contents.append(widget)
+
+                    info = values["result"]
+                    channels = info["channels"]
+                    channel_lookup = {}
+                    for channel in channels:
+                        id = channel["id"]
+                        channel_lookup[id] = channel
+
+                    for channel in channels:
+                        if channel["session"] != "inbound":
+                            continue
+                        widget = ConnectView("inbound")
+                        self.listwalker.contents.append(widget)
+
+                        url = channel["url"]
+                        widget = SlotView(url)
+                        self.listwalker.contents.append(widget)
+
+                    widget = ConnectView("  outbound")
+                    self.listwalker.contents.append(widget)
+                    for i, id in enumerate(info["outbound_slots"]):
+                        if id == 0:
+                            widget = SlotView(f"  {i}: none")
+                            self.listwalker.contents.append(widget)
+                            continue
+
+                        assert id in channel_lookup
+                        url = channel_lookup[id]["url"]
+                        widget = SlotView(f"  {i}: {url}")
+                        self.listwalker.contents.append(widget)
+
+                    for channel in channels:
+                        if channel["session"] != "seed":
+                            continue
+                        widget = ConnectView("seed")
+                        self.listwalker.contents.append(widget)
+
+                        url = channel["url"]
+                        widget = SlotView(f"  {url}")
+                        self.listwalker.contents.append(widget)
+
+                    for channel in channels:
+                        if channel["session"] != "manual":
+                            continue
+                        widget = ConnectView("manual")
+                        self.listwalker.contents.append(widget)
+
+                        url = channel["url"]
+                        widget = SlotView(url)
+                        self.listwalker.contents.append(widget)
+
+                        print(f"  {url}")
+
             await asyncio.sleep(0.1)
-            self.service_info = urwid.Text("")
-       
+
     async def render_info(self, channels):
         while True:
             await asyncio.sleep(0.1)
             self.pile.contents.clear()
             focus_w = self.listbox.get_focus()
             match focus_w[0].name():
-                case "ServiceView":
+                case "NodeView":
                     self.pile.contents.append((urwid.Text(f""), self.pile.options()))
-                case "SessionView":
-                    self.pile.contents.append((urwid.Text("2"), self.pile.options()))
                 case "ConnectView":
+                    self.pile.contents.append((urwid.Text("2"), self.pile.options()))
+                case "SlotView":
                     self.pile.contents.append((urwid.Text("3"), self.pile.options()))