Philipp Hörist pushed to branch pinned-chat-dnd at gajim / gajim
Commits: 87dccc70 by lovetox at 2022-08-21T20:19:31+02:00 refactor: Reduce indentation level
- - - - - 1c8b8148 by lovetox at 2022-08-21T20:22:18+02:00 refactor: Move drag logic into drag data received handler
- - - - - c77e67bb by lovetox at 2022-08-21T20:26:44+02:00 refactor: Make code more concise
- - - - - 7c7067dd by lovetox at 2022-08-21T20:53:15+02:00 refactor: Make code more readable
- - - - - d1d6ef5a by lovetox at 2022-08-21T20:54:24+02:00 refactor: Remove unnecessary properties
- - - - - 57f7adb3 by lovetox at 2022-08-21T21:08:40+02:00 refactor: Simplify toggle_chat_pinned()
- - - - - 5d71bdfc by lovetox at 2022-08-21T22:56:44+02:00 refactor: Fix some bugs when dropping under not pinned row
- - - - -
1 changed file:
- gajim/gtk/chat_list.py
Changes:
===================================== gajim/gtk/chat_list.py ===================================== @@ -160,16 +160,22 @@ def emit_unread_changed(self) -> None: count)
def _get_row_before(self, row: ChatRow) -> Optional[ChatRow]: - row = cast(ChatRow, self.get_row_at_index(row.get_index() - 1)) - return row + row_before = self.get_row_at_index(row.get_index() - 1) + if row_before is None: + return + return cast(ChatRow, row_before)
def _get_row_after(self, row: ChatRow) -> Optional[ChatRow]: - row = cast(ChatRow, self.get_row_at_index(row.get_index() + 1)) - return row + row_after = self.get_row_at_index(row.get_index() + 1) + if row_after is None: + return + return cast(ChatRow, row_after)
def _get_last_row(self) -> ChatRow: - row = cast(ChatRow, self.get_row_at_index(len(self.get_children()))) - return row + index = len(self.get_children()) - 1 + last_row = self.get_row_at_index(index) + assert last_row is not None + return cast(ChatRow, last_row)
def set_drag_row(self, row: ChatRow) -> None: self._drag_row = row @@ -185,34 +191,9 @@ def _on_drag_data_received(self, ) -> None:
item_type = selection_data.get_data_type().name() - if item_type == 'CHAT_LIST_ITEM': - row = cast(ChatRow, self.get_row_at_y(y_coord)) - if row: - alloc = row.get_allocation() - hover_row_y = alloc.y - hover_row_height = alloc.height - - if y_coord < hover_row_y + hover_row_height / 2: - row_before = self._get_row_before(row) - row_after = row - else: - row_before = row - row_after = self._get_row_after(row) - else: - row_before = self._get_last_row() - row_after = None - - if self._drag_row in (row_before, row_after): - return - - self._change_pinned_order(row_before, row_after) - else: + if item_type != 'CHAT_LIST_ITEM': log.debug('Unknown item type dropped') - - def _change_pinned_order(self, - row_before: Optional[ChatRow], - row_after: Optional[ChatRow] - ) -> None: + return
assert self._drag_row is not None
@@ -220,24 +201,43 @@ def _change_pinned_order(self, log.debug('Dropped row is not pinned') return
+ row = cast(ChatRow, self.get_row_at_y(y_coord)) + if row is not None: + alloc = row.get_allocation() + hover_row_y = alloc.y + hover_row_height = alloc.height + + if y_coord < hover_row_y + hover_row_height / 2: + row_before = self._get_row_before(row) + row_after = row + else: + row_before = row + row_after = self._get_row_after(row) + else: + row_before = self._get_last_row() + row_after = None + if self._drag_row in (row_before, row_after): - # TODO: already checked this case!? log.debug('Dropped row on self') return
- if row_after is None: - log.debug('Dropped row into empty space') + if row_before is not None and not row_before.is_pinned: + log.debug('Dropped under not pinned row') return
+ self._change_pinned_order(row_before) + + def _change_pinned_order(self, row_before: Optional[ChatRow]) -> None: + assert self._drag_row is not None + self._chat_order.remove(self._drag_row)
if row_before is None: self._chat_order.insert(0, self._drag_row) else: + offset = 0 if row_before.position < self._drag_row.position: offset = 1 - else: - offset = 0 self._chat_order.insert( row_before.position + offset, self._drag_row)
@@ -374,7 +374,7 @@ def add_chat(self, position)
self._chats[key] = row - if position != -1: + if pinned: self._chat_order.insert(position, row)
self.add(row) @@ -451,17 +451,15 @@ def select_chat_number(self, number: int) -> None:
def toggle_chat_pinned(self, account: str, jid: JID) -> None: row = self._chats[(account, jid)] - row.toggle_pinned()
- self._chat_order.clear() - chat_rows = cast(list[ChatRow], self.get_children()) - for row in chat_rows: - if row.is_pinned: - row.position = chat_rows.index(row) - self._chat_order.append(row) - else: - row.position = -1 + if row.is_pinned: + self._chat_order.remove(row) + row.position = -1 + else: + self._chat_order.append(row) + row.position = self._chat_order.index(row)
+ row.toggle_pinned() self.invalidate_sort()
def remove_chat(self, @@ -471,7 +469,7 @@ def remove_chat(self, ) -> None:
row = self._chats.pop((account, jid)) - if row.position != -1: + if row.is_pinned: self._chat_order.remove(row) self.remove(row) row.destroy() @@ -691,7 +689,7 @@ def __init__(self, self.jid = jid self.workspace_id = workspace_id self.type = type_ - self._position = position + self.position = position
self.active_label = ActiveHeader() self.conversations_label = ConversationsHeader() @@ -853,14 +851,6 @@ def header(self, type_: Optional[RowHeaderType]) -> None: def is_pinned(self) -> bool: return self._pinned
- @property - def position(self) -> int: - return self._position - - @position.setter - def position(self, position: int) -> None: - self._position = position - def _on_button_press(self, _widget: Gtk.Widget, event: Gdk.EventButton
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/240f8e5ce059505646b1021326fe4876...