diff options
Diffstat (limited to 'scene/gui/line_edit.cpp')
-rw-r--r-- | scene/gui/line_edit.cpp | 276 |
1 files changed, 138 insertions, 138 deletions
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 2a62ab30fc..3953ef06a5 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -36,20 +36,20 @@ void LineEdit::_input_event(InputEvent p_event) { switch(p_event.type) { - + case InputEvent::MOUSE_BUTTON: { - + const InputEventMouseButton &b = p_event.mouse_button; if (b.button_index!=1) break; - + if (b.pressed) { - + set_cursor_at_pixel_pos(b.x); - + if (b.doubleclick) { - + selection.enabled=true; selection.begin=0; selection.end=text.length(); @@ -57,9 +57,9 @@ void LineEdit::_input_event(InputEvent p_event) { } selection.drag_attempt=false; - + if ((cursor_pos<selection.begin) || (cursor_pos>selection.end) || !selection.enabled) { - + selection_clear(); selection.cursor_start=cursor_pos; selection.creating=true; @@ -67,13 +67,13 @@ void LineEdit::_input_event(InputEvent p_event) { selection.drag_attempt=true; } - + // if (!editable) // non_editable_clicked_signal.call(); update(); - + } else { - + if ( (!selection.creating) && (!selection.doubleclick)) { selection_clear(); } @@ -83,29 +83,29 @@ void LineEdit::_input_event(InputEvent p_event) { if (OS::get_singleton()->has_virtual_keyboard()) OS::get_singleton()->show_virtual_keyboard(get_text(),get_global_rect()); } - - update(); + + update(); } break; case InputEvent::MOUSE_MOTION: { - + const InputEventMouseMotion& m=p_event.mouse_motion; - + if (m.button_mask&1) { - + if (selection.creating) { set_cursor_at_pixel_pos(m.x); selection_fill_at_cursor(); } } - + } break; case InputEvent::KEY: { - + const InputEventKey &k =p_event.key; - + if (!k.pressed) return; - unsigned int code = k.scancode; + unsigned int code = k.scancode; if (k.mod.command) { @@ -346,11 +346,11 @@ void LineEdit::_input_event(InputEvent p_event) { } - + return; - + } break; - + } } @@ -405,30 +405,30 @@ void LineEdit::drop_data(const Point2& p_point,const Variant& p_data){ void LineEdit::_notification(int p_what) { - + switch(p_what) { - + case NOTIFICATION_RESIZED: { - + set_cursor_pos( get_cursor_pos() ); - + } break; case NOTIFICATION_DRAW: { - + int width,height; - + Size2 size=get_size(); width=size.width; height=size.height; - + RID ci = get_canvas_item(); - + Ref<StyleBox> style = get_stylebox("normal"); if (!is_editable()) style=get_stylebox("read_only"); Ref<Font> font=get_font("font"); - + style->draw( ci, Rect2( Point2(), size ) ); if (has_focus()) { @@ -439,7 +439,7 @@ void LineEdit::_notification(int p_what) { int x_ofs=0; switch (align) { - + case ALIGN_FILL: case ALIGN_LEFT: { @@ -457,19 +457,19 @@ void LineEdit::_notification(int p_what) { int ofs_max=width-style->get_minimum_size().width; int char_ofs=window_pos; - + int y_area=height-style->get_minimum_size().height; int y_ofs=style->get_offset().y; - + int font_ascent=font->get_ascent(); - + Color selection_color=get_color("selection_color"); Color font_color=get_color("font_color"); Color font_color_selected=get_color("font_color_selected"); Color cursor_color=get_color("cursor_color"); - + while(true) { - + //end of string, break! if (char_ofs>=text.length()) break; @@ -477,32 +477,32 @@ void LineEdit::_notification(int p_what) { CharType cchar=pass?'*':text[char_ofs]; CharType next=pass?'*':text[char_ofs+1]; int char_width=font->get_char_size( cchar,next ).width; - + // end of widget, break! if ((x_ofs + char_width) > ofs_max) break; - - + + bool selected=selection.enabled && char_ofs>=selection.begin && char_ofs<selection.end; - + if (selected) 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(x_ofs, y_ofs + font_ascent), cchar, next, selected ? font_color_selected : font_color); - + if (char_ofs==cursor_pos && has_focus()) VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2( Point2( x_ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color ); - + x_ofs+=char_width; char_ofs++; } if (char_ofs==cursor_pos && has_focus()) //may be at the end VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2( - Point2( x_ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color ); - + Point2( x_ofs , y_ofs ), Size2( 1, y_area ) ), cursor_color ); + } break; case NOTIFICATION_FOCUS_ENTER: { @@ -521,15 +521,15 @@ void LineEdit::_notification(int p_what) { } void LineEdit::copy_text() { - + if(selection.enabled) { - + OS::get_singleton()->set_clipboard(text.substr(selection.begin, selection.end - selection.begin)); } } void LineEdit::cut_text() { - + if(selection.enabled) { undo_text = text; OS::get_singleton()->set_clipboard(text.substr(selection.begin, selection.end - selection.begin)); @@ -538,9 +538,9 @@ void LineEdit::cut_text() { } void LineEdit::paste_text() { - + String paste_buffer = OS::get_singleton()->get_clipboard(); - + if(paste_buffer != "") { if(selection.enabled) selection_delete(); @@ -550,28 +550,28 @@ void LineEdit::paste_text() { _change_notify("text"); } - + } void LineEdit::shift_selection_check_pre(bool p_shift) { - + if (!selection.old_shift && p_shift) { selection.cursor_start=cursor_pos; } if (!p_shift) selection_clear(); - + } void LineEdit::shift_selection_check_post(bool p_shift) { - + if (p_shift) selection_fill_at_cursor(); } void LineEdit::set_cursor_at_pixel_pos(int p_x) { - + Ref<Font> font = get_font("font"); int ofs = window_pos; Ref<StyleBox> style = get_stylebox("normal"); @@ -579,10 +579,10 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { Size2 size = get_size(); switch (align) { - + case ALIGN_FILL: case ALIGN_LEFT: { - + pixel_ofs = int(style->get_offset().x); } break; case ALIGN_CENTER: { @@ -597,30 +597,30 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { while (ofs<text.length()) { - + int char_w = 0; if (font != NULL) { char_w = font->get_char_size(text[ofs]).width; } pixel_ofs+=char_w; - + if (pixel_ofs > p_x) { //found what we look for - - + + if ( (pixel_ofs-p_x) < (char_w >> 1 ) ) { - + ofs+=1; } - + break; } - - + + ofs++; } - + set_cursor_pos( ofs ); - + /* int new_cursor_pos=p_x; int charwidth=draw_area->get_font_char_width(' ',0); @@ -631,29 +631,29 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { void LineEdit::delete_char() { - + 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 ); - + set_cursor_pos(get_cursor_pos()-1); - + if (cursor_pos==window_pos) { - + // set_window_pos(cursor_pos-get_window_length()); } - + emit_signal("text_changed",text); _change_notify("text"); } void LineEdit::set_text(String p_text) { - + clear_internal(); append_at_cursor(p_text); update(); @@ -662,86 +662,86 @@ void LineEdit::set_text(String p_text) { } void LineEdit::clear() { - + clear_internal(); } String LineEdit::get_text() const { - + return text; } void LineEdit::set_cursor_pos(int p_pos) { - + if (p_pos>(int)text.length()) p_pos=text.length(); - + if(p_pos<0) p_pos=0; - - - + + + cursor_pos=p_pos; - + // if (cursor_pos>(window_pos+get_window_length())) { // set_window_pos(cursor_pos-get_window_lengt//h()); // } - + if (!is_inside_tree()) { - + window_pos=cursor_pos; return; } - + Ref<StyleBox> style = get_stylebox("normal"); Ref<Font> font=get_font("font"); - + if (cursor_pos<window_pos) { /* Adjust window if cursor goes too much to the left */ set_window_pos(cursor_pos); } else if (cursor_pos>window_pos) { /* Adjust window if cursor goes too much to the right */ int window_width=get_size().width-style->get_minimum_size().width; - + if (window_width<0) return; int width_to_cursor=0; int wp=window_pos; - + if (font != NULL) { 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()) { width_to_cursor -= font->get_char_size(text[wp]).width; wp++; } } - + if (wp!=window_pos) set_window_pos( wp ); - + } update(); } int LineEdit::get_cursor_pos() const { - + return cursor_pos; } void LineEdit::set_window_pos(int p_pos) { - + window_pos=p_pos; if (window_pos<0) window_pos=0; } void LineEdit::append_at_cursor(String p_text) { - - + + if ( ( max_length <= 0 ) || (text.length()+p_text.length() <= max_length)) { - + undo_text = text; Ref<Font> font = get_font("font"); @@ -761,7 +761,7 @@ void LineEdit::append_at_cursor(String p_text) { } void LineEdit::clear_internal() { - + cached_width = 0; cursor_pos=0; window_pos=0; @@ -771,21 +771,21 @@ void LineEdit::clear_internal() { } Size2 LineEdit::get_minimum_size() const { - + Ref<StyleBox> style = get_stylebox("normal"); Ref<Font> font=get_font("font"); - + Size2 min=style->get_minimum_size(); min.height+=font->get_height(); min.width+=get_constant("minimum_spaces")*font->get_char_size(' ').x; - + return min; } /* selection */ void LineEdit::selection_clear() { - + selection.begin=0; selection.end=0; selection.cursor_start=0; @@ -798,9 +798,9 @@ void LineEdit::selection_clear() { void LineEdit::selection_delete() { - + if (selection.enabled) { - + undo_text = text; if (text.size() > 0) @@ -818,80 +818,80 @@ void LineEdit::selection_delete() { text.erase(selection.begin,selection.end-selection.begin); cursor_pos-=CLAMP( cursor_pos-selection.begin, 0, selection.end-selection.begin); - + if (cursor_pos>=text.length()) { - + cursor_pos=text.length(); } if (window_pos>cursor_pos) { - + window_pos=cursor_pos; } - + emit_signal("text_changed",text); _change_notify("text"); }; - + selection_clear(); } void LineEdit::set_max_length(int p_max_length) { - + ERR_FAIL_COND(p_max_length<0); max_length = p_max_length; set_text(text); } int LineEdit::get_max_length() const { - + return max_length; } void LineEdit::selection_fill_at_cursor() { - + int aux; - + selection.begin=cursor_pos; selection.end=selection.cursor_start; - + if (selection.end<selection.begin) { aux=selection.end; selection.end=selection.begin; selection.begin=aux; } - + selection.enabled=(selection.begin!=selection.end); } void LineEdit::select_all() { - + if (!text.length()) return; - + selection.begin=0; selection.end=text.length(); selection.enabled=true; update(); - + } void LineEdit::set_editable(bool p_editable) { - + editable=p_editable; update(); } bool LineEdit::is_editable() const { - + return editable; } void LineEdit::set_secret(bool p_secret) { - + pass=p_secret; update(); } bool LineEdit::is_secret() const { - + return pass; } @@ -928,24 +928,24 @@ bool LineEdit::is_text_field() const { } 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("clear"),&LineEdit::clear); - ObjectTypeDB::bind_method(_MD("select_all"),&LineEdit::select_all); + ObjectTypeDB::bind_method(_MD("clear"),&LineEdit::clear); + ObjectTypeDB::bind_method(_MD("select_all"),&LineEdit::select_all); ObjectTypeDB::bind_method(_MD("set_text","text"),&LineEdit::set_text); - ObjectTypeDB::bind_method(_MD("get_text"),&LineEdit::get_text); + ObjectTypeDB::bind_method(_MD("get_text"),&LineEdit::get_text); ObjectTypeDB::bind_method(_MD("set_cursor_pos","pos"),&LineEdit::set_cursor_pos); - ObjectTypeDB::bind_method(_MD("get_cursor_pos"),&LineEdit::get_cursor_pos); + ObjectTypeDB::bind_method(_MD("get_cursor_pos"),&LineEdit::get_cursor_pos); ObjectTypeDB::bind_method(_MD("set_max_length","chars"),&LineEdit::set_max_length); - ObjectTypeDB::bind_method(_MD("get_max_length"),&LineEdit::get_max_length); + ObjectTypeDB::bind_method(_MD("get_max_length"),&LineEdit::get_max_length); ObjectTypeDB::bind_method(_MD("append_at_cursor","text"),&LineEdit::append_at_cursor); ObjectTypeDB::bind_method(_MD("set_editable","enabled"),&LineEdit::set_editable); - ObjectTypeDB::bind_method(_MD("is_editable"),&LineEdit::is_editable); + ObjectTypeDB::bind_method(_MD("is_editable"),&LineEdit::is_editable); ObjectTypeDB::bind_method(_MD("set_secret","enabled"),&LineEdit::set_secret); - ObjectTypeDB::bind_method(_MD("is_secret"),&LineEdit::is_secret); + ObjectTypeDB::bind_method(_MD("is_secret"),&LineEdit::is_secret); ObjectTypeDB::bind_method(_MD("select","from","to"),&LineEdit::select,DEFVAL(0),DEFVAL(-1)); ADD_SIGNAL( MethodInfo("text_changed", PropertyInfo( Variant::STRING, "text" )) ); @@ -964,25 +964,25 @@ void LineEdit::_bind_methods() { } LineEdit::LineEdit() { - + align = ALIGN_LEFT; cached_width = 0; cursor_pos=0; window_pos=0; max_length = 0; pass=false; - + selection_clear(); set_focus_mode( FOCUS_ALL ); editable=true; set_default_cursor_shape(CURSOR_IBEAM); set_stop_mouse(true); - - + + } LineEdit::~LineEdit() { - - + + } |