瀏覽代碼

dnet: update dnet to new urwid version and fix asyncio usage

We were previously relying on idle emulation to redraw the screen. This
is no longer supported as of urwid 2.2.0 and later.

See: https://github.com/urwid/urwid/issues/665
lunar-mining 2 年之前
父節點
當前提交
de3c4eb09f
共有 3 個文件被更改,包括 17 次插入33 次删除
  1. 5 4
      bin/dnet/main.py
  2. 1 1
      bin/dnet/requirements.txt
  3. 11 28
      bin/dnet/view.py

+ 5 - 4
bin/dnet/main.py

@@ -94,14 +94,15 @@ class Dnetview:
                             level=logging.DEBUG)
         nodes = self.config.get("nodes")
 
-        self.ev.create_task(self.start_connect_slots(nodes))
-        self.ev.create_task(self.view.update_view())
-        self.ev.create_task(self.view.render_info())
-
         loop = urwid.MainLoop(self.view.ui, self.view.palette,
                               unhandled_input=self.unhandled_input,
                               event_loop=urwid.AsyncioEventLoop(
                               loop=self.ev))
+
+        self.ev.create_task(self.start_connect_slots(nodes))
+        self.ev.create_task(self.view.update_view(self.ev, loop))
+        self.ev.create_task(self.view.render_info(self.ev, loop))
+
         loop.run()
 
     def unhandled_input(self, key):

+ 1 - 1
bin/dnet/requirements.txt

@@ -1,2 +1,2 @@
 toml==0.10.2
-urwid==2.1.2
+urwid==2.2.3

+ 11 - 28
bin/dnet/view.py

@@ -24,26 +24,6 @@ from scroll import ScrollBar, Scrollable
 from model import Model
 
 
-event_loop = asyncio.get_event_loop()
-
-
-class LeftList(urwid.ListBox):
-
-    def focus_next(self):
-        try: 
-            self.body.set_focus(self.body.get_next(
-                self.body.get_focus()[1])[1])
-        except:
-            pass
-
-    def focus_previous(self):
-        try: 
-            self.body.set_focus(self.body.get_prev(
-                self.body.get_focus()[1])[1])
-        except:
-            pass            
-
-
 class NodeView(urwid.WidgetWrap):
 
     def __init__(self, info):
@@ -153,17 +133,21 @@ class View():
         rightbox = urwid.LineBox(scroll)
         self.listbox_content = []
         self.listwalker = urwid.SimpleListWalker(self.listbox_content)
-        self.list = LeftList(self.listwalker)
+        self.list = urwid.ListBox(self.listwalker)
         leftbox = urwid.LineBox(self.list)
         columns = urwid.Columns([leftbox, rightbox], focus_column=0)
         self.ui = urwid.Frame(urwid.AttrWrap( columns, 'body' ))
 
 
-    async def update_view(self):
+    async def update_view(self, evloop: asyncio.AbstractEventLoop,
+                          loop: urwid.MainLoop):
         known_nodes = []
         known_inbound = []
         while True:
             await asyncio.sleep(0.1)
+            # Redraw the screen
+            evloop.call_soon(loop.draw_screen)
+
             for index, item in enumerate(self.listwalker.contents):
                 known_nodes.append(item.get_name())
 
@@ -240,35 +224,34 @@ class View():
             
 
     # Render subscribe_events() (right menu)
-    async def render_info(self):
+    async def render_info(self, evloop: asyncio.AbstractEventLoop,
+                          loop: urwid.MainLoop):
         while True:
             await asyncio.sleep(0.01)
+            # Redraw the screen
+            evloop.call_soon(loop.draw_screen)
+
             self.pile.contents.clear()
-            logging.debug(self.pile.contents)
             focus_w = self.list.get_focus()
             if focus_w[0] is None:
                 continue
             else:
                 match focus_w[0].get_widget():
                     case "NodeView":
-                        logging.debug("node selected")
                         # TODO: We will display additional node info here.
                         self.pile.contents.append((
                             urwid.Text(f""),
                             self.pile.options()))
                     case "ConnectView":
-                        logging.debug("connection selected")
                         name = focus_w[0].get_name()
                         info = self.model.nodes.get(name[0])
                         if name in info['event']:
                             ev = info['event'].get(name)
-                            logging.debug(f"{ev}")
 
                             self.pile.contents.append((
                                 urwid.Text(f" {ev}"),
                                 self.pile.options()))
                     case "SlotView":
-                        logging.debug("slot selected")
                         addr = focus_w[0].get_addr()
                         name = focus_w[0].get_name()
                         info = self.model.nodes.get(name[0])