File fix-placeholder-path-part2.patch of Package kstars

From 1530d9eec6140b53bace3cb5afda8c831834c89c Mon Sep 17 00:00:00 2001
From: Jasem Mutlaq <mutlaqja@ikarustech.com>
Date: Mon, 6 Feb 2023 18:25:12 +0300
Subject: [PATCH] Fix placeholder sequence counter on Windows.

BUGS:465364
FIXED-IN:3.6.3
---
 kstars/auxiliary/ksutils.cpp            |  4 ++--
 kstars/ekos/capture/capture.cpp         |  8 +++-----
 kstars/ekos/capture/placeholderpath.cpp | 27 +++++++++++++++++++++----
 3 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/kstars/auxiliary/ksutils.cpp b/kstars/auxiliary/ksutils.cpp
index 664bbcca8..a9e37efac 100644
--- a/kstars/auxiliary/ksutils.cpp
+++ b/kstars/auxiliary/ksutils.cpp
@@ -1120,7 +1120,7 @@ QString getDefaultPath(const QString &option)
 
     if (option == "fitsDir")
     {
-        return QDir::homePath();
+        return QDir::toNativeSeparators(QDir::homePath());
     }
     else if (option == "indiServer")
     {
@@ -1134,7 +1134,7 @@ QString getDefaultPath(const QString &option)
     else if (option == "PlaceholderFormat")
     {
 #if defined(Q_OS_WIN)
-        return "\%t\%T\%F\%t_%T_%F";
+        return "\\%t\\%T\\%F\\%t_%T_%F";
 #else
         return "/%t/%T/%F/%t_%T_%F";
 #endif
diff --git a/kstars/ekos/capture/capture.cpp b/kstars/ekos/capture/capture.cpp
index 79fdbeab7..2d758f804 100644
--- a/kstars/ekos/capture/capture.cpp
+++ b/kstars/ekos/capture/capture.cpp
@@ -444,7 +444,7 @@ Capture::Capture()
         fileDirectoryT->setText(Options::captureDirectory());
     else
     {
-        fileDirectoryT->setText(QDir::homePath() + QDir::separator() + "Pictures");
+        fileDirectoryT->setText(QDir::toNativeSeparators(QDir::homePath() + "/Pictures"));
         Options::setCaptureDirectory(fileDirectoryT->text());
     }
 
@@ -3741,13 +3741,11 @@ void Capture::syncTelescopeInfo()
 void Capture::saveFITSDirectory()
 {
     QString dir =
-        QFileDialog::getExistingDirectory(Manager::Instance(), i18nc("@title:window", "FITS Save Directory"),
-                                          dirPath.toLocalFile());
-
+        QFileDialog::getExistingDirectory(Manager::Instance(), i18nc("@title:window", "FITS Save Directory"),  dirPath.toLocalFile());
     if (dir.isEmpty())
         return;
 
-    fileDirectoryT->setText(dir);
+    fileDirectoryT->setText(QDir::toNativeSeparators(dir));
 }
 
 void Capture::loadSequenceQueue()
diff --git a/kstars/ekos/capture/placeholderpath.cpp b/kstars/ekos/capture/placeholderpath.cpp
index 2632121d6..97926b514 100644
--- a/kstars/ekos/capture/placeholderpath.cpp
+++ b/kstars/ekos/capture/placeholderpath.cpp
@@ -316,7 +316,7 @@ QString PlaceholderPath::generateFilename(const QString &directory,
     if (batch_mode)
         currentDir = directory;
     else
-        currentDir = KSPaths::writableLocation(QStandardPaths::TempLocation) + QDir::separator() + "kstars" + QDir::separator();
+        currentDir = QDir::toNativeSeparators(KSPaths::writableLocation(QStandardPaths::TempLocation) + "/kstars/");
 
     QString tempFormat = currentDir + format + "_%s" + QString::number(formatSuffix);
 
@@ -324,7 +324,12 @@ QString PlaceholderPath::generateFilename(const QString &directory,
     QRegularExpression
     // This is the original regex with %p & %d tags - disabled for now to simply
     // re("(?<replace>\\%(?<name>(filename|f|Datetime|D|Type|T|exposure|e|Filter|F|target|t|sequence|s|directory|d|path|p))(?<level>\\d+)?)(?<sep>[_/])?");
+#if defined(Q_OS_WIN)
+    re("(?<replace>\\%(?<name>(filename|f|Datetime|D|Type|T|exposure|e|Filter|F|target|t|sequence|s))(?<level>\\d+)?)(?<sep>[_\\\\])?");
+#else
     re("(?<replace>\\%(?<name>(filename|f|Datetime|D|Type|T|exposure|e|Filter|F|target|t|sequence|s))(?<level>\\d+)?)(?<sep>[_/])?");
+#endif
+
     while ((i = tempFormat.indexOf(re, i, &match)) != -1)
     {
         QString replacement = "";
@@ -408,6 +413,7 @@ QString PlaceholderPath::generateFilename(const QString &directory,
         }
         else
             qWarning() << "Unknown replacement string: " << match.captured("replace");
+
         if (replacement.isEmpty())
             tempFormat = tempFormat.replace(match.capturedStart(), match.capturedLength(), replacement);
         else
@@ -442,7 +448,11 @@ QStringList PlaceholderPath::remainingPlaceholders(const QString &filename)
 {
     QList<QString> placeholders = {};
     QRegularExpressionMatch match;
-    QRegularExpression re("(?<replace>\\%(?<name>[a-z])(?<level>\\d+)?)(?<sep>[_/])?");
+#if defined(Q_OS_WIN)
+    QRegularExpression re("(?<replace>\\%(?<name>[a-zA-Z])(?<level>\\d+)?)(?<sep>[_\\\\])+");
+#else
+    QRegularExpression re("(?<replace>%(?<name>[a-zA-Z])(?<level>\\d+)?)(?<sep>[_/])+");
+#endif
     int i = 0;
     while ((i = filename.indexOf(re, i, &match)) != -1)
     {
@@ -456,11 +466,20 @@ QStringList PlaceholderPath::remainingPlaceholders(const QString &filename)
 QList<int> PlaceholderPath::getCompletedFileIds(const SequenceJob &job, const QString &targetName)
 {
     QString path = generateFilename(job, targetName, true, true, 0, ".*", "", true);
-    QFileInfo path_info(path);
+    auto sanitizedPath = path;
+
+    // This is needed for Windows as the regular expression confuses path search
+    QString regexp = "(?<id>\\d+).*";
+    sanitizedPath.remove(regexp);
+    QFileInfo path_info(sanitizedPath);
     QDir dir(path_info.dir());
+
+    // e.g. Light_R_(?<id>\\d+).*
+    QString glob = path_info.fileName() + regexp;
+
     QStringList matchingFiles = dir.entryList(QDir::Files);
     QRegularExpressionMatch match;
-    QRegularExpression re("^" + path_info.fileName() + "$");
+    QRegularExpression re("^" + glob + "$");
     QList<int> ids = {};
     for (auto &name : matchingFiles)
     {
-- 
GitLab


openSUSE Build Service is sponsored by