[aseprite] 64/196: Fix Entry bugs handling the text caret

Tobias Hansen thansen at moszumanska.debian.org
Wed Apr 20 18:50:02 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit 69a1161f6917f6e114d0a18adf33becb05876853
Author: David Capello <davidcapello at gmail.com>
Date:   Mon Mar 14 12:39:45 2016 -0300

    Fix Entry bugs handling the text caret
    
    Added more checks and improve performance in Entry::setCaretPos()
---
 src/ui/entry.cpp | 57 +++++++++++++++++++++++++++++---------------------------
 1 file changed, 30 insertions(+), 27 deletions(-)

diff --git a/src/ui/entry.cpp b/src/ui/entry.cpp
index d7ea77c..647c82d 100644
--- a/src/ui/entry.cpp
+++ b/src/ui/entry.cpp
@@ -1,5 +1,5 @@
 // Aseprite UI Library
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-2016  David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -102,29 +102,33 @@ void Entry::hideCaret()
 
 void Entry::setCaretPos(int pos)
 {
-  base::utf8_const_iterator utf8_begin = base::utf8_const_iterator(text().begin());
+  auto utf8_begin = base::utf8_const_iterator(text().begin());
+  auto utf8_end = base::utf8_const_iterator(text().end());
   int textlen = base::utf8_length(text());
-  int x, c;
 
-  m_caret = pos;
+  m_caret = MID(0, pos, textlen);
 
   // Backward scroll
-  if (m_caret < m_scroll)
+  if (m_scroll > m_caret)
     m_scroll = m_caret;
 
   // Forward scroll
-  m_scroll--;
-  do {
-    x = bounds().x + border().left();
-    for (c=++m_scroll; ; c++) {
-      int ch = (c < textlen ? *(utf8_begin+c) : ' ');
-
+  --m_scroll;
+  int c;
+  while (true) {
+    c = ++m_scroll;
+    auto utf8_it = utf8_begin + MID(0, c, textlen);
+    int x = bounds().x + border().left()
+      - font()->charWidth(' '); // Space for the carret
+    for (; utf8_it != utf8_end; ++c, ++utf8_it) {
+      int ch = *utf8_it;
       x += font()->charWidth(ch);
-
       if (x >= bounds().x2()-border().right())
         break;
     }
-  } while (m_caret >= c);
+    if (m_caret < c || utf8_it == utf8_end)
+      break;
+  }
 
   m_timer.start();
   m_state = true;
@@ -322,8 +326,8 @@ bool Entry::onProcessMessage(Message* msg)
     case kMouseMoveMessage:
       if (hasCapture()) {
         gfx::Point mousePos = static_cast<MouseMessage*>(msg)->position();
-        base::utf8_const_iterator utf8_begin = base::utf8_const_iterator(text().begin());
-        base::utf8_const_iterator utf8_end = base::utf8_const_iterator(text().end());
+        auto utf8_begin = base::utf8_const_iterator(text().begin());
+        auto utf8_end = base::utf8_const_iterator(text().end());
         int textlen = base::utf8_length(text());
         int c, x;
 
@@ -342,10 +346,12 @@ bool Entry::onProcessMessage(Message* msg)
         // Forward scroll
         else if (mousePos.x >= bounds().x2()) {
           if (m_scroll < textlen - getAvailableTextLength()) {
-            m_scroll++;
+            ++m_scroll;
             x = bounds().x + border().left();
-            for (c=m_scroll; utf8_begin != utf8_end; ++c) {
-              int ch = (c < textlen ? *(utf8_begin+c) : ' ');
+
+            auto utf8_it = utf8_begin + MID(0, m_scroll, textlen);
+            for (c=m_scroll; utf8_it != utf8_end; ++c, ++utf8_it) {
+              int ch = (c < textlen ? *utf8_it: ' ');
 
               x += font()->charWidth(ch);
               if (x > bounds().x2()-border().right()) {
@@ -353,7 +359,7 @@ bool Entry::onProcessMessage(Message* msg)
                 break;
               }
             }
-            m_caret = c;
+            m_caret = MID(0, c, textlen);
             move = false;
             is_dirty = true;
             invalidate();
@@ -450,8 +456,9 @@ void Entry::onSetText()
 {
   Widget::onSetText();
 
-  if (m_caret >= 0 && (std::size_t)m_caret > textLength())
-    m_caret = (int)textLength();
+  int textlen = textLength();
+  if (m_caret >= 0 && m_caret > textlen)
+    m_caret = textlen;
 }
 
 void Entry::onChange()
@@ -482,11 +489,7 @@ int Entry::getCaretFromMouse(MouseMessage* mousemsg)
 
   int x = bounds.x;
 
-  base::utf8_const_iterator utf8_it =
-    (m_scroll < textlen ?
-      utf8_begin + m_scroll:
-      utf8_end);
-
+  auto utf8_it = utf8_begin + MID(0, m_scroll, textlen);
   int c = m_scroll;
   for (; utf8_it != utf8_end; ++c, ++utf8_it) {
     int w = font()->charWidth(*utf8_it);
@@ -505,7 +508,7 @@ int Entry::getCaretFromMouse(MouseMessage* mousemsg)
     }
   }
 
-  return caret;
+  return MID(0, caret, textlen);
 }
 
 void Entry::executeCmd(EntryCmd cmd, int unicodeChar, bool shift_pressed)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list