pygpt-net 2.4.37__py3-none-any.whl → 2.4.42__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 (340) hide show
  1. CHANGELOG.md +37 -0
  2. README.md +176 -182
  3. pygpt_net/CHANGELOG.txt +37 -0
  4. pygpt_net/__init__.py +3 -3
  5. pygpt_net/app.py +3 -1
  6. pygpt_net/controller/__init__.py +7 -3
  7. pygpt_net/controller/access/control.py +1 -1
  8. pygpt_net/controller/access/voice.py +11 -5
  9. pygpt_net/controller/agent/experts.py +11 -6
  10. pygpt_net/controller/agent/legacy.py +8 -6
  11. pygpt_net/controller/agent/llama.py +4 -2
  12. pygpt_net/controller/assistant/__init__.py +9 -4
  13. pygpt_net/controller/assistant/batch.py +38 -21
  14. pygpt_net/controller/assistant/editor.py +7 -6
  15. pygpt_net/controller/assistant/files.py +23 -7
  16. pygpt_net/controller/assistant/store.py +20 -7
  17. pygpt_net/controller/assistant/threads.py +34 -8
  18. pygpt_net/controller/attachment.py +29 -10
  19. pygpt_net/controller/audio/__init__.py +26 -5
  20. pygpt_net/controller/calendar/__init__.py +23 -4
  21. pygpt_net/controller/calendar/note.py +57 -11
  22. pygpt_net/controller/camera.py +4 -12
  23. pygpt_net/controller/chat/__init__.py +5 -3
  24. pygpt_net/controller/chat/attachment.py +34 -7
  25. pygpt_net/controller/chat/audio.py +2 -2
  26. pygpt_net/controller/chat/command.py +4 -2
  27. pygpt_net/controller/chat/common.py +11 -4
  28. pygpt_net/controller/chat/files.py +10 -3
  29. pygpt_net/controller/chat/image.py +17 -5
  30. pygpt_net/controller/chat/input.py +10 -7
  31. pygpt_net/controller/chat/output.py +21 -6
  32. pygpt_net/controller/chat/render.py +100 -21
  33. pygpt_net/controller/chat/response.py +34 -7
  34. pygpt_net/controller/chat/stream.py +4 -2
  35. pygpt_net/controller/chat/text.py +6 -4
  36. pygpt_net/controller/command.py +11 -3
  37. pygpt_net/controller/config/__init__.py +34 -6
  38. pygpt_net/controller/config/field/checkbox.py +7 -4
  39. pygpt_net/controller/config/field/cmd.py +7 -5
  40. pygpt_net/controller/config/field/combo.py +14 -6
  41. pygpt_net/controller/config/field/dictionary.py +14 -11
  42. pygpt_net/controller/config/field/input.py +9 -6
  43. pygpt_net/controller/config/field/slider.py +11 -8
  44. pygpt_net/controller/config/field/textarea.py +8 -5
  45. pygpt_net/controller/config/placeholder.py +66 -21
  46. pygpt_net/controller/ctx/__init__.py +138 -49
  47. pygpt_net/controller/ctx/common.py +15 -4
  48. pygpt_net/controller/ctx/extra.py +11 -3
  49. pygpt_net/controller/ctx/summarizer.py +24 -5
  50. pygpt_net/controller/debug/__init__.py +27 -6
  51. pygpt_net/controller/dialogs/confirm.py +34 -7
  52. pygpt_net/controller/dialogs/debug.py +4 -2
  53. pygpt_net/controller/dialogs/info.py +7 -2
  54. pygpt_net/controller/files.py +48 -10
  55. pygpt_net/controller/finder.py +11 -5
  56. pygpt_net/controller/idx/__init__.py +10 -3
  57. pygpt_net/controller/idx/common.py +4 -2
  58. pygpt_net/controller/idx/indexer.py +25 -17
  59. pygpt_net/controller/idx/settings.py +9 -3
  60. pygpt_net/controller/kernel/__init__.py +34 -8
  61. pygpt_net/controller/kernel/reply.py +12 -3
  62. pygpt_net/controller/kernel/stack.py +5 -3
  63. pygpt_net/controller/lang/custom.py +2 -7
  64. pygpt_net/controller/lang/mapping.py +5 -3
  65. pygpt_net/controller/layout.py +2 -2
  66. pygpt_net/controller/mode.py +16 -4
  67. pygpt_net/controller/model/__init__.py +14 -3
  68. pygpt_net/controller/model/editor.py +8 -3
  69. pygpt_net/controller/notepad.py +26 -12
  70. pygpt_net/controller/painter/capture.py +23 -4
  71. pygpt_net/controller/painter/common.py +9 -7
  72. pygpt_net/controller/plugins/__init__.py +19 -5
  73. pygpt_net/controller/plugins/presets.py +15 -6
  74. pygpt_net/controller/plugins/settings.py +9 -3
  75. pygpt_net/controller/presets/__init__.py +55 -16
  76. pygpt_net/controller/presets/editor.py +26 -10
  77. pygpt_net/controller/settings/__init__.py +3 -2
  78. pygpt_net/controller/settings/editor.py +29 -7
  79. pygpt_net/controller/settings/profile.py +22 -5
  80. pygpt_net/controller/theme/__init__.py +54 -12
  81. pygpt_net/controller/theme/common.py +24 -2
  82. pygpt_net/controller/theme/markdown.py +32 -16
  83. pygpt_net/controller/theme/menu.py +26 -5
  84. pygpt_net/controller/theme/nodes.py +2 -5
  85. pygpt_net/controller/tools/__init__.py +40 -2
  86. pygpt_net/controller/ui/__init__.py +4 -6
  87. pygpt_net/controller/ui/mode.py +16 -21
  88. pygpt_net/controller/ui/tabs.py +363 -65
  89. pygpt_net/core/access/actions.py +6 -4
  90. pygpt_net/core/access/shortcuts.py +4 -3
  91. pygpt_net/core/access/voice.py +6 -5
  92. pygpt_net/core/agents/legacy.py +4 -2
  93. pygpt_net/core/agents/memory.py +7 -2
  94. pygpt_net/core/agents/observer/evaluation.py +15 -7
  95. pygpt_net/core/agents/provider.py +9 -4
  96. pygpt_net/core/agents/runner.py +61 -15
  97. pygpt_net/core/agents/tools.py +23 -5
  98. pygpt_net/core/assistants/__init__.py +6 -4
  99. pygpt_net/core/assistants/files.py +35 -12
  100. pygpt_net/core/assistants/store.py +20 -10
  101. pygpt_net/core/attachments/__init__.py +54 -15
  102. pygpt_net/core/attachments/context.py +92 -29
  103. pygpt_net/core/audio/__init__.py +74 -3
  104. pygpt_net/core/audio/context.py +7 -2
  105. pygpt_net/core/audio/whisper.py +37 -0
  106. pygpt_net/core/bridge/__init__.py +22 -6
  107. pygpt_net/core/bridge/context.py +5 -3
  108. pygpt_net/core/bridge/worker.py +2 -2
  109. pygpt_net/core/calendar/__init__.py +57 -11
  110. pygpt_net/core/chain/__init__.py +8 -2
  111. pygpt_net/core/chain/chat.py +10 -8
  112. pygpt_net/core/chain/completion.py +10 -7
  113. pygpt_net/core/command.py +62 -17
  114. pygpt_net/core/ctx/__init__.py +260 -58
  115. pygpt_net/core/ctx/bag.py +25 -4
  116. pygpt_net/core/ctx/container.py +28 -17
  117. pygpt_net/core/ctx/idx.py +45 -8
  118. pygpt_net/core/ctx/output.py +95 -74
  119. pygpt_net/core/ctx/reply.py +5 -2
  120. pygpt_net/core/db/__init__.py +8 -7
  121. pygpt_net/core/db/viewer.py +17 -11
  122. pygpt_net/core/debug/__init__.py +10 -9
  123. pygpt_net/core/debug/events.py +22 -10
  124. pygpt_net/core/debug/tabs.py +9 -3
  125. pygpt_net/core/docker/__init__.py +11 -5
  126. pygpt_net/core/docker/builder.py +11 -3
  127. pygpt_net/core/events/app.py +5 -3
  128. pygpt_net/core/events/base.py +11 -5
  129. pygpt_net/core/events/control.py +5 -3
  130. pygpt_net/core/events/event.py +17 -7
  131. pygpt_net/core/events/kernel.py +5 -3
  132. pygpt_net/core/events/render.py +5 -3
  133. pygpt_net/core/experts/__init__.py +5 -4
  134. pygpt_net/core/filesystem/__init__.py +52 -34
  135. pygpt_net/core/filesystem/actions.py +8 -5
  136. pygpt_net/core/filesystem/editor.py +13 -3
  137. pygpt_net/core/filesystem/types.py +12 -7
  138. pygpt_net/core/filesystem/url.py +7 -3
  139. pygpt_net/core/history.py +3 -2
  140. pygpt_net/core/idx/__init__.py +48 -27
  141. pygpt_net/core/idx/chat.py +51 -17
  142. pygpt_net/core/idx/context.py +6 -2
  143. pygpt_net/core/idx/indexing.py +107 -42
  144. pygpt_net/core/idx/llm.py +11 -3
  145. pygpt_net/core/idx/metadata.py +13 -3
  146. pygpt_net/core/idx/types/ctx.py +32 -6
  147. pygpt_net/core/idx/types/external.py +41 -7
  148. pygpt_net/core/idx/types/files.py +31 -6
  149. pygpt_net/core/image.py +15 -4
  150. pygpt_net/core/installer.py +2 -4
  151. pygpt_net/core/llm/__init__.py +13 -3
  152. pygpt_net/core/locale.py +34 -8
  153. pygpt_net/core/models.py +63 -17
  154. pygpt_net/core/modes.py +11 -13
  155. pygpt_net/core/notepad.py +10 -5
  156. pygpt_net/core/plugins.py +31 -19
  157. pygpt_net/core/presets.py +37 -17
  158. pygpt_net/core/profile.py +21 -7
  159. pygpt_net/core/prompt/__init__.py +10 -3
  160. pygpt_net/core/prompt/custom.py +7 -6
  161. pygpt_net/core/prompt/template.py +9 -3
  162. pygpt_net/core/render/base.py +117 -22
  163. pygpt_net/core/render/markdown/body.py +27 -7
  164. pygpt_net/core/render/markdown/renderer.py +119 -22
  165. pygpt_net/core/render/plain/body.py +22 -5
  166. pygpt_net/core/render/plain/renderer.py +97 -21
  167. pygpt_net/core/render/web/body.py +75 -25
  168. pygpt_net/core/render/web/parser.py +3 -1
  169. pygpt_net/core/render/web/renderer.py +313 -63
  170. pygpt_net/core/settings.py +10 -5
  171. pygpt_net/core/tabs/__init__.py +290 -103
  172. pygpt_net/core/tabs/tab.py +26 -5
  173. pygpt_net/core/tokens.py +47 -12
  174. pygpt_net/core/updater/__init__.py +20 -7
  175. pygpt_net/core/vision/analyzer.py +29 -6
  176. pygpt_net/core/{web.py → web/__init__.py} +29 -7
  177. pygpt_net/core/web/helpers.py +237 -0
  178. pygpt_net/data/config/config.json +15 -4
  179. pygpt_net/data/config/models.json +3 -3
  180. pygpt_net/data/config/modes.json +3 -3
  181. pygpt_net/data/config/settings.json +55 -10
  182. pygpt_net/data/config/settings_section.json +3 -0
  183. pygpt_net/data/css/style.light.css +1 -0
  184. pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
  185. pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
  186. pygpt_net/data/css/web-chatgpt.css +350 -0
  187. pygpt_net/data/css/web-chatgpt.dark.css +64 -0
  188. pygpt_net/data/css/web-chatgpt.light.css +75 -0
  189. pygpt_net/data/css/web-chatgpt_wide.css +350 -0
  190. pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
  191. pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
  192. pygpt_net/data/icons/split_screen.svg +1 -0
  193. pygpt_net/data/locale/locale.de.ini +12 -0
  194. pygpt_net/data/locale/locale.en.ini +18 -2
  195. pygpt_net/data/locale/locale.es.ini +12 -0
  196. pygpt_net/data/locale/locale.fr.ini +12 -0
  197. pygpt_net/data/locale/locale.it.ini +12 -0
  198. pygpt_net/data/locale/locale.pl.ini +12 -0
  199. pygpt_net/data/locale/locale.uk.ini +12 -0
  200. pygpt_net/data/locale/locale.zh.ini +12 -0
  201. pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
  202. pygpt_net/data/locale/plugin.cmd_web.en.ini +22 -10
  203. pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
  204. pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
  205. pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
  206. pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
  207. pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
  208. pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
  209. pygpt_net/data/locale/plugin.mailer.en.ini +21 -0
  210. pygpt_net/icons.qrc +1 -0
  211. pygpt_net/icons_rc.py +165 -136
  212. pygpt_net/item/ctx.py +58 -25
  213. pygpt_net/plugin/agent/__init__.py +7 -2
  214. pygpt_net/plugin/audio_input/simple.py +21 -5
  215. pygpt_net/plugin/audio_output/__init__.py +9 -1
  216. pygpt_net/plugin/base/config.py +4 -2
  217. pygpt_net/plugin/base/plugin.py +75 -23
  218. pygpt_net/plugin/base/worker.py +42 -11
  219. pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
  220. pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
  221. pygpt_net/plugin/cmd_history/config.py +2 -2
  222. pygpt_net/plugin/cmd_web/__init__.py +48 -9
  223. pygpt_net/plugin/cmd_web/config.py +135 -41
  224. pygpt_net/plugin/cmd_web/websearch.py +74 -33
  225. pygpt_net/plugin/cmd_web/worker.py +142 -13
  226. pygpt_net/plugin/idx_llama_index/config.py +3 -3
  227. pygpt_net/plugin/mailer/__init__.py +123 -0
  228. pygpt_net/plugin/mailer/config.py +149 -0
  229. pygpt_net/plugin/mailer/runner.py +285 -0
  230. pygpt_net/plugin/mailer/worker.py +123 -0
  231. pygpt_net/provider/agents/base.py +5 -2
  232. pygpt_net/provider/agents/openai.py +4 -2
  233. pygpt_net/provider/agents/openai_assistant.py +4 -2
  234. pygpt_net/provider/agents/planner.py +4 -2
  235. pygpt_net/provider/agents/react.py +4 -2
  236. pygpt_net/provider/audio_output/openai_tts.py +5 -11
  237. pygpt_net/provider/core/assistant/base.py +5 -3
  238. pygpt_net/provider/core/assistant/json_file.py +8 -5
  239. pygpt_net/provider/core/assistant_file/base.py +4 -3
  240. pygpt_net/provider/core/assistant_file/db_sqlite/__init__.py +4 -3
  241. pygpt_net/provider/core/assistant_file/db_sqlite/storage.py +3 -2
  242. pygpt_net/provider/core/assistant_store/base.py +6 -4
  243. pygpt_net/provider/core/assistant_store/db_sqlite/__init__.py +5 -4
  244. pygpt_net/provider/core/assistant_store/db_sqlite/storage.py +5 -3
  245. pygpt_net/provider/core/attachment/base.py +5 -3
  246. pygpt_net/provider/core/attachment/json_file.py +4 -3
  247. pygpt_net/provider/core/calendar/base.py +5 -3
  248. pygpt_net/provider/core/calendar/db_sqlite/__init__.py +6 -5
  249. pygpt_net/provider/core/calendar/db_sqlite/storage.py +5 -4
  250. pygpt_net/provider/core/config/base.py +8 -6
  251. pygpt_net/provider/core/config/json_file.py +9 -7
  252. pygpt_net/provider/core/config/patch.py +43 -1
  253. pygpt_net/provider/core/ctx/base.py +30 -25
  254. pygpt_net/provider/core/ctx/db_sqlite/__init__.py +59 -34
  255. pygpt_net/provider/core/ctx/db_sqlite/storage.py +62 -30
  256. pygpt_net/provider/core/ctx/db_sqlite/utils.py +11 -9
  257. pygpt_net/provider/core/index/base.py +129 -23
  258. pygpt_net/provider/core/index/db_sqlite/__init__.py +130 -23
  259. pygpt_net/provider/core/index/db_sqlite/storage.py +130 -23
  260. pygpt_net/provider/core/index/db_sqlite/utils.py +4 -2
  261. pygpt_net/provider/core/mode/base.py +5 -3
  262. pygpt_net/provider/core/mode/json_file.py +7 -6
  263. pygpt_net/provider/core/model/base.py +6 -4
  264. pygpt_net/provider/core/model/json_file.py +9 -7
  265. pygpt_net/provider/core/notepad/base.py +5 -3
  266. pygpt_net/provider/core/notepad/db_sqlite/__init__.py +5 -4
  267. pygpt_net/provider/core/notepad/db_sqlite/storage.py +4 -3
  268. pygpt_net/provider/core/plugin_preset/base.py +4 -2
  269. pygpt_net/provider/core/plugin_preset/json_file.py +5 -3
  270. pygpt_net/provider/core/preset/base.py +6 -4
  271. pygpt_net/provider/core/preset/json_file.py +9 -9
  272. pygpt_net/provider/core/prompt/base.py +6 -3
  273. pygpt_net/provider/core/prompt/json_file.py +11 -6
  274. pygpt_net/provider/gpt/assistants.py +21 -11
  275. pygpt_net/provider/gpt/audio.py +6 -5
  276. pygpt_net/provider/gpt/chat.py +10 -7
  277. pygpt_net/provider/gpt/completion.py +11 -5
  278. pygpt_net/provider/gpt/image.py +9 -2
  279. pygpt_net/provider/gpt/store.py +53 -18
  280. pygpt_net/provider/gpt/vision.py +17 -11
  281. pygpt_net/provider/llms/anthropic.py +7 -2
  282. pygpt_net/provider/llms/azure_openai.py +26 -5
  283. pygpt_net/provider/llms/base.py +47 -9
  284. pygpt_net/provider/llms/google.py +7 -2
  285. pygpt_net/provider/llms/hugging_face.py +13 -3
  286. pygpt_net/provider/llms/hugging_face_api.py +18 -4
  287. pygpt_net/provider/llms/local.py +7 -2
  288. pygpt_net/provider/llms/ollama.py +30 -6
  289. pygpt_net/provider/llms/openai.py +32 -6
  290. pygpt_net/provider/vector_stores/__init__.py +45 -14
  291. pygpt_net/provider/vector_stores/base.py +35 -8
  292. pygpt_net/provider/vector_stores/chroma.py +13 -3
  293. pygpt_net/provider/vector_stores/ctx_attachment.py +31 -12
  294. pygpt_net/provider/vector_stores/elasticsearch.py +12 -3
  295. pygpt_net/provider/vector_stores/pinecode.py +12 -3
  296. pygpt_net/provider/vector_stores/redis.py +12 -3
  297. pygpt_net/provider/vector_stores/simple.py +12 -3
  298. pygpt_net/provider/vector_stores/temp.py +16 -4
  299. pygpt_net/provider/web/base.py +10 -3
  300. pygpt_net/provider/web/google_custom_search.py +9 -3
  301. pygpt_net/provider/web/microsoft_bing.py +9 -3
  302. pygpt_net/tools/__init__.py +20 -4
  303. pygpt_net/tools/audio_transcriber/__init__.py +4 -3
  304. pygpt_net/tools/base.py +28 -7
  305. pygpt_net/tools/code_interpreter/__init__.py +177 -77
  306. pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
  307. pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
  308. pygpt_net/tools/html_canvas/__init__.py +81 -25
  309. pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
  310. pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
  311. pygpt_net/tools/image_viewer/__init__.py +10 -4
  312. pygpt_net/tools/indexer/__init__.py +8 -7
  313. pygpt_net/tools/media_player/__init__.py +4 -3
  314. pygpt_net/tools/text_editor/__init__.py +36 -10
  315. pygpt_net/ui/base/context_menu.py +2 -2
  316. pygpt_net/ui/layout/chat/input.py +10 -18
  317. pygpt_net/ui/layout/chat/output.py +27 -45
  318. pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
  319. pygpt_net/ui/layout/toolbox/footer.py +18 -2
  320. pygpt_net/ui/main.py +2 -2
  321. pygpt_net/ui/menu/audio.py +12 -1
  322. pygpt_net/ui/menu/config.py +7 -11
  323. pygpt_net/ui/menu/debug.py +11 -1
  324. pygpt_net/ui/menu/theme.py +9 -2
  325. pygpt_net/ui/widget/filesystem/explorer.py +2 -2
  326. pygpt_net/ui/widget/lists/context.py +27 -5
  327. pygpt_net/ui/widget/tabs/Input.py +2 -2
  328. pygpt_net/ui/widget/tabs/body.py +2 -1
  329. pygpt_net/ui/widget/tabs/layout.py +195 -0
  330. pygpt_net/ui/widget/tabs/output.py +218 -55
  331. pygpt_net/ui/widget/textarea/html.py +11 -1
  332. pygpt_net/ui/widget/textarea/output.py +10 -1
  333. pygpt_net/ui/widget/textarea/search_input.py +4 -1
  334. pygpt_net/ui/widget/textarea/web.py +49 -9
  335. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/METADATA +177 -183
  336. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/RECORD +340 -325
  337. /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
  338. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/LICENSE +0 -0
  339. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/WHEEL +0 -0
  340. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/entry_points.txt +0 -0
@@ -6,12 +6,13 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.15 00:00:00 #
9
+ # Updated Date: 2024.12.14 22:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
13
13
  import os.path
14
14
  import shutil
15
+ from typing import Dict
15
16
 
16
17
  from PySide6.QtGui import QAction, QIcon
17
18
 
@@ -165,7 +166,7 @@ class MediaPlayer(BaseTool):
165
166
  else:
166
167
  self.close()
167
168
 
168
- def setup_menu(self) -> dict:
169
+ def setup_menu(self) -> Dict[str, QAction]:
169
170
  """
170
171
  Setup main menu
171
172
 
@@ -188,7 +189,7 @@ class MediaPlayer(BaseTool):
188
189
  self.dialog = VideoPlayer(self.window)
189
190
  self.dialog.setup()
190
191
 
191
- def get_lang_mappings(self) -> dict:
192
+ def get_lang_mappings(self) -> Dict[str, Dict]:
192
193
  """
193
194
  Get language mappings
194
195
 
@@ -6,17 +6,19 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.20 21:00:00 #
9
+ # Updated Date: 2024.12.14 22:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import hashlib
13
13
  import os
14
+ from typing import Dict, Optional
14
15
 
15
16
  from PySide6.QtGui import QAction, QIcon
16
17
  from PySide6.QtWidgets import QFileDialog
17
18
 
18
19
  from pygpt_net.tools.base import BaseTool
19
20
  from pygpt_net.tools.text_editor.ui.dialogs import DialogSpawner
21
+ from pygpt_net.ui.widget.dialog.base import BaseDialog
20
22
  from pygpt_net.utils import trans
21
23
 
22
24
 
@@ -47,7 +49,13 @@ class TextEditor(BaseTool):
47
49
  """
48
50
  return 'file_editor_' + hashlib.md5(file.encode('utf-8')).hexdigest()
49
51
 
50
- def open_file(self, id: str, auto_close: bool = True, force: bool = False, save: bool = False):
52
+ def open_file(
53
+ self,
54
+ id: str,
55
+ auto_close: bool = True,
56
+ force: bool = False,
57
+ save: bool = False
58
+ ):
51
59
  """
52
60
  Open text file dialog
53
61
 
@@ -73,7 +81,12 @@ class TextEditor(BaseTool):
73
81
  if path:
74
82
  self.open(path, id, auto_close)
75
83
 
76
- def clear(self, id: str = None, force: bool = False, save: bool = False):
84
+ def clear(
85
+ self,
86
+ id: str = None,
87
+ force: bool = False,
88
+ save: bool = False
89
+ ):
77
90
  """
78
91
  Clear current instance
79
92
 
@@ -101,8 +114,8 @@ class TextEditor(BaseTool):
101
114
 
102
115
  def open(
103
116
  self,
104
- file: str = None,
105
- current_id: str = None,
117
+ file: Optional[str] = None,
118
+ current_id: Optional[str] = None,
106
119
  auto_close: bool = True,
107
120
  force: bool = False):
108
121
  """
@@ -153,7 +166,11 @@ class TextEditor(BaseTool):
153
166
  else:
154
167
  self.window.core.filesystem.editor.clear(id) # clear editor if no file
155
168
 
156
- def close(self, id: str, save: bool = False):
169
+ def close(
170
+ self,
171
+ id: str,
172
+ save: bool = False
173
+ ):
157
174
  """
158
175
  Close file editor
159
176
 
@@ -180,7 +197,12 @@ class TextEditor(BaseTool):
180
197
  id = self.save_as_file(id)
181
198
  return id
182
199
 
183
- def restore(self, id: str, force: bool = False, save: bool = False):
200
+ def restore(
201
+ self,
202
+ id: str,
203
+ force: bool = False,
204
+ save: bool = False
205
+ ):
184
206
  """
185
207
  Restore file content
186
208
 
@@ -225,7 +247,7 @@ class TextEditor(BaseTool):
225
247
  self.window.core.filesystem.editor.save(id, path)
226
248
  return id
227
249
 
228
- def setup_menu(self) -> dict:
250
+ def setup_menu(self) -> Dict[str, QAction]:
229
251
  """
230
252
  Setup main menu
231
253
 
@@ -243,7 +265,11 @@ class TextEditor(BaseTool):
243
265
  )
244
266
  return actions
245
267
 
246
- def get_instance(self, type_id: str, dialog_id: str = None):
268
+ def get_instance(
269
+ self,
270
+ type_id: str,
271
+ dialog_id: Optional[str] = None
272
+ ) -> Optional[BaseDialog]:
247
273
  """
248
274
  Spawn and return dialog instance
249
275
 
@@ -254,7 +280,7 @@ class TextEditor(BaseTool):
254
280
  if type_id == "text_editor":
255
281
  return self.spawner.setup(dialog_id)
256
282
 
257
- def get_lang_mappings(self) -> dict:
283
+ def get_lang_mappings(self) -> Dict[str, Dict]:
258
284
  """
259
285
  Get language mappings
260
286
 
@@ -6,13 +6,13 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.03.25 10:00:00 #
9
+ # Updated Date: 2024.12.12 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtWidgets import QMenu
13
13
  from PySide6.QtGui import QAction, QIcon
14
14
 
15
- from pygpt_net.core.tabs import Tab
15
+ from pygpt_net.core.tabs.tab import Tab
16
16
  from pygpt_net.utils import trans
17
17
  import pygpt_net.icons_rc
18
18
 
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.23 00:00:00 #
9
+ # Updated Date: 2024.12.09 03:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
@@ -153,14 +153,6 @@ class Input:
153
153
  """
154
154
  # header (input label + input counter)
155
155
  self.window.ui.nodes['input.label'] = HelpLabel(trans("input.label"))
156
- self.window.ui.nodes['input.counter'] = QLabel("")
157
- self.window.ui.nodes['input.counter'].setToolTip(trans('tip.tokens.input'))
158
-
159
- # inline vision
160
- self.window.ui.nodes['inline.vision'] = HelpLabel(trans('inline.vision'))
161
- self.window.ui.nodes['inline.vision'].setVisible(False)
162
- self.window.ui.nodes['inline.vision'].setContentsMargins(0, 0, 0, 0)
163
- self.window.ui.nodes['inline.vision'].setToolTip(trans('vision.checkbox.tooltip'))
164
156
 
165
157
  # plugin audio input addon
166
158
  self.window.ui.plugin_addon['audio.input'] = AudioInput(self.window)
@@ -168,10 +160,10 @@ class Input:
168
160
 
169
161
  grid = QGridLayout()
170
162
 
171
- left_layout = QHBoxLayout()
172
- left_layout.addWidget(self.window.ui.nodes['input.label'])
173
- left_layout.addWidget(self.window.ui.nodes['inline.vision'])
174
- left_layout.addStretch(1)
163
+ #left_layout = QHBoxLayout()
164
+ #left_layout.addWidget(self.window.ui.nodes['input.label'])
165
+ #left_layout.addWidget(self.window.ui.nodes['inline.vision'])
166
+ #left_layout.addStretch(1)
175
167
 
176
168
  center_layout = QHBoxLayout()
177
169
  center_layout.addStretch()
@@ -179,13 +171,13 @@ class Input:
179
171
  center_layout.addWidget(self.window.ui.plugin_addon['audio.input.btn'])
180
172
  center_layout.addStretch()
181
173
 
182
- right_layout = QHBoxLayout()
183
- right_layout.addStretch(1)
184
- right_layout.addWidget(self.window.ui.nodes['input.counter'])
174
+ #right_layout = QHBoxLayout()
175
+ #right_layout.addStretch(1)
176
+ #right_layout.addWidget(self.window.ui.nodes['input.counter'])
185
177
 
186
- grid.addLayout(left_layout, 0, 0)
178
+ #grid.addLayout(left_layout, 0, 0)
187
179
  grid.addLayout(center_layout, 0, 1, alignment=Qt.AlignCenter)
188
- grid.addLayout(right_layout, 0, 2, alignment=Qt.AlignRight)
180
+ #grid.addLayout(right_layout, 0, 2, alignment=Qt.AlignRight)
189
181
 
190
182
  grid.setContentsMargins(0, 0, 0, 0)
191
183
  return grid
@@ -6,18 +6,17 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.18 00:00:00 #
9
+ # Updated Date: 2024.12.14 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
13
- from PySide6.QtGui import QIcon
14
13
  from PySide6.QtWidgets import QVBoxLayout, QLabel, QHBoxLayout, QCheckBox, QWidget, QSizePolicy, QPushButton, \
15
- QGridLayout, QSpacerItem, QWidgetItem, QLayout
14
+ QGridLayout, QWidgetItem, QLayout
16
15
 
17
16
  from pygpt_net.ui.widget.audio.output import AudioOutput
18
17
  from pygpt_net.ui.widget.element.labels import ChatStatusLabel, IconLabel, HelpLabel
19
- from pygpt_net.ui.widget.tabs.output import OutputTabs
20
- from pygpt_net.ui.widget.anims.loader import Loader, Loading
18
+ from pygpt_net.ui.widget.anims.loader import Loading
19
+ from pygpt_net.ui.widget.tabs.layout import OutputLayout
21
20
 
22
21
  from .explorer import Explorer
23
22
  from .input import Input
@@ -28,6 +27,7 @@ from pygpt_net.utils import trans
28
27
  import pygpt_net.icons_rc
29
28
 
30
29
 
