0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-13 11:11:49 +02:00

feat(widget): added simple website widget with rpc

This commit is contained in:
2024-06-06 19:35:52 +02:00
parent c19e856800
commit 64abd67b9b
6 changed files with 176 additions and 1 deletions

View File

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

View File

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

View File

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

View File

View File

@ -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())

View File

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