Sideband/sbapp/ui/announces.py
2022-10-02 22:00:15 +02:00

197 lines
7.1 KiB
Python

import time
import RNS
from kivy.metrics import dp
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty, BooleanProperty
from kivymd.uix.list import MDList, IconLeftWidget, IconRightWidget, OneLineAvatarIconListItem
from kivymd.uix.menu import MDDropdownMenu
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
if RNS.vendor.platformutils.get_platform() == "android":
from ui.helpers import ts_format
else:
from .helpers import ts_format
class Announces():
def __init__(self, app):
self.app = app
self.context_dests = []
self.added_item_dests = []
self.list = None
self.update()
def reload(self):
self.clear_list()
self.update()
def clear_list(self):
if self.list != None:
self.list.clear_widgets()
self.context_dests = []
self.added_item_dests = []
def update(self):
self.clear_list()
self.announces = self.app.sideband.list_announces()
self.update_widget()
self.app.sideband.setstate("app.flags.new_announces", False)
def update_widget(self):
if self.list == None:
self.list = MDList()
for announce in self.announces:
context_dest = announce["dest"]
ts = announce["time"]
a_data = announce["data"]
dest_type = announce["type"]
if not context_dest in self.added_item_dests:
if self.app.sideband.is_trusted(context_dest):
trust_icon = "account-check"
else:
trust_icon = "account-question"
def gen_info(ts, dest, name, dtype):
def x(sender):
yes_button = MDFlatButton(
text="OK",
)
if dtype == "lxmf.delivery":
ad_text = "[size=22dp]LXMF Peer[/size]\n\nReceived: "+ts+"\nAnnounced Name: "+name+"\nAddress: "+RNS.prettyhexrep(dest)
if dtype == "lxmf.propagation":
ad_text = "[size=22dp]LXMF Propagation Node[/size]\n\nReceived: "+ts+"\nAddress: "+RNS.prettyhexrep(dest)
dialog = MDDialog(
text=ad_text,
buttons=[ yes_button ],
elevation=0,
)
def dl_yes(s):
dialog.dismiss()
yes_button.bind(on_release=dl_yes)
item.dmenu.dismiss()
dialog.open()
return x
time_string = time.strftime(ts_format, time.localtime(ts))
if dest_type == "lxmf.delivery":
disp_name = self.app.sideband.peer_display_name(context_dest)
iconl = IconLeftWidget(icon=trust_icon)
elif dest_type == "lxmf.propagation":
disp_name = "Propagation Node "+RNS.prettyhexrep(context_dest)
iconl = IconLeftWidget(icon="upload-network")
else:
disp_name = "Unknown Announce"
iconl = IconLeftWidget(icon="progress-question")
item = OneLineAvatarIconListItem(text=time_string+": "+disp_name, on_release=gen_info(time_string, context_dest, a_data, dest_type))
item.add_widget(iconl)
item.sb_uid = context_dest
def gen_del(dest, item):
def x():
yes_button = MDFlatButton(
text="Yes",
)
no_button = MDFlatButton(
text="No",
)
dialog = MDDialog(
text="Delete announce?",
buttons=[ yes_button, no_button ],
elevation=0,
)
def dl_yes(s):
dialog.dismiss()
self.app.sideband.delete_announce(dest)
self.reload()
def dl_no(s):
dialog.dismiss()
yes_button.bind(on_release=dl_yes)
no_button.bind(on_release=dl_no)
item.dmenu.dismiss()
dialog.open()
return x
def gen_conv(dest, item):
def x():
item.dmenu.dismiss()
self.app.conversation_from_announce_action(dest)
return x
def gen_set_node(dest, item):
def x():
item.dmenu.dismiss()
self.app.sideband.set_active_propagation_node(dest)
self.app.sideband.config["lxmf_propagation_node"] = dest
self.app.sideband.save_configuration()
return x
if dest_type == "lxmf.delivery":
dm_items = [
{
"viewclass": "OneLineListItem",
"text": "Converse",
"height": dp(40),
"on_release": gen_conv(context_dest, item)
},
# {
# "text": "Delete Announce",
# "viewclass": "OneLineListItem",
# "height": dp(40),
# "on_release": gen_del(context_dest, item)
# }
]
elif dest_type == "lxmf.propagation":
dm_items = [
{
"viewclass": "OneLineListItem",
"text": "Use this Propagation Node",
"height": dp(40),
"on_release": gen_set_node(context_dest, item)
},
]
else:
dm_items = []
item.iconr = IconRightWidget(icon="dots-vertical");
item.dmenu = MDDropdownMenu(
caller=item.iconr,
items=dm_items,
position="center",
width_mult=4,
elevation=1,
radius=dp(3),
)
def callback_factory(ref):
def x(sender):
ref.dmenu.open()
return x
item.iconr.bind(on_release=callback_factory(item))
item.add_widget(item.iconr)
self.added_item_dests.append(context_dest)
self.list.add_widget(item)
def get_widget(self):
return self.list