30
+
31
31
  class Output:
32
32
  def __init__(self, window=None):
33
33
  """
@@ -47,46 +47,15 @@ class Output:
47
47
 
48
48
  :return: QWidget
49
49
  """
50
- # tabs
51
- self.window.ui.tabs['output'] = OutputTabs(self.window)
52
-
53
- # Create the [+] button
54
- plus_button = QPushButton(QIcon(":/icons/add.svg"), "")
55
- plus_button.setFixedSize(30, 25)
56
- plus_button.setFlat(True)
57
- plus_button.clicked.connect(self.window.controller.ui.tabs.new_tab)
58
- plus_button.setObjectName('tab-add')
59
- plus_button.setProperty('tabAdd', True)
60
- plus_button.setToolTip(trans('action.tab.add.chat'))
61
-
62
- # Add the button to the top right corner of the tab bar
63
- self.window.ui.tabs['output'].setCornerWidget(plus_button, corner=Qt.TopRightCorner)
64
-
65
- # create empty tabs
50
+ # prepare columns
51
+ self.window.ui.layout = OutputLayout(self.window)
52
+
53
+ # create empty containers for chat output
66
54
  self.window.ui.nodes['output'] = {}
67
55
  self.window.ui.nodes['output_plain'] = {}
68
56
 
69
- # connect signals
70
- self.window.ui.tabs['output'].currentChanged.connect(
71
- self.window.controller.ui.tabs.on_tab_changed
72
- )
73
- self.window.ui.tabs['output'].tabBarClicked.connect(
74
- self.window.controller.ui.tabs.on_tab_clicked
75
- )
76
- self.window.ui.tabs['output'].tabBarDoubleClicked.connect(
77
- self.window.controller.ui.tabs.on_tab_dbl_clicked
78
- )
79
- self.window.ui.tabs['output'].tabCloseRequested.connect(
80
- self.window.controller.ui.tabs.on_tab_closed
81
- )
82
-
83
- # tab bar signals
84
- self.window.ui.tabs['output'].tabBar().tabMoved.connect(
85
- self.window.controller.ui.tabs.on_tab_moved
86
- )
87
-
88
57
  layout = QVBoxLayout()
89
- layout.addWidget(self.window.ui.tabs['output'])
58
+ layout.addWidget(self.window.ui.layout)
90
59
  layout.addLayout(self.setup_bottom())
91
60
  layout.setContentsMargins(0, 5, 0, 0)
92
61
 
@@ -177,18 +146,29 @@ class Output:
177
146
  self.window.ui.nodes['prompt.context'].setToolTip(trans('tip.tokens.ctx'))
178
147
  self.window.ui.nodes['prompt.context'].setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
179
148
 
149
+ self.window.ui.nodes['input.counter'] = ChatStatusLabel("")
150
+ self.window.ui.nodes['input.counter'].setToolTip(trans('tip.tokens.input'))
151
+ self.window.ui.nodes['input.counter'].setWordWrap(False)
152
+
180
153
  # plugin audio output addon
181
154
  self.window.ui.plugin_addon['audio.output'] = AudioOutput(self.window)
182
155
 
183
156
  # schedule
184
157
  self.window.ui.plugin_addon['schedule'] = ChatStatusLabel("")
185
158
 
159
+ # inline vision
160
+ self.window.ui.nodes['inline.vision'] = HelpLabel(trans('inline.vision'))
161
+ self.window.ui.nodes['inline.vision'].setVisible(False)
162
+ self.window.ui.nodes['inline.vision'].setContentsMargins(0, 0, 0, 0)
163
+ self.window.ui.nodes['inline.vision'].setToolTip(trans('vision.checkbox.tooltip'))
164
+
186
165
  opts_layout = QHBoxLayout()
187
166
  # opts_layout.setSpacing(2) #
188
167
  opts_layout.setContentsMargins(0, 0, 0, 0)
189
168
  opts_layout.addWidget(self.window.ui.nodes['output.timestamp'])
190
169
  # opts_layout.addWidget(self.window.ui.nodes['output.edit'])
191
170
  opts_layout.addWidget(self.window.ui.nodes['output.raw'])
171
+ opts_layout.addWidget(self.window.ui.nodes['inline.vision'])
192
172
  opts_layout.setAlignment(Qt.AlignLeft)
193
173
 
194
174
  left_layout = QHBoxLayout()
@@ -210,7 +190,9 @@ class Output:
210
190
  right_layout.addWidget(self.window.ui.nodes['chat.model'])
211
191
  right_layout.addWidget(QLabel(" "))
212
192
  right_layout.addWidget(self.window.ui.nodes['prompt.context'])
213
- right_layout.setContentsMargins(0, 0, 0, 0)
193
+ right_layout.addWidget(QLabel(" "))
194
+ right_layout.addWidget(self.window.ui.nodes['input.counter'])
195
+ right_layout.setContentsMargins(0, 8, 20, 0)
214
196
 
215
197
  left_widget = QWidget()
216
198
  left_widget.setLayout(left_layout)
@@ -224,14 +206,14 @@ class Output:
224
206
 
225
207
  left_layout = QHBoxLayout()
226
208
  left_layout.addWidget(left_widget)
227
- left_layout.addStretch(1)
209
+ #left_layout.addStretch(1)
228
210
  left_layout.setContentsMargins(0, 0, 0, 0)
229
211
 
230
212
  center_layout = QHBoxLayout()
231
- center_layout.addStretch()
213
+ #center_layout.addStretch()
232
214
  center_layout.addWidget(self.window.ui.nodes['anim.loading'])
233
215
  center_layout.addStretch()
234
- center_layout.setContentsMargins(0, 0, 0, 0)
216
+ center_layout.setContentsMargins(20, 0, 0, 0)
235
217
 
236
218
  right_layout = QHBoxLayout()
237
219
  right_layout.addStretch(1)
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.05 23:00:00 #
9
+ # Updated Date: 2024.12.12 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6 import QtCore
@@ -211,10 +211,19 @@ class CtxList:
211
211
  item.dt = dt
212
212
  item.isPinned = data.important
213
213
  item.setData(tooltip_text, QtCore.Qt.ToolTipRole)
214
+ is_important = False
215
+ is_attachment = False
216
+ label = data.label
214
217
  if data.important:
215
- item.setData(data.label + 10, QtCore.Qt.ItemDataRole.UserRole)
216
- else:
217
- item.setData(data.label, QtCore.Qt.ItemDataRole.UserRole)
218
+ is_important = True
219
+ if data.additional_ctx and len(data.additional_ctx) > 0:
220
+ is_attachment = True
221
+ custom_data = {
222
+ "label": label,
223
+ "is_important": is_important,
224
+ "is_attachment": is_attachment,
225
+ }
226
+ item.setData(custom_data, QtCore.Qt.ItemDataRole.UserRole)
218
227
  item.setData(name)
219
228
  return item
220
229
 
@@ -6,14 +6,14 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.17 03:00:00 #
9
+ # Updated Date: 2024.12.09 03:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
13
 
14
14
  from PySide6.QtCore import QSize
15
15
  from PySide6.QtGui import QIcon
16
- from PySide6.QtWidgets import QVBoxLayout, QLabel, QPushButton, QWidget, QSizePolicy
16
+ from PySide6.QtWidgets import QVBoxLayout, QLabel, QPushButton, QWidget, QSizePolicy, QHBoxLayout
17
17
 
18
18
  from pygpt_net.ui.widget.textarea.name import NameInput
19
19
  from pygpt_net.ui.widget.option.slider import OptionSlider
@@ -25,6 +25,7 @@ from .agent_llama import AgentLlama
25
25
  from .image import Image
26
26
  from .indexes import Indexes
27
27
  from .vision import Vision
28
+ from ...widget.option.toggle_label import ToggleLabel
28
29
 
29
30
 
30
31
  class Footer:
@@ -75,6 +76,21 @@ class Footer:
75
76
  rows.addWidget(self.window.ui.nodes['voice.control.btn'])
76
77
  rows.setContentsMargins(2, 0, 0, 0)
77
78
 
79
+ self.window.ui.nodes['layout.split'] = ToggleLabel(trans('layout.split'), label_position="left",
80
+ icon=":/icons/split_screen.svg")
81
+ self.window.ui.nodes['layout.split'].box.stateChanged.connect(
82
+ lambda: self.window.controller.ui.tabs.toggle_split_screen(self.window.ui.nodes['layout.split'].box.isChecked())
83
+ )
84
+ split_layout = QHBoxLayout()
85
+
86
+ split_layout.addWidget(QLabel(""))
87
+ split_layout.addStretch(1)
88
+ split_layout.addWidget(self.window.ui.nodes['layout.split'])
89
+ split_layout.setContentsMargins(5, 0, 15, 0)
90
+ split_widget = QWidget()
91
+ split_widget.setLayout(split_layout)
92
+ rows.addWidget(split_widget)
93
+
78
94
  # logo
79
95
  logo_button = self.setup_logo()
80
96
 
pygpt_net/ui/main.py CHANGED
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.21 17:00:00 #
9
+ # Updated Date: 2024.12.09 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -192,8 +192,8 @@ class MainWindow(QMainWindow, QtStyleTools):
192
192
 
193
193
  def setup(self):
194
194
  """Setup app"""
195
- self.controller.setup()
196
195
  self.tools.setup()
196
+ self.controller.setup()
197
197
  self.controller.plugins.setup()
198
198
  self.controller.post_setup()
199
199
 
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.05.05 12:00:00 #
9
+ # Updated Date: 2024.12.14 18:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtGui import QAction, QIcon
@@ -52,6 +52,13 @@ class Audio:
52
52
  checkable=False,
53
53
  )
54
54
 
55
+ self.window.ui.menu['audio.stop'] = QAction(
56
+ QIcon(":/icons/mute.svg"),
57
+ trans("menu.audio.stop"),
58
+ self.window,
59
+ checkable=False,
60
+ )
61
+
55
62
  self.window.ui.menu['audio.output'].triggered.connect(
56
63
  lambda: self.window.controller.plugins.toggle('audio_output')
57
64
  )
@@ -67,6 +74,9 @@ class Audio:
67
74
  self.window.ui.menu['audio.cache.clear'].triggered.connect(
68
75
  lambda: self.window.controller.audio.clear_cache()
69
76
  )
77
+ self.window.ui.menu['audio.stop'].triggered.connect(
78
+ lambda: self.window.controller.audio.stop_audio()
79
+ )
70
80
 
71
81
  self.window.ui.menu['menu.audio'] = self.window.menuBar().addMenu(trans("menu.audio"))
72
82
  self.window.ui.menu['menu.audio'].addAction(self.window.ui.menu['audio.input'])
@@ -76,3 +86,4 @@ class Audio:
76
86
  self.window.ui.menu['menu.audio'].addAction(self.window.ui.menu['audio.control.global'])
77
87
  self.window.ui.menu['menu.audio'].addSeparator()
78
88
  self.window.ui.menu['menu.audio'].addAction(self.window.ui.menu['audio.cache.clear'])
89
+ self.window.ui.menu['menu.audio'].addAction(self.window.ui.menu['audio.stop'])
@@ -6,9 +6,11 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.05.02 19:00:00 #
9
+ # Updated Date: 2024.12.07 21:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ import os
13
+
12
14
  from PySide6.QtGui import QAction, QIcon
13
15
  from PySide6.QtWidgets import QMenu
14
16
 
@@ -42,16 +44,10 @@ class Config:
42
44
  self.window.ui.menu['config.access'] = QAction(QIcon(":/icons/accessibility.svg"),
43
45
  trans("menu.config.access"), self.window)
44
46
 
45
- css_files = []
46
- css_files.append("style.css")
47
- css_files.append("style.dark.css")
48
- css_files.append("style.light.css")
49
- css_files.append("markdown.css")
50
- css_files.append("markdown.dark.css")
51
- css_files.append("markdown.light.css")
52
- css_files.append("web.css")
53
- css_files.append("web.dark.css")
54
- css_files.append("web.light.css")
47
+ css_dir = os.path.join(self.window.core.config.path, 'css')
48
+ css_files = os.listdir(css_dir)
49
+ css_files = [f for f in css_files if not f.endswith('.backup')] # remove .backup files
50
+ css_files = sorted(css_files) # sort by name
55
51
 
56
52
  json_files = []
