fix(ui): resolve layout issues during search filtering
All checks were successful
Code check / Check code (push) Successful in 1m20s
All checks were successful
Code check / Check code (push) Successful in 1m20s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
@@ -126,7 +126,21 @@ class FlowLayout(QLayout):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def heightForWidth(self, width):
|
def heightForWidth(self, width):
|
||||||
return self.doLayout(QRect(0, 0, width, 0), True)
|
# Аналогично фильтруем видимые для тестового расчёта высоты
|
||||||
|
visible_items = []
|
||||||
|
nat_sizes = np.empty((0, 2), dtype=np.int32)
|
||||||
|
for item in self.itemList:
|
||||||
|
if item.widget() and item.widget().isVisible():
|
||||||
|
visible_items.append(item)
|
||||||
|
s = item.sizeHint()
|
||||||
|
new_row = np.array([[s.width(), s.height()]], dtype=np.int32)
|
||||||
|
nat_sizes = np.vstack([nat_sizes, new_row]) if len(nat_sizes) > 0 else new_row
|
||||||
|
|
||||||
|
if len(visible_items) == 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
_, total_height = compute_layout(nat_sizes, width, self._spacing, self._max_scale)
|
||||||
|
return total_height
|
||||||
|
|
||||||
def setGeometry(self, rect):
|
def setGeometry(self, rect):
|
||||||
super().setGeometry(rect)
|
super().setGeometry(rect)
|
||||||
@@ -145,26 +159,46 @@ class FlowLayout(QLayout):
|
|||||||
return size
|
return size
|
||||||
|
|
||||||
def doLayout(self, rect, testOnly):
|
def doLayout(self, rect, testOnly):
|
||||||
N = len(self.itemList)
|
N_total = len(self.itemList)
|
||||||
if N == 0:
|
if N_total == 0:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
nat_sizes = np.empty((N, 2), dtype=np.int32)
|
# Фильтруем только видимые элементы
|
||||||
|
visible_items = []
|
||||||
|
visible_indices = [] # Индексы в оригинальном itemList для установки геометрии
|
||||||
|
nat_sizes = np.empty((0, 2), dtype=np.int32)
|
||||||
for i, item in enumerate(self.itemList):
|
for i, item in enumerate(self.itemList):
|
||||||
s = item.sizeHint()
|
if item.widget() and item.widget().isVisible():
|
||||||
nat_sizes[i, 0] = s.width()
|
visible_items.append(item)
|
||||||
nat_sizes[i, 1] = s.height()
|
visible_indices.append(i)
|
||||||
|
s = item.sizeHint()
|
||||||
|
new_row = np.array([[s.width(), s.height()]], dtype=np.int32)
|
||||||
|
nat_sizes = np.vstack([nat_sizes, new_row]) if len(nat_sizes) > 0 else new_row
|
||||||
|
|
||||||
|
N = len(visible_items)
|
||||||
|
if N == 0:
|
||||||
|
# Если все скрыты, устанавливаем нулевые геометрии для всех
|
||||||
|
if not testOnly:
|
||||||
|
for item in self.itemList:
|
||||||
|
item.setGeometry(QRect())
|
||||||
|
return 0
|
||||||
|
|
||||||
geom_array, total_height = compute_layout(nat_sizes, rect.width(), self._spacing, self._max_scale)
|
geom_array, total_height = compute_layout(nat_sizes, rect.width(), self._spacing, self._max_scale)
|
||||||
|
|
||||||
if not testOnly:
|
if not testOnly:
|
||||||
for i, item in enumerate(self.itemList):
|
# Устанавливаем геометрии только для видимых
|
||||||
x = geom_array[i, 0] + rect.x()
|
for idx, (_vis_idx, item) in enumerate(zip(visible_indices, visible_items, strict=True)):
|
||||||
y = geom_array[i, 1] + rect.y()
|
x = geom_array[idx, 0] + rect.x()
|
||||||
w = geom_array[i, 2]
|
y = geom_array[idx, 1] + rect.y()
|
||||||
h = geom_array[i, 3]
|
w = geom_array[idx, 2]
|
||||||
|
h = geom_array[idx, 3]
|
||||||
item.setGeometry(QRect(QPoint(x, y), QSize(w, h)))
|
item.setGeometry(QRect(QPoint(x, y), QSize(w, h)))
|
||||||
|
|
||||||
|
# Для невидимых — нулевая геометрия
|
||||||
|
for i in range(N_total):
|
||||||
|
if i not in visible_indices:
|
||||||
|
self.itemList[i].setGeometry(QRect())
|
||||||
|
|
||||||
return total_height
|
return total_height
|
||||||
|
|
||||||
class ClickableLabel(QLabel):
|
class ClickableLabel(QLabel):
|
||||||
|
@@ -363,8 +363,9 @@ class GameLibraryManager:
|
|||||||
cover_path, width, height, callback = self.pending_images.pop(game_key)
|
cover_path, width, height, callback = self.pending_images.pop(game_key)
|
||||||
load_pixmap_async(cover_path, width, height, callback)
|
load_pixmap_async(cover_path, width, height, callback)
|
||||||
|
|
||||||
# Force geometry update so FlowLayout accounts for hidden widgets
|
# Force full relayout after visibility changes
|
||||||
if self.gamesListLayout is not None:
|
if self.gamesListLayout is not None:
|
||||||
|
self.gamesListLayout.invalidate() # Принудительно инвалидируем для пересчёта
|
||||||
self.gamesListLayout.update()
|
self.gamesListLayout.update()
|
||||||
if self.gamesListWidget is not None:
|
if self.gamesListWidget is not None:
|
||||||
self.gamesListWidget.updateGeometry()
|
self.gamesListWidget.updateGeometry()
|
||||||
|
Reference in New Issue
Block a user