molde 0.1.0__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 (62) hide show
  1. molde/__init__.py +5 -0
  2. molde/__main__.py +63 -0
  3. molde/actors/__init__.py +4 -0
  4. molde/actors/ghost_actor.py +12 -0
  5. molde/actors/lines_actor.py +31 -0
  6. molde/actors/round_points_actor.py +7 -0
  7. molde/actors/square_points_actor.py +32 -0
  8. molde/colors/__init__.py +2 -0
  9. molde/colors/color.py +120 -0
  10. molde/colors/color_names.py +125 -0
  11. molde/fonts/IBMPlexMono-Bold.ttf +0 -0
  12. molde/fonts/IBMPlexMono-Regular.ttf +0 -0
  13. molde/icons/arrow_down_dark_theme.svg +1 -0
  14. molde/icons/arrow_down_disabled_dark_theme.svg +1 -0
  15. molde/icons/arrow_down_disabled_light_theme.svg +1 -0
  16. molde/icons/arrow_down_light_theme.svg +1 -0
  17. molde/icons/arrow_left_dark_theme.svg +1 -0
  18. molde/icons/arrow_left_light_theme.svg +1 -0
  19. molde/icons/arrow_right_dark_theme.svg +1 -0
  20. molde/icons/arrow_right_light_theme.svg +1 -0
  21. molde/icons/arrow_up_dark_theme.svg +1 -0
  22. molde/icons/arrow_up_disabled_dark_theme.svg +1 -0
  23. molde/icons/arrow_up_disabled_light_theme.svg +1 -0
  24. molde/icons/arrow_up_light_theme.svg +1 -0
  25. molde/icons/check_box_image.svg +1 -0
  26. molde/interactor_styles/__init__.py +2 -0
  27. molde/interactor_styles/arcball_camera_style.py +272 -0
  28. molde/interactor_styles/box_selection_style.py +70 -0
  29. molde/pickers/__init__.py +2 -0
  30. molde/pickers/cell_area_picker.py +61 -0
  31. molde/pickers/cell_property_area_picker.py +84 -0
  32. molde/poly_data/__init__.py +2 -0
  33. molde/poly_data/lines_data.py +23 -0
  34. molde/poly_data/vertices_data.py +24 -0
  35. molde/render_widgets/__init__.py +2 -0
  36. molde/render_widgets/animated_render_widget.py +164 -0
  37. molde/render_widgets/common_render_widget.py +433 -0
  38. molde/stylesheets/__init__.py +119 -0
  39. molde/stylesheets/common.qss +16 -0
  40. molde/stylesheets/create_color_page.py +61 -0
  41. molde/stylesheets/mainwindow.ui +611 -0
  42. molde/stylesheets/qcheckbox.qss +19 -0
  43. molde/stylesheets/qinputs.qss +79 -0
  44. molde/stylesheets/qlayouts.qss +22 -0
  45. molde/stylesheets/qmenubar.qss +12 -0
  46. molde/stylesheets/qprogressbar.qss +12 -0
  47. molde/stylesheets/qpushbutton.qss +91 -0
  48. molde/stylesheets/qradiobutton.qss +31 -0
  49. molde/stylesheets/qscrollbar.qss +30 -0
  50. molde/stylesheets/qslider.qss +61 -0
  51. molde/stylesheets/qtablewidget.qss +27 -0
  52. molde/stylesheets/qtabwidget.qss +30 -0
  53. molde/stylesheets/qtoolbar.qss +62 -0
  54. molde/stylesheets/qtoolbuttons.qss +14 -0
  55. molde/stylesheets/qtreewidget.qss +25 -0
  56. molde/utils/__init__.py +8 -0
  57. molde/utils/format_sequences.py +44 -0
  58. molde/utils/poly_data_utils.py +25 -0
  59. molde/utils/tree_info.py +52 -0
  60. molde-0.1.0.dist-info/METADATA +44 -0
  61. molde-0.1.0.dist-info/RECORD +62 -0
  62. molde-0.1.0.dist-info/WHEEL +4 -0
