Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing/StarTextBoxWidget.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-28 20:08:17 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-28 20:08:17 +1000
commitc37dd994d74c256b25b9d94dc25b3cdb44519e67 (patch)
tree42858dfc43bf897498dfe5e0993b60a688c9d77f /source/windowing/StarTextBoxWidget.cpp
parent48ec8895797001298f90e02545811a3e5d8169f8 (diff)
Fix freeze copy/pasting large amounts of text
Diffstat (limited to 'source/windowing/StarTextBoxWidget.cpp')
-rw-r--r--source/windowing/StarTextBoxWidget.cpp34
1 files changed, 19 insertions, 15 deletions
diff --git a/source/windowing/StarTextBoxWidget.cpp b/source/windowing/StarTextBoxWidget.cpp
index 03d2ae9..db9374c 100644
--- a/source/windowing/StarTextBoxWidget.cpp
+++ b/source/windowing/StarTextBoxWidget.cpp
@@ -333,21 +333,22 @@ bool TextBoxWidget::innerSendEvent(InputEvent const& event) {
}
}
- int rightSteps = 1;
- int leftSteps = 1;
- if ((keyDown->mods & (KeyMod::LCtrl | KeyMod::RCtrl)) != KeyMod::NoMod || (keyDown->mods & (KeyMod::LAlt | KeyMod::RAlt)) != KeyMod::NoMod) {
- rightSteps = m_text.findNextBoundary(m_cursorOffset) - m_cursorOffset;
- leftSteps = m_cursorOffset - m_text.findNextBoundary(m_cursorOffset, true);
-
- if (rightSteps < 1)
- rightSteps = 1;
- if (leftSteps < 1)
- leftSteps = 1;
- }
+ auto calculateSteps = [&](bool dir) {
+ if ((keyDown->mods & (KeyMod::LCtrl | KeyMod::RCtrl)) != KeyMod::NoMod || (keyDown->mods & (KeyMod::LAlt | KeyMod::RAlt)) != KeyMod::NoMod) {
+ int steps;
+ if (dir) // right
+ steps = m_text.findNextBoundary(m_cursorOffset) - m_cursorOffset;
+ else // left
+ steps = m_cursorOffset - m_text.findNextBoundary(m_cursorOffset, true);
+
+ return steps < 1 ? 1 : steps;
+ }
+ };
if (keyDown->key == Key::Backspace) {
+ int steps = calculateSteps(false);
m_repeatCode = SpecialRepeatKeyCodes::Backspace;
- for (int i = 0; i < leftSteps; i++) {
+ for (int i = 0; i < steps; i++) {
if (m_cursorOffset > 0) {
if (modText(m_text.substr(0, m_cursorOffset - 1) + m_text.substr(m_cursorOffset)))
m_cursorOffset -= 1;
@@ -356,16 +357,18 @@ bool TextBoxWidget::innerSendEvent(InputEvent const& event) {
return true;
}
if (keyDown->key == Key::Delete) {
+ int steps = calculateSteps(true);
m_repeatCode = SpecialRepeatKeyCodes::Delete;
- for (int i = 0; i < rightSteps; i++) {
+ for (int i = 0; i < steps; i++) {
if (m_cursorOffset < (int)m_text.size())
modText(m_text.substr(0, m_cursorOffset) + m_text.substr(m_cursorOffset + 1));
}
return true;
}
if (keyDown->key == Key::Left) {
+ int steps = calculateSteps(false);
m_repeatCode = SpecialRepeatKeyCodes::Left;
- for (int i = 0; i < leftSteps; i++) {
+ for (int i = 0; i < steps; i++) {
m_cursorOffset--;
if (m_cursorOffset < 0)
m_cursorOffset = 0;
@@ -373,8 +376,9 @@ bool TextBoxWidget::innerSendEvent(InputEvent const& event) {
return true;
}
if (keyDown->key == Key::Right) {
+ int steps = calculateSteps(true);
m_repeatCode = SpecialRepeatKeyCodes::Right;
- for (int i = 0; i < rightSteps; i++) {
+ for (int i = 0; i < steps; i++) {
m_cursorOffset++;
if (m_cursorOffset > (int)m_text.size())
m_cursorOffset = m_text.size();