|
| 1 | +# pylint: disable=unused-argument, consider-using-f-string, too-many-ancestors |
| 2 | +# pylint: disable=no-member, no-name-in-module, too-few-public-methods, no-name-in-module |
| 3 | +""" |
| 4 | + Message composer screen UI |
| 5 | +""" |
| 6 | + |
| 7 | +import logging |
| 8 | + |
| 9 | +from kivy.app import App |
| 10 | +from kivy.properties import ( |
| 11 | + BooleanProperty, |
| 12 | + ListProperty, |
| 13 | + NumericProperty, |
| 14 | + ObjectProperty, |
| 15 | +) |
| 16 | +from kivy.uix.behaviors import FocusBehavior |
| 17 | +from kivy.uix.boxlayout import BoxLayout |
| 18 | +from kivy.uix.label import Label |
| 19 | +from kivy.uix.recycleview import RecycleView |
| 20 | +from kivy.uix.recycleboxlayout import RecycleBoxLayout |
| 21 | +from kivy.uix.recycleview.layout import LayoutSelectionBehavior |
| 22 | +from kivy.uix.recycleview.views import RecycleDataViewBehavior |
| 23 | +from kivy.uix.screenmanager import Screen |
| 24 | + |
| 25 | +from kivymd.uix.textfield import MDTextField |
| 26 | + |
| 27 | +from pybitmessage import state |
| 28 | +from pybitmessage.bitmessagekivy.get_platform import platform |
| 29 | +from pybitmessage.bitmessagekivy.baseclass.common import ( |
| 30 | + toast, kivy_state_variables, composer_common_dialog |
| 31 | +) |
| 32 | + |
| 33 | +logger = logging.getLogger('default') |
| 34 | + |
| 35 | + |
| 36 | +class Create(Screen): |
| 37 | + """Creates Screen class for kivy Ui""" |
| 38 | + |
| 39 | + def __init__(self, **kwargs): |
| 40 | + """Getting Labels and address from addressbook""" |
| 41 | + super(Create, self).__init__(**kwargs) |
| 42 | + self.kivy_running_app = App.get_running_app() |
| 43 | + self.kivy_state = kivy_state_variables() |
| 44 | + self.dropdown_widget = DropDownWidget() |
| 45 | + self.dropdown_widget.ids.txt_input.starting_no = 2 |
| 46 | + self.add_widget(self.dropdown_widget) |
| 47 | + self.children[0].ids.id_scroll.bind(scroll_y=self.check_scroll_y) |
| 48 | + |
| 49 | + def check_scroll_y(self, instance, somethingelse): # pylint: disable=unused-argument |
| 50 | + """show data on scroll down""" |
| 51 | + if self.children[1].ids.btn.is_open: |
| 52 | + self.children[1].ids.btn.is_open = False |
| 53 | + |
| 54 | + |
| 55 | +class RV(RecycleView): |
| 56 | + """Recycling View class for kivy Ui""" |
| 57 | + |
| 58 | + def __init__(self, **kwargs): |
| 59 | + """Recycling Method""" |
| 60 | + super(RV, self).__init__(**kwargs) |
| 61 | + |
| 62 | + |
| 63 | +class SelectableRecycleBoxLayout( |
| 64 | + FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout |
| 65 | +): |
| 66 | + """Adds selection and focus behaviour to the view""" |
| 67 | + # pylint: disable = duplicate-bases |
| 68 | + |
| 69 | + |
| 70 | +class DropDownWidget(BoxLayout): |
| 71 | + """DropDownWidget class for kivy Ui""" |
| 72 | + |
| 73 | + # pylint: disable=too-many-statements |
| 74 | + |
| 75 | + txt_input = ObjectProperty() |
| 76 | + rv = ObjectProperty() |
| 77 | + |
| 78 | + def __init__(self, **kwargs): |
| 79 | + super(DropDownWidget, self).__init__(**kwargs) |
| 80 | + self.kivy_running_app = App.get_running_app() |
| 81 | + self.kivy_state = kivy_state_variables() |
| 82 | + |
| 83 | + @staticmethod |
| 84 | + def callback_for_msgsend(dt=0): # pylint: disable=unused-argument |
| 85 | + """Callback method for messagesend""" |
| 86 | + state.kivyapp.root.ids.id_create.children[0].active = False |
| 87 | + state.in_sent_method = True |
| 88 | + state.kivyapp.back_press() |
| 89 | + toast("sent") |
| 90 | + |
| 91 | + def reset_composer(self): |
| 92 | + """Method will reset composer""" |
| 93 | + self.ids.ti.text = "" |
| 94 | + self.ids.btn.text = "Select" |
| 95 | + self.ids.txt_input.text = "" |
| 96 | + self.ids.subject.text = "" |
| 97 | + self.ids.body.text = "" |
| 98 | + toast("Reset message") |
| 99 | + |
| 100 | + def auto_fill_fromaddr(self): |
| 101 | + """Fill the text automatically From Address""" |
| 102 | + self.ids.ti.text = self.ids.btn.text |
| 103 | + self.ids.ti.focus = True |
| 104 | + |
| 105 | + def is_camara_attached(self): |
| 106 | + """Checks the camera availability in device""" |
| 107 | + self.parent.parent.parent.ids.id_scanscreen.check_camera() |
| 108 | + is_available = self.parent.parent.parent.ids.id_scanscreen.camera_available |
| 109 | + return is_available |
| 110 | + |
| 111 | + @staticmethod |
| 112 | + def camera_alert(): |
| 113 | + """Show camera availability alert message""" |
| 114 | + feature_unavailable = 'Currently this feature is not available!' |
| 115 | + cam_not_available = 'Camera is not available!' |
| 116 | + alert_text = feature_unavailable if platform == 'android' else cam_not_available |
| 117 | + composer_common_dialog(alert_text) |
| 118 | + |
| 119 | + |
| 120 | +class MyTextInput(MDTextField): |
| 121 | + """MyTextInput class for kivy Ui""" |
| 122 | + |
| 123 | + txt_input = ObjectProperty() |
| 124 | + flt_list = ObjectProperty() |
| 125 | + word_list = ListProperty() |
| 126 | + starting_no = NumericProperty(3) |
| 127 | + suggestion_text = '' |
| 128 | + |
| 129 | + def __init__(self, **kwargs): |
| 130 | + """Getting Text Input.""" |
| 131 | + super(MyTextInput, self).__init__(**kwargs) |
| 132 | + self.__lineBreak__ = 0 |
| 133 | + |
| 134 | + def on_text(self, instance, value): # pylint: disable=unused-argument |
| 135 | + """Find all the occurrence of the word""" |
| 136 | + self.parent.parent.parent.parent.parent.ids.rv.data = [] |
| 137 | + max_recipient_len = 10 |
| 138 | + box_height = 250 |
| 139 | + box_max_height = 400 |
| 140 | + |
| 141 | + matches = [self.word_list[i] for i in range( |
| 142 | + len(self.word_list)) if self.word_list[ |
| 143 | + i][:self.starting_no] == value[:self.starting_no]] |
| 144 | + display_data = [] |
| 145 | + for i in matches: |
| 146 | + display_data.append({'text': i}) |
| 147 | + self.parent.parent.parent.parent.parent.ids.rv.data = display_data |
| 148 | + if len(matches) <= max_recipient_len: |
| 149 | + self.parent.height = (box_height + (len(matches) * 20)) |
| 150 | + else: |
| 151 | + self.parent.height = box_max_height |
| 152 | + |
| 153 | + def keyboard_on_key_down(self, window, keycode, text, modifiers): |
| 154 | + """Keyboard on key Down""" |
| 155 | + if self.suggestion_text and keycode[1] == 'tab' and modifiers is None: |
| 156 | + self.insert_text(self.suggestion_text + ' ') |
| 157 | + return True |
| 158 | + return super(MyTextInput, self).keyboard_on_key_down( |
| 159 | + window, keycode, text, modifiers) |
| 160 | + |
| 161 | + |
| 162 | +class SelectableLabel(RecycleDataViewBehavior, Label): |
| 163 | + """Add selection support to the Label""" |
| 164 | + |
| 165 | + index = None |
| 166 | + selected = BooleanProperty(False) |
| 167 | + selectable = BooleanProperty(True) |
| 168 | + |
| 169 | + def refresh_view_attrs(self, rv, index, data): |
| 170 | + """Catch and handle the view changes""" |
| 171 | + self.index = index |
| 172 | + return super(SelectableLabel, self).refresh_view_attrs(rv, index, data) |
| 173 | + |
| 174 | + def on_touch_down(self, touch): # pylint: disable=inconsistent-return-statements |
| 175 | + """Add selection on touch down""" |
| 176 | + if super(SelectableLabel, self).on_touch_down(touch): |
| 177 | + return True |
| 178 | + if self.collide_point(*touch.pos) and self.selectable: |
| 179 | + return self.parent.select_with_touch(self.index, touch) |
| 180 | + |
| 181 | + def apply_selection(self, rv, index, is_selected): |
| 182 | + """Respond to the selection of items in the view""" |
| 183 | + self.selected = is_selected |
| 184 | + if is_selected: |
| 185 | + logger.debug("selection changed to %s", rv.data[index]) |
| 186 | + rv.parent.txt_input.text = rv.parent.txt_input.text.replace( |
| 187 | + rv.parent.txt_input.text, rv.data[index]["text"] |
| 188 | + ) |
0 commit comments