8000 Update toolbar design · DataSolveProblems/pyqt-openai@88c04d6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 88c04d6

Browse files
committed
Update toolbar design
1 parent 945b9c8 commit 88c04d6

File tree

9 files changed

+92
-38
lines changed

9 files changed

+92
-38
lines changed

pyqt_openai/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ def move_updater():
186186
ICON_SEND = os.path.join(ICON_PATH, 'send.svg')
187187
ICON_RECORD = os.path.join(ICON_PATH, 'record.svg')
188188
ICON_SPEAKER = os.path.join(ICON_PATH, 'speaker.svg')
189+
ICON_PAYPAL = os.path.join(ICON_PATH, 'paypal.png')
190+
ICON_KOFI = os.path.join(ICON_PATH, 'kofi.png')
189191

190192
## CUSTOMIZE
191193
DEFAULT_ICON_SIZE = (24, 24)
@@ -355,6 +357,8 @@ def move_updater():
355357
# This doesn't need endpoint
356358
DALLE_ARR = ['dall-e-2', 'dall-e-3']
357359

360+
DEFAULT_DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
361+
358362
OPENAI_CHAT_ENDPOINT = '/v1/chat/completions'
359363

360364
# Other models' configuration data

pyqt_openai/chat_widget/right_sidebar/usingG4FPage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def __initUi(self):
4848

4949
providerCmbBox = QComboBox()
5050
providerCmbBox.addItems(get_g4f_providers(including_auto=True))
51+
providerCmbBox.setCurrentText(self.__provider)
5152
providerCmbBox.currentTextChanged.connect(self.__providerChanged)
5253

5354
# TODO LANGUAGE

pyqt_openai/ico/kofi.png

20.2 KB
Loading

pyqt_openai/ico/paypal.png

11.5 KB
Loading

pyqt_openai/mainWindow.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
ICON_CLOSE, \
1313
DEFAULT_SHORTCUT_SETTING, TRANSPARENT_RANGE, TRANSPARENT_INIT_VAL, ICON_GITHUB, ICON_DISCORD, PAYPAL_URL, KOFI_URL, \
1414
DISCORD_URL, GITHUB_URL, DEFAULT_SHORTCUT_FOCUS_MODE, ICON_FOCUS_MODE, ICON_SETTING, DEFAULT_SHORTCUT_SHOW_TOOLBAR, \
15-
DEFAULT_SHORTCUT_SHOW_SECONDARY_TOOLBAR, DEFAULT_SHORTCUT_STACK_ON_TOP
15+
DEFAULT_SHORTCUT_SHOW_SECONDARY_TOOLBAR, DEFAULT_SHORTCUT_STACK_ON_TOP, ICON_PAYPAL, ICON_KOFI
1616
from pyqt_openai.aboutDialog import AboutDialog
1717
from pyqt_openai.chat_widget.chatMainWidget import ChatMainWidget
1818
from pyqt_openai.config_loader import CONFIG_MANAGER
@@ -28,6 +28,7 @@
2828
from pyqt_openai.util.script import restart_app, show_message_box_after_change_to_restart, set_auto_start_windows, \
2929
set_api_key, init_llama
3030
from pyqt_openai.widgets.button import Button
31+
from pyqt_openai.widgets.navWidget import NavBar
3132

3233

3334
class MainWindow(QMainWindow):
@@ -126,25 +127,29 @@ def __setActions(self):
126127
self.__discordAction.triggered.connect(lambda: webbrowser.open(DISCORD_URL))
127128

128129
self.__paypalAction = QAction('Paypal', self)
130+
self.__paypalAction.setIcon(QIcon(ICON_PAYPAL))
129131
self.__paypalAction.triggered.connect(lambda: webbrowser.open(PAYPAL_URL))
130132

131133
self.__kofiAction = QAction('Ko-fi ❤', self)
134+
self.__kofiAction.setIcon(QIcon(ICON_KOFI))
132135
self.__kofiAction.triggered.connect(lambda: webbrowser.open(KOFI_URL))
133136

137+
self.__navBar = NavBar()
138+
self.__navBar.add(LangClass.TRANSLATIONS['Chat'])
139+
self.__navBar.add('DALL-E')
140+
self.__navBar.add('Replicate')
141+
self.__navBar.setSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Preferred)
142+
self.__navBar.item_clicked.connect(self.__aiTypeChanged)
143+
self.__navBar.set_active_button(0)
144+
134145
# toolbar action
135146
self.__chooseAiAction = QWidgetAction(self)
136-
self.__chooseAiCmbBox = QComboBox()
137-
self.__chooseAiCmbBox.addItems([LangClass.TRANSLATIONS['Chat'], 'DALLE', 'Replicate'])
138-
self.__chooseAiCmbBox.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding)
139-
self.__chooseAiCmbBox.currentIndexChanged.connect(self.__aiTypeChanged)
140-
self.__chooseAiAction.setDefaultWidget(self.__chooseAiCmbBox)
141-
142-
self.__customizeAction = QWidgetAction(self)
143-
self.__customizeBtn = Button()
144-
self.__customizeBtn.setStyleAndIcon(ICON_CUSTOMIZE)
145-
self.__customizeBtn.clicked.connect(self.__executeCustomizeDialog)
146-
self.__customizeAction.setDefaultWidget(self.__customizeBtn)
147-
self.__customizeBtn.setToolTip(LangClass.TRANSLATIONS['Customize'])
147+
self.__chooseAiAction.setDefaultWidget(self.__navBar)
148+
149+
self.__customizeAction = QAction(self)
150+
self.__customizeAction.setText(LangClass.TRANSLATIONS['Customize'])
151+
self.__customizeAction.setIcon(QIcon(ICON_CUSTOMIZE))
152+
self.__customizeAction.triggered.connect(self.__executeCustomizeDialog)
148153

149154
self.__transparentAction = QWidgetAction(self)
150155
self.__transparentSpinBox = QSpinBox()
@@ -161,13 +166,8 @@ def __setActions(self):
161166
transparencyActionWidget.setLayout(lay)
162167
self.__transparentAction.setDefaultWidget(transparencyActionWidget)
163168

164-
self.__apiWidget = QWidget()
165-
self.__apiWidget.setLayout(lay)
166-
167-
self.__apiAction = QWidgetAction(self)
168-
self.__apiAction.setDefaultWidget(self.__apiWidget)
169-
170-
self.__settingsAction = QAction(LangClass.TRANSLATIONS['Settings'], self)
169+
self.__settingsAction = QAction(self)
170+
self.__settingsAction.setText(LangClass.TRANSLATIONS['Settings'])
171171
self.__settingsAction.setIcon(QIcon(ICON_SETTING))
172172
self.__settingsAction.setShortcut(DEFAULT_SHORTCUT_SETTING)
173173
self.__settingsAction.triggered.connect(self.__showSettingsDialog)
@@ -254,12 +254,14 @@ def __activated(self, reason):
254254

255255
def __setToolBar(self):
256256
self.__toolbar = QToolBar()
257-
lay = self.__toolbar.layout()
258257
self.__toolbar.addAction(self.__chooseAiAction)
258+
self.__toolbar.addAction(self.__settingsAction)
259259
self.__toolbar.addAction(self.__customizeAction)
260+
self.__toolbar.addAction(self.__githubAction)
261+
self.__toolbar.addAction(self.__discordAction)
262+
self.__toolbar.addAction(self.__paypalAction)
263+
self.__toolbar.addAction(self.__kofiAction)
260264
self.__toolbar.addAction(self.__transparentAction)
261-
self.__toolbar.addAction(self.__apiAction)
262-
self.__toolbar.setLayout(lay)
263265
self.__toolbar.setMovable(False)
264266

265267
self.addToolBar(self.__toolbar)
@@ -319,6 +321,7 @@ def __executeCustomizeDialog(self):
319321

320322
def __aiTypeChanged(self, i):
321323
self.__mainWidget.setCurrentIndex(i)
324+
self.__navBar.set_active_button(i)
322325
widget = self.__mainWidget.currentWidget()
323326
widget.showSecondaryToolBar(self.__settingsParamContainer.show_secondary_toolbar)
324327

