summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/downloadmanager.cpp7
-rw-r--r--src/mainwindow.cpp151
-rw-r--r--src/mainwindow.h2
-rw-r--r--src/modinfo.cpp1
-rw-r--r--src/modlist.cpp13
-rw-r--r--src/modlist.h4
-rw-r--r--src/organizercore.cpp10
-rw-r--r--src/profilesdialog.cpp11
-rw-r--r--src/profilesdialog.h7
-rw-r--r--src/settings.cpp15
-rw-r--r--src/shared/appconfig.h2
-rw-r--r--src/shared/util.cpp18
-rw-r--r--src/version.rc4
13 files changed, 155 insertions, 90 deletions
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp
index 81732f4d..e48d6bf1 100644
--- a/src/downloadmanager.cpp
+++ b/src/downloadmanager.cpp
@@ -358,7 +358,6 @@ bool DownloadManager::addDownload(QNetworkReply *reply, const QStringList &URLs,
DownloadInfo *newDownload = DownloadInfo::createNew(fileInfo, URLs);
QString baseName = fileName;
-
if (!fileInfo->fileName.isEmpty()) {
baseName = fileInfo->fileName;
} else {
@@ -368,7 +367,6 @@ bool DownloadManager::addDownload(QNetworkReply *reply, const QStringList &URLs,
baseName = dispoName;
}
}
-
if (QFile::exists(m_OutputDirectory + "/" + baseName) &&
(QMessageBox::question(nullptr, tr("Download again?"), tr("A file with the same name has already been downloaded. "
"Do you want to download it again? The new file will receive a different name."),
@@ -377,11 +375,9 @@ bool DownloadManager::addDownload(QNetworkReply *reply, const QStringList &URLs,
delete newDownload;
return false;
}
-
newDownload->setName(getDownloadFileName(baseName), false);
startDownload(reply, newDownload, false);
-
// emit update(-1);
return true;
}
@@ -1234,7 +1230,8 @@ bool DownloadManager::ServerByPreference(const std::map<QString, int> &preferred
int DownloadManager::startDownloadURLs(const QStringList &urls)
{
- addDownload(urls, -1, -1, nullptr);
+ ModRepositoryFileInfo info;
+ addDownload(urls, -1, -1, &info);
return m_ActiveDownloads.size() - 1;
}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 7dba6c72..44ccc642 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -891,13 +891,15 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
void MainWindow::toolPluginInvoke()
{
QAction *triggeredAction = qobject_cast<QAction*>(sender());
- IPluginTool *plugin = (IPluginTool*)triggeredAction->data().value<void*>();
- try {
- plugin->display();
- } catch (const std::exception &e) {
- reportError(tr("Plugin \"%1\" failed: %2").arg(plugin->name()).arg(e.what()));
- } catch (...) {
- reportError(tr("Plugin \"%1\" failed").arg(plugin->name()));
+ IPluginTool *plugin = qobject_cast<IPluginTool*>(triggeredAction->data().value<QObject*>());
+ if (plugin != nullptr) {
+ try {
+ plugin->display();
+ } catch (const std::exception &e) {
+ reportError(tr("Plugin \"%1\" failed: %2").arg(plugin->name()).arg(e.what()));
+ } catch (...) {
+ reportError(tr("Plugin \"%1\" failed").arg(plugin->name()));
+ }
}
}
@@ -905,11 +907,13 @@ void MainWindow::modPagePluginInvoke()
{
QAction *triggeredAction = qobject_cast<QAction*>(sender());
IPluginModPage *plugin = qobject_cast<IPluginModPage*>(triggeredAction->data().value<QObject*>());
- if (plugin->useIntegratedBrowser()) {
- m_IntegratedBrowser.setWindowTitle(plugin->displayName());
- m_IntegratedBrowser.openUrl(plugin->pageURL());
- } else {
- ::ShellExecuteW(nullptr, L"open", ToWString(plugin->pageURL().toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ if (plugin != nullptr) {
+ if (plugin->useIntegratedBrowser()) {
+ m_IntegratedBrowser.setWindowTitle(plugin->displayName());
+ m_IntegratedBrowser.openUrl(plugin->pageURL());
+ } else {
+ ::ShellExecuteW(nullptr, L"open", ToWString(plugin->pageURL().toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ }
}
}
@@ -918,7 +922,7 @@ void MainWindow::registerPluginTool(IPluginTool *tool)
QAction *action = new QAction(tool->icon(), tool->displayName(), ui->toolBar);
action->setToolTip(tool->tooltip());
tool->setParentWidget(this);
- action->setData(qVariantFromValue((void*)tool));
+ action->setData(qVariantFromValue((QObject*)tool));
connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection);
QToolButton *toolBtn = qobject_cast<QToolButton*>(ui->toolBar->widgetForAction(ui->actionTool));
toolBtn->menu()->addAction(action);
@@ -1007,11 +1011,11 @@ void MainWindow::on_profileBox_currentIndexChanged(int index)
}
if (ui->profileBox->currentIndex() == 0) {
- ProfilesDialog(m_GamePath, this).exec();
+ ui->profileBox->setCurrentIndex(previousIndex);
+ ProfilesDialog(ui->profileBox->currentText(), this).exec();
while (!refreshProfiles()) {
- ProfilesDialog(m_GamePath, this).exec();
+ ProfilesDialog(ui->profileBox->currentText(), this).exec();
}
- ui->profileBox->setCurrentIndex(previousIndex);
} else {
activateSelectedProfile();
}
@@ -1677,8 +1681,11 @@ static HRESULT CreateShortcut(LPCWSTR targetFileName, LPCWSTR arguments,
result = shellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&persistFile);
if (SUCCEEDED(result)) {
wchar_t linkFileNameW[MAX_PATH];
- MultiByteToWideChar(CP_ACP, 0, linkFileName, -1, linkFileNameW, MAX_PATH);
- result = persistFile->Save(linkFileNameW, TRUE);
+ if (MultiByteToWideChar(CP_ACP, 0, linkFileName, -1, linkFileNameW, MAX_PATH) > 0) {
+ result = persistFile->Save(linkFileNameW, TRUE);
+ } else {
+ qCritical("failed to create link: %s", linkFileName);
+ }
persistFile->Release();
} else {
qCritical("failed to create IPersistFile instance");
@@ -1850,6 +1857,14 @@ void MainWindow::modorder_changed()
QModelIndex current = ui->modList->currentIndex();
if (current.isValid()) {
ModInfo::Ptr modInfo = ModInfo::getByIndex(current.data(Qt::UserRole + 1).toInt());
+ // clear caches on all mods conflicting with the moved mod
+ for (int i : modInfo->getModOverwrite()) {
+ ModInfo::getByIndex(i)->clearCaches();
+ }
+ for (int i : modInfo->getModOverwritten()) {
+ ModInfo::getByIndex(i)->clearCaches();
+ }
+ // update conflict check on the moved mod
modInfo->doConflictCheck();
m_OrganizerCore.modList()->setOverwriteMarkers(modInfo->getModOverwrite(), modInfo->getModOverwritten());
if (m_ModListSortProxy != nullptr) {
@@ -2523,6 +2538,12 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index)
if (!index.isValid()) {
return;
}
+
+ if (m_OrganizerCore.modList()->timeElapsedSinceLastChecked() <= QApplication::doubleClickInterval()) {
+ // don't interpret double click if we only just checked a mod
+ return;
+ }
+
QModelIndex sourceIdx = mapToModel(m_OrganizerCore.modList(), index);
if (!sourceIdx.isValid()) {
return;
@@ -2530,7 +2551,6 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index)
try {
m_ContextRow = m_ModListSortProxy->mapToSource(index).row();
-// displayModInformation(m_ModListSortProxy->mapToSource(index).row());
displayModInformation(sourceIdx.row());
// workaround to cancel the editor that might have opened because of
// selection-click
@@ -4602,7 +4622,7 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
//types
QList<QUrl> urls = data->urls();
bool ok = true;
- for (auto url : urls) {
+ for (const QUrl &url : urls) {
if (url.isLocalFile()) {
QString local = url.toLocalFile();
bool fok = false;
@@ -4617,8 +4637,6 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
break;
}
}
- //We should probably allow the user to drop urls here and remember the
- //url for installing later.
}
if (ok) {
event->accept();
@@ -4627,56 +4645,61 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
}
}
+void MainWindow::dropLocalFile(const QUrl &url, const QString &outputDir, bool move)
+{
+ QFileInfo file(url.toLocalFile());
+ if (!file.exists()) {
+ qWarning("invalid source file %s", qPrintable(file.absoluteFilePath()));
+ return;
+ }
+ QString target = outputDir + "/" + file.fileName();
+ if (QFile::exists(target)) {
+ QMessageBox box(QMessageBox::Question,
+ file.fileName(),
+ tr("A file with the same name has already been downloaded. "
+ "What would you like to do?"));
+ box.addButton(tr("Overwrite"), QMessageBox::ActionRole);
+ box.addButton(tr("Rename new file"), QMessageBox::YesRole);
+ box.addButton(tr("Ignore file"), QMessageBox::RejectRole);
+
+ box.exec();
+ switch (box.buttonRole(box.clickedButton())) {
+ case QMessageBox::RejectRole:
+ return;
+ case QMessageBox::ActionRole:
+ break;
+ default:
+ case QMessageBox::YesRole:
+ target = m_OrganizerCore.downloadManager()->getDownloadFileName(file.fileName());
+ break;
+ }
+ }
+
+ bool success = false;
+ if (move) {
+ success = shellMove(file.absoluteFilePath(), target, true, this);
+ } else {
+ success = shellCopy(file.absoluteFilePath(), target, true, this);
+ }
+ if (!success) {
+ qCritical("file operation failed: %s", qPrintable(windowsErrorString(::GetLastError())));
+ }
+}
+
void MainWindow::dropEvent(QDropEvent *event)
{
Qt::DropAction action = event->proposedAction();
- QString output_dir = m_OrganizerCore.downloadManager()->getOutputDirectory();
+ QString outputDir = m_OrganizerCore.downloadManager()->getOutputDirectory();
if (action == Qt::MoveAction) {
//Tell windows I'm taking control and will delete the source of a move.
event->setDropAction(Qt::TargetMoveAction);
}
- for (auto url : event->mimeData()->urls()) {
- QFileInfo file(url.toLocalFile());
- QString target = output_dir + "/" + file.fileName();
- if (QFile::exists(target)) {
- QMessageBox box(QMessageBox::Question,
- file.fileName(),
- tr("A file with the same name has already been downloaded. "
- "What would you like to do?"));
- box.addButton(tr("Overwrite"), QMessageBox::ActionRole);
- box.addButton(tr("Rename new file"), QMessageBox::YesRole);
- box.addButton(tr("Ignore file"), QMessageBox::RejectRole);
-
- box.exec();
- QMessageBox::ButtonRole role = box.buttonRole(box.clickedButton());
- switch (role)
- {
- case QMessageBox::RejectRole:
- continue;
-
- case QMessageBox::ActionRole:
- break;
-
- default:
- case QMessageBox::YesRole:
- target = m_OrganizerCore.downloadManager()->getDownloadFileName(file.fileName());
- break;
-
- }
- }
-
- if (action == Qt::MoveAction) {
- if (shellMove(file.absoluteFilePath(), target, true, this)) {
- continue;
- }
- }
- else {
- if (shellCopy(file.absoluteFilePath(), target, true, this)) {
- continue;
- }
+ for (const QUrl &url : event->mimeData()->urls()) {
+ if (url.isLocalFile()) {
+ dropLocalFile(url, outputDir, action == Qt::MoveAction);
+ } else {
+ m_OrganizerCore.downloadManager()->startDownloadURLs(QStringList() << url.url());
}
- //Something has gone horribly wrong here
- qDebug("error %d", GetLastError());
}
event->accept();
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 7e59a7b0..405a39ef 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -254,6 +254,8 @@ private:
void startMonitorSaves();
void stopMonitorSaves();
+ void dropLocalFile(const QUrl &url, const QString &outputDir, bool move);
+
private:
static const char *PATTERN_BACKUP_GLOB;
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index ce51ecc6..923ad855 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -322,7 +322,6 @@ bool ModInfo::categorySet(int categoryID) const
return false;
}
-
void ModInfo::testValid()
{
m_Valid = false;
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 4475e021..e05935ef 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -454,6 +454,7 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
if (m_Profile->modEnabled(modID) != enabled) {
m_Profile->setModEnabled(modID, enabled);
m_Modified = true;
+ m_LastCheck.restart();
emit modlist_changed(index, role);
}
result = true;
@@ -665,6 +666,11 @@ void ModList::disconnectSlots() {
m_ModStateChanged.disconnect_all_slots();
}
+int ModList::timeElapsedSinceLastChecked() const
+{
+ return m_LastCheck.elapsed();
+}
+
IModList::ModStates ModList::state(unsigned int modIndex) const
{
IModList::ModStates result;
@@ -760,13 +766,16 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa
QDir modDirectory(modInfo->absolutePath());
QDir gameDirectory(qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::overwritePath()));
- unsigned int overwriteIndex = ModInfo::findMod([](ModInfo::Ptr mod) -> bool {
+ unsigned int overwriteIndex = ModInfo::findMod([] (ModInfo::Ptr mod) -> bool {
std::vector<ModInfo::EFlag> flags = mod->getFlags();
return std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end(); });
QString overwriteName = ModInfo::getByIndex(overwriteIndex)->name();
- foreach (const QUrl &url, mimeData->urls()) {
+ for (const QUrl &url : mimeData->urls()) {
+ if (!url.isLocalFile()) {
+ continue;
+ }
QString relativePath = gameDirectory.relativeFilePath(url.toLocalFile());
if (relativePath.startsWith("..")) {
qDebug("%s drop ignored", qPrintable(url.toLocalFile()));
diff --git a/src/modlist.h b/src/modlist.h
index 6a10cb3e..d2cd00ce 100644
--- a/src/modlist.h
+++ b/src/modlist.h
@@ -111,6 +111,8 @@ public:
void disconnectSlots();
+ int timeElapsedSinceLastChecked() const;
+
public:
/// \copydoc MOBase::IModList::displayName
@@ -311,6 +313,8 @@ private:
std::map<ModInfo::EContent, std::tuple<QString, QString> > m_ContentIcons;
+ QTime m_LastCheck;
+
};
#endif // MODLIST_H
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 38b01563..2d1febea 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -358,6 +358,7 @@ void OrganizerCore::setUserInterface(IUserInterface *userInterface, QWidget *wid
connect(&m_ModList, SIGNAL(removeSelectedMods()), widget, SLOT(removeMod_clicked()));
connect(&m_ModList, SIGNAL(requestColumnSelect(QPoint)), widget, SLOT(displayColumnSelection(QPoint)));
connect(&m_ModList, SIGNAL(fileMoved(QString, QString, QString)), widget, SLOT(fileMoved(QString, QString, QString)));
+ connect(&m_ModList, SIGNAL(modorder_changed()), widget, SLOT(modorder_changed()));
connect(&m_DownloadManager, SIGNAL(showMessage(QString)), widget, SLOT(showMessage(QString)));
}
@@ -515,6 +516,10 @@ void OrganizerCore::createDefaultProfile()
void OrganizerCore::setCurrentProfile(const QString &profileName)
{
+ if ((m_CurrentProfile != nullptr) &&
+ (profileName == m_CurrentProfile->name())) {
+ return;
+ }
QString profileDir = qApp->property("dataPath").toString() + "/" + ToQString(AppConfig::profilesPath()) + "/" + profileName;
Profile *newProfile = new Profile(QDir(profileDir), managedGame());
@@ -1116,6 +1121,11 @@ void OrganizerCore::refreshModList(bool saveChanges)
void OrganizerCore::refreshESPList()
{
+ if (m_DirectoryUpdate) {
+ // don't mess up the esp list if we're currently updating the directory structure
+ m_PostRefreshTasks.append([this] () { this->refreshESPList(); });
+ return;
+ }
m_CurrentProfile->modlistWriter().write();
// clear list
diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp
index 44ee96e9..5443cec0 100644
--- a/src/profilesdialog.cpp
+++ b/src/profilesdialog.cpp
@@ -42,10 +42,9 @@ using namespace MOShared;
Q_DECLARE_METATYPE(Profile::Ptr)
-ProfilesDialog::ProfilesDialog(const QString &gamePath, QWidget *parent)
+ProfilesDialog::ProfilesDialog(const QString &profileName, QWidget *parent)
: TutorableDialog("Profiles", parent)
, ui(new Ui::ProfilesDialog)
- , m_GamePath(gamePath)
, m_FailState(false)
{
ui->setupUi(this);
@@ -58,7 +57,10 @@ ProfilesDialog::ProfilesDialog(const QString &gamePath, QWidget *parent)
while (profileIter.hasNext()) {
profileIter.next();
- addItem(profileIter.filePath());
+ QListWidgetItem *item = addItem(profileIter.filePath());
+ if (profileName == profileIter.fileName()) {
+ m_ProfilesList->setCurrentItem(item);
+ }
}
QCheckBox *invalidationBox = findChild<QCheckBox*>("invalidationBox");
@@ -97,7 +99,7 @@ void ProfilesDialog::on_closeButton_clicked()
}
-void ProfilesDialog::addItem(const QString &name)
+QListWidgetItem *ProfilesDialog::addItem(const QString &name)
{
QDir profileDir(name);
QListWidgetItem *newItem = new QListWidgetItem(profileDir.dirName(), m_ProfilesList);
@@ -107,6 +109,7 @@ void ProfilesDialog::addItem(const QString &name)
} catch (const std::exception& e) {
reportError(tr("failed to create profile: %1").arg(e.what()));
}
+ return newItem;
}
void ProfilesDialog::createProfile(const QString &name, bool useDefaultSettings)
diff --git a/src/profilesdialog.h b/src/profilesdialog.h
index 5cb5a449..6dd0c1d4 100644
--- a/src/profilesdialog.h
+++ b/src/profilesdialog.h
@@ -46,11 +46,11 @@ public:
/**
* @brief constructor
*
- * @param gamePath the path to the game directory
+ * @param profileName currently enabled profile
* @param parent parent widget
* @todo the game path could be retrieved from GameInfo just as easily
**/
- explicit ProfilesDialog(const QString &gamePath, QWidget *parent = 0);
+ explicit ProfilesDialog(const QString &profileName, QWidget *parent = 0);
~ProfilesDialog();
/**
@@ -65,7 +65,7 @@ protected:
private:
- void addItem(const QString &name);
+ QListWidgetItem *addItem(const QString &name);
void createProfile(const QString &name, bool useDefaultSettings);
void createProfile(const QString &name, const Profile &reference);
@@ -91,7 +91,6 @@ private slots:
private:
Ui::ProfilesDialog *ui;
- QString m_GamePath;
QListWidget *m_ProfilesList;
bool m_FailState;
diff --git a/src/settings.cpp b/src/settings.cpp
index c5fa954c..57e422bb 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -473,7 +473,7 @@ void Settings::writePluginBlacklist()
void Settings::addLanguages(QComboBox *languageBox)
{
- languageBox->addItem("English", "en_US");
+ std::vector<std::pair<QString, QString>> languages;
QDirIterator langIter(QCoreApplication::applicationDirPath() + "/translations", QDir::Files);
QString pattern = ToQString(AppConfig::translationPrefix()) + "_([a-z]{2,3}(_[A-Z]{2,2})?).qm";
@@ -484,7 +484,7 @@ void Settings::addLanguages(QComboBox *languageBox)
if (exp.exactMatch(file)) {
QString languageCode = exp.cap(1);
QLocale locale(languageCode);
- QString languageString = QLocale::languageToString(locale.language());
+ QString languageString = QString("%1 (%2)").arg(locale.nativeLanguageName()).arg(locale.nativeCountryName()); //QLocale::languageToString(locale.language());
if (locale.language() == QLocale::Chinese) {
if (languageCode == "zh_TW") {
languageString = "Chinese (traditional)";
@@ -492,9 +492,18 @@ void Settings::addLanguages(QComboBox *languageBox)
languageString = "Chinese (simplified)";
}
}
- languageBox->addItem(QString("%1").arg(languageString), exp.cap(1));
+ languages.push_back(std::make_pair(QString("%1").arg(languageString), exp.cap(1)));
+ //languageBox->addItem(QString("%1").arg(languageString), exp.cap(1));
}
}
+ if (!languageBox->findText("English")) {
+ languages.push_back(std::make_pair(QString("English"), QString("en_US")));
+ //languageBox->addItem("English", "en_US");
+ }
+ std::sort(languages.begin(), languages.end());
+ for (const auto &lang : languages) {
+ languageBox->addItem(lang.first, lang.second);
+ }
}
void Settings::addStyles(QComboBox *styleBox)
diff --git a/src/shared/appconfig.h b/src/shared/appconfig.h
index 54544255..b32043e5 100644
--- a/src/shared/appconfig.h
+++ b/src/shared/appconfig.h
@@ -26,7 +26,7 @@ namespace AppConfig {
#define PARWSTRING wstring
-#define APPPARAM(partype, parid, value) partype parid ## ();
+#define APPPARAM(partype, parid, value) partype parid ();
#include "appconfig.inc"
namespace MOShared {
diff --git a/src/shared/util.cpp b/src/shared/util.cpp
index 2ce88eca..75d80d83 100644
--- a/src/shared/util.cpp
+++ b/src/shared/util.cpp
@@ -22,6 +22,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "error_report.h"
#include <sstream>
+#include <locale>
#include <algorithm>
#include <DbgHelp.h>
#include <set>
@@ -91,29 +92,38 @@ std::wstring ToWString(const std::string &source, bool utf8)
return result;
}
+static std::locale loc("");
+static auto locToLowerW = [] (wchar_t in) -> wchar_t {
+ return std::tolower(in, loc);
+};
+
+static auto locToLower = [] (char in) -> char {
+ return std::tolower(in, loc);
+};
+
std::string &ToLower(std::string &text)
{
- std::transform(text.begin(), text.end(), text.begin(), ::tolower);
+ std::transform(text.begin(), text.end(), text.begin(), locToLower);
return text;
}
std::string ToLower(const std::string &text)
{
std::string result = text;
- std::transform(result.begin(), result.end(), result.begin(), ::tolower);
+ std::transform(result.begin(), result.end(), result.begin(), locToLower);
return result;
}
std::wstring &ToLower(std::wstring &text)
{
- std::transform(text.begin(), text.end(), text.begin(), ::towlower);
+ std::transform(text.begin(), text.end(), text.begin(), locToLowerW);
return text;
}
std::wstring ToLower(const std::wstring &text)
{
std::wstring result = text;
- std::transform(result.begin(), result.end(), result.begin(), ::towlower);
+ std::transform(result.begin(), result.end(), result.begin(), locToLowerW);
return result;
}
diff --git a/src/version.rc b/src/version.rc
index 3f7eaadf..65168b9c 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -1,7 +1,7 @@
#include "Winver.h"
-#define VER_FILEVERSION 1,3,4,0
-#define VER_FILEVERSION_STR "1,3,4,0\0"
+#define VER_FILEVERSION 1,3,5,0
+#define VER_FILEVERSION_STR "1,3,5,0\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION