pygpt-net 2.4.37__py3-none-any.whl → 2.4.41__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 (255) hide show
  1. CHANGELOG.md +29 -0
  2. README.md +44 -115
  3. pygpt_net/CHANGELOG.txt +29 -0
  4. pygpt_net/__init__.py +3 -3
  5. pygpt_net/controller/__init__.py +7 -3
  6. pygpt_net/controller/access/control.py +1 -1
  7. pygpt_net/controller/access/voice.py +11 -5
  8. pygpt_net/controller/agent/experts.py +11 -6
  9. pygpt_net/controller/agent/legacy.py +8 -6
  10. pygpt_net/controller/agent/llama.py +4 -2
  11. pygpt_net/controller/assistant/__init__.py +9 -4
  12. pygpt_net/controller/assistant/batch.py +38 -21
  13. pygpt_net/controller/assistant/editor.py +7 -6
  14. pygpt_net/controller/assistant/files.py +23 -7
  15. pygpt_net/controller/assistant/store.py +20 -7
  16. pygpt_net/controller/assistant/threads.py +34 -8
  17. pygpt_net/controller/attachment.py +29 -10
  18. pygpt_net/controller/audio/__init__.py +25 -4
  19. pygpt_net/controller/calendar/__init__.py +23 -4
  20. pygpt_net/controller/calendar/note.py +57 -11
  21. pygpt_net/controller/camera.py +3 -2
  22. pygpt_net/controller/chat/__init__.py +5 -3
  23. pygpt_net/controller/chat/attachment.py +34 -7
  24. pygpt_net/controller/chat/command.py +4 -2
  25. pygpt_net/controller/chat/common.py +11 -4
  26. pygpt_net/controller/chat/files.py +10 -3
  27. pygpt_net/controller/chat/image.py +17 -5
  28. pygpt_net/controller/chat/input.py +10 -7
  29. pygpt_net/controller/chat/output.py +21 -6
  30. pygpt_net/controller/chat/render.py +100 -21
  31. pygpt_net/controller/chat/response.py +34 -7
  32. pygpt_net/controller/chat/stream.py +4 -2
  33. pygpt_net/controller/chat/text.py +6 -4
  34. pygpt_net/controller/command.py +11 -3
  35. pygpt_net/controller/config/__init__.py +34 -6
  36. pygpt_net/controller/config/field/checkbox.py +7 -4
  37. pygpt_net/controller/config/field/cmd.py +7 -5
  38. pygpt_net/controller/config/field/combo.py +14 -6
  39. pygpt_net/controller/config/field/dictionary.py +14 -11
  40. pygpt_net/controller/config/field/input.py +9 -6
  41. pygpt_net/controller/config/field/slider.py +11 -8
  42. pygpt_net/controller/config/field/textarea.py +8 -5
  43. pygpt_net/controller/config/placeholder.py +52 -21
  44. pygpt_net/controller/ctx/__init__.py +138 -49
  45. pygpt_net/controller/ctx/common.py +15 -4
  46. pygpt_net/controller/ctx/extra.py +11 -3
  47. pygpt_net/controller/ctx/summarizer.py +24 -5
  48. pygpt_net/controller/debug/__init__.py +27 -6
  49. pygpt_net/controller/dialogs/confirm.py +34 -7
  50. pygpt_net/controller/dialogs/debug.py +4 -2
  51. pygpt_net/controller/dialogs/info.py +7 -2
  52. pygpt_net/controller/files.py +48 -10
  53. pygpt_net/controller/finder.py +11 -5
  54. pygpt_net/controller/idx/__init__.py +10 -3
  55. pygpt_net/controller/idx/common.py +4 -2
  56. pygpt_net/controller/idx/indexer.py +25 -17
  57. pygpt_net/controller/idx/settings.py +9 -3
  58. pygpt_net/controller/kernel/__init__.py +34 -8
  59. pygpt_net/controller/kernel/reply.py +12 -3
  60. pygpt_net/controller/kernel/stack.py +5 -3
  61. pygpt_net/controller/lang/custom.py +2 -7
  62. pygpt_net/controller/lang/mapping.py +5 -3
  63. pygpt_net/controller/layout.py +2 -2
  64. pygpt_net/controller/mode.py +16 -4
  65. pygpt_net/controller/model/__init__.py +14 -3
  66. pygpt_net/controller/model/editor.py +8 -3
  67. pygpt_net/controller/notepad.py +26 -12
  68. pygpt_net/controller/painter/capture.py +23 -4
  69. pygpt_net/controller/painter/common.py +9 -7
  70. pygpt_net/controller/plugins/__init__.py +19 -5
  71. pygpt_net/controller/plugins/presets.py +15 -6
  72. pygpt_net/controller/plugins/settings.py +9 -3
  73. pygpt_net/controller/presets/__init__.py +55 -16
  74. pygpt_net/controller/presets/editor.py +26 -10
  75. pygpt_net/controller/settings/__init__.py +3 -2
  76. pygpt_net/controller/settings/editor.py +29 -7
  77. pygpt_net/controller/settings/profile.py +22 -5
  78. pygpt_net/controller/theme/__init__.py +54 -12
  79. pygpt_net/controller/theme/common.py +24 -2
  80. pygpt_net/controller/theme/markdown.py +32 -16
  81. pygpt_net/controller/theme/menu.py +26 -5
  82. pygpt_net/controller/theme/nodes.py +2 -5
  83. pygpt_net/controller/tools/__init__.py +40 -2
  84. pygpt_net/controller/ui/__init__.py +4 -6
  85. pygpt_net/controller/ui/tabs.py +363 -65
  86. pygpt_net/core/access/actions.py +6 -4
  87. pygpt_net/core/access/shortcuts.py +4 -3
  88. pygpt_net/core/access/voice.py +6 -5
  89. pygpt_net/core/agents/legacy.py +4 -2
  90. pygpt_net/core/agents/memory.py +7 -2
  91. pygpt_net/core/agents/observer/evaluation.py +15 -7
  92. pygpt_net/core/agents/provider.py +9 -4
  93. pygpt_net/core/agents/runner.py +61 -15
  94. pygpt_net/core/agents/tools.py +23 -5
  95. pygpt_net/core/assistants/__init__.py +6 -4
  96. pygpt_net/core/assistants/files.py +35 -12
  97. pygpt_net/core/assistants/store.py +20 -10
  98. pygpt_net/core/attachments/__init__.py +54 -15
  99. pygpt_net/core/attachments/context.py +92 -29
  100. pygpt_net/core/audio/__init__.py +71 -3
  101. pygpt_net/core/audio/context.py +7 -2
  102. pygpt_net/core/bridge/__init__.py +22 -6
  103. pygpt_net/core/bridge/context.py +5 -3
  104. pygpt_net/core/calendar/__init__.py +57 -11
  105. pygpt_net/core/chain/__init__.py +8 -2
  106. pygpt_net/core/chain/chat.py +10 -8
  107. pygpt_net/core/chain/completion.py +10 -7
  108. pygpt_net/core/command.py +62 -17
  109. pygpt_net/core/ctx/__init__.py +260 -58
  110. pygpt_net/core/ctx/bag.py +25 -4
  111. pygpt_net/core/ctx/container.py +28 -17
  112. pygpt_net/core/ctx/idx.py +45 -8
  113. pygpt_net/core/ctx/output.py +95 -74
  114. pygpt_net/core/ctx/reply.py +5 -2
  115. pygpt_net/core/db/__init__.py +8 -7
  116. pygpt_net/core/db/viewer.py +17 -11
  117. pygpt_net/core/debug/__init__.py +10 -9
  118. pygpt_net/core/debug/tabs.py +5 -2
  119. pygpt_net/core/docker/__init__.py +11 -5
  120. pygpt_net/core/docker/builder.py +11 -3
  121. pygpt_net/core/events/app.py +5 -3
  122. pygpt_net/core/events/base.py +11 -5
  123. pygpt_net/core/events/control.py +5 -3
  124. pygpt_net/core/events/event.py +17 -7
  125. pygpt_net/core/events/kernel.py +5 -3
  126. pygpt_net/core/events/render.py +5 -3
  127. pygpt_net/core/experts/__init__.py +5 -4
  128. pygpt_net/core/filesystem/__init__.py +52 -34
  129. pygpt_net/core/filesystem/actions.py +8 -5
  130. pygpt_net/core/filesystem/editor.py +13 -3
  131. pygpt_net/core/filesystem/types.py +12 -7
  132. pygpt_net/core/filesystem/url.py +7 -3
  133. pygpt_net/core/idx/__init__.py +34 -25
  134. pygpt_net/core/idx/chat.py +40 -16
  135. pygpt_net/core/idx/context.py +6 -2
  136. pygpt_net/core/idx/indexing.py +84 -35
  137. pygpt_net/core/idx/llm.py +11 -3
  138. pygpt_net/core/idx/metadata.py +13 -3
  139. pygpt_net/core/idx/types/ctx.py +32 -6
  140. pygpt_net/core/idx/types/external.py +41 -7
  141. pygpt_net/core/idx/types/files.py +31 -6
  142. pygpt_net/core/image.py +15 -4
  143. pygpt_net/core/llm/__init__.py +13 -3
  144. pygpt_net/core/locale.py +34 -8
  145. pygpt_net/core/models.py +4 -3
  146. pygpt_net/core/notepad.py +9 -4
  147. pygpt_net/core/plugins.py +7 -6
  148. pygpt_net/core/presets.py +19 -10
  149. pygpt_net/core/profile.py +12 -6
  150. pygpt_net/core/prompt/__init__.py +10 -3
  151. pygpt_net/core/prompt/custom.py +7 -6
  152. pygpt_net/core/prompt/template.py +9 -3
  153. pygpt_net/core/render/base.py +117 -22
  154. pygpt_net/core/render/markdown/body.py +27 -7
  155. pygpt_net/core/render/markdown/renderer.py +119 -22
  156. pygpt_net/core/render/plain/body.py +22 -5
  157. pygpt_net/core/render/plain/renderer.py +97 -21
  158. pygpt_net/core/render/web/body.py +75 -25
  159. pygpt_net/core/render/web/renderer.py +313 -63
  160. pygpt_net/core/settings.py +9 -4
  161. pygpt_net/core/tabs/__init__.py +290 -103
  162. pygpt_net/core/tabs/tab.py +17 -4
  163. pygpt_net/core/tokens.py +44 -11
  164. pygpt_net/core/updater/__init__.py +20 -7
  165. pygpt_net/core/vision/analyzer.py +29 -6
  166. pygpt_net/core/web.py +130 -2
  167. pygpt_net/data/config/config.json +15 -4
  168. pygpt_net/data/config/models.json +3 -3
  169. pygpt_net/data/config/modes.json +3 -3
  170. pygpt_net/data/config/settings.json +55 -10
  171. pygpt_net/data/config/settings_section.json +3 -0
  172. pygpt_net/data/css/style.light.css +1 -0
  173. pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
  174. pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
  175. pygpt_net/data/css/web-chatgpt.css +350 -0
  176. pygpt_net/data/css/web-chatgpt.dark.css +64 -0
  177. pygpt_net/data/css/web-chatgpt.light.css +75 -0
  178. pygpt_net/data/css/web-chatgpt_wide.css +350 -0
  179. pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
  180. pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
  181. pygpt_net/data/icons/split_screen.svg +1 -0
  182. pygpt_net/data/locale/locale.de.ini +12 -0
  183. pygpt_net/data/locale/locale.en.ini +17 -2
  184. pygpt_net/data/locale/locale.es.ini +12 -0
  185. pygpt_net/data/locale/locale.fr.ini +12 -0
  186. pygpt_net/data/locale/locale.it.ini +12 -0
  187. pygpt_net/data/locale/locale.pl.ini +12 -0
  188. pygpt_net/data/locale/locale.uk.ini +12 -0
  189. pygpt_net/data/locale/locale.zh.ini +12 -0
  190. pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
  191. pygpt_net/data/locale/plugin.cmd_web.en.ini +20 -10
  192. pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
  193. pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
  194. pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
  195. pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
  196. pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
  197. pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
  198. pygpt_net/icons.qrc +1 -0
  199. pygpt_net/icons_rc.py +165 -136
  200. pygpt_net/item/ctx.py +46 -24
  201. pygpt_net/plugin/audio_input/simple.py +21 -5
  202. pygpt_net/plugin/audio_output/__init__.py +4 -1
  203. pygpt_net/plugin/base/config.py +4 -2
  204. pygpt_net/plugin/base/plugin.py +26 -6
  205. pygpt_net/plugin/base/worker.py +37 -9
  206. pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
  207. pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
  208. pygpt_net/plugin/cmd_web/__init__.py +46 -6
  209. pygpt_net/plugin/cmd_web/config.py +74 -48
  210. pygpt_net/plugin/cmd_web/websearch.py +61 -28
  211. pygpt_net/plugin/cmd_web/worker.py +79 -13
  212. pygpt_net/provider/core/config/patch.py +43 -1
  213. pygpt_net/provider/core/ctx/base.py +4 -1
  214. pygpt_net/provider/core/ctx/db_sqlite/__init__.py +10 -1
  215. pygpt_net/provider/core/ctx/db_sqlite/storage.py +22 -1
  216. pygpt_net/provider/gpt/assistants.py +10 -9
  217. pygpt_net/provider/gpt/audio.py +3 -2
  218. pygpt_net/provider/gpt/chat.py +8 -7
  219. pygpt_net/provider/gpt/completion.py +6 -4
  220. pygpt_net/provider/gpt/image.py +9 -2
  221. pygpt_net/provider/gpt/store.py +14 -13
  222. pygpt_net/provider/gpt/vision.py +6 -5
  223. pygpt_net/tools/__init__.py +9 -1
  224. pygpt_net/tools/base.py +15 -1
  225. pygpt_net/tools/code_interpreter/__init__.py +174 -75
  226. pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
  227. pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
  228. pygpt_net/tools/html_canvas/__init__.py +78 -23
  229. pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
  230. pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
  231. pygpt_net/ui/base/context_menu.py +2 -2
  232. pygpt_net/ui/layout/chat/input.py +10 -18
  233. pygpt_net/ui/layout/chat/output.py +26 -44
  234. pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
  235. pygpt_net/ui/layout/toolbox/footer.py +18 -2
  236. pygpt_net/ui/main.py +2 -2
  237. pygpt_net/ui/menu/config.py +7 -11
  238. pygpt_net/ui/menu/debug.py +11 -1
  239. pygpt_net/ui/menu/theme.py +9 -2
  240. pygpt_net/ui/widget/filesystem/explorer.py +2 -2
  241. pygpt_net/ui/widget/lists/context.py +27 -5
  242. pygpt_net/ui/widget/tabs/Input.py +2 -2
  243. pygpt_net/ui/widget/tabs/body.py +2 -1
  244. pygpt_net/ui/widget/tabs/layout.py +195 -0
  245. pygpt_net/ui/widget/tabs/output.py +218 -55
  246. pygpt_net/ui/widget/textarea/html.py +11 -1
  247. pygpt_net/ui/widget/textarea/output.py +10 -1
  248. pygpt_net/ui/widget/textarea/search_input.py +4 -1
  249. pygpt_net/ui/widget/textarea/web.py +49 -9
  250. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/METADATA +45 -116
  251. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/RECORD +255 -247
  252. /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
  253. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/LICENSE +0 -0
  254. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/WHEEL +0 -0
  255. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/entry_points.txt +0 -0
