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)
+ slider(0),
+ got_key_press(false)
{
set_text(t);
}
const Sides &margin = text_part->get_margin();
const GL::Font &font = style->get_font();
unsigned en_width = static_cast<unsigned>(font.get_string_width("n")*style->get_font_size());
- geom.w = max(geom.w, 10*en_width+margin.left+margin.right);
+ geom.w = max(geom.w, edit_width*en_width+margin.left+margin.right);
unsigned line_height = static_cast<unsigned>((font.get_ascent()-font.get_descent())*style->get_font_size());
if(multiline)
{
unsigned line_spacing = style->get_font_size()*6/5;
- geom.h = max(geom.h, line_height+line_spacing*2+margin.top+margin.bottom);
+ geom.h = max(geom.h, line_height+line_spacing*(edit_height-1)+margin.top+margin.bottom);
}
else
geom.h = max(geom.h, line_height+margin.top+margin.bottom);
rebuild();
}
+void Entry::set_edit_size(unsigned w, unsigned h)
+{
+ edit_width = w;
+ edit_height = h;
+ signal_autosize_changed.emit();
+}
+
void Entry::set_multiline(bool m)
{
multiline = m;
text.build(part, geom, first_row, cache);
else if(part.get_name()=="cursor")
{
- if(!text_part || !part.get_graphic(state))
+ const Graphic *graphic = part.get_graphic(state);
+ if(!text_part || !graphic)
{
cache.texture = 0;
return;
Geometry rgeom = text.coords_to_geometry(*text_part, geom, first_row, row, col);
- cache.texture = part.get_graphic(state)->get_texture();
+ cache.texture = graphic->get_texture();
cache.clear_mesh();
GL::MeshBuilder bld(*cache.mesh);
bld.matrix() *= GL::Matrix::translation(rgeom.x, rgeom.y, 0);
- part.get_graphic(state)->build(part.get_geometry().w, part.get_geometry().h, bld);
+ graphic->build(part.get_geometry().w, part.get_geometry().h, bld);
}
}
void Entry::key_press(unsigned key, unsigned)
{
+ got_key_press = true;
if(key==Input::KEY_LEFT)
{
if(edit_pos>0)
void Entry::character(wchar_t ch)
{
- if(ch>=' ')
+ if(got_key_press && ch>=' ')
{
text.insert(edit_pos, StringCodec::encode<StringCodec::Utf8>(StringCodec::ustring(1, ch)));
++edit_pos;
}
}
+void Entry::focus_out()
+{
+ Widget::focus_out();
+ got_key_press = false;
+}
+
void Entry::on_geometry_change()
{
reposition_slider();
first_row = text.get_n_lines()-visible_rows-static_cast<unsigned>(value);
}
-
-Entry::Loader::Loader(Entry &ent):
- Widget::Loader(ent)
-{ }
-
} // namespace GLtk
} // namespace Msp