Qt: Source input profiles from program and user directory

This way Linux users as well as Windows users who use the Documents
user directory can use the shipped input profiles.
This commit is contained in:
Connor McLaughlin 2020-06-12 02:47:39 +10:00
parent 814edecd05
commit 8d2c7db224
4 changed files with 44 additions and 20 deletions

View file

@ -335,7 +335,7 @@ void ControllerSettingsWidget::onSaveProfileClicked()
return; return;
} }
m_host_interface->saveInputProfile(m_host_interface->getPathForInputProfile(name)); m_host_interface->saveInputProfile(m_host_interface->getSavePathForInputProfile(name));
}); });
QAction* browse = menu.addAction(tr("Browse...")); QAction* browse = menu.addAction(tr("Browse..."));

View file

@ -73,14 +73,11 @@ public:
/// Fills menu with save state info and handlers. /// Fills menu with save state info and handlers.
void populateGameListContextMenu(const char* game_code, QWidget* parent_window, QMenu* menu); void populateGameListContextMenu(const char* game_code, QWidget* parent_window, QMenu* menu);
ALWAYS_INLINE QString getPathForInputProfile(const QString& name) const ALWAYS_INLINE QString getSavePathForInputProfile(const QString& name) const
{ {
return QString::fromStdString(GetPathForInputProfile(name.toUtf8().constData())); return QString::fromStdString(GetSavePathForInputProfile(name.toUtf8().constData()));
}
ALWAYS_INLINE std::vector<std::pair<std::string, std::string>> getInputProfileList() const
{
return GetInputProfileList();
} }
ALWAYS_INLINE InputProfileList getInputProfileList() const { return GetInputProfileList(); }
void saveInputProfile(const QString& profile_path); void saveInputProfile(const QString& profile_path);
/// Returns a path relative to the user directory. /// Returns a path relative to the user directory.

View file

@ -1358,30 +1358,49 @@ void CommonHostInterface::RegisterAudioHotkeys()
}); });
} }
std::string CommonHostInterface::GetPathForInputProfile(const char* name) const std::string CommonHostInterface::GetSavePathForInputProfile(const char* name) const
{ {
return GetUserDirectoryRelativePath("inputprofiles/%s.ini", name); return GetUserDirectoryRelativePath("inputprofiles/%s.ini", name);
} }
std::vector<std::pair<std::string, std::string>> CommonHostInterface::GetInputProfileList() const CommonHostInterface::InputProfileList CommonHostInterface::GetInputProfileList() const
{
InputProfileList profiles;
const std::string user_dir(GetUserDirectoryRelativePath("inputprofiles"));
const std::string program_dir(GetProgramDirectoryRelativePath("inputprofiles"));
FindInputProfiles(user_dir, &profiles);
if (user_dir != program_dir)
FindInputProfiles(program_dir, &profiles);
return profiles;
}
void CommonHostInterface::FindInputProfiles(const std::string& base_path, InputProfileList* out_list) const
{ {
FileSystem::FindResultsArray results; FileSystem::FindResultsArray results;
FileSystem::FindFiles(GetUserDirectoryRelativePath("inputprofiles").c_str(), "*.ini", FileSystem::FindFiles(base_path.c_str(), "*.ini", FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_RELATIVE_PATHS, &results);
FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_RELATIVE_PATHS, &results);
std::vector<std::pair<std::string, std::string>> profile_names; out_list->reserve(out_list->size() + results.size());
profile_names.reserve(results.size());
for (auto& it : results) for (auto& it : results)
{ {
if (it.FileName.size() < 4) if (it.FileName.size() < 4)
continue; continue;
std::string profile_name = it.FileName.substr(0, it.FileName.length() - 4); std::string name(it.FileName.substr(0, it.FileName.length() - 4));
std::string full_filename = GetUserDirectoryRelativePath("inputprofiles/%s", it.FileName.c_str());
profile_names.emplace_back(std::move(profile_name), std::move(full_filename)); // skip duplicates, we prefer the user directory
if (std::any_of(out_list->begin(), out_list->end(),
[&name](const InputProfileEntry& e) { return (e.name == name); }))
{
continue;
} }
return profile_names; std::string filename(
StringUtil::StdStringFromFormat("%s%c%s", base_path.c_str(), FS_OSPATH_SEPERATOR_CHARACTER, it.FileName.c_str()));
out_list->push_back(InputProfileEntry{std::move(name), std::move(filename)});
}
} }
void CommonHostInterface::ClearAllControllerBindings(SettingsInterface& si) void CommonHostInterface::ClearAllControllerBindings(SettingsInterface& si)

View file

@ -162,6 +162,13 @@ protected:
float duration; float duration;
}; };
struct InputProfileEntry
{
std::string name;
std::string path;
};
using InputProfileList = std::vector<InputProfileEntry>;
CommonHostInterface(); CommonHostInterface();
~CommonHostInterface(); ~CommonHostInterface();
@ -195,10 +202,10 @@ protected:
virtual void UpdateInputMap() = 0; virtual void UpdateInputMap() = 0;
/// Returns a path where an input profile with the specified name would be saved. /// Returns a path where an input profile with the specified name would be saved.
std::string GetPathForInputProfile(const char* name) const; std::string GetSavePathForInputProfile(const char* name) const;
/// Returns a list of all input profiles. first - name, second - path /// Returns a list of all input profiles. first - name, second - path
std::vector<std::pair<std::string, std::string>> GetInputProfileList() const; InputProfileList GetInputProfileList() const;
/// Applies the specified input profile. /// Applies the specified input profile.
void ApplyInputProfile(const char* profile_path, SettingsInterface& si); void ApplyInputProfile(const char* profile_path, SettingsInterface& si);
@ -283,6 +290,7 @@ private:
void RegisterGraphicsHotkeys(); void RegisterGraphicsHotkeys();
void RegisterSaveStateHotkeys(); void RegisterSaveStateHotkeys();
void RegisterAudioHotkeys(); void RegisterAudioHotkeys();
void FindInputProfiles(const std::string& base_path, InputProfileList* out_list) const;
void UpdateControllerInputMap(SettingsInterface& si); void UpdateControllerInputMap(SettingsInterface& si);
void UpdateHotkeyInputMap(SettingsInterface& si); void UpdateHotkeyInputMap(SettingsInterface& si);
void ClearAllControllerBindings(SettingsInterface& si); void ClearAllControllerBindings(SettingsInterface& si);