diff options
Diffstat (limited to 'scene')
| -rw-r--r-- | scene/gui/base_button.cpp | 6 | ||||
| -rw-r--r-- | scene/gui/control.cpp | 5 | ||||
| -rw-r--r-- | scene/gui/popup_menu.cpp | 57 | ||||
| -rw-r--r-- | scene/gui/popup_menu.h | 1 | ||||
| -rw-r--r-- | scene/gui/text_edit.cpp | 7 | ||||
| -rw-r--r-- | scene/gui/tree.cpp | 5 | ||||
| -rw-r--r-- | scene/main/scene_tree.cpp | 2 | ||||
| -rw-r--r-- | scene/main/viewport.cpp | 21 | ||||
| -rw-r--r-- | scene/resources/bit_mask.cpp | 4 | ||||
| -rw-r--r-- | scene/resources/bit_mask.h | 1 |
10 files changed, 64 insertions, 45 deletions
diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 0f1681a24e..d765248cca 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -539,15 +539,15 @@ BaseButton::BaseButton() { set_focus_mode(FOCUS_ALL); enabled_focus_mode = FOCUS_ALL; action_mode = ACTION_MODE_BUTTON_RELEASE; +} + +BaseButton::~BaseButton() { if (button_group.is_valid()) { button_group->buttons.erase(this); } } -BaseButton::~BaseButton() { -} - void ButtonGroup::get_buttons(List<BaseButton *> *r_buttons) { for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index 6419659741..979a65f455 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -861,6 +861,8 @@ Ref<StyleBox> Control::get_stylebox(const StringName &p_name, const StringName & class_name = ClassDB::get_parent_class_nocheck(class_name); } + class_name = type; + Control *parent = Object::cast_to<Control>(theme_owner->get_parent()); if (parent) @@ -869,8 +871,6 @@ Ref<StyleBox> Control::get_stylebox(const StringName &p_name, const StringName & theme_owner = NULL; } - class_name = type; - while (class_name != StringName()) { if (Theme::get_default()->has_stylebox(p_name, class_name)) return Theme::get_default()->get_stylebox(p_name, class_name); @@ -2155,6 +2155,7 @@ void Control::set_theme(const Ref<Theme> &p_theme) { data.theme = p_theme; if (!p_theme.is_null()) { + data.theme_owner = this; _propagate_theme_changed(this, this); } else { diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 276df827d5..cf01ce8643 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -189,6 +189,26 @@ void PopupMenu::_submenu_timeout() { submenu_over = -1; } +void PopupMenu::_scroll(float p_factor, const Point2 &p_over) { + + const float global_y = get_global_position().y; + + int vseparation = get_constant("vseparation"); + Ref<Font> font = get_font("font"); + + float dy = (vseparation + font->get_height()) * 3 * p_factor; + if (dy > 0 && global_y < 0) + dy = MIN(dy, -global_y - 1); + else if (dy < 0 && global_y + get_size().y > get_viewport_rect().size.y) + dy = -MIN(-dy, global_y + get_size().y - get_viewport_rect().size.y - 1); + set_position(get_position() + Vector2(0, dy)); + + Ref<InputEventMouseMotion> ie; + ie.instance(); + ie->set_position(p_over - Vector2(0, dy)); + _gui_input(ie); +} + void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> k = p_event; @@ -286,39 +306,13 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { case BUTTON_WHEEL_DOWN: { if (get_global_position().y + get_size().y > get_viewport_rect().size.y) { - - int vseparation = get_constant("vseparation"); - Ref<Font> font = get_font("font"); - - Point2 pos = get_position(); - int s = (vseparation + font->get_height()) * 3; - pos.y -= (s * b->get_factor()); - set_position(pos); - - //update hover - Ref<InputEventMouseMotion> ie; - ie.instance(); - ie->set_position(b->get_position() + Vector2(0, s)); - _gui_input(ie); + _scroll(-b->get_factor(), b->get_position()); } } break; case BUTTON_WHEEL_UP: { if (get_global_position().y < 0) { - - int vseparation = get_constant("vseparation"); - Ref<Font> font = get_font("font"); - - Point2 pos = get_position(); - int s = (vseparation + font->get_height()) * 3; - pos.y += (s * b->get_factor()); - set_position(pos); - - //update hover - Ref<InputEventMouseMotion> ie; - ie.instance(); - ie->set_position(b->get_position() - Vector2(0, s)); - _gui_input(ie); + _scroll(b->get_factor(), b->get_position()); } } break; case BUTTON_LEFT: { @@ -387,6 +381,13 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { update(); } } + + Ref<InputEventPanGesture> pan_gesture = p_event; + if (pan_gesture.is_valid()) { + if (get_global_position().y + get_size().y > get_viewport_rect().size.y || get_global_position().y < 0) { + _scroll(-pan_gesture->get_delta().y, pan_gesture->get_position()); + } + } } bool PopupMenu::has_point(const Point2 &p_point) const { diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index 321dae1bd2..60f36e95ec 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -84,6 +84,7 @@ class PopupMenu : public Popup { String _get_accel_text(int p_item) const; int _get_mouse_over(const Point2 &p_over) const; virtual Size2 get_minimum_size() const; + void _scroll(float p_factor, const Point2 &p_over); void _gui_input(const Ref<InputEvent> &p_event); void _activate_submenu(int over); void _submenu_timeout(); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 881cdc48f7..a3f59b54fc 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -3641,9 +3641,10 @@ void TextEdit::center_viewport_to_cursor() { int visible_rows = get_visible_rows(); if (h_scroll->is_visible_in_tree()) visible_rows -= ((h_scroll->get_combined_minimum_size().height - 1) / get_row_height()); - - int max_ofs = text.size() - (scroll_past_end_of_file_enabled ? 1 : num_lines_from(text.size() - 1, -visible_rows)); - cursor.line_ofs = CLAMP(cursor.line - num_lines_from(cursor.line - visible_rows / 2, -visible_rows / 2), 0, max_ofs); + if (text.size() >= visible_rows) { + int max_ofs = text.size() - (scroll_past_end_of_file_enabled ? 1 : MAX(num_lines_from(text.size() - 1, -visible_rows), 0)); + cursor.line_ofs = CLAMP(cursor.line - num_lines_from(MAX(cursor.line - visible_rows / 2, 0), -visible_rows / 2), 0, max_ofs); + } int cursor_x = get_column_x_offset(cursor.column, text[cursor.line]); if (cursor_x > (cursor.x_ofs + visible_width)) diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 0dffc4ee9a..fd5a47d875 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -916,6 +916,7 @@ int Tree::compute_item_height(TreeItem *p_item) const { if (p_item == root && hide_root) return 0; + ERR_FAIL_COND_V(cache.font.is_null(), 0); int height = cache.font->get_height(); for (int i = 0; i < columns.size(); i++) { @@ -989,6 +990,8 @@ int Tree::get_item_height(TreeItem *p_item) const { void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color) { + ERR_FAIL_COND(cache.font.is_null()); + Rect2i rect = p_rect; Ref<Font> font = cache.font; String text = p_cell.text; @@ -1058,6 +1061,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 //draw separation. //if (p_item->get_parent()!=root || !hide_root) + ERR_FAIL_COND_V(cache.font.is_null(), -1); Ref<Font> font = cache.font; int font_ascent = font->get_ascent(); @@ -2794,6 +2798,7 @@ void Tree::update_scrollbars() { int Tree::_get_title_button_height() const { + ERR_FAIL_COND_V(cache.font.is_null() || cache.title_button.is_null(), 0); return show_column_titles ? cache.font->get_height() + cache.title_button->get_minimum_size().height : 0; } diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index ce548768bb..bc250ff4d5 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -2351,7 +2351,7 @@ SceneTree::SceneTree() { ProjectSettings::get_singleton()->set("rendering/environment/default_environment", ""); } else { //file was erased, notify user. - ERR_PRINTS(RTR("Default Environment as specified in Project Setings (Rendering -> Environment -> Default Environment) could not be loaded.")); + ERR_PRINTS(RTR("Default Environment as specified in Project Settings (Rendering -> Environment -> Default Environment) could not be loaded.")); } } } diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 6ac99524c8..5f1257a855 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -679,6 +679,20 @@ void Viewport::_notification(int p_what) { } } break; + case SceneTree::NOTIFICATION_WM_FOCUS_OUT: { + if (gui.mouse_focus) { + //if mouse is being pressed, send a release event + Ref<InputEventMouseButton> mb; + mb.instance(); + mb->set_position(gui.mouse_focus->get_local_mouse_position()); + mb->set_global_position(gui.mouse_focus->get_local_mouse_position()); + mb->set_button_index(gui.mouse_focus_button); + mb->set_pressed(false); + Control *c = gui.mouse_focus; + gui.mouse_focus = NULL; + c->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb); + } + } break; } } @@ -2377,12 +2391,9 @@ List<Control *>::Element *Viewport::_gui_show_modal(Control *p_control) { mb->set_global_position(gui.mouse_focus->get_local_mouse_position()); mb->set_button_index(gui.mouse_focus_button); mb->set_pressed(false); - gui.mouse_focus->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb); - - //if (gui.mouse_over == gui.mouse_focus) { - // gui.mouse_focus->notification(Control::NOTIFICATION_MOUSE_EXIT); - //} + Control *c = gui.mouse_focus; gui.mouse_focus = NULL; + c->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb); } return gui.modal_stack.back(); diff --git a/scene/resources/bit_mask.cpp b/scene/resources/bit_mask.cpp index fd70dd2ebe..e99db8d9cb 100644 --- a/scene/resources/bit_mask.cpp +++ b/scene/resources/bit_mask.cpp @@ -112,8 +112,8 @@ int BitMap::get_true_bit_count() const { void BitMap::set_bit(const Point2 &p_pos, bool p_value) { - int x = Math::fast_ftoi(p_pos.x); - int y = Math::fast_ftoi(p_pos.y); + int x = p_pos.x; + int y = p_pos.y; ERR_FAIL_INDEX(x, width); ERR_FAIL_INDEX(y, height); diff --git a/scene/resources/bit_mask.h b/scene/resources/bit_mask.h index 676ec47ed3..cf126ef96b 100644 --- a/scene/resources/bit_mask.h +++ b/scene/resources/bit_mask.h @@ -39,7 +39,6 @@ class BitMap : public Resource { GDCLASS(BitMap, Resource); OBJ_SAVE_TYPE(BitMap); - RES_BASE_EXTENSION("pbm"); Vector<uint8_t> bitmask; int width; |