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.
pull/549/head
Connor McLaughlin 5 years ago
parent 814edecd05
commit 8d2c7db224

@ -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..."));

@ -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.

@ -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)

@ -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);

Loading…
Cancel
Save