| ... |
... |
@@ -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
|