瀏覽代碼

Ability to get the current canvas item being drawn from stylebox.

Juan Linietsky 6 年之前
父節點
當前提交
d0b736f7e5
共有 4 個文件被更改,包括 22 次插入0 次删除
  1. 7 0
      scene/2d/canvas_item.cpp
  2. 4 0
      scene/2d/canvas_item.h
  3. 7 0
      scene/resources/style_box.cpp
  4. 4 0
      scene/resources/style_box.h

+ 7 - 0
scene/2d/canvas_item.cpp

@@ -434,6 +434,11 @@ void CanvasItem::hide() {
 	_change_notify("visible");
 }
 
+CanvasItem *CanvasItem::current_item_drawn = NULL;
+CanvasItem *CanvasItem::get_current_item_drawn() {
+	return current_item_drawn;
+}
+
 void CanvasItem::_update_callback() {
 
 	if (!is_inside_tree()) {
@@ -449,11 +454,13 @@ void CanvasItem::_update_callback() {
 			first_draw = false;
 		}
 		drawing = true;
+		current_item_drawn = this;
 		notification(NOTIFICATION_DRAW);
 		emit_signal(SceneStringNames::get_singleton()->draw);
 		if (get_script_instance()) {
 			get_script_instance()->call_multilevel_reversed(SceneStringNames::get_singleton()->_draw, NULL, 0);
 		}
+		current_item_drawn = NULL;
 		drawing = false;
 	}
 	//todo updating = false

+ 4 - 0
scene/2d/canvas_item.h

@@ -222,6 +222,8 @@ private:
 	void _set_on_top(bool p_on_top) { set_draw_behind_parent(!p_on_top); }
 	bool _is_on_top() const { return !is_draw_behind_parent_enabled(); }
 
+	static CanvasItem *current_item_drawn;
+
 protected:
 	_FORCE_INLINE_ void _notify_transform() {
 		if (!is_inside_tree()) return;
@@ -324,6 +326,8 @@ public:
 	void draw_set_transform(const Point2 &p_offset, float p_rot, const Size2 &p_scale);
 	void draw_set_transform_matrix(const Transform2D &p_matrix);
 
+	static CanvasItem *get_current_item_drawn();
+
 	/* RECT / TRANSFORM */
 
 	void set_as_toplevel(bool p_toplevel);

+ 7 - 0
scene/resources/style_box.cpp

@@ -29,6 +29,8 @@
 /*************************************************************************/
 
 #include "style_box.h"
+#include "scene/2d/canvas_item.h"
+
 #include <limits.h>
 
 bool StyleBox::test_mask(const Point2 &p_point, const Rect2 &p_rect) const {
@@ -54,6 +56,10 @@ float StyleBox::get_margin(Margin p_margin) const {
 		return margin[p_margin];
 }
 
+CanvasItem *StyleBox::get_current_item_drawn() const {
+	return CanvasItem::get_current_item_drawn();
+}
+
 Size2 StyleBox::get_minimum_size() const {
 
 	return Size2(get_margin(MARGIN_LEFT) + get_margin(MARGIN_RIGHT), get_margin(MARGIN_TOP) + get_margin(MARGIN_BOTTOM));
@@ -83,6 +89,7 @@ void StyleBox::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_minimum_size"), &StyleBox::get_minimum_size);
 	ClassDB::bind_method(D_METHOD("get_center_size"), &StyleBox::get_center_size);
 	ClassDB::bind_method(D_METHOD("get_offset"), &StyleBox::get_offset);
+	ClassDB::bind_method(D_METHOD("get_current_item_drawn"), &StyleBox::get_current_item_drawn);
 
 	ClassDB::bind_method(D_METHOD("draw", "canvas_item", "rect"), &StyleBox::draw);
 

+ 4 - 0
scene/resources/style_box.h

@@ -37,6 +37,8 @@
 /**
 	@author Juan Linietsky <[email protected]>
 */
+class CanvasItem;
+
 class StyleBox : public Resource {
 
 	GDCLASS(StyleBox, Resource);
@@ -58,6 +60,8 @@ public:
 
 	virtual void draw(RID p_canvas_item, const Rect2 &p_rect) const = 0;
 
+	CanvasItem *get_current_item_drawn() const;
+
 	Size2 get_minimum_size() const;
 	Point2 get_offset() const;