openCom-Companion/sbapp/ui/conversations.py

249 lines
9.6 KiB
Python
Raw Normal View History

2022-04-07 21:03:53 +02:00
import RNS
import time
2022-04-07 21:03:53 +02:00
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
class NewConv(BoxLayout):
pass
class MsgSync(BoxLayout):
pass
class ConvSettings(BoxLayout):
disp_name = StringProperty()
trusted = BooleanProperty()
class Conversations():
def __init__(self, app):
self.app = app
self.context_dests = []
self.added_item_dests = []
self.list = None
self.conversation_dropdown = None
2022-04-07 21:03:53 +02:00
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):
if self.app.sideband.getstate("app.flags.unread_conversations"):
2022-04-07 21:03:53 +02:00
self.clear_list()
self.context_dests = self.app.sideband.list_conversations()
self.update_widget()
self.app.sideband.setstate("app.flags.unread_conversations", False)
self.app.sideband.setstate("app.flags.new_conversations", False)
2022-04-07 21:03:53 +02:00
def update_widget(self):
us = time.time()
RNS.log("Updating conversation list widgets", RNS.LOG_DEBUG)
2022-04-07 21:03:53 +02:00
if self.list == None:
self.list = MDList()
for conv in self.context_dests:
context_dest = conv["dest"]
unread = conv["unread"]
if not context_dest in self.added_item_dests:
if self.app.sideband.is_trusted(context_dest):
if unread:
trust_icon = "email-seal"
else:
trust_icon = "account-check"
else:
if unread:
trust_icon = "email"
else:
trust_icon = "account-question"
2022-10-02 12:45:06 +02:00
iconl = IconLeftWidget(icon=trust_icon, on_release=self.app.conversation_action)
2022-04-07 21:03:53 +02:00
item = OneLineAvatarIconListItem(text=self.app.sideband.peer_display_name(context_dest), on_release=self.app.conversation_action)
item.add_widget(iconl)
item.sb_uid = context_dest
2022-10-02 12:45:06 +02:00
iconl.sb_uid = context_dest
2022-04-07 21:03:53 +02:00
def gen_edit(dest, item):
def x():
dest = self.conversation_dropdown.context_dest
2022-04-07 21:03:53 +02:00
try:
disp_name = self.app.sideband.raw_display_name(dest)
is_trusted = self.app.sideband.is_trusted(dest)
yes_button = MDFlatButton(
text="Save",
font_size=dp(20),
)
no_button = MDFlatButton(
text="Cancel",
font_size=dp(20),
)
dialog_content = ConvSettings(disp_name=disp_name, trusted=is_trusted)
dialog = MDDialog(
title="Conversation with "+RNS.prettyhexrep(dest),
type="custom",
content_cls=dialog_content,
buttons=[ yes_button, no_button ],
2022-10-03 00:56:39 +02:00
# elevation=0,
2022-04-07 21:03:53 +02:00
)
dialog.d_content = dialog_content
def dl_yes(s):
try:
name = dialog.d_content.ids["name_field"].text
trusted = dialog.d_content.ids["trusted_switch"].active
if trusted:
RNS.log("Setting Trusted "+str(trusted))
self.app.sideband.trusted_conversation(dest)
else:
RNS.log("Setting Untrusted "+str(trusted))
self.app.sideband.untrusted_conversation(dest)
RNS.log("Name="+name)
self.app.sideband.named_conversation(name, dest)
except Exception as e:
RNS.log("Error while saving conversation settings: "+str(e), RNS.LOG_ERROR)
dialog.dismiss()
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()
except Exception as e:
RNS.log("Error while creating conversation settings: "+str(e), RNS.LOG_ERROR)
return x
def gen_clear(dest, item):
def x():
dest = self.conversation_dropdown.context_dest
2022-04-07 21:03:53 +02:00
yes_button = MDFlatButton(
text="Yes",
)
no_button = MDFlatButton(
text="No",
)
dialog = MDDialog(
text="Clear all messages in conversation?",
buttons=[ yes_button, no_button ],
2022-10-03 00:56:39 +02:00
# elevation=0,
2022-04-07 21:03:53 +02:00
)
def dl_yes(s):
dialog.dismiss()
self.app.sideband.clear_conversation(dest)
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_del(dest, item):
def x():
yes_button = MDFlatButton(
text="Yes",
)
no_button = MDFlatButton(
text="No",
)
dialog = MDDialog(
text="Delete conversation?",
buttons=[ yes_button, no_button ],
2022-10-03 00:56:39 +02:00
# elevation=0,
2022-04-07 21:03:53 +02:00
)
def dl_yes(s):
dialog.dismiss()
self.app.sideband.delete_conversation(self.conversation_dropdown.context_dest)
2022-04-07 21:03:53 +02:00
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
if self.conversation_dropdown == None:
dmi_h = 40
dm_items = [
{
"viewclass": "OneLineListItem",
"text": "Edit",
"height": dp(dmi_h),
"on_release": gen_edit(context_dest, item)
},
{
"text": "Clear Messages",
"viewclass": "OneLineListItem",
"height": dp(dmi_h),
"on_release": gen_clear(context_dest, item)
},
{
"text": "Delete Conversation",
"viewclass": "OneLineListItem",
"height": dp(dmi_h),
"on_release": gen_del(context_dest, item)
}
]
self.conversation_dropdown = MDDropdownMenu(
caller=None,
items=dm_items,
position="auto",
width_mult=4,
elevation=1,
radius=dp(3),
opening_transition="linear",
opening_time=0.0,
)
2022-04-07 21:03:53 +02:00
item.iconr = IconRightWidget(icon="dots-vertical");
item.dmenu = self.conversation_dropdown
def callback_factory(ref, dest):
2022-04-07 21:03:53 +02:00
def x(sender):
self.conversation_dropdown.context_dest = dest
ref.dmenu.caller = ref.iconr
2022-04-07 21:03:53 +02:00
ref.dmenu.open()
return x
item.iconr.bind(on_release=callback_factory(item, context_dest))
2022-04-07 21:03:53 +02:00
item.add_widget(item.iconr)
self.added_item_dests.append(context_dest)
self.list.add_widget(item)
RNS.log("Updated conversation list widgets in "+RNS.prettytime(time.time()-us), RNS.LOG_DEBUG)
2022-04-07 21:03:53 +02:00
def get_widget(self):
return self.list