Daniel Brötzmann pushed to branch master at gajim / gajim

Commits:

6 changed files:

Changes:

  • gajim/gtk/controls/base.py
    ... ... @@ -1507,12 +1507,13 @@ def scroll_messages(self,
    1507 1507
                     msg_type == 'sent' and not self.correcting and (
    
    1508 1508
                         not history[pos - 1].startswith('/') or
    
    1509 1509
                         history[pos - 1].startswith('/me'))):
    
    1510
    -            self.correcting = True
    
    1511
    -            self.msg_textview.get_style_context().add_class(
    
    1512
    -                'gajim-msg-correcting')
    
    1513
    -            message = history[pos - 1]
    
    1514
    -            msg_buf.set_text(message)
    
    1515
    -            return
    
    1510
    +            if self.last_sent_msg is not None:
    
    1511
    +                self.correcting = True
    
    1512
    +                self.msg_textview.get_style_context().add_class(
    
    1513
    +                    'gajim-msg-correcting')
    
    1514
    +                message = history[pos - 1]
    
    1515
    +                msg_buf.set_text(message)
    
    1516
    +                return
    
    1516 1517
             if self.correcting:
    
    1517 1518
                 # We were previously correcting
    
    1518 1519
                 self.msg_textview.get_style_context().remove_class(
    

  • gajim/gtk/controls/chat.py
    ... ... @@ -414,7 +414,11 @@ def _on_message_sent(self, event):
    414 414
                 return
    
    415 415
     
    
    416 416
             if event.correct_id is None:
    
    417
    -            self.last_sent_msg = event.message_id
    
    417
    +            oob_url = event.additional_data.get_value('gajim', 'oob_url')
    
    418
    +            if oob_url == event.message:
    
    419
    +                self.last_sent_msg = None
    
    420
    +            else:
    
    421
    +                self.last_sent_msg = event.message_id
    
    418 422
     
    
    419 423
             message_id = event.message_id
    
    420 424
     
    

  • gajim/gtk/controls/groupchat.py
    ... ... @@ -1175,7 +1175,11 @@ def _on_message_sent(self, event):
    1175 1175
             # we'll save sent message text when we'll receive it in
    
    1176 1176
             # _nec_gc_message_received
    
    1177 1177
             if event.correct_id is None:
    
    1178
    -            self.last_sent_msg = event.message_id
    
    1178
    +            oob_url = event.additional_data.get_value('gajim', 'oob_url')
    
    1179
    +            if oob_url == event.message:
    
    1180
    +                self.last_sent_msg = None
    
    1181
    +            else:
    
    1182
    +                self.last_sent_msg = event.message_id
    
    1179 1183
             if self.correcting:
    
    1180 1184
                 self.correcting = False
    
    1181 1185
                 self.msg_textview.get_style_context().remove_class(
    

  • gajim/gtk/proxies.py
    ... ... @@ -12,6 +12,8 @@
    12 12
     # You should have received a copy of the GNU General Public License
    
    13 13
     # along with Gajim. If not, see <http://www.gnu.org/licenses/>.
    
    14 14
     
    
    15
    +from typing import Any
    
    16
    +
    
    15 17
     from gi.repository import Gdk
    
    16 18
     from gi.repository import Gtk
    
    17 19
     
    
    ... ... @@ -23,7 +25,7 @@
    23 25
     
    
    24 26
     
    
    25 27
     class ManageProxies(Gtk.ApplicationWindow):
    
    26
    -    def __init__(self):
    
    28
    +    def __init__(self) -> None:
    
    27 29
             Gtk.ApplicationWindow.__init__(self)
    
    28 30
             self.set_name('ManageProxies')
    
    29 31
             self.set_application(app.app)
    
    ... ... @@ -45,12 +47,12 @@ def __init__(self):
    45 47
             self._ui.connect_signals(self)
    
    46 48
             self.show_all()
    
    47 49
     
    
    48
    -    def _on_key_press(self, _widget, event):
    
    50
    +    def _on_key_press(self, _widget: Gtk.Widget, event: Gdk.EventKey) -> None:
    
    49 51
             if event.keyval == Gdk.KEY_Escape:
    
    50 52
                 self.destroy()
    
    51 53
     
    
    52 54
         @staticmethod
    
    53
    -    def _on_destroy(*args):
    
    55
    +    def _on_destroy(*args: Any) -> None:
    
    54 56
             # Window callbacks for updating proxy comboboxes
    
    55 57
             window_pref = get_app_window('Preferences')
    
    56 58
             window_accounts = get_app_window('AccountsWindow')
    
    ... ... @@ -62,14 +64,14 @@ def _on_destroy(*args):
    62 64
             if window_account_wizard is not None:
    
    63 65
                 window_account_wizard.update_proxy_list()
    
    64 66
     
    
    65
    -    def _fill_proxies_treeview(self):
    
    67
    +    def _fill_proxies_treeview(self) -> None:
    
    66 68
             model = self._ui.proxies_treeview.get_model()
    
    67 69
             model.clear()
    
    68 70
             for proxy in app.settings.get_proxies():
    
    69 71
                 iter_ = model.append()
    
    70 72
                 model.set(iter_, 0, proxy)
    
    71 73
     
    
    72
    -    def _init_list(self):
    
    74
    +    def _init_list(self) -> None:
    
    73 75
             self._ui.remove_proxy_button.set_sensitive(False)
    
    74 76
             self._ui.settings_grid.set_sensitive(False)
    
    75 77
             model = Gtk.ListStore(str)
    
    ... ... @@ -82,7 +84,7 @@ def _init_list(self):
    82 84
             self._fill_proxies_treeview()
    
    83 85
             self._ui.proxytype_combobox.set_active(0)
    
    84 86
     
    
    85
    -    def _on_add_proxy_button_clicked(self, _widget):
    
    87
    +    def _on_add_proxy_button_clicked(self, _button: Gtk.Button) -> None:
    
    86 88
             model = self._ui.proxies_treeview.get_model()
    
    87 89
             proxies = app.settings.get_proxies()
    
    88 90
             i = 1
    
    ... ... @@ -95,7 +97,7 @@ def _on_add_proxy_button_clicked(self, _widget):
    95 97
             model.set(iter_, 0, proxy_name)
    
    96 98
             self._ui.proxies_treeview.set_cursor(model.get_path(iter_))
    
    97 99
     
    
    98
    -    def _on_remove_proxy_button_clicked(self, _widget):
    
    100
    +    def _on_remove_proxy_button_clicked(self, _button: Gtk.Button) -> None:
    
    99 101
             sel = self._ui.proxies_treeview.get_selection()
    
    100 102
             if not sel:
    
    101 103
                 return
    
    ... ... @@ -110,23 +112,25 @@ def _on_remove_proxy_button_clicked(self, _widget):
    110 112
             self._on_proxies_treeview_cursor_changed(self._ui.proxies_treeview)
    
    111 113
             self._block_signal = False
    
    112 114
     
    
    113
    -    def _on_useauth_toggled(self, widget):
    
    115
    +    def _on_useauth_toggled(self, checkbutton: Gtk.CheckButton) -> None:
    
    114 116
             if self._block_signal:
    
    115 117
                 return
    
    116
    -        act = widget.get_active()
    
    118
    +        act = checkbutton.get_active()
    
    117 119
             proxy = self._ui.proxyname_entry.get_text()
    
    118 120
             app.settings.set_proxy_setting(proxy, 'useauth', act)
    
    119 121
             self._ui.proxyuser_entry.set_sensitive(act)
    
    120 122
             self._ui.proxypass_entry.set_sensitive(act)
    
    121 123
     
    
    122
    -    def _on_proxies_treeview_cursor_changed(self, widget):
    
    124
    +    def _on_proxies_treeview_cursor_changed(self,
    
    125
    +                                            treeview: Gtk.TreeView
    
    126
    +                                            ) -> None:
    
    123 127
             self._block_signal = True
    
    124 128
             self._ui.proxyhost_entry.set_text('')
    
    125 129
             self._ui.proxyport_entry.set_text('')
    
    126 130
             self._ui.proxyuser_entry.set_text('')
    
    127 131
             self._ui.proxypass_entry.set_text('')
    
    128 132
     
    
    129
    -        sel = widget.get_selection()
    
    133
    +        sel = treeview.get_selection()
    
    130 134
             if sel:
    
    131 135
                 (model, iter_) = sel.get_selected()
    
    132 136
             else:
    
    ... ... @@ -162,11 +166,14 @@ def _on_proxies_treeview_cursor_changed(self, widget):
    162 166
     
    
    163 167
             self._block_signal = False
    
    164 168
     
    
    165
    -    def _on_proxies_treeview_key_press_event(self, widget, event):
    
    169
    +    def _on_proxies_treeview_key_press_event(self,
    
    170
    +                                             widget: Gtk.Widget,
    
    171
    +                                             event: Gdk.EventKey
    
    172
    +                                             ) -> None:
    
    166 173
             if event.keyval == Gdk.KEY_Delete:
    
    167 174
                 self._on_remove_proxy_button_clicked(widget)
    
    168 175
     
    
    169
    -    def _on_proxyname_entry_changed(self, widget):
    
    176
    +    def _on_proxyname_entry_changed(self, entry: Gtk.Entry) -> None:
    
    170 177
             if self._block_signal:
    
    171 178
                 return
    
    172 179
             sel = self._ui.proxies_treeview.get_selection()
    
    ... ... @@ -176,7 +183,7 @@ def _on_proxyname_entry_changed(self, widget):
    176 183
             if not iter_:
    
    177 184
                 return
    
    178 185
             old_name = model.get_value(iter_, 0)
    
    179
    -        new_name = widget.get_text()
    
    186
    +        new_name = entry.get_text()
    
    180 187
             if new_name == '':
    
    181 188
                 return
    
    182 189
             if new_name == old_name:
    
    ... ... @@ -185,7 +192,7 @@ def _on_proxyname_entry_changed(self, widget):
    185 192
             app.settings.rename_proxy(old_name, new_name)
    
    186 193
             model.set_value(iter_, 0, new_name)
    
    187 194
     
    
    188
    -    def _on_proxytype_combobox_changed(self, _widget):
    
    195
    +    def _on_proxytype_combobox_changed(self, _combobox: Gtk.ComboBox) -> None:
    
    189 196
             if self._block_signal:
    
    190 197
                 return
    
    191 198
             types = ['http', 'socks5']
    
    ... ... @@ -195,14 +202,14 @@ def _on_proxytype_combobox_changed(self, _widget):
    195 202
             proxy = self._ui.proxyname_entry.get_text()
    
    196 203
             app.settings.set_proxy_setting(proxy, 'type', types[type_])
    
    197 204
     
    
    198
    -    def _on_proxyhost_entry_changed(self, entry):
    
    205
    +    def _on_proxyhost_entry_changed(self, entry: Gtk.Entry) -> None:
    
    199 206
             if self._block_signal:
    
    200 207
                 return
    
    201 208
             value = entry.get_text()
    
    202 209
             proxy = self._ui.proxyname_entry.get_text()
    
    203 210
             app.settings.set_proxy_setting(proxy, 'host', value)
    
    204 211
     
    
    205
    -    def _on_proxyport_entry_changed(self, entry):
    
    212
    +    def _on_proxyport_entry_changed(self, entry: Gtk.Entry) -> None:
    
    206 213
             if self._block_signal:
    
    207 214
                 return
    
    208 215
             value = entry.get_text()
    
    ... ... @@ -213,14 +220,14 @@ def _on_proxyport_entry_changed(self, entry):
    213 220
             proxy = self._ui.proxyname_entry.get_text()
    
    214 221
             app.settings.set_proxy_setting(proxy, 'port', value)
    
    215 222
     
    
    216
    -    def _on_proxyuser_entry_changed(self, entry):
    
    223
    +    def _on_proxyuser_entry_changed(self, entry: Gtk.Entry) -> None:
    
    217 224
             if self._block_signal:
    
    218 225
                 return
    
    219 226
             value = entry.get_text()
    
    220 227
             proxy = self._ui.proxyname_entry.get_text()
    
    221 228
             app.settings.set_proxy_setting(proxy, 'user', value)
    
    222 229
     
    
    223
    -    def _on_proxypass_entry_changed(self, entry):
    
    230
    +    def _on_proxypass_entry_changed(self, entry: Gtk.Entry) -> None:
    
    224 231
             if self._block_signal:
    
    225 232
                 return
    
    226 233
             value = entry.get_text()
    

  • gajim/gtk/remove_account.py
    ... ... @@ -12,11 +12,15 @@
    12 12
     # You should have received a copy of the GNU General Public License
    
    13 13
     # along with Gajim. If not, see <http://www.gnu.org/licenses/>.
    
    14 14
     
    
    15
    +from typing import Any
    
    16
    +from typing import List
    
    17
    +
    
    15 18
     import logging
    
    16 19
     
    
    17 20
     from gi.repository import Gtk
    
    18 21
     
    
    19 22
     from nbxmpp.errors import StanzaError
    
    23
    +from nbxmpp.task import Task
    
    20 24
     
    
    21 25
     from gajim.common import app
    
    22 26
     from gajim.common import ged
    
    ... ... @@ -33,7 +37,7 @@
    33 37
     
    
    34 38
     
    
    35 39
     class RemoveAccount(Assistant):
    
    36
    -    def __init__(self, account):
    
    40
    +    def __init__(self, account: str) -> None:
    
    37 41
             Assistant.__init__(self)
    
    38 42
     
    
    39 43
             self.account = account
    
    ... ... @@ -83,11 +87,14 @@ def _on_account_disconnected(self, _event):
    83 87
                 self.show_page('success')
    
    84 88
                 app.interface.remove_account(self.account)
    
    85 89
     
    
    86
    -    def _set_remove_from_server_checkbox(self):
    
    90
    +    def _set_remove_from_server_checkbox(self) -> None:
    
    87 91
             enabled = self._client is not None and self._client.state.is_available
    
    88 92
             self.get_page('remove_choice').set_remove_from_server(enabled)
    
    89 93
     
    
    90
    -    def _on_button_clicked(self, _assistant, button_name):
    
    94
    +    def _on_button_clicked(self,
    
    95
    +                           _assistant: Assistant,
    
    96
    +                           button_name: str
    
    97
    +                           ) -> None:
    
    91 98
             page = self.get_current_page()
    
    92 99
             if button_name == 'remove':
    
    93 100
                 if page == 'remove_choice':
    
    ... ... @@ -104,7 +111,7 @@ def _on_button_clicked(self, _assistant, button_name):
    104 111
             if button_name == 'close':
    
    105 112
                 self.destroy()
    
    106 113
     
    
    107
    -    def _on_remove(self, *args):
    
    114
    +    def _on_remove(self, *args: Any) -> None:
    
    108 115
             if self.get_page('remove_choice').remove_from_server:
    
    109 116
                 self._client.set_remove_account(True)
    
    110 117
                 self._client.get_module('Register').unregister(
    
    ... ... @@ -119,7 +126,7 @@ def _on_remove(self, *args):
    119 126
             self._client.disconnect(gracefully=True, reconnect=False)
    
    120 127
             self._account_removed = True
    
    121 128
     
    
    122
    -    def _on_remove_response(self, task):
    
    129
    +    def _on_remove_response(self, task: Task) -> None:
    
    123 130
             try:
    
    124 131
                 task.finish()
    
    125 132
             except StanzaError as error:
    
    ... ... @@ -132,12 +139,12 @@ def _on_remove_response(self, task):
    132 139
     
    
    133 140
             self._account_removed = True
    
    134 141
     
    
    135
    -    def _on_destroy(self, *args):
    
    142
    +    def _on_destroy(self, *args: Any) -> None:
    
    136 143
             self._destroyed = True
    
    137 144
     
    
    138 145
     
    
    139 146
     class RemoveChoice(Page):
    
    140
    -    def __init__(self, account):
    
    147
    +    def __init__(self, account: str) -> None:
    
    141 148
             Page.__init__(self)
    
    142 149
             self.title = _('Remove Account')
    
    143 150
     
    
    ... ... @@ -176,10 +183,10 @@ def __init__(self, account):
    176 183
             self.show_all()
    
    177 184
     
    
    178 185
         @property
    
    179
    -    def remove_from_server(self):
    
    186
    +    def remove_from_server(self) -> bool:
    
    180 187
             return self._server.get_active()
    
    181 188
     
    
    182
    -    def set_remove_from_server(self, enabled):
    
    189
    +    def set_remove_from_server(self, enabled: bool) -> None:
    
    183 190
             self._server.set_sensitive(enabled)
    
    184 191
             if enabled:
    
    185 192
                 self._server.set_tooltip_text('')
    
    ... ... @@ -187,27 +194,27 @@ def set_remove_from_server(self, enabled):
    187 194
                 self._server.set_active(False)
    
    188 195
                 self._server.set_tooltip_text(_('Account has to be connected'))
    
    189 196
     
    
    190
    -    def get_visible_buttons(self):
    
    197
    +    def get_visible_buttons(self) -> List[str]:
    
    191 198
             return ['remove']
    
    192 199
     
    
    193 200
     
    
    194 201
     class Error(ErrorPage):
    
    195
    -    def __init__(self):
    
    202
    +    def __init__(self) -> None:
    
    196 203
             ErrorPage.__init__(self)
    
    197 204
             self.set_title(_('Account Removal Failed'))
    
    198 205
             self.set_heading(_('Account Removal Failed'))
    
    199 206
     
    
    200
    -    def get_visible_buttons(self):
    
    207
    +    def get_visible_buttons(self) -> List[str]:
    
    201 208
             return ['back']
    
    202 209
     
    
    203 210
     
    
    204 211
     class Success(SuccessPage):
    
    205
    -    def __init__(self):
    
    212
    +    def __init__(self) -> None:
    
    206 213
             SuccessPage.__init__(self)
    
    207 214
             self.set_title(_('Account Removed'))
    
    208 215
             self.set_heading(_('Account Removed'))
    
    209 216
             self.set_text(
    
    210 217
                 _('Your account has has been removed successfully.'))
    
    211 218
     
    
    212
    -    def get_visible_buttons(self):
    
    219
    +    def get_visible_buttons(self) -> List[str]:
    
    213 220
             return ['close']

  • gajim/gtk/video_preview.py
    ... ... @@ -12,15 +12,18 @@
    12 12
     # You should have received a copy of the GNU General Public License
    
    13 13
     # along with Gajim. If not, see <http://www.gnu.org/licenses/>.
    
    14 14
     
    
    15
    +from typing import Optional
    
    16
    +
    
    15 17
     import logging
    
    16 18
     
    
    17 19
     from gi.repository import GLib
    
    20
    +from gi.repository import Gtk
    
    18 21
     
    
    19 22
     from gajim.common import app
    
    20 23
     from gajim.common.i18n import _
    
    21 24
     
    
    22
    -from . import gstreamer
    
    23 25
     from .builder import get_builder
    
    26
    +from .gstreamer import create_gtk_widget
    
    24 27
     
    
    25 28
     try:
    
    26 29
         from gi.repository import Gst  # pylint: disable=ungrouped-imports
    
    ... ... @@ -32,32 +35,32 @@
    32 35
     
    
    33 36
     
    
    34 37
     class VideoPreview:
    
    35
    -    def __init__(self):
    
    38
    +    def __init__(self) -> None:
    
    36 39
     
    
    37 40
             self._ui = get_builder('video_preview.ui')
    
    38 41
     
    
    39 42
             self._active = False
    
    40 43
     
    
    41
    -        self._av_pipeline = None
    
    42
    -        self._av_src = None
    
    43
    -        self._av_sink = None
    
    44
    -        self._av_widget = None
    
    44
    +        self._av_pipeline: Optional[Gst.Pipeline] = None
    
    45
    +        self._av_src: Optional[Gst.Bin] = None
    
    46
    +        self._av_sink: Optional[Gst.Element] = None
    
    47
    +        self._av_widget: Optional[Gtk.Widget] = None
    
    45 48
     
    
    46 49
         @property
    
    47
    -    def widget(self):
    
    50
    +    def widget(self) -> Gtk.Box:
    
    48 51
             return self._ui.video_preview_box
    
    49 52
     
    
    50 53
         @property
    
    51
    -    def is_active(self):
    
    54
    +    def is_active(self) -> bool:
    
    52 55
             return self._active
    
    53 56
     
    
    54
    -    def toggle_preview(self, value):
    
    57
    +    def toggle_preview(self, value: bool) -> None:
    
    55 58
             self._active = value
    
    56 59
             if value:
    
    57 60
                 return self._enable_preview()
    
    58 61
             return self._disable_preview()
    
    59 62
     
    
    60
    -    def _enable_preview(self):
    
    63
    +    def _enable_preview(self) -> None:
    
    61 64
             src_name = app.settings.get('video_input_device')
    
    62 65
             try:
    
    63 66
                 self._av_src = Gst.parse_bin_from_description(src_name, True)
    
    ... ... @@ -67,7 +70,7 @@ def _enable_preview(self):
    67 70
                 self._set_error_text()
    
    68 71
                 return
    
    69 72
     
    
    70
    -        sink, widget, name = gstreamer.create_gtk_widget()
    
    73
    +        sink, widget, name = create_gtk_widget()
    
    71 74
             if sink is None:
    
    72 75
                 log.error('Failed to obtain a working Gstreamer GTK+ sink, '
    
    73 76
                           'video support will be disabled')
    
    ... ... @@ -95,7 +98,7 @@ def _enable_preview(self):
    95 98
             self._av_src.link(self._av_sink)
    
    96 99
             self._av_pipeline.set_state(Gst.State.PLAYING)
    
    97 100
     
    
    98
    -    def _disable_preview(self):
    
    101
    +    def _disable_preview(self) -> None:
    
    99 102
             if self._av_pipeline is not None:
    
    100 103
                 self._av_pipeline.set_state(Gst.State.NULL)
    
    101 104
                 if self._av_src is not None:
    
    ... ... @@ -112,7 +115,7 @@ def _disable_preview(self):
    112 115
                 self._av_widget = None
    
    113 116
             self._av_pipeline = None
    
    114 117
     
    
    115
    -    def _set_sink_text(self, sink_name):
    
    118
    +    def _set_sink_text(self, sink_name: str) -> None:
    
    116 119
             text = ''
    
    117 120
             if sink_name == 'gtkglsink':
    
    118 121
                 text = _('<span color="green" font-weight="bold">'
    
    ... ... @@ -124,10 +127,10 @@ def _set_sink_text(self, sink_name):
    124 127
     
    
    125 128
             self._ui.video_source_label.set_markup(text)
    
    126 129
     
    
    127
    -    def _set_error_text(self):
    
    130
    +    def _set_error_text(self) -> None:
    
    128 131
             self._ui.video_source_label.set_text(
    
    129 132
                 _('Something went wrong. Video feature disabled.'))
    
    130 133
     
    
    131
    -    def refresh(self):
    
    134
    +    def refresh(self) -> None:
    
    132 135
             self.toggle_preview(False)
    
    133 136
             self.toggle_preview(True)