Philipp Hörist pushed to branch pinned-chat-dnd at gajim / gajim

Commits:

1 changed file:

Changes:

  • gajim/gtk/chat_list.py
    ... ... @@ -160,16 +160,22 @@ def emit_unread_changed(self) -> None:
    160 160
                            count)
    
    161 161
     
    
    162 162
         def _get_row_before(self, row: ChatRow) -> Optional[ChatRow]:
    
    163
    -        row = cast(ChatRow, self.get_row_at_index(row.get_index() - 1))
    
    164
    -        return row
    
    163
    +        row_before = self.get_row_at_index(row.get_index() - 1)
    
    164
    +        if row_before is None:
    
    165
    +            return
    
    166
    +        return cast(ChatRow, row_before)
    
    165 167
     
    
    166 168
         def _get_row_after(self, row: ChatRow) -> Optional[ChatRow]:
    
    167
    -        row = cast(ChatRow, self.get_row_at_index(row.get_index() + 1))
    
    168
    -        return row
    
    169
    +        row_after = self.get_row_at_index(row.get_index() + 1)
    
    170
    +        if row_after is None:
    
    171
    +            return
    
    172
    +        return cast(ChatRow, row_after)
    
    169 173
     
    
    170 174
         def _get_last_row(self) -> ChatRow:
    
    171
    -        row = cast(ChatRow, self.get_row_at_index(len(self.get_children())))
    
    172
    -        return row
    
    175
    +        index = len(self.get_children()) - 1
    
    176
    +        last_row = self.get_row_at_index(index)
    
    177
    +        assert last_row is not None
    
    178
    +        return cast(ChatRow, last_row)
    
    173 179
     
    
    174 180
         def set_drag_row(self, row: ChatRow) -> None:
    
    175 181
             self._drag_row = row
    
    ... ... @@ -185,34 +191,9 @@ def _on_drag_data_received(self,
    185 191
                                    ) -> None:
    
    186 192
     
    
    187 193
             item_type = selection_data.get_data_type().name()
    
    188
    -        if item_type == 'CHAT_LIST_ITEM':
    
    189
    -            row = cast(ChatRow, self.get_row_at_y(y_coord))
    
    190
    -            if row:
    
    191
    -                alloc = row.get_allocation()
    
    192
    -                hover_row_y = alloc.y
    
    193
    -                hover_row_height = alloc.height
    
    194
    -
    
    195
    -                if y_coord < hover_row_y + hover_row_height / 2:
    
    196
    -                    row_before = self._get_row_before(row)
    
    197
    -                    row_after = row
    
    198
    -                else:
    
    199
    -                    row_before = row
    
    200
    -                    row_after = self._get_row_after(row)
    
    201
    -            else:
    
    202
    -                row_before = self._get_last_row()
    
    203
    -                row_after = None
    
    204
    -
    
    205
    -            if self._drag_row in (row_before, row_after):
    
    206
    -                return
    
    207
    -
    
    208
    -            self._change_pinned_order(row_before, row_after)
    
    209
    -        else:
    
    194
    +        if item_type != 'CHAT_LIST_ITEM':
    
    210 195
                 log.debug('Unknown item type dropped')
    
    211
    -
    
    212
    -    def _change_pinned_order(self,
    
    213
    -                             row_before: Optional[ChatRow],
    
    214
    -                             row_after: Optional[ChatRow]
    
    215
    -                             ) -> None:
    
    196
    +            return
    
    216 197
     
    
    217 198
             assert self._drag_row is not None
    
    218 199
     
    
    ... ... @@ -220,24 +201,43 @@ def _change_pinned_order(self,
    220 201
                 log.debug('Dropped row is not pinned')
    
    221 202
                 return
    
    222 203
     
    
    204
    +        row = cast(ChatRow, self.get_row_at_y(y_coord))
    
    205
    +        if row is not None:
    
    206
    +            alloc = row.get_allocation()
    
    207
    +            hover_row_y = alloc.y
    
    208
    +            hover_row_height = alloc.height
    
    209
    +
    
    210
    +            if y_coord < hover_row_y + hover_row_height / 2:
    
    211
    +                row_before = self._get_row_before(row)
    
    212
    +                row_after = row
    
    213
    +            else:
    
    214
    +                row_before = row
    
    215
    +                row_after = self._get_row_after(row)
    
    216
    +        else:
    
    217
    +            row_before = self._get_last_row()
    
    218
    +            row_after = None
    
    219
    +
    
    223 220
             if self._drag_row in (row_before, row_after):
    
    224
    -            # TODO: already checked this case!?
    
    225 221
                 log.debug('Dropped row on self')
    
    226 222
                 return
    
    227 223
     
    
    228
    -        if row_after is None:
    
    229
    -            log.debug('Dropped row into empty space')
    
    224
    +        if row_before is not None and not row_before.is_pinned:
    
    225
    +            log.debug('Dropped under not pinned row')
    
    230 226
                 return
    
    231 227
     
    
    228
    +        self._change_pinned_order(row_before)
    
    229
    +
    
    230
    +    def _change_pinned_order(self, row_before: Optional[ChatRow]) -> None:
    
    231
    +        assert self._drag_row is not None
    
    232
    +
    
    232 233
             self._chat_order.remove(self._drag_row)
    
    233 234
     
    
    234 235
             if row_before is None:
    
    235 236
                 self._chat_order.insert(0, self._drag_row)
    
    236 237
             else:
    
    238
    +            offset = 0
    
    237 239
                 if row_before.position < self._drag_row.position:
    
    238 240
                     offset = 1
    
    239
    -            else:
    
    240
    -                offset = 0
    
    241 241
                 self._chat_order.insert(
    
    242 242
                     row_before.position + offset, self._drag_row)
    
    243 243
     
    
    ... ... @@ -374,7 +374,7 @@ def add_chat(self,
    374 374
                           position)
    
    375 375
     
    
    376 376
             self._chats[key] = row
    
    377
    -        if position != -1:
    
    377
    +        if pinned:
    
    378 378
                 self._chat_order.insert(position, row)
    
    379 379
     
    
    380 380
             self.add(row)
    
    ... ... @@ -451,17 +451,15 @@ def select_chat_number(self, number: int) -> None:
    451 451
     
    
    452 452
         def toggle_chat_pinned(self, account: str, jid: JID) -> None:
    
    453 453
             row = self._chats[(account, jid)]
    
    454
    -        row.toggle_pinned()
    
    455 454
     
    
    456
    -        self._chat_order.clear()
    
    457
    -        chat_rows = cast(list[ChatRow], self.get_children())
    
    458
    -        for row in chat_rows:
    
    459
    -            if row.is_pinned:
    
    460
    -                row.position = chat_rows.index(row)
    
    461
    -                self._chat_order.append(row)
    
    462
    -            else:
    
    463
    -                row.position = -1
    
    455
    +        if row.is_pinned:
    
    456
    +            self._chat_order.remove(row)
    
    457
    +            row.position = -1
    
    458
    +        else:
    
    459
    +            self._chat_order.append(row)
    
    460
    +            row.position = self._chat_order.index(row)
    
    464 461
     
    
    462
    +        row.toggle_pinned()
    
    465 463
             self.invalidate_sort()
    
    466 464
     
    
    467 465
         def remove_chat(self,
    
    ... ... @@ -471,7 +469,7 @@ def remove_chat(self,
    471 469
                         ) -> None:
    
    472 470
     
    
    473 471
             row = self._chats.pop((account, jid))
    
    474
    -        if row.position != -1:
    
    472
    +        if row.is_pinned:
    
    475 473
                 self._chat_order.remove(row)
    
    476 474
             self.remove(row)
    
    477 475
             row.destroy()
    
    ... ... @@ -691,7 +689,7 @@ def __init__(self,
    691 689
             self.jid = jid
    
    692 690
             self.workspace_id = workspace_id
    
    693 691
             self.type = type_
    
    694
    -        self._position = position
    
    692
    +        self.position = position
    
    695 693
     
    
    696 694
             self.active_label = ActiveHeader()
    
    697 695
             self.conversations_label = ConversationsHeader()
    
    ... ... @@ -853,14 +851,6 @@ def header(self, type_: Optional[RowHeaderType]) -> None:
    853 851
         def is_pinned(self) -> bool:
    
    854 852
             return self._pinned
    
    855 853
     
    
    856
    -    @property
    
    857
    -    def position(self) -> int:
    
    858
    -        return self._position
    
    859
    -
    
    860
    -    @position.setter
    
    861
    -    def position(self, position: int) -> None:
    
    862
    -        self._position = position
    
    863
    -
    
    864 854
         def _on_button_press(self,
    
    865 855
                              _widget: Gtk.Widget,
    
    866 856
                              event: Gdk.EventButton