Improved announce stream UI performance

This commit is contained in:
Mark Qvist 2022-10-06 16:07:03 +02:00
parent 783f0d573a
commit 715d4e27a4
3 changed files with 65 additions and 22 deletions

View File

@ -149,6 +149,10 @@ class SidebandApp(MDApp):
else: else:
self.sideband.start() self.sideband.start()
# Pre-load announce stream widgets
self.init_announces_view()
self.announces_view.update()
################################################# #################################################
# General helpers # # General helpers #
@ -245,6 +249,8 @@ class SidebandApp(MDApp):
else: else:
self.icon = self.sideband.asset_dir+"/icon.png" self.icon = self.sideband.asset_dir+"/icon.png"
self.announces_view = None
screen = Builder.load_string(root_layout) screen = Builder.load_string(root_layout)
return screen return screen
@ -304,6 +310,8 @@ class SidebandApp(MDApp):
self.root.ids.screen_manager.app = self self.root.ids.screen_manager.app = self
self.root.ids.app_version_info.text = "Sideband v"+__version__+" "+__variant__ self.root.ids.app_version_info.text = "Sideband v"+__version__+" "+__variant__
self.root.ids.screen_manager.transition.duration = 0.25
self.root.ids.screen_manager.transition.bind(on_complete=self.screen_transition_complete)
Clock.schedule_once(self.start_core, 3.5) Clock.schedule_once(self.start_core, 3.5)
@ -958,20 +966,23 @@ class SidebandApp(MDApp):
### Announce Stream screen ### Announce Stream screen
###################################### ######################################
def init_announces_view(self, sender=None):
if not self.announces_view:
self.announces_view = Announces(self)
self.sideband.setstate("app.flags.new_announces", True)
for child in self.root.ids.announces_scrollview.children:
self.root.ids.announces_scrollview.remove_widget(child)
self.root.ids.announces_scrollview.add_widget(self.announces_view.get_widget())
def announces_action(self, sender=None): def announces_action(self, sender=None):
self.root.ids.screen_manager.transition.direction = "left" self.root.ids.screen_manager.transition.direction = "left"
self.root.ids.nav_drawer.set_state("closed") self.root.ids.nav_drawer.set_state("closed")
self.announces_view = Announces(self)
if self.sideband.getstate("app.flags.new_announces"):
self.init_announces_view()
# info = "The [b]Announce Stream[/b] feature is not yet implemented in Sideband.\n\nWant it faster? Go to [u][ref=link]https://unsigned.io/sideband[/ref][/u] to support the project." self.announces_view.update()
# self.root.ids.announces_info.text = info
# self.root.ids.announces_info.bind(on_ref_press=link_exec)
for child in self.root.ids.announces_scrollview.children:
self.root.ids.announces_scrollview.remove_widget(child)
self.root.ids.announces_scrollview.add_widget(self.announces_view.get_widget())
self.root.ids.screen_manager.current = "announces_screen" self.root.ids.screen_manager.current = "announces_screen"
self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current)
@ -982,6 +993,9 @@ class SidebandApp(MDApp):
def announce_filter_action(self, sender=None): def announce_filter_action(self, sender=None):
pass pass
def screen_transition_complete(self, sender):
if self.root.ids.screen_manager.current == "announces_screen":
pass
### Keys screen ### Keys screen
###################################### ######################################

View File

@ -622,18 +622,22 @@ class SidebandCore():
return None return None
else: else:
announces = [] announces = []
added_dests = []
for entry in result: for entry in result:
try: try:
announce = { if not entry[2] in added_dests:
"dest": entry[2], announce = {
"data": entry[3].decode("utf-8"), "dest": entry[2],
"time": entry[1], "data": entry[3].decode("utf-8"),
"type": entry[4] "time": entry[1],
} "type": entry[4]
announces.append(announce) }
added_dests.append(entry[2])
announces.append(announce)
except Exception as e: except Exception as e:
RNS.log("Exception while fetching announce from DB: "+str(e), RNS.LOG_ERROR) RNS.log("Exception while fetching announce from DB: "+str(e), RNS.LOG_ERROR)
announces.reverse()
return announces return announces
def _db_conversation(self, context_dest): def _db_conversation(self, context_dest):
@ -855,6 +859,9 @@ class SidebandCore():
db = sqlite3.connect(self.db_path) db = sqlite3.connect(self.db_path)
dbc = db.cursor() dbc = db.cursor()
query = "delete from announce where (source=:source);"
dbc.execute(query, {"source": destination_hash})
query = "INSERT INTO announce (received, source, data, dest_type) values (?, ?, ?, ?)" query = "INSERT INTO announce (received, source, data, dest_type) values (?, ?, ?, ?)"
data = ( data = (
time.time(), time.time(),

View File

@ -23,7 +23,12 @@ class Announces():
self.context_dests = [] self.context_dests = []
self.added_item_dests = [] self.added_item_dests = []
self.list = None self.list = None
self.update() self.fetch_announces()
self.list = MDList()
# self.update()
def fetch_announces(self):
self.announces = self.app.sideband.list_announces()
def reload(self): def reload(self):
self.clear_list() self.clear_list()
@ -37,15 +42,31 @@ class Announces():
self.added_item_dests = [] self.added_item_dests = []
def update(self): def update(self):
self.clear_list() self.fetch_announces()
self.announces = self.app.sideband.list_announces()
self.update_widget() self.update_widget()
self.app.sideband.setstate("app.flags.new_announces", False) self.app.sideband.setstate("app.flags.new_announces", False)
def update_widget(self): def update_widget(self):
if self.list == None: if self.list == None:
self.list = MDList() self.list = MDList()
remove_widgets = []
for item in self.list.children:
if not item.sb_uid in (a["dest"] for a in self.announces):
remove_widgets.append(item)
else:
for announce in self.announces:
if announce["dest"] == item.sb_uid:
if announce["time"] > item.ts:
remove_widgets.append(item)
break
for item in remove_widgets:
if item.sb_uid in self.added_item_dests:
self.added_item_dests.remove(item.sb_uid)
self.list.remove_widget(item)
for announce in self.announces: for announce in self.announces:
context_dest = announce["dest"] context_dest = announce["dest"]
ts = announce["time"] ts = announce["time"]
@ -100,6 +121,7 @@ class Announces():
item = OneLineAvatarIconListItem(text=time_string+": "+disp_name, on_release=gen_info(time_string, context_dest, a_data, dest_type)) item = OneLineAvatarIconListItem(text=time_string+": "+disp_name, on_release=gen_info(time_string, context_dest, a_data, dest_type))
item.add_widget(iconl) item.add_widget(iconl)
item.sb_uid = context_dest item.sb_uid = context_dest
item.ts = ts
def gen_del(dest, item): def gen_del(dest, item):
def x(): def x():
@ -191,7 +213,7 @@ class Announces():
item.add_widget(item.iconr) item.add_widget(item.iconr)
self.added_item_dests.append(context_dest) self.added_item_dests.append(context_dest)
self.list.add_widget(item) self.list.add_widget(item, index=len(self.list.children))
def get_widget(self): def get_widget(self):
return self.list return self.list