@@ -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
@@ -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.08.22 17:00:00 #
9
+ # Updated Date: 2024.12.12 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
@@ -402,11 +402,32 @@ class ImportantItemDelegate(QtWidgets.QStyledItemDelegate):
402
402
  super(ImportantItemDelegate, self).paint(painter, option, index)
403
403
 
404
404
  # pin (>= 10)
405
- if index.data(QtCore.Qt.ItemDataRole.UserRole) and index.data(QtCore.Qt.ItemDataRole.UserRole) > 0:
406
- label = index.data(QtCore.Qt.ItemDataRole.UserRole)
405
+ if index.data(QtCore.Qt.ItemDataRole.UserRole):
406
+ data = index.data(QtCore.Qt.ItemDataRole.UserRole)
407
+ label = 0
408
+ is_important = False
409
+ is_attachment = False
410
+ if "label" in data:
411
+ label = data["label"]
412
+ if "is_important" in data and data["is_important"]:
413
+ is_important = True
414
+ if "is_attachment" in data and data["is_attachment"]:
415
+ is_attachment = True
416
+
407
417
  painter.save()
408
418
 
409
- if label >= 10:
419
+ if is_attachment:
420
+ icon = QtGui.QIcon(":/icons/attachment.svg")
421
+ icon_size = option.decorationSize or QtCore.QSize(16, 16)
422
+ icon_rect = QtCore.QRect(
423
+ option.rect.right() - icon_size.width(),
424
+ option.rect.top() + (option.rect.height() - icon_size.height()) / 2,
425
+ icon_size.width(),
426
+ icon_size.height()
427
+ )
428
+ icon.paint(painter, icon_rect, QtCore.Qt.AlignCenter)
429
+
430
+ if is_important:
410
431
  color = self.get_color_for_status(3)
411
432
  square_size = 3
412
433
  square_margin = 0
@@ -426,7 +447,7 @@ class ImportantItemDelegate(QtWidgets.QStyledItemDelegate):
426
447
  )
427
448
  painter.drawRect(square_rect)
428
449
 
429
- label = label - 10 # remove pin status
450
+ #label = label - 10 # remove pin status
430
451
 
431
452
  # label (0-9)
432
453
  if label > 0:
@@ -494,3 +515,4 @@ class SectionItem(QStandardItem):
494
515
  self.setTextAlignment(QtCore.Qt.AlignRight)
495
516
  font = self.font()
496
517
  font.setBold(True)
518
+ self.setFont(font)
@@ -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.01.29 14:00:00 #
9
+ # Updated Date: 2024.12.09 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtWidgets import QTabWidget, QMenu
@@ -40,7 +40,7 @@ class InputTabs(QTabWidget):
40
40
 
41
41
  :param global_pos: QPoint
42
42
  """
43
- context_menu = QMenu()
43
+ context_menu = QMenu(self)
44
44
  actions = {}
45
45
  actions['clear'] = QAction(QIcon(":/icons/delete.svg"), trans('attachments.btn.clear'), self)
46
46
  actions['clear'].triggered.connect(
@@ -6,10 +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.11.05 23:00:00 #
9
+ # Updated Date: 2024.12.09 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtWidgets import QTabWidget
13
+
13
14
  from pygpt_net.core.tabs.tab import Tab
14
15
 
15
16
 
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2024.12.09 03:00:00 #
10
+ # ================================================== #
11
+
12
+ from PySide6.QtCore import Qt, QObject, QEvent
13
+ from PySide6.QtWidgets import QTabWidget, QWidget, QVBoxLayout, QSplitter, QSizePolicy
14
+
15
+ from pygpt_net.ui.widget.tabs.output import OutputTabs
16
+
17
+
18
+ class OutputColumn(QWidget):
19
+ def __init__(self, window=None):
20
+ """
21
+ Output column
22
+
23
+ :param window: window instance
24
+ """
25
+ super(OutputColumn, self).__init__(window)
26
+ self.window = window
27
+ self.idx = -1
28
+ self.tabs = OutputTabs(self.window, column=self)
29
+ self.layout = QVBoxLayout()
30
+ self.layout.addWidget(self.tabs)
31
+ self.layout.setContentsMargins(0, 0, 0, 0)
32
+ self.setLayout(self.layout)
33
+ self.filter = FocusEventFilter(self, self.on_focus)
34
+ self.installEventFilter(self.filter)
35
+ self.setFocusPolicy(Qt.StrongFocus)
36
+
37
+ def on_focus(self, widget):
38
+ """
39
+ On widget clicked
40
+
41
+ :param widget: widget
42
+ """
43
+ self.window.controller.ui.tabs.on_column_focus(self.idx)
44
+ widget.setFocus()
45
+
46
+ def set_idx(self, idx: int):
47
+ """
48
+ Set index
49
+
50
+ :param idx: int
51
+ """
52
+ self.idx = idx
53
+
54
+ def get_idx(self) -> int:
55
+ """
56
+ Get index
57
+
58
+ :return: int
59
+ """
60
+ return self.idx
61
+
62
+ def set_tabs(self, tabs: QTabWidget):
63
+ """
64
+ Set tabs widget
65
+
66
+ :param tabs: QTabWidget
67
+ """
68
+ self.tabs = tabs
69
+
70
+ def get_tabs(self) -> OutputTabs:
71
+ """
72
+ Get tabs
73
+
74
+ :return: OutputTabs
75
+ """
76
+ return self.tabs
77
+
78
+
79
+ class OutputLayout(QWidget):
80
+ def __init__(self, window=None):
81
+ """
82
+ Output layout
83
+
84
+ :param window: window instance
85
+ """
86
+ super(OutputLayout, self).__init__(window)
87
+ self.window = window
88
+ self.columns = []
89
+
90
+ column1 = OutputColumn(self.window)
91
+ column2 = OutputColumn(self.window)
92
+ self.add_column(column1)
93
+ self.add_column(column2)
94
+
95
+ self.splitter = QSplitter(Qt.Horizontal)
96
+ self.splitter.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
97
+ for column in self.columns:
98
+ self.splitter.addWidget(column)
99
+
100
+ self.window.ui.splitters['columns'] = self.splitter
101
+
102
+ self.layout = QVBoxLayout()
103
+ self.layout.addWidget(self.splitter, stretch=1)
104
+ self.layout.setContentsMargins(0, 0, 0, 0)
105
+ self.setLayout(self.layout)
106
+
107
+ def get_next_idx(self) -> int:
108
+ """
109
+ Get next index
110
+
111
+ :return: int
112
+ """
113
+ return len(self.columns)
114
+
115
+ def add_column(self, column: OutputColumn):
116
+ """
117
+ Add column
118
+
119
+ :param column: OutputColumn
120
+ """
121
+ idx = self.get_next_idx()
122
+ column.set_idx(idx)
123
+ self.columns.append(column)
124
+
125
+ def get_tabs_by_idx(self, idx: int) -> OutputTabs:
126
+ """
127
+ Get tabs by column index
128
+
129
+ :param idx: int
130
+ :return: OutputTabs
131
+ """
132
+ for column in self.columns:
133
+ if column.idx == idx:
134
+ return column.tabs
135
+ return None
136
+
137
+ def get_active_tabs(self) -> OutputTabs:
138
+ """
139
+ Get active tabs
140
+
141
+ :return: OutputTabs
142
+ """
143
+ current = self.window.controller.ui.tabs.get_current_column_idx()
144
+ for column in self.columns:
145
+ if column.idx == current:
146
+ return column.tabs
147
+
148
+ def get_column_by_idx(self, idx: int) -> OutputColumn:
149
+ """
150
+ Get column by index
151
+
152
+ :param idx: int
153
+ :return: OutputColumn
154
+ """
155
+ for column in self.columns:
156
+ if column.idx == idx:
157
+ return column
158
+ return None
159
+
160
+ def get_active_column(self) -> OutputColumn:
161
+ """
162
+ Get active column
163
+
164
+ :return: OutputColumn
165
+ """
166
+ current = self.window.controller.ui.tabs.get_current_column_idx()
167
+ for column in self.columns:
168
+ if column.idx == current:
169
+ return column
170
+
171
+ class FocusEventFilter(QObject):
172
+ def __init__(self, column, callback):
173
+ """
174
+ Column event filter
175
+
176
+ :param column: parent column
177
+ :param callback: callback
178
+ """
179
+ super().__init__()
180
+ self.column = column
181
+ self.callback = callback
182
+
183
+ def eventFilter(self, obj, event):
184
+ """
185
+ Click event filter
186
+
187
+ :param obj: object
188
+ :param event: event
189
+ """
190
+ if event.type() == QEvent.MouseButtonPress or event.type() == QEvent.FocusIn:
191
+ widget = obj
192
+ if widget is not None:
193
+ self.callback(widget)
194
+ return False
195
+ return False