void Entry::insert(unsigned pos, const string &t)
{
+ if(t.empty())
+ return;
+
text.insert(pos, t);
unsigned old_edit_pos = edit_pos;
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);
void Entry::erase(unsigned pos, unsigned len)
{
+ if(!len)
+ return;
+
text.erase(pos, len);
unsigned old_edit_pos = edit_pos;
selection_pos = pos;
}
+ signal_text_changed.emit(text.get());
if(edit_pos!=old_edit_pos)
signal_edit_position_changed.emit(edit_pos);
if(key==Input::KEY_BACKSPACE)
{
if(selection_active)
- erase_selection();
+ erase_selection(true);
else if(edit_pos>0)
erase(edit_pos-1, 1);
}
else if(key==Input::KEY_DELETE)
{
if(selection_active)
- erase_selection();
+ erase_selection(true);
else
erase(edit_pos, 1);
}
if(got_key_press && ch>=' ' && ch!=0x7F)
{
if(selection_active)
- erase_selection();
+ erase_selection(false);
insert(edit_pos, StringCodec::encode<StringCodec::Utf8>(StringCodec::ustring(1, ch)));
return true;
}
rebuild();
}
-void Entry::erase_selection()
+void Entry::erase_selection(bool emit_change)
{
unsigned start, end;
if(!get_selection(start, end))
return;
text.erase(start, end-start);
+ if(emit_change)
+ signal_text_changed.emit(text.get());
set_edit_position(start, false);
}
else if(row>=first_row+visible_rows)
first_row = row+1-visible_rows;
+ unsigned scroll = max(text.get_n_lines(), visible_rows)-visible_rows;
+ if(first_row>scroll)
+ first_row = scroll;
+
if(first_row!=old_first_row)
signal_scroll_position_changed.emit(first_row);
- unsigned scroll = max(text.get_n_lines(), visible_rows)-visible_rows;
slider->set_range(0, scroll);
slider->set_value(scroll-first_row);
}