qcanvas 1.2.2__py3-none-any.whl → 2.0.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.

Potentially problematic release.


This version of qcanvas might be problematic. Click here for more details.

Files changed (130) hide show
  1. qcanvas/__init__.py +54 -0
  2. qcanvas/app.py +93 -0
  3. qcanvas/backend_connectors/frontend_resource_manager.py +13 -5
  4. qcanvas/backend_connectors/qcanvas_task_master.py +2 -2
  5. qcanvas/icons/__init__.py +5 -5
  6. qcanvas/icons/_icon_type.py +1 -1
  7. qcanvas/icons/icons.qrc +47 -43
  8. qcanvas/icons/rc_icons.py +1298 -1197
  9. qcanvas/settings/__init__.py +6 -0
  10. qcanvas/{util/settings → settings}/_client_settings.py +4 -4
  11. qcanvas/settings/_course_settings.py +54 -0
  12. qcanvas/{util/settings → settings}/_mapped_setting.py +2 -5
  13. qcanvas/{util/settings → settings}/_ui_settings.py +4 -4
  14. qcanvas/theme.py +101 -0
  15. qcanvas/ui/course_viewer/content_tree.py +9 -12
  16. qcanvas/ui/course_viewer/course_tree/_course_icon_generator.py +3 -3
  17. qcanvas/ui/course_viewer/course_tree/course_tree.py +9 -8
  18. qcanvas/ui/course_viewer/course_viewer.py +35 -43
  19. qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tab.py +107 -29
  20. qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tree.py +4 -4
  21. qcanvas/ui/course_viewer/tabs/constants.py +1 -0
  22. qcanvas/ui/course_viewer/tabs/content_tab.py +33 -39
  23. qcanvas/ui/course_viewer/tabs/file_tab/file_tab.py +4 -4
  24. qcanvas/ui/course_viewer/tabs/file_tab/file_tree.py +7 -10
  25. qcanvas/ui/course_viewer/tabs/file_tab/pages_file_tree.py +6 -7
  26. qcanvas/ui/course_viewer/tabs/mail_tab/mail_tab.py +50 -27
  27. qcanvas/ui/course_viewer/tabs/mail_tab/mail_tree.py +7 -8
  28. qcanvas/ui/course_viewer/tabs/page_tab/page_tab.py +3 -3
  29. qcanvas/ui/course_viewer/tabs/page_tab/page_tree.py +5 -5
  30. qcanvas/ui/course_viewer/tabs/resource_rich_browser.py +15 -21
  31. qcanvas/ui/course_viewer/tree_widget_data_item.py +1 -1
  32. qcanvas/ui/memory_tree/_tree_memory.py +45 -42
  33. qcanvas/ui/memory_tree/memory_tree_widget.py +22 -18
  34. qcanvas/ui/memory_tree/memory_tree_widget_item.py +3 -3
  35. qcanvas/ui/qcanvas_window/__init__.py +1 -0
  36. qcanvas/ui/{main_ui → qcanvas_window}/course_viewer_container.py +10 -10
  37. qcanvas/ui/{main_ui → qcanvas_window}/options/auto_download_resources_option.py +5 -5
  38. qcanvas/ui/{main_ui → qcanvas_window}/options/quick_sync_option.py +7 -6
  39. qcanvas/ui/{main_ui → qcanvas_window}/options/sync_on_start_option.py +7 -6
  40. qcanvas/ui/{main_ui → qcanvas_window}/options/theme_selection_menu.py +10 -10
  41. qcanvas/ui/{main_ui → qcanvas_window}/qcanvas_window.py +38 -33
  42. qcanvas/ui/{main_ui → qcanvas_window}/status_bar_progress_display.py +5 -6
  43. qcanvas/ui/qml_components/AttachmentsList.ui.qml +15 -0
  44. qcanvas/ui/qml_components/AttachmentsListDelegate.qml +77 -0
  45. qcanvas/ui/qml_components/AttachmentsListModel.qml +19 -0
  46. qcanvas/ui/qml_components/AttachmentsPane.qml +12 -0
  47. qcanvas/ui/qml_components/CommentsList.ui.qml +15 -0
  48. qcanvas/ui/qml_components/CommentsListDelegate.ui.qml +118 -0
  49. qcanvas/ui/qml_components/CommentsListModel.qml +56 -0
  50. qcanvas/ui/qml_components/CommentsPane.qml +12 -0
  51. qcanvas/ui/qml_components/DarkTheme.qml +12 -0
  52. qcanvas/ui/qml_components/DecoratedText.ui.qml +44 -0
  53. qcanvas/ui/qml_components/LightTheme.qml +11 -0
  54. qcanvas/ui/qml_components/Spacer.ui.qml +7 -0
  55. qcanvas/ui/qml_components/ThemedRectangle.qml +37 -0
  56. qcanvas/ui/qml_components/__init__.py +3 -0
  57. qcanvas/ui/qml_components/attachments_pane.py +72 -0
  58. qcanvas/ui/qml_components/comments_pane.py +85 -0
  59. qcanvas/ui/qml_components/qml_bridge_types.py +95 -0
  60. qcanvas/ui/qml_components/qml_pane.py +22 -0
  61. qcanvas/ui/setup/setup_checker.py +1 -1
  62. qcanvas/ui/setup/setup_dialog.py +27 -10
  63. qcanvas/util/auto_downloader.py +9 -7
  64. qcanvas/util/basic_fonts.py +2 -2
  65. qcanvas/util/context_dict.py +12 -0
  66. qcanvas/util/file_icons.py +11 -19
  67. qcanvas/util/layouts.py +5 -7
  68. qcanvas/util/paths.py +17 -6
  69. qcanvas/util/qurl_util.py +1 -1
  70. qcanvas/util/ui_tools.py +118 -8
  71. qcanvas/util/url_checker.py +1 -1
  72. {qcanvas-1.2.2.dist-info → qcanvas-2.0.0.dist-info}/METADATA +12 -10
  73. qcanvas-2.0.0.dist-info/RECORD +91 -0
  74. {qcanvas-1.2.2.dist-info → qcanvas-2.0.0.dist-info}/WHEEL +1 -1
  75. qcanvas-2.0.0.dist-info/entry_points.txt +3 -0
  76. qcanvas/app_start/__init__.py +0 -59
  77. qcanvas/icons/_update_icons.py +0 -89
  78. qcanvas/icons/dark/actions/exit.svg +0 -3
  79. qcanvas/icons/dark/actions/mark_all_read.svg +0 -3
  80. qcanvas/icons/dark/actions/open_downloads.svg +0 -3
  81. qcanvas/icons/dark/actions/quick_login.svg +0 -3
  82. qcanvas/icons/dark/actions/sync.svg +0 -3
  83. qcanvas/icons/dark/branding/logo_transparent.svg +0 -303
  84. qcanvas/icons/dark/options/auto_download.svg +0 -3
  85. qcanvas/icons/dark/options/theme.svg +0 -3
  86. qcanvas/icons/dark/tabs/assignments.svg +0 -3
  87. qcanvas/icons/dark/tabs/mail.svg +0 -3
  88. qcanvas/icons/dark/tabs/pages.svg +0 -3
  89. qcanvas/icons/dark/tree_items/assignment.svg +0 -3
  90. qcanvas/icons/dark/tree_items/mail.svg +0 -3
  91. qcanvas/icons/dark/tree_items/module.svg +0 -3
  92. qcanvas/icons/dark/tree_items/page.svg +0 -3
  93. qcanvas/icons/light/actions/exit.svg +0 -3
  94. qcanvas/icons/light/actions/mark_all_read.svg +0 -3
  95. qcanvas/icons/light/actions/open_downloads.svg +0 -3
  96. qcanvas/icons/light/actions/quick_login.svg +0 -3
  97. qcanvas/icons/light/actions/sync.svg +0 -3
  98. qcanvas/icons/light/branding/logo_transparent.svg +0 -304
  99. qcanvas/icons/light/options/auto_download.svg +0 -3
  100. qcanvas/icons/light/options/ignore_old.svg +0 -3
  101. qcanvas/icons/light/options/include_videos.svg +0 -3
  102. qcanvas/icons/light/options/theme.svg +0 -3
  103. qcanvas/icons/light/tabs/assignments.svg +0 -3
  104. qcanvas/icons/light/tabs/mail.svg +0 -3
  105. qcanvas/icons/light/tabs/pages.svg +0 -3
  106. qcanvas/icons/light/tree_items/assignment.svg +0 -3
  107. qcanvas/icons/light/tree_items/mail.svg +0 -3
  108. qcanvas/icons/light/tree_items/module.svg +0 -3
  109. qcanvas/icons/light/tree_items/page.svg +0 -3
  110. qcanvas/icons/universal/branding/main_icon.svg +0 -325
  111. qcanvas/icons/universal/downloads/download_failed.svg +0 -23
  112. qcanvas/icons/universal/downloads/downloaded.svg +0 -23
  113. qcanvas/icons/universal/downloads/not_downloaded.svg +0 -23
  114. qcanvas/icons/universal/downloads/unknown.svg +0 -6
  115. qcanvas/icons/universal/tabs/assignments_new_content.svg +0 -3
  116. qcanvas/icons/universal/tabs/mail_new_content.svg +0 -3
  117. qcanvas/icons/universal/tabs/pages_new_content.svg +0 -3
  118. qcanvas/icons/universal/tree_items/semester.svg +0 -108
  119. qcanvas/run.py +0 -54
  120. qcanvas/ui/course_viewer/tabs/util.py +0 -11
  121. qcanvas/ui/main_ui/__init__.py +0 -0
  122. qcanvas/util/settings/__init__.py +0 -9
  123. qcanvas/util/themes/__init__.py +0 -2
  124. qcanvas/util/themes/_colour_scheme_helper.py +0 -38
  125. qcanvas/util/themes/_selected_theme.py +0 -10
  126. qcanvas/util/themes/_theme_changed_event.py +0 -17
  127. qcanvas/util/themes/_theme_changer.py +0 -86
  128. qcanvas-1.2.2.dist-info/RECORD +0 -118
  129. qcanvas-1.2.2.dist-info/entry_points.txt +0 -3
  130. /qcanvas/ui/{main_ui → qcanvas_window}/options/__init__.py +0 -0
@@ -1,325 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
-
4
- <svg
5
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
6
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
7
- xmlns:xlink="http://www.w3.org/1999/xlink"
8
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
9
- xmlns:cc="http://creativecommons.org/ns#"
10
- xmlns:dc="http://purl.org/dc/elements/1.1/"
11
- inkscape:export-ydpi="90.000000"
12
- inkscape:export-xdpi="90.000000"
13
- width="256"
14
- height="256"
15
- id="svg11300"
16
- sodipodi:version="0.32"
17
- inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)"
18
- sodipodi:docname="icon.svg"
19
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
20
- version="1.0"
21
- style="display:inline;enable-background:new"
22
- inkscape:export-filename="/home/sam/moka-next-template.png"
23
- xml:space="preserve"
24
- xmlns="http://www.w3.org/2000/svg"><sodipodi:namedview
25
- stroke="#ef2929"
26
- fill="#f57900"
27
- id="base"
28
- pagecolor="#777777"
29
- bordercolor="#666666"
30
- borderopacity="0.25490196"
31
- inkscape:pageopacity="0"
32
- inkscape:pageshadow="2"
33
- inkscape:zoom="2"
34
- inkscape:cx="246.75"
35
- inkscape:cy="112.75"
36
- inkscape:current-layer="layer7"
37
- showgrid="false"
38
- inkscape:grid-bbox="true"
39
- inkscape:document-units="px"
40
- inkscape:showpageshadow="false"
41
- inkscape:window-width="1920"
42
- inkscape:window-height="1018"
43
- inkscape:window-x="1920"
44
- inkscape:window-y="0"
45
- width="400px"
46
- height="300px"
47
- inkscape:snap-nodes="true"
48
- inkscape:snap-bbox="true"
49
- gridtolerance="10000"
50
- inkscape:object-nodes="true"
51
- inkscape:snap-grids="true"
52
- showguides="true"
53
- inkscape:guide-bbox="true"
54
- inkscape:window-maximized="1"
55
- inkscape:bbox-nodes="true"
56
- inkscape:bbox-paths="true"
57
- inkscape:snap-bbox-edge-midpoints="true"
58
- inkscape:snap-bbox-midpoints="true"
59
- inkscape:pagecheckerboard="0"
60
- inkscape:deskcolor="#d1d1d1"><inkscape:grid
61
- spacingy="1px"
62
- spacingx="1px"
63
- id="grid5883"
64
- type="xygrid"
65
- enabled="true"
66
- visible="false"
67
- empspacing="4"
68
- snapvisiblegridlinesonly="true"
69
- dotted="false"
70
- color="#000000"
71
- opacity="0.12549"
72
- empcolor="#203ef3"
73
- empopacity="0.36470588"
74
- originx="-16"
75
- originy="-28"
76
- units="px" /><inkscape:grid
77
- type="xygrid"
78
- id="grid11592"
79
- empspacing="8"
80
- visible="false"
81
- enabled="false"
82
- spacingx="0.5px"
83
- spacingy="0.5px"
84
- color="#ff0000"
85
- opacity="0.12549"
86
- empcolor="#ff0000"
87
- empopacity="0.25098039"
88
- snapvisiblegridlinesonly="true"
89
- dotted="true"
90
- originx="-16"
91
- originy="-28"
92
- units="px"/></sodipodi:namedview>
93
- <defs
94
- id="defs3"><linearGradient
95
- inkscape:collect="always"
96
- xlink:href="#outerBackgroundGradient-2"
97
- id="linearGradient4254"
98
- x1="35"
99
- y1="156"
100
- x2="253"
101
- y2="156"
102
- gradientUnits="userSpaceOnUse"
103
- gradientTransform="rotate(-90,144,156)" />
104
- <linearGradient
105
- id="outerBackgroundGradient-2"><stop
106
- style="stop-color:#e70a0a;stop-opacity:1;"
107
- offset="0"
108
- id="stop3864-8-6-00" />
109
- <stop
110
- style="stop-color:#fe0000;stop-opacity:1;"
111
- offset="1"
112
- id="stop3866-9-1-1"/></linearGradient>
113
- <style
114
- id="style1">.cls-1{fill:#fff;}</style></defs>
115
- <metadata
116
- id="metadata4"><rdf:RDF><cc:Work
117
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
118
- rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:creator><cc:Agent><dc:title>Sam Hewitt</dc:title></cc:Agent></dc:creator><dc:source/><cc:license
119
- rdf:resource=""/><dc:title/><dc:subject><rdf:Bag /></dc:subject><dc:date/><dc:rights><cc:Agent><dc:title /></cc:Agent></dc:rights><dc:publisher><cc:Agent><dc:title /></cc:Agent></dc:publisher><dc:identifier/><dc:relation/><dc:language/><dc:coverage/><dc:description/><dc:contributor><cc:Agent><dc:title /></cc:Agent></dc:contributor></cc:Work><cc:Work
120
- rdf:about=""><dc:format>image/svg+xml</dc:format>
121
- <dc:type
122
- rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata>
123
- <g
124
- style="display:inline"
125
- inkscape:groupmode="layer"
126
- inkscape:label="Icon"
127
- id="layer1"
128
- transform="translate(-16,-28)"><g
129
- style="display:none"
130
- inkscape:label="Baseplate"
131
- id="layer7"
132
- inkscape:groupmode="layer"><text
133
- y="19.745117"
134
- xml:space="preserve"
135
- x="15.006836"
136
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none;enable-background:new"
137
- inkscape:label="context"
138
- id="context"><tspan
139
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
140
- y="19.745117"
141
- x="15.006836"
142
- sodipodi:role="line"
143
- id="tspan3933">apps</tspan></text><text
144
- y="19.745117"
145
- xml:space="preserve"
146
- x="122.48828"
147
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;enable-background:new"
148
- inkscape:label="icon-name"
149
- id="icon-name"><tspan
150
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold'"
151
- y="19.745117"
152
- x="122.48828"
153
- sodipodi:role="line"
154
- id="tspan3937">amd</tspan></text><rect
155
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
156
- id="rect16x16"
157
- width="16"
158
- height="16"
159
- x="416"
160
- y="140"
161
- inkscape:label="16x16"/><rect
162
- style="display:inline;overflow:visible;visibility:visible;fill:#d4d4d4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
163
- id="rect24x24"
164
- width="24"
165
- height="24"
166
- x="416"
167
- y="100"
168
- inkscape:label="24x24"/><rect
169
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
170
- id="rect32x32"
171
- width="32"
172
- height="32"
173
- x="416"
174
- y="52"
175
- inkscape:label="32x32"/><rect
176
- inkscape:label="22x22"
177
- y="101"
178
- x="417"
179
- height="22"
180
- width="22"
181
- id="rect22x22"
182
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"/><rect
183
- inkscape:label="48x48"
184
- y="220"
185
- x="288"
186
- height="48"
187
- width="48"
188
- id="rect48x48"
189
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"/><rect
190
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
191
- id="rect256x256"
192
- width="256"
193
- height="256"
194
- x="16"
195
- y="28"
196
- inkscape:label="256x256"/><rect
197
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
198
- id="rect64x64"
199
- width="64"
200
- height="64"
201
- x="288"
202
- y="140"
203
- inkscape:label="64x64"/><rect
204
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
205
- id="rect96x96"
206
- width="96"
207
- height="96"
208
- x="288"
209
- y="28"
210
- inkscape:label="96x96"/><rect
211
- style="display:inline;overflow:visible;visibility:visible;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
212
- id="rect256x256-7"
213
- width="256"
214
- height="256"
215
- x="16"
216
- y="28"
217
- inkscape:label="256x256"/></g>
218
- <g
219
- inkscape:groupmode="layer"
220
- id="layer4"
221
- inkscape:label="Shadow"
222
- style="display:inline"
223
- sodipodi:insensitive="true"><rect
224
- ry="50"
225
- y="47"
226
- x="34"
227
- height="220"
228
- width="220"
229
- id="rect4114"
230
- style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate" /></g>
231
- <g
232
- inkscape:groupmode="layer"
233
- id="layer2"
234
- inkscape:label="Background"
235
- style="display:inline"><path
236
- style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient4254);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
237
- d="M 84,46.5 C 56.568735,46.5 34.5,68.568732 34.5,96 v 120 c 0,27.43127 22.068735,49.5 49.5,49.5 h 120 c 27.43127,0 49.5,-22.06873 49.5,-49.5 V 96 C 253.5,68.568732 231.43127,46.5 204,46.5 Z"
238
- id="path4200" /></g>
239
- <g
240
- inkscape:groupmode="layer"
241
- id="layer6"
242
- inkscape:label="Symbols"
243
- style="display:inline"><g
244
- id="Layer_1-2"
245
- data-name="Layer 1"
246
- transform="matrix(1.322302,0,0,1.322302,59.921425,71.894979)"><path
247
- class="cls-1"
248
- d="M 18.45,63.47 A 18.4,18.4 0 0 0 2.31,45.23 73.13,73.13 0 0 0 2.31,81.7 18.38,18.38 0 0 0 18.45,63.47"
249
- id="path1" /><path
250
- class="cls-1"
251
- d="M 29.13,57.7 A 5.77,5.77 0 1 0 34.9,63.47 5.77,5.77 0 0 0 29.13,57.7"
252
- id="path2"/><path
253
- class="cls-1"
254
- d="m 108.72,63.47 a 18.38,18.38 0 0 0 16.14,18.23 73.13,73.13 0 0 0 0,-36.47 18.4,18.4 0 0 0 -16.14,18.24"
255
- id="path3"/><path
256
- class="cls-1"
257
- d="m 98,57.7 a 5.77,5.77 0 1 0 5.76,5.77 A 5.77,5.77 0 0 0 98,57.7"
258
- id="path4"/><path
259
- class="cls-1"
260
- d="m 63.46,108.77 a 18.39,18.39 0 0 0 -18.23,16.13 73.13,73.13 0 0 0 36.47,0 18.38,18.38 0 0 0 -18.24,-16.13"
261
- id="path5"/><path
262
- class="cls-1"
263
- d="m 63.47,92.31 a 5.77,5.77 0 1 0 5.76,5.77 5.77,5.77 0 0 0 -5.76,-5.77"
264
- id="path6"/><path
265
- class="cls-1"
266
- d="M 63.47,18.44 A 18.37,18.37 0 0 0 81.7,2.31 a 73.13,73.13 0 0 0 -36.47,0 18.39,18.39 0 0 0 18.24,16.13"
267
- id="path7"/><path
268
- class="cls-1"
269
- d="m 63.47,23.37 a 5.77,5.77 0 1 0 5.76,5.76 5.76,5.76 0 0 0 -5.76,-5.76"
270
- id="path8"/><path
271
- class="cls-1"
272
- d="m 95.44,95.44 a 18.4,18.4 0 0 0 -1.5,24.29 73,73 0 0 0 25.78,-25.79 18.39,18.39 0 0 0 -24.28,1.5"
273
- id="path9"/><path
274
- class="cls-1"
275
- d="m 83.8,83.8 a 5.77,5.77 0 1 0 8.16,0 5.78,5.78 0 0 0 -8.16,0"
276
- id="path10"/><path
277
- class="cls-1"
278
- d="M 31.59,31.59 A 18.36,18.36 0 0 0 33.09,7.31 72.93,72.93 0 0 0 7.31,33.09 18.36,18.36 0 0 0 31.59,31.59"
279
- id="path11"/><path
280
- class="cls-1"
281
- d="m 35.07,35.08 a 5.77,5.77 0 1 0 8.16,0 5.78,5.78 0 0 0 -8.16,0"
282
- id="path12"/><path
283
- class="cls-1"
284
- d="M 95.4,31.53 A 18.39,18.39 0 0 0 119.69,33 72.88,72.88 0 0 0 93.9,7.25 18.39,18.39 0 0 0 95.4,31.53"
285
- id="path13"/><path
286
- class="cls-1"
287
- d="m 91.92,43.17 a 5.76,5.76 0 1 0 -8.15,0 5.76,5.76 0 0 0 8.15,0"
288
- id="path14"/><path
289
- class="cls-1"
290
- d="M 31.56,95.37 A 18.39,18.39 0 0 0 7.28,93.87 73,73 0 0 0 33.06,119.66 18.38,18.38 0 0 0 31.56,95.37"
291
- id="path15"/><path
292
- class="cls-1"
293
- d="m 35,83.73 a 5.77,5.77 0 1 0 8.16,0 5.79,5.79 0 0 0 -8.16,0"
294
- id="path16"/></g></g>
295
- <g
296
- inkscape:groupmode="layer"
297
- id="layer5"
298
- inkscape:label="Highlights"
299
- style="display:inline"
300
- sodipodi:insensitive="true"><path
301
- style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.13;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
302
- d="M 84,47 C 56.836703,47 35,68.836703 35,96 v 1 C 35,69.836703 56.836703,48 84,48 h 120 c 27.1633,0 49,21.836703 49,49 V 96 C 253,68.836703 231.1633,47 204,47 Z"
303
- id="rect3894"
304
- inkscape:connector-curvature="0" />
305
- <path
306
- id="path4085"
307
- d="m 204,266 c 27.1633,0 49,-21.8367 49,-49 v -1 c 0,27.1633 -21.8367,49 -49,49 H 84 C 56.8367,265 35,243.1633 35,216 v 1 c 0,27.1633 21.8367,49 49,49 z"
308
- style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.41;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
309
- inkscape:connector-curvature="0"/>
310
- <path
311
- inkscape:connector-curvature="0"
312
- id="path4280"
313
- d="M 84,265 C 56.836703,265 35,243.1633 35,216 v -1 c 0,27.1633 21.836703,49 49,49 h 120 c 27.1633,0 49,-21.8367 49,-49 v 1 c 0,27.1633 -21.8367,49 -49,49 z"
314
- style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
315
- inkscape:label="path4280"/></g>
316
- <g
317
- inkscape:groupmode="layer"
318
- id="layer3"
319
- inkscape:label="Border"
320
- style="display:inline"
321
- sodipodi:insensitive="true"><path
322
- style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.41;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
323
- d="M 84,46 C 56.3,46 34,68.3 34,96 v 120 c 0,27.7 22.3,50 50,50 h 120 c 27.7,0 50,-22.3 50,-50 V 96 C 254,68.3 231.7,46 204,46 Z m 0,1 h 120 c 27.1633,0 49,21.836703 49,49 v 120 c 0,27.1633 -21.8367,49 -49,49 H 84 C 56.836703,265 35,243.1633 35,216 V 96 C 35,68.836703 56.836703,47 84,47 Z"
324
- id="rect4040"
325
- inkscape:connector-curvature="0" /></g></g></svg>
@@ -1,23 +0,0 @@
1
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
3
- <svg width="800px"
4
- height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
5
- version="1.1" fill="#000000">
6
-
7
- <g id="SVGRepo_bgCarrier" stroke-width="0"/>
8
-
9
- <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
10
-
11
- <g id="SVGRepo_iconCarrier">
12
- <g transform="translate(0 -1028.4)">
13
- <path d="m5 1030.4c-1.1046 0-2 0.9-2 2v8 4 6c0 1.1 0.8954 2 2 2h14c1.105 0 2-0.9 2-2v-6-4-4l-6-6h-10z"
14
- fill="#a31f1f"/>
15
- <path d="m5 1029.4c-1.1046 0-2 0.9-2 2v8 4 6c0 1.1 0.8954 2 2 2h14c1.105 0 2-0.9 2-2v-6-4-4l-6-6h-10z"
16
- fill="#db4343"/>
17
- <path d="m21 1035.4-6-6v4c0 1.1 0.895 2 2 2h4z" fill="#a31f1f"/>
18
- <path d="m6 8v1h12v-1h-12zm0 3v1h12v-1h-12zm0 3v1h12v-1h-12zm0 3v1h12v-1h-12z"
19
- transform="translate(0 1028.4)" fill="#a31f1f"/>
20
- </g>
21
- </g>
22
-
23
- </svg>
@@ -1,23 +0,0 @@
1
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
3
- <svg width="800px"
4
- height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
5
- version="1.1" fill="#000000">
6
-
7
- <g id="SVGRepo_bgCarrier" stroke-width="0"/>
8
-
9
- <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
10
-
11
- <g id="SVGRepo_iconCarrier">
12
- <g transform="translate(0 -1028.4)">
13
- <path d="m5 1030.4c-1.1046 0-2 0.9-2 2v8 4 6c0 1.1 0.8954 2 2 2h14c1.105 0 2-0.9 2-2v-6-4-4l-6-6h-10z"
14
- fill="#35a413"/>
15
- <path d="m5 1029.4c-1.1046 0-2 0.9-2 2v8 4 6c0 1.1 0.8954 2 2 2h14c1.105 0 2-0.9 2-2v-6-4-4l-6-6h-10z"
16
- fill="#6eea48"/>
17
- <path d="m21 1035.4-6-6v4c0 1.1 0.895 2 2 2h4z" fill="#35a413"/>
18
- <path d="m6 8v1h12v-1h-12zm0 3v1h12v-1h-12zm0 3v1h12v-1h-12zm0 3v1h12v-1h-12z"
19
- transform="translate(0 1028.4)" fill="#35a413"/>
20
- </g>
21
- </g>
22
-
23
- </svg>
@@ -1,23 +0,0 @@
1
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
2
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
3
- <svg width="800px"
4
- height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"
5
- version="1.1" fill="#000000">
6
-
7
- <g id="SVGRepo_bgCarrier" stroke-width="0"/>
8
-
9
- <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
10
-
11
- <g id="SVGRepo_iconCarrier">
12
- <g transform="translate(0 -1028.4)">
13
- <path d="m5 1030.4c-1.1046 0-2 0.9-2 2v8 4 6c0 1.1 0.8954 2 2 2h14c1.105 0 2-0.9 2-2v-6-4-4l-6-6h-10z"
14
- fill="#74898b"/>
15
- <path d="m5 1029.4c-1.1046 0-2 0.9-2 2v8 4 6c0 1.1 0.8954 2 2 2h14c1.105 0 2-0.9 2-2v-6-4-4l-6-6h-10z"
16
- fill="#bdc3c7"/>
17
- <path d="m21 1035.4-6-6v4c0 1.1 0.895 2 2 2h4z" fill="#74898b"/>
18
- <path d="m6 8v1h12v-1h-12zm0 3v1h12v-1h-12zm0 3v1h12v-1h-12zm0 3v1h12v-1h-12z"
19
- transform="translate(0 1028.4)" fill="#74898b"/>
20
- </g>
21
- </g>
22
-
23
- </svg>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
- <svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
- <title>question</title>
5
- <path d="M19.943 5.251c-1.145-0.635-2.511-1.008-3.964-1.008-1.461 0-2.834 0.378-4.026 1.040l0.042-0.022c-1.649 0.916-2.746 2.648-2.746 4.635 0 0.037 0 0.074 0.001 0.111l-0-0.006c0.001 0.413 0.336 0.747 0.75 0.747 0 0 0 0 0 0h-0c0.407-0.021 0.731-0.346 0.75-0.751l0-0.002c-0.001-0.026-0.001-0.058-0.001-0.089 0-1.441 0.8-2.694 1.98-3.341l0.020-0.010c0.934-0.511 2.047-0.812 3.23-0.812 1.178 0 2.287 0.298 3.255 0.824l-0.036-0.018c1.23 0.657 2.053 1.933 2.053 3.401 0 0.017-0 0.033-0 0.050l0-0.003c0.033 0.19 0.051 0.408 0.051 0.631 0 1.699-1.084 3.145-2.598 3.684l-0.027 0.008c-2.303 1.102-3.424 3.285-3.426 6.677 0 0 0 0 0 0.001 0 0.414 0.335 0.749 0.749 0.749h0.001c0.414-0 0.75-0.336 0.75-0.75v0c0.002-2.793 0.819-4.485 2.586-5.329 2.037-0.783 3.457-2.725 3.457-4.997 0-0.238-0.016-0.473-0.046-0.703l0.003 0.027c0-0.017 0-0.037 0-0.057 0-2.018-1.123-3.774-2.779-4.676l-0.028-0.014zM15.46 25.459c-0.123 0.145-0.198 0.334-0.2 0.541v0c-0.001 0.016-0.002 0.034-0.002 0.052 0 0.082 0.015 0.16 0.044 0.231l-0.002-0.004c0.039 0.094 0.093 0.173 0.16 0.24l0 0c0.071 0.076 0.158 0.137 0.255 0.178l0.005 0.002c0.084 0.026 0.18 0.041 0.28 0.041s0.196-0.015 0.287-0.043l-0.007 0.002c0.102-0.043 0.189-0.104 0.26-0.179l0-0c0.067-0.067 0.12-0.147 0.157-0.235l0.002-0.005c0.038-0.079 0.061-0.173 0.061-0.271 0-0.003-0-0.006-0-0.009v0c-0.010-0.209-0.092-0.397-0.221-0.542l0.001 0.001c-0.145-0.121-0.334-0.195-0.54-0.195s-0.395 0.074-0.541 0.196l0.001-0.001z"></path>
6
- </svg>
@@ -1,3 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1e7bff">
2
- <path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h168q13-36 43.5-58t68.5-22q38 0 68.5 22t43.5 58h168q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm80-80h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm200-190q13 0 21.5-8.5T510-820q0-13-8.5-21.5T480-850q-13 0-21.5 8.5T450-820q0 13 8.5 21.5T480-790ZM200-200v-560 560Z"/>
3
- </svg>
@@ -1,3 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1e7bff">
2
- <path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm320-280L160-640v400h640v-400L480-440Zm0-80 320-200H160l320 200ZM160-640v-80 480-400Z"/>
3
- </svg>
@@ -1,3 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1e7bff">
2
- <path d="M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z"/>
3
- </svg>
@@ -1,108 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg
3
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
4
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
5
- viewBox="0 0 127.17 127.21"
6
- version="1.1"
7
- id="svg16"
8
- sodipodi:docname="semester.svg"
9
- inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)"
10
- xmlns="http://www.w3.org/2000/svg">
11
- <sodipodi:namedview
12
- id="namedview16"
13
- pagecolor="#ffffff"
14
- bordercolor="#000000"
15
- borderopacity="0.25"
16
- inkscape:showpageshadow="2"
17
- inkscape:pageopacity="0.0"
18
- inkscape:pagecheckerboard="0"
19
- inkscape:deskcolor="#d1d1d1"
20
- inkscape:zoom="6.4538952"
21
- inkscape:cx="63.605"
22
- inkscape:cy="63.605"
23
- inkscape:window-width="1920"
24
- inkscape:window-height="1018"
25
- inkscape:window-x="0"
26
- inkscape:window-y="0"
27
- inkscape:window-maximized="1"
28
- inkscape:current-layer="svg16"/>
29
- <defs
30
- id="defs1">
31
- <style
32
- id="style1">.cls-1{fill:#e72429;}
33
- </style>
34
- </defs>
35
- <g
36
- id="Layer_2"
37
- data-name="Layer 2"
38
- transform="matrix(0.91348418,0,0,0.91348418,5.5011087,5.502839)">
39
- <g
40
- id="Layer_1-2"
41
- data-name="Layer 1">
42
- <path
43
- class="cls-1"
44
- d="M 18.45,63.47 A 18.4,18.4 0 0 0 2.31,45.23 73.13,73.13 0 0 0 2.31,81.7 18.38,18.38 0 0 0 18.45,63.47"
45
- id="path1"/>
46
- <path
47
- class="cls-1"
48
- d="M 29.13,57.7 A 5.77,5.77 0 1 0 34.9,63.47 5.77,5.77 0 0 0 29.13,57.7"
49
- id="path2"/>
50
- <path
51
- class="cls-1"
52
- d="m 108.72,63.47 a 18.38,18.38 0 0 0 16.14,18.23 73.13,73.13 0 0 0 0,-36.47 18.4,18.4 0 0 0 -16.14,18.24"
53
- id="path3"/>
54
- <path
55
- class="cls-1"
56
- d="m 98,57.7 a 5.77,5.77 0 1 0 5.76,5.77 A 5.77,5.77 0 0 0 98,57.7"
57
- id="path4"/>
58
- <path
59
- class="cls-1"
60
- d="m 63.46,108.77 a 18.39,18.39 0 0 0 -18.23,16.13 73.13,73.13 0 0 0 36.47,0 18.38,18.38 0 0 0 -18.24,-16.13"
61
- id="path5"/>
62
- <path
63
- class="cls-1"
64
- d="m 63.47,92.31 a 5.77,5.77 0 1 0 5.76,5.77 5.77,5.77 0 0 0 -5.76,-5.77"
65
- id="path6"/>
66
- <path
67
- class="cls-1"
68
- d="M 63.47,18.44 A 18.37,18.37 0 0 0 81.7,2.31 a 73.13,73.13 0 0 0 -36.47,0 18.39,18.39 0 0 0 18.24,16.13"
69
- id="path7"/>
70
- <path
71
- class="cls-1"
72
- d="m 63.47,23.37 a 5.77,5.77 0 1 0 5.76,5.76 5.76,5.76 0 0 0 -5.76,-5.76"
73
- id="path8"/>
74
- <path
75
- class="cls-1"
76
- d="m 95.44,95.44 a 18.4,18.4 0 0 0 -1.5,24.29 73,73 0 0 0 25.78,-25.79 18.39,18.39 0 0 0 -24.28,1.5"
77
- id="path9"/>
78
- <path
79
- class="cls-1"
80
- d="m 83.8,83.8 a 5.77,5.77 0 1 0 8.16,0 5.78,5.78 0 0 0 -8.16,0"
81
- id="path10"/>
82
- <path
83
- class="cls-1"
84
- d="M 31.59,31.59 A 18.36,18.36 0 0 0 33.09,7.31 72.93,72.93 0 0 0 7.31,33.09 18.36,18.36 0 0 0 31.59,31.59"
85
- id="path11"/>
86
- <path
87
- class="cls-1"
88
- d="m 35.07,35.08 a 5.77,5.77 0 1 0 8.16,0 5.78,5.78 0 0 0 -8.16,0"
89
- id="path12"/>
90
- <path
91
- class="cls-1"
92
- d="M 95.4,31.53 A 18.39,18.39 0 0 0 119.69,33 72.88,72.88 0 0 0 93.9,7.25 18.39,18.39 0 0 0 95.4,31.53"
93
- id="path13"/>
94
- <path
95
- class="cls-1"
96
- d="m 91.92,43.17 a 5.76,5.76 0 1 0 -8.15,0 5.76,5.76 0 0 0 8.15,0"
97
- id="path14"/>
98
- <path
99
- class="cls-1"
100
- d="M 31.56,95.37 A 18.39,18.39 0 0 0 7.28,93.87 73,73 0 0 0 33.06,119.66 18.38,18.38 0 0 0 31.56,95.37"
101
- id="path15"/>
102
- <path
103
- class="cls-1"
104
- d="m 35,83.73 a 5.77,5.77 0 1 0 8.16,0 5.79,5.79 0 0 0 -8.16,0"
105
- id="path16"/>
106
- </g>
107
- </g>
108
- </svg>
qcanvas/run.py DELETED
@@ -1,54 +0,0 @@
1
- # nuitka-project: --enable-plugin=pyside6
2
- # nuitka-project: --windows-icon-from-ico=./deploy/windows/qcanvas.ico
3
- # nuitka-project: --windows-console-mode=attach
4
- # nuitka-project: --linux-icon=deploy/appimage/qcanvas.svg
5
- # nuitka-project: --standalone
6
- # nuitka-project: --include-module=yt_dlp
7
-
8
- # Anti-bloat
9
-
10
- ##########################################################
11
- # nuitka-project: --include-package=aiosqlite
12
- # nuitka-project: --nofollow-import-to=aiosqlite.tests.*
13
- ##########################################################
14
- # nuitka-project: --nofollow-import-to=rich
15
- ##########################################################
16
- # nuitka-project: --nofollow-import-to=sqlalchemy.dialects.mssql
17
- # nuitka-project: --nofollow-import-to=sqlalchemy.dialects.postgresql
18
- # nuitka-project: --nofollow-import-to=sqlalchemy.dialects.oracle
19
- # nuitka-project: --nofollow-import-to=sqlalchemy.dialects.mysql
20
- ##########################################################
21
- # nuitka-project: --nofollow-import-to=rich
22
- ##########################################################
23
- # nuitka-project: --nofollow-import-to=yt_dlp.extractor.lazy_extractors
24
-
25
- import logging
26
- from logging import INFO, WARNING
27
-
28
- import qcanvas.app_start
29
- from qcanvas.util import logs, paths
30
-
31
- paths.data_storage().mkdir(parents=True, exist_ok=True)
32
-
33
- logging.basicConfig(
34
- filemode="w",
35
- filename=paths.data_storage() / "debug.log",
36
- level="WARN",
37
- )
38
-
39
- logs.set_levels(
40
- {
41
- "qcanvas": INFO,
42
- "qcanvas.ui": WARNING,
43
- "qcanvas_backend": INFO,
44
- "qcanvas.ui.main_ui.status_bar_progress_display": INFO,
45
- }
46
- )
47
-
48
-
49
- def main():
50
- qcanvas.app_start.launch()
51
-
52
-
53
- if __name__ == "__main__":
54
- main()
@@ -1,11 +0,0 @@
1
- from typing import Protocol
2
-
3
- import qcanvas_backend.database.types as db
4
- from qcanvas_backend.net.sync.sync_receipt import SyncReceipt
5
-
6
- date_strftime_format = "%A, %Y-%m-%d, %H:%M:%S"
7
-
8
-
9
- # todo what the hell is the point of this?
10
- class SupportsReload(Protocol):
11
- def reload(self, course: db.Course, *, sync_receipt: SyncReceipt) -> None: ...
File without changes
@@ -1,9 +0,0 @@
1
- import logging
2
-
3
- from qcanvas.util.settings._client_settings import _ClientSettings
4
- from qcanvas.util.settings._ui_settings import _UISettings
5
-
6
- _logger = logging.getLogger(__name__)
7
-
8
- client = _ClientSettings()
9
- ui = _UISettings()
@@ -1,2 +0,0 @@
1
- from ._theme_changed_event import theme_changed
2
- from ._theme_changer import apply, default_theme, ensure_theme_is_valid, is_dark_mode
@@ -1,38 +0,0 @@
1
- import logging
2
-
3
- from qtpy.QtCore import QObject, Signal, Slot
4
- from qtpy.QtGui import QGuiApplication, Qt
5
-
6
- _logger = logging.getLogger(__name__)
7
-
8
-
9
- def colour_scheme() -> Qt.ColorScheme:
10
- return QGuiApplication.styleHints().colorScheme()
11
-
12
-
13
- def is_dark_colour_scheme() -> bool:
14
- return colour_scheme() == Qt.ColorScheme.Dark
15
-
16
-
17
- class ColourSchemeChangeEvent(QObject):
18
- theme_changed = Signal()
19
-
20
- def __init__(self):
21
- super().__init__(None)
22
- self._last_theme = colour_scheme()
23
- QGuiApplication.styleHints().colorSchemeChanged.connect(self._theme_changed)
24
-
25
- @Slot(Qt.ColorScheme)
26
- def _theme_changed(self, colour_scheme: Qt.ColorScheme) -> None:
27
- # Ensure the signal isn't fired when there wasn't actually a change
28
- if colour_scheme != self._last_theme:
29
- self._last_theme = colour_scheme
30
- self.theme_changed.emit()
31
-
32
-
33
- _theme_changed_listener = ColourSchemeChangeEvent()
34
-
35
-
36
- def colour_scheme_changed() -> Signal:
37
- global _theme_changed_listener
38
- return _theme_changed_listener.theme_changed