diff --git a/bec_widgets/cli/client.py b/bec_widgets/cli/client.py index 5205fe05..60c73215 100644 --- a/bec_widgets/cli/client.py +++ b/bec_widgets/cli/client.py @@ -1932,3 +1932,79 @@ class Ring(RPCBase): """ Reset the connections for the ring widget. Disconnect the current slot and endpoint. """ + + +class WebsiteWidget(RPCBase): + @rpc_call + def set_url(self, url: str) -> None: + """ + Set the url of the website widget + + Args: + url (str): The url to set + """ + + @rpc_call + def get_url(self) -> str: + """ + Get the current url of the website widget + + Returns: + str: The current url + """ + + @rpc_call + def reload(self): + """ + Reload the website + """ + + @rpc_call + def back(self): + """ + Go back in the history + """ + + @rpc_call + def forward(self): + """ + Go forward in the history + """ + + +class WebsiteWidget(RPCBase): + @rpc_call + def set_url(self, url: str) -> None: + """ + Set the url of the website widget + + Args: + url (str): The url to set + """ + + @rpc_call + def get_url(self) -> str: + """ + Get the current url of the website widget + + Returns: + str: The current url + """ + + @rpc_call + def reload(self): + """ + Reload the website + """ + + @rpc_call + def back(self): + """ + Go back in the history + """ + + @rpc_call + def forward(self): + """ + Go forward in the history + """ diff --git a/bec_widgets/cli/generate_cli.py b/bec_widgets/cli/generate_cli.py index 051b2d36..d6d4dc5f 100644 --- a/bec_widgets/cli/generate_cli.py +++ b/bec_widgets/cli/generate_cli.py @@ -117,6 +117,7 @@ if __name__ == "__main__": # pragma: no cover from bec_widgets.widgets.figure.plots.waveform.waveform import BECWaveform from bec_widgets.widgets.figure.plots.waveform.waveform_curve import BECCurve from bec_widgets.widgets.spiral_progress_bar.ring import Ring + from bec_widgets.widgets.website.website import WebsiteWidget current_path = os.path.dirname(__file__) client_path = os.path.join(current_path, "client.py") @@ -133,6 +134,7 @@ if __name__ == "__main__": # pragma: no cover BECDockArea, SpiralProgressBar, Ring, + WebsiteWidget, ] generator = ClientGenerator() generator.generate_client(clss) diff --git a/bec_widgets/cli/rpc_wigdet_handler.py b/bec_widgets/cli/rpc_wigdet_handler.py index bc25c632..5f4d4533 100644 --- a/bec_widgets/cli/rpc_wigdet_handler.py +++ b/bec_widgets/cli/rpc_wigdet_handler.py @@ -1,12 +1,17 @@ from bec_widgets.utils import BECConnector from bec_widgets.widgets.figure import BECFigure from bec_widgets.widgets.spiral_progress_bar.spiral_progress_bar import SpiralProgressBar +from bec_widgets.widgets.website.website import WebsiteWidget class RPCWidgetHandler: """Handler class for creating widgets from RPC messages.""" - widget_classes = {"BECFigure": BECFigure, "SpiralProgressBar": SpiralProgressBar} + widget_classes = { + "BECFigure": BECFigure, + "SpiralProgressBar": SpiralProgressBar, + "Website": WebsiteWidget, + } @staticmethod def create_widget(widget_type, **kwargs) -> BECConnector: diff --git a/bec_widgets/widgets/website/__init__.py b/bec_widgets/widgets/website/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bec_widgets/widgets/website/website.py b/bec_widgets/widgets/website/website.py new file mode 100644 index 00000000..a69a2dcf --- /dev/null +++ b/bec_widgets/widgets/website/website.py @@ -0,0 +1,65 @@ +from qtpy.QtCore import QUrl +from qtpy.QtWebEngineWidgets import QWebEngineView +from qtpy.QtWidgets import QApplication + +from bec_widgets.utils import BECConnector + + +class WebsiteWidget(BECConnector, QWebEngineView): + """ + A simple widget to display a website + """ + + USER_ACCESS = ["set_url", "get_url", "reload", "back", "forward"] + + def __init__(self, url: str = None, parent=None, config=None, client=None, gui_id=None): + super().__init__(client=client, config=config, gui_id=gui_id) + QWebEngineView.__init__(self, parent=parent) + self.set_url(url) + + def set_url(self, url: str) -> None: + """ + Set the url of the website widget + + Args: + url (str): The url to set + """ + if not url: + return + self.setUrl(QUrl(url)) + + def get_url(self) -> str: + """ + Get the current url of the website widget + + Returns: + str: The current url + """ + return self.url().toString() + + def reload(self): + """ + Reload the website + """ + QWebEngineView.reload(self) + + def back(self): + """ + Go back in the history + """ + QWebEngineView.back(self) + + def forward(self): + """ + Go forward in the history + """ + QWebEngineView.forward(self) + + +if __name__ == "__main__": + import sys + + app = QApplication(sys.argv) + mainWin = WebsiteWidget("https://scilog.psi.ch") + mainWin.show() + sys.exit(app.exec()) diff --git a/tests/unit_tests/test_website_widget.py b/tests/unit_tests/test_website_widget.py new file mode 100644 index 00000000..16028913 --- /dev/null +++ b/tests/unit_tests/test_website_widget.py @@ -0,0 +1,27 @@ +import pytest +from qtpy.QtCore import QUrl + +from bec_widgets.widgets.website.website import WebsiteWidget + +from .client_mocks import mocked_client + + +@pytest.fixture +def website_widget(qtbot, mocked_client): + widget = WebsiteWidget(client=mocked_client) + qtbot.addWidget(widget) + qtbot.waitExposed(widget) + yield widget + widget.page().deleteLater() + qtbot.wait(1000) + + +def test_website_widget_set_url(website_widget): + website_widget.set_url("https://scilog.psi.ch") + assert website_widget.url() == QUrl("https://scilog.psi.ch") + + website_widget.set_url(None) + assert website_widget.url() == QUrl("https://scilog.psi.ch") + + website_widget.set_url("https://google.com") + assert website_widget.get_url() == "https://google.com"