qcanvas 1.0.11__py3-none-any.whl → 2026.1.19__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 (97) hide show
  1. qcanvas/__init__.py +60 -0
  2. qcanvas/app.py +72 -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 +55 -6
  6. qcanvas/icons/_icon_type.py +42 -0
  7. qcanvas/icons/icons.qrc +48 -8
  8. qcanvas/icons/rc_icons.py +2477 -566
  9. qcanvas/settings/__init__.py +6 -0
  10. qcanvas/{util/settings → settings}/_client_settings.py +15 -6
  11. qcanvas/settings/_course_settings.py +54 -0
  12. qcanvas/{util/settings → settings}/_mapped_setting.py +8 -6
  13. qcanvas/{util/settings → settings}/_ui_settings.py +5 -5
  14. qcanvas/theme.py +101 -0
  15. qcanvas/ui/course_viewer/content_tree.py +37 -19
  16. qcanvas/ui/course_viewer/course_tree/__init__.py +1 -0
  17. qcanvas/ui/course_viewer/course_tree/_course_icon_generator.py +86 -0
  18. qcanvas/ui/course_viewer/{course_tree.py → course_tree/course_tree.py} +29 -14
  19. qcanvas/ui/course_viewer/course_viewer.py +79 -46
  20. qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tab.py +107 -29
  21. qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tree.py +19 -18
  22. qcanvas/ui/course_viewer/tabs/content_tab.py +33 -39
  23. qcanvas/ui/course_viewer/tabs/file_tab/__init__.py +1 -0
  24. qcanvas/ui/course_viewer/tabs/file_tab/file_tab.py +46 -0
  25. qcanvas/ui/course_viewer/tabs/file_tab/file_tree.py +96 -0
  26. qcanvas/ui/course_viewer/tabs/file_tab/pages_file_tree.py +55 -0
  27. qcanvas/ui/course_viewer/tabs/mail_tab/mail_tab.py +50 -27
  28. qcanvas/ui/course_viewer/tabs/mail_tab/mail_tree.py +18 -19
  29. qcanvas/ui/course_viewer/tabs/page_tab/page_tab.py +3 -3
  30. qcanvas/ui/course_viewer/tabs/page_tab/page_tree.py +18 -16
  31. qcanvas/ui/course_viewer/tabs/resource_rich_browser.py +61 -74
  32. qcanvas/ui/course_viewer/tree_widget_data_item.py +22 -0
  33. qcanvas/ui/memory_tree/_tree_memory.py +45 -41
  34. qcanvas/ui/memory_tree/memory_tree_widget.py +22 -18
  35. qcanvas/ui/memory_tree/memory_tree_widget_item.py +3 -3
  36. qcanvas/ui/qcanvas_window/__init__.py +1 -0
  37. qcanvas/ui/qcanvas_window/course_viewer_container.py +95 -0
  38. qcanvas/ui/{main_ui → qcanvas_window}/options/auto_download_resources_option.py +8 -6
  39. qcanvas/ui/{main_ui → qcanvas_window}/options/quick_sync_option.py +7 -6
  40. qcanvas/ui/{main_ui → qcanvas_window}/options/sync_on_start_option.py +7 -6
  41. qcanvas/ui/{main_ui → qcanvas_window}/options/theme_selection_menu.py +12 -10
  42. qcanvas/ui/{main_ui → qcanvas_window}/qcanvas_window.py +74 -45
  43. qcanvas/ui/{main_ui → qcanvas_window}/status_bar_progress_display.py +20 -12
  44. qcanvas/ui/qml_components/__init__.py +4 -0
  45. qcanvas/ui/qml_components/attachments_pane.py +70 -0
  46. qcanvas/ui/qml_components/comments_pane.py +83 -0
  47. qcanvas/ui/qml_components/qml/AttachmentsList.ui.qml +15 -0
  48. qcanvas/ui/qml_components/qml/AttachmentsListDelegate.qml +77 -0
  49. qcanvas/ui/qml_components/qml/AttachmentsListModel.qml +19 -0
  50. qcanvas/ui/qml_components/qml/AttachmentsPane.qml +11 -0
  51. qcanvas/ui/qml_components/qml/CommentsList.ui.qml +15 -0
  52. qcanvas/ui/qml_components/qml/CommentsListDelegate.ui.qml +118 -0
  53. qcanvas/ui/qml_components/qml/CommentsListModel.qml +56 -0
  54. qcanvas/ui/qml_components/qml/CommentsPane.qml +11 -0
  55. qcanvas/ui/qml_components/qml/DecoratedText.ui.qml +44 -0
  56. qcanvas/ui/qml_components/qml/Spacer.ui.qml +7 -0
  57. qcanvas/ui/qml_components/qml/ThemedRectangle.qml +53 -0
  58. qcanvas/ui/qml_components/qml/__init__.py +3 -0
  59. qcanvas/ui/qml_components/qml/rc_qml.py +709 -0
  60. qcanvas/ui/qml_components/qml/rc_qml.qrc +16 -0
  61. qcanvas/ui/qml_components/qml_bridge_types.py +95 -0
  62. qcanvas/ui/qml_components/qml_pane.py +21 -0
  63. qcanvas/ui/setup/setup_checker.py +3 -3
  64. qcanvas/ui/setup/setup_dialog.py +173 -80
  65. qcanvas/util/__init__.py +0 -2
  66. qcanvas/util/auto_downloader.py +9 -8
  67. qcanvas/util/basic_fonts.py +2 -2
  68. qcanvas/util/context_dict.py +12 -0
  69. qcanvas/util/file_icons.py +46 -0
  70. qcanvas/util/html_cleaner.py +2 -0
  71. qcanvas/util/layouts.py +9 -8
  72. qcanvas/util/paths.py +26 -22
  73. qcanvas/util/qurl_util.py +1 -1
  74. qcanvas/util/runtime.py +20 -0
  75. qcanvas/util/ui_tools.py +121 -7
  76. qcanvas/util/url_checker.py +1 -1
  77. qcanvas-2026.1.19.dist-info/METADATA +95 -0
  78. qcanvas-2026.1.19.dist-info/RECORD +92 -0
  79. {qcanvas-1.0.11.dist-info → qcanvas-2026.1.19.dist-info}/WHEEL +1 -1
  80. qcanvas-2026.1.19.dist-info/entry_points.txt +3 -0
  81. qcanvas/app_start/__init__.py +0 -54
  82. qcanvas/icons/file-download-failed.svg +0 -6
  83. qcanvas/icons/file-downloaded.svg +0 -6
  84. qcanvas/icons/file-not-downloaded.svg +0 -6
  85. qcanvas/icons/file-unknown.svg +0 -6
  86. qcanvas/icons/main_icon.svg +0 -325
  87. qcanvas/icons/sync.svg +0 -7
  88. qcanvas/run.py +0 -30
  89. qcanvas/ui/main_ui/__init__.py +0 -0
  90. qcanvas/ui/main_ui/course_viewer_container.py +0 -52
  91. qcanvas/util/settings/__init__.py +0 -9
  92. qcanvas/util/themes.py +0 -24
  93. qcanvas-1.0.11.dist-info/METADATA +0 -61
  94. qcanvas-1.0.11.dist-info/RECORD +0 -68
  95. qcanvas-1.0.11.dist-info/entry_points.txt +0 -3
  96. /qcanvas/ui/course_viewer/tabs/{util.py → constants.py} +0 -0
  97. /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>
