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.
- CHANGELOG.md +29 -0
- README.md +44 -115
- pygpt_net/CHANGELOG.txt +29 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/controller/__init__.py +7 -3
- pygpt_net/controller/access/control.py +1 -1
- pygpt_net/controller/access/voice.py +11 -5
- pygpt_net/controller/agent/experts.py +11 -6
- pygpt_net/controller/agent/legacy.py +8 -6
- pygpt_net/controller/agent/llama.py +4 -2
- pygpt_net/controller/assistant/__init__.py +9 -4
- pygpt_net/controller/assistant/batch.py +38 -21
- pygpt_net/controller/assistant/editor.py +7 -6
- pygpt_net/controller/assistant/files.py +23 -7
- pygpt_net/controller/assistant/store.py +20 -7
- pygpt_net/controller/assistant/threads.py +34 -8
- pygpt_net/controller/attachment.py +29 -10
- pygpt_net/controller/audio/__init__.py +25 -4
- pygpt_net/controller/calendar/__init__.py +23 -4
- pygpt_net/controller/calendar/note.py +57 -11
- pygpt_net/controller/camera.py +3 -2
- pygpt_net/controller/chat/__init__.py +5 -3
- pygpt_net/controller/chat/attachment.py +34 -7
- pygpt_net/controller/chat/command.py +4 -2
- pygpt_net/controller/chat/common.py +11 -4
- pygpt_net/controller/chat/files.py +10 -3
- pygpt_net/controller/chat/image.py +17 -5
- pygpt_net/controller/chat/input.py +10 -7
- pygpt_net/controller/chat/output.py +21 -6
- pygpt_net/controller/chat/render.py +100 -21
- pygpt_net/controller/chat/response.py +34 -7
- pygpt_net/controller/chat/stream.py +4 -2
- pygpt_net/controller/chat/text.py +6 -4
- pygpt_net/controller/command.py +11 -3
- pygpt_net/controller/config/__init__.py +34 -6
- pygpt_net/controller/config/field/checkbox.py +7 -4
- pygpt_net/controller/config/field/cmd.py +7 -5
- pygpt_net/controller/config/field/combo.py +14 -6
- pygpt_net/controller/config/field/dictionary.py +14 -11
- pygpt_net/controller/config/field/input.py +9 -6
- pygpt_net/controller/config/field/slider.py +11 -8
- pygpt_net/controller/config/field/textarea.py +8 -5
- pygpt_net/controller/config/placeholder.py +52 -21
- pygpt_net/controller/ctx/__init__.py +138 -49
- pygpt_net/controller/ctx/common.py +15 -4
- pygpt_net/controller/ctx/extra.py +11 -3
- pygpt_net/controller/ctx/summarizer.py +24 -5
- pygpt_net/controller/debug/__init__.py +27 -6
- pygpt_net/controller/dialogs/confirm.py +34 -7
- pygpt_net/controller/dialogs/debug.py +4 -2
- pygpt_net/controller/dialogs/info.py +7 -2
- pygpt_net/controller/files.py +48 -10
- pygpt_net/controller/finder.py +11 -5
- pygpt_net/controller/idx/__init__.py +10 -3
- pygpt_net/controller/idx/common.py +4 -2
- pygpt_net/controller/idx/indexer.py +25 -17
- pygpt_net/controller/idx/settings.py +9 -3
- pygpt_net/controller/kernel/__init__.py +34 -8
- pygpt_net/controller/kernel/reply.py +12 -3
- pygpt_net/controller/kernel/stack.py +5 -3
- pygpt_net/controller/lang/custom.py +2 -7
- pygpt_net/controller/lang/mapping.py +5 -3
- pygpt_net/controller/layout.py +2 -2
- pygpt_net/controller/mode.py +16 -4
- pygpt_net/controller/model/__init__.py +14 -3
- pygpt_net/controller/model/editor.py +8 -3
- pygpt_net/controller/notepad.py +26 -12
- pygpt_net/controller/painter/capture.py +23 -4
- pygpt_net/controller/painter/common.py +9 -7
- pygpt_net/controller/plugins/__init__.py +19 -5
- pygpt_net/controller/plugins/presets.py +15 -6
- pygpt_net/controller/plugins/settings.py +9 -3
- pygpt_net/controller/presets/__init__.py +55 -16
- pygpt_net/controller/presets/editor.py +26 -10
- pygpt_net/controller/settings/__init__.py +3 -2
- pygpt_net/controller/settings/editor.py +29 -7
- pygpt_net/controller/settings/profile.py +22 -5
- pygpt_net/controller/theme/__init__.py +54 -12
- pygpt_net/controller/theme/common.py +24 -2
- pygpt_net/controller/theme/markdown.py +32 -16
- pygpt_net/controller/theme/menu.py +26 -5
- pygpt_net/controller/theme/nodes.py +2 -5
- pygpt_net/controller/tools/__init__.py +40 -2
- pygpt_net/controller/ui/__init__.py +4 -6
- pygpt_net/controller/ui/tabs.py +363 -65
- pygpt_net/core/access/actions.py +6 -4
- pygpt_net/core/access/shortcuts.py +4 -3
- pygpt_net/core/access/voice.py +6 -5
- pygpt_net/core/agents/legacy.py +4 -2
- pygpt_net/core/agents/memory.py +7 -2
- pygpt_net/core/agents/observer/evaluation.py +15 -7
- pygpt_net/core/agents/provider.py +9 -4
- pygpt_net/core/agents/runner.py +61 -15
- pygpt_net/core/agents/tools.py +23 -5
- pygpt_net/core/assistants/__init__.py +6 -4
- pygpt_net/core/assistants/files.py +35 -12
- pygpt_net/core/assistants/store.py +20 -10
- pygpt_net/core/attachments/__init__.py +54 -15
- pygpt_net/core/attachments/context.py +92 -29
- pygpt_net/core/audio/__init__.py +71 -3
- pygpt_net/core/audio/context.py +7 -2
- pygpt_net/core/bridge/__init__.py +22 -6
- pygpt_net/core/bridge/context.py +5 -3
- pygpt_net/core/calendar/__init__.py +57 -11
- pygpt_net/core/chain/__init__.py +8 -2
- pygpt_net/core/chain/chat.py +10 -8
- pygpt_net/core/chain/completion.py +10 -7
- pygpt_net/core/command.py +62 -17
- pygpt_net/core/ctx/__init__.py +260 -58
- pygpt_net/core/ctx/bag.py +25 -4
- pygpt_net/core/ctx/container.py +28 -17
- pygpt_net/core/ctx/idx.py +45 -8
- pygpt_net/core/ctx/output.py +95 -74
- pygpt_net/core/ctx/reply.py +5 -2
- pygpt_net/core/db/__init__.py +8 -7
- pygpt_net/core/db/viewer.py +17 -11
- pygpt_net/core/debug/__init__.py +10 -9
- pygpt_net/core/debug/tabs.py +5 -2
- pygpt_net/core/docker/__init__.py +11 -5
- pygpt_net/core/docker/builder.py +11 -3
- pygpt_net/core/events/app.py +5 -3
- pygpt_net/core/events/base.py +11 -5
- pygpt_net/core/events/control.py +5 -3
- pygpt_net/core/events/event.py +17 -7
- pygpt_net/core/events/kernel.py +5 -3
- pygpt_net/core/events/render.py +5 -3
- pygpt_net/core/experts/__init__.py +5 -4
- pygpt_net/core/filesystem/__init__.py +52 -34
- pygpt_net/core/filesystem/actions.py +8 -5
- pygpt_net/core/filesystem/editor.py +13 -3
- pygpt_net/core/filesystem/types.py +12 -7
- pygpt_net/core/filesystem/url.py +7 -3
- pygpt_net/core/idx/__init__.py +34 -25
- pygpt_net/core/idx/chat.py +40 -16
- pygpt_net/core/idx/context.py +6 -2
- pygpt_net/core/idx/indexing.py +84 -35
- pygpt_net/core/idx/llm.py +11 -3
- pygpt_net/core/idx/metadata.py +13 -3
- pygpt_net/core/idx/types/ctx.py +32 -6
- pygpt_net/core/idx/types/external.py +41 -7
- pygpt_net/core/idx/types/files.py +31 -6
- pygpt_net/core/image.py +15 -4
- pygpt_net/core/llm/__init__.py +13 -3
- pygpt_net/core/locale.py +34 -8
- pygpt_net/core/models.py +4 -3
- pygpt_net/core/notepad.py +9 -4
- pygpt_net/core/plugins.py +7 -6
- pygpt_net/core/presets.py +19 -10
- pygpt_net/core/profile.py +12 -6
- pygpt_net/core/prompt/__init__.py +10 -3
- pygpt_net/core/prompt/custom.py +7 -6
- pygpt_net/core/prompt/template.py +9 -3
- pygpt_net/core/render/base.py +117 -22
- pygpt_net/core/render/markdown/body.py +27 -7
- pygpt_net/core/render/markdown/renderer.py +119 -22
- pygpt_net/core/render/plain/body.py +22 -5
- pygpt_net/core/render/plain/renderer.py +97 -21
- pygpt_net/core/render/web/body.py +75 -25
- pygpt_net/core/render/web/renderer.py +313 -63
- pygpt_net/core/settings.py +9 -4
- pygpt_net/core/tabs/__init__.py +290 -103
- pygpt_net/core/tabs/tab.py +17 -4
- pygpt_net/core/tokens.py +44 -11
- pygpt_net/core/updater/__init__.py +20 -7
- pygpt_net/core/vision/analyzer.py +29 -6
- pygpt_net/core/web.py +130 -2
- pygpt_net/data/config/config.json +15 -4
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/config/modes.json +3 -3
- pygpt_net/data/config/settings.json +55 -10
- pygpt_net/data/config/settings_section.json +3 -0
- pygpt_net/data/css/style.light.css +1 -0
- pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
- pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
- pygpt_net/data/css/web-chatgpt.css +350 -0
- pygpt_net/data/css/web-chatgpt.dark.css +64 -0
- pygpt_net/data/css/web-chatgpt.light.css +75 -0
- pygpt_net/data/css/web-chatgpt_wide.css +350 -0
- pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
- pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
- pygpt_net/data/icons/split_screen.svg +1 -0
- pygpt_net/data/locale/locale.de.ini +12 -0
- pygpt_net/data/locale/locale.en.ini +17 -2
- pygpt_net/data/locale/locale.es.ini +12 -0
- pygpt_net/data/locale/locale.fr.ini +12 -0
- pygpt_net/data/locale/locale.it.ini +12 -0
- pygpt_net/data/locale/locale.pl.ini +12 -0
- pygpt_net/data/locale/locale.uk.ini +12 -0
- pygpt_net/data/locale/locale.zh.ini +12 -0
- pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.en.ini +20 -10
- pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
- pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
- pygpt_net/icons.qrc +1 -0
- pygpt_net/icons_rc.py +165 -136
- pygpt_net/item/ctx.py +46 -24
- pygpt_net/plugin/audio_input/simple.py +21 -5
- pygpt_net/plugin/audio_output/__init__.py +4 -1
- pygpt_net/plugin/base/config.py +4 -2
- pygpt_net/plugin/base/plugin.py +26 -6
- pygpt_net/plugin/base/worker.py +37 -9
- pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
- pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
- pygpt_net/plugin/cmd_web/__init__.py +46 -6
- pygpt_net/plugin/cmd_web/config.py +74 -48
- pygpt_net/plugin/cmd_web/websearch.py +61 -28
- pygpt_net/plugin/cmd_web/worker.py +79 -13
- pygpt_net/provider/core/config/patch.py +43 -1
- pygpt_net/provider/core/ctx/base.py +4 -1
- pygpt_net/provider/core/ctx/db_sqlite/__init__.py +10 -1
- pygpt_net/provider/core/ctx/db_sqlite/storage.py +22 -1
- pygpt_net/provider/gpt/assistants.py +10 -9
- pygpt_net/provider/gpt/audio.py +3 -2
- pygpt_net/provider/gpt/chat.py +8 -7
- pygpt_net/provider/gpt/completion.py +6 -4
- pygpt_net/provider/gpt/image.py +9 -2
- pygpt_net/provider/gpt/store.py +14 -13
- pygpt_net/provider/gpt/vision.py +6 -5
- pygpt_net/tools/__init__.py +9 -1
- pygpt_net/tools/base.py +15 -1
- pygpt_net/tools/code_interpreter/__init__.py +174 -75
- pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
- pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
- pygpt_net/tools/html_canvas/__init__.py +78 -23
- pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
- pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
- pygpt_net/ui/base/context_menu.py +2 -2
- pygpt_net/ui/layout/chat/input.py +10 -18
- pygpt_net/ui/layout/chat/output.py +26 -44
- pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
- pygpt_net/ui/layout/toolbox/footer.py +18 -2
- pygpt_net/ui/main.py +2 -2
- pygpt_net/ui/menu/config.py +7 -11
- pygpt_net/ui/menu/debug.py +11 -1
- pygpt_net/ui/menu/theme.py +9 -2
- pygpt_net/ui/widget/filesystem/explorer.py +2 -2
- pygpt_net/ui/widget/lists/context.py +27 -5
- pygpt_net/ui/widget/tabs/Input.py +2 -2
- pygpt_net/ui/widget/tabs/body.py +2 -1
- pygpt_net/ui/widget/tabs/layout.py +195 -0
- pygpt_net/ui/widget/tabs/output.py +218 -55
- pygpt_net/ui/widget/textarea/html.py +11 -1
- pygpt_net/ui/widget/textarea/output.py +10 -1
- pygpt_net/ui/widget/textarea/search_input.py +4 -1
- pygpt_net/ui/widget/textarea/web.py +49 -9
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/METADATA +45 -116
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/RECORD +255 -247
- /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/LICENSE +0 -0
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/WHEEL +0 -0
- {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.41.dist-info}/entry_points.txt +0 -0
pygpt_net/ui/menu/debug.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.
|
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
|
|
pygpt_net/ui/menu/theme.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.
|
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.
|
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.
|
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)
|
406
|
-
|
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
|
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.
|
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(
|
pygpt_net/ui/widget/tabs/body.py
CHANGED
@@ -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.
|
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
|