]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/entry.cpp
Simplify constructors with C++11
[libs/gltk.git] / source / entry.cpp
index 4c1713a022306d4b7670ef3953be2a62457f85a9..19bbaf9dc693f685a875ef962dcb03ac3a42340c 100644 (file)
@@ -13,20 +13,7 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Entry::Entry(const string &t):
-       text(),
-       multiline(false),
-       edit_width(10),
-       edit_height(1),
-       edit_pos(0),
-       first_row(0),
-       visible_rows(1),
-       text_part(0),
-       slider(0),
-       got_key_press(false),
-       cursor_blink(true),
-       selection_active(false),
-       selection_pos(0)
+Entry::Entry(const string &t)
 {
        input_type = INPUT_TEXT;
        set_text(t);
@@ -70,17 +57,9 @@ void Entry::insert(unsigned pos, const string &t)
                return;
 
        text.insert(pos, t);
-
-       unsigned old_edit_pos = edit_pos;
-       if(edit_pos>=pos)
-               edit_pos += t.size();
-       if(selection_active && selection_pos>=pos)
-               selection_pos += t.size();
-
        signal_text_changed.emit(text.get());
-       if(edit_pos!=old_edit_pos)
-               signal_edit_position_changed.emit(edit_pos);
 
+       adjust_edit_position_for_change(pos, t.size());
        if(multiline)
                check_view_range();
 
@@ -93,24 +72,9 @@ void Entry::erase(unsigned pos, unsigned len)
                return;
 
        text.erase(pos, len);
-
-       unsigned old_edit_pos = edit_pos;
-       if(edit_pos>=pos+len)
-               edit_pos -= len;
-       else if(edit_pos>=pos)
-               edit_pos = pos;
-       if(selection_active)
-       {
-               if(selection_pos>=pos+len)
-                       selection_pos -= len;
-               else if(selection_pos>=pos)
-                       selection_pos = pos;
-       }
-
        signal_text_changed.emit(text.get());
-       if(edit_pos!=old_edit_pos)
-               signal_edit_position_changed.emit(edit_pos);
 
+       adjust_edit_position_for_change(pos, -len);
        if(multiline)
                check_view_range();
 
@@ -184,7 +148,7 @@ void Entry::rebuild_special(const Part &part)
                Geometry rgeom = text.coords_to_geometry(*text_part, geom, first_row, row, col);
 
                GL::MeshBuilder bld(part_cache.create_mesh(part, *graphic->get_texture()));
-               bld.matrix() *= GL::Matrix::translation(rgeom.x, rgeom.y, 0);
+               bld.transform(GL::Matrix::translation(rgeom.x, rgeom.y, 0));
                graphic->build(part.get_geometry().w, part.get_geometry().h, bld);
        }
        else if(part.get_name()=="selection")
@@ -228,7 +192,7 @@ void Entry::rebuild_special(const Part &part)
                                Geometry egeom = text.coords_to_geometry(*text_part, geom, first_row, row, ec);
 
                                GL::MeshBuilder bld(part_cache.create_mesh(part, *graphic->get_texture()));
-                               bld.matrix() *= GL::Matrix::translation(rgeom.x, rgeom.y, 0);
+                               bld.transform(GL::Matrix::translation(rgeom.x, rgeom.y, 0));
                                graphic->build(egeom.x-rgeom.x, part.get_geometry().h, bld);
                        }
 
@@ -355,8 +319,6 @@ bool Entry::navigate(Navigation nav)
 {
        if(nav==NAV_LEFT || nav==NAV_RIGHT || ((nav==NAV_DOWN || nav==NAV_UP) && multiline))
                move_edit_position(nav, false);
-       else if(nav==NAV_ACCEPT && !signal_enter.empty())
-               signal_enter.emit();
        else
                return false;
 
@@ -415,8 +377,39 @@ void Entry::move_edit_position(Navigation nav, bool select)
                throw invalid_argument("Entry::move_edit_position");
 }
 
+void Entry::adjust_edit_position_for_change(unsigned pos, int change)
+{
+       unsigned old_edit_pos = edit_pos;
+       unsigned old_select_pos = selection_pos;
+
+       if(change>0)
+       {
+               if(edit_pos>=pos)
+                       edit_pos += change;
+               if(selection_active && selection_pos>=pos)
+                       selection_pos += change;
+       }
+       else if(change<0)
+       {
+               if(edit_pos>=pos)
+                       edit_pos -= min<unsigned>(edit_pos-pos, -change);
+               if(selection_active && selection_pos>=pos)
+                       selection_pos -= min<unsigned>(selection_pos-pos, -change);
+       }
+
+       if(edit_pos!=old_edit_pos)
+               signal_edit_position_changed.emit(edit_pos);
+       if(selection_active && (edit_pos!=old_edit_pos || selection_pos!=old_select_pos))
+       {
+               unsigned start, end;
+               if(get_selection(start, end))
+                       signal_selection_changed.emit(start, end);
+       }
+}
+
 void Entry::set_edit_position(unsigned ep, bool select)
 {
+       bool selection_was_active = selection_active;
        if(select && !selection_active)
                selection_pos = edit_pos;
        selection_active = select;
@@ -425,7 +418,14 @@ void Entry::set_edit_position(unsigned ep, bool select)
        edit_pos = min(ep, text.size());
 
        if(edit_pos!=old_edit_pos)
+       {
                signal_edit_position_changed.emit(edit_pos);
+               unsigned start, end;
+               if(get_selection(start, end))
+                       signal_selection_changed.emit(start, end);
+               else if(selection_was_active)
+                       signal_selection_changed.emit(edit_pos, edit_pos);
+       }
 
        if(multiline)
                check_view_range();