qcanvas/icons/sync.svg DELETED
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
2
- <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
- <path d="M18.43 4.25C18.2319 4.25259 18.0426 4.33244 17.9025 4.47253C17.7625 4.61263 17.6826 4.80189 17.68 5V7.43L16.84 6.59C15.971 5.71363 14.8924 5.07396 13.7067 4.73172C12.5209 4.38948 11.2673 4.35604 10.065 4.63458C8.86267 4.91312 7.7515 5.49439 6.83703 6.32318C5.92255 7.15198 5.23512 8.20078 4.84001 9.37C4.79887 9.46531 4.77824 9.56821 4.77947 9.67202C4.7807 9.77583 4.80375 9.87821 4.84714 9.97252C4.89052 10.0668 4.95326 10.151 5.03129 10.2194C5.10931 10.2879 5.20087 10.3392 5.30001 10.37C5.38273 10.3844 5.4673 10.3844 5.55001 10.37C5.70646 10.3684 5.85861 10.3186 5.98568 10.2273C6.11275 10.136 6.20856 10.0078 6.26001 9.86C6.53938 9.0301 7.00847 8.27681 7.63001 7.66C8.70957 6.58464 10.1713 5.98085 11.695 5.98085C13.2188 5.98085 14.6805 6.58464 15.76 7.66L16.6 8.5H14.19C13.9911 8.5 13.8003 8.57902 13.6597 8.71967C13.519 8.86032 13.44 9.05109 13.44 9.25C13.44 9.44891 13.519 9.63968 13.6597 9.78033C13.8003 9.92098 13.9911 10 14.19 10H18.43C18.5289 10.0013 18.627 9.98286 18.7186 9.94565C18.8102 9.90844 18.8934 9.85324 18.9633 9.78333C19.0333 9.71341 19.0885 9.6302 19.1257 9.5386C19.1629 9.44699 19.1814 9.34886 19.18 9.25V5C19.18 4.80109 19.101 4.61032 18.9603 4.46967C18.8197 4.32902 18.6289 4.25 18.43 4.25Z"
4
- fill="#000000"/>
5
- <path d="M18.68 13.68C18.5837 13.6422 18.4808 13.6244 18.3774 13.6277C18.274 13.6311 18.1724 13.6555 18.0787 13.6995C17.9851 13.7435 17.9015 13.8062 17.8329 13.8836C17.7643 13.9611 17.7123 14.0517 17.68 14.15C17.4006 14.9799 16.9316 15.7332 16.31 16.35C15.2305 17.4254 13.7688 18.0291 12.245 18.0291C10.7213 18.0291 9.25957 17.4254 8.18001 16.35L7.34001 15.51H9.81002C10.0089 15.51 10.1997 15.431 10.3403 15.2903C10.481 15.1497 10.56 14.9589 10.56 14.76C10.56 14.5611 10.481 14.3703 10.3403 14.2297C10.1997 14.089 10.0089 14.01 9.81002 14.01H5.57001C5.47115 14.0086 5.37302 14.0271 5.28142 14.0643C5.18982 14.1016 5.1066 14.1568 5.03669 14.2267C4.96677 14.2966 4.91158 14.3798 4.87436 14.4714C4.83715 14.563 4.81867 14.6611 4.82001 14.76V19C4.82001 19.1989 4.89903 19.3897 5.03968 19.5303C5.18034 19.671 5.3711 19.75 5.57001 19.75C5.76893 19.75 5.95969 19.671 6.10034 19.5303C6.241 19.3897 6.32001 19.1989 6.32001 19V16.57L7.16001 17.41C8.02901 18.2864 9.10761 18.926 10.2934 19.2683C11.4791 19.6105 12.7327 19.6439 13.935 19.3654C15.1374 19.0869 16.2485 18.5056 17.163 17.6768C18.0775 16.848 18.7649 15.7992 19.16 14.63C19.1926 14.5362 19.2061 14.4368 19.1995 14.3377C19.1929 14.2386 19.1664 14.1418 19.1216 14.0532C19.0768 13.9645 19.0146 13.8858 18.9387 13.8217C18.8629 13.7576 18.7749 13.7094 18.68 13.68Z"
6
- fill="#000000"/>
7
- </svg>
qcanvas/run.py DELETED
@@ -1,30 +0,0 @@
1
- import logging
2
- from logging import INFO, WARNING
3
-
4
- import qcanvas.app_start
5
- from qcanvas.util import logs, paths
6
-
7
- paths.data_storage().mkdir(parents=True, exist_ok=True)
8
-
9
- logging.basicConfig(
10
- filemode="w",
11
- filename=paths.data_storage() / "debug.log",
12
- level="WARN",
13
- )
14
-
15
- logs.set_levels(
16
- {
17
- "qcanvas": INFO,
18
- "qcanvas.ui": WARNING,
19
- "qcanvas_backend": INFO,
20
- "qcanvas.ui.main_ui.status_bar_progress_display": INFO,
21
- }
22
- )
23
-
24
-
25
- def main():
26
- qcanvas.app_start.launch()
27
-
28
-
29
- if __name__ == "__main__":
30
- main()
File without changes
@@ -1,52 +0,0 @@
1
- import logging
2
- from typing import *
3
-
4
- import qcanvas_backend.database.types as db
5
- from qcanvas_backend.net.resources.download.resource_manager import ResourceManager
6
- from qcanvas_backend.net.sync.sync_receipt import SyncReceipt, empty_receipt
7
- from qtpy.QtCore import Qt
8
- from qtpy.QtWidgets import *
9
-
10
- from qcanvas.ui.course_viewer.course_viewer import CourseViewer
11
-
12
- _logger = logging.getLogger(__name__)
13
-
14
-
15
- class CourseViewerContainer(QStackedWidget):
16
- def __init__(self, downloader: ResourceManager):
17
- super().__init__()
18
- self._course_viewers: dict[str, CourseViewer] = {}
19
- self._downloader = downloader
20
- self._last_course_id: Optional[str] = None
21
- self._last_sync_receipt: SyncReceipt = empty_receipt()
22
- self._placeholder = QLabel("No Course Selected")
23
- self._placeholder.setAlignment(Qt.AlignmentFlag.AlignCenter)
24
- self.addWidget(self._placeholder)
25
-
26
- def show_blank(self) -> None:
27
- self._last_course_id = None
28
- self.setCurrentWidget(self._placeholder)
29
-
30
- def load_course(self, course: db.Course) -> None:
31
- if course.id not in self._course_viewers:
32
- viewer = CourseViewer(
33
- course=course,
34
- downloader=self._downloader,
35
- sync_receipt=self._last_sync_receipt,
36
- )
37
- self._course_viewers[course.id] = viewer
38
- self.addWidget(viewer)
39
- else:
40
- viewer = self._course_viewers[course.id]
41
-
42
- self.setCurrentWidget(viewer)
43
- self._last_course_id = course.id
44
-
45
- async def reload_all(
46
- self, courses: Sequence[db.Course], *, sync_receipt: SyncReceipt
47
- ) -> None:
48
- self._last_sync_receipt = sync_receipt
49
- for course in courses:
50
- if course.id in self._course_viewers:
51
- viewer = self._course_viewers[course.id]
52
- viewer.reload(course, sync_receipt=sync_receipt)
@@ -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()
qcanvas/util/themes.py DELETED
@@ -1,24 +0,0 @@
1
- import logging
2
-
3
- import qdarktheme
4
-
5
- _logger = logging.getLogger(__name__)
6
-
7
- default_theme = "auto"
8
-
9
-
10
- def ensure_theme_is_valid(theme: str) -> str:
11
- if theme not in ["auto", "light", "dark", "native"]:
12
- return default_theme
13
- else:
14
- return theme
15
-
16
-
17
- def apply(theme: str) -> None:
18
- theme = ensure_theme_is_valid(theme)
19
-
20
- if theme != "native":
21
- qdarktheme.setup_theme(
22
- theme,
23
- custom_colors={"primary": "e02424"},
24
- )
@@ -1,61 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: qcanvas
3
- Version: 1.0.11
4
- Summary: QCanvas is a desktop client for Canvas LMS.
5
- Author: QCanvas
6
- Author-email: QCanvas@noreply.codeberg.org
7
- Requires-Python: >=3.11,<3.13
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.11
10
- Classifier: Programming Language :: Python :: 3.12
11
- Requires-Dist: aiosqlite (>=0.20.0,<0.21.0)
12
- Requires-Dist: asynctaskpool (>=0.2.1,<0.3.0)
13
- Requires-Dist: lightdb (>=2.0,<3.0)
14
- Requires-Dist: platformdirs (>=4.2.2,<5.0.0)
15
- Requires-Dist: pyqtdarktheme-fork (>=2.3.2,<3.0.0)
16
- Requires-Dist: qasync (>=0.27.1,<0.28.0)
17
- Requires-Dist: qcanvas-api-clients (>=0.2.2,<0.3.0)
18
- Requires-Dist: qcanvas-backend (==0.1.10)
19
- Requires-Dist: qtpy (>=2.4.1,<3.0.0)
20
- Requires-Dist: sqlalchemy (>=2.0.31,<3.0.0)
21
- Requires-Dist: validators (>=0.33.0,<0.34.0)
22
- Description-Content-Type: text/markdown
23
-
24
- # QCanvas
25
-
26
- QCanvas is an **unofficial** desktop client for Canvas LMS.
27
-
28
- # Downloads
29
-
30
- Download it from [releases](https://github.com/QCanvas/QCanvasApp/releases)
31
-
32
- # Development/Run from source
33
-
34
- ## Prerequisites
35
-
36
- - Python 3.12+ (use [pyenv](https://github.com/pyenv/pyenv) if your distro does not have that version)
37
- - [Pipx](https://pipx.pypa.io/stable/) (optional)
38
- - Poetry (recommended to install using `pipx install poetry`)
39
- - [Appimagetool](https://github.com/AppImage/appimagetool) (Only for building the appimage)
40
-
41
- ## Get started
42
-
43
- ```bash
44
- git clone https://github.com/QCanvas/QCanvasApp.git
45
- cd QCanvasApp
46
-
47
- # Enter shell and run it
48
- poetry shell
49
- poetry install
50
- python qcanvas/run.py
51
-
52
- # Alternatively you can run it like this:
53
- poetry install
54
- poetry run python qcanvas/run.py
55
- ```
56
-
57
- ## Build custom AppImage
58
-
59
- ```bash
60
- bash build_appimage.sh
61
- ```
@@ -1,68 +0,0 @@
1
- qcanvas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- qcanvas/app_start/__init__.py,sha256=Qq_8Zgqhkd_lHLOvUH6NP95-WofxyC0R_vgZx2hQF7g,1274
3
- qcanvas/backend_connectors/__init__.py,sha256=Wj8cmxQng3SSlmlXJyzHaPmvxbkauwsxINckPb7WuHc,108
4
- qcanvas/backend_connectors/frontend_resource_manager.py,sha256=87oszxCle0Y9AUAHH3wn_7oilY45ddMET-4EnpTtjn0,1322
5
- qcanvas/backend_connectors/qcanvas_task_master.py,sha256=CTPBvf_9w-livscKNspnd98mNvFLYTYHef0RQSUkfFc,742
6
- qcanvas/icons/__init__.py,sha256=eaZWyt-xEsLqRVI2HNvevgRhXUnM_oyDrT5hSyLM1eE,246
7
- qcanvas/icons/file-download-failed.svg,sha256=b1Nx5mW_dbh3nuex4e-11btcGILLg59PHUG5lV6bc2U,1327
8
- qcanvas/icons/file-downloaded.svg,sha256=ymf1NU5uvKZq41kNVTtKkUoIzUE3pbHmx5IvwPYoyiU,789
9
- qcanvas/icons/file-not-downloaded.svg,sha256=TVpIZYDUfOw3S0cmXR3FawiCp0Y_PTSR4XKwrsy1qOs,1270
10
- qcanvas/icons/file-unknown.svg,sha256=9xlN244HJX3zM_MqdMTnNbKlqLjOFgCx3ZdM4Wc4zC0,1729
11
- qcanvas/icons/icons.qrc,sha256=czwaoP0TNXGoH91cstRbdhvKnfyLlmAp-VmaZoBk0YY,280
12
- qcanvas/icons/main_icon.svg,sha256=st2sfA8HIETmoacJ2Oq84iJzfnNHH-T03ijB-J419_s,16104
13
- qcanvas/icons/rc_icons.py,sha256=Ankeu0oWJk-1qLGVLxmiK5Kt1LVNyDmpR8jJZzOG5gQ,18194
14
- qcanvas/icons/sync.svg,sha256=J-7_KnFbQL3uh-RrTy0_wSJUVW4Cc6ZSTacld6ULv1w,2829
15
- qcanvas/run.py,sha256=lZZPpdlQWbcSJnhY2i2zJ1xizhdy1j2EoV1BUYVXkfw,548
16
- qcanvas/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- qcanvas/ui/course_viewer/__init__.py,sha256=XkoFnh4ULw3_i-GDsOlueEWido0PkoDcN9_EX6-nkXY,76
18
- qcanvas/ui/course_viewer/content_tree.py,sha256=sxYcNzyVUbZe-Nmoz7FXvmb9J6bNwqi8G7xZOtVqKhQ,3993
19
- qcanvas/ui/course_viewer/course_tree.py,sha256=LkzquiAIKzFwB9dkOx-QmIp7CkKJ8R5Kk0aeYHQLu5s,2709
20
- qcanvas/ui/course_viewer/course_viewer.py,sha256=X-bughys3-6MmrRb7-9vVgRixDZbzKBj66AeabJzmDo,3970
21
- qcanvas/ui/course_viewer/tabs/__init__.py,sha256=SlfWUzk6_E5uM9GIV-y9BVeKMwqn3pRx_xWhMyb1dfI,54
22
- qcanvas/ui/course_viewer/tabs/assignment_tab/__init__.py,sha256=w936dW7za10Fh6rN0zVA-7Kyiup3kd6C-mPAFHtxmy0,42
23
- qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tab.py,sha256=_de3IPBCe27Bt8MoabcX1ZchBbVb-_QHVeYMvL3wzr8,1986
24
- qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tree.py,sha256=sy9Cu5ZMt_Jb6PK-ikyB8CvSvdGecsK_8sPpKigTlfo,2924
25
- qcanvas/ui/course_viewer/tabs/content_tab.py,sha256=CAfzUYawDde0lhL7R7dFu07uS1XEG39VIleS2Cpu30g,3540
26
- qcanvas/ui/course_viewer/tabs/mail_tab/__init__.py,sha256=68iRUUWEP7mudbaxa4ZBKMra4rvs2oZKaZkBWwmUrsI,30
27
- qcanvas/ui/course_viewer/tabs/mail_tab/mail_tab.py,sha256=fw0FORJiH19rAGsjBFJHZlNrVCMbwG4n3AFV3wbhwGM,1840
28
- qcanvas/ui/course_viewer/tabs/mail_tab/mail_tree.py,sha256=5yCLjkwFV1qIOq-NYeUds_gz_gi-yy0OXblNXt_zzVQ,1799
29
- qcanvas/ui/course_viewer/tabs/page_tab/__init__.py,sha256=lcafxlSEVZ0wqZySxT6hTrvExX-GU2AfcZQbp6W8haU,30
30
- qcanvas/ui/course_viewer/tabs/page_tab/page_tab.py,sha256=cv-pCDri7thRJZv-gWUZrL2FUQAHe7vZthRAhejsqWY,771
31
- qcanvas/ui/course_viewer/tabs/page_tab/page_tree.py,sha256=ugxEOaNUdWDsyj7GC-LUtH_OsONgdWRSyugFNPBhZS4,2172
32
- qcanvas/ui/course_viewer/tabs/resource_rich_browser.py,sha256=422vPQF9afS_tLFqakMqk0qf-KR4N0gm9ytT5hVFF6I,6278
33
- qcanvas/ui/course_viewer/tabs/util.py,sha256=rUVEGSREV9vTFs4o3AD2OjaSFA-GPsmelxYWz0J8OP4,48
34
- qcanvas/ui/main_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- qcanvas/ui/main_ui/course_viewer_container.py,sha256=R3w0EImYQTUMPPtoaTIZZTf8MCMDC_5Ia_c-MBJ6-QQ,1912
36
- qcanvas/ui/main_ui/options/__init__.py,sha256=SlfWUzk6_E5uM9GIV-y9BVeKMwqn3pRx_xWhMyb1dfI,54
37
- qcanvas/ui/main_ui/options/auto_download_resources_option.py,sha256=W9BleGh6egfN9d9awnjEAAFq6_6DyXyD-rIopkofVDw,1284
38
- qcanvas/ui/main_ui/options/quick_sync_option.py,sha256=qEfmtLllO32ejc-bydCvFRjal5RUlk2HtC5Ld4mT7ss,753
39
- qcanvas/ui/main_ui/options/sync_on_start_option.py,sha256=zFFAAyGZEa6qBchJJIm7bJpOwxcntnto9Ee-lzCiHX4,731
40
- qcanvas/ui/main_ui/options/theme_selection_menu.py,sha256=MVudpolTToR1TRAtqfaFMUH__G0gc4oyqDAL5BH-7RY,1263
41
- qcanvas/ui/main_ui/qcanvas_window.py,sha256=LXl6FQHSy6Lad1JmGSSoyqMsMxGUThku0QUQIqnuVIo,8543
42
- qcanvas/ui/main_ui/status_bar_progress_display.py,sha256=ExFRWY1SPDS2t8CBOx80TlOdENrxXGnuv7ht-DPcnwY,4836
43
- qcanvas/ui/memory_tree/__init__.py,sha256=-XLitM6teC0zmwPrGf-Q-A53-zgmIPASExdOtaLIvPU,107
44
- qcanvas/ui/memory_tree/_tree_memory.py,sha256=CMKfCnrHj22ervaq7xB5U4AiKijYvghUK5ZL0MJIFmQ,1805
45
- qcanvas/ui/memory_tree/memory_tree_widget.py,sha256=OT3TnYsUSbMowqR9my19QG4AuAdhTb29SGSa2406-SE,4432
46
- qcanvas/ui/memory_tree/memory_tree_widget_item.py,sha256=JXk07AzrKsBnYAqhayIFYAwMfF_D_EfkfJY4Qyez47U,425
47
- qcanvas/ui/setup/__init__.py,sha256=QWt2lEyLqWG5QC-BmCBlYyi0LZsBfsQYbP0XkvqA2f8,77
48
- qcanvas/ui/setup/setup_checker.py,sha256=ysQpkVLIWn8BR3hKhekuRIsHNAOU-jnHm061dfQ_OcY,396
49
- qcanvas/ui/setup/setup_dialog.py,sha256=HQTvIbB-T-DMf8-MIMxWWNNN6xdIW34jgAJtwjgki7U,8562
50
- qcanvas/util/__init__.py,sha256=RmC5zxGHoTLudrx9uol55fM5dvIkFjBCroQGYXaELCA,51
51
- qcanvas/util/auto_downloader.py,sha256=NZLr0joiXIWdfLB4DUiwC0MTry5ilREbZ-2qYRFGdxQ,1868
52
- qcanvas/util/basic_fonts.py,sha256=1NK5_kejgH45mENwiTWvE5oOuAvGqWMX3hg9tTUCBi4,243
53
- qcanvas/util/html_cleaner.py,sha256=O9_PhvZZw3RcPjdXZagAbNmp8Hfyq9fydBH-ee-DfII,615
54
- qcanvas/util/layouts.py,sha256=7wQ0-DAbRHPPcfVIQoOmVhPdhGqcF-6qWE1-P86e7ys,1351
55
- qcanvas/util/logs.py,sha256=VZKFITiW2WR2POEFVv5GRpEXic23Pzjehry-vH3g3Gk,138
56
- qcanvas/util/paths.py,sha256=uEV4AJFaWtP7hbie7H6-MYnCUE4_IJl0fkuxuZVMffA,1306
57
- qcanvas/util/qurl_util.py,sha256=NkskYvrMQJuYWMNF4DFQ4J5-YM5CGl5gHQKxJaAhHBE,197
58
- qcanvas/util/settings/__init__.py,sha256=ivc8bczhQdEJsWse6fc81Xyz0i2YX57pL4UubM3NJfw,228
59
- qcanvas/util/settings/_client_settings.py,sha256=VpJ80rE04iB-1bsQLr6wWzD5fB8fp-goy62o7OGABWo,1119
60
- qcanvas/util/settings/_mapped_setting.py,sha256=Z6635FfDll9cCLfSkVg-unsDLvUWuKT5MmxJEiUkd2k,1823
61
- qcanvas/util/settings/_ui_settings.py,sha256=zlWMjpntuqm7ZN3aBEROGrXc4bhtKOfWijmiGkdt1UA,804
62
- qcanvas/util/themes.py,sha256=BE6lMf0lVE-0G_QYhK5emMdtKG4lUJw76HFX4go7R80,473
63
- qcanvas/util/ui_tools.py,sha256=bSM1xrmZPn847YEbXAC9VIAv--8hMLMWrsEMWGA5p3E,916
64
- qcanvas/util/url_checker.py,sha256=gaV_KZZsG5bfJaGBv9jbHJjq0rVxIH55HRtucT6Qkx8,144
65
- qcanvas-1.0.11.dist-info/METADATA,sha256=H9tWTHDdBf-2N6U7Obn1eI3NQAw_wPeAXPx_PpwzuN8,1710
66
- qcanvas-1.0.11.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
67
- qcanvas-1.0.11.dist-info/entry_points.txt,sha256=46VbnhQ9w2CYdfhYcPfWgjXYHjsKshu0asQ1B_sAMac,44
68
- qcanvas-1.0.11.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- qcanvas=qcanvas.run:main
3
-
File without changes