57
53
  json_files.append("attachments.json")
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.08 18:00:00 #
9
+ # Updated Date: 2024.12.13 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtGui import QAction
@@ -41,6 +41,7 @@ class Debug:
41
41
  self.window.ui.menu['debug.logger'] = QAction(trans("menu.debug.logger"), self.window, checkable=True)
42
42
  self.window.ui.menu['debug.app.log'] = QAction(trans("menu.debug.app.log"), self.window, checkable=True)
43
43
  self.window.ui.menu['debug.kernel'] = QAction(trans("menu.debug.kernel"), self.window, checkable=True)
44
+ self.window.ui.menu['debug.render'] = QAction(trans("menu.debug.render"), self.window, checkable=True)
44
45
 
45
46
  self.window.ui.menu['debug.config'].triggered.connect(
46
47
  lambda: self.window.controller.debug.toggle('config'))
@@ -74,9 +75,12 @@ class Debug:
74
75
  lambda: self.window.controller.debug.toggle('db'))
75
76
  self.window.ui.menu['debug.kernel'].triggered.connect(
76
77
  lambda: self.window.controller.debug.toggle('kernel'))
78
+ self.window.ui.menu['debug.render'].triggered.connect(
79
+ lambda: self.window.controller.debug.toggle_render())
77
80
 
78
81
  self.window.ui.menu['menu.debug'] = self.window.menuBar().addMenu(trans("menu.debug"))
79
82
  self.window.ui.menu['menu.debug'].addAction(self.window.ui.menu['debug.logger'])
83
+ self.window.ui.menu['menu.debug'].addAction(self.window.ui.menu['debug.render'])
80
84
  self.window.ui.menu['menu.debug'].addAction(self.window.ui.menu['debug.db'])
81
85
  self.window.ui.menu['menu.debug'].addAction(self.window.ui.menu['debug.app.log'])
82
86
  self.window.ui.menu['menu.debug'].addSeparator()
@@ -94,4 +98,10 @@ class Debug:
94
98
  self.window.ui.menu['menu.debug'].addAction(self.window.ui.menu['debug.tabs'])
95
99
  self.window.ui.menu['menu.debug'].addAction(self.window.ui.menu['debug.ui'])
96
100
 
101
+ # restore state
102
+ if self.window.core.config.get('debug.render'):
103
+ self.window.ui.menu['debug.render'].setChecked(True)
104
+ else:
105
+ self.window.ui.menu['debug.render'].setChecked(False)
106
+
97
107
 
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.04.24 02:00:00 #
9
+ # Updated Date: 2024.12.07 21:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtGui import QAction, QIcon
@@ -28,10 +28,14 @@ class Theme:
28
28
  def setup(self):
29
29
  """Setup theme menu"""
30
30
  self.window.ui.menu['theme'] = {}
31
+ self.window.ui.menu['theme_style'] = {}
31
32
  self.window.ui.menu['theme_syntax'] = {}
32
33
  self.window.ui.menu['theme.layout.density'] = {}
33
34
  self.window.ui.menu['menu.theme'] = QMenu(trans("menu.theme"), self.window)
34
35
 
36
+ # styles
37
+ self.window.ui.menu['theme.style'] = QMenu(trans("menu.theme.style"), self.window)
38
+
35
39
  # color themes
36
40
  self.window.ui.menu['theme.dark'] = QMenu(trans("menu.theme.dark"), self.window)
37
41
  self.window.ui.menu['theme.light'] = QMenu(trans("menu.theme.light"), self.window)
@@ -40,12 +44,14 @@ class Theme:
40
44
  # layout density
41
45
  self.window.ui.menu['theme.density'] = QMenu(trans("menu.theme.density"), self.window)
42
46
 
47
+ """
43
48
  # blocks
44
49
  self.window.ui.menu['theme.blocks'] = QAction(trans("menu.theme.blocks"), self.window, checkable=True)
45
50
  self.window.ui.menu['theme.blocks'].triggered.connect(
46
51
  lambda: self.window.controller.theme.toggle_option('render.blocks'))
47
52
  self.window.ui.menu['theme.blocks'].setCheckable(True)
48
53
  self.window.ui.menu['theme.blocks'].setChecked(self.window.core.config.get('render.blocks'))
54
+ """
49
55
 
50
56
  # tooltips
51
57
  self.window.ui.menu['theme.tooltips'] = QAction(trans("menu.theme.tooltips"), self.window, checkable=True)
@@ -62,10 +68,11 @@ class Theme:
62
68
  self.window.ui.menu['theme.settings'].triggered.connect(
63
69
  lambda: self.window.controller.settings.open_section('layout'))
64
70
 
71
+ self.window.ui.menu['menu.theme'].addMenu(self.window.ui.menu['theme.style'])
65
72
  self.window.ui.menu['menu.theme'].addMenu(self.window.ui.menu['theme.dark'])
66
73
  self.window.ui.menu['menu.theme'].addMenu(self.window.ui.menu['theme.light'])
67
74
  self.window.ui.menu['menu.theme'].addMenu(self.window.ui.menu['theme.syntax'])
68
75
  self.window.ui.menu['menu.theme'].addMenu(self.window.ui.menu['theme.density'])
69
- self.window.ui.menu['menu.theme'].addAction(self.window.ui.menu['theme.blocks'])
76
+ # self.window.ui.menu['menu.theme'].addAction(self.window.ui.menu['theme.blocks'])
70
77
  self.window.ui.menu['menu.theme'].addAction(self.window.ui.menu['theme.tooltips'])
71
78
  self.window.ui.menu['menu.theme'].addAction(self.window.ui.menu['theme.settings'])
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.05 23:00:00 #
9
+ # Updated Date: 2024.12.12 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
@@ -17,7 +17,7 @@ from PySide6.QtGui import QAction, QIcon, QCursor, QResizeEvent
17
17
  from PySide6.QtWidgets import QTreeView, QMenu, QWidget, QVBoxLayout, QFileSystemModel, QLabel, QHBoxLayout, \
18
18
  QPushButton, QSizePolicy
19
19
 
20
- from pygpt_net.core.tabs import Tab
20
+ from pygpt_net.core.tabs.tab import Tab
21
21
  from pygpt_net.ui.widget.element.button import ContextMenuButton
22
22
  from pygpt_net.ui.widget.element.labels import HelpLabel
23
23
  from pygpt_net.utils import trans