|
@@ -270,8 +270,10 @@ void FileDialog::_notification(int p_what) {
|
|
|
_setup_button(dir_up, theme_cache.parent_folder);
|
|
|
_setup_button(refresh_button, theme_cache.reload);
|
|
|
_setup_button(favorite_button, theme_cache.favorite);
|
|
|
- _setup_button(show_hidden, theme_cache.toggle_hidden);
|
|
|
_setup_button(make_dir_button, theme_cache.create_folder);
|
|
|
+ _setup_button(show_hidden, theme_cache.toggle_hidden);
|
|
|
+ _setup_button(thumbnail_mode_button, theme_cache.thumbnail_mode);
|
|
|
+ _setup_button(list_mode_button, theme_cache.list_mode);
|
|
|
_setup_button(show_filename_filter_button, theme_cache.toggle_filename_filter);
|
|
|
_setup_button(file_sort_button, theme_cache.sort);
|
|
|
_setup_button(fav_up_button, theme_cache.favorite_up);
|
|
@@ -761,8 +763,22 @@ void FileDialog::update_file_list() {
|
|
|
// Scroll back to the top after opening a directory
|
|
|
file_list->get_v_scroll_bar()->set_value(0);
|
|
|
|
|
|
- dir_access->list_dir_begin();
|
|
|
+ if (display_mode == DISPLAY_THUMBNAILS) {
|
|
|
+ file_list->set_max_columns(0);
|
|
|
+ file_list->set_icon_mode(ItemList::ICON_MODE_TOP);
|
|
|
+ file_list->set_fixed_column_width(theme_cache.thumbnail_size * 3 / 2);
|
|
|
+ file_list->set_max_text_lines(2);
|
|
|
+ file_list->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
|
|
|
+ file_list->set_fixed_icon_size(Size2(theme_cache.thumbnail_size, theme_cache.thumbnail_size));
|
|
|
+ } else {
|
|
|
+ file_list->set_icon_mode(ItemList::ICON_MODE_LEFT);
|
|
|
+ file_list->set_max_columns(1);
|
|
|
+ file_list->set_max_text_lines(1);
|
|
|
+ file_list->set_fixed_column_width(0);
|
|
|
+ file_list->set_fixed_icon_size(Size2());
|
|
|
+ }
|
|
|
|
|
|
+ dir_access->list_dir_begin();
|
|
|
if (dir_access->is_readable(dir_access->get_current_dir().utf8().get_data())) {
|
|
|
message->hide();
|
|
|
} else {
|
|
@@ -862,7 +878,11 @@ void FileDialog::update_file_list() {
|
|
|
}
|
|
|
|
|
|
for (const DirInfo &info : filtered_dirs) {
|
|
|
- file_list->add_item(info.name, theme_cache.folder);
|
|
|
+ if (display_mode == DISPLAY_THUMBNAILS) {
|
|
|
+ file_list->add_item(info.name, theme_cache.folder_thumbnail);
|
|
|
+ } else {
|
|
|
+ file_list->add_item(info.name, theme_cache.folder);
|
|
|
+ }
|
|
|
file_list->set_item_icon_modulate(-1, theme_cache.folder_icon_color);
|
|
|
|
|
|
Dictionary d;
|
|
@@ -924,8 +944,15 @@ void FileDialog::update_file_list() {
|
|
|
}
|
|
|
|
|
|
for (const FileInfo &info : filtered_files) {
|
|
|
- const Ref<Texture2D> icon = get_icon_func ? get_icon_func(base_dir.path_join(info.name)) : theme_cache.file;
|
|
|
- file_list->add_item(info.name, icon);
|
|
|
+ file_list->add_item(info.name);
|
|
|
+ if (get_icon_func) {
|
|
|
+ Ref<Texture2D> icon = get_icon_func(base_dir.path_join(info.name));
|
|
|
+ file_list->set_item_icon(-1, icon);
|
|
|
+ } else if (display_mode == DISPLAY_THUMBNAILS) {
|
|
|
+ file_list->set_item_icon(-1, theme_cache.file_thumbnail);
|
|
|
+ } else {
|
|
|
+ file_list->set_item_icon(-1, theme_cache.file);
|
|
|
+ }
|
|
|
file_list->set_item_icon_modulate(-1, theme_cache.file_icon_color);
|
|
|
|
|
|
if (mode == FILE_MODE_OPEN_DIR) {
|
|
@@ -1274,6 +1301,27 @@ FileDialog::FileMode FileDialog::get_file_mode() const {
|
|
|
return mode;
|
|
|
}
|
|
|
|
|
|
+void FileDialog::set_display_mode(DisplayMode p_mode) {
|
|
|
+ ERR_FAIL_INDEX((int)p_mode, 2);
|
|
|
+ if (display_mode == p_mode) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ display_mode = p_mode;
|
|
|
+
|
|
|
+ if (p_mode == DISPLAY_THUMBNAILS) {
|
|
|
+ thumbnail_mode_button->set_pressed(true);
|
|
|
+ list_mode_button->set_pressed(false);
|
|
|
+ } else {
|
|
|
+ thumbnail_mode_button->set_pressed(false);
|
|
|
+ list_mode_button->set_pressed(true);
|
|
|
+ }
|
|
|
+ invalidate();
|
|
|
+}
|
|
|
+
|
|
|
+FileDialog::DisplayMode FileDialog::get_display_mode() const {
|
|
|
+ return display_mode;
|
|
|
+}
|
|
|
+
|
|
|
void FileDialog::set_access(Access p_access) {
|
|
|
ERR_FAIL_INDEX(p_access, 3);
|
|
|
if (access == p_access) {
|
|
@@ -1826,6 +1874,8 @@ void FileDialog::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("is_mode_overriding_title"), &FileDialog::is_mode_overriding_title);
|
|
|
ClassDB::bind_method(D_METHOD("set_file_mode", "mode"), &FileDialog::set_file_mode);
|
|
|
ClassDB::bind_method(D_METHOD("get_file_mode"), &FileDialog::get_file_mode);
|
|
|
+ ClassDB::bind_method(D_METHOD("set_display_mode", "mode"), &FileDialog::set_display_mode);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_display_mode"), &FileDialog::get_display_mode);
|
|
|
ClassDB::bind_method(D_METHOD("get_vbox"), &FileDialog::get_vbox);
|
|
|
ClassDB::bind_method(D_METHOD("get_line_edit"), &FileDialog::get_line_edit);
|
|
|
ClassDB::bind_method(D_METHOD("set_access", "access"), &FileDialog::set_access);
|
|
@@ -1842,6 +1892,7 @@ void FileDialog::_bind_methods() {
|
|
|
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "mode_overrides_title"), "set_mode_overrides_title", "is_mode_overriding_title");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "file_mode", PROPERTY_HINT_ENUM, "Open File,Open Files,Open Folder,Open Any,Save"), "set_file_mode", "get_file_mode");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List"), "set_display_mode", "get_display_mode");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User Data,File System"), "set_access", "get_access");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "root_subfolder"), "set_root_subfolder", "get_root_subfolder");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::PACKED_STRING_ARRAY, "filters"), "set_filters", "get_filters");
|
|
@@ -1868,6 +1919,11 @@ void FileDialog::_bind_methods() {
|
|
|
BIND_ENUM_CONSTANT(ACCESS_USERDATA);
|
|
|
BIND_ENUM_CONSTANT(ACCESS_FILESYSTEM);
|
|
|
|
|
|
+ BIND_ENUM_CONSTANT(DISPLAY_THUMBNAILS);
|
|
|
+ BIND_ENUM_CONSTANT(DISPLAY_LIST);
|
|
|
+
|
|
|
+ BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, FileDialog, thumbnail_size);
|
|
|
+
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, parent_folder);
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, forward_folder);
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, back_folder);
|
|
@@ -1881,6 +1937,10 @@ void FileDialog::_bind_methods() {
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, sort);
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, favorite_up);
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, favorite_down);
|
|
|
+ BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, thumbnail_mode);
|
|
|
+ BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, list_mode);
|
|
|
+ BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, file_thumbnail);
|
|
|
+ BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, FileDialog, folder_thumbnail);
|
|
|
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, FileDialog, folder_icon_color);
|
|
|
BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, FileDialog, file_icon_color);
|
|
@@ -2119,6 +2179,30 @@ FileDialog::FileDialog() {
|
|
|
|
|
|
lower_toolbar->add_child(memnew(VSeparator));
|
|
|
|
|
|
+ Ref<ButtonGroup> view_mode_group;
|
|
|
+ view_mode_group.instantiate();
|
|
|
+
|
|
|
+ thumbnail_mode_button = memnew(Button);
|
|
|
+ thumbnail_mode_button->set_toggle_mode(true);
|
|
|
+ thumbnail_mode_button->set_pressed(true);
|
|
|
+ thumbnail_mode_button->set_button_group(view_mode_group);
|
|
|
+ thumbnail_mode_button->set_theme_type_variation(SceneStringName(FlatButton));
|
|
|
+ thumbnail_mode_button->set_accessibility_name(ETR("View as Thumbnails"));
|
|
|
+ thumbnail_mode_button->set_tooltip_text(ETR("View items as a grid of thumbnails."));
|
|
|
+ lower_toolbar->add_child(thumbnail_mode_button);
|
|
|
+ thumbnail_mode_button->connect(SceneStringName(pressed), callable_mp(this, &FileDialog::set_display_mode).bind(DISPLAY_THUMBNAILS));
|
|
|
+
|
|
|
+ list_mode_button = memnew(Button);
|
|
|
+ list_mode_button->set_toggle_mode(true);
|
|
|
+ list_mode_button->set_button_group(view_mode_group);
|
|
|
+ list_mode_button->set_theme_type_variation(SceneStringName(FlatButton));
|
|
|
+ list_mode_button->set_accessibility_name(ETR("View as List"));
|
|
|
+ list_mode_button->set_tooltip_text(ETR("View items as a list."));
|
|
|
+ lower_toolbar->add_child(list_mode_button);
|
|
|
+ list_mode_button->connect(SceneStringName(pressed), callable_mp(this, &FileDialog::set_display_mode).bind(DISPLAY_LIST));
|
|
|
+
|
|
|
+ lower_toolbar->add_child(memnew(VSeparator));
|
|
|
+
|
|
|
show_filename_filter_button = memnew(Button);
|
|
|
show_filename_filter_button->set_theme_type_variation(SceneStringName(FlatButton));
|
|
|
show_filename_filter_button->set_toggle_mode(true);
|