Skip to content

Commit

Permalink
Fixes for pyside tests
Browse files Browse the repository at this point in the history
  • Loading branch information
berendkleinhaneveld committed May 6, 2024
1 parent c54245c commit 51087ff
Show file tree
Hide file tree
Showing 8 changed files with 493 additions and 294 deletions.
142 changes: 70 additions & 72 deletions tests/data/pyside/app.cgx
Original file line number Diff line number Diff line change
@@ -1,79 +1,77 @@
<template>
<window unified-title-and-tool-bar-on-mac >
<menubar>
<menu title="File">
<action
v-for="toggle in ['dock', 'dock_content', 'dock_title', 'toolbar', 'action', 'statusbar']"
:text="f'Toggle {toggle}'"
:object-name="f'toggle_{toggle}'"
@triggered="partial(lambda toggle: toggle_item(toggle), toggle=toggle)"
/>
<action separator />
<action
text="&Quit"
@triggered="quit"
:role="QtGui.QAction.QuitRole"
/>
</menu>
</menubar>
<widget>
<label text="Main widget" />
<button @clicked="button_clicked" />
<qcombobox
:items="['foo', 'bar']"
@activated="on_combobox_changed"
<window unified-title-and-tool-bar-on-mac >
<menubar>
<menu title="File">
<action
v-for="toggle in ['dock', 'dock_content', 'dock_title', 'toolbar', 'action', 'statusbar']"
:text="f'Toggle {toggle}'"
:object-name="f'toggle_{toggle}'"
@triggered="partial(lambda toggle: toggle_item(toggle), toggle=toggle)()"
/>
</widget>
<dock
v-if="toggles['show_dock']"
:area="docks['dock']"
object-name="dock"
@dock-location-changed="on_dock_location_changed"
>
<widget
v-if="toggles['show_dock_title']"
object-name="dock_title"
title
>
<label text="Title" />
</widget>
<widget
v-if="toggles['show_dock_content']"
object-name="dock_content"
>
<treeview>
<itemmodel :horizontal-header-labels="['Foo', 'Bar']">
<standarditem
v-for="item in standard_items"
v-bind="item"
/>
</itemmodel>
</treeview>
</widget>
</dock>
<dock :area="QtCore.Qt.RightDockWidgetArea">
<widget>
<label text="other" />
</widget>
</dock>
<toolbar
v-if="toggles['show_toolbar']"
object-name="toolbar"
>
<action separator />
<action
v-if="toggles['show_action']"
text="New"
object-name="action"
@triggered="on_new"
text="&Quit"
@triggered="quit"
:role="QtGui.QAction.QuitRole"
/>
</toolbar>
<statusbar
v-if="toggles['show_statusbar']"
object-name="statusbar"
:text="'Hello there', 2000"
</menu>
</menubar>
<widget>
<label text="Main widget" />
<button @clicked="button_clicked" />
<qcombobox
:items="['foo', 'bar']"
@activated="on_combobox_changed"
/>
</widget>
<dock
v-if="toggles['show_dock']"
:area="docks['dock']"
object-name="dock"
@dock-location-changed="on_dock_location_changed"
>
<widget
v-if="toggles['show_dock_title']"
object-name="dock_title"
title
>
<label text="Title" />
</widget>
<widget
v-if="toggles['show_dock_content']"
object-name="dock_content"
>
<treeview>
<itemmodel :horizontal-header-labels="['Foo', 'Bar']">
<standarditem
v-for="item in standard_items"
v-bind="item"
/>
</itemmodel>
</treeview>
</widget>
</dock>
<dock :area="QtCore.Qt.RightDockWidgetArea">
<widget>
<label text="other" />
</widget>
</dock>
<toolbar
v-if="toggles['show_toolbar']"
object-name="toolbar"
>
<action
v-if="toggles['show_action']"
text="New"
object-name="action"
@triggered="on_new"
/>
</window>
</template>
</toolbar>
<statusbar
v-if="toggles['show_statusbar']"
object-name="statusbar"
:text="'Hello there', 2000"
/>
</window>

<script>
from functools import partial
Expand Down
File renamed without changes.
39 changes: 39 additions & 0 deletions tests/pyside/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import pytest


@pytest.fixture(scope="function", autouse=True)
def qapp(qapp_args, qapp_cls, pytestconfig, qtbot):
# workaround for https://bugreports.qt.io/browse/PYSIDE-2575
import asyncio

from PySide6 import QtCore
from PySide6.QtAsyncio import QAsyncioEventLoopPolicy
from PySide6.QtWidgets import QMainWindow
from pytestqt.qt_compat import qt_api

app = qt_api.QtWidgets.QApplication.instance()
if app is None:
assert False
app = qapp_cls(qapp_args)
name = pytestconfig.getini("qt_qapp_name")
app.setApplicationName(name)
else:
# Check that there are not left-over widgets from other tests
assert len(app.topLevelWidgets()) == 0

policy = asyncio.get_event_loop_policy()
if not isinstance(policy, QAsyncioEventLoopPolicy):
asyncio.set_event_loop_policy(QAsyncioEventLoopPolicy())

yield app

for widget in app.topLevelWidgets():
if isinstance(widget, QMainWindow):
widget.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
widget.close()
widget.deleteLater()

# Process events to make sure that widgets will be cleaned up
app.processEvents()

qtbot.waitUntil(lambda: len(app.topLevelWidgets()) == 0, timeout=500)
75 changes: 75 additions & 0 deletions tests/pyside/lists.cgx
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<window>
<widget>
<qsplitter>

<component
v-for="view in ['qlistview', 'qtableview', 'qtreeview']"
:is="view"
>
<qstandarditemmodel :column_count="2">
<qstandarditem
v-for="content in items_content()"

:text="content['text']"
:model_index="content['model_index']"
/>

<!-- v-bind="content" -->
</qstandarditemmodel>
</component>

<!-- <qlistview>
<qstandarditemmodel :column_count="2">
<qstandarditem
v-for="content in items_content()"
v-bind="content"
/>
</qstandarditemmodel>
</qlistview>
<qtableview>
<qstandarditemmodel :column_count="2">
<qstandarditem
v-for="content in items_content()"
v-bind="content"
/>
</qstandarditemmodel>
</qtableview>
<qtreeview>
<qstandarditemmodel :column_count="2">
<qstandarditem
v-for="content in items_content()"
v-bind="content"
/>
</qstandarditemmodel>
</qtreeview> -->
</qsplitter>
<widget :layout="{'type': 'box', 'direction': 'LeftToRight'}" :maximum-height="50">
<button text="Add" @clicked="add_item" object-name="add" />
<button text="Remove" @clicked="remove_item" object-name="remove" />
</widget>
</widget>
</window>

<script>
import collagraph as cg
from observ import to_raw

class ListsExample(cg.Component):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.state["values"] = to_raw(self.props["items"])

def items_content(self):
return [
{"text": text, "model_index": (row, column)}
for row, (item, _) in enumerate(self.state["values"])
for column, text in enumerate(item)
]

def add_item(self):
self.state["values"].append([["NEW", "ITEM"], False])

def remove_item(self):
if len(self.state["values"]):
self.state["values"].pop(0)
</script>
Loading

0 comments on commit 51087ff

Please sign in to comment.