pyqt_openai/sqlite.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from pyqt_openai import THREAD_TABLE_NAME, THREAD_TRIGGER_NAME, \
88
MESSAGE_TABLE_NAME, THREAD_MESSAGE_INSERTED_TR_NAME, \
99
THREAD_MESSAGE_UPDATED_TR_NAME, THREAD_MESSAGE_DELETED_TR_NAME, IMAGE_TABLE_NAME, \
10-
PROMPT_GROUP_TABLE_NAME, PROMPT_ENTRY_TABLE_NAME, get_config_directory
10+
PROMPT_GROUP_TABLE_NAME, PROMPT_ENTRY_TABLE_NAME, get_config_directory, DEFAULT_DATETIME_FORMAT
1111
from pyqt_openai.config_loader import CONFIG_MANAGER
1212
from pyqt_openai.models import ImagePromptContainer, ChatMessageContainer, PromptEntryContainer, PromptGroupContainer
1313

@@ -474,7 +474,7 @@ def updateMessage(self, id, favorite):
474474
Update message favorite
475475
"""
476476
try:
477-
current_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
477+
current_date = datetime.now().strftime(DEFAULT_DATETIME_FORMAT)
478478
self.__c.execute(f'''
479479
UPDATE {MESSAGE_TABLE_NAME}
480480
SET favorite = ?,

pyqt_openai/util/script.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
PROMPT_NAME_REGEX, PROMPT_MAIN_KEY_NAME, PROMPT_BEGINNING_KEY_NAME, \
4242
PROMPT_END_KEY_NAME, PROMPT_JSON_KEY_NAME, CONTEXT_DELIMITER, THREAD_ORDERBY, DEFAULT_APP_NAME, \
4343
AUTOSTART_REGISTRY_KEY, is_frozen, G4F_PROVIDER_DEFAULT, PROVIDER_MODEL_DICT, O1_MODELS, OPENAI_ENDPOINT_DICT, \
44-
OPENAI_CHAT_ENDPOINT, STT_MODEL
44+
OPENAI_CHAT_ENDPOINT, STT_MODEL, DEFAULT_DATETIME_FORMAT
4545
from pyqt_openai.config_loader import CONFIG_MANAGER
4646
from pyqt_openai.lang.translations import LangClass
4747
from pyqt_openai.models import ImagePromptContainer, ChatMessageContainer
@@ -171,8 +171,8 @@ def get_chatgpt_data_for_preview(filename, most_recent_n:int = None):
171171
conv = data[i]
172172
conv_dict = {}
173173
name = conv['title']
174-
insert_dt = datetime.fromtimestamp(conv['create_time']).strftime('%Y-%m-%d %H:%M:%S') if conv['create_time'] else None
175-
update_dt = datetime.fromtimestamp(conv['update_time']).strftime('%Y-%m-%d %H:%M:%S') if conv['update_time'] else None
174+
insert_dt = datetime.fromtimestamp(conv['create_time']).strftime(DEFAULT_DATETIME_FORMAT) if conv['create_time'] else None
175+
update_dt = datetime.fromtimestamp(conv['update_time']).strftime(DEFAULT_DATETIME_FORMAT) if conv['update_time'] else None
176176
conv_dict['id'] = conv['id']
177177
conv_dict['name'] = name
178178
conv_dict['insert_dt'] = insert_dt
@@ -199,8 +199,8 @@ def get_chatgpt_data_for_import(conv_arr):
199199
metadata = message['metadata']
200200

201201
role = message['author']['role']
202-
create_time = datetime.fromtimestamp(message['create_time']).strftime('%Y-%m-%d %H:%M:%S') if message['create_time'] else None
203-
update_time = datetime.fromtimestamp(message['update_time']).strftime('%Y-%m-%d %H:%M:%S') if message['update_time'] else None
202+
create_time = datetime.fromtimestamp(message['create_time']).strftime(DEFAULT_DATETIME_FORMAT) if message['create_time'] else None
203+
update_time = datetime.fromtimestamp(message['update_time']).strftime(DEFAULT_DATETIME_FORMAT) if message['update_time'] else None
204204
content = message['content']
205205

206206
obj['role'] = role
@@ -777,10 +777,7 @@ def get_api_response(args, get_content_only=True):
777777

778778
def get_g4f_response(args, get_content_only=True):
779779
response = G4F_CLIENT.chat.completions.create(
780-
model=args['model'],
781-
stream=args['stream'],
782-
messages=args['messages'],
783-
provider=args['provider']
780+
**args
784781
)
785782
if args['stream']:
786783
return stream_response(provider='', response=response, is_g4f=True, get_content_only=get_content_only)
@@ -797,9 +794,9 @@ def get_response(args, is_g4f=False, get_content_only=True, provider=''):
797794
:param args: The arguments to pass to the API
798795
:param is_g4f: Whether the model is G4F or not
799796
:param get_content_only: Whether to get the content only or not
797+
:param provider: The provider of the model (Auto if not provided)
800798
"""
801799
if is_g4f:
802-
# For getting the provider
803800
if provider != G4F_PROVIDER_DEFAULT:
804801
args['provider'] = convert_to_provider(provider)
805802
return get_g4f_response(args, get_content_only=False)
@@ -1011,11 +1008,12 @@ def run(self):
10111008
else:
10121009
self.replyGenerated.emit(self.__info.content, False, self.__info)
10131010
except Exception as e:
1011+
self.__info.provider = self.__provider
10141012
self.__info.finish_reason = 'Error'
10151013
self.__info.content = f'<p style="color:red">{e}</p>'
10161014
if self.__is_g4f:
10171015
# TODO LANGUAGE
1018-
self.__info.content += '''
1016+
self.__info.content += '''\n
10191017
You can try the following:
10201018
10211019
- Change the provider

