ncca-ngl 0.2.7__py3-none-any.whl → 0.3.1__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.
@@ -0,0 +1,178 @@
1
+ from PySide6.QtCore import Property, QSignalBlocker, Signal
2
+ from PySide6.QtWidgets import QDoubleSpinBox, QFrame, QHBoxLayout, QLabel, QWidget
3
+
4
+ from ncca.ngl import Vec4
5
+
6
+
7
+ class Vec4Widget(QFrame):
8
+ """A widget for displaying and editing a Vec4 object."""
9
+
10
+ valueChanged = Signal(Vec4)
11
+ xValueChanged = Signal(float)
12
+ yValueChanged = Signal(float)
13
+ zValueChanged = Signal(float)
14
+ wValueChanged = Signal(float)
15
+
16
+ def __init__(self, name: str, value: Vec4 = Vec4(0.0, 0.0, 0.0, 1.0), parent: QWidget | None = None) -> None:
17
+ """
18
+ Args:
19
+ name: The name of the widget.
20
+ value: The initial value of the widget.
21
+ parent: The parent widget.
22
+ """
23
+ super().__init__(parent)
24
+ self.setFrameShape(QFrame.Shape.StyledPanel)
25
+ self._value = value
26
+ self._name = name
27
+ layout = QHBoxLayout()
28
+
29
+ self.x_spinbox = self._create_spinbox(self._value.x)
30
+ self.y_spinbox = self._create_spinbox(self._value.y)
31
+ self.z_spinbox = self._create_spinbox(self._value.z)
32
+ self.w_spinbox = self._create_spinbox(self._value.w)
33
+
34
+ self._label = QLabel(self._name)
35
+ layout.addWidget(self._label)
36
+ layout.addWidget(self.x_spinbox)
37
+ layout.addWidget(self.y_spinbox)
38
+ layout.addWidget(self.z_spinbox)
39
+ layout.addWidget(self.w_spinbox)
40
+ self.setLayout(layout)
41
+
42
+ def _create_spinbox(self, value: float) -> QDoubleSpinBox:
43
+ """Helper method to create and configure a QDoubleSpinBox.
44
+
45
+ Args:
46
+ value: The initial value of the spinbox.
47
+
48
+ Returns:
49
+ A configured QDoubleSpinBox.
50
+ """
51
+ spinbox = QDoubleSpinBox()
52
+ spinbox.setValue(value)
53
+ spinbox.setRange(-5.0, 5.0)
54
+ spinbox.setSingleStep(0.01)
55
+ spinbox.valueChanged.connect(self._on_value_changed)
56
+ return spinbox
57
+
58
+ def get_value(self) -> Vec4:
59
+ """
60
+ Returns:
61
+ The current value of the widget.
62
+ """
63
+ return self._value
64
+
65
+ def _on_value_changed(self, value: float) -> None:
66
+ """This slot is called when the value of a spinbox changes.
67
+
68
+ Args:
69
+ value: The new value of the spinbox.
70
+ """
71
+ sender = self.sender()
72
+ if sender == self.x_spinbox:
73
+ self._value.x = value
74
+ self.xValueChanged.emit(value)
75
+ elif sender == self.y_spinbox:
76
+ self._value.y = value
77
+ self.yValueChanged.emit(value)
78
+ elif sender == self.z_spinbox:
79
+ self._value.z = value
80
+ self.zValueChanged.emit(value)
81
+ elif sender == self.w_spinbox:
82
+ self._value.w = value
83
+ self.wValueChanged.emit(value)
84
+ # emit the Vec4 value changed signal
85
+ self.valueChanged.emit(self._value)
86
+
87
+ def set_value(self, value: Vec4) -> None:
88
+ """Sets the value of the widget.
89
+
90
+ Args:
91
+ value: The new value of the widget.
92
+ """
93
+ with (
94
+ QSignalBlocker(self.x_spinbox),
95
+ QSignalBlocker(self.y_spinbox),
96
+ QSignalBlocker(self.z_spinbox),
97
+ QSignalBlocker(self.w_spinbox),
98
+ ):
99
+ self.x_spinbox.setValue(value.x)
100
+ self.y_spinbox.setValue(value.y)
101
+ self.z_spinbox.setValue(value.z)
102
+ self.w_spinbox.setValue(value.w)
103
+ self._value = value
104
+ self.valueChanged.emit(self._value)
105
+
106
+ def get_name(self) -> str:
107
+ """
108
+ Returns:
109
+ The name of the widget.
110
+ """
111
+ return self._name
112
+
113
+ def set_range(self, min_val: float, max_val: float) -> None:
114
+ """Sets the range for all spinboxes.
115
+
116
+ Args:
117
+ min_val: The minimum value.
118
+ max_val: The maximum value.
119
+ """
120
+ for spinbox in (self.x_spinbox, self.y_spinbox, self.z_spinbox, self.w_spinbox):
121
+ spinbox.setRange(min_val, max_val)
122
+
123
+ def set_x_range(self, min_val: float, max_val: float) -> None:
124
+ """Sets the range for the x spinbox.
125
+
126
+ Args:
127
+ min_val: The minimum value.
128
+ max_val: The maximum value.
129
+ """
130
+ self.x_spinbox.setRange(min_val, max_val)
131
+
132
+ def set_y_range(self, min_val: float, max_val: float) -> None:
133
+ """Sets the range for the y spinbox.
134
+
135
+ Args:
136
+ min_val: The minimum value.
137
+ max_val: The maximum value.
138
+ """
139
+ self.y_spinbox.setRange(min_val, max_val)
140
+
141
+ def set_z_range(self, min_val: float, max_val: float) -> None:
142
+ """Sets the range for the z spinbox.
143
+
144
+ Args:
145
+ min_val: The minimum value.
146
+ max_val: The maximum value.
147
+ """
148
+ self.z_spinbox.setRange(min_val, max_val)
149
+
150
+ def set_w_range(self, min_val: float, max_val: float) -> None:
151
+ """Sets the range for the w spinbox.
152
+
153
+ Args:
154
+ min_val: The minimum value.
155
+ max_val: The maximum value.
156
+ """
157
+ self.w_spinbox.setRange(min_val, max_val)
158
+
159
+ def set_single_step(self, step: float) -> None:
160
+ """Sets the single step for all spinboxes.
161
+
162
+ Args:
163
+ step: The single step value.
164
+ """
165
+ for spinbox in (self.x_spinbox, self.y_spinbox, self.z_spinbox, self.w_spinbox):
166
+ spinbox.setSingleStep(step)
167
+
168
+ def set_name(self, name: str) -> None:
169
+ """Sets the name of the widget.
170
+
171
+ Args:
172
+ name: The new name of the widget.
173
+ """
174
+ self._name = name
175
+ self._label.setText(name)
176
+
177
+ value = Property(Vec4, get_value, set_value)
178
+ name = Property(str, get_name, set_name)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ncca-ngl
3
- Version: 0.2.7
3
+ Version: 0.3.1
4
4
  Summary: A Python version of the NGL graphics library.
5
5
  Author: Jon Macey
6
6
  Author-email: Jon Macey <jmacey@bournemouth.ac.uk>
@@ -34,15 +34,15 @@ ncca/ngl/plane.py,sha256=96WuGzexYKhoeRVevGP2pZcustt9fzyyAjuwJHT25tk,1299
34
34
  ncca/ngl/prim_data.py,sha256=Ji08CdnCJP4KPYEwh5P_NcltC76rPfNPx3MXgnkUW-E,19114
35
35
  ncca/ngl/primitives.py,sha256=pThdSWLv7jJa9weBVOXhRgTfVVH54AWCbsDFCEI1YLg,4841
36
36
  ncca/ngl/pyside_event_handling_mixin.py,sha256=L8obXeTp-g2Va2eXyd1hnmSp-sY7p4GX6EcFYRnH1F4,10588
37
- ncca/ngl/quaternion.py,sha256=hvMoaV7uxx60boPg4cTqLJDyTpFZrEpUhikNqmNVTrU,5188
37
+ ncca/ngl/quaternion.py,sha256=sKCoHTzKyN-rx-A4q_eAz_4yLWjFcNYS8H8ay6eCBeA,5868
38
38
  ncca/ngl/random.py,sha256=wX1R2rMpb76TP4rk44NUp5XoVuMisH9d-eBG5kFBZsM,5579
39
39
  ncca/ngl/shader.py,sha256=fEz8R_itsQssIxQp1E8-PhY3aOaTdm7sXpyFYoARSic,7696
40
40
  ncca/ngl/shader_lib.py,sha256=YmF3EJM9roTEt5OI5sHonAVN_ydIseyiOUBFZTX4KdA,18627
41
41
  ncca/ngl/shader_program.py,sha256=WNEUOl4N4giC6caC0uMXm5ikDUtzCuZl7dqZl4M7p6k,33655
42
- ncca/ngl/shaders/checker_fragment.glsl,sha256=2hJH8yOJxLH5DdDdS15C3uom4o4YsiBle0fIYLkx9jI,640
43
- ncca/ngl/shaders/checker_vertex.glsl,sha256=G90GDAY5yEsdYMHhpZhWTmFFx_jfpDUexam-vpuVrXo,411
42
+ ncca/ngl/shaders/checker_fragment.glsl,sha256=FGReGg5l_l9QfGyfdXeOQg5i9KCqw3qpKEJ5H0TAW8Q,640
43
+ ncca/ngl/shaders/checker_vertex.glsl,sha256=Xb3SYKs9iSkw1ejtfttrBrTDTgfdlBy2hVcxrUXIzos,411
44
44
  ncca/ngl/shaders/colour_fragment.glsl,sha256=Y8CeWyDyQAK7u3-rQhURO6Ee3ibturZR3B75e5vcb2U,118
45
- ncca/ngl/shaders/colour_vertex.glsl,sha256=moRuaWAmWbItzIgFlweDMz1dklQrJ_jZKNjw8SaXd9I,154
45
+ ncca/ngl/shaders/colour_vertex.glsl,sha256=MZTFp0KIeiMEi6XPFScxp6I-enpr4wX2Cx8LYmaBnC8,154
46
46
  ncca/ngl/shaders/diffuse_fragment.glsl,sha256=vkKJ9R683yk5OlyUGUwdoqrLyOsvFz3CjZS-wRCuzaY,615
47
47
  ncca/ngl/shaders/diffuse_vertex.glsl,sha256=j1t1Zv5iky0gsBG0HOQGOix6qyj09RHo7c_irMMJZHo,621
48
48
  ncca/ngl/shaders/text_fragment.glsl,sha256=1jrKOSl5EjJOFonWdgj7dNiQtzFSbZy1QaZrUwUidNQ,220
@@ -61,6 +61,22 @@ ncca/ngl/vec3.py,sha256=N_-LvP0nB0CQrZWG7TJntUl6QDHzIVLP-J1w8wPZTM0,12275
61
61
  ncca/ngl/vec3_array.py,sha256=fLRC8k0TwcaU7CnR2GmJ0prud4dcvvUX0JTbQH_2W3Y,3535
62
62
  ncca/ngl/vec4.py,sha256=mLl23D-3yAxh7GsP44ilRto-PMqIDxJjcZpNl2MyqGQ,6751
63
63
  ncca/ngl/vec4_array.py,sha256=PSJXfG0g2AT4oQCLHiVAP6EC5n7vMXRQy0N1rGvv1iw,3426
64
- ncca_ngl-0.2.7.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
65
- ncca_ngl-0.2.7.dist-info/METADATA,sha256=M6DICVnyLStX-WNzY-6ThLULlB9tWQkMu7Q8EGF1SRw,1596
66
- ncca_ngl-0.2.7.dist-info/RECORD,,
64
+ ncca/ngl/widgets/NGLDebug.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ ncca/ngl/widgets/__init__.py,sha256=KBrwCwgDLIl-eAp0Q5HQcmNkfZ9q6waPC_4A8-g9PG0,413
66
+ ncca/ngl/widgets/__main__.py,sha256=iRqjBJOHBV3MR8cf00hjIKO4rVDuAuwBWvOSnwTwKJo,2736
67
+ ncca/ngl/widgets/glsl/phong.frag,sha256=iP-4cx0Qh7CS4tDbQmSdDX4huW3_XqleQaXdRBAiZ3A,853
68
+ ncca/ngl/widgets/glsl/phong.vert,sha256=3v1dZba9FTS0ly-3rtEYMTiKPGIzfezDjhu-4m4SwDY,333
69
+ ncca/ngl/widgets/glsl/picking.frag,sha256=372ZzBC1KME9i6lmO7yvUnio9YHp7u6wqiV2cGesTxs,100
70
+ ncca/ngl/widgets/glsl/picking.vert,sha256=Bbn2vZ-lk3nD8qfXfIIaxan2V85XkpWUipYRWCMXobw,128
71
+ ncca/ngl/widgets/lookatwidget.py,sha256=SWNuSeWqndgH5nToAmVYPG_LvjcqKFOvxLivEqg4WJ8,3083
72
+ ncca/ngl/widgets/mat4widget.py,sha256=7vXs5h2EtA6zy3rTpXd8dtlOg2CFeQHlrg4a4F1RMak,202
73
+ ncca/ngl/widgets/rgbacolourwidget.py,sha256=KrMRCtF-IaguHypljPe0fhcrCCybOYTKGsh7W-NZdpY,5319
74
+ ncca/ngl/widgets/rgbcolourwidget.py,sha256=edFfM6aI1IChO5Bbhi4TyyCEOhIPsLFnveCfcgcxCo0,4704
75
+ ncca/ngl/widgets/transformation_widget.py,sha256=qeEYXKEwUVdWBKz3oXiW6kbTm-MyXghoh0rfU7J3yAE,10568
76
+ ncca/ngl/widgets/transformwidget.py,sha256=SepF8BjnyBePpSP2NI7aUzJJLR_l_syKR3FKjC23Ruk,3482
77
+ ncca/ngl/widgets/vec2widget.py,sha256=K8r0DTDsHAP2x_32UzDP60JWiHdsHcYMPdqf2VHsSCs,4325
78
+ ncca/ngl/widgets/vec3widget.py,sha256=fEGFhzPxVieh5wb5k-PYiRbxomTiAfy2BfX6SYD7VvI,4929
79
+ ncca/ngl/widgets/vec4widget.py,sha256=018fKQk9cQtkEf9HHEC4WttchU_ixbeH-DQUWWGGhSo,5626
80
+ ncca_ngl-0.3.1.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
81
+ ncca_ngl-0.3.1.dist-info/METADATA,sha256=HHCXj19iCTb0rPkiPbws_2W3J_3OpSDgqCYaVDHF-yg,1596
82
+ ncca_ngl-0.3.1.dist-info/RECORD,,