molde/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ from pathlib import Path
2
+
3
+ from .colors import Color
4
+
5
+ MOLDE_DIR = Path(__file__).parent
molde/__main__.py ADDED
@@ -0,0 +1,63 @@
1
+ import os, sys
2
+ from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QLineEdit, QTableWidgetItem, QPushButton, QLabel
3
+ from PyQt5.QtGui import QColor
4
+ from PyQt5 import uic
5
+ from PyQt5.QtCore import Qt
6
+ from time import time
7
+
8
+ from molde import MOLDE_DIR
9
+ from molde import stylesheets
10
+ from molde.render_widgets.common_render_widget import CommonRenderWidget
11
+
12
+
13
+ class Example(QMainWindow):
14
+ def __init__(self, parent=None) -> None:
15
+ super().__init__(parent)
16
+ uic.loadUi(MOLDE_DIR / "stylesheets/mainwindow.ui", self)
17
+ self.current_theme = "light"
18
+
19
+ self.change_theme_button.clicked.connect(self.change_theme)
20
+ self.render_widget: CommonRenderWidget
21
+ self.render_widget.create_axes()
22
+ self.render_widget.create_scale_bar()
23
+ self.render_widget.create_color_bar()
24
+ self.render_widget.set_info_text("Hola\nque\ntal?")
25
+
26
+ self.botao1 = QPushButton()
27
+ self.label = QLabel("Olha o sapooo")
28
+ self.botao1.setText("Olha a faca")
29
+ self.toolbar_2.addWidget(self.label)
30
+ self.toolbar_2.addWidget(self.botao1)
31
+
32
+ item = QTableWidgetItem("fr")
33
+ item.setBackground(QColor("#FF0000"))
34
+ self.tableWidget.setItem(0, 0, item)
35
+ self.show()
36
+
37
+ def change_theme(self):
38
+ if self.current_theme == "light":
39
+ self.current_theme = "dark"
40
+ else:
41
+ self.current_theme = "light"
42
+
43
+ self.render_widget.set_theme(self.current_theme)
44
+ stylesheets.set_theme(self.current_theme)
45
+
46
+ def closeEvent(self, event):
47
+ close = QMessageBox.question(
48
+ self,
49
+ "QUIT",
50
+ "Would you like to close the application?",
51
+ QMessageBox.Yes | QMessageBox.No
52
+ )
53
+ QApplication.quit()
54
+
55
+
56
+ if __name__ == "__main__":
57
+ # Make the window scale evenly for every monitor
58
+ os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
59
+
60
+ app = QApplication(sys.argv)
61
+ e = Example()
62
+ e.change_theme()
63
+ sys.exit(app.exec())
@@ -0,0 +1,4 @@
1
+ from .ghost_actor import GhostActor
2
+ from .lines_actor import LinesActor
3
+ from .round_points_actor import RoundPointsActor
4
+ from .square_points_actor import SquarePointsActor
@@ -0,0 +1,12 @@
1
+ from vtkmodules.vtkRenderingCore import vtkActor
2
+
3
+
4
+ class GhostActor(vtkActor):
5
+ def make_ghost(self):
6
+ self.GetProperty().LightingOff()
7
+ offset = -66000
8
+ mapper = self.GetMapper()
9
+ mapper.SetResolveCoincidentTopologyToPolygonOffset()
10
+ mapper.SetRelativeCoincidentTopologyLineOffsetParameters(0, offset)
11
+ mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(0, offset)
12
+ mapper.SetRelativeCoincidentTopologyPointOffsetParameter(offset)
@@ -0,0 +1,31 @@
1
+ from vtkmodules.vtkRenderingCore import vtkActor, vtkPolyDataMapper
2
+
3
+ from molde.poly_data import LinesData
4
+
5
+
6
+ class LinesActor(vtkActor):
7
+ def __init__(self, lines_list) -> None:
8
+ super().__init__()
9
+ self.lines_list = lines_list
10
+
11
+ self.build()
12
+
13
+ def build(self):
14
+ data = LinesData(self.lines_list)
15
+ mapper = vtkPolyDataMapper()
16
+ mapper.SetInputData(data)
17
+ self.SetMapper(mapper)
18
+ self.GetProperty().SetLineWidth(3)
19
+
20
+ def set_width(self, width):
21
+ self.GetProperty().SetLineWidth(width)
22
+
23
+ def appear_in_front(self, cond: bool):
24
+ # this offset is the Z position of the camera buffer.
25
+ # if it is -66000 the object stays in front of everything.
26
+ offset = -66000 if cond else 0
27
+ mapper = self.GetMapper()
28
+ mapper.SetResolveCoincidentTopologyToPolygonOffset()
29
+ mapper.SetRelativeCoincidentTopologyLineOffsetParameters(0, offset)
30
+ mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(0, offset)
31
+ mapper.SetRelativeCoincidentTopologyPointOffsetParameter(offset)
@@ -0,0 +1,7 @@
1
+ from .square_points_actor import SquarePointsActor
2
+
3
+
4
+ class RoundPointsActor(SquarePointsActor):
5
+ def __init__(self, points) -> None:
6
+ super().__init__(points)
7
+ self.GetProperty().RenderPointsAsSpheresOn()
@@ -0,0 +1,32 @@
1
+ from vtkmodules.vtkRenderingCore import vtkActor, vtkPolyDataMapper
2
+
3
+ from molde.poly_data import VerticesData
4
+
5
+
6
+ class SquarePointsActor(vtkActor):
7
+ def __init__(self, points_list) -> None:
8
+ super().__init__()
9
+ self.points_list = points_list
10
+ self.build()
11
+
12
+ def build(self):
13
+ data = VerticesData(self.points_list)
14
+ mapper = vtkPolyDataMapper()
15
+ mapper.SetInputData(data)
16
+ self.SetMapper(mapper)
17
+
18
+ self.GetProperty().SetPointSize(20)
19
+ self.GetProperty().LightingOff()
20
+
21
+ def set_size(self, size):
22
+ self.GetProperty().SetPointSize(size)
23
+
24
+ def appear_in_front(self, cond: bool):
25
+ # this offset is the Z position of the camera buffer.
26
+ # if it is -66000 the object stays in front of everything.
27
+ offset = -66000 if cond else 0
28
+ mapper = self.GetMapper()
29
+ mapper.SetResolveCoincidentTopologyToPolygonOffset()
30
+ mapper.SetRelativeCoincidentTopologyLineOffsetParameters(0, offset)
31
+ mapper.SetRelativeCoincidentTopologyPolygonOffsetParameters(0, offset)
32
+ mapper.SetRelativeCoincidentTopologyPointOffsetParameter(offset)
@@ -0,0 +1,2 @@
1
+ from .color import Color
2
+ from .color_names import *
molde/colors/color.py ADDED
@@ -0,0 +1,120 @@
1
+ import typing
2
+ from PyQt5.QtGui import QColor
3
+ import numpy as np
4
+
5
+
6
+ class Color:
7
+ r: int
8
+ g: int
9
+ b: int
10
+ a: int
11
+
12
+ @typing.overload
13
+ def __init__(self, r: int, g: int, b: int, a: int = 255):
14
+ '''
15
+ Initialize Colors with RGB or RGBA integer values ranging from 0 to 255.
16
+ '''
17
+
18
+ @typing.overload
19
+ def __init__(self, r: float, g: float, b: float, a: float = 1.0):
20
+ '''
21
+ Initialize Colors with RGB or RGBA floating values ranging from 0.0 to 1.0.
22
+ '''
23
+
24
+ @typing.overload
25
+ def __init__(self, hexa: str):
26
+ '''
27
+ Initialize colors from hex values.
28
+ The valid formats incluce RGB (#FF0000 for example)
29
+ and RGBA (#FF0000FF for example)
30
+ '''
31
+
32
+ @typing.overload
33
+ def __init__(self, qcolor: QColor):
34
+ '''
35
+ Initialize the color class with an instance of QColor
36
+ '''
37
+
38
+ @typing.overload
39
+ def __init__(self):
40
+ '''
41
+ Initialize an empty black color
42
+ '''
43
+
44
+ def __init__(self, *args):
45
+
46
+ all_int = all([isinstance(i, int) for i in args])
47
+ all_float = all([isinstance(i, float) for i in args])
48
+
49
+ if len(args) == 0:
50
+ self.from_rgba(0, 0, 0, 255)
51
+
52
+ elif len(args) == 1 and isinstance(args[0], str):
53
+ self.from_hex(*args)
54
+
55
+ elif len(args) == 1 and isinstance(args[0], QColor):
56
+ self.from_qcolor(*args)
57
+
58
+ elif len(args) in [3, 4] and all_int:
59
+ self.from_rgba(*args)
60
+
61
+ elif len(args) in [3, 4] and all_float:
62
+ self.from_rgba_f(*args)
63
+
64
+ else:
65
+ raise ValueError("Invalid input values")
66
+
67
+ def from_rgb(self, r: int, g: int, b: int) -> "Color":
68
+ return self.from_rgba(r, g, b)
69
+
70
+ def from_rgba(self, r: int, g: int, b: int, a: int=255) -> "Color":
71
+ self.r = int(np.clip(r, 0, 255))
72
+ self.g = int(np.clip(g, 0, 255))
73
+ self.b = int(np.clip(b, 0, 255))
74
+ self.a = int(np.clip(a, 0, 255))
75
+ return self
76
+
77
+ def from_rgb_f(self, r: float, g: float, b: float) -> "Color":
78
+ return self.from_rgba_f(r, g, b)
79
+
80
+ def from_rgba_f(self, r: float, g: float, b: float, a: float = 1) -> "Color":
81
+ return self.from_rgba(
82
+ int(r * 255),
83
+ int(g * 255),
84
+ int(b * 255),
85
+ int(a * 255),
86
+ )
87
+
88
+ def from_hex(self, color: str) -> "Color":
89
+ color = color.lstrip('#')
90
+ if len(color) == 6:
91
+ r, g, b = int(color[0:2], 16), int(color[2:4], 16), int(color[4:6], 16)
92
+ return self.from_rgb(r, g, b)
93
+ elif len(color) == 8:
94
+ r, g, b, a = int(color[0:2], 16), int(color[2:4], 16), int(color[4:6], 16), int(color[6:8], 16)
95
+ return self.from_rgba(r, g, b, a)
96
+ raise ValueError("Invalid hex color format")
97
+
98
+ def from_qcolor(self, color: QColor) -> "Color":
99
+ return self.from_rgba(color.red(), color.green(), color.blue(), color.alpha())
100
+
101
+ def to_rgb(self) -> tuple[int, int, int]:
102
+ return (self.r, self.g, self.b)
103
+
104
+ def to_rgba(self) -> tuple[int, int, int, int]:
105
+ return (self.r, self.g, self.b, self.a)
106
+
107
+ def to_rgb_f(self) -> tuple[float, float, float]:
108
+ return ((self.r / 255), (self.g / 255), (self.b / 255))
109
+
110
+ def to_rgba_f(self) -> tuple[float, float, float, float]:
111
+ return ((self.r / 255), (self.g / 255), (self.b / 255), (self.a / 255))
112
+
113
+ def to_hex(self) -> str:
114
+ return (f'#{self.r:02X}{self.g:02X}{self.b:02X}')
115
+
116
+ def to_hexa(self) -> str:
117
+ return (f'#{self.r:02X}{self.g:02X}{self.b:02X}{self.a:02X}')
118
+
119
+ def to_qt(self) -> QColor:
120
+ return QColor(self.r, self.g, self.b, self.a)
@@ -0,0 +1,125 @@
1
+ from .color import Color
2
+
3
+
4
+ WHITE = Color("#FFFFFF")
5
+ BLACK = Color("#000000")
6
+
7
+ RED_9 = Color("#FFECEB")
8
+ RED_8 = Color("#FFD5D2")
9
+ RED_7 = Color("#FD9891")
10
+ RED_6 = Color("#F87168")
11
+ RED_5 = Color("#F15B50")
12
+ RED_4 = Color("#E2483D")
13
+ RED_3 = Color("#C9372C")
14
+ RED_2 = Color("#AE2E24")
15
+ RED_1 = Color("#5D1F1A")
16
+ RED_0 = Color("#42221F")
17
+ RED = RED_4
18
+
19
+ GREEN_9 = Color("#DCFFF1")
20
+ GREEN_8 = Color("#BAF3DB")
21
+ GREEN_7 = Color("#7EE2B8")
22
+ GREEN_6 = Color("#4BCE97")
23
+ GREEN_5 = Color("#2ABB7F")
24
+ GREEN_4 = Color("#22A06B")
25
+ GREEN_3 = Color("#1F845A")
26
+ GREEN_2 = Color("#216E4E")
27
+ GREEN_1 = Color("#164B35")
28
+ GREEN_0 = Color("#1C3329")
29
+ GREEN = GREEN_4
30
+
31
+ BLUE_9 = Color("#ECF0FF")
32
+ BLUE_8 = Color("#C5D4FF")
33
+ BLUE_7 = Color("#84AAFF")
34
+ BLUE_6 = Color("#498FFF")
35
+ BLUE_5 = Color("#007AF0")
36
+ BLUE_4 = Color("#0069D0")
37
+ BLUE_3 = Color("#0051A2")
38
+ BLUE_2 = Color("#003A79")
39
+ BLUE_1 = Color("#002451")
40
+ BLUE_0 = Color("#001429")
41
+ BLUE = BLUE_4
42
+
43
+ GRAY_9 = Color("#F0F0F5")
44
+ GRAY_8 = Color("#D3D4DD")
45
+ GRAY_7 = Color("#AAAAB9")
46
+ GRAY_6 = Color("#8F8FA2")
47
+ GRAY_5 = Color("#7A7B8E")
48
+ GRAY_4 = Color("#696979")
49
+ GRAY_3 = Color("#515162")
50
+ GRAY_2 = Color("#3A3A47")
51
+ GRAY_1 = Color("#24252E")
52
+ GRAY_0 = Color("#1F2028")
53
+ GRAY = GRAY_4
54
+
55
+ ORANGE_9 = Color("#FFF3EB")
56
+ ORANGE_8 = Color("#FEDEC8")
57
+ ORANGE_7 = Color("#FEC195")
58
+ ORANGE_6 = Color("#FEA362")
59
+ ORANGE_5 = Color("#F38A3F")
60
+ ORANGE_4 = Color("#E56910")
61
+ ORANGE_3 = Color("#C25100")
62
+ ORANGE_2 = Color("#A54800")
63
+ ORANGE_1 = Color("#702E00")
64
+ ORANGE_0 = Color("#421A00")
65
+ ORANGE = ORANGE_4
66
+
67
+ PURPLE_9 = Color("#F3F0FF")
68
+ PURPLE_8 = Color("#DFD8FD")
69
+ PURPLE_7 = Color("#B8ACF6")
70
+ PURPLE_6 = Color("#9F8FEF")
71
+ PURPLE_5 = Color("#8F7EE7")
72
+ PURPLE_4 = Color("#8270DB")
73
+ PURPLE_3 = Color("#6E5DC6")
74
+ PURPLE_2 = Color("#5E4DB2")
75
+ PURPLE_1 = Color("#352C63")
76
+ PURPLE_0 = Color("#2B273F")
77
+ PURPLE = PURPLE_4
78
+
79
+ TURQUOISE_9 = Color("#DBF6F2")
80
+ TURQUOISE_8 = Color("#9BE1D8")
81
+ TURQUOISE_7 = Color("#50BBAF")
82
+ TURQUOISE_6 = Color("#36A094")
83
+ TURQUOISE_5 = Color("#1E8B7F")
84
+ TURQUOISE_4 = Color("#02786D")
85
+ TURQUOISE_3 = Color("#005E55")
86
+ TURQUOISE_2 = Color("#00443D")
87
+ TURQUOISE_1 = Color("#002B26")
88
+ TURQUOISE_0 = Color("#002420")
89
+ TURQUOISE = TURQUOISE_4
90
+
91
+ YELLOW_9 = Color("#FFF0D6")
92
+ YELLOW_8 = Color("#FFE2AF")
93
+ YELLOW_7 = Color("#FFD387")
94
+ YELLOW_6 = Color("#FFC460")
95
+ YELLOW_5 = Color("#FFB432")
96
+ YELLOW_4 = Color("#E89403")
97
+ YELLOW_3 = Color("#B87400")
98
+ YELLOW_2 = Color("#8F5A00")
99
+ YELLOW_1 = Color("#664100")
100
+ YELLOW_0 = Color("#3D2700")
101
+ YELLOW = YELLOW_4
102
+
103
+ PINK_9 = Color("#FEECF1")
104
+ PINK_8 = Color("#FBC7D5")
105
+ PINK_7 = Color("#F888AE")
106
+ PINK_6 = Color("#F65495")
107
+ PINK_5 = Color("#E62881")
108
+ PINK_4 = Color("#C8206F")
109
+ PINK_3 = Color("#9D1756")
110
+ PINK_2 = Color("#74103E")
111
+ PINK_1 = Color("#4E0627")
112
+ PINK_0 = Color("#2E0116")
113
+ PINK = PINK_4
114
+
115
+ TEAL_9 = Color("#E7F9FF")
116
+ TEAL_8 = Color("#C6EDFB")
117
+ TEAL_7 = Color("#9DD9EE")
118
+ TEAL_6 = Color("#6CC3E0")
119
+ TEAL_5 = Color("#42B2D7")
120
+ TEAL_4 = Color("#2898BD")
121
+ TEAL_3 = Color("#227D9B")
122
+ TEAL_2 = Color("#206A83")
123
+ TEAL_1 = Color("#164555")
124
+ TEAL_0 = Color("#1E3137")
125
+ TEAL = TEAL_4
Binary file
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#FFFFFF"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#696979"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#AAAAB9"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#FFFFFF"><path d="M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#FFFFFF"><path d="M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#FFFFFF"><path d="M480-528 296-344l-56-56 240-240 240 240-56 56-184-184Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#696979"><path d="M480-528 296-344l-56-56 240-240 240 240-56 56-184-184Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#AAAAB9"><path d="M480-528 296-344l-56-56 240-240 240 240-56 56-184-184Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M480-528 296-344l-56-56 240-240 240 240-56 56-184-184Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="m424-312 282-282-56-56-226 226-114-114-56 56 170 170ZM200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0-560v560-560Z"/></svg>
@@ -0,0 +1,2 @@
1
+ from .arcball_camera_style import ArcballCameraInteractorStyle
2
+ from .box_selection_style import BoxSelectionInteractorStyle