mirror of
https://github.com/godotengine/godot.git
synced 2025-10-20 00:13:30 +00:00
Changes to FileSystem Dock
-Replaced buttons for file actions fo RMB menu -Added a split mode, if the dock is not sharing vertical space with anything else -imroved drag and drop support
This commit is contained in:
parent
bed3efb17e
commit
8b47e26f59
5 changed files with 564 additions and 276 deletions
|
@ -410,16 +410,18 @@ void ItemList::_input_event(const InputEvent& p_event) {
|
||||||
defer_select_single=-1;
|
defer_select_single=-1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (defer_select_single>=0 && p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT && !p_event.mouse_button.pressed) {
|
if (defer_select_single>=0 && p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT && !p_event.mouse_button.pressed) {
|
||||||
|
|
||||||
select(defer_select_single,true);
|
select(defer_select_single,true);
|
||||||
|
|
||||||
|
|
||||||
emit_signal("multi_selected",defer_select_single,true);
|
emit_signal("multi_selected",defer_select_single,true);
|
||||||
defer_select_single=-1;
|
defer_select_single=-1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_event.type==InputEvent::MOUSE_BUTTON && p_event.mouse_button.button_index==BUTTON_LEFT && p_event.mouse_button.pressed) {
|
if (p_event.type==InputEvent::MOUSE_BUTTON && (p_event.mouse_button.button_index==BUTTON_LEFT || (allow_rmb_select && p_event.mouse_button.button_index==BUTTON_RIGHT)) && p_event.mouse_button.pressed) {
|
||||||
|
|
||||||
const InputEventMouseButton &mb = p_event.mouse_button;
|
const InputEventMouseButton &mb = p_event.mouse_button;
|
||||||
|
|
||||||
|
@ -458,6 +460,7 @@ void ItemList::_input_event(const InputEvent& p_event) {
|
||||||
if (select_mode==SELECT_MULTI && items[i].selected && mb.mod.command) {
|
if (select_mode==SELECT_MULTI && items[i].selected && mb.mod.command) {
|
||||||
unselect(i);
|
unselect(i);
|
||||||
emit_signal("multi_selected",i,false);
|
emit_signal("multi_selected",i,false);
|
||||||
|
|
||||||
} else if (select_mode==SELECT_MULTI && mb.mod.shift && current>=0 && current<items.size() && current!=i) {
|
} else if (select_mode==SELECT_MULTI && mb.mod.shift && current>=0 && current<items.size() && current!=i) {
|
||||||
|
|
||||||
int from = current;
|
int from = current;
|
||||||
|
@ -471,29 +474,45 @@ void ItemList::_input_event(const InputEvent& p_event) {
|
||||||
if (selected)
|
if (selected)
|
||||||
emit_signal("multi_selected",i,true);
|
emit_signal("multi_selected",i,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_event.mouse_button.button_index==BUTTON_RIGHT) {
|
||||||
|
|
||||||
|
emit_signal("item_rmb_selected",i,Vector2(mb.x,mb.y));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (!mb.doubleclick && !mb.mod.command && select_mode==SELECT_MULTI && items[i].selectable && items[i].selected) {
|
if (!mb.doubleclick && !mb.mod.command && select_mode==SELECT_MULTI && items[i].selectable && items[i].selected && p_event.mouse_button.button_index==BUTTON_LEFT) {
|
||||||
defer_select_single=i;
|
defer_select_single=i;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool selected = !items[i].selected;
|
|
||||||
|
|
||||||
select(i,select_mode==SELECT_SINGLE || !mb.mod.command);
|
if (items[i].selected && p_event.mouse_button.button_index==BUTTON_RIGHT) {
|
||||||
if (selected) {
|
|
||||||
if (select_mode==SELECT_SINGLE) {
|
emit_signal("item_rmb_selected",i,Vector2(mb.x,mb.y));
|
||||||
emit_signal("item_selected",i);
|
} else {
|
||||||
} else
|
bool selected = !items[i].selected;
|
||||||
emit_signal("multi_selected",i,true);
|
|
||||||
|
|
||||||
|
select(i,select_mode==SELECT_SINGLE || !mb.mod.command);
|
||||||
|
|
||||||
|
if (selected) {
|
||||||
|
if (select_mode==SELECT_SINGLE) {
|
||||||
|
emit_signal("item_selected",i);
|
||||||
|
} else
|
||||||
|
emit_signal("multi_selected",i,true);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_event.mouse_button.button_index==BUTTON_RIGHT) {
|
||||||
|
|
||||||
|
emit_signal("item_rmb_selected",i,Vector2(mb.x,mb.y));
|
||||||
|
} else if (/*select_mode==SELECT_SINGLE &&*/ mb.doubleclick) {
|
||||||
|
|
||||||
|
emit_signal("item_activated",i);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/*select_mode==SELECT_SINGLE &&*/ mb.doubleclick) {
|
|
||||||
|
|
||||||
emit_signal("item_activated",i);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1172,6 +1191,16 @@ int ItemList::find_metadata(const Variant& p_metadata) const {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ItemList::set_allow_rmb_select(bool p_allow) {
|
||||||
|
allow_rmb_select=p_allow;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ItemList::get_allow_rmb_select() const {
|
||||||
|
|
||||||
|
return allow_rmb_select;
|
||||||
|
}
|
||||||
|
|
||||||
void ItemList::_bind_methods(){
|
void ItemList::_bind_methods(){
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("add_item","text","icon:Texture","selectable"),&ItemList::add_item,DEFVAL(Variant()),DEFVAL(true));
|
ObjectTypeDB::bind_method(_MD("add_item","text","icon:Texture","selectable"),&ItemList::add_item,DEFVAL(Variant()),DEFVAL(true));
|
||||||
|
@ -1232,6 +1261,9 @@ void ItemList::_bind_methods(){
|
||||||
ObjectTypeDB::bind_method(_MD("set_max_icon_size","size"),&ItemList::set_max_icon_size);
|
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_max_icon_size"),&ItemList::get_max_icon_size);
|
||||||
|
|
||||||
|
ObjectTypeDB::bind_method(_MD("set_allow_rmb_select","allow"),&ItemList::set_allow_rmb_select);
|
||||||
|
ObjectTypeDB::bind_method(_MD("get_allow_rmb_select"),&ItemList::get_allow_rmb_select);
|
||||||
|
|
||||||
ObjectTypeDB::bind_method(_MD("get_item_at_pos","pos","exact"),&ItemList::get_item_at_pos,DEFVAL(false));
|
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);
|
ObjectTypeDB::bind_method(_MD("ensure_current_is_visible"),&ItemList::ensure_current_is_visible);
|
||||||
|
@ -1245,6 +1277,7 @@ void ItemList::_bind_methods(){
|
||||||
BIND_CONSTANT( SELECT_MULTI );
|
BIND_CONSTANT( SELECT_MULTI );
|
||||||
|
|
||||||
ADD_SIGNAL( MethodInfo("item_selected",PropertyInfo(Variant::INT,"index")));
|
ADD_SIGNAL( MethodInfo("item_selected",PropertyInfo(Variant::INT,"index")));
|
||||||
|
ADD_SIGNAL( MethodInfo("item_rmb_selected",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::VECTOR2,"atpos")));
|
||||||
ADD_SIGNAL( MethodInfo("multi_selected",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::BOOL,"selected")));
|
ADD_SIGNAL( MethodInfo("multi_selected",PropertyInfo(Variant::INT,"index"),PropertyInfo(Variant::BOOL,"selected")));
|
||||||
ADD_SIGNAL( MethodInfo("item_activated",PropertyInfo(Variant::INT,"index")));
|
ADD_SIGNAL( MethodInfo("item_activated",PropertyInfo(Variant::INT,"index")));
|
||||||
}
|
}
|
||||||
|
@ -1273,6 +1306,7 @@ ItemList::ItemList() {
|
||||||
search_time_msec=0;
|
search_time_msec=0;
|
||||||
ensure_selected_visible=false;
|
ensure_selected_visible=false;
|
||||||
defer_select_single=-1;
|
defer_select_single=-1;
|
||||||
|
allow_rmb_select=false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,9 +61,10 @@ private:
|
||||||
int max_columns;
|
int max_columns;
|
||||||
Size2 min_icon_size;
|
Size2 min_icon_size;
|
||||||
Size2 max_icon_size;
|
Size2 max_icon_size;
|
||||||
|
|
||||||
int defer_select_single;
|
int defer_select_single;
|
||||||
|
|
||||||
|
bool allow_rmb_select;
|
||||||
|
|
||||||
void _scroll_changed(double);
|
void _scroll_changed(double);
|
||||||
void _input_event(const InputEvent& p_event);
|
void _input_event(const InputEvent& p_event);
|
||||||
protected:
|
protected:
|
||||||
|
@ -138,6 +139,9 @@ public:
|
||||||
void set_max_icon_size(const Size2& p_size);
|
void set_max_icon_size(const Size2& p_size);
|
||||||
Size2 get_max_icon_size() const;
|
Size2 get_max_icon_size() const;
|
||||||
|
|
||||||
|
void set_allow_rmb_select(bool p_allow);
|
||||||
|
bool get_allow_rmb_select() const;
|
||||||
|
|
||||||
void ensure_current_is_visible();
|
void ensure_current_is_visible();
|
||||||
|
|
||||||
void sort_items_by_text();
|
void sort_items_by_text();
|
||||||
|
|
|
@ -2057,8 +2057,9 @@ void EditorNode::_menu_option_confirm(int p_option,bool p_confirmed) {
|
||||||
case FILE_QUICK_OPEN_FILE: {
|
case FILE_QUICK_OPEN_FILE: {
|
||||||
|
|
||||||
|
|
||||||
quick_open->popup("Resource", false, true);
|
//quick_open->popup("Resource", false, true);
|
||||||
quick_open->set_title(TTR("Quick Search File.."));
|
//quick_open->set_title(TTR("Quick Search File.."));
|
||||||
|
scenes_dock->focus_on_filter();
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case FILE_RUN_SCRIPT: {
|
case FILE_RUN_SCRIPT: {
|
||||||
|
@ -3942,12 +3943,6 @@ void EditorNode::_update_recent_scenes() {
|
||||||
|
|
||||||
void EditorNode::_quick_opened() {
|
void EditorNode::_quick_opened() {
|
||||||
|
|
||||||
if (current_option==FILE_QUICK_OPEN_FILE) {
|
|
||||||
String res_path = quick_open->get_selected();
|
|
||||||
|
|
||||||
scenes_dock->open(res_path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector<String> files = quick_open->get_selected_files();
|
Vector<String> files = quick_open->get_selected_files();
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -39,6 +39,7 @@
|
||||||
#include "scene/gui/menu_button.h"
|
#include "scene/gui/menu_button.h"
|
||||||
#include "scene/gui/item_list.h"
|
#include "scene/gui/item_list.h"
|
||||||
#include "scene/gui/progress_bar.h"
|
#include "scene/gui/progress_bar.h"
|
||||||
|
#include "scene/gui/split_container.h"
|
||||||
|
|
||||||
#include "os/dir_access.h"
|
#include "os/dir_access.h"
|
||||||
#include "os/thread.h"
|
#include "os/thread.h"
|
||||||
|
@ -54,6 +55,8 @@ class ScenesDock : public VBoxContainer {
|
||||||
OBJ_TYPE( ScenesDock, VBoxContainer );
|
OBJ_TYPE( ScenesDock, VBoxContainer );
|
||||||
|
|
||||||
enum FileMenu {
|
enum FileMenu {
|
||||||
|
FILE_OPEN,
|
||||||
|
FILE_INSTANCE,
|
||||||
FILE_DEPENDENCIES,
|
FILE_DEPENDENCIES,
|
||||||
FILE_OWNERS,
|
FILE_OWNERS,
|
||||||
FILE_MOVE,
|
FILE_MOVE,
|
||||||
|
@ -65,25 +68,28 @@ class ScenesDock : public VBoxContainer {
|
||||||
|
|
||||||
VBoxContainer *scanning_vb;
|
VBoxContainer *scanning_vb;
|
||||||
ProgressBar *scanning_progress;
|
ProgressBar *scanning_progress;
|
||||||
|
VSplitContainer *split_box;
|
||||||
|
VBoxContainer *file_list_vb;
|
||||||
|
|
||||||
EditorNode *editor;
|
EditorNode *editor;
|
||||||
Set<String> favorites;
|
Set<String> favorites;
|
||||||
|
|
||||||
Button *button_reload;
|
Button *button_reload;
|
||||||
Button *button_instance;
|
|
||||||
Button *button_favorite;
|
Button *button_favorite;
|
||||||
Button *button_fav_up;
|
Button *button_fav_up;
|
||||||
Button *button_fav_down;
|
Button *button_fav_down;
|
||||||
Button *button_open;
|
|
||||||
Button *button_back;
|
Button *button_back;
|
||||||
Button *display_mode;
|
Button *display_mode;
|
||||||
Button *button_hist_next;
|
Button *button_hist_next;
|
||||||
Button *button_hist_prev;
|
Button *button_hist_prev;
|
||||||
LineEdit *current_path;
|
LineEdit *current_path;
|
||||||
|
LineEdit *search_box;
|
||||||
|
Button *search_button;
|
||||||
HBoxContainer *path_hb;
|
HBoxContainer *path_hb;
|
||||||
|
|
||||||
MenuButton *file_options;
|
bool split_mode;
|
||||||
|
|
||||||
|
PopupMenu *file_options;
|
||||||
|
|
||||||
DependencyEditor *deps_editor;
|
DependencyEditor *deps_editor;
|
||||||
DependencyEditorOwners *owners_editor;
|
DependencyEditorOwners *owners_editor;
|
||||||
|
@ -107,8 +113,6 @@ class ScenesDock : public VBoxContainer {
|
||||||
Tree * tree; //directories
|
Tree * tree; //directories
|
||||||
ItemList *files;
|
ItemList *files;
|
||||||
|
|
||||||
bool tree_mode;
|
|
||||||
|
|
||||||
void _go_to_tree();
|
void _go_to_tree();
|
||||||
void _go_to_dir(const String& p_dir);
|
void _go_to_dir(const String& p_dir);
|
||||||
void _select_file(int p_idx);
|
void _select_file(int p_idx);
|
||||||
|
@ -131,6 +135,7 @@ class ScenesDock : public VBoxContainer {
|
||||||
void _bw_history();
|
void _bw_history();
|
||||||
void _push_to_history();
|
void _push_to_history();
|
||||||
|
|
||||||
|
|
||||||
void _fav_up_pressed();
|
void _fav_up_pressed();
|
||||||
void _fav_down_pressed();
|
void _fav_down_pressed();
|
||||||
void _dir_selected();
|
void _dir_selected();
|
||||||
|
@ -138,9 +143,27 @@ class ScenesDock : public VBoxContainer {
|
||||||
void _rescan();
|
void _rescan();
|
||||||
void _set_scannig_mode();
|
void _set_scannig_mode();
|
||||||
|
|
||||||
|
|
||||||
void _favorites_pressed();
|
void _favorites_pressed();
|
||||||
void _instance_pressed();
|
|
||||||
void _open_pressed();
|
void _open_pressed();
|
||||||
|
void _search_toggled();
|
||||||
|
void _search_changed(const String& p_text);
|
||||||
|
|
||||||
|
|
||||||
|
void _files_list_rmb_select(int p_item,const Vector2& p_pos);
|
||||||
|
|
||||||
|
|
||||||
|
struct FileInfo {
|
||||||
|
String name;
|
||||||
|
String path;
|
||||||
|
StringName type;
|
||||||
|
|
||||||
|
bool operator<(const FileInfo& fi) const {
|
||||||
|
return name < fi.name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void _search(EditorFileSystemDirectory *p_path, List<FileInfo>* matches, int p_max_items);
|
||||||
|
|
||||||
Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
|
Variant get_drag_data_fw(const Point2& p_point,Control* p_from);
|
||||||
bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
|
bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
|
||||||
|
@ -152,7 +175,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
String get_selected_path() const;
|
String get_selected_path() const;
|
||||||
void open(const String& p_path);
|
void focus_on_filter();
|
||||||
|
|
||||||
void fix_dependencies(const String& p_for_file);
|
void fix_dependencies(const String& p_for_file);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue