gui: fix scrolling in chat and message input

- Restore ScrollView for message input to enable overflow scrolling
- Remove manual wheel handlers that broke ListView virtualization
- Let wheel events propagate naturally to ListView
This commit is contained in:
Levi Neely 2026-08-07 11:20:13 +02:00
parent df8e69aeb8
commit 2ea6ec1ba7
1 changed files with 36 additions and 37 deletions

View File

@ -1428,14 +1428,6 @@ property bool blockExpanded: {
chatView.interactive = true
mouse.accepted = false
}
onWheel: function(wheel) {
// Always allow wheel scrolling, even during selection
chatView.contentY = Math.max(0, Math.min(
chatView.contentHeight - chatView.height,
chatView.contentY - wheel.angleDelta.y
))
wheel.accepted = true
}
}
// Context menu (right button) - separate to avoid deselection
@ -1461,49 +1453,56 @@ property bool blockExpanded: {
Layout.margins: 6
spacing: 4
// TextArea without ScrollView - wheel scrolls when content overflows
// TextArea in ScrollView for overflow, with context menu overlay
Item {
Layout.fillWidth: true
Layout.maximumHeight: 200
Layout.preferredHeight: Math.min(promptInput.contentHeight + 16, 200)
clip: true
TextArea {
id: promptInput
ScrollView {
id: promptScroll
anchors.fill: parent
placeholderText: {
if (!ollie.daemonConnected) return "Not connected"
if (!ollie.activeSessionId) return "No session"
if (!ollie.activeAgentId) return "No agent"
if (ollie.isSessionPaused(ollie.activeSessionId)) return "Session paused"
return "Message..."
}
enabled: ollie.daemonConnected && ollie.activeSessionId !== "" && ollie.activeAgentId !== "" && !ollie.isSessionPaused(ollie.activeSessionId)
wrapMode: TextEdit.Wrap
selectByMouse: true
persistentSelection: true
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
property string _lastText: ""
property int _lastCursorPos: 0
TextArea {
id: promptInput
width: promptScroll.width
placeholderText: {
if (!ollie.daemonConnected) return "Not connected"
if (!ollie.activeSessionId) return "No session"
if (!ollie.activeAgentId) return "No agent"
if (ollie.isSessionPaused(ollie.activeSessionId)) return "Session paused"
return "Message..."
}
enabled: ollie.daemonConnected && ollie.activeSessionId !== "" && ollie.activeAgentId !== "" && !ollie.isSessionPaused(ollie.activeSessionId)
wrapMode: TextEdit.Wrap
selectByMouse: true
persistentSelection: true
onTextChanged: {
_lastText = text
_lastCursorPos = cursorPosition
}
property string _lastText: ""
property int _lastCursorPos: 0
Keys.onReturnPressed: function(event) {
if (event.modifiers & Qt.ShiftModifier) {
event.accepted = false
} else {
if (text.trim() !== "") {
ollie.submit(text.trim())
text = ""
onTextChanged: {
_lastText = text
_lastCursorPos = cursorPosition
}
Keys.onReturnPressed: function(event) {
if (event.modifiers & Qt.ShiftModifier) {
event.accepted = false
} else {
if (text.trim() !== "") {
ollie.submit(text.trim())
text = ""
}
event.accepted = true
}
event.accepted = true
}
}
}
// Context menu overlay - only catches right-click
// Context menu overlay - only catches right-click, on top of ScrollView
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton