소스 검색

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])