Allow to delete data directory from application view

* allow to re-init applicazion list (needed because directories can be deleted)
* context menu for "delete data directory"
This commit is contained in:
Klaus Basan
2018-11-28 00:07:26 +01:00
parent d704a8aeab
commit 9f6cb9a72f
9 changed files with 108 additions and 49 deletions

View File

@@ -42,10 +42,10 @@ namespace BlackMisc
return names;
}
int CApplicationInfoList::otherSwiftVersionsFromDataDirectories()
int CApplicationInfoList::otherSwiftVersionsFromDataDirectories(bool reinit)
{
this->clear();
const QMap<QString, CApplicationInfo> otherVersions = CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion();
const QMap<QString, CApplicationInfo> otherVersions = CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion(reinit);
for (const QString &directory : otherVersions.keys())
{
CApplicationInfo info(otherVersions.value(directory));
@@ -54,14 +54,10 @@ namespace BlackMisc
return this->size();
}
CApplicationInfoList CApplicationInfoList::fromOtherSwiftVersionsFromDataDirectories()
CApplicationInfoList CApplicationInfoList::fromOtherSwiftVersionsFromDataDirectories(bool reinit)
{
static CApplicationInfoList info = []
{
CApplicationInfoList il;
il.otherSwiftVersionsFromDataDirectories();
return il;
}();
return info;
CApplicationInfoList il;
il.otherSwiftVersionsFromDataDirectories(reinit);
return il;
}
} // ns

View File

@@ -44,10 +44,10 @@ namespace BlackMisc
QStringList processNames() const;
//! Fill from cache data directories
int otherSwiftVersionsFromDataDirectories();
int otherSwiftVersionsFromDataDirectories(bool reinit = false);
//! Filled from cache data directories
static CApplicationInfoList fromOtherSwiftVersionsFromDataDirectories();
static CApplicationInfoList fromOtherSwiftVersionsFromDataDirectories(bool reinit = false);
};
} // ns

View File

@@ -144,42 +144,41 @@ namespace BlackMisc
return dirs;
}
const CDirectoryUtils::FilePerApplication &CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion()
const CDirectoryUtils::FilePerApplication &CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion(bool reinit)
{
static const FilePerApplication dirs = [ = ]() -> FilePerApplication
{
FilePerApplication directories;
for (const QFileInfo &info : CDirectoryUtils::applicationDataDirectories())
{
if (caseInsensitiveStringCompare(info.filePath(), CDirectoryUtils::normalizedApplicationDataDirectory())) { continue; }
static FilePerApplication dirs;
if (!reinit && !dirs.isEmpty()) { return dirs; }
// the application info will be written by each swift application started
// so the application type will always contain that application
const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName());
const QString appInfoJson = CFileUtils::readFileToString(appInfoFile);
CApplicationInfo appInfo;
if (appInfoJson.isEmpty())
{
const QString exeDir = CDirectoryUtils::decodeNormalizedDirectory(info.filePath());
appInfo.setExecutablePath(exeDir);
}
else
{
appInfo = CApplicationInfo::fromJson(appInfoJson);
}
appInfo.setApplicationDataDirectory(info.filePath());
directories.insert(info.filePath(), appInfo);
FilePerApplication directories;
for (const QFileInfo &info : CDirectoryUtils::applicationDataDirectories())
{
if (caseInsensitiveStringCompare(info.filePath(), CDirectoryUtils::normalizedApplicationDataDirectory())) { continue; }
// the application info will be written by each swift application started
// so the application type will always contain that application
const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName());
const QString appInfoJson = CFileUtils::readFileToString(appInfoFile);
CApplicationInfo appInfo;
if (appInfoJson.isEmpty())
{
const QString exeDir = CDirectoryUtils::decodeNormalizedDirectory(info.filePath());
appInfo.setExecutablePath(exeDir);
}
// https://stackoverflow.com/q/51635959/356726
// cppcheck-suppress returnReference
return directories;
}();
else
{
appInfo = CApplicationInfo::fromJson(appInfoJson);
}
appInfo.setApplicationDataDirectory(info.filePath());
directories.insert(info.filePath(), appInfo);
}
dirs = directories;
return dirs;
}
bool CDirectoryUtils::hasOtherSwiftDataDirectories()
bool CDirectoryUtils::hasOtherSwiftDataDirectories(bool reinit)
{
return CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion().size() > 0;
return CDirectoryUtils::applicationDataDirectoryMapWithoutCurrentVersion(reinit).size() > 0;
}
const QString &CDirectoryUtils::normalizedApplicationDataDirectory()

View File

@@ -62,10 +62,10 @@ namespace BlackMisc
static QStringList applicationDataDirectoryList(bool withoutCurrent = false, bool decodedDirName = false);
//! swift application data sub directories with info if available
static const FilePerApplication &applicationDataDirectoryMapWithoutCurrentVersion();
static const FilePerApplication &applicationDataDirectoryMapWithoutCurrentVersion(bool reinit = false);
//! Other swift data directories
static bool hasOtherSwiftDataDirectories();
static bool hasOtherSwiftDataDirectories(bool reinit = false);
//! Is MacOS application bundle?
//! \remark: Means the currently running executable is a MacOS bundle, but not all our executables are bundles on MacOS