bec-widgets 0.99.1__py3-none-any.whl → 0.99.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- .gitlab-ci.yml +0 -1
- CHANGELOG.md +77 -71
- PKG-INFO +2 -2
- bec_widgets/cli/client.py +3 -3
- bec_widgets/qt_utils/toolbar.py +11 -5
- bec_widgets/utils/bec_widget.py +11 -2
- bec_widgets/utils/colors.py +18 -2
- bec_widgets/utils/plugin_templates/plugin.template +2 -2
- bec_widgets/widgets/bec_queue/bec_queue.py +2 -0
- bec_widgets/widgets/bec_queue/bec_queue_plugin.py +1 -1
- bec_widgets/widgets/bec_status_box/bec_status_box.py +2 -0
- bec_widgets/widgets/bec_status_box/bec_status_box_plugin.py +1 -1
- bec_widgets/widgets/color_button/color_button.py +2 -0
- bec_widgets/widgets/color_button/color_button_plugin.py +1 -1
- bec_widgets/widgets/colormap_selector/colormap_selector.py +1 -0
- bec_widgets/widgets/colormap_selector/colormap_selector_plugin.py +1 -1
- bec_widgets/widgets/dark_mode_button/dark_mode_button.py +12 -3
- bec_widgets/widgets/dark_mode_button/dark_mode_button_plugin.py +1 -1
- bec_widgets/widgets/device_browser/device_browser.py +2 -0
- bec_widgets/widgets/device_browser/device_browser_plugin.py +1 -1
- bec_widgets/widgets/device_combobox/device_combo_box_plugin.py +1 -1
- bec_widgets/widgets/device_combobox/device_combobox.py +2 -0
- bec_widgets/widgets/device_line_edit/device_line_edit.py +2 -0
- bec_widgets/widgets/device_line_edit/device_line_edit_plugin.py +1 -1
- bec_widgets/widgets/dock/dock.py +1 -0
- bec_widgets/widgets/dock/dock_area.py +30 -10
- bec_widgets/widgets/dock/dock_area_plugin.py +1 -1
- bec_widgets/widgets/figure/figure.py +1 -1
- bec_widgets/widgets/figure/plots/waveform/waveform.py +12 -7
- bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +3 -3
- bec_widgets/widgets/image/bec_image_widget_plugin.py +1 -1
- bec_widgets/widgets/image/image_widget.py +1 -0
- bec_widgets/widgets/motor_map/bec_motor_map_widget_plugin.py +1 -1
- bec_widgets/widgets/motor_map/motor_map_widget.py +1 -0
- bec_widgets/widgets/position_indicator/position_indicator.py +2 -0
- bec_widgets/widgets/position_indicator/position_indicator_plugin.py +1 -1
- bec_widgets/widgets/positioner_box/positioner_box.py +1 -0
- bec_widgets/widgets/positioner_box/positioner_box_plugin.py +1 -1
- bec_widgets/widgets/positioner_box/positioner_control_line.py +2 -0
- bec_widgets/widgets/positioner_box/positioner_control_line_plugin.py +1 -1
- bec_widgets/widgets/ring_progress_bar/ring_progress_bar.py +1 -0
- bec_widgets/widgets/ring_progress_bar/ring_progress_bar_plugin.py +1 -1
- bec_widgets/widgets/scan_control/scan_control.py +2 -0
- bec_widgets/widgets/scan_control/scan_control_plugin.py +1 -4
- bec_widgets/widgets/spinner/spinner.py +2 -0
- bec_widgets/widgets/spinner/spinner_widget_plugin.py +1 -1
- bec_widgets/widgets/stop_button/stop_button.py +2 -0
- bec_widgets/widgets/stop_button/stop_button_plugin.py +1 -1
- bec_widgets/widgets/text_box/text_box.py +1 -0
- bec_widgets/widgets/text_box/text_box_plugin.py +1 -1
- bec_widgets/widgets/toggle/toggle.py +1 -0
- bec_widgets/widgets/toggle/toggle_switch_plugin.py +1 -1
- bec_widgets/widgets/vscode/vs_code_editor_plugin.py +1 -1
- bec_widgets/widgets/vscode/vscode.py +1 -0
- bec_widgets/widgets/waveform/bec_waveform_widget_plugin.py +1 -1
- bec_widgets/widgets/waveform/waveform_popups/curve_dialog/curve_dialog.py +14 -13
- bec_widgets/widgets/waveform/waveform_widget.py +3 -2
- bec_widgets/widgets/website/website.py +42 -10
- bec_widgets/widgets/website/website_widget_plugin.py +1 -1
- {bec_widgets-0.99.1.dist-info → bec_widgets-0.99.8.dist-info}/METADATA +2 -2
- {bec_widgets-0.99.1.dist-info → bec_widgets-0.99.8.dist-info}/RECORD +83 -120
- docs/assets/widget_screenshots/buttons.png +0 -0
- docs/developer/widget_development/bec_dispatcher.md +1 -1
- docs/developer/widget_development/widget_base_class.md +171 -0
- docs/developer/widget_development/widget_development.md +3 -2
- docs/index.md +2 -2
- docs/user/widgets/buttons/buttons.md +32 -5
- docs/user/widgets/dock_area/bec_dock_area.md +4 -2
- docs/user/widgets/position_indicator/position_indicator.md +1 -8
- docs/user/widgets/spinner/spinner.md +0 -7
- docs/user/widgets/waveform/waveform_widget.md +3 -3
- docs/user/widgets/widgets.md +1 -1
- pyproject.toml +2 -2
- tests/unit_tests/test_configs/config_device.yaml +1 -1
- tests/unit_tests/test_configs/config_device_no_entry.yaml +1 -1
- tests/unit_tests/test_configs/config_scan.yaml +1 -1
- tests/unit_tests/test_crosshair.py +2 -2
- tests/unit_tests/test_waveform1d.py +14 -14
- tests/unit_tests/test_waveform_widget.py +2 -2
- tests/unit_tests/test_website_widget.py +2 -2
- bec_widgets/assets/toolbar_icons/add.svg +0 -3
- bec_widgets/assets/toolbar_icons/attach_all.svg +0 -3
- bec_widgets/assets/toolbar_icons/auto_range.svg +0 -3
- bec_widgets/assets/toolbar_icons/compare.svg +0 -3
- bec_widgets/assets/toolbar_icons/connection.svg +0 -4
- bec_widgets/assets/toolbar_icons/device_line_edit.svg +0 -3
- bec_widgets/assets/toolbar_icons/drag_pan_mode.svg +0 -3
- bec_widgets/assets/toolbar_icons/export.svg +0 -9
- bec_widgets/assets/toolbar_icons/fft.svg +0 -11
- bec_widgets/assets/toolbar_icons/fitting_parameters.svg +0 -3
- bec_widgets/assets/toolbar_icons/history.svg +0 -4
- bec_widgets/assets/toolbar_icons/image.svg +0 -3
- bec_widgets/assets/toolbar_icons/image_autorange.svg +0 -3
- bec_widgets/assets/toolbar_icons/import.svg +0 -9
- bec_widgets/assets/toolbar_icons/line_axis.svg +0 -3
- bec_widgets/assets/toolbar_icons/line_curve.svg +0 -3
- bec_widgets/assets/toolbar_icons/lock_aspect_ratio.svg +0 -3
- bec_widgets/assets/toolbar_icons/log_scale.png +0 -0
- bec_widgets/assets/toolbar_icons/motor_map.svg +0 -3
- bec_widgets/assets/toolbar_icons/photo_library.svg +0 -3
- bec_widgets/assets/toolbar_icons/positioner_box.svg +0 -3
- bec_widgets/assets/toolbar_icons/progress.svg +0 -3
- bec_widgets/assets/toolbar_icons/queue.svg +0 -3
- bec_widgets/assets/toolbar_icons/rectangle_mode.svg +0 -3
- bec_widgets/assets/toolbar_icons/remove.svg +0 -5
- bec_widgets/assets/toolbar_icons/reset_settings.svg +0 -3
- bec_widgets/assets/toolbar_icons/restore_state.svg +0 -3
- bec_widgets/assets/toolbar_icons/ring_progress.svg +0 -3
- bec_widgets/assets/toolbar_icons/rotate_left.svg +0 -3
- bec_widgets/assets/toolbar_icons/rotate_right.svg +0 -3
- bec_widgets/assets/toolbar_icons/save.svg +0 -3
- bec_widgets/assets/toolbar_icons/save_state.svg +0 -3
- bec_widgets/assets/toolbar_icons/scan_control.svg +0 -3
- bec_widgets/assets/toolbar_icons/settings.svg +0 -4
- bec_widgets/assets/toolbar_icons/status.svg +0 -3
- bec_widgets/assets/toolbar_icons/terminal.svg +0 -3
- bec_widgets/assets/toolbar_icons/transform.svg +0 -3
- bec_widgets/assets/toolbar_icons/waveform.svg +0 -3
- {bec_widgets-0.99.1.dist-info → bec_widgets-0.99.8.dist-info}/WHEEL +0 -0
- {bec_widgets-0.99.1.dist-info → bec_widgets-0.99.8.dist-info}/entry_points.txt +0 -0
- {bec_widgets-0.99.1.dist-info → bec_widgets-0.99.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,171 @@
|
|
1
|
+
(developer.widget_development.widget_base_class)=
|
2
|
+
|
3
|
+
# BECWidget Base Class
|
4
|
+
|
5
|
+
When developing new widgets, it is crucial to ensure seamless integration with the BEC system. This is achieved by using
|
6
|
+
the [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
7
|
+
base class, which provides essential functionalities and shortcuts to interact with various BEC services. In this
|
8
|
+
tutorial, we will explore the importance of this base class, the role of
|
9
|
+
the [`BECConnector`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector)
|
10
|
+
mixin, and how these components work together to facilitate the development of powerful and responsive widgets.
|
11
|
+
|
12
|
+
## Understanding the `BECWidget` Base Class
|
13
|
+
|
14
|
+
The [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
15
|
+
base class is designed to serve as the foundation for all BEC-connected widgets. It ensures that your widget is properly
|
16
|
+
integrated with the BEC system by providing:
|
17
|
+
|
18
|
+
1. **Connection to BEC Services
|
19
|
+
**: [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
20
|
+
includes
|
21
|
+
the [`BECConnector`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector)
|
22
|
+
mixin, which handles all the necessary connections to BEC services such as the BEC server, device manager, scan
|
23
|
+
control, and more.
|
24
|
+
|
25
|
+
2. **Qt Integration**:
|
26
|
+
The [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
27
|
+
base class also ensures that your widget is correctly integrated with Qt by requiring that it inherits from
|
28
|
+
both [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
29
|
+
and [`QWidget`](https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QWidget.html). This combination allows your widget
|
30
|
+
to leverage the full power of Qt for creating rich user interfaces while staying connected to the BEC ecosystem.
|
31
|
+
|
32
|
+
3. **Configuration Management**: The base class provides a `ConnectionConfig` model (based on Pydantic) that helps
|
33
|
+
manage and validate the configuration of your widget. This configuration can be easily serialized to and from Python
|
34
|
+
dictionaries, JSON, or YAML formats, allowing for persistent storage and retrieval of widget states.
|
35
|
+
|
36
|
+
4. **RPC Registration**: Widgets derived
|
37
|
+
from [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
38
|
+
are automatically registered with
|
39
|
+
the [`RPCRegister`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.cli.rpc_register.RPCRegister.html#bec_widgets.cli.rpc_register.RPCRegister),
|
40
|
+
enabling them to handle remote procedure calls (RPCs) efficiently. This allows the widget to be controlled remotely
|
41
|
+
from the `BECIPythonClient` via CLI, providing powerful control and automation capabilities. For example, you can
|
42
|
+
remotely adjust widget settings, start/stop operations, or query the widget’s status directly from the command line.
|
43
|
+
|
44
|
+
Here’s a basic example of a widget inheriting
|
45
|
+
from [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget):
|
46
|
+
|
47
|
+
```python
|
48
|
+
from bec_widgets.utils.bec_widget import BECWidget
|
49
|
+
from qtpy.QtWidgets import QWidget, QVBoxLayout
|
50
|
+
|
51
|
+
|
52
|
+
class MyWidget(BECWidget, QWidget):
|
53
|
+
def __init__(self, parent=None, *args, **kwargs):
|
54
|
+
super().__init__(*args, **kwargs)
|
55
|
+
QWidget.__init__(self, parent=parent)
|
56
|
+
self.get_bec_shortcuts() # Initialize BEC shortcuts
|
57
|
+
self.init_ui()
|
58
|
+
|
59
|
+
def init_ui(self):
|
60
|
+
layout = QVBoxLayout(self)
|
61
|
+
# Add more UI components here
|
62
|
+
self.setLayout(layout)
|
63
|
+
```
|
64
|
+
|
65
|
+
### The Role of `BECConnector`
|
66
|
+
|
67
|
+
At the heart
|
68
|
+
of [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
69
|
+
is
|
70
|
+
the [`BECConnector`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector)
|
71
|
+
mixin, which plays a crucial role in managing the connection between your widget and the BEC system.
|
72
|
+
The [`BECConnector`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector)
|
73
|
+
provides several key functionalities:
|
74
|
+
|
75
|
+
1. **Client Initialization**: It initializes a `BECClient` instance if one isn't provided, ensuring your widget is
|
76
|
+
connected to the BEC server. This client is central to all interactions with the BEC system.
|
77
|
+
|
78
|
+
2. **Task Management**:
|
79
|
+
The [`submit_task`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector.submit_task)
|
80
|
+
method allows for running tasks in separate threads, preventing long-running operations from blocking the main UI
|
81
|
+
thread.
|
82
|
+
|
83
|
+
3. **Configuration Handling
|
84
|
+
**: [`BECConnector`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector)
|
85
|
+
uses the `ConnectionConfig` model to manage the widget’s configuration, ensuring all parameters are validated and
|
86
|
+
properly set up.
|
87
|
+
|
88
|
+
4. **RPC Registration**: Widgets are registered with
|
89
|
+
the [`RPCRegister`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.cli.rpc_register.RPCRegister.html#bec-widgets-cli-rpc-register-rpcregister),
|
90
|
+
allowing them to handle remote procedure calls effectively.
|
91
|
+
|
92
|
+
5. **Error Handling**: It includes utilities for handling errors gracefully within the Qt environment, ensuring that
|
93
|
+
issues are reported to the user without crashing the application.
|
94
|
+
|
95
|
+
### Utilizing `get_bec_shortcuts`
|
96
|
+
|
97
|
+
One of the most powerful features of
|
98
|
+
the [`BECConnector`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_connector.BECConnector.html#bec_widgets.utils.bec_connector.BECConnector)
|
99
|
+
is the `get_bec_shortcuts` method. This method provides your widget with direct access to essential components of the
|
100
|
+
BEC system through convenient shortcuts:
|
101
|
+
|
102
|
+
1. **Device Manager (`self.dev`)**:
|
103
|
+
- Access all devices registered with the BEC system. You can interact with devices, retrieve their status, and send
|
104
|
+
commands directly through this shortcut.
|
105
|
+
```python
|
106
|
+
# Moves 'motor1' to position 10
|
107
|
+
self.dev["motor1"].move(10)
|
108
|
+
```
|
109
|
+
|
110
|
+
2. **Scan Control (`self.scans`)**:
|
111
|
+
- Control scans, initiate new ones, monitor progress, and manage their execution.
|
112
|
+
```python
|
113
|
+
# Starts Line Scan from -10 to 10 in samx and -5 to 5 in samy
|
114
|
+
self.scans.line_scan(self.dev.samx,-10,10,self.dev.samy,-5,5, steps=100, exp_time=0.001,relative=False)
|
115
|
+
```
|
116
|
+
|
117
|
+
3. **Queue Management (`self.queue`)**:
|
118
|
+
- Manage the BEC scan queue, such as adding scans, checking status, or removing scans.
|
119
|
+
```python
|
120
|
+
# Request abortion of the current scan queue
|
121
|
+
self.queue.request_scan_abortion()
|
122
|
+
```
|
123
|
+
|
124
|
+
4. **Scan Storage (`self.scan_storage`)**:
|
125
|
+
- Access stored scan data for retrieval and analysis.
|
126
|
+
```python
|
127
|
+
# Retrieve scan item for a specific scan ID
|
128
|
+
self.scan_item = self.queue.scan_storage.find_scan_by_ID(self.scan_id)
|
129
|
+
```
|
130
|
+
|
131
|
+
5. **Full BECClient Access (`self.client`)**:
|
132
|
+
- Direct access to the BECClient instance, allowing for additional functionalities not covered by the shortcuts.
|
133
|
+
```python
|
134
|
+
# Shutdown the BECClient
|
135
|
+
self.client.shutdown()
|
136
|
+
```
|
137
|
+
|
138
|
+
### Example: `PositionerBox` Widget
|
139
|
+
|
140
|
+
Let’s look at an example of a widget that leverages
|
141
|
+
the [`BECWidget`](https://bec.readthedocs.io/projects/bec-widgets/en/latest/api_reference/_autosummary/bec_widgets.utils.bec_widget.BECWidget.html#bec_widgets.utils.bec_widget.BECWidget)
|
142
|
+
base class and `get_bec_shortcuts`:
|
143
|
+
|
144
|
+
````{dropdown} View code: PositionerBox Widget
|
145
|
+
:icon: code-square
|
146
|
+
:animate: fade-in-slide-down
|
147
|
+
```{literalinclude} ../../../bec_widgets/widgets/positioner_box/positioner_box.py
|
148
|
+
:language: python
|
149
|
+
:pyobject: PositionerBox
|
150
|
+
```
|
151
|
+
````
|
152
|
+
|
153
|
+
In this widget:
|
154
|
+
|
155
|
+
- **Device Interaction**: The widget uses `self.dev` to interact with a positioner device, reading its state and
|
156
|
+
updating the UI accordingly.
|
157
|
+
|
158
|
+
- **Scan and Queue Control**: Although not shown in this example, the widget could easily use `self.scans`
|
159
|
+
and `self.queue` to manage scans related to the positioner or queue up new operations.
|
160
|
+
|
161
|
+
### Conclusion
|
162
|
+
|
163
|
+
The `BECWidget` base class and the `BECConnector` mixin are foundational components for creating widgets that seamlessly
|
164
|
+
integrate with the BEC system. By inheriting from `BECWidget`, you gain access to powerful connection management, task
|
165
|
+
handling, and configuration capabilities, as well as shortcuts that make interacting with BEC services straightforward
|
166
|
+
and efficient.
|
167
|
+
|
168
|
+
By leveraging these tools, you can focus on building the core functionality of your widget, confident that the
|
169
|
+
complexities of BEC integration are handled robustly and efficiently. In the next tutorial we will demonstrate
|
170
|
+
step-by-step how to create a custom widget using the `BECWidget` base class and explore advanced features for creating
|
171
|
+
responsive and interactive user interfaces.
|
@@ -1,5 +1,6 @@
|
|
1
1
|
(developer.widget_development)=
|
2
|
-
|
2
|
+
|
3
|
+
# Widget Development
|
3
4
|
This section provides an introduction to the building blocks of BEC Widgets: widgets. Widgets are the basic components of the graphical user interface (GUI) and are used to create larger applications. We will cover key topics such as how to develop new widgets or how to customise existing widgets. For details on the already available widgets and their usage, please refer to user section about [widgets](#user.widgets)
|
4
5
|
|
5
6
|
```{toctree}
|
@@ -9,5 +10,5 @@ hidden: false
|
|
9
10
|
---
|
10
11
|
|
11
12
|
bec_dispatcher
|
12
|
-
|
13
|
+
widget_base_class
|
13
14
|
```
|
docs/index.md
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
+
:html_theme.sidebar_secondary.remove:
|
2
|
+
|
1
3
|
# BEC Widgets documentation
|
2
4
|
|
3
5
|
A flexible and extensible framework for building graphical user interfaces in Python, optimized for use in the BEC environment.
|
4
6
|
|
5
7
|
<br><br>
|
6
8
|
|
7
|
-
<br><br>
|
8
|
-
|
9
9
|
````{grid} 2
|
10
10
|
:gutter: 5
|
11
11
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
(user.widgets.buttons)=
|
2
2
|
|
3
|
-
#
|
3
|
+
# Buttons
|
4
4
|
|
5
|
-
|
5
|
+
`````{tab} Overview
|
6
6
|
|
7
7
|
This section consolidates various custom buttons used within the BEC GUIs, providing essential controls for managing operations and processes. These buttons are designed for easy integration into different layouts within the BEC environment, allowing users to embed functional controls into their applications seamlessly.
|
8
8
|
|
@@ -18,15 +18,42 @@ The `Stop Button` is a specialized control that provides an immediate interface
|
|
18
18
|
|
19
19
|
The `Dark Mode Button` is a toggle control that allows users to switch between light and dark themes in the BEC GUI. It provides a convenient way to adjust the interface's appearance based on user preferences or environmental conditions.
|
20
20
|
|
21
|
-
|
21
|
+
````{grid} 2
|
22
|
+
:gutter: 2
|
23
|
+
|
24
|
+
```{grid-item-card} Dark Mode
|
25
|
+
:img-top: ./dark_mode_enabled.png
|
22
26
|
```
|
23
|
-
|
27
|
+
|
28
|
+
```{grid-item-card} Light Mode
|
29
|
+
:img-top: ./dark_mode_disabled.png
|
24
30
|
```
|
31
|
+
````
|
32
|
+
|
25
33
|
|
26
34
|
**Key Features:**
|
27
35
|
- **Theme Switching**: Enables users to switch between light and dark themes with a single click.
|
28
36
|
- **Configurable from BECDesigner**: The defaults for the dark mode can be set in the BECDesigner, allowing users to customize the startup appearance of the GUI.
|
29
|
-
|
37
|
+
|
38
|
+
|
39
|
+
## Color Button
|
40
|
+
|
41
|
+
The `Color Button` is a user interface element that provides a dialog to select colors. This button, adapted from `pyqtgraph`, is a simple yet powerful tool to integrate color selection functionality into the BEC GUIs.
|
42
|
+
|
43
|
+
**Key Features:**
|
44
|
+
- **Color Selection**: Opens a dialog for selecting colors, returning the selected color in both RGBA and HEX formats.
|
45
|
+
|
46
|
+
## Colormap Selector
|
47
|
+
|
48
|
+
The `Colormap Selector` is a specialized combobox that allows users to select a colormap. It includes a preview of the colormap, making it easier for users to choose the appropriate one for their needs.
|
49
|
+
|
50
|
+
**Key Features:**
|
51
|
+
- **Colormap Selection**: Provides a dropdown to select from all available colormaps in `pyqtgraph`.
|
52
|
+
- **Visual Preview**: Displays a small preview of the colormap next to its name, enhancing usability.
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
`````
|
30
57
|
|
31
58
|
````{tab} Examples
|
32
59
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# BECDockArea
|
4
4
|
|
5
|
-
|
5
|
+
````{tab} Overview
|
6
6
|
|
7
7
|
[`BECDockArea`](/api_reference/_autosummary/bec_widgets.cli.client.BECDockArea) is a powerful and flexible container designed to host various widgets and docks within a grid layout. It provides an environment for organizing and managing complex user interfaces, making it ideal for applications that require multiple tools and data visualizations to be displayed simultaneously. BECDockArea is particularly useful for embedding not only visualization tools but also other interactive components, allowing users to tailor their workspace to their specific needs.
|
8
8
|
|
@@ -10,9 +10,11 @@
|
|
10
10
|
- **State Persistence**: Save and restore the state of the dock area, enabling consistent user experiences across sessions.
|
11
11
|
- **Dock Customization**: Add docks with customizable positions, names, and behaviors, such as floating or closable docks.
|
12
12
|
- **Integration with Widgets**: Integrate various widgets like [`WaveformWidget`](user.widgets.waveform_widget), [`ImageWidget`](user.widgets.image_widget), and [`MotorMapWidget`](user.widgets.motor_map) into `BECDockArea`, either as standalone tools or as part of a more complex interface.
|
13
|
-
|
13
|
+
|
14
|
+
**BEC Dock Area Components Schema**
|
14
15
|
|
15
16
|

|
17
|
+
````
|
16
18
|
|
17
19
|
````{tab} Examples - CLI
|
18
20
|
In the following examples, we will use `BECIPythonClient` as the main object to interact with the `BECDockArea`. These tutorials focus on how to work with the `BECDockArea` framework, such as adding and removing docks, saving and restoring layouts, and managing the docked widgets. By default the `BECDockArea` is refered as `gui` in `BECIPythonClient`. For more detailed examples of each individual component, please refer to the example sections of each individual [`widget`](user.widgets).
|
@@ -66,11 +66,4 @@ The `PositionIndicator` can be added to your GUI layout using `QtDesigner`. Once
|
|
66
66
|
self.position_indicator.on_position_update(new_position_value)
|
67
67
|
```
|
68
68
|
|
69
|
-
````
|
70
|
-
|
71
|
-
````{tab} API
|
72
|
-
|
73
|
-
```{eval-rst}
|
74
|
-
.. include:: /api_reference/_autosummary/bec_widgets.cli.client.PositionIndicator.rst
|
75
|
-
```
|
76
|
-
````
|
69
|
+
````
|
@@ -19,11 +19,11 @@ The Waveform Widget is used to display 1D detector signals. The widget is direct
|
|
19
19
|
|
20
20
|
````{tab} Examples - CLI
|
21
21
|
|
22
|
-
`WaveformWidget` can be embedded in both `BECFigure` and `BECDockArea
|
22
|
+
`WaveformWidget` can be embedded in both [`BECFigure`](user.widgets.bec_figure) and [`BECDockArea`](user.widgets.bec_dock_area), or used as an individual component in your application through `BECDesigner`. However, the command-line API is the same for all cases.
|
23
23
|
|
24
24
|
## Example 1 - Adding Waveform Widget to BECFigure
|
25
25
|
|
26
|
-
In this example, we will demonstrate how to add two different `WaveformWidgets` into a single `BECFigure` widget.
|
26
|
+
In this example, we will demonstrate how to add two different `WaveformWidgets` into a single [`BECFigure`](user.widgets.bec_figure) widget.
|
27
27
|
|
28
28
|
```python
|
29
29
|
# Add new dock with BECFigure widget
|
@@ -36,7 +36,7 @@ plt2 = fig.plot(x_name='samx', y_name='bpm3i')
|
|
36
36
|
|
37
37
|
## Example 2 - Adding Waveform Widget as a dock with BECDockArea
|
38
38
|
|
39
|
-
Adding `WaveformWidget` into a `BECDockArea` is similar to adding any other widget. The widget has the same API as the one in BECFigure; however, as an independent widget outside BECFigure, it has its own toolbar, allowing users to configure the widget without needing CLI commands.
|
39
|
+
Adding `WaveformWidget` into a [`BECDockArea`](user.widgets.bec_dock_area) is similar to adding any other widget. The widget has the same API as the one in BECFigure; however, as an independent widget outside BECFigure, it has its own toolbar, allowing users to configure the widget without needing CLI commands.
|
40
40
|
|
41
41
|
```python
|
42
42
|
# Add new WaveformWidgets to the BECDockArea
|
docs/user/widgets/widgets.md
CHANGED
@@ -135,7 +135,7 @@ Various utility widgets to enhance user experience.
|
|
135
135
|
````{grid} 3
|
136
136
|
:gutter: 2
|
137
137
|
|
138
|
-
```{grid-item-card}
|
138
|
+
```{grid-item-card} Buttons
|
139
139
|
:link: user.widgets.buttons
|
140
140
|
:link-type: ref
|
141
141
|
:img-top: /assets/widget_screenshots/buttons.png
|
pyproject.toml
CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "bec_widgets"
|
7
|
-
version = "0.99.
|
7
|
+
version = "0.99.8"
|
8
8
|
description = "BEC Widgets"
|
9
9
|
requires-python = ">=3.10"
|
10
10
|
classifiers = [
|
@@ -19,7 +19,7 @@ dependencies = [
|
|
19
19
|
"isort~=5.13, >=5.13.2", # needed for bw-generate-cli
|
20
20
|
"pydantic~=2.0",
|
21
21
|
"pyqtgraph~=0.13",
|
22
|
-
"bec_qthemes~=0.0",
|
22
|
+
"bec_qthemes~=0.4, >=0.4.2",
|
23
23
|
"qtconsole~=5.5, >=5.5.1", # needed for jupyter console
|
24
24
|
"qtpy~=2.4",
|
25
25
|
"pyte", # needed for vt100 console
|
@@ -49,8 +49,8 @@ def test_mouse_moved_lines(plot_widget_with_crosshair):
|
|
49
49
|
crosshair.mouse_moved(event_mock)
|
50
50
|
|
51
51
|
# Assert the expected behavior
|
52
|
-
assert crosshair.v_line.pos().x()
|
53
|
-
assert crosshair.h_line.pos().y()
|
52
|
+
assert np.isclose(crosshair.v_line.pos().x(), 2)
|
53
|
+
assert np.isclose(crosshair.h_line.pos().y(), 5)
|
54
54
|
|
55
55
|
|
56
56
|
def test_mouse_moved_signals(plot_widget_with_crosshair):
|
@@ -73,7 +73,7 @@ def test_create_waveform1D_by_config(qtbot, mocked_client):
|
|
73
73
|
"x_grid": False,
|
74
74
|
"y_grid": False,
|
75
75
|
},
|
76
|
-
"color_palette": "
|
76
|
+
"color_palette": "magma",
|
77
77
|
"curves": {
|
78
78
|
"bpm4i-bpm4i": {
|
79
79
|
"widget_class": "BECCurve",
|
@@ -81,11 +81,11 @@ def test_create_waveform1D_by_config(qtbot, mocked_client):
|
|
81
81
|
"parent_id": "widget_1",
|
82
82
|
"label": "bpm4i-bpm4i",
|
83
83
|
"color": "#cc4778",
|
84
|
-
"color_map_z": "
|
84
|
+
"color_map_z": "magma",
|
85
85
|
"symbol": "o",
|
86
86
|
"symbol_color": None,
|
87
|
-
"symbol_size":
|
88
|
-
"pen_width":
|
87
|
+
"symbol_size": 7,
|
88
|
+
"pen_width": 4,
|
89
89
|
"pen_style": "dash",
|
90
90
|
"source": "scan_segment",
|
91
91
|
"signals": {
|
@@ -114,11 +114,11 @@ def test_create_waveform1D_by_config(qtbot, mocked_client):
|
|
114
114
|
"parent_id": "widget_1",
|
115
115
|
"label": "curve-custom",
|
116
116
|
"color": "blue",
|
117
|
-
"color_map_z": "
|
117
|
+
"color_map_z": "magma",
|
118
118
|
"symbol": "o",
|
119
119
|
"symbol_color": None,
|
120
|
-
"symbol_size":
|
121
|
-
"pen_width":
|
120
|
+
"symbol_size": 7,
|
121
|
+
"pen_width": 5,
|
122
122
|
"pen_style": "dashdot",
|
123
123
|
"source": "custom",
|
124
124
|
"signals": None,
|
@@ -155,11 +155,11 @@ def test_getting_curve(qtbot, mocked_client):
|
|
155
155
|
gui_id="test_curve",
|
156
156
|
parent_id=w1.gui_id,
|
157
157
|
label="bpm4i-bpm4i",
|
158
|
-
color="#
|
158
|
+
color="#b73779",
|
159
159
|
symbol="o",
|
160
160
|
symbol_color=None,
|
161
|
-
symbol_size=
|
162
|
-
pen_width=
|
161
|
+
symbol_size=7,
|
162
|
+
pen_width=4,
|
163
163
|
pen_style="solid",
|
164
164
|
source="scan_segment",
|
165
165
|
signals=Signal(
|
@@ -398,11 +398,11 @@ def test_curve_add_by_config(qtbot, mocked_client):
|
|
398
398
|
"parent_id": "widget_1",
|
399
399
|
"label": "bpm4i-bpm4i",
|
400
400
|
"color": "#cc4778",
|
401
|
-
"color_map_z": "
|
401
|
+
"color_map_z": "magma",
|
402
402
|
"symbol": "o",
|
403
403
|
"symbol_color": None,
|
404
|
-
"symbol_size":
|
405
|
-
"pen_width":
|
404
|
+
"symbol_size": 7,
|
405
|
+
"pen_width": 4,
|
406
406
|
"pen_style": "dash",
|
407
407
|
"source": "scan_segment",
|
408
408
|
"signals": {
|
@@ -522,7 +522,7 @@ def test_scatter_2d_update(qtbot, mocked_client):
|
|
522
522
|
|
523
523
|
data = c1.get_data()
|
524
524
|
expected_x_y_data = ([1, 2, 3], [1, 2, 3])
|
525
|
-
expected_z_colors = w1._make_z_gradient([1, 3, 2], "
|
525
|
+
expected_z_colors = w1._make_z_gradient([1, 3, 2], "magma")
|
526
526
|
|
527
527
|
scatter_points = c1.scatter.points()
|
528
528
|
colors = [point.brush().color() for point in scatter_points]
|
@@ -66,7 +66,7 @@ def test_waveform_plot_data(waveform_widget, mock_waveform):
|
|
66
66
|
y_entry=None,
|
67
67
|
z_entry=None,
|
68
68
|
color=None,
|
69
|
-
color_map_z="
|
69
|
+
color_map_z="magma",
|
70
70
|
label=None,
|
71
71
|
validate=True,
|
72
72
|
dap=None,
|
@@ -86,7 +86,7 @@ def test_waveform_plot_scan_curves(waveform_widget, mock_waveform):
|
|
86
86
|
y_entry=None,
|
87
87
|
z_entry=None,
|
88
88
|
color=None,
|
89
|
-
color_map_z="
|
89
|
+
color_map_z="magma",
|
90
90
|
label=None,
|
91
91
|
validate=True,
|
92
92
|
dap="GaussianModel",
|
@@ -16,10 +16,10 @@ def website_widget(qtbot, mocked_client):
|
|
16
16
|
|
17
17
|
def test_website_widget_set_url(website_widget):
|
18
18
|
website_widget.set_url("https://scilog.psi.ch")
|
19
|
-
assert website_widget.url() == QUrl("https://scilog.psi.ch")
|
19
|
+
assert website_widget.website.url() == QUrl("https://scilog.psi.ch")
|
20
20
|
|
21
21
|
website_widget.set_url(None)
|
22
|
-
assert website_widget.url() == QUrl("https://scilog.psi.ch")
|
22
|
+
assert website_widget.website.url() == QUrl("https://scilog.psi.ch")
|
23
23
|
|
24
24
|
website_widget.set_url("https://google.com")
|
25
25
|
assert website_widget.get_url() == "https://google.com"
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="m145.26-88.13-57.13-57.13 137.39-137.39H105.87v-79.22h256v256h-79.22v-119.65L145.26-88.13Zm669.48 0L677.91-225.52v119.65h-79.78v-256H854.7v79.22H734.48l137.39 137.39-57.13 57.13Zm-708.87-510v-79.78h119.65L88.13-814.74l57.13-57.13 137.39 137.39V-854.7h79.22v256.57h-256Zm492.26 0V-854.7h79.78v120.22l137.83-138.39 57.13 57.13-138.39 137.83H854.7v79.78H598.13Z"/>
|
3
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="m311.5-154.02-47.74-47.74 116.94-116.7H74.02v-68.37H380.7L263.76-503.76l47.74-47.74 198.98 198.74L311.5-154.02Zm337-254.72L449.76-607.48 648.5-806.22l47.74 47.74-116.7 116.94h306.68v68.37H579.54l116.7 116.69-47.74 47.74Z"/>
|
3
|
-
</svg>
|
@@ -1,4 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 0 24 24" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M0 0h24v24H0V0z" fill="none"/>
|
3
|
-
<path d="M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z"/>
|
4
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M180-404.87v-50.26h289.75v50.26H180Zm0-162.57v-50.25h454.62v50.25H180Zm0-162.3V-780h454.62v50.26H180ZM524.62-180v-105.69l217.15-216.16q7.46-7.07 16.11-10.3 8.65-3.23 17.3-3.23 9.43 0 18.25 3.53 8.82 3.54 16.03 10.62l37 37.38q6.87 7.47 10.21 16.16Q860-439 860-430.31t-3.37 17.69q-3.37 9-10.52 16.46L630.31-180H524.62Zm250.69-211.69 37-38.62-37-37.38-38 38 38 38Z"/>
|
3
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M480-54 303.43-230.56 361-288.13l79.39 78.83v-231.09H209.3L283.13-366l-57.57 57.57L54-480l172.56-172.57L284.13-595l-74.83 75.39h231.09v-231.65L366-676.87l-57.57-57.57L480-906l171.57 171.56L594-676.87l-74.39-74.39v231.65h231.65L676.87-594l57.57-57.57L906-480 734.44-308.43 676.87-366l74.39-74.39H519.61v231.09L599-288.13l57.57 57.57L480-54Z"/>
|
3
|
-
</svg>
|
@@ -1,9 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="48px" viewBox="0 0 24 24" width="48px"
|
2
|
-
fill="#FFFFFF">
|
3
|
-
<g>
|
4
|
-
<rect fill="none" height="24" width="24"/>
|
5
|
-
</g>
|
6
|
-
<g>
|
7
|
-
<path d="M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M7,9l1.41,1.41L11,7.83V16h2V7.83l2.59,2.58L17,9l-5-5L7,9z"/>
|
8
|
-
</g>
|
9
|
-
</svg>
|
@@ -1,11 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
-
<svg width="100%" height="100%" viewBox="0 0 100 96" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
4
|
-
xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/"
|
5
|
-
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
6
|
-
<rect id="Artboard1" x="0" y="0" width="100" height="96.486" style="fill:none;"/>
|
7
|
-
<g id="Artboard11" serif:id="Artboard1">
|
8
|
-
<path d="M11.379,24.832C11.379,24.261 11.843,23.798 12.414,23.798C18.11,23.798 20.117,19.072 22.06,14.503C23.704,10.634 25.403,6.634 29.483,6.634C33.902,6.634 35.376,12.91 36.934,19.555C38.473,26.113 40.065,32.893 44.138,32.893C48.25,32.893 50.78,28.962 53.457,24.8C56.279,20.412 59.198,15.876 64.31,15.876C69.322,15.876 72.165,20.305 74.915,24.588C77.707,28.935 80.343,33.04 84.999,33.04C85.571,33.04 86.034,33.503 86.034,34.075C86.034,34.647 85.571,35.11 84.999,35.11C79.212,35.11 76.004,30.115 73.175,25.708C70.612,21.716 68.192,17.946 64.31,17.946C60.328,17.946 57.835,21.819 55.197,25.92C52.338,30.366 49.381,34.963 44.138,34.963C38.425,34.963 36.643,27.371 34.92,20.028C33.613,14.46 32.262,8.703 29.482,8.703C26.953,8.703 25.71,11.2 23.963,15.311C21.964,20.014 19.479,25.867 12.413,25.867C11.843,25.867 11.379,25.403 11.379,24.832M44.361,44.584C43.504,44.584 42.557,44.882 42.557,45.739L42.586,50.703L39.522,50.703L43.922,61.878L48.807,50.703L45.691,50.703L45.604,46.255C45.602,45.398 45.218,44.584 44.361,44.584ZM6.034,37.487L6.034,6.674L5,6.674L5,38.522L95,38.522L95,37.487L6.034,37.487M77.414,91.881L77.414,63.849C77.414,63.277 76.951,62.814 76.379,62.814C75.808,62.814 75.345,63.277 75.345,63.849L75.345,91.881C75.345,92.045 75.391,92.194 75.458,92.332L61.955,92.332C62.022,92.194 62.068,92.045 62.068,91.881L62.068,82.718C62.068,82.146 61.605,81.683 61.034,81.683C60.462,81.683 59.999,82.146 59.999,82.718L59.999,91.881C59.999,92.045 60.045,92.194 60.112,92.332L45.059,92.332C45.126,92.194 45.172,92.045 45.172,91.881L45.172,75.943C45.172,75.372 44.709,74.909 44.138,74.909C43.567,74.909 43.104,75.372 43.104,75.943L43.104,91.881C43.104,92.045 43.15,92.194 43.217,92.332L23.852,92.332C23.92,92.194 23.966,92.045 23.966,91.881L23.966,63.849C23.966,63.277 23.502,62.814 22.931,62.814C22.36,62.814 21.897,63.277 21.897,63.849L21.897,91.881C21.897,92.045 21.943,92.194 22.011,92.332L6.034,92.332L6.034,62.881L5,62.881L5,93.366L95,93.366L95,92.332L77.301,92.332C77.368,92.194 77.414,92.045 77.414,91.881"
|
9
|
-
style="fill:white;fill-rule:nonzero;stroke:white;stroke-width:5px;"/>
|
10
|
-
</g>
|
11
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="m78.89-112.59 263.02-367.17h202l303.5-354.22v721.39H78.89Zm62.24-262.74-54.7-39.78 166.59-233.02h201L640.46-864.8l51.45 44.26-205.82 240.78H287.33l-146.2 204.43Zm70.54 194.37h567.37v-468.78L574.98-411.63H376.22L211.67-180.96Zm567.37 0Z"/>
|
3
|
-
</svg>
|
@@ -1,4 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 0 24 24" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M0 0h24v24H0V0z" fill="none"/>
|
3
|
-
<path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.25 2.52.77-1.28-3.52-2.09V8z"/>
|
4
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M185.09-105.87q-32.51 0-55.87-23.35-23.35-23.36-23.35-55.87v-589.82q0-32.74 23.35-56.26 23.36-23.53 55.87-23.53h589.82q32.74 0 56.26 23.53 23.53 23.52 23.53 56.26v589.82q0 32.51-23.53 55.87-23.52 23.35-56.26 23.35H185.09Zm43.56-166.04h503.7L578-481.48l-132 171-93-127-124.35 165.57Z"/>
|
3
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M283.85-289.91h67.41l42.32-112.66h172.59l43.33 112.66h68.85l-164-428h-67.5l-163 428Zm127.74-165.72 67.34-182.87H481l68.41 182.87H411.59Zm68.53 381.61q-86.32 0-160.51-31t-128.89-85.7q-54.7-54.7-85.7-128.89-31-74.19-31-160.51 0-85.31 30.94-159.4t85.7-128.9q54.76-54.8 128.95-86.3t160.51-31.5q85.31 0 159.42 31.47 74.1 31.47 128.91 86.27 54.82 54.8 86.29 128.88 31.48 74.08 31.48 159.6 0 86.2-31.5 160.39-31.5 74.19-86.3 128.95-54.81 54.76-128.9 85.7-74.09 30.94-159.4 30.94ZM480-480Zm-.04 337.85q144.08 0 240.99-96.74 96.9-96.74 96.9-241.07 0-144.32-96.86-241.11-96.86-96.78-240.95-96.78-144.08 0-240.99 96.74-96.9 96.74-96.9 241.07 0 144.32 96.86 241.11 96.86 96.78 240.95 96.78Z"/>
|
3
|
-
</svg>
|
@@ -1,9 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="48px" viewBox="0 0 24 24" width="48px"
|
2
|
-
fill="#FFFFFF">
|
3
|
-
<g>
|
4
|
-
<rect fill="none" height="24" width="24"/>
|
5
|
-
</g>
|
6
|
-
<g>
|
7
|
-
<path d="M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z"/>
|
8
|
-
</g>
|
9
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M110.39-110.39v-89.57l77.52-77.52v167.09h-77.52Zm165.57 0v-250.13l77.52-77.52v327.65h-77.52Zm165.56 0v-327.65l77.52 77.95v249.7h-77.52Zm165.57 0v-250.83l77.52-76.96v327.79h-77.52Zm165.56 0v-411.83l76.96-76.96v488.79h-76.96ZM110.39-335.65v-112.7L400-735.96l160 160 289.61-290.61v112.14L560-463.26l-160-160-289.61 287.61Z"/>
|
3
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M725.93-155.93q0-118.18-45-222.09t-122-180.91q-77-77-180.91-122t-222.09-45v-68.14q132.68 0 248.61 50.23 115.92 50.23 202.5 136.75 86.57 86.53 136.8 202.53 50.23 116.01 50.23 248.63h-68.14Z"/>
|
3
|
-
</svg>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF">
|
2
|
-
<path d="M571.91-279.09h191v-194h-60v134h-131v60ZM198.09-486.91h60v-134h131v-60h-191v194Zm-53 341.04q-32.51 0-55.87-23.35-23.35-23.36-23.35-55.87v-509.82q0-32.74 23.35-56.26 23.36-23.53 55.87-23.53h669.82q32.74 0 56.26 23.53 23.53 23.52 23.53 56.26v509.82q0 32.51-23.53 55.87-23.52 23.35-56.26 23.35H145.09Zm0-79.22h669.82v-509.82H145.09v509.82Zm0 0v-509.82 509.82Z"/>
|
3
|
-
</svg>
|
Binary file
|