Sfoglia il codice sorgente

Merge pull request #105560 from BrotherShort/Make-controls-more-precise

Make the position and the size of FileSystem controls more precise
Rémi Verschelde 3 mesi fa
parent
commit
7d363c2d5c
3 ha cambiato i file con 31 aggiunte e 24 eliminazioni
  1. 11 7
      editor/filesystem_dock.cpp
  2. 12 9
      scene/gui/item_list.cpp
  3. 8 8
      scene/gui/item_list.h

+ 11 - 7
editor/filesystem_dock.cpp

@@ -107,7 +107,7 @@ bool FileSystemList::edit_selected() {
 	Rect2 popup_rect;
 	Vector2 ofs;
 
-	Vector2 icon_size = get_item_icon(s)->get_size();
+	Vector2 icon_size = get_fixed_icon_size() * get_icon_scale();
 
 	// Handles the different icon modes (TOP/LEFT).
 	switch (get_icon_mode()) {
@@ -120,12 +120,12 @@ bool FileSystemList::edit_selected() {
 				rect.position.x -= get_h_scroll_bar()->get_value();
 			}
 			ofs = Vector2(0, Math::floor((MAX(line_editor->get_minimum_size().height, rect.size.height) - rect.size.height) / 2));
-			popup_rect.position = get_screen_position() + rect.position - ofs;
+			popup_rect.position = rect.position - ofs;
 			popup_rect.size = rect.size;
 
 			// Adjust for icon position and size.
-			popup_rect.size.x -= icon_size.x;
-			popup_rect.position.x += icon_size.x;
+			popup_rect.size.x -= MAX(theme_cache.h_separation, 0) / 2 + icon_size.x;
+			popup_rect.position.x += MAX(theme_cache.h_separation, 0) / 2 + icon_size.x;
 			break;
 		case ItemList::ICON_MODE_TOP:
 			rect = get_item_rect(s, false);
@@ -135,14 +135,18 @@ bool FileSystemList::edit_selected() {
 			if (get_h_scroll_bar()->is_visible()) {
 				rect.position.x -= get_h_scroll_bar()->get_value();
 			}
-			popup_rect.position = get_screen_position() + rect.position;
+			popup_rect.position = rect.position;
 			popup_rect.size = rect.size;
 
 			// Adjust for icon position and size.
-			popup_rect.size.y -= icon_size.y;
-			popup_rect.position.y += icon_size.y;
+			popup_rect.size.y -= MAX(theme_cache.v_separation, 0) / 2 + theme_cache.icon_margin + icon_size.y;
+			popup_rect.position.y += MAX(theme_cache.v_separation, 0) / 2 + theme_cache.icon_margin + icon_size.y;
 			break;
 	}
+	if (is_layout_rtl()) {
+		popup_rect.position.x = get_size().width - popup_rect.position.x - popup_rect.size.x;
+	}
+	popup_rect.position += get_screen_position();
 
 	popup_editor->set_position(popup_rect.position);
 	popup_editor->set_size(popup_rect.size);

+ 12 - 9
scene/gui/item_list.cpp

@@ -329,11 +329,14 @@ Rect2 ItemList::get_item_rect(int p_idx, bool p_expand) const {
 	ERR_FAIL_INDEX_V(p_idx, items.size(), Rect2());
 
 	Rect2 ret = items[p_idx].rect_cache;
-	ret.position += theme_cache.panel_style->get_offset();
-
 	if (p_expand && p_idx % current_columns == current_columns - 1) {
-		ret.size.width = get_size().width - ret.position.x;
+		int width = get_size().width - theme_cache.panel_style->get_minimum_size().width;
+		if (scroll_bar_v->is_visible()) {
+			width -= scroll_bar_v->get_combined_minimum_size().width;
+		}
+		ret.size.width = width - ret.position.x;
 	}
+	ret.position += theme_cache.panel_style->get_offset();
 	return ret;
 }
 
@@ -1524,9 +1527,7 @@ void ItemList::_notification(int p_what) {
 						icon_size = items[i].get_icon_size() * icon_scale;
 					}
 
-					Vector2 icon_ofs;
-
-					Point2 pos = items[i].rect_cache.position + icon_ofs + base_ofs;
+					Point2 pos = items[i].rect_cache.position + base_ofs;
 
 					if (icon_mode == ICON_MODE_TOP) {
 						pos.y += MAX(theme_cache.v_separation, 0) / 2;
@@ -1579,14 +1580,14 @@ void ItemList::_notification(int p_what) {
 						tag_icon_size = items[i].tag_icon->get_size();
 					}
 
-					Point2 draw_pos = items[i].rect_cache.position;
+					Point2 draw_pos = items[i].rect_cache.position + base_ofs;
 					draw_pos.x += MAX(theme_cache.h_separation, 0) / 2;
 					draw_pos.y += MAX(theme_cache.v_separation, 0) / 2;
 					if (rtl) {
 						draw_pos.x = size.width - draw_pos.x - tag_icon_size.x;
 					}
 
-					draw_texture_rect(items[i].tag_icon, Rect2(draw_pos + base_ofs, tag_icon_size));
+					draw_texture_rect(items[i].tag_icon, Rect2(draw_pos, tag_icon_size));
 				}
 
 				if (!items[i].text.is_empty()) {
@@ -1646,10 +1647,12 @@ void ItemList::_notification(int p_what) {
 							text_ofs.x += MAX(theme_cache.h_separation, 0) / 2;
 						}
 
+						real_t text_width_ofs = text_ofs.x;
+
 						text_ofs += base_ofs;
 						text_ofs += items[i].rect_cache.position;
 
-						float text_w = items[i].rect_cache.size.width - icon_size.x - MAX(theme_cache.h_separation, 0);
+						float text_w = items[i].rect_cache.size.width - text_width_ofs;
 						if (wraparound_items && items[i].rect_cache.size.width > width) {
 							text_w -= items[i].rect_cache.size.width - width;
 						}

+ 8 - 8
scene/gui/item_list.h

@@ -143,6 +143,14 @@ private:
 
 	bool do_autoscroll_to_bottom = false;
 
+	void _scroll_changed(double);
+	void _shape_text(int p_idx);
+	void _mouse_exited();
+	void _shift_range_select(int p_from, int p_to);
+
+	String _atr(int p_idx, const String &p_text) const;
+
+protected:
 	struct ThemeCache {
 		int h_separation = 0;
 		int v_separation = 0;
@@ -171,14 +179,6 @@ private:
 		Color guide_color;
 	} theme_cache;
 
-	void _scroll_changed(double);
-	void _shape_text(int p_idx);
-	void _mouse_exited();
-	void _shift_range_select(int p_from, int p_to);
-
-	String _atr(int p_idx, const String &p_text) const;
-
-protected:
 	void _notification(int p_what);
 	bool _set(const StringName &p_name, const Variant &p_value);
 	bool _get(const StringName &p_name, Variant &r_ret) const { return property_helper.property_get_value(p_name, r_ret); }