pyscreeps-arena 0.5.7b0__py3-none-any.whl → 0.5.7.2__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,303 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Simple test script for array format drag and drop functionality
5
+ """
6
+
7
+ import sys
8
+ import json
9
+ from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
10
+ QHBoxLayout, QPushButton, QLabel, QListWidget,
11
+ QListWidgetItem, QFrame, QSpacerItem, QSizePolicy)
12
+ from PyQt6.QtCore import Qt, QMimeData, pyqtSignal
13
+ from PyQt6.QtGui import QDrag, QPixmap, QPainter, QPen, QColor, QBrush
14
+
15
+
16
+ class SimpleDropTarget(QWidget):
17
+ """Simple drop target widget to test array format."""
18
+
19
+ def __init__(self, name, parent=None):
20
+ super().__init__(parent)
21
+ self.name = name
22
+ self._objects = []
23
+ self._init_ui()
24
+ self.setAcceptDrops(True)
25
+
26
+ def _init_ui(self):
27
+ """Initialize UI."""
28
+ layout = QVBoxLayout()
29
+
30
+ # Title label
31
+ self.title_label = QLabel(f"{self.name} Drop Target")
32
+ self.title_label.setStyleSheet("font-weight: bold; font-size: 14px;")
33
+ layout.addWidget(self.title_label)
34
+
35
+ # Objects list
36
+ self.objects_list = QListWidget()
37
+ self.objects_list.setFrameStyle(QFrame.Shape.Box)
38
+ self.objects_list.setMaximumHeight(150)
39
+ self.objects_list.setStyleSheet("""
40
+ QListWidget {
41
+ border: 1px solid #ccc;
42
+ border-radius: 4px;
43
+ background-color: white;
44
+ }
45
+ QListWidget::item {
46
+ border-bottom: 1px solid #eee;
47
+ }
48
+ """)
49
+ layout.addWidget(self.objects_list)
50
+
51
+ # Status label
52
+ self.status_label = QLabel("Status: Ready")
53
+ self.status_label.setStyleSheet("font-size: 10px; color: #666;")
54
+ layout.addWidget(self.status_label)
55
+
56
+ self.setLayout(layout)
57
+ self.setMinimumWidth(250)
58
+ self.setMaximumWidth(250)
59
+
60
+ def dragEnterEvent(self, event):
61
+ """Accept drag enter events."""
62
+ print(f"[DEBUG] {self.name} drag enter: hasText={event.mimeData().hasText()}")
63
+ if event.mimeData().hasText() or event.mimeData().hasFormat("application/json"):
64
+ event.acceptProposedAction()
65
+ self.status_label.setText("Status: Drag enter accepted")
66
+
67
+ def dropEvent(self, event):
68
+ """Handle drop event to add objects."""
69
+ mime_data = event.mimeData()
70
+ json_data = None
71
+
72
+ print(f"[DEBUG] {self.name} drop received: hasText={event.mimeData().hasText()}")
73
+
74
+ # Try to get JSON data from different sources
75
+ if mime_data.hasFormat("application/json"):
76
+ try:
77
+ json_bytes = mime_data.data("application/json")
78
+ json_str = json_bytes.data().decode('utf-8')
79
+ print(f"[DEBUG] {self.name} JSON data: {json_str}")
80
+ json_data = json.loads(json_str)
81
+ except Exception as e:
82
+ print(f"[DEBUG] {self.name} failed to parse JSON data: {e}")
83
+ elif mime_data.hasText():
84
+ try:
85
+ json_str = mime_data.text()
86
+ print(f"[DEBUG] {self.name} text data: {json_str}")
87
+ json_data = json.loads(json_str)
88
+ except Exception as e:
89
+ print(f"[DEBUG] {self.name} failed to parse text as JSON: {e}")
90
+
91
+ if json_data:
92
+ # Handle both single object and array of objects
93
+ if isinstance(json_data, list):
94
+ # Array format: [{x, y, type, method, id, name}, ...]
95
+ print(f"[DEBUG] {self.name} received array of {len(json_data)} objects")
96
+ for obj in json_data:
97
+ self._add_object_to_list(obj)
98
+ event.acceptProposedAction()
99
+ self.status_label.setText(f"Status: Added {len(json_data)} objects from array")
100
+ print(f"[DEBUG] {self.name} array of objects added successfully")
101
+ elif isinstance(json_data, dict):
102
+ # Single object format: {x, y, type, method, id, name}
103
+ self._add_object_to_list(json_data)
104
+ event.acceptProposedAction()
105
+ self.status_label.setText(f"Status: Added single object: {json_data.get('name', 'Unknown')}")
106
+ print(f"[DEBUG] {self.name} single object added successfully: {json_data}")
107
+ else:
108
+ print(f"[DEBUG] {self.name} invalid JSON format: expected dict or list, got {type(json_data)}")
109
+ self.status_label.setText(f"Status: Invalid format: {type(json_data)}")
110
+ else:
111
+ print(f"[DEBUG] {self.name} no valid JSON data found")
112
+ self.status_label.setText("Status: No valid JSON data")
113
+
114
+ def _add_object_to_list(self, obj_data: dict):
115
+ """Add a single object to the objects list."""
116
+ # Extract required fields
117
+ obj_id = obj_data.get('id', 'unknown')
118
+ obj_type = obj_data.get('type', 'Unknown')
119
+ obj_name = obj_data.get('name', obj_id)
120
+ x = obj_data.get('x', 0)
121
+ y = obj_data.get('y', 0)
122
+ method = obj_data.get('method', '')
123
+
124
+ # Check for duplicates with same id
125
+ for existing_obj in self._objects:
126
+ existing_id = existing_obj.get('id', 'unknown')
127
+ if existing_id == obj_id:
128
+ print(f"[DEBUG] {self.name} rejected duplicate object: {obj_id}")
129
+ return # Reject duplicate
130
+
131
+ # Add the new object
132
+ new_obj = {
133
+ 'id': obj_id,
134
+ 'type': obj_type,
135
+ 'name': obj_name,
136
+ 'x': x,
137
+ 'y': y,
138
+ 'method': method
139
+ }
140
+
141
+ self._objects.append(new_obj)
142
+ print(f"[DEBUG] {self.name} added object: {new_obj}")
143
+
144
+ # Add to list widget
145
+ list_item_text = f"{obj_type}: {obj_name} ({x}, {y})"
146
+ self.objects_list.addItem(list_item_text)
147
+
148
+
149
+ class DragSourceWidget(QWidget):
150
+ """Widget that can initiate drag operations with array format."""
151
+
152
+ def __init__(self, parent=None):
153
+ super().__init__(parent)
154
+ self._init_ui()
155
+
156
+ def _init_ui(self):
157
+ """Initialize UI."""
158
+ layout = QVBoxLayout()
159
+
160
+ # Create test data
161
+ self.test_array = [
162
+ {
163
+ "x": 10,
164
+ "y": 20,
165
+ "type": "Creep",
166
+ "method": "move",
167
+ "id": "creep1",
168
+ "name": "Worker1"
169
+ },
170
+ {
171
+ "x": 15,
172
+ "y": 25,
173
+ "type": "Structure",
174
+ "method": "build",
175
+ "id": "struct1",
176
+ "name": "Spawn1"
177
+ },
178
+ {
179
+ "x": 30,
180
+ "y": 40,
181
+ "type": "Resource",
182
+ "method": "harvest",
183
+ "id": "res1",
184
+ "name": "Energy1"
185
+ }
186
+ ]
187
+
188
+ self.test_single = {
189
+ "x": 50,
190
+ "y": 60,
191
+ "type": "Tower",
192
+ "method": "attack",
193
+ "id": "tower1",
194
+ "name": "Defense1"
195
+ }
196
+
197
+ # Add buttons to trigger drag operations
198
+ btn_array = QPushButton("Drag Array [{}]")
199
+ btn_array.clicked.connect(lambda: self._start_drag(self.test_array))
200
+ layout.addWidget(btn_array)
201
+
202
+ btn_single = QPushButton("Drag Single {}")
203
+ btn_single.clicked.connect(lambda: self._start_drag(self.test_single))
204
+ layout.addWidget(btn_single)
205
+
206
+ # Add labels to show what will be dragged
207
+ label_array = QLabel(f"Array: {json.dumps(self.test_array, indent=2)}")
208
+ label_array.setWordWrap(True)
209
+ layout.addWidget(label_array)
210
+
211
+ label_single = QLabel(f"Single: {json.dumps(self.test_single, indent=2)}")
212
+ label_single.setWordWrap(True)
213
+ layout.addWidget(label_single)
214
+
215
+ self.setLayout(layout)
216
+
217
+ def _start_drag(self, data):
218
+ """Start a drag operation with the given data."""
219
+ print(f"[DEBUG] Starting drag with data: {data}")
220
+
221
+ # Create mime data
222
+ mime_data = QMimeData()
223
+ json_str = json.dumps(data)
224
+ mime_data.setText(json_str)
225
+ mime_data.setData("application/json", json_str.encode('utf-8'))
226
+
227
+ # Create drag object
228
+ drag = QDrag(self)
229
+ drag.setMimeData(mime_data)
230
+
231
+ # Start drag operation
232
+ result = drag.exec(Qt.DropAction.CopyAction)
233
+ print(f"[DEBUG] Drag result: {result}")
234
+
235
+
236
+ class TestWindow(QMainWindow):
237
+ """Main test window."""
238
+
239
+ def __init__(self):
240
+ super().__init__()
241
+ self.setWindowTitle("Array Format Drag & Drop Test")
242
+ self.setGeometry(100, 100, 800, 600)
243
+ self._init_ui()
244
+
245
+ def _init_ui(self):
246
+ """Initialize UI."""
247
+ central_widget = QWidget()
248
+ layout = QHBoxLayout()
249
+
250
+ # Left side - drag source
251
+ drag_source = DragSourceWidget()
252
+ layout.addWidget(drag_source)
253
+
254
+ # Right side - drop targets
255
+ right_layout = QVBoxLayout()
256
+
257
+ # First drop target
258
+ self.drop_target1 = SimpleDropTarget("Target1")
259
+ right_layout.addWidget(self.drop_target1)
260
+
261
+ # Second drop target
262
+ self.drop_target2 = SimpleDropTarget("Target2")
263
+ right_layout.addWidget(self.drop_target2)
264
+
265
+ # Clear buttons
266
+ clear_layout = QHBoxLayout()
267
+ btn_clear1 = QPushButton("Clear Target1")
268
+ btn_clear1.clicked.connect(self._clear_target1)
269
+ clear_layout.addWidget(btn_clear1)
270
+
271
+ btn_clear2 = QPushButton("Clear Target2")
272
+ btn_clear2.clicked.connect(self._clear_target2)
273
+ clear_layout.addWidget(btn_clear2)
274
+
275
+ right_layout.addLayout(clear_layout)
276
+
277
+ layout.addLayout(right_layout)
278
+ central_widget.setLayout(layout)
279
+ self.setCentralWidget(central_widget)
280
+
281
+ def _clear_target1(self):
282
+ """Clear first target."""
283
+ self.drop_target1.objects_list.clear()
284
+ self.drop_target1._objects = []
285
+ self.drop_target1.status_label.setText("Status: Cleared")
286
+
287
+ def _clear_target2(self):
288
+ """Clear second target."""
289
+ self.drop_target2.objects_list.clear()
290
+ self.drop_target2._objects = []
291
+ self.drop_target2.status_label.setText("Status: Cleared")
292
+
293
+
294
+ def main():
295
+ """Main function."""
296
+ app = QApplication(sys.argv)
297
+ window = TestWindow()
298
+ window.show()
299
+ sys.exit(app.exec())
300
+
301
+
302
+ if __name__ == "__main__":
303
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscreeps-arena
3
- Version: 0.5.7b0
3
+ Version: 0.5.7.2
4
4
  Summary: Python api|interface to play game: Screeps: Arena.
5
5
  Author-email: 2229066748@qq.com
6
6
  Maintainer: Eagle'sBaby
@@ -0,0 +1,40 @@
1
+ pyscreeps_arena/__init__.py,sha256=VXTTz1lCdcq5VLyp3Jx9l09Z-Bc2jqNM6GBOr4hLYFs,3337
2
+ pyscreeps_arena/build.py,sha256=DQeGLnID2FjpsWTbnqwt2cOp28olWK68U67bfbFJSOU,177
3
+ pyscreeps_arena/compiler.py,sha256=2p9x7seCy48tGJ52mNFY7gYNnNZ0yhsreFUj23ubVEQ,65255
4
+ pyscreeps_arena/localization.py,sha256=Dr0G6n8DvT6syfC0urqwjccYpEPEfcwYyJx3f9s-6a8,6031
5
+ pyscreeps_arena/project.7z,sha256=280m6ABhpuJ7YM0Cqxn9d-uI8KpU5g1ibt_pG-uYQg8,327235
6
+ pyscreeps_arena/core/__init__.py,sha256=qoP_rx1TpbDLJoTm5via4XPwEPaV1FXr1SYvoVoHGms,41
7
+ pyscreeps_arena/core/basic.py,sha256=DFvyDTsTXf2bQtnS9s254TrkshvRwajaHcvTyVvJyqw,2790
8
+ pyscreeps_arena/core/config.py,sha256=x_JhVHlVZqB3qA7UyACVnwZjg2gZU-BIs49UxZzwCoE,637
9
+ pyscreeps_arena/core/const.py,sha256=PqBEvL057WD2-TB4ZUA_TmqoXBfWgRndPLoB2h_UvwE,590
10
+ pyscreeps_arena/core/core.py,sha256=3Nty8eLKPNgwnYk_sVNBPrWuKxBXI2od8nfEezsEAZQ,5157
11
+ pyscreeps_arena/core/main.py,sha256=-FNSOEjksNlDfCbUqsjtPSUW8vT3qxEdfzXqT5Tdsik,170
12
+ pyscreeps_arena/core/utils.py,sha256=N9OOkORvrqnJakayaFp9qyS0apWhB9lBK4xyyYkhFdo,215
13
+ pyscreeps_arena/ui/P2PY.py,sha256=c_zLFkp_M83bSJRnQggt_yQL_2xSPtKWp4kh-TuqM2k,3220
14
+ pyscreeps_arena/ui/__init__.py,sha256=rxSx5ZPxMNUVokvYgOmGkxHInFUVVYh9InSbbvkgo2o,367
15
+ pyscreeps_arena/ui/creeplogic_edit.py,sha256=XlO4aoH48UyWhQQAejyLY57yukpn9BzS0w9QXMMOeeg,314
16
+ pyscreeps_arena/ui/map_render.py,sha256=dS7iL5ywEwlhGEOiif0G9up3bpPI4p20o07mbnDaSD8,30414
17
+ pyscreeps_arena/ui/mapviewer.py,sha256=AWv9loznosIJaQC5L5szRms_zDetDiHXIsY2EEpRNB8,293
18
+ pyscreeps_arena/ui/project_ui.py,sha256=cIDHJh2x__rErv6Q-WVAqEy5Quzc4OhHdPT7kBAjD9o,7669
19
+ pyscreeps_arena/ui/rs_icon.py,sha256=5v8YdTv2dds4iAp9x3MXpqB_5XIOYd0uPqaq83ZNySM,22496
20
+ pyscreeps_arena/ui/qcreeplogic/__init__.py,sha256=FVuJ6TZyDh5WnkYlHjCWjEKGPBWl27LzqIAab-4aeuI,75
21
+ pyscreeps_arena/ui/qcreeplogic/model.py,sha256=_Ba5jbHcFsKQ1el36UcCnXGUimvvWSRHgzo979SpVzs,2833
22
+ pyscreeps_arena/ui/qcreeplogic/qcreeplogic.py,sha256=9-DX_8IslJ7Dte2mTfNTN0C54QUSmuwkfhLoeGzhUMQ,29815
23
+ pyscreeps_arena/ui/qmapv/__init__.py,sha256=zjOIxK20lqdYZLWwEi5KfHumSWOzN3nDjW5Yomy9ocM,241
24
+ pyscreeps_arena/ui/qmapv/qcinfo.py,sha256=6WSMpn-u0ZmyvSwA-KZfwLNW1WetAi9y11HW0aIHGQU,21381
25
+ pyscreeps_arena/ui/qmapv/qco.py,sha256=dn33250XYoCzTGPiuUzId8FI6yhweMDSes6A2UARacU,17889
26
+ pyscreeps_arena/ui/qmapv/qmapv.py,sha256=9lfRVghcNB3eM-DGDo-rmqdJbpJW6tS-erlM-3rejnM,29285
27
+ pyscreeps_arena/ui/qmapv/test_array_drag.py,sha256=mXZekGVlUlNpYYfWv841D9tz_9qSb1v_rOaowqvAhEA,6073
28
+ pyscreeps_arena/ui/qmapv/test_drag.py,sha256=eKivDG737F9x74W-bJDwJf59FmyDwvNT6HU6XqY720w,3294
29
+ pyscreeps_arena/ui/qmapv/test_qcinfo.py,sha256=tw8YwYj6NHGXsbp3tpyM_5nvFu0IVIwIS-h5rb2eGzw,5095
30
+ pyscreeps_arena/ui/qmapv/test_qco_drag.py,sha256=HYS_rIzA-aP6bBaCAxvIb60GrXJ0Pvybp6kbPNhaN1s,154
31
+ pyscreeps_arena/ui/qmapv/test_qmapv.py,sha256=y3MRXR5o4JpRGDw8qLgVMlSZEmmu1PnGVRssFV_TvpY,8412
32
+ pyscreeps_arena/ui/qmapv/test_simple_array.py,sha256=hPnLXcFrn6I1X4JXFM3RVpBPhU_J_h8kkV7TtM-nC5Q,10679
33
+ pyscreeps_arena/ui/qrecipe/__init__.py,sha256=2Guvr9k5kGkZboiVC0aNF4u48LRbmcCm2dqOhEF52Tw,59
34
+ pyscreeps_arena/ui/qrecipe/model.py,sha256=s3lr_DXtsBgt8bVg1_wLz-dX88QKi77mNkqM5VJsGwE,13200
35
+ pyscreeps_arena/ui/qrecipe/qrecipe.py,sha256=z57VLmlpMripdpGtVCkKR0csJQhw5-WpocZK5l2xTVg,39398
36
+ pyscreeps_arena-0.5.7.2.dist-info/METADATA,sha256=ePomWPeApwHERFO6Xik-IeMTIZeEcvp8WiUh-rIrnLw,2356
37
+ pyscreeps_arena-0.5.7.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
+ pyscreeps_arena-0.5.7.2.dist-info/entry_points.txt,sha256=pnpuPPadwQsxQPaR1rXzUo0fUvhOcC7HTHlf7TYXr7M,141
39
+ pyscreeps_arena-0.5.7.2.dist-info/top_level.txt,sha256=l4uLyMR2NOy41ngBMh795jOHTFk3tgYKy64-9cgjVng,16
40
+ pyscreeps_arena-0.5.7.2.dist-info/RECORD,,
@@ -1,28 +0,0 @@
1
- pyscreeps_arena/__init__.py,sha256=_b1DIObofuuV-7dVvojVuQ8NoKY3ynS_wHOjxZN3c6g,1572
2
- pyscreeps_arena/build.py,sha256=DQeGLnID2FjpsWTbnqwt2cOp28olWK68U67bfbFJSOU,177
3
- pyscreeps_arena/compiler.py,sha256=2p9x7seCy48tGJ52mNFY7gYNnNZ0yhsreFUj23ubVEQ,65255
4
- pyscreeps_arena/localization.py,sha256=Dr0G6n8DvT6syfC0urqwjccYpEPEfcwYyJx3f9s-6a8,6031
5
- pyscreeps_arena/project.7z,sha256=QGrtY_uHq6Pc5jp2EdY_dmJlrxivxqKxmQRTPMN2Br4,317599
6
- pyscreeps_arena/core/__init__.py,sha256=qoP_rx1TpbDLJoTm5via4XPwEPaV1FXr1SYvoVoHGms,41
7
- pyscreeps_arena/core/basic.py,sha256=DFvyDTsTXf2bQtnS9s254TrkshvRwajaHcvTyVvJyqw,2790
8
- pyscreeps_arena/core/config.py,sha256=x_JhVHlVZqB3qA7UyACVnwZjg2gZU-BIs49UxZzwCoE,637
9
- pyscreeps_arena/core/const.py,sha256=MYm4m7Rnwdb2T1VPnCuwd4euqqRAoNok4IKDf3zfGPE,589
10
- pyscreeps_arena/core/core.py,sha256=3Nty8eLKPNgwnYk_sVNBPrWuKxBXI2od8nfEezsEAZQ,5157
11
- pyscreeps_arena/core/main.py,sha256=-FNSOEjksNlDfCbUqsjtPSUW8vT3qxEdfzXqT5Tdsik,170
12
- pyscreeps_arena/core/utils.py,sha256=N9OOkORvrqnJakayaFp9qyS0apWhB9lBK4xyyYkhFdo,215
13
- pyscreeps_arena/ui/P2PY.py,sha256=c_zLFkp_M83bSJRnQggt_yQL_2xSPtKWp4kh-TuqM2k,3220
14
- pyscreeps_arena/ui/__init__.py,sha256=9iW-DFRkBWm-2VtOrFqYyp1nuyt4apX0DJxFxjyKCOM,283
15
- pyscreeps_arena/ui/creeplogic_edit.py,sha256=XlO4aoH48UyWhQQAejyLY57yukpn9BzS0w9QXMMOeeg,314
16
- pyscreeps_arena/ui/project_ui.py,sha256=cIDHJh2x__rErv6Q-WVAqEy5Quzc4OhHdPT7kBAjD9o,7669
17
- pyscreeps_arena/ui/rs_icon.py,sha256=5v8YdTv2dds4iAp9x3MXpqB_5XIOYd0uPqaq83ZNySM,22496
18
- pyscreeps_arena/ui/qcreeplogic/__init__.py,sha256=FVuJ6TZyDh5WnkYlHjCWjEKGPBWl27LzqIAab-4aeuI,75
19
- pyscreeps_arena/ui/qcreeplogic/model.py,sha256=_Ba5jbHcFsKQ1el36UcCnXGUimvvWSRHgzo979SpVzs,2833
20
- pyscreeps_arena/ui/qcreeplogic/qcreeplogic.py,sha256=ANYy_XLMQPk9BUDrXh6ZwlreJeClATLS68ztadgbtQ8,27844
21
- pyscreeps_arena/ui/qrecipe/__init__.py,sha256=2Guvr9k5kGkZboiVC0aNF4u48LRbmcCm2dqOhEF52Tw,59
22
- pyscreeps_arena/ui/qrecipe/model.py,sha256=s3lr_DXtsBgt8bVg1_wLz-dX88QKi77mNkqM5VJsGwE,13200
23
- pyscreeps_arena/ui/qrecipe/qrecipe.py,sha256=z57VLmlpMripdpGtVCkKR0csJQhw5-WpocZK5l2xTVg,39398
24
- pyscreeps_arena-0.5.7b0.dist-info/METADATA,sha256=ogNyHNZWg7b9DMJctC33YdvZeRMct-NtcOUzkAVFMrQ,2356
25
- pyscreeps_arena-0.5.7b0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
- pyscreeps_arena-0.5.7b0.dist-info/entry_points.txt,sha256=pnpuPPadwQsxQPaR1rXzUo0fUvhOcC7HTHlf7TYXr7M,141
27
- pyscreeps_arena-0.5.7b0.dist-info/top_level.txt,sha256=l4uLyMR2NOy41ngBMh795jOHTFk3tgYKy64-9cgjVng,16
28
- pyscreeps_arena-0.5.7b0.dist-info/RECORD,,