chartflow 0.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.
Files changed (79) hide show
  1. chartflow/__init__.py +28 -0
  2. chartflow/_verify_importexport.py +169 -0
  3. chartflow/edit/__init__.py +119 -0
  4. chartflow/edit/code_editor.py +1007 -0
  5. chartflow/edit/code_folder.py +523 -0
  6. chartflow/edit/completer.py +2652 -0
  7. chartflow/edit/context_analyzer.py +521 -0
  8. chartflow/edit/demo.py +469 -0
  9. chartflow/edit/line_number_area.py +548 -0
  10. chartflow/edit/minimap.py +581 -0
  11. chartflow/edit/python_editor.py +509 -0
  12. chartflow/edit/syntax_highlighter.py +291 -0
  13. chartflow/edit/test_editor.py +190 -0
  14. chartflow/flow/__init__.py +31 -0
  15. chartflow/flow/_demo.py +98 -0
  16. chartflow/flow/chart.py +1101 -0
  17. chartflow/flow/editor.py +375 -0
  18. chartflow/flow/flow.py +6 -0
  19. chartflow/flow/qchart.py +1250 -0
  20. chartflow/flow/test/__init__.py +0 -0
  21. chartflow/flow/test/test_chart.py +537 -0
  22. chartflow/flow/test_decorator_sync.py +102 -0
  23. chartflow/fsm/__init__.py +84 -0
  24. chartflow/fsm/decorators.py +395 -0
  25. chartflow/fsm/demo.py +381 -0
  26. chartflow/fsm/demo_pyqt6.py +881 -0
  27. chartflow/fsm/demo_tree.py +46 -0
  28. chartflow/fsm/logic.py +447 -0
  29. chartflow/fsm/meta.py +569 -0
  30. chartflow/fsm/scheduler.py +427 -0
  31. chartflow/fsm/stage.py +2079 -0
  32. chartflow/fsm/stdio.py +66 -0
  33. chartflow/fsm/test/__init__.py +7 -0
  34. chartflow/fsm/test/test_decorators.py +210 -0
  35. chartflow/fsm/test/test_events.py +202 -0
  36. chartflow/fsm/test/test_integration.py +596 -0
  37. chartflow/fsm/test/test_logic.py +371 -0
  38. chartflow/fsm/test/test_meta.py +192 -0
  39. chartflow/fsm/test/test_runtime_param.py +336 -0
  40. chartflow/fsm/test/test_scheduler.py +280 -0
  41. chartflow/fsm/test/test_stage.py +314 -0
  42. chartflow/fsm/test_behavior_events.py +263 -0
  43. chartflow/fsm/test_nested_parallel.py +80 -0
  44. chartflow/fsm/test_stage_spec.py +448 -0
  45. chartflow/fsm/utils.py +34 -0
  46. chartflow/node/__init__.py +66 -0
  47. chartflow/node/_node_base.py +727 -0
  48. chartflow/node/_node_interaction.py +488 -0
  49. chartflow/node/_node_interface.py +426 -0
  50. chartflow/node/_node_markers.py +648 -0
  51. chartflow/node/_node_ports.py +536 -0
  52. chartflow/node/_port_interface.py +111 -0
  53. chartflow/node/arrow_item.py +287 -0
  54. chartflow/node/color_utils.py +113 -0
  55. chartflow/node/connection_item.py +939 -0
  56. chartflow/node/demo.py +258 -0
  57. chartflow/node/demo_arrow_drag.py +46 -0
  58. chartflow/node/demo_decorator.py +63 -0
  59. chartflow/node/demo_ports.py +69 -0
  60. chartflow/node/enums.py +35 -0
  61. chartflow/node/example.py +84 -0
  62. chartflow/node/layout_utils.py +307 -0
  63. chartflow/node/main_window.py +196 -0
  64. chartflow/node/menu_bar.py +240 -0
  65. chartflow/node/node_canvas.py +1730 -0
  66. chartflow/node/node_item.py +754 -0
  67. chartflow/node/popmenu.py +472 -0
  68. chartflow/node/port_item.py +591 -0
  69. chartflow/node/qnode_editor.py +73 -0
  70. chartflow/node/selection_rect.py +53 -0
  71. chartflow/node/style_panel.py +615 -0
  72. chartflow/node/styles.py +63 -0
  73. chartflow/node/test_qnode.py +2336 -0
  74. chartflow/showcase.py +528 -0
  75. chartflow/theme.py +508 -0
  76. chartflow-0.1.dist-info/METADATA +23 -0
  77. chartflow-0.1.dist-info/RECORD +79 -0
  78. chartflow-0.1.dist-info/WHEEL +5 -0
  79. chartflow-0.1.dist-info/top_level.txt +1 -0
chartflow/theme.py ADDED
@@ -0,0 +1,508 @@
1
+ """
2
+ chartflow.theme — centralized Qt Style Sheet (QSS) theme for the chartflow GUI.
3
+
4
+ A single source of truth for the look & feel of every chartflow Qt widget.
5
+ Qt style sheets are CSS-like, so the rules below read just like CSS.
6
+
7
+ Design language (mirrors the ``uipcweb`` showcase CSS):
8
+ * **Light** surfaces — app background ``#F4F6F9``, white panels/cards.
9
+ * One accent: **DodgerBlue ``#1E90FF``** (``--dodger``), deepened to
10
+ ``#1574D1`` on hover. Selected/active states use a soft translucent
11
+ dodger fill (``rgba(30,144,255,.08)``).
12
+ * Quiet, hairline borders (``#E6E8EC`` / ``#D6D9DF``) and generously
13
+ rounded corners.
14
+ * **Dark inset panels** (``#0F1620``) for code & raw-log surfaces, echoing
15
+ uipcweb's ``.snippet`` / ``.eventlog`` — exposed as the ``code_*`` tokens.
16
+
17
+ Usage::
18
+
19
+ from chartflow.theme import applyTheme, PALETTE
20
+ applyTheme(app) # style the whole application
21
+ canvas_color = PALETTE.canvas # read colors for custom painting
22
+
23
+ This module imports cleanly without a running QApplication; only
24
+ :func:`applyTheme` needs one.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ from PyQt6.QtGui import QColor, QPalette
30
+ from PyQt6.QtWidgets import QApplication
31
+
32
+ __all__ = ["PALETTE", "QSS", "applyTheme", "canvasBackground"]
33
+
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Palette — central place to tweak colors. Tokens mirror uipcweb's :root.
37
+ # ---------------------------------------------------------------------------
38
+ class _Palette:
39
+ """Color tokens shared by the QSS and by custom-painted widgets."""
40
+
41
+ # base surfaces (uipcweb: --bg / --surface / --surface-2)
42
+ window: str = "#F4F6F9" # app background
43
+ panel: str = "#FFFFFF" # side panels, toolbars, headers, cards
44
+ surface: str = "#FBFBFD" # hover / elevated
45
+ input: str = "#FFFFFF" # line edits, text areas
46
+ canvas: str = "#F4F6F9" # node-canvas scene background
47
+
48
+ # lines (uipcweb: --line / --line-strong)
49
+ border: str = "#E6E8EC"
50
+ border_soft: str = "#EEF0F4"
51
+ border_strong: str = "#D6D9DF"
52
+
53
+ # text (uipcweb: --ink / --muted / --faint)
54
+ text: str = "#1F232A"
55
+ text_dim: str = "#6B7280" # secondary / labels
56
+ text_faint: str = "#98A0AC" # eyebrows, meta
57
+ text_disabled: str = "#BFC4CC"
58
+
59
+ # accent — DodgerBlue (uipcweb: --dodger / --dodger-dk)
60
+ accent: str = "#1E90FF"
61
+ accent_hover: str = "#1574D1"
62
+ accent_pressed: str = "#1259B0"
63
+ accent_soft: str = "rgba(30, 144, 255, 0.08)" # translucent hover/active fill
64
+ accent_soft_strong: str = "rgba(30, 144, 255, 0.16)"
65
+
66
+ # semantic
67
+ success: str = "#1E7C5A" # uipcweb --green
68
+ warning: str = "#EE7942" # uipcweb --orange
69
+ error: str = "#E5484D"
70
+
71
+ # dark inset surfaces (uipcweb .snippet/.eventlog: #0F1620)
72
+ code_bg: str = "#0F1620"
73
+ code_text: str = "#D6E2EF"
74
+ code_dim: str = "#5E6E82"
75
+
76
+ # misc
77
+ scrollbar: str = "#D6D9DF"
78
+ scrollbar_hover: str = "#BFC4CC"
79
+
80
+ @property
81
+ def canvas_color(self) -> QColor:
82
+ return QColor(self.canvas)
83
+
84
+
85
+ PALETTE = _Palette()
86
+
87
+
88
+ # ---------------------------------------------------------------------------
89
+ # Qt Style Sheet — CSS-like rules. f-string interpolates the palette so the
90
+ # whole sheet restyles when a token changes.
91
+ # ---------------------------------------------------------------------------
92
+ QSS = f"""
93
+ /* ===== base ============================================================ */
94
+ QWidget {{
95
+ background: {PALETTE.window};
96
+ color: {PALETTE.text};
97
+ font-size: 13px;
98
+ font-family: "IBM Plex Sans", "PingFang SC", "Microsoft YaHei UI",
99
+ "Noto Sans SC", system-ui, sans-serif;
100
+ }}
101
+
102
+ QMainWindow,
103
+ QDialog {{
104
+ background: {PALETTE.window};
105
+ }}
106
+
107
+ QWidget:disabled {{
108
+ color: {PALETTE.text_disabled};
109
+ }}
110
+
111
+ QLabel {{
112
+ background: transparent;
113
+ color: {PALETTE.text};
114
+ }}
115
+ QLabel:disabled {{ color: {PALETTE.text_disabled}; }}
116
+
117
+ /* ===== tooltips ======================================================== */
118
+ QToolTip {{
119
+ background: {PALETTE.panel};
120
+ color: {PALETTE.text};
121
+ border: 1px solid {PALETTE.border};
122
+ border-radius: 6px;
123
+ padding: 5px 8px;
124
+ }}
125
+
126
+ /* ===== panels / frames / group boxes =================================== */
127
+ QFrame#controlPanel {{
128
+ background: {PALETTE.panel};
129
+ border: 1px solid {PALETTE.border};
130
+ border-radius: 10px;
131
+ }}
132
+
133
+ QGroupBox {{
134
+ background: {PALETTE.panel};
135
+ border: 1px solid {PALETTE.border};
136
+ border-radius: 10px;
137
+ margin-top: 10px;
138
+ padding: 10px 8px 8px 8px;
139
+ font-weight: 600;
140
+ color: {PALETTE.text};
141
+ }}
142
+ QGroupBox::title {{
143
+ subcontrol-origin: margin;
144
+ subcontrol-position: top left;
145
+ left: 10px;
146
+ padding: 0 6px;
147
+ color: {PALETTE.accent_hover};
148
+ }}
149
+
150
+ /* ===== scrollbars — slim, rounded, quiet =============================== */
151
+ QScrollBar:vertical {{
152
+ background: transparent;
153
+ width: 10px;
154
+ margin: 2px;
155
+ }}
156
+ QScrollBar:horizontal {{
157
+ background: transparent;
158
+ height: 10px;
159
+ margin: 2px;
160
+ }}
161
+ QScrollBar::handle:vertical,
162
+ QScrollBar::handle:horizontal {{
163
+ background: {PALETTE.scrollbar};
164
+ border-radius: 4px;
165
+ min-height: 24px;
166
+ min-width: 24px;
167
+ }}
168
+ QScrollBar::handle:vertical:hover,
169
+ QScrollBar::handle:horizontal:hover {{
170
+ background: {PALETTE.scrollbar_hover};
171
+ }}
172
+ QScrollBar::add-line, QScrollBar::sub-line,
173
+ QScrollBar::add-page, QScrollBar::sub-page {{
174
+ background: none;
175
+ border: none;
176
+ height: 0; width: 0;
177
+ }}
178
+
179
+ /* ===== menus =========================================================== */
180
+ QMenuBar {{
181
+ background: {PALETTE.panel};
182
+ color: {PALETTE.text};
183
+ border-bottom: 1px solid {PALETTE.border};
184
+ padding: 2px;
185
+ spacing: 2px;
186
+ }}
187
+ QMenuBar::item {{
188
+ background: transparent;
189
+ padding: 5px 12px;
190
+ border-radius: 6px;
191
+ }}
192
+ QMenuBar::item:selected {{ background: {PALETTE.accent_soft}; }}
193
+
194
+ QMenu {{
195
+ background: {PALETTE.panel};
196
+ border: 1px solid {PALETTE.border};
197
+ border-radius: 8px;
198
+ padding: 4px;
199
+ }}
200
+ QMenu::item {{
201
+ padding: 6px 26px 6px 18px;
202
+ border-radius: 6px;
203
+ }}
204
+ QMenu::item:selected {{ background: {PALETTE.accent_soft}; color: {PALETTE.accent_hover}; }}
205
+ QMenu::item:disabled {{ color: {PALETTE.text_disabled}; }}
206
+ QMenu::separator {{
207
+ height: 1px;
208
+ background: {PALETTE.border};
209
+ margin: 4px 8px;
210
+ }}
211
+
212
+ /* ===== toolbars & status bar =========================================== */
213
+ QToolBar {{
214
+ background: {PALETTE.panel};
215
+ border: none;
216
+ border-bottom: 1px solid {PALETTE.border};
217
+ spacing: 4px;
218
+ padding: 3px;
219
+ }}
220
+ QToolBar::separator {{
221
+ background: {PALETTE.border};
222
+ width: 1px; height: 1px;
223
+ margin: 4px 6px;
224
+ }}
225
+
226
+ QStatusBar {{
227
+ background: {PALETTE.panel};
228
+ color: {PALETTE.text_dim};
229
+ border-top: 1px solid {PALETTE.border};
230
+ }}
231
+ QStatusBar::item {{ border: none; }}
232
+
233
+ /* ===== buttons ========================================================= */
234
+ QPushButton {{
235
+ background: {PALETTE.panel};
236
+ color: {PALETTE.text};
237
+ border: 1px solid {PALETTE.border};
238
+ border-radius: 6px;
239
+ padding: 6px 14px;
240
+ }}
241
+ QPushButton:hover {{
242
+ background: {PALETTE.accent_soft};
243
+ border-color: {PALETTE.accent};
244
+ color: {PALETTE.accent_hover};
245
+ }}
246
+ QPushButton:pressed {{
247
+ background: {PALETTE.accent_soft_strong};
248
+ border-color: {PALETTE.accent_hover};
249
+ }}
250
+ QPushButton:disabled {{
251
+ color: {PALETTE.text_disabled};
252
+ background: {PALETTE.surface};
253
+ border-color: {PALETTE.border_soft};
254
+ }}
255
+ QPushButton:focus {{ outline: none; }}
256
+
257
+ /* "primary" buttons opt-in via object name or dynamic property */
258
+ QPushButton#primary,
259
+ QPushButton[primary="true"] {{
260
+ background: {PALETTE.accent};
261
+ color: #ffffff;
262
+ border: 1px solid {PALETTE.accent};
263
+ font-weight: 600;
264
+ }}
265
+ QPushButton#primary:hover,
266
+ QPushButton[primary="true"]:hover {{
267
+ background: {PALETTE.accent_hover};
268
+ border-color: {PALETTE.accent_hover};
269
+ }}
270
+ QPushButton#primary:pressed,
271
+ QPushButton[primary="true"]:pressed {{
272
+ background: {PALETTE.accent_pressed};
273
+ border-color: {PALETTE.accent_pressed};
274
+ }}
275
+
276
+ /* ===== input widgets =================================================== */
277
+ QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QDoubleSpinBox, QComboBox {{
278
+ background: {PALETTE.input};
279
+ color: {PALETTE.text};
280
+ border: 1px solid {PALETTE.border};
281
+ border-radius: 6px;
282
+ padding: 5px 8px;
283
+ selection-background-color: {PALETTE.accent};
284
+ selection-color: #ffffff;
285
+ }}
286
+ QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus,
287
+ QSpinBox:focus, QDoubleSpinBox:focus, QComboBox:focus {{
288
+ border: 1px solid {PALETTE.accent};
289
+ }}
290
+ QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled {{
291
+ color: {PALETTE.text_disabled};
292
+ }}
293
+ QLineEdit::placeholder, QTextEdit::placeholder {{ color: {PALETTE.text_faint}; }}
294
+
295
+ /* QSpinBox / QDoubleSpinBox spin buttons */
296
+ QSpinBox::up-button, QDoubleSpinBox::up-button,
297
+ QSpinBox::down-button, QDoubleSpinBox::down-button {{
298
+ background: {PALETTE.surface};
299
+ border: none;
300
+ width: 16px;
301
+ }}
302
+ QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover,
303
+ QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover {{
304
+ background: {PALETTE.accent_soft};
305
+ }}
306
+
307
+ /* ===== combo box ======================================================= */
308
+ QComboBox::drop-down {{
309
+ border: none;
310
+ width: 22px;
311
+ }}
312
+ QComboBox::down-arrow {{
313
+ image: none;
314
+ border-left: 4px solid transparent;
315
+ border-right: 4px solid transparent;
316
+ border-top: 5px solid {PALETTE.text_dim};
317
+ margin-right: 6px;
318
+ }}
319
+ QComboBox QAbstractItemView {{
320
+ background: {PALETTE.panel};
321
+ border: 1px solid {PALETTE.border};
322
+ border-radius: 6px;
323
+ padding: 3px;
324
+ outline: none;
325
+ selection-background-color: {PALETTE.accent_soft};
326
+ selection-color: {PALETTE.accent_hover};
327
+ }}
328
+
329
+ /* ===== checkboxes / radios ============================================= */
330
+ QCheckBox, QRadioButton {{ background: transparent; spacing: 7px; }}
331
+ QCheckBox::indicator, QRadioButton::indicator {{
332
+ width: 15px; height: 15px;
333
+ border: 1px solid {PALETTE.border_strong};
334
+ background: {PALETTE.input};
335
+ }}
336
+ QCheckBox::indicator {{ border-radius: 4px; }}
337
+ QRadioButton::indicator {{ border-radius: 8px; }}
338
+ QCheckBox::indicator:hover, QRadioButton::indicator:hover {{
339
+ border-color: {PALETTE.accent};
340
+ }}
341
+ QCheckBox::indicator:checked {{
342
+ background: {PALETTE.accent};
343
+ border-color: {PALETTE.accent};
344
+ }}
345
+ QRadioButton::indicator:checked {{
346
+ background: {PALETTE.accent};
347
+ border: 3px solid {PALETTE.input};
348
+ border-radius: 8px;
349
+ }}
350
+
351
+ /* ===== sliders / progress ============================================== */
352
+ QSlider::groove:horizontal {{
353
+ height: 4px;
354
+ background: {PALETTE.border};
355
+ border-radius: 2px;
356
+ }}
357
+ QSlider::sub-page:horizontal {{
358
+ background: {PALETTE.accent};
359
+ border-radius: 2px;
360
+ }}
361
+ QSlider::handle:horizontal {{
362
+ background: {PALETTE.panel};
363
+ border: 2px solid {PALETTE.accent};
364
+ border-radius: 9px;
365
+ width: 14px; height: 14px;
366
+ margin: -7px 0;
367
+ }}
368
+ QSlider::handle:horizontal:hover {{ background: {PALETTE.accent_soft_strong}; }}
369
+
370
+ QProgressBar {{
371
+ background: {PALETTE.surface};
372
+ border: 1px solid {PALETTE.border};
373
+ border-radius: 6px;
374
+ text-align: center;
375
+ color: {PALETTE.text};
376
+ height: 18px;
377
+ }}
378
+ QProgressBar::chunk {{
379
+ background: {PALETTE.accent};
380
+ border-radius: 5px;
381
+ }}
382
+
383
+ /* ===== tabs ============================================================ */
384
+ QTabWidget::pane {{
385
+ background: {PALETTE.window};
386
+ border: 1px solid {PALETTE.border};
387
+ border-radius: 8px;
388
+ top: -1px;
389
+ }}
390
+ QTabBar::tab {{
391
+ background: {PALETTE.surface};
392
+ color: {PALETTE.text_dim};
393
+ padding: 7px 16px;
394
+ border: 1px solid {PALETTE.border};
395
+ border-bottom: none;
396
+ border-top-left-radius: 6px;
397
+ border-top-right-radius: 6px;
398
+ margin-right: 2px;
399
+ }}
400
+ QTabBar::tab:selected {{
401
+ background: {PALETTE.panel};
402
+ color: {PALETTE.accent_hover};
403
+ border-bottom: 2px solid {PALETTE.accent};
404
+ }}
405
+ QTabBar::tab:hover:!selected {{ color: {PALETTE.text}; }}
406
+
407
+ /* ===== headers / item views ============================================ */
408
+ QHeaderView::section {{
409
+ background: {PALETTE.panel};
410
+ color: {PALETTE.text_dim};
411
+ padding: 5px 8px;
412
+ border: none;
413
+ border-right: 1px solid {PALETTE.border};
414
+ border-bottom: 1px solid {PALETTE.border};
415
+ }}
416
+ QTreeView, QListView, QTableView {{
417
+ background: {PALETTE.panel};
418
+ border: 1px solid {PALETTE.border};
419
+ border-radius: 8px;
420
+ alternate-background-color: {PALETTE.surface};
421
+ selection-background-color: {PALETTE.accent_soft};
422
+ selection-color: {PALETTE.accent_hover};
423
+ outline: none;
424
+ }}
425
+ QTreeView::item:selected, QListView::item:selected, QTableView::item:selected {{
426
+ background: {PALETTE.accent_soft};
427
+ }}
428
+
429
+ /* ===== list-widget nav (sidebar) ======================================= */
430
+ QListWidget {{
431
+ background: {PALETTE.panel};
432
+ border: 1px solid {PALETTE.border};
433
+ border-radius: 10px;
434
+ padding: 6px;
435
+ outline: none;
436
+ }}
437
+ QListWidget::item {{
438
+ color: {PALETTE.text};
439
+ border: 1px solid transparent;
440
+ border-radius: 8px;
441
+ padding: 8px 12px;
442
+ }}
443
+ QListWidget::item:hover {{
444
+ background: {PALETTE.surface};
445
+ border-color: {PALETTE.border};
446
+ }}
447
+ QListWidget::item:selected {{
448
+ background: {PALETTE.accent_soft};
449
+ border-color: {PALETTE.accent_soft_strong};
450
+ color: {PALETTE.accent_hover};
451
+ }}
452
+
453
+ /* ===== message box ===================================================== */
454
+ QMessageBox {{
455
+ background: {PALETTE.window};
456
+ }}
457
+ QMessageBox QLabel {{ color: {PALETTE.text}; }}
458
+
459
+ /* ===== docks =========================================================== */
460
+ QDockWidget {{
461
+ titlebar-close-icon: none;
462
+ titlebar-normal-icon: none;
463
+ }}
464
+ QDockWidget::title {{
465
+ background: {PALETTE.panel};
466
+ padding: 4px 8px;
467
+ border-bottom: 1px solid {PALETTE.border};
468
+ }}
469
+ """
470
+
471
+
472
+ # ---------------------------------------------------------------------------
473
+ # Public helpers
474
+ # ---------------------------------------------------------------------------
475
+ def applyTheme(app: QApplication) -> None:
476
+ """Apply the chartflow light theme to ``app`` and its QPalette.
477
+
478
+ Safe to call once at startup. The QSS handles most styling; the QPalette
479
+ is set as a fallback so widgets that ignore QSS (native file dialogs,
480
+ some accessible helpers) still read on a light base.
481
+ """
482
+ app.setStyleSheet(QSS)
483
+
484
+ pal = QPalette()
485
+ pal.setColor(QPalette.ColorRole.Window, QColor(PALETTE.window))
486
+ pal.setColor(QPalette.ColorRole.Base, QColor(PALETTE.input))
487
+ pal.setColor(QPalette.ColorRole.AlternateBase, QColor(PALETTE.surface))
488
+ pal.setColor(QPalette.ColorRole.Text, QColor(PALETTE.text))
489
+ pal.setColor(QPalette.ColorRole.WindowText, QColor(PALETTE.text))
490
+ pal.setColor(QPalette.ColorRole.Button, QColor(PALETTE.panel))
491
+ pal.setColor(QPalette.ColorRole.ButtonText, QColor(PALETTE.text))
492
+ pal.setColor(QPalette.ColorRole.Highlight, QColor(PALETTE.accent))
493
+ pal.setColor(QPalette.ColorRole.HighlightedText, QColor("#FFFFFF"))
494
+ pal.setColor(QPalette.ColorRole.ToolTipBase, QColor(PALETTE.panel))
495
+ pal.setColor(QPalette.ColorRole.ToolTipText, QColor(PALETTE.text))
496
+ pal.setColor(QPalette.ColorRole.PlaceholderText, QColor(PALETTE.text_faint))
497
+
498
+ disabled_text = QColor(PALETTE.text_disabled)
499
+ pal.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText, disabled_text)
500
+ pal.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Text, disabled_text)
501
+ pal.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.ButtonText, disabled_text)
502
+
503
+ app.setPalette(pal)
504
+
505
+
506
+ def canvasBackground() -> QColor:
507
+ """The canvas scene background color that harmonizes with the theme."""
508
+ return QColor(PALETTE.canvas)
@@ -0,0 +1,23 @@
1
+ Metadata-Version: 2.4
2
+ Name: chartflow
3
+ Version: 0.1
4
+ Summary: Self-use. with fsm. node. chart. edit. Used for fsm and run, structure graph. use pyqt to show and interact
5
+ Author-email: 2229066748@qq.com
6
+ Maintainer: Eagle'sBaby
7
+ Maintainer-email: 2229066748@qq.com
8
+ License: Apache Licence 2.0
9
+ Classifier: Programming Language :: Python
10
+ Classifier: Programming Language :: Python :: 3
11
+ Requires-Python: >=3.10
12
+ Requires-Dist: PyQt6
13
+ Requires-Dist: efr
14
+ Requires-Dist: colorama
15
+ Requires-Dist: Pillow
16
+ Dynamic: author-email
17
+ Dynamic: classifier
18
+ Dynamic: license
19
+ Dynamic: maintainer
20
+ Dynamic: maintainer-email
21
+ Dynamic: requires-dist
22
+ Dynamic: requires-python
23
+ Dynamic: summary
@@ -0,0 +1,79 @@
1
+ chartflow/__init__.py,sha256=Bwz7zqb48u63H6FFI9W1cqTa-WaK5UTRapYTFYSDXuE,1003
2
+ chartflow/_verify_importexport.py,sha256=re7o2hrSYI1USGhM_6Bf5g4wrSkhtllRWFLKQI0C9t0,5882
3
+ chartflow/showcase.py,sha256=9bAIFNxr_YtfBCXqZZ75cTPbbkgIe-zz9bGtRMF8WgA,19742
4
+ chartflow/theme.py,sha256=KVinr8ZkXewQRhblrQzf368A2RMte5YDp-NmJASXn2w,15743
5
+ chartflow/edit/__init__.py,sha256=Q6XK6QxFWLISfhVe2cgP6nsgiHv1QkJeNuaLIprVynU,2550
6
+ chartflow/edit/code_editor.py,sha256=6mNX-bXBJG3Zf77Q40-3R-7Qg5fu3C-se4W269QnevM,35744
7
+ chartflow/edit/code_folder.py,sha256=ovXPoYimGjT0Nh_B27dwIgNdmQY18c7V7E7jaEadBa0,19621
8
+ chartflow/edit/completer.py,sha256=li2CzdLowf-koWlheQD8R7j61NKRnAoYU9yr0kwFomE,118075
9
+ chartflow/edit/context_analyzer.py,sha256=80ER_ooQOo5KDUn5vLs6hypYWbT6yxsra67vTPkAvRs,18831
10
+ chartflow/edit/demo.py,sha256=zHLyxfzb99e22_Lk8NkrFCqUvE-52zCYZ5hjBgCg6ZA,15320
11
+ chartflow/edit/line_number_area.py,sha256=XPcd2ZpOEjnMWIax24F88tRRiPgTAY2BcsBIU6ybGB4,20013
12
+ chartflow/edit/minimap.py,sha256=meUIBtxEZFeXVDz0_M6bmsI_aiuvpnYMnyVWtQmiNVI,20787
13
+ chartflow/edit/python_editor.py,sha256=d5rssB3-EMX7FUwHywvsrjmUyquQ4dzaLhQMKes_g_k,17249
14
+ chartflow/edit/syntax_highlighter.py,sha256=niKtBLd5YlzHnDhUBrB2McgQ0V9gXpnY9Zf73VTDoS8,11288
15
+ chartflow/edit/test_editor.py,sha256=u_Ea5YdybkEoBeMEEtYXanZ-hKuuckERMzDG9x5Mgik,5291
16
+ chartflow/flow/__init__.py,sha256=XG-JnUOGAcmKCgqyh6QlouSnRa9yS-FI3HJhz-sQuis,692
17
+ chartflow/flow/_demo.py,sha256=KdJ5azItI1CCENUD86YN30f1_Wq4dIgLK_7c3o31ixs,2891
18
+ chartflow/flow/chart.py,sha256=Q0N4leqH43zmt_Va0riDX6GOs6k_lK2h0AjITyEKonk,37015
19
+ chartflow/flow/editor.py,sha256=1WdSzvAy53ahIG0Ce7uyrkhwWXT_swep9vjeK-xF-G0,11203
20
+ chartflow/flow/flow.py,sha256=Ztujzohj54FOOFKk5Hu9NqNBjQtuZV9krUoiSb6sSNk,138
21
+ chartflow/flow/qchart.py,sha256=LIC1KW9jNOZcvFMEaawYd4KZifqg7wUa-uaM9y7aYZM,44810
22
+ chartflow/flow/test_decorator_sync.py,sha256=0PHrSAYa7oLfMwnRpgqrnKuRbvatsPjP5mETVhPMr70,3052
23
+ chartflow/flow/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ chartflow/flow/test/test_chart.py,sha256=n1m6ojeTc7deZ-Gp8BAOQOCXLRe2-0oqCxEOPDjC3fM,18461
25
+ chartflow/fsm/__init__.py,sha256=FsVKzBvsTTq_PLXdABwoSwo2mk9quv5EvMb5i5N6mRM,1859
26
+ chartflow/fsm/decorators.py,sha256=KiyXf-r9v5QrGcuEvkpQ1uR981FziWUMJarlt_k4Rjk,13453
27
+ chartflow/fsm/demo.py,sha256=ZKmtp0THq3mZBBZFCcbDkV2raJvsc_FswFtg8N2966A,11957
28
+ chartflow/fsm/demo_pyqt6.py,sha256=tAPFViZn-gnL8_hLOInHR8G7_kB8qzBytRJvK42DJjo,28934
29
+ chartflow/fsm/demo_tree.py,sha256=Zu2aPgJJcJ0q1pDycjhqMIl1zdkOPF7mEwe-rL9vEVo,994
30
+ chartflow/fsm/logic.py,sha256=EPGMkgPgkn7ZFYaruxVrfjwwNKgBAh6tRyzlVCuaij8,14890
31
+ chartflow/fsm/meta.py,sha256=vX44WSFuK3NckYh5XzqL85z1k_s8CKxgp2e83MbQvIo,18905
32
+ chartflow/fsm/scheduler.py,sha256=XJpnpdRml5P7_P14EEG4ElM9B6s4quYEZyP6yYXi85o,15020
33
+ chartflow/fsm/stage.py,sha256=ueBymbef7yWRJfaFMi-WoDAlG4wuSe23XaD-fj3-rNg,90918
34
+ chartflow/fsm/stdio.py,sha256=NK9crwak8rUf7i91UP_s_bGF7kVERtgnnzWOy5ybLfY,1565
35
+ chartflow/fsm/test_behavior_events.py,sha256=gewPDb5mNHj7zoUirAF5pL6DOYRlnla233c2Yp30UCw,7341
36
+ chartflow/fsm/test_nested_parallel.py,sha256=27VUCnhS-x0cpKWJfj163-KnPi5UStSHWPramgWzYBc,1917
37
+ chartflow/fsm/test_stage_spec.py,sha256=eKgih_4asBTAu3UHXDDfFjjOeIViaDiguSmyYCAb5gQ,12659
38
+ chartflow/fsm/utils.py,sha256=AqVJfgSMSVjS99U98o33TDXly3tuRoGXUM4Blry8COk,988
39
+ chartflow/fsm/test/__init__.py,sha256=xyBPPNbsbUzStjbr109sNQi1mnZJNlHI3ph9k7bR7d0,88
40
+ chartflow/fsm/test/test_decorators.py,sha256=y4IcUKJeUoklLKE_n2d-j4BG2UHq-qOiOHSR4_0kzoU,6080
41
+ chartflow/fsm/test/test_events.py,sha256=tS7NPNEnLsGKZAV9ukEVocfbxdP6XxzPwMepV_RS7YQ,5647
42
+ chartflow/fsm/test/test_integration.py,sha256=vB8bY5rPMYJt3Fp5t2ol_4jMq0mmeiNZt_Jf6YKK95M,17878
43
+ chartflow/fsm/test/test_logic.py,sha256=2C83q9z65A_mbGpklm4wdj88quEYauxzRXke6OObqhA,9402
44
+ chartflow/fsm/test/test_meta.py,sha256=aAEeap9IOib0NImWw7IzJfxBjbYx87_d8Qn2d3EYykk,5968
45
+ chartflow/fsm/test/test_runtime_param.py,sha256=bw1nswFrIwPiWZvogDPSEWmwpvlX9H6fGGdoZZCzzEc,10383
46
+ chartflow/fsm/test/test_scheduler.py,sha256=2_AQ9x6xmqUnArFJP7l-BSHd2S4h6Qg-DAavEtGCyxY,7723
47
+ chartflow/fsm/test/test_stage.py,sha256=m5ryQTczoXy0opTQVLovrxltwgPy03TjH2juy53b2Fo,8503
48
+ chartflow/node/__init__.py,sha256=16pTKZ7VqwQnLbzlk-DS8qTvSK1yJDnjkdUvZfcnrxc,1963
49
+ chartflow/node/_node_base.py,sha256=2rbIQ173Ygam6nh1nM8X-7iRzzx8b6F8d33xvLdc9DE,28226
50
+ chartflow/node/_node_interaction.py,sha256=66fbqzYue1TJBanox3OiT2CoVNxKf-k3qTGJJFjR0-0,21147
51
+ chartflow/node/_node_interface.py,sha256=I6nUT2wrfbfHXAGFB8owxlXAZk9M_M645DbC1qLJD8A,14956
52
+ chartflow/node/_node_markers.py,sha256=C3TtvdKqfqJof2rUGRt2BIypZK5fMrnsMyuLSlkLMl8,21467
53
+ chartflow/node/_node_ports.py,sha256=ZAfq3RRajIyknShQ_d28CZ1tdZyE8KDK9rdUqOtHioA,24566
54
+ chartflow/node/_port_interface.py,sha256=arzoBpYu-MTvhT1L8xFqnFr9BdJhwSuUQNNvN0T3hvw,4059
55
+ chartflow/node/arrow_item.py,sha256=nycs4nZMIV-Jk0FNeI8AVlCc5wzeU_J6EtoB52ZDatc,10484
56
+ chartflow/node/color_utils.py,sha256=Z5F0P5Ha_QTkjOYPevPe82Zm5mBECKnnr0v1o5eEzwU,4331
57
+ chartflow/node/connection_item.py,sha256=ixM1HkMwIlMjicmnxE24qO7Vsos7jS13h4WMUTIKTgQ,42045
58
+ chartflow/node/demo.py,sha256=sGqmOSlsnhHryiUb8v_IRQirAUteB7aNxbhNRQrQ2gQ,8801
59
+ chartflow/node/demo_arrow_drag.py,sha256=TtbY8DPSuR9zBOEWOf1StQBlBSvnle82WS2Ht3HnuJI,1557
60
+ chartflow/node/demo_decorator.py,sha256=E_MhS1hhggkSK_uoKirwiH6sqcbh7FzvUCpJFXFUPR4,2412
61
+ chartflow/node/demo_ports.py,sha256=MSctoROV80FVpxf7H6RcXL7zMFhZ0w1HAbmS8VBWj4k,2235
62
+ chartflow/node/enums.py,sha256=VMrRjQulTVdiie_8kieo65AmkR2bWAJ_x4nFs-rKfJ8,659
63
+ chartflow/node/example.py,sha256=tIXAKrzeFECVECf6YZ5beTLdYr82ZDWUpIaJ7xUTyLc,2248
64
+ chartflow/node/layout_utils.py,sha256=MJ-yI8B6b1YvVPey3zrTzUsdoQjRj6JV3QQ2umHnw6w,10435
65
+ chartflow/node/main_window.py,sha256=7ZwpWNdORhRKoBLR3EJzgdaaZn6YGWT-JYXKBtYHqlo,7321
66
+ chartflow/node/menu_bar.py,sha256=DvSAAq10edPEVNe8oHG2h1xuYZBqpLxXWTBX_9mg7m0,8607
67
+ chartflow/node/node_canvas.py,sha256=65z2D9u2AJ3wY6N5HzGvZ3bijmXjR1PEz3akl6CIJzk,78045
68
+ chartflow/node/node_item.py,sha256=MENRRxheC7VGJNb_e8PHmJjRgOVvb-yZLwq8q2qQBNY,32896
69
+ chartflow/node/popmenu.py,sha256=0FgeE0xf_7euYzu1YP8dK0JeYQzYWL3SFNhD9T888Kc,15161
70
+ chartflow/node/port_item.py,sha256=wFlxX05aPhhBZSG_bhpcgInpBLtpq2WmHQKUyD3dyoA,24326
71
+ chartflow/node/qnode_editor.py,sha256=RT7rCW2li8I5ki8YmhCqnCHyEDNdVqOFY5aUr7oxrn0,1963
72
+ chartflow/node/selection_rect.py,sha256=N10isgG2PJFM9N-gYsXRwKKE7mBIn20a6OD8tXhq-FU,1568
73
+ chartflow/node/style_panel.py,sha256=Xf6PHi5tV-nSlTmEyLhbWSNMrWA6cWA3COa1JEo37vU,21973
74
+ chartflow/node/styles.py,sha256=yr0Sbdd5v_sg1KVXVUL60A9uA6BihDvpAt7LkTMIPaI,2243
75
+ chartflow/node/test_qnode.py,sha256=7Gq5JwDiA9CGdUY6Lp3hvCL-ijrKWWTE808N80ZVwiI,100711
76
+ chartflow-0.1.dist-info/METADATA,sha256=0plygZcM-NrC507VYNwBzJBqgRlUAqY28iY2sFElEdU,682
77
+ chartflow-0.1.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
78
+ chartflow-0.1.dist-info/top_level.txt,sha256=VJvX38Xf8xuIaMqJ0FyJ-08QdnryTVObyMzCj4GOoSY,10
79
+ chartflow-0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ chartflow