Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "show all files" option for filesystem menu #2579

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions src/editor/object_option.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,15 +403,11 @@ ScriptObjectOption::add_to_menu(Menu& menu) const
FileObjectOption::FileObjectOption(const std::string& text, std::string* pointer,
std::optional<std::string> default_value,
const std::string& key,
std::vector<std::string> filter,
const std::string& basedir,
bool path_relative_to_basedir,
FileSystemMenu::MenuParams& params,
unsigned int flags) :
ObjectOption(text, key, flags, pointer),
m_default_value(std::move(default_value)),
m_filter(std::move(filter)),
m_basedir(basedir),
m_path_relative_to_basedir(path_relative_to_basedir)
m_params(params)
{
}

Expand Down Expand Up @@ -440,7 +436,7 @@ FileObjectOption::to_string() const
void
FileObjectOption::add_to_menu(Menu& menu) const
{
menu.add_file(get_text(), m_value_pointer, m_filter, m_basedir, m_path_relative_to_basedir);
menu.add_file(get_text(), m_params);
}

ColorObjectOption::ColorObjectOption(const std::string& text, Color* pointer, const std::string& key,
Expand Down
6 changes: 3 additions & 3 deletions src/editor/object_option.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#include "object/path_walker.hpp"
#include "video/color.hpp"

struct FileSystemMenu::MenuParams;

enum ObjectOptionFlag {
/** Set if the value is a hidden implementation detail that
shouldn't be exposed to the user */
Expand Down Expand Up @@ -283,9 +285,7 @@ class FileObjectOption final : public ObjectOption<std::string>
FileObjectOption(const std::string& text, std::string* pointer,
std::optional<std::string> default_value,
const std::string& key,
std::vector<std::string> filter,
const std::string& basedir,
bool path_relative_to_basedir,
FileSystemMenu::MenuParams& params,
unsigned int flags);

virtual void save(Writer& write) const override;
Expand Down
5 changes: 3 additions & 2 deletions src/editor/particle_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,17 +372,18 @@ ParticleEditor::reset_texture_ui()
auto chg_texture_btn = std::make_unique<ControlButton>(_("Change texture..."));
chg_texture_btn.get()->m_on_change = std::function<void()>([this](){
const std::vector<std::string>& filter = {".jpg", ".png", ".surface"};
MenuManager::instance().push_menu(std::make_unique<FileSystemMenu>(
MenuManager::instance().push_menu(std::make_unique<FileSystemMenu>({
nullptr,
filter,
{},
"/",
false,
[this](const std::string& new_filename) {
(m_particles->m_textures.begin() + m_texture_current)->texture = Surface::from_file(new_filename);
m_particles->reinit_textures();
this->push_version();
}
));
}));
});
chg_texture_btn.get()->set_rect(Rectf(25.f, 420, 325.f, 440));
m_controls_textures.push_back(std::move(chg_texture_btn));
Expand Down
10 changes: 4 additions & 6 deletions src/gui/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,15 +282,13 @@ Menu::add_string_select(int id, const std::string& text, int default_item, const
}

ItemAction&
Menu::add_file(const std::string& text, std::string* input, const std::vector<std::string>& extensions,
const std::string& basedir, bool path_relative_to_basedir,
const std::function<void (MenuItem&)>& item_processor, int id)
Menu::add_file(const std::string& text, FileSystemMenu::MenuParams& params, int id)
{
auto item = std::make_unique<ItemAction>(text, id,
[input, extensions, basedir, path_relative_to_basedir, item_processor]()
[params]()
{
MenuManager::instance().push_menu(std::make_unique<FileSystemMenu>(input, extensions, basedir,
path_relative_to_basedir, nullptr, item_processor));
params.callback = nullptr;
MenuManager::instance().push_menu(std::make_unique<FileSystemMenu>(params));
});
auto item_ptr = item.get();
add_item(std::move(item));
Expand Down
6 changes: 3 additions & 3 deletions src/gui/menu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ class ItemImages;
class MenuItem;
class PathObject;

struct FileSystemMenu::MenuParams;

class Menu
{
public:
Expand Down Expand Up @@ -94,9 +96,7 @@ class Menu
ItemScriptLine& add_script_line(std::string* input, int id = -1);
ItemIntField& add_intfield(const std::string& text, int* input, int id = -1, bool positive = false);
ItemFloatField& add_floatfield(const std::string& text, float* input, int id = -1, bool positive = false);
ItemAction& add_file(const std::string& text, std::string* input, const std::vector<std::string>& extensions,
const std::string& basedir, bool path_relative_to_basedir,
const std::function<void (MenuItem&)>& item_processor = {}, int id = -1);
ItemAction& add_file(const std::string& text, FileSystemMenu::MenuParams& params, int id = -1);

ItemColor& add_color(const std::string& text, Color* color, int id = -1);
ItemColorDisplay& add_color_display(Color* color, int id = -1);
Expand Down
37 changes: 15 additions & 22 deletions src/gui/menu_filesystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,13 @@
#include "util/gettext.hpp"
#include "util/string_util.hpp"

FileSystemMenu::FileSystemMenu(std::string* filename, const std::vector<std::string>& extensions,
const std::string& basedir, bool path_relative_to_basedir, std::function<void(std::string)> callback,
const std::function<void (MenuItem&)>& item_processor) :
m_filename(filename),
FileSystemMenu::FileSystemMenu(MenuParams& params) :
m_params(params),
// when a basedir is given, 'filename' is relative to basedir, so
// it's useless as a starting point
m_directory(basedir.empty() ? (filename ? FileSystem::dirname(*filename) : "/") : basedir),
m_extensions(extensions),
m_basedir(basedir),
m_directory(m_params.basedir.empty() ? (m_params.filename ? FileSystem::dirname(*m_params.filename) : "/") : m_params.basedir),
m_directories(),
m_files(),
m_path_relative_to_basedir(path_relative_to_basedir),
m_callback(std::move(callback)),
m_item_processor(std::move(item_processor))
m_files()
{
AddonManager::current()->unmount_old_addons();

Expand Down Expand Up @@ -104,12 +97,12 @@ FileSystemMenu::refresh_items()
item_id++;
}

const bool in_basedir = m_directory == FileSystem::normalize(m_basedir);
const bool in_basedir = m_directory == FileSystem::normalize(m_params.basedir);
for (const auto& item : m_files)
{
MenuItem& menu_item = add_entry(item_id, item);
if (in_basedir && m_item_processor)
m_item_processor(menu_item);
if (in_basedir && m_params.item_processor)
m_params.item_processor(menu_item);

item_id++;
}
Expand All @@ -128,10 +121,10 @@ FileSystemMenu::refresh_items()
bool
FileSystemMenu::has_right_suffix(const std::string& file) const
{
if (m_extensions.empty())
if (m_params.extensions.empty())
return true;

for (const auto& extension : m_extensions) {
for (const auto& extension : m_params.extensions) {
if (StringUtil::has_suffix(file, extension))
{
return true;
Expand All @@ -153,15 +146,15 @@ FileSystemMenu::menu_action(MenuItem& item)
if (id < m_files.size()) {
std::string new_filename = FileSystem::join(m_directory, m_files[id]);

if (!m_basedir.empty() && m_path_relative_to_basedir) {
new_filename = FileSystem::relpath(new_filename, m_basedir);
if (!m_params.basedir.empty() && m_params.path_relative_to_basedir) {
new_filename = FileSystem::relpath(new_filename, m_params.basedir);
}

if (m_filename)
*m_filename = new_filename;
if (m_params.filename)
*m_params.filename = new_filename;

if (m_callback)
m_callback(new_filename);
if (m_params.callback)
m_params.callback(new_filename);

MenuManager::instance().pop_menu();
} else {
Expand Down
22 changes: 13 additions & 9 deletions src/gui/menu_filesystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,19 @@

class FileSystemMenu final : public Menu
{
struct MenuParams
{
std::string* filename;
const std::vector<std::string>& extensions;
const std::vector<std::string>& additional_extensions;
const std::string& basedir;
bool path_relative_to_basedir;
const std::function<void(std::string)> callback = nullptr;
const std::function<void (MenuItem&)>& item_processor = {};
};

public:
FileSystemMenu(std::string* filename, const std::vector<std::string>& extensions,
const std::string& basedir, bool path_relative_to_basedir, const std::function<void(std::string)> callback = nullptr,
const std::function<void (MenuItem&)>& item_processor = {});
FileSystemMenu(MenuParams& params);
~FileSystemMenu() override;

void menu_action(MenuItem& item) override;
Expand All @@ -34,15 +43,10 @@ class FileSystemMenu final : public Menu
bool has_right_suffix(const std::string& file) const;

private:
std::string* m_filename;
MenuParams& m_params;
std::string m_directory;
std::vector<std::string> m_extensions;
std::string m_basedir;
std::vector<std::string> m_directories;
std::vector<std::string> m_files;
bool m_path_relative_to_basedir;
std::function<void(std::string)> m_callback;
std::function<void (MenuItem&)> m_item_processor;

private:
FileSystemMenu(const FileSystemMenu&) = delete;
Expand Down
4 changes: 2 additions & 2 deletions src/supertux/menu/editor_converters_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ EditorConvertersMenu::EditorConvertersMenu() :
add_label(_("Convert Tiles"));
add_hl();

add_file(_("Select Tile Conversion File"), &m_tile_conversion_file, { "sttc" }, "images/converters", false,
add_file(_("Select Tile Conversion File"), {&m_tile_conversion_file, { ".sttc" }, {}, "images/converters", false,
[this](MenuItem& item) {
auto it = m_converters.find(item.get_text());
if (it == m_converters.end())
Expand All @@ -70,7 +70,7 @@ EditorConvertersMenu::EditorConvertersMenu() :
item.set_text("\"" + it->second.title + "\"");
item.set_help(it->second.description + (it->second.author.empty() ? "" :
"\n\n" + fmt::format(fmt::runtime(_("By: {}")), it->second.author)));
});
}});

add_entry(MNID_CONVERT_TILES, _("Convert Tiles By File"))
.set_help(_("Convert all tiles in the current level by a file, specified above."));
Expand Down
2 changes: 1 addition & 1 deletion src/supertux/menu/editor_level_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ EditorLevelMenu::EditorLevelMenu() :
add_textfield(_("Contact"), &(level->m_contact));
add_textfield(_("License"), &(level->m_license));
add_textfield(_("Level Note"), &(level->m_note));
add_file(_("Tileset"), &(level->m_tileset), std::vector<std::string>(1, ".strf"), {}, true);
add_file(_("Tileset"), {&(level->m_tileset), { ".strf" }, {} ,"", true});

if (!is_worldmap) {
add_floatfield(_("Target Time"), &(level->m_target_time));
Expand Down
2 changes: 1 addition & 1 deletion src/supertux/menu/editor_levelset_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ EditorLevelsetMenu::initialize()
add_textfield(_("Name"), &m_world->m_title);
add_textfield(_("Description"), &m_world->m_description);
add_string_select(1, _("Type"), &m_levelset_type, {_("Worldmap"), _("Levelset")});
add_file(_("Title Screen Level"), &m_world->m_title_level, { ".stl" }, m_world->m_basedir, false)
add_file(_("Title Screen Level"), {&m_world->m_title_level, { ".stl" }, {}, m_world->m_basedir, false})
.set_help(_("A level to be used for the title screen, after exiting the world."));
add_hl();
add_back(_("OK"));
Expand Down
5 changes: 3 additions & 2 deletions src/supertux/menu/particle_editor_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,17 +101,18 @@ ParticleEditorMenu::menu_action(MenuItem& item)
//MenuManager::instance().set_menu(MenuStorage::PARTICLE_EDITOR_OPEN);
{
const std::vector<std::string>& filter = {".stcp"};
MenuManager::instance().push_menu(std::make_unique<FileSystemMenu>(
MenuManager::instance().push_menu(std::make_unique<FileSystemMenu>({
&ParticleEditor::current()->m_filename,
filter,
{},
"/particles",
true,
[](const std::string& new_filename) {
ParticleEditor::current()->open("/particles/" +
ParticleEditor::current()->m_filename);
MenuManager::instance().clear_menu_stack();
}
));
}));
}
break;

Expand Down
4 changes: 1 addition & 3 deletions src/supertux/menu/particle_editor_open.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,7 @@ ParticleEditorOpen::ParticleEditorOpen() :

add_hl();

std::vector<std::string> extensions;
extensions.push_back("stcp");
add_file(_("File"), &m_filename, extensions, "/particles/", true);
add_file(_("File"), {&m_filename, { ".stcp" }, {}, "/particles/", true});
add_entry(MNID_OPEN, _("Open"));

add_hl();
Expand Down
6 changes: 3 additions & 3 deletions src/supertux/menu/web_asset_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ WebAssetMenu::menu_action(MenuItem& item)
{
std::vector<std::string> empty_vec;
MenuManager::instance().push_menu(
std::make_unique<FileSystemMenu>(nullptr, empty_vec, "", false, [](const std::string& file) {
std::make_unique<FileSystemMenu>({nullptr, empty_vec, empty_vec, "", false, [](const std::string& file) {
std::string fullpath(std::string(PHYSFS_getRealDir(file.c_str())) + "/" + file);
FileSystem::open_path(fullpath);
})
}})
);
}
break;
}

default:
break;
Expand Down
Loading