Как обнаружить событие наведения для прокручиваемых виджетов ImGui, таких как поле со списком и таблица?Python

Программы на Python
Anonymous
Как обнаружить событие наведения для прокручиваемых виджетов ImGui, таких как поле со списком и таблица?

Сообщение Anonymous »

У меня есть окно, в котором на вкладке виджета вкладки установлен флажок, который включает два разных представления на этой вкладке — представление таблицы и представление поля со списком (см. снимки экрана ниже). Оба показывают список файлов, которые я извлек из определенного каталога (WIP).
Просмотр со списком:
< img alt="введите описание изображения здесь" src="https://i.sstatic.net/pBhhnLWf.png" />
Вид таблицы (показывает только основу каждого файла):
Изображение

Я использую PyGame для управления своим окном, включая обработку пользовательского ввода и контекста OpenGL.
Примечание: Хотя следующая проблема был обнаружен в Python, я не думаю, что он не влияет на базовую версию C++.
Каждый раз, когда пользователь прокручивает колесо мыши, я использую это значение для увеличения и уменьшения масштаба. моя сцена. Однако я, очевидно, не хочу, чтобы это произошло, пока пользователь работает с полем со списком или таблицей (или любым другим виджетом с возможностью прокрутки).
Я попробовал перехватить событие наведения (

Код: Выделить всё

imgui.is_item_hovered()
), но похоже, что событие срабатывает только тогда, когда курсор мыши находится
  • над фактическим списком, а не над раскрывающимся списком его элементов или полоса прокрутки сбоку
  • над заголовком таблицы, а не над ячейками
Вот фрагмент для моего стола

Код: Выделить всё

with imgui.begin_table('Files', 2, imgui.TABLE_BORDERS | imgui.TABLE_SCROLL_Y) as table:
if imgui.is_item_hovered():
# PROCESS HOVER EVENT
if table.opened:
imgui.table_setup_column('Path', imgui.TABLE_COLUMN_WIDTH_STRETCH, 100)
imgui.table_setup_column('Load', imgui.TABLE_COLUMN_WIDTH_FIXED)
imgui.table_setup_scroll_freeze(0, 1)
imgui.table_headers_row()
for path_idx, path_val in enumerate(self.dataloader.paths):
imgui.table_next_row()
# First column shows the filename (no full path, no file extension)
imgui.table_set_column_index(0)
imgui.align_text_to_frame_padding()
imgui.text(Path(path_val).stem)
if imgui.is_item_hovered():
imgui.set_tooltip(path_val)
# Second column shows a checkbox that allows selection to be applied
imgui.table_set_column_index(1)
imgui.align_text_to_frame_padding()
changed, self.paths_to_load[path_idx] = imgui.checkbox('##' + path_val, self.paths_to_load[path_idx])
if changed:
print('Path "{}" will {} be loaded'.format(path_val, '' if self.paths_to_load[path_idx] else 'not'))
и фрагмент для моего поля со списком

Код: Выделить всё

with imgui.begin_combo('Files', self.dataloader.paths[self.obj_path_selected]) as combo:
if combo.opened:
for i, item in enumerate(self.dataloader.paths):
is_selected = (i == self.obj_path_selected)
if imgui.selectable(item, is_selected)[0]:
self.obj_path_selected = i
self.logger.info('Selected OBJ file "{}"'.format(self.dataloader.paths[self.obj_path_selected]))

# Set the initial focus when opening the combo (scrolling + keyboard navigation focus)
if is_selected:
imgui.set_item_default_focus()
if imgui.is_item_hovered():
# PROCESS HOVER EVENT
Заполнитель PROCESS HOVER EVENT — это место, где я обнаружил, что наведение не работает должным образом.
Кажется, я пропустил некоторая важная информация об этом в контексте ImGui.
В качестве возможного решения я также попробовал imgui.core.is_window_hovered() для своего окна. Проблема здесь в том, что он не работает при наведении курсора на таблицу или раскрывающийся список.
imgui.begin('Settings')
if imgui.core.is_window_hovered() :
# СОБЫТИЕ ПРОЦЕССА НАВЕСЕНИЯ ЗДЕСЬ
if self.table_enabled:
# Код таблицы
else:
# Код поля со списком
imgui.end()
Похоже, что оба считаются вне окна, что не имеет смысла. Я бы проявил некоторое понимание, если бы, например, раскрывающееся меню выходило за пределы окна, в котором расположен виджет со списком (и это действительно мой случай, поскольку мои пути относительно длинные). А ячейки таблицы?
Я рассматриваю возможность использования прямоугольников (каждый из которых будет представлять собой ограничивающую рамку проблемного виджета), чтобы определить, находится ли мышь внутри. Особенно для выпадающего списка это было бы очень хитро. Я бы предпочел не делать такую ​​настройку для того, что я считаю важной частью прокручиваемого виджета.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -and-table

Вернуться в «Python»