bec-widgets 0.99.0__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.
Files changed (123) hide show
  1. .gitlab-ci.yml +0 -1
  2. CHANGELOG.md +70 -82
  3. PKG-INFO +2 -2
  4. bec_widgets/cli/client.py +3 -3
  5. bec_widgets/qt_utils/toolbar.py +11 -5
  6. bec_widgets/utils/bec_widget.py +11 -2
  7. bec_widgets/utils/colors.py +18 -2
  8. bec_widgets/utils/crosshair.py +4 -0
  9. bec_widgets/utils/plugin_templates/plugin.template +2 -2
  10. bec_widgets/widgets/bec_queue/bec_queue.py +2 -0
  11. bec_widgets/widgets/bec_queue/bec_queue_plugin.py +1 -1
  12. bec_widgets/widgets/bec_status_box/bec_status_box.py +2 -0
  13. bec_widgets/widgets/bec_status_box/bec_status_box_plugin.py +1 -1
  14. bec_widgets/widgets/color_button/color_button.py +2 -0
  15. bec_widgets/widgets/color_button/color_button_plugin.py +1 -1
  16. bec_widgets/widgets/colormap_selector/colormap_selector.py +1 -0
  17. bec_widgets/widgets/colormap_selector/colormap_selector_plugin.py +1 -1
  18. bec_widgets/widgets/dark_mode_button/dark_mode_button.py +12 -3
  19. bec_widgets/widgets/dark_mode_button/dark_mode_button_plugin.py +1 -1
  20. bec_widgets/widgets/device_browser/device_browser.py +2 -0
  21. bec_widgets/widgets/device_browser/device_browser_plugin.py +1 -1
  22. bec_widgets/widgets/device_combobox/device_combo_box_plugin.py +1 -1
  23. bec_widgets/widgets/device_combobox/device_combobox.py +2 -0
  24. bec_widgets/widgets/device_line_edit/device_line_edit.py +2 -0
  25. bec_widgets/widgets/device_line_edit/device_line_edit_plugin.py +1 -1
  26. bec_widgets/widgets/dock/dock.py +1 -0
  27. bec_widgets/widgets/dock/dock_area.py +30 -10
  28. bec_widgets/widgets/dock/dock_area_plugin.py +1 -1
  29. bec_widgets/widgets/figure/figure.py +1 -1
  30. bec_widgets/widgets/figure/plots/plot_base.py +6 -0
  31. bec_widgets/widgets/figure/plots/waveform/waveform.py +12 -7
  32. bec_widgets/widgets/figure/plots/waveform/waveform_curve.py +3 -3
  33. bec_widgets/widgets/image/bec_image_widget_plugin.py +1 -1
  34. bec_widgets/widgets/image/image_widget.py +1 -0
  35. bec_widgets/widgets/motor_map/bec_motor_map_widget_plugin.py +1 -1
  36. bec_widgets/widgets/motor_map/motor_map_widget.py +1 -0
  37. bec_widgets/widgets/position_indicator/position_indicator.py +2 -0
  38. bec_widgets/widgets/position_indicator/position_indicator_plugin.py +1 -1
  39. bec_widgets/widgets/positioner_box/positioner_box.py +1 -0
  40. bec_widgets/widgets/positioner_box/positioner_box_plugin.py +1 -1
  41. bec_widgets/widgets/positioner_box/positioner_control_line.py +2 -0
  42. bec_widgets/widgets/positioner_box/positioner_control_line_plugin.py +1 -1
  43. bec_widgets/widgets/ring_progress_bar/ring_progress_bar.py +1 -0
  44. bec_widgets/widgets/ring_progress_bar/ring_progress_bar_plugin.py +1 -1
  45. bec_widgets/widgets/scan_control/scan_control.py +2 -0
  46. bec_widgets/widgets/scan_control/scan_control_plugin.py +1 -4
  47. bec_widgets/widgets/spinner/spinner.py +2 -0
  48. bec_widgets/widgets/spinner/spinner_widget_plugin.py +1 -1
  49. bec_widgets/widgets/stop_button/stop_button.py +2 -0
  50. bec_widgets/widgets/stop_button/stop_button_plugin.py +1 -1
  51. bec_widgets/widgets/text_box/text_box.py +1 -0
  52. bec_widgets/widgets/text_box/text_box_plugin.py +1 -1
  53. bec_widgets/widgets/toggle/toggle.py +1 -0
  54. bec_widgets/widgets/toggle/toggle_switch_plugin.py +1 -1
  55. bec_widgets/widgets/vscode/vs_code_editor_plugin.py +1 -1
  56. bec_widgets/widgets/vscode/vscode.py +1 -0
  57. bec_widgets/widgets/waveform/bec_waveform_widget_plugin.py +1 -1
  58. bec_widgets/widgets/waveform/waveform_popups/curve_dialog/curve_dialog.py +14 -13
  59. bec_widgets/widgets/waveform/waveform_widget.py +39 -2
  60. bec_widgets/widgets/website/website.py +42 -10
  61. bec_widgets/widgets/website/website_widget_plugin.py +1 -1
  62. {bec_widgets-0.99.0.dist-info → bec_widgets-0.99.8.dist-info}/METADATA +2 -2
  63. {bec_widgets-0.99.0.dist-info → bec_widgets-0.99.8.dist-info}/RECORD +85 -122
  64. docs/assets/widget_screenshots/buttons.png +0 -0
  65. docs/developer/widget_development/bec_dispatcher.md +1 -1
  66. docs/developer/widget_development/widget_base_class.md +171 -0
  67. docs/developer/widget_development/widget_development.md +3 -2
  68. docs/index.md +2 -2
  69. docs/user/widgets/buttons/buttons.md +32 -5
  70. docs/user/widgets/dock_area/bec_dock_area.md +4 -2
  71. docs/user/widgets/position_indicator/position_indicator.md +1 -8
  72. docs/user/widgets/spinner/spinner.md +0 -7
  73. docs/user/widgets/waveform/waveform_widget.md +3 -3
  74. docs/user/widgets/widgets.md +1 -1
  75. pyproject.toml +2 -2
  76. tests/unit_tests/test_configs/config_device.yaml +1 -1
  77. tests/unit_tests/test_configs/config_device_no_entry.yaml +1 -1
  78. tests/unit_tests/test_configs/config_scan.yaml +1 -1
  79. tests/unit_tests/test_crosshair.py +2 -2
  80. tests/unit_tests/test_waveform1d.py +14 -14
  81. tests/unit_tests/test_waveform_widget.py +2 -2
  82. tests/unit_tests/test_website_widget.py +2 -2
  83. bec_widgets/assets/toolbar_icons/add.svg +0 -3
  84. bec_widgets/assets/toolbar_icons/attach_all.svg +0 -3
  85. bec_widgets/assets/toolbar_icons/auto_range.svg +0 -3
  86. bec_widgets/assets/toolbar_icons/compare.svg +0 -3
  87. bec_widgets/assets/toolbar_icons/connection.svg +0 -4
  88. bec_widgets/assets/toolbar_icons/device_line_edit.svg +0 -3
  89. bec_widgets/assets/toolbar_icons/drag_pan_mode.svg +0 -3
  90. bec_widgets/assets/toolbar_icons/export.svg +0 -9
  91. bec_widgets/assets/toolbar_icons/fft.svg +0 -11
  92. bec_widgets/assets/toolbar_icons/fitting_parameters.svg +0 -3
  93. bec_widgets/assets/toolbar_icons/history.svg +0 -4
  94. bec_widgets/assets/toolbar_icons/image.svg +0 -3
  95. bec_widgets/assets/toolbar_icons/image_autorange.svg +0 -3
  96. bec_widgets/assets/toolbar_icons/import.svg +0 -9
  97. bec_widgets/assets/toolbar_icons/line_axis.svg +0 -3
  98. bec_widgets/assets/toolbar_icons/line_curve.svg +0 -3
  99. bec_widgets/assets/toolbar_icons/lock_aspect_ratio.svg +0 -3
  100. bec_widgets/assets/toolbar_icons/log_scale.png +0 -0
  101. bec_widgets/assets/toolbar_icons/motor_map.svg +0 -3
  102. bec_widgets/assets/toolbar_icons/photo_library.svg +0 -3
  103. bec_widgets/assets/toolbar_icons/positioner_box.svg +0 -3
  104. bec_widgets/assets/toolbar_icons/progress.svg +0 -3
  105. bec_widgets/assets/toolbar_icons/queue.svg +0 -3
  106. bec_widgets/assets/toolbar_icons/rectangle_mode.svg +0 -3
  107. bec_widgets/assets/toolbar_icons/remove.svg +0 -5
  108. bec_widgets/assets/toolbar_icons/reset_settings.svg +0 -3
  109. bec_widgets/assets/toolbar_icons/restore_state.svg +0 -3
  110. bec_widgets/assets/toolbar_icons/ring_progress.svg +0 -3
  111. bec_widgets/assets/toolbar_icons/rotate_left.svg +0 -3
  112. bec_widgets/assets/toolbar_icons/rotate_right.svg +0 -3
  113. bec_widgets/assets/toolbar_icons/save.svg +0 -3
  114. bec_widgets/assets/toolbar_icons/save_state.svg +0 -3
  115. bec_widgets/assets/toolbar_icons/scan_control.svg +0 -3
  116. bec_widgets/assets/toolbar_icons/settings.svg +0 -4
  117. bec_widgets/assets/toolbar_icons/status.svg +0 -3
  118. bec_widgets/assets/toolbar_icons/terminal.svg +0 -3
  119. bec_widgets/assets/toolbar_icons/transform.svg +0 -3
  120. bec_widgets/assets/toolbar_icons/waveform.svg +0 -3
  121. {bec_widgets-0.99.0.dist-info → bec_widgets-0.99.8.dist-info}/WHEEL +0 -0
  122. {bec_widgets-0.99.0.dist-info → bec_widgets-0.99.8.dist-info}/entry_points.txt +0 -0
  123. {bec_widgets-0.99.0.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
- # Widget development
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
- # Service Buttons
3
+ # Buttons
4
4
 
5
- ````{tab} Overview
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
- ```{figure} ./dark_mode_enabled.png
21
+ ````{grid} 2
22
+ :gutter: 2
23
+
24
+ ```{grid-item-card} Dark Mode
25
+ :img-top: ./dark_mode_enabled.png
22
26
  ```
23
- ```{figure} ./dark_mode_disabled.png
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
- ```{tab} Overview
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
  ![BECDockArea.png](BECDockArea.png)
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
+ ````
@@ -65,11 +65,4 @@ self.spinner_widget.start()
65
65
  self.spinner_widget.stop()
66
66
  ```
67
67
 
68
- ````
69
-
70
- ````{tab} API
71
-
72
- ```{eval-rst}
73
- .. include:: /api_reference/_autosummary/bec_widgets.widgets.spinner.spinner.SpinnerWidget.rst
74
- ```
75
68
  ````
@@ -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`, or used as an individual component in your application through `BECDesigner`. However, the command-line API is the same for all cases.
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
@@ -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} Service Buttons
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.0"
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
@@ -1,7 +1,7 @@
1
1
  plot_settings:
2
2
  background_color: "black"
3
3
  num_columns: 1
4
- colormap: "plasma"
4
+ colormap: "magma"
5
5
  scan_types: false
6
6
  plot_data:
7
7
  - plot_name: "BPM4i plots vs samx"
@@ -1,7 +1,7 @@
1
1
  plot_settings:
2
2
  background_color: "black"
3
3
  num_columns: 1
4
- colormap: "plasma"
4
+ colormap: "magma"
5
5
  scan_types: false
6
6
  plot_data:
7
7
  - plot_name: "BPM4i plots vs samx"
@@ -1,7 +1,7 @@
1
1
  plot_settings:
2
2
  background_color: "white"
3
3
  num_columns: 3
4
- colormap: "plasma"
4
+ colormap: "magma"
5
5
  scan_types: true
6
6
  plot_data:
7
7
  grid_scan:
@@ -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() == 2
53
- assert crosshair.h_line.pos().y() == 5
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": "plasma",
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": "plasma",
84
+ "color_map_z": "magma",
85
85
  "symbol": "o",
86
86
  "symbol_color": None,
87
- "symbol_size": 5,
88
- "pen_width": 2,
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": "plasma",
117
+ "color_map_z": "magma",
118
118
  "symbol": "o",
119
119
  "symbol_color": None,
120
- "symbol_size": 5,
121
- "pen_width": 2,
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="#cc4778",
158
+ color="#b73779",
159
159
  symbol="o",
160
160
  symbol_color=None,
161
- symbol_size=5,
162
- pen_width=2,
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": "plasma",
401
+ "color_map_z": "magma",
402
402
  "symbol": "o",
403
403
  "symbol_color": None,
404
- "symbol_size": 5,
405
- "pen_width": 2,
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], "plasma")
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="plasma",
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="plasma",
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="M440.39-440.39H185.87v-79.22h254.52V-774.7h79.22v255.09H774.7v79.22H519.61v254.52h-79.22v-254.52Z"/>
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="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="M114.02-114.02v-308.13h68.13v192.02l547.72-547.72H537.85v-68.37h308.37v308.37h-68.37v-192.02L230.13-182.15h192.02v68.13H114.02Z"/>
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>