New reworked AnimatedSprite!

-New SpriteFrames editor, with support for drag&drop, multiple animation
sets, animation speed and loop.
-New AnimatedSprite, with support for all the new features!
AnimatedSprite3D has not been updated yet.
-Added support for drag&drop to other editors, such as resourcepreload,
sample library,  etc.
This commit is contained in:
Juan Linietsky 2016-05-14 23:48:23 -03:00
parent 7913e792ac
commit bed3efb17e
23 changed files with 1400 additions and 193 deletions

View file

@ -383,6 +383,17 @@ Size2 ItemList::get_min_icon_size() const {
return min_icon_size;
}
void ItemList::set_max_icon_size(const Size2& p_size) {
max_icon_size=p_size;
update();
}
Size2 ItemList::get_max_icon_size() const {
return max_icon_size;
}
Size2 ItemList::Item::get_icon_size() const {
if (icon.is_null())
@ -690,6 +701,55 @@ void ItemList::ensure_current_is_visible() {
update();
}
static Size2 _adjust_to_max_size(Size2 p_size, Size2 p_max_size) {
if (p_max_size.x<=0)
p_max_size.x=1e20;
if (p_max_size.y<=0)
p_max_size.y=1e20;
Size2 new_size;
if (p_size.x > p_max_size.x) {
new_size.width=p_max_size.x;
new_size.height=p_size.height * p_max_size.width / p_size.width;
if (new_size.height > p_max_size.height) {
new_size=Size2(); //invalid
}
}
if (p_size.y > p_max_size.y) {
Size2 new_size2;
new_size2.height=p_max_size.y;
new_size2.width=p_size.width * p_max_size.height / p_size.height;
if (new_size2.width < p_max_size.width) {
if (new_size!=Size2()) {
if (new_size2.x*new_size2.y > new_size.x*new_size.y) {
new_size=new_size2;
}
} else {
new_size=new_size2;
}
}
}
if (new_size==Size2())
return p_size;
else
return new_size;
}
void ItemList::_notification(int p_what) {
if (p_what==NOTIFICATION_RESIZED) {
@ -752,12 +812,7 @@ void ItemList::_notification(int p_what) {
Size2 minsize;
if (items[i].icon.is_valid()) {
minsize=items[i].get_icon_size();
if (min_icon_size.x!=0)
minsize.x = MAX(minsize.x,min_icon_size.x);
if (min_icon_size.y!=0)
minsize.y = MAX(minsize.y,min_icon_size.y);
minsize=_adjust_to_max_size(items[i].get_icon_size(),max_icon_size);
if (items[i].text!="") {
if (icon_mode==ICON_MODE_TOP) {
@ -902,7 +957,7 @@ void ItemList::_notification(int p_what) {
Vector2 text_ofs;
if (items[i].icon.is_valid()) {
Size2 icon_size = items[i].get_icon_size();
Size2 icon_size = _adjust_to_max_size(items[i].get_icon_size(),max_icon_size);
Vector2 icon_ofs;
if (min_icon_size!=Vector2()) {
@ -922,7 +977,7 @@ void ItemList::_notification(int p_what) {
}
if (items[i].icon_region.has_no_area())
draw_texture(items[i].icon, pos);
draw_texture_rect(items[i].icon, Rect2(pos,icon_size) );
else
draw_texture_rect_region(items[i].icon, Rect2(pos, icon_size), items[i].icon_region);
@ -1044,7 +1099,7 @@ void ItemList::_scroll_changed(double) {
update();
}
int ItemList::get_item_at_pos(const Point2& p_pos) const {
int ItemList::get_item_at_pos(const Point2& p_pos, bool p_exact) const {
Vector2 pos=p_pos;
Ref<StyleBox> bg = get_stylebox("bg");
@ -1067,7 +1122,7 @@ int ItemList::get_item_at_pos(const Point2& p_pos) const {
}
float dist = rc.distance_to(pos);
if (dist<closest_dist) {
if (!p_exact && dist<closest_dist) {
closest=i;
closest_dist=dist;
}
@ -1174,7 +1229,10 @@ void ItemList::_bind_methods(){
ObjectTypeDB::bind_method(_MD("set_min_icon_size","size"),&ItemList::set_min_icon_size);
ObjectTypeDB::bind_method(_MD("get_min_icon_size"),&ItemList::get_min_icon_size);
ObjectTypeDB::bind_method(_MD("get_item_at_pos","pos"),&ItemList::get_item_at_pos);
ObjectTypeDB::bind_method(_MD("set_max_icon_size","size"),&ItemList::set_max_icon_size);
ObjectTypeDB::bind_method(_MD("get_max_icon_size"),&ItemList::get_max_icon_size);
ObjectTypeDB::bind_method(_MD("get_item_at_pos","pos","exact"),&ItemList::get_item_at_pos,DEFVAL(false));
ObjectTypeDB::bind_method(_MD("ensure_current_is_visible"),&ItemList::ensure_current_is_visible);

View file

@ -60,6 +60,7 @@ private:
int max_text_lines;
int max_columns;
Size2 min_icon_size;
Size2 max_icon_size;
int defer_select_single;
@ -134,13 +135,16 @@ public:
void set_min_icon_size(const Size2& p_size);
Size2 get_min_icon_size() const;
void set_max_icon_size(const Size2& p_size);
Size2 get_max_icon_size() const;
void ensure_current_is_visible();
void sort_items_by_text();
int find_metadata(const Variant& p_metadata) const;
virtual String get_tooltip(const Point2& p_pos) const;
int get_item_at_pos(const Point2& p_pos) const;
int get_item_at_pos(const Point2& p_pos,bool p_exact=false) const;
ItemList();
~ItemList();

View file

@ -1566,7 +1566,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
if (p_button==BUTTON_LEFT) {
/* process selection */
if (p_doubleclick && (!c.editable || c.mode==TreeItem::CELL_MODE_CUSTOM || c.mode==TreeItem::CELL_MODE_ICON || c.mode==TreeItem::CELL_MODE_CHECK)) {
if (p_doubleclick && (!c.editable || c.mode==TreeItem::CELL_MODE_CUSTOM || c.mode==TreeItem::CELL_MODE_ICON /*|| c.mode==TreeItem::CELL_MODE_CHECK*/)) { //it' s confusing for check
emit_signal("item_activated");
return -1;
@ -1626,7 +1626,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
/* editing */
bool bring_up_editor=c.selected;// && already_selected;
bool bring_up_editor=force_select_on_already_selected ? (c.selected && already_selected) : c.selected;
bool bring_up_value_editor=false;
String editor_text=c.text;
@ -3455,6 +3455,16 @@ int Tree::get_drop_mode_flags() const {
return drop_mode_flags;
}
void Tree::set_single_select_cell_editing_only_when_already_selected(bool p_enable) {
force_select_on_already_selected=p_enable;
}
bool Tree::get_single_select_cell_editing_only_when_already_selected() const {
return force_select_on_already_selected;
}
void Tree::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_range_click_timeout"),&Tree::_range_click_timeout);
@ -3505,6 +3515,8 @@ void Tree::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_drop_mode_flags","flags"),&Tree::set_drop_mode_flags);
ObjectTypeDB::bind_method(_MD("get_drop_mode_flags"),&Tree::get_drop_mode_flags);
ObjectTypeDB::bind_method(_MD("set_single_select_cell_editing_only_when_already_selected","enable"),&Tree::set_single_select_cell_editing_only_when_already_selected);
ObjectTypeDB::bind_method(_MD("get_single_select_cell_editing_only_when_already_selected"),&Tree::get_single_select_cell_editing_only_when_already_selected);
ADD_SIGNAL( MethodInfo("item_selected"));
ADD_SIGNAL( MethodInfo("cell_selected"));
@ -3610,6 +3622,7 @@ Tree::Tree() {
drop_mode_over=NULL;
drop_mode_section=0;
single_select_defer=NULL;
force_select_on_already_selected=false;
}

View file

@ -439,6 +439,8 @@ friend class TreeItem;
bool drag_touching_deaccel;
bool click_handled;
bool force_select_on_already_selected;
bool hide_folding;
ValueEvaluator *evaluator;
@ -514,6 +516,9 @@ public:
void set_drop_mode_flags(int p_flags);
int get_drop_mode_flags() const;
void set_single_select_cell_editing_only_when_already_selected(bool p_enable);
bool get_single_select_cell_editing_only_when_already_selected() const;
void set_value_evaluator(ValueEvaluator *p_evaluator);
Tree();