diff --git a/imgsrc/send.svg b/imgsrc/send.svg new file mode 100644 index 0000000000..6f4102510d --- /dev/null +++ b/imgsrc/send.svg @@ -0,0 +1,43 @@ + + + + + + + send + + diff --git a/imgsrc/srv/send.svg b/imgsrc/srv/send.svg new file mode 100644 index 0000000000..48eef31098 --- /dev/null +++ b/imgsrc/srv/send.svg @@ -0,0 +1 @@ +send diff --git a/resources/images/send.png b/resources/images/send.png new file mode 100644 index 0000000000..dbcdb89726 Binary files /dev/null and b/resources/images/send.png differ diff --git a/src/calibre/gui2/chat_widget.py b/src/calibre/gui2/chat_widget.py index 31d851077b..04a6ff3ea1 100644 --- a/src/calibre/gui2/chat_widget.py +++ b/src/calibre/gui2/chat_widget.py @@ -5,7 +5,7 @@ from html import escape from math import ceil from typing import NamedTuple -from qt.core import QFrame, QPalette, Qt, QTextBrowser, QTextEdit, QUrl, QVBoxLayout, QWidget, pyqtSignal +from qt.core import QFrame, QHBoxLayout, QIcon, QPalette, Qt, QTextBrowser, QTextEdit, QToolButton, QUrl, QVBoxLayout, QWidget, pyqtSignal from calibre.utils.logging import INFO, WARN @@ -52,7 +52,7 @@ class Header(NamedTuple): return f'
{title}
' -class Input(QTextEdit): +class InputEdit(QTextEdit): returnPressed = pyqtSignal() @@ -89,6 +89,40 @@ class Input(QTextEdit): return super().keyPressEvent(event) + @property + def value(self) -> str: + return self.toPlainText() + + @value.setter + def value(self, val: str) -> None: + self.setPlainText(val) + + +class Input(QWidget): + + send_requested = pyqtSignal() + + def __init__(self, parent: QWidget = None, placeholder_text: str = ''): + super().__init__(parent) + l = QHBoxLayout(self) + l.setContentsMargins(0, 0, 0, 0) + self.text_input = ti = InputEdit(self, placeholder_text) + ti.returnPressed.connect(self.send_requested) + l.addWidget(ti) + self.send_button = b = QToolButton(self) + b.setIcon(QIcon.ic('send.png')) + b.setToolTip(_('Send query to AI')) + b.clicked.connect(self.send_requested) + l.addWidget(b, alignment=Qt.AlignmentFlag.AlignCenter) + + @property + def value(self) -> str: + return self.text_input.value + + @value.setter + def value(self, val: str) -> None: + self.text_input.value = val + class ChatWidget(QWidget): @@ -103,7 +137,7 @@ class ChatWidget(QWidget): b.anchorClicked.connect(self.link_clicked) l.addWidget(b) self.input = iw = Input(parent=self, placeholder_text=placeholder_text) - iw.returnPressed.connect(self.on_input) + iw.send_requested.connect(self.on_input) l.addWidget(iw) self.blocks: list[str] = [] self.current_message = '' @@ -166,6 +200,6 @@ class ChatWidget(QWidget): self.browser.setHtml('\n\n'.join(self.blocks)) def on_input(self) -> None: - text = self.input.toPlainText() - self.input.setPlainText('') + text = self.input.value + self.input.value = '' self.input_from_user.emit(text)