commit
b0d3c27d31
2 changed files with 154 additions and 23 deletions
|
@ -145,6 +145,13 @@ void LineEdit::_input_event(InputEvent p_event) {
|
||||||
|
|
||||||
int old_cursor_pos = cursor_pos;
|
int old_cursor_pos = cursor_pos;
|
||||||
text = undo_text;
|
text = undo_text;
|
||||||
|
|
||||||
|
Ref<Font> font = get_font("font");
|
||||||
|
|
||||||
|
cached_width = 0;
|
||||||
|
for (int i = 0; i<text.length(); i++)
|
||||||
|
cached_width += font->get_char_size(text[i]).width;
|
||||||
|
|
||||||
if(old_cursor_pos > text.length()) {
|
if(old_cursor_pos > text.length()) {
|
||||||
set_cursor_pos(text.length());
|
set_cursor_pos(text.length());
|
||||||
} else {
|
} else {
|
||||||
|
@ -164,6 +171,15 @@ void LineEdit::_input_event(InputEvent p_event) {
|
||||||
selection_clear();
|
selection_clear();
|
||||||
undo_text = text;
|
undo_text = text;
|
||||||
text = text.substr(cursor_pos,text.length()-cursor_pos);
|
text = text.substr(cursor_pos,text.length()-cursor_pos);
|
||||||
|
|
||||||
|
Ref<Font> font = get_font("font");
|
||||||
|
|
||||||
|
cached_width = 0;
|
||||||
|
if (font != NULL) {
|
||||||
|
for (int i = 0; i < text.length(); i++)
|
||||||
|
cached_width += font->get_char_size(text[i]).width;
|
||||||
|
}
|
||||||
|
|
||||||
set_cursor_pos(0);
|
set_cursor_pos(0);
|
||||||
emit_signal("text_changed",text);
|
emit_signal("text_changed",text);
|
||||||
_change_notify("text");
|
_change_notify("text");
|
||||||
|
@ -306,6 +322,18 @@ void LineEdit::_input_event(InputEvent p_event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LineEdit::set_align(Align p_align) {
|
||||||
|
|
||||||
|
ERR_FAIL_INDEX(p_align, 4);
|
||||||
|
align = p_align;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
LineEdit::Align LineEdit::get_align() const{
|
||||||
|
|
||||||
|
return align;
|
||||||
|
}
|
||||||
|
|
||||||
Variant LineEdit::get_drag_data(const Point2& p_point) {
|
Variant LineEdit::get_drag_data(const Point2& p_point) {
|
||||||
|
|
||||||
if (selection.drag_attempt && selection.enabled) {
|
if (selection.drag_attempt && selection.enabled) {
|
||||||
|
@ -328,7 +356,15 @@ void LineEdit::drop_data(const Point2& p_point,const Variant& p_data){
|
||||||
if (p_data.get_type()==Variant::STRING) {
|
if (p_data.get_type()==Variant::STRING) {
|
||||||
set_cursor_at_pixel_pos(p_point.x);
|
set_cursor_at_pixel_pos(p_point.x);
|
||||||
int selected = selection.end - selection.begin;
|
int selected = selection.end - selection.begin;
|
||||||
|
|
||||||
|
Ref<Font> font = get_font("font");
|
||||||
|
if (font != NULL) {
|
||||||
|
for (int i = selection.begin; i < selection.end; i++)
|
||||||
|
cached_width -= font->get_char_size(text[i]).width;
|
||||||
|
}
|
||||||
|
|
||||||
text.erase(selection.begin, selected);
|
text.erase(selection.begin, selected);
|
||||||
|
|
||||||
append_at_cursor(p_data);
|
append_at_cursor(p_data);
|
||||||
selection.begin = cursor_pos-selected;
|
selection.begin = cursor_pos-selected;
|
||||||
selection.end = cursor_pos;
|
selection.end = cursor_pos;
|
||||||
|
@ -368,8 +404,25 @@ void LineEdit::_notification(int p_what) {
|
||||||
get_stylebox("focus")->draw( ci, Rect2( Point2(), size ) );
|
get_stylebox("focus")->draw( ci, Rect2( Point2(), size ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int x_ofs=0;
|
||||||
int ofs=style->get_offset().x;
|
|
||||||
|
switch (align) {
|
||||||
|
|
||||||
|
case ALIGN_FILL:
|
||||||
|
case ALIGN_LEFT: {
|
||||||
|
|
||||||
|
x_ofs=style->get_offset().x;
|
||||||
|
} break;
|
||||||
|
case ALIGN_CENTER: {
|
||||||
|
|
||||||
|
x_ofs=x_ofs=int(size.width-(cached_width))/2;
|
||||||
|
} break;
|
||||||
|
case ALIGN_RIGHT: {
|
||||||
|
|
||||||
|
x_ofs=x_ofs=int(size.width-style->get_offset().x-(cached_width));
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
int ofs_max=width-style->get_minimum_size().width;
|
int ofs_max=width-style->get_minimum_size().width;
|
||||||
int char_ofs=window_pos;
|
int char_ofs=window_pos;
|
||||||
|
|
||||||
|
@ -394,29 +447,29 @@ void LineEdit::_notification(int p_what) {
|
||||||
int char_width=font->get_char_size( cchar,next ).width;
|
int char_width=font->get_char_size( cchar,next ).width;
|
||||||
|
|
||||||
// end of widget, break!
|
// end of widget, break!
|
||||||
if ( (ofs+char_width) > ofs_max )
|
if ((x_ofs + char_width) > ofs_max)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
bool selected=selection.enabled && char_ofs>=selection.begin && char_ofs<selection.end;
|
bool selected=selection.enabled && char_ofs>=selection.begin && char_ofs<selection.end;
|
||||||
|
|
||||||
if (selected)
|
if (selected)
|
||||||
VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2( Point2( ofs , y_ofs ),Size2( char_width, y_area )),selection_color);
|
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(x_ofs, y_ofs), Size2(char_width, y_area)), selection_color);
|
||||||
|
|
||||||
|
|
||||||
font->draw_char(ci,Point2( ofs , y_ofs+font_ascent ), cchar, next,selected?font_color_selected:font_color );
|
font->draw_char(ci, Point2(x_ofs, y_ofs + font_ascent), cchar, next, selected ? font_color_selected : font_color);
|
||||||
|
|
||||||
if (char_ofs==cursor_pos && has_focus())
|
if (char_ofs==cursor_pos && has_focus())
|
||||||
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(
|
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(
|
||||||
Point2( ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color );
|
Point2( x_ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color );
|
||||||
|
|
||||||
ofs+=char_width;
|
x_ofs+=char_width;
|
||||||
char_ofs++;
|
char_ofs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (char_ofs==cursor_pos && has_focus()) //may be at the end
|
if (char_ofs==cursor_pos && has_focus()) //may be at the end
|
||||||
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(
|
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(
|
||||||
Point2( ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color );
|
Point2( x_ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color );
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case NOTIFICATION_FOCUS_ENTER: {
|
case NOTIFICATION_FOCUS_ENTER: {
|
||||||
|
@ -487,13 +540,36 @@ void LineEdit::shift_selection_check_post(bool p_shift) {
|
||||||
|
|
||||||
void LineEdit::set_cursor_at_pixel_pos(int p_x) {
|
void LineEdit::set_cursor_at_pixel_pos(int p_x) {
|
||||||
|
|
||||||
int ofs=window_pos;
|
Ref<Font> font = get_font("font");
|
||||||
int pixel_ofs=get_stylebox("normal")->get_offset().x;
|
int ofs = window_pos;
|
||||||
Ref<Font> font=get_font("font");
|
Ref<StyleBox> style = get_stylebox("normal");
|
||||||
|
int pixel_ofs = 0;
|
||||||
|
Size2 size = get_size();
|
||||||
|
|
||||||
|
switch (align) {
|
||||||
|
|
||||||
|
case ALIGN_FILL:
|
||||||
|
case ALIGN_LEFT: {
|
||||||
|
|
||||||
|
pixel_ofs = int(style->get_offset().x);
|
||||||
|
} break;
|
||||||
|
case ALIGN_CENTER: {
|
||||||
|
|
||||||
|
pixel_ofs=int(size.width-(cached_width))/2;
|
||||||
|
} break;
|
||||||
|
case ALIGN_RIGHT: {
|
||||||
|
|
||||||
|
pixel_ofs=int(size.width-style->get_offset().x-(cached_width));
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
while (ofs<text.length()) {
|
while (ofs<text.length()) {
|
||||||
|
|
||||||
int char_w=font->get_char_size( text[ofs] ).width;
|
int char_w = 0;
|
||||||
|
if (font != NULL) {
|
||||||
|
int char_w = font->get_char_size(text[ofs]).width;
|
||||||
|
}
|
||||||
pixel_ofs+=char_w;
|
pixel_ofs+=char_w;
|
||||||
|
|
||||||
if (pixel_ofs > p_x) { //found what we look for
|
if (pixel_ofs > p_x) { //found what we look for
|
||||||
|
@ -526,6 +602,10 @@ void LineEdit::delete_char() {
|
||||||
|
|
||||||
if ((text.length()<=0) || (cursor_pos==0)) return;
|
if ((text.length()<=0) || (cursor_pos==0)) return;
|
||||||
|
|
||||||
|
Ref<Font> font = get_font("font");
|
||||||
|
if (font != NULL) {
|
||||||
|
cached_width -= font->get_char_size(text[cursor_pos - 1]).width;
|
||||||
|
}
|
||||||
|
|
||||||
text.erase( cursor_pos-1, 1 );
|
text.erase( cursor_pos-1, 1 );
|
||||||
|
|
||||||
|
@ -596,13 +676,15 @@ void LineEdit::set_cursor_pos(int p_pos) {
|
||||||
int width_to_cursor=0;
|
int width_to_cursor=0;
|
||||||
int wp=window_pos;
|
int wp=window_pos;
|
||||||
|
|
||||||
for (int i=window_pos;i<cursor_pos;i++)
|
if (font != NULL) {
|
||||||
width_to_cursor+=font->get_char_size( text[i] ).width;
|
for (int i=window_pos;i<cursor_pos;i++)
|
||||||
|
width_to_cursor+=font->get_char_size( text[i] ).width;
|
||||||
|
|
||||||
while(width_to_cursor>=window_width && wp<text.length()) {
|
while (width_to_cursor >= window_width && wp < text.length()) {
|
||||||
|
|
||||||
width_to_cursor-=font->get_char_size( text[ wp ] ).width;
|
width_to_cursor -= font->get_char_size(text[wp]).width;
|
||||||
wp++;
|
wp++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp!=window_pos)
|
if (wp!=window_pos)
|
||||||
|
@ -629,17 +711,26 @@ void LineEdit::append_at_cursor(String p_text) {
|
||||||
if ( ( max_length <= 0 ) || (text.length()+p_text.length() <= max_length)) {
|
if ( ( max_length <= 0 ) || (text.length()+p_text.length() <= max_length)) {
|
||||||
|
|
||||||
undo_text = text;
|
undo_text = text;
|
||||||
|
|
||||||
|
Ref<Font> font = get_font("font");
|
||||||
|
if (font != NULL) {
|
||||||
|
for (int i = 0; i < p_text.length(); i++)
|
||||||
|
cached_width += font->get_char_size(p_text[i]).width;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cached_width = 0;
|
||||||
|
}
|
||||||
|
|
||||||
String pre = text.substr( 0, cursor_pos );
|
String pre = text.substr( 0, cursor_pos );
|
||||||
String post = text.substr( cursor_pos, text.length()-cursor_pos );
|
String post = text.substr( cursor_pos, text.length()-cursor_pos );
|
||||||
text=pre+p_text+post;
|
text=pre+p_text+post;
|
||||||
set_cursor_pos(cursor_pos+p_text.length());
|
set_cursor_pos(cursor_pos+p_text.length());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LineEdit::clear_internal() {
|
void LineEdit::clear_internal() {
|
||||||
|
|
||||||
|
cached_width = 0;
|
||||||
cursor_pos=0;
|
cursor_pos=0;
|
||||||
window_pos=0;
|
window_pos=0;
|
||||||
undo_text="";
|
undo_text="";
|
||||||
|
@ -679,6 +770,20 @@ void LineEdit::selection_delete() {
|
||||||
if (selection.enabled) {
|
if (selection.enabled) {
|
||||||
|
|
||||||
undo_text = text;
|
undo_text = text;
|
||||||
|
|
||||||
|
if (text.size() > 0)
|
||||||
|
{
|
||||||
|
Ref<Font> font = get_font("font");
|
||||||
|
if (font != NULL) {
|
||||||
|
for (int i = selection.begin; i < selection.end; i++)
|
||||||
|
cached_width -= font->get_char_size(text[i]).width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cached_width = 0;
|
||||||
|
}
|
||||||
|
|
||||||
text.erase(selection.begin,selection.end-selection.begin);
|
text.erase(selection.begin,selection.end-selection.begin);
|
||||||
cursor_pos-=CLAMP( cursor_pos-selection.begin, 0, selection.end-selection.begin);
|
cursor_pos-=CLAMP( cursor_pos-selection.begin, 0, selection.end-selection.begin);
|
||||||
|
|
||||||
|
@ -792,6 +897,8 @@ bool LineEdit::is_text_field() const {
|
||||||
|
|
||||||
void LineEdit::_bind_methods() {
|
void LineEdit::_bind_methods() {
|
||||||
|
|
||||||
|
ObjectTypeDB::bind_method(_MD("set_align", "align"), &LineEdit::set_align);
|
||||||
|
ObjectTypeDB::bind_method(_MD("get_align"), &LineEdit::get_align);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("_input_event"),&LineEdit::_input_event);
|
ObjectTypeDB::bind_method(_MD("_input_event"),&LineEdit::_input_event);
|
||||||
ObjectTypeDB::bind_method(_MD("clear"),&LineEdit::clear);
|
ObjectTypeDB::bind_method(_MD("clear"),&LineEdit::clear);
|
||||||
|
@ -812,15 +919,22 @@ void LineEdit::_bind_methods() {
|
||||||
ADD_SIGNAL( MethodInfo("text_changed", PropertyInfo( Variant::STRING, "text" )) );
|
ADD_SIGNAL( MethodInfo("text_changed", PropertyInfo( Variant::STRING, "text" )) );
|
||||||
ADD_SIGNAL( MethodInfo("text_entered", PropertyInfo( Variant::STRING, "text" )) );
|
ADD_SIGNAL( MethodInfo("text_entered", PropertyInfo( Variant::STRING, "text" )) );
|
||||||
|
|
||||||
|
BIND_CONSTANT(ALIGN_LEFT);
|
||||||
|
BIND_CONSTANT(ALIGN_CENTER);
|
||||||
|
BIND_CONSTANT(ALIGN_RIGHT);
|
||||||
|
BIND_CONSTANT(ALIGN_FILL);
|
||||||
|
|
||||||
ADD_PROPERTY( PropertyInfo( Variant::STRING, "text" ), _SCS("set_text"),_SCS("get_text") );
|
ADD_PROPERTY( PropertyInfo( Variant::STRING, "text" ), _SCS("set_text"),_SCS("get_text") );
|
||||||
|
ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "align", PROPERTY_HINT_ENUM, "Left,Center,Right,Fill"), _SCS("set_align"), _SCS("get_align"));
|
||||||
ADD_PROPERTY( PropertyInfo( Variant::INT, "max_length" ), _SCS("set_max_length"),_SCS("get_max_length") );
|
ADD_PROPERTY( PropertyInfo( Variant::INT, "max_length" ), _SCS("set_max_length"),_SCS("get_max_length") );
|
||||||
ADD_PROPERTY( PropertyInfo( Variant::BOOL, "editable" ), _SCS("set_editable"),_SCS("is_editable") );
|
ADD_PROPERTY( PropertyInfo( Variant::BOOL, "editable" ), _SCS("set_editable"),_SCS("is_editable") );
|
||||||
ADD_PROPERTY( PropertyInfo( Variant::BOOL, "secret" ), _SCS("set_secret"),_SCS("is_secret") );
|
ADD_PROPERTY( PropertyInfo( Variant::BOOL, "secret" ), _SCS("set_secret"),_SCS("is_secret") );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LineEdit::LineEdit() {
|
LineEdit::LineEdit() {
|
||||||
|
|
||||||
|
align = ALIGN_LEFT;
|
||||||
|
cached_width = 0;
|
||||||
cursor_pos=0;
|
cursor_pos=0;
|
||||||
window_pos=0;
|
window_pos=0;
|
||||||
max_length = 0;
|
max_length = 0;
|
||||||
|
|
|
@ -36,7 +36,18 @@
|
||||||
class LineEdit : public Control {
|
class LineEdit : public Control {
|
||||||
|
|
||||||
OBJ_TYPE( LineEdit, Control );
|
OBJ_TYPE( LineEdit, Control );
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum Align {
|
||||||
|
|
||||||
|
ALIGN_LEFT,
|
||||||
|
ALIGN_CENTER,
|
||||||
|
ALIGN_RIGHT,
|
||||||
|
ALIGN_FILL
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
Align align;
|
||||||
|
|
||||||
bool editable;
|
bool editable;
|
||||||
bool pass;
|
bool pass;
|
||||||
|
|
||||||
|
@ -46,6 +57,8 @@ class LineEdit : public Control {
|
||||||
int cursor_pos;
|
int cursor_pos;
|
||||||
int window_pos;
|
int window_pos;
|
||||||
int max_length; // 0 for no maximum
|
int max_length; // 0 for no maximum
|
||||||
|
|
||||||
|
int cached_width;
|
||||||
|
|
||||||
struct Selection {
|
struct Selection {
|
||||||
|
|
||||||
|
@ -83,7 +96,8 @@ class LineEdit : public Control {
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
public:
|
public:
|
||||||
|
void set_align(Align p_align);
|
||||||
|
Align get_align() const;
|
||||||
|
|
||||||
virtual Variant get_drag_data(const Point2& p_point);
|
virtual Variant get_drag_data(const Point2& p_point);
|
||||||
virtual bool can_drop_data(const Point2& p_point,const Variant& p_data) const;
|
virtual bool can_drop_data(const Point2& p_point,const Variant& p_data) const;
|
||||||
|
@ -119,4 +133,7 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
VARIANT_ENUM_CAST(LineEdit::Align);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue