Merge pull request #2665 from AdmiralCurtiss/relative-memory-card-paths
GameCube Config: Store paths relatively when selected file is within Dolphin's directory. (Windows)
This commit is contained in:
commit
ad68de59bc
|
@ -731,8 +731,12 @@ std::string& GetExeDirectory()
|
||||||
if (DolphinPath.empty())
|
if (DolphinPath.empty())
|
||||||
{
|
{
|
||||||
TCHAR Dolphin_exe_Path[2048];
|
TCHAR Dolphin_exe_Path[2048];
|
||||||
|
TCHAR Dolphin_exe_Clean_Path[MAX_PATH];
|
||||||
GetModuleFileName(nullptr, Dolphin_exe_Path, 2048);
|
GetModuleFileName(nullptr, Dolphin_exe_Path, 2048);
|
||||||
DolphinPath = TStrToUTF8(Dolphin_exe_Path);
|
if (_tfullpath(Dolphin_exe_Clean_Path, Dolphin_exe_Path, MAX_PATH) != nullptr)
|
||||||
|
DolphinPath = TStrToUTF8(Dolphin_exe_Clean_Path);
|
||||||
|
else
|
||||||
|
DolphinPath = TStrToUTF8(Dolphin_exe_Path);
|
||||||
DolphinPath = DolphinPath.substr(0, DolphinPath.find_last_of('\\'));
|
DolphinPath = DolphinPath.substr(0, DolphinPath.find_last_of('\\'));
|
||||||
}
|
}
|
||||||
return DolphinPath;
|
return DolphinPath;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <wx/checkbox.h>
|
#include <wx/checkbox.h>
|
||||||
#include <wx/choice.h>
|
#include <wx/choice.h>
|
||||||
#include <wx/filedlg.h>
|
#include <wx/filedlg.h>
|
||||||
|
#include <wx/filename.h>
|
||||||
#include <wx/gbsizer.h>
|
#include <wx/gbsizer.h>
|
||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
#include <wx/stattext.h>
|
#include <wx/stattext.h>
|
||||||
|
@ -331,23 +332,26 @@ void GameCubeConfigPane::ChooseSlotPath(bool is_slot_a, TEXIDevices device_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxFileName newFilename(filename);
|
||||||
|
newFilename.MakeAbsolute();
|
||||||
|
filename = newFilename.GetFullPath();
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (!strncmp(File::GetExeDirectory().c_str(), filename.c_str(), File::GetExeDirectory().size()))
|
// If the Memory Card file is within the Exe dir, we can assume that the user wants it to be stored relative
|
||||||
{
|
// to the executable, so it stays set correctly when the probably portable Exe dir is moved.
|
||||||
// If the Exe Directory Matches the prefix of the filename, we still need to verify
|
// TODO: Replace this with a cleaner, non-wx solution once std::filesystem is standard
|
||||||
// that the next character is a directory separator character, otherwise we may create an invalid path
|
std::string exeDir = File::GetExeDirectory() + '\\';
|
||||||
char next_char = filename.at(File::GetExeDirectory().size()) + 1;
|
if (wxString(filename).Lower().StartsWith(wxString(exeDir).Lower()))
|
||||||
if (next_char == '/' || next_char == '\\')
|
filename.erase(0, exeDir.size());
|
||||||
{
|
|
||||||
filename.erase(0, File::GetExeDirectory().size() + 1);
|
|
||||||
filename = "./" + filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::replace(filename.begin(), filename.end(), '\\', '/');
|
std::replace(filename.begin(), filename.end(), '\\', '/');
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// also check that the path isn't used for the other memcard...
|
// also check that the path isn't used for the other memcard...
|
||||||
if (filename.compare(is_slot_a ? pathB : pathA) != 0)
|
wxFileName otherFilename(is_slot_a ? pathB : pathA);
|
||||||
|
otherFilename.MakeAbsolute();
|
||||||
|
if (newFilename.GetFullPath().compare(otherFilename.GetFullPath()) != 0)
|
||||||
{
|
{
|
||||||
if (memcard)
|
if (memcard)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue