From 3457c0d84b3e42c964a33ee5f44c68b06487ab78 Mon Sep 17 00:00:00 2001 From: Mohammad Osama Khan <mohammad.o@cisinlabs.com> Date: Thu, 20 Oct 2022 21:50:43 +0530 Subject: [PATCH] Added filemanager and image reset icon --- src/bitmessagekivy/main.kv | 12 +++- src/bitmessagekivy/mpybit.py | 98 ++++++++++++++++++++++++++- src/bitmessagekivy/screens_data.json | 4 ++ src/images/kivy/drawer_logo1.png | Bin 0 -> 5930 bytes 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 src/images/kivy/drawer_logo1.png diff --git a/src/bitmessagekivy/main.kv b/src/bitmessagekivy/main.kv index 86dc5936..d55b5f9c 100644 --- a/src/bitmessagekivy/main.kv +++ b/src/bitmessagekivy/main.kv @@ -69,8 +69,8 @@ on_release: app.rest_default_avatar_img() theme_text_color: "Custom" text_color: app.theme_cls.primary_color - opacity: 0 - disabled: True + opacity: 1 if app.have_any_address() else 0 + disabled: False if app.have_any_address() else True MDIconButton: id: file_manager @@ -81,6 +81,9 @@ on_release: app.file_manager_open() theme_text_color: "Custom" text_color: app.theme_cls.primary_color + opacity: 1 if app.have_any_address() else 0 + disabled: False if app.have_any_address() else True + BoxLayout: id: top_box size_hint_y: None @@ -113,9 +116,11 @@ text: 'Select Address' option_cls: Factory.get("MySpinnerOption") font_size: '12.5sp' + text: app.getDefaultAccData(self) color: color_font background_normal: '' background_color: app.theme_cls.primary_color + on_text: app.getCurrentAccountData(self.text) ArrowImg: NavigationItem: id: inbox_cnt @@ -201,6 +206,9 @@ MDNavigationLayout: MDTopAppBar: id: toolbar + title: app.format_address_and_label() + opacity: 1 if app.have_any_address() else 0 + disabled: False if app.have_any_address() else True pos_hint: {"top": 1} md_bg_color: app.theme_cls.primary_color elevation: 10 diff --git a/src/bitmessagekivy/mpybit.py b/src/bitmessagekivy/mpybit.py index 078da423..e02f3326 100644 --- a/src/bitmessagekivy/mpybit.py +++ b/src/bitmessagekivy/mpybit.py @@ -39,8 +39,9 @@ from pybitmessage.bitmessagekivy.get_platform import platform from pybitmessage.bitmessagekivy.baseclass.common import toast, load_image_path, get_identity_list from pybitmessage.bitmessagekivy.load_kivy_screens_data import load_screen_json -from pybitmessage.bitmessagekivy.baseclass.popup import AddAddressPopup +from pybitmessage.bitmessagekivy.baseclass.popup import AddAddressPopup, AddressChangingLoader from pybitmessage.bitmessagekivy.baseclass.login import * # noqa: F401, F403 +from pybitmessage.bitmessagekivy.uikivysignaler import UIkivySignaler from pybitmessage.mock.helper_startup import loadConfig @@ -121,6 +122,9 @@ class NavigateApp(MDApp): def run(self): """Running the widgets""" loadConfig() + kivysignalthread = UIkivySignaler() + kivysignalthread.daemon = True + kivysignalthread.start() self.kivy_state_obj.kivyui_ready.set() super(NavigateApp, self).run() @@ -191,7 +195,10 @@ class NavigateApp(MDApp): def load_screen(self, instance): """This method is used for loading screen on every click""" - if instance.text == 'Trash': + if instance.text == 'Inbox': + self.root.ids.scr_mngr.current = 'inbox' + self.root.ids.id_inbox.children[1].active = True + elif instance.text == 'Trash': self.root.ids.scr_mngr.current = 'trash' try: self.root.ids.id_trash.children[1].active = True @@ -201,7 +208,11 @@ class NavigateApp(MDApp): def load_screen_callback(self, instance, dt=0): """This method is rotating loader for few seconds""" - if instance.text == 'Trash': + if instance.text == 'Inbox': + self.root.ids.id_inbox.ids.ml.clear_widgets() + self.root.ids.id_inbox.loadMessagelist(self.kivy_state_obj.selected_address) + self.root.ids.id_inbox.children[1].active = False + elif instance.text == 'Trash': self.root.ids.id_trash.clear_widgets() self.root.ids.id_trash.add_widget(self.data_screen_dict['Trash'].Trash()) try: @@ -209,6 +220,80 @@ class NavigateApp(MDApp): except Exception as e: self.root.ids.id_trash.children[0].children[1].active = False + @staticmethod + def get_enabled_addresses(): + """Getting list of all the enabled addresses""" + addresses = [addr for addr in config.addresses() + if config.getboolean(str(addr), 'enabled')] + return addresses + + @staticmethod + def format_address(address): + """Formatting address""" + return " ({0})".format(address) + + @staticmethod + def format_label(label): + """Formatting label""" + if label: + f_name = label.split() + truncate_string = '...' + f_name_max_length = 15 + formatted_label = f_name[0][:14].capitalize() + truncate_string if len( + f_name[0]) > f_name_max_length else f_name[0].capitalize() + return formatted_label + return '' + + @staticmethod + def format_address_and_label(address=None): + """Getting formatted address information""" + if not address: + try: + address = NavigateApp.get_enabled_addresses()[0] + except IndexError: + return '' + return "{0}{1}".format( + NavigateApp.format_label(config.get(address, "label")), + NavigateApp.format_address(address) + ) + + def getDefaultAccData(self, instance): + """Getting Default Account Data""" + if self.identity_list: + self.kivy_state_obj.selected_address = first_addr = self.identity_list[0] + return first_addr + return 'Select Address' + + def getCurrentAccountData(self, text): + """Get Current Address Account Data""" + if text != '': + if os.path.exists(os.path.join( + self.image_dir, 'default_identicon', '{}.png'.format(text)) + ): + self.load_selected_Image(text) + else: + self.set_identicon(text) + self.root.ids.content_drawer.ids.reset_image.opacity = 0 + self.root.ids.content_drawer.ids.reset_image.disabled = True + address_label = self.format_address_and_label(text) + self.root_window.children[1].ids.toolbar.title = address_label + self.kivy_state_obj.selected_address = text + AddressChangingLoader().open() + for nav_obj in self.root.ids.content_drawer.children[ + 0].children[0].children[0].children: + nav_obj.active = True if nav_obj.text == 'Inbox' else False + self.fileManagerSetting() + Clock.schedule_once(self.setCurrentAccountData, 0.5) + + def setCurrentAccountData(self, dt=0): + """This method set the current accout data on all the screens""" + self.root.ids.id_inbox.ids.ml.clear_widgets() + self.root.ids.id_inbox.loadMessagelist(self.kivy_state_obj.selected_address) + + self.root.ids.id_sent.ids.ml.clear_widgets() + self.root.ids.id_sent.children[2].children[2].ids.search_field.text = '' + self.root.ids.id_sent.loadSent(self.kivy_state_obj.selected_address) + def fileManagerSetting(self): """This method is for file manager setting""" if not self.root.ids.content_drawer.ids.file_manager.opacity and \ @@ -317,6 +402,13 @@ class NavigateApp(MDApp): return return os.path.join(self.image_dir, 'drawer_logo1.png') + @staticmethod + def have_any_address(): + """Checking existance of any address""" + if config.addresses(): + return True + return False + def reset_login_screen(self): """This method is used for clearing the widgets of random screen""" if self.root.ids.id_newidentity.ids.add_random_bx.children: diff --git a/src/bitmessagekivy/screens_data.json b/src/bitmessagekivy/screens_data.json index 8d21571a..47aeb7ed 100644 --- a/src/bitmessagekivy/screens_data.json +++ b/src/bitmessagekivy/screens_data.json @@ -46,5 +46,9 @@ "kv_string": "trash", "name_screen": "trash", "Import": "from pybitmessage.bitmessagekivy.baseclass.trash import Trash" + }, + "Popups": { + "kv_string": "popup", + "Import": "from pybitmessage.bitmessagekivy.baseclass.popup import *" } } diff --git a/src/images/kivy/drawer_logo1.png b/src/images/kivy/drawer_logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..256f9be6b6eaddbb35b6cec8ee026544f585d07f GIT binary patch literal 5930 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 CB6o5C literal 0 HcmV?d00001