diff --git a/modules/game_textwindow/textwindow.lua b/modules/game_textwindow/textwindow.lua index f01f1f52..dbb21df6 100644 --- a/modules/game_textwindow/textwindow.lua +++ b/modules/game_textwindow/textwindow.lua @@ -21,6 +21,18 @@ function destroy() end end +function getCursorPosByNewLine(str, count) + local i = 0 + for n = 1, count-1 do + local tPos = string.find(str, '\n', i) + if tPos then + i = tPos+1 + end + end + + return i - 1 +end + function onGameEditText(id, itemId, maxLength, text, writter, time) if textWindow then return end textWindow = g_ui.createWidget('TextWindow', rootWidget) @@ -32,11 +44,13 @@ function onGameEditText(id, itemId, maxLength, text, writter, time) local okButton = textWindow:getChildById('okButton') local cancelButton = textWindow:getChildById('cancelButton') + local textScroll = textWindow:getChildById('textScroll') + textItem:setItemId(itemId) textEdit:setMaxLength(maxLength) textEdit:setText(text) textEdit:setEnabled(writeable) - + local desc = '' if #writter > 0 then desc = tr('You read the following, written by \n%s\n', writter) @@ -74,7 +88,38 @@ function onGameEditText(id, itemId, maxLength, text, writter, time) end destroy() end - + + local _, newLineCount = string.gsub(text, '\n', '\n') + if(newLineCount >= 9) then + textScroll:setMaximum(newLineCount-9) + end + + local _prev, _next, _current = 0, 11, 0 + local onValueChange = function() + local diff = textScroll:getValue() - _current + + if(diff > 0) then + textEdit:setCursorPos(getCursorPosByNewLine(text, _next+(diff-1))) + else + textEdit:setCursorPos(getCursorPosByNewLine(text, _prev+(diff+1))) + end + + _current = textScroll:getValue() + _next = _next + diff + _prev = _prev + diff + end + + textScroll.onValueChange = onValueChange + g_keyboard.bindKeyPress("Up", function() textScroll:setValue(textScroll:getValue()-1) end, textWindow, 400) + g_keyboard.bindKeyPress("Down", function() textScroll:setValue(textScroll:getValue()+1) end, textWindow, 400) + + if(not writeable) then + textEdit:setCursorPos(0) + else + textScroll:setValue(textScroll:getMaximum()) + textEdit:setCursorPos(text:len()) + end + okButton.onClick = doneFunc cancelButton.onClick = destroy --textWindow.onEnter = doneFunc -- this should be '\n' diff --git a/modules/game_textwindow/textwindow.otui b/modules/game_textwindow/textwindow.otui index 342c8328..e93b65ae 100644 --- a/modules/game_textwindow/textwindow.otui +++ b/modules/game_textwindow/textwindow.otui @@ -1,3 +1,5 @@ +TextScrollbar < VerticalScrollBar + TextWindow < MainWindow id: textWindow size: 280 280 @@ -24,9 +26,21 @@ TextWindow < MainWindow id: text anchors.fill: parent anchors.top: textItem.bottom + margin-right: 10 margin-top: 30 margin-bottom: 30 + TextScrollbar + id: textScroll + anchors.left: prev.right + anchors.top: prev.top + anchors.bottom: prev.bottom + minimum: 0 + maximum: 0 + step: 1 + value: 0 + pixels-scroll: true + Button id: cancelButton !text: tr('Cancel') @@ -42,4 +56,4 @@ TextWindow < MainWindow anchors.top: text.bottom anchors.right: text.right margin-top: 10 - width: 60 + width: 60 \ No newline at end of file