pyqt_openai/widgets/navWidget.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from PySide6.QtCore import Signal, Qt
2+
from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton
3+
4+
5+
class NavBar(QWidget):
6+
item_clicked = Signal(int) # Signal to emit the index when an item is clicked
7+
8+
def __init__(self, parent=None):
9+
super().__init__(parent)
10+
self.__initVal()
11+
self.__initUi()
12+
13+
def __initVal(self 10000 ):
14+
self.__buttons = [] # List to store button references
15+
16+
def __initUi(self):
17+
lay = QHBoxLayout()
18+
lay.setAlignment(Qt.AlignmentFlag.AlignLeft)
19+
lay.setContentsMargins(0, 0, 0, 0)
20+
self.setLayout(lay)
21+
22+
def add(self, name):
23+
"""Add a new navigation item."""
24+
button = QPushButton(name)
25+
button_style = """
26+
QPushButton {
27+
border: none;
28+
background-color: transparent;
29+
font-family: "Arial";
30+
font-size: 16px;
31+
padding: 10px 15px;
32+
}
33+
QPushButton:hover {
34+
color: #007BFF; /* Highlight color */
35+
}
36+
"""
37+
button.setStyleSheet(button_style)
38+
index = len(self.__buttons)
39+
button.clicked.connect(lambda: self.item_clicked.emit(index))
40+
self.layout().addWidget(button)
41+
self.__buttons.append(button)
42+
43+
def set_active_button(self, active_index):
44+
"""Set the active button as bold."""
45+
for index, button in enumerate(self.__buttons):
46+
font = button.font()
47+
font.setBold(index == active_index)
48+
button.setFont(font)

pyqt_openai/widgets/thumbnailView.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from PySide6.QtWidgets import QGraphicsScene, QGraphicsPixmapItem, QGraphicsView, QApplication, QWidget, QHBoxLayout, \
66
QFileDialog
77

8-
from pyqt_openai import ICON_SAVE, ICON_ADD, ICON_DELETE
8+
from pyqt_openai import ICON_SAVE, ICON_ADD, ICON_DELETE, ICON_COPY
99
from pyqt_openai.lang.translations import LangClass
1010
from pyqt_openai.widgets.button import Button
1111

@@ -44,7 +44,7 @@ def __initUi(self):
4444
def __setControlWidget(self):
4545
# copy the image
4646
copyBtn = Button()
47-
copyBtn.setStyleAndIcon('ico/copy.svg')
47+
copyBtn.setStyleAndIcon(ICON_COPY)
4848
copyBtn.clicked.connect(self.__copy)
4949

5050
# download the image

0 commit comments

Comments
 (0)
0