Add common directories to file dialog
This commit is contained in:
parent
9a5206ebf9
commit
098c3e84b1
3 changed files with 79 additions and 0 deletions
|
|
@ -12,6 +12,8 @@
|
||||||
#include <psemek/io/memory_stream.hpp>
|
#include <psemek/io/memory_stream.hpp>
|
||||||
#include <psemek/io/file_stream.hpp>
|
#include <psemek/io/file_stream.hpp>
|
||||||
#include <psemek/util/unicode.hpp>
|
#include <psemek/util/unicode.hpp>
|
||||||
|
#include <psemek/util/common_directories.hpp>
|
||||||
|
#include <psemek/util/to_shared.hpp>
|
||||||
|
|
||||||
#include <psemek/ui/resources/folder_png.hpp>
|
#include <psemek/ui/resources/folder_png.hpp>
|
||||||
#include <psemek/ui/resources/file_png.hpp>
|
#include <psemek/ui/resources/file_png.hpp>
|
||||||
|
|
@ -145,6 +147,17 @@ namespace psemek::ui
|
||||||
|
|
||||||
auto common_paths_label = options.element_factory.make_label("");
|
auto common_paths_label = options.element_factory.make_label("");
|
||||||
|
|
||||||
|
auto common_paths = util::to_shared(util::common_directories());
|
||||||
|
{
|
||||||
|
std::string str;
|
||||||
|
int index = 0;
|
||||||
|
for (auto const & dir : *common_paths)
|
||||||
|
{
|
||||||
|
str += util::to_string("[link:", index++, "]", escape(dir.first), "[/link]\n");
|
||||||
|
}
|
||||||
|
common_paths_label->set_tagged_text(str);
|
||||||
|
}
|
||||||
|
|
||||||
auto current_path_label = options.element_factory.make_label("");
|
auto current_path_label = options.element_factory.make_label("");
|
||||||
current_path_label->set_valign(label::valignment::center);
|
current_path_label->set_valign(label::valignment::center);
|
||||||
|
|
||||||
|
|
@ -321,6 +334,10 @@ namespace psemek::ui
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
common_paths_label->on_link_click([common_paths, set_path_callback](std::string const & link){
|
||||||
|
int index = util::from_string<int>(link);
|
||||||
|
(*set_path_callback)((*common_paths)[index].second);
|
||||||
|
});
|
||||||
|
|
||||||
path_edit->on_text_changed([=](std::u32string_view const & text_u32){
|
path_edit->on_text_changed([=](std::u32string_view const & text_u32){
|
||||||
std::string text = util::to_utf8(std::u32string(text_u32));
|
std::string text = util::to_utf8(std::u32string(text_u32));
|
||||||
|
|
|
||||||
11
libs/util/include/psemek/util/common_directories.hpp
Normal file
11
libs/util/include/psemek/util/common_directories.hpp
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace psemek::util
|
||||||
|
{
|
||||||
|
|
||||||
|
std::vector<std::pair<std::string, std::filesystem::path>> common_directories();
|
||||||
|
|
||||||
|
}
|
||||||
51
libs/util/source/common_directories.cpp
Normal file
51
libs/util/source/common_directories.cpp
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
#include <psemek/util/common_directories.hpp>
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <fileapi.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace psemek::util
|
||||||
|
{
|
||||||
|
|
||||||
|
std::vector<std::pair<std::string, std::filesystem::path>> common_directories()
|
||||||
|
{
|
||||||
|
std::vector<std::pair<std::string, std::filesystem::path>> result;
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
{
|
||||||
|
std::filesystem::path path = std::getenv("HOME");
|
||||||
|
if (!path.empty())
|
||||||
|
result.push_back({"Home", path});
|
||||||
|
}
|
||||||
|
|
||||||
|
result.push_back({"Root", "/"});
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
{
|
||||||
|
std::filesystem::path path = std::getenv("USERPROFILE");
|
||||||
|
if (!path.empty())
|
||||||
|
result.push_back({"Home", path});
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto drives = GetLogicalDrives();
|
||||||
|
for (int i = 0; i < 26; ++i)
|
||||||
|
{
|
||||||
|
if ((drives & (1 << i)) == 0) continue;
|
||||||
|
|
||||||
|
char name[3] = "A:";
|
||||||
|
char path[4] = "A:\\";
|
||||||
|
name[0] = 'A' + i;
|
||||||
|
path[0] = name[0];
|
||||||
|
result.push_back({name, path});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue