committed by
Rémi Verschelde
parent
830947feaf
commit
424a104666
@ -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() {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user