From ec0b7cbf0dc9f12542b019ce142cf2249e276d05 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Wed, 9 Oct 2019 10:36:51 +0200
Subject: [PATCH 001/134] code cleanup
---
src/core/article.cpp | 3 ++-
src/core/article.h | 3 +--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/core/article.cpp b/src/core/article.cpp
index 3de88de..e17589b 100644
--- a/src/core/article.cpp
+++ b/src/core/article.cpp
@@ -1,4 +1,5 @@
#include "article.h"
+#include "seller.h"
#include "utils.h"
#include
@@ -34,4 +35,4 @@ std::string Article::getCompleteArticleNo() const
std::stringstream artNoStream;
artNoStream << sourceNo_ << "K" << std::setfill('0') << std::setw(5) << articleNo_;
return artNoStream.str();
-}
\ No newline at end of file
+}
diff --git a/src/core/article.h b/src/core/article.h
index b30e293..ab6be52 100644
--- a/src/core/article.h
+++ b/src/core/article.h
@@ -2,8 +2,6 @@
#define ARTICLE_H
#include "entityuuid.h"
-//#include "sale.h"
-//#include "seller.h"
#include
#include
@@ -43,3 +41,4 @@ class Article : public EntityUuid
};
#endif
+
From ad895abd355ed57436f97317230f59ba0748a603 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Wed, 9 Oct 2019 16:31:29 +0200
Subject: [PATCH 002/134] initial meson files added
---
meson.build | 3 +++
src/core/meson.build | 9 +++++++++
src/gui/meson.build | 15 +++++++++++++++
src/meson.build | 5 +++++
src/printer/meson.build | 5 +++++
5 files changed, 37 insertions(+)
create mode 100644 meson.build
create mode 100644 src/core/meson.build
create mode 100644 src/gui/meson.build
create mode 100644 src/meson.build
create mode 100644 src/printer/meson.build
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..a6cfdea
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,3 @@
+project('kima2', 'cpp')
+
+subdir('src')
diff --git a/src/core/meson.build b/src/core/meson.build
new file mode 100644
index 0000000..65c51c7
--- /dev/null
+++ b/src/core/meson.build
@@ -0,0 +1,9 @@
+boost = dependency('boost', modules :['date_time'])
+xlnt = dependency('xlnt')
+sqlite = dependency('sqlite3')
+
+src = ['database.cpp', 'entity.cpp', 'entityint.cpp', 'entityuuid.cpp',
+ 'seller.cpp', 'article.cpp', 'sale.cpp', 'marketplace.cpp',
+ 'excelreader.cpp', 'csvreader.cpp', 'jsonutil.cpp', 'utils.cpp']
+
+core_lib = static_library('core', src, dependencies :[boost, xlnt, sqlite])
diff --git a/src/gui/meson.build b/src/gui/meson.build
new file mode 100644
index 0000000..e169e40
--- /dev/null
+++ b/src/gui/meson.build
@@ -0,0 +1,15 @@
+qt5 = import('qt5')
+qt5_dep = dependency('qt5', modules: ['Core', 'Gui', 'PrintSupport'])
+
+src = ['kima2.cpp', 'mainwindow.cpp', 'sellerdialog.cpp', 'sellermodel.cpp',
+ 'pricedialog.cpp', 'basketmodel.cpp', 'salemodel.cpp', 'reportdialog.cpp',
+ 'reportmodel.cpp', 'settingsdialog.cpp']
+
+ui = ['mainwindow.ui', 'sellerdialog.ui', 'pricedialog.ui', 'reportdialog.ui', 'settingsdialog.ui']
+
+processed = qt5.preprocess(moc_headers : ['basketmodel.h', 'mainwindow.h', 'pricedialog.h', 'reportdialog.h', 'sellerdialog.h', 'settingsdialog.h'],
+ ui_files : ui,
+ qresources : '../../kima2.qrc',
+ dependencies: qt5_dep)
+
+kima2 = executable('kima2', sources : [src, processed], dependencies : qt5_dep)
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000..572c4c3
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,5 @@
+printer = dependency('printer_dep', fallback : ['printer', 'printer_dep'])
+
+subdir('core')
+subdir('printer')
+subdir('gui')
diff --git a/src/printer/meson.build b/src/printer/meson.build
new file mode 100644
index 0000000..b5af280
--- /dev/null
+++ b/src/printer/meson.build
@@ -0,0 +1,5 @@
+libusb = dependency('libusb-1.0')
+
+src = ['posprinter.cpp']
+
+printer_lib = static_library('printer', src, dependencies: [libusb])
From e89728846c9f88095e148ac93dce53c49dae5b62 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 10 Oct 2019 08:09:16 +0200
Subject: [PATCH 003/134] restructure libs
---
src/core/CMakeLists.txt | 6 +++---
src/core/utils.cpp | 27 +--------------------------
src/core/utils.h | 8 ++------
src/gui/basketmodel.h | 4 ++--
src/gui/mainwindow.cpp | 12 ++++++------
src/gui/mainwindow.h | 4 ++--
src/gui/reportdialog.cpp | 5 +++--
src/gui/reportdialog.h | 4 ++--
src/gui/reportmodel.h | 4 ++--
src/gui/salemodel.cpp | 2 +-
src/gui/salemodel.h | 4 ++--
src/gui/sellermodel.h | 4 ++--
src/gui/settingsdialog.cpp | 9 +++++----
src/gui/settingsdialog.h | 4 ++--
src/printer/CMakeLists.txt | 3 ++-
src/printer/posprinter.cpp | 4 ++--
src/printer/posprinter.h | 4 ++--
src/printer/utils.cpp | 26 ++++++++++++++++++++++++++
src/printer/utils.h | 12 ++++++++++++
19 files changed, 79 insertions(+), 67 deletions(-)
create mode 100644 src/printer/utils.cpp
create mode 100644 src/printer/utils.h
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 504d0c3..8add251 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -29,11 +29,11 @@ set(CORE_SOURCES
add_library(core STATIC ${CORE_SOURCES})
target_include_directories(core PRIVATE ${PROJECT_SOURCE_DIR}/3rdparty/csv-parser/include)
if (WIN32)
- target_link_libraries(core PRIVATE printer Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARY} csv)
+ target_link_libraries(core PRIVATE Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARY} csv)
target_link_libraries(core PRIVATE bcrypt)
else()
- target_link_libraries(core PRIVATE printer Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARIES} csv)
+ target_link_libraries(core PRIVATE Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARIES} csv)
endif()
#target_include_directories(core PRIVATE ${PROJECT_SOURCE_DIR}/3rdparty/csv-parser)
-target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)
diff --git a/src/core/utils.cpp b/src/core/utils.cpp
index 10b1b5f..83c7a3a 100644
--- a/src/core/utils.cpp
+++ b/src/core/utils.cpp
@@ -21,31 +21,6 @@ std::string formatCentAsEuroString(const int cent, int width)
return currStream.str();
}
-std::optional convertToPosPrinterDevice(const std::string& device,
- const std::string& endpoint)
-{
- if (device.empty()) {
- return std::nullopt;
- }
-
- PrinterDevice printerDevice;
- std::string delimiter = ":";
- try {
- printerDevice.idVendor = std::stoi(device.substr(0, device.find(delimiter)), 0, 16);
- printerDevice.idProduct = std::stoi(device.substr(device.find(delimiter) + 1), 0, 16);
- if (endpoint.empty()) {
- printerDevice.endpoint = 0x03;
- } else {
- printerDevice.endpoint = std::stoi(endpoint, 0, 16);
- }
-
- } catch (std::exception& ex) {
- throw ex;
- }
-
- return printerDevice;
-}
-
std::string& ltrim(std::string& str, const std::string& chars)
{
str.erase(0, str.find_first_not_of(chars));
@@ -71,4 +46,4 @@ bool case_insensitive_match(std::string s1, std::string s2)
if (s1.compare(s2) == 0)
return true; // The strings are same
return false; // not matched
-}
\ No newline at end of file
+}
diff --git a/src/core/utils.h b/src/core/utils.h
index 7ea6499..9ca2d32 100644
--- a/src/core/utils.h
+++ b/src/core/utils.h
@@ -1,15 +1,11 @@
-#ifndef UTILS_H
-#define UTILS_H
-
-#include "posprinter.h"
+#ifndef CORE_UTILS_H
+#define CORE_UTILS_H
#include
#include
#include
std::string formatCentAsEuroString(const int cent, int width = 10);
-std::optional convertToPosPrinterDevice(const std::string& vendor,
- const std::string& endpoint);
std::string& ltrim(std::string& str, const std::string& chars = "\t\n\v\f\r ");
std::string& rtrim(std::string& str, const std::string& chars = "\t\n\v\f\r ");
std::string& trim(std::string& str, const std::string& chars = "\t\n\v\f\r ");
diff --git a/src/gui/basketmodel.h b/src/gui/basketmodel.h
index 5cc6be6..7c1858c 100644
--- a/src/gui/basketmodel.h
+++ b/src/gui/basketmodel.h
@@ -1,7 +1,7 @@
#ifndef BASKET_MODEL_H
#define BASKET_MODEL_H
-#include
+#include
#include
@@ -27,4 +27,4 @@ class BasketModel : public QAbstractTableModel
Marketplace* marketplace_;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 0df9658..32d8813 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -2,18 +2,18 @@
#include "basketmodel.h"
#include "config.h"
-#include "jsonutil.h"
#include "pricedialog.h"
#include "reportdialog.h"
#include "salemodel.h"
#include "sellerdialog.h"
#include "settingsdialog.h"
-#include
-
-#include
-#include
-#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
#include
diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h
index 578886b..12f9689 100644
--- a/src/gui/mainwindow.h
+++ b/src/gui/mainwindow.h
@@ -3,7 +3,7 @@
#include "ui_mainwindow.h"
-#include
+#include
#include
#include
@@ -53,4 +53,4 @@ class MainWindow : public QMainWindow
std::unique_ptr marketplace_;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gui/reportdialog.cpp b/src/gui/reportdialog.cpp
index 9cb7393..84971ec 100644
--- a/src/gui/reportdialog.cpp
+++ b/src/gui/reportdialog.cpp
@@ -2,8 +2,9 @@
#include "mainwindow.h"
-#include
-#include
+#include
+#include
+#include
#include
diff --git a/src/gui/reportdialog.h b/src/gui/reportdialog.h
index 14e298a..18e1802 100644
--- a/src/gui/reportdialog.h
+++ b/src/gui/reportdialog.h
@@ -5,7 +5,7 @@
#include "reportmodel.h"
-#include
+#include
#include
@@ -30,4 +30,4 @@ class ReportDialog : public QDialog
std::unique_ptr model_;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gui/reportmodel.h b/src/gui/reportmodel.h
index 6509d2f..36855da 100644
--- a/src/gui/reportmodel.h
+++ b/src/gui/reportmodel.h
@@ -1,7 +1,7 @@
#ifndef REPORT_MODEL_H
#define REPORT_MODEL_H
-#include
+#include
#include
@@ -20,4 +20,4 @@ class ReportModel : public QAbstractTableModel
int maxFeeInCent_{};
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gui/salemodel.cpp b/src/gui/salemodel.cpp
index 3549003..93289e1 100644
--- a/src/gui/salemodel.cpp
+++ b/src/gui/salemodel.cpp
@@ -1,6 +1,6 @@
#include "salemodel.h"
-#include
+#include
#include
diff --git a/src/gui/salemodel.h b/src/gui/salemodel.h
index dc2623d..6675bd6 100644
--- a/src/gui/salemodel.h
+++ b/src/gui/salemodel.h
@@ -1,7 +1,7 @@
#ifndef SALEMODEL_H
#define SALEMODEL_H
-#include
+#include
#include
@@ -28,4 +28,4 @@ class SaleModel : public QAbstractItemModel
std::unique_ptr rootItem{new Sale()};
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gui/sellermodel.h b/src/gui/sellermodel.h
index 0952bb4..32b6b7d 100644
--- a/src/gui/sellermodel.h
+++ b/src/gui/sellermodel.h
@@ -1,7 +1,7 @@
#ifndef SELLER_MODEL_H
#define SELLER_MODEL_H
-#include
+#include
#include
@@ -28,4 +28,4 @@ class SellerModel : public QAbstractTableModel
Marketplace* marketplace_;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp
index ac3a7a4..57bcc81 100644
--- a/src/gui/settingsdialog.cpp
+++ b/src/gui/settingsdialog.cpp
@@ -2,9 +2,10 @@
#include "mainwindow.h"
-#include
-#include
-#include
+#include
+#include
+#include
+#include
#include
#include
@@ -116,4 +117,4 @@ void SettingsDialog::accept()
}
QDialog::accept();
-}
\ No newline at end of file
+}
diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h
index 39e3086..da03ddc 100644
--- a/src/gui/settingsdialog.h
+++ b/src/gui/settingsdialog.h
@@ -3,7 +3,7 @@
#include "ui_settingsdialog.h"
-#include
+#include
#include
@@ -21,4 +21,4 @@ class SettingsDialog : public QDialog
Marketplace* market_{};
};
-#endif
\ No newline at end of file
+#endif
diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt
index 84c58a6..9dfaa3e 100644
--- a/src/printer/CMakeLists.txt
+++ b/src/printer/CMakeLists.txt
@@ -11,6 +11,7 @@ endif()
set(PRINTER_SOURCES
posprinter.cpp
+ utils.cpp
)
add_library(printer STATIC ${PRINTER_SOURCES})
@@ -19,4 +20,4 @@ if(WIN32)
else()
target_link_libraries(printer core ${LibUSB_LIBRARIES})
endif()
-target_include_directories(printer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(printer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)
diff --git a/src/printer/posprinter.cpp b/src/printer/posprinter.cpp
index 43a900f..368d483 100644
--- a/src/printer/posprinter.cpp
+++ b/src/printer/posprinter.cpp
@@ -1,6 +1,6 @@
#include "posprinter.h"
-#include
+#include
#include
@@ -213,4 +213,4 @@ bool PosPrinter::isValid()
return true;
else
return false;
-}
\ No newline at end of file
+}
diff --git a/src/printer/posprinter.h b/src/printer/posprinter.h
index fd92314..4ddd083 100644
--- a/src/printer/posprinter.h
+++ b/src/printer/posprinter.h
@@ -1,8 +1,8 @@
#ifndef POS_PRINTER_H
#define POS_PRINTER_H
-#include
-#include
+#include
+#include
#include
diff --git a/src/printer/utils.cpp b/src/printer/utils.cpp
new file mode 100644
index 0000000..10cb4ed
--- /dev/null
+++ b/src/printer/utils.cpp
@@ -0,0 +1,26 @@
+#include "utils.h"
+
+std::optional convertToPosPrinterDevice(const std::string& device,
+ const std::string& endpoint)
+{
+ if (device.empty()) {
+ return std::nullopt;
+ }
+
+ PrinterDevice printerDevice;
+ std::string delimiter = ":";
+ try {
+ printerDevice.idVendor = std::stoi(device.substr(0, device.find(delimiter)), 0, 16);
+ printerDevice.idProduct = std::stoi(device.substr(device.find(delimiter) + 1), 0, 16);
+ if (endpoint.empty()) {
+ printerDevice.endpoint = 0x03;
+ } else {
+ printerDevice.endpoint = std::stoi(endpoint, 0, 16);
+ }
+
+ } catch (std::exception& ex) {
+ throw ex;
+ }
+
+ return printerDevice;
+}
diff --git a/src/printer/utils.h b/src/printer/utils.h
new file mode 100644
index 0000000..4429ae9
--- /dev/null
+++ b/src/printer/utils.h
@@ -0,0 +1,12 @@
+#ifndef PRINTER_UTILS_H
+#define PRINTER_UTILS_H
+
+#include "posprinter.h"
+
+#include
+#include
+
+std::optional convertToPosPrinterDevice(const std::string& vendor,
+ const std::string& endpoint);
+
+#endif
From 2faa2fa019659a4f1dc8f1aab71b0ed8509411fa Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 10 Oct 2019 13:36:18 +0200
Subject: [PATCH 004/134] 3rdparty renamed to subprojects
---
.gitmodules | 6 ++---
{3rdparty => subprojects}/CMakeLists.txt | 0
{3rdparty => subprojects}/csv-parser | 0
{3rdparty => subprojects}/nlohmann_json | 0
subprojects/singleapplication/meson.build | 27 +++++++++++++++++++
.../singleapplication/singleapplication.git | 0
6 files changed, 30 insertions(+), 3 deletions(-)
rename {3rdparty => subprojects}/CMakeLists.txt (100%)
rename {3rdparty => subprojects}/csv-parser (100%)
rename {3rdparty => subprojects}/nlohmann_json (100%)
create mode 100644 subprojects/singleapplication/meson.build
rename 3rdparty/singleapplication => subprojects/singleapplication/singleapplication.git (100%)
diff --git a/.gitmodules b/.gitmodules
index acf8bbe..e9cb36c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,9 +1,9 @@
[submodule "3rdparty/nlohmann_json"]
- path = 3rdparty/nlohmann_json
+ path = subprojects/nlohmann_json
url = https://github.com/nlohmann/json.git
[submodule "3rdparty/singleapplication"]
- path = 3rdparty/singleapplication
+ path = subprojects/singleapplication/singleapplication.git
url = https://github.com/itay-grudev/SingleApplication.git
[submodule "3rdparty/csv-parser"]
- path = 3rdparty/csv-parser
+ path = subprojects/csv-parser
url = https://github.com/vincentlaucsb/csv-parser.git
diff --git a/3rdparty/CMakeLists.txt b/subprojects/CMakeLists.txt
similarity index 100%
rename from 3rdparty/CMakeLists.txt
rename to subprojects/CMakeLists.txt
diff --git a/3rdparty/csv-parser b/subprojects/csv-parser
similarity index 100%
rename from 3rdparty/csv-parser
rename to subprojects/csv-parser
diff --git a/3rdparty/nlohmann_json b/subprojects/nlohmann_json
similarity index 100%
rename from 3rdparty/nlohmann_json
rename to subprojects/nlohmann_json
diff --git a/subprojects/singleapplication/meson.build b/subprojects/singleapplication/meson.build
new file mode 100644
index 0000000..1b43463
--- /dev/null
+++ b/subprojects/singleapplication/meson.build
@@ -0,0 +1,27 @@
+project('singleapplication')
+
+qt5 = import('qt5')
+dep_qt5 = dependency('qt5', modules: ['Core', 'Widgets', 'Network'])
+
+singleapp_inc = include_directories('singleapplication.git')
+
+singleapp_moc = qt5.preprocess(
+ moc_headers: ['singleapplication.git/singleapplication.h', 'singleapplication.git/singleapplication_p.h'],
+ moc_extra_arguments: ['-DQAPPLICATION_CLASS=QApplication'],
+ dependencies: dep_qt5
+)
+
+singleapp_lib = static_library('SingleApplication',
+ ['singleapplication.git/singleapplication.cpp', 'singleapplication.git/singleapplication_p.cpp', singleapp_moc],
+ include_directories: singleapp_inc,
+ cpp_args : '-DQAPPLICATION_CLASS=QApplication',
+ dependencies: dep_qt5
+)
+
+singleapp_dep = declare_dependency(
+ include_directories: singleapp_inc,
+ link_with: singleapp_lib
+)
+
+# On windows, SingleApplication needs to be linked against advapi32. This is
+# done by adding 'advapi32' to cpp_winlibs, where it should be by default.
diff --git a/3rdparty/singleapplication b/subprojects/singleapplication/singleapplication.git
similarity index 100%
rename from 3rdparty/singleapplication
rename to subprojects/singleapplication/singleapplication.git
From d13f9d2824ad22e4fda94dc3fd6eab6607d2968d Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 10 Oct 2019 13:36:48 +0200
Subject: [PATCH 005/134] meson is now working ... somehow
---
meson.build | 19 ++++++++++++++++++-
src/core/csvreader.cpp | 3 ++-
src/core/meson.build | 6 +++++-
src/gui/mainwindow.cpp | 2 +-
src/gui/meson.build | 12 +++++++++---
src/gui/settingsdialog.h | 2 ++
src/meson.build | 2 --
src/printer/meson.build | 8 ++++++--
8 files changed, 43 insertions(+), 11 deletions(-)
diff --git a/meson.build b/meson.build
index a6cfdea..7934a7a 100644
--- a/meson.build
+++ b/meson.build
@@ -1,3 +1,20 @@
-project('kima2', 'cpp')
+project('kima2', 'cpp', default_options : ['cpp_std=c++17'], version : '1.6.0')
+
+conf_data = configuration_data()
+conf_data.set('PROJECT_VERSION', '"' + meson.project_version() + '"')
+configure_file(output : 'config.h',
+ configuration : conf_data)
+configuration_inc = include_directories('.')
+
+cmake = import('cmake')
+
+#csv = cmake.subproject('csv-parser')
+#csv_lib = csv.dependency('csv')
+nlohmann = cmake.subproject('nlohmann_json', cmake_options : ['-DJSON_BuildTests=OFF', '-DCMAKE_BUILD_TYPE=Release'])
+nlohmann_lib = nlohmann.dependency('nlohmann_json')
+
+singleapp_proj = subproject('singleapplication')
+singleapp_lib = singleapp_proj.get_variable('singleapp_lib')
+singleapp_dep = singleapp_proj.get_variable('singleapp_dep')
subdir('src')
diff --git a/src/core/csvreader.cpp b/src/core/csvreader.cpp
index 73f95e1..848ddde 100644
--- a/src/core/csvreader.cpp
+++ b/src/core/csvreader.cpp
@@ -2,7 +2,8 @@
#include "utils.h"
#include
-#include
+#include "../../subprojects/csv-parser/single_include/csv.hpp"
+//#include
namespace fs = std::filesystem;
diff --git a/src/core/meson.build b/src/core/meson.build
index 65c51c7..c515eb8 100644
--- a/src/core/meson.build
+++ b/src/core/meson.build
@@ -6,4 +6,8 @@ src = ['database.cpp', 'entity.cpp', 'entityint.cpp', 'entityuuid.cpp',
'seller.cpp', 'article.cpp', 'sale.cpp', 'marketplace.cpp',
'excelreader.cpp', 'csvreader.cpp', 'jsonutil.cpp', 'utils.cpp']
-core_lib = static_library('core', src, dependencies :[boost, xlnt, sqlite])
+core_inc = include_directories('..')
+
+core_lib = static_library('core', src, dependencies :[boost, xlnt, sqlite, nlohmann_lib])
+
+core_dep = declare_dependency(link_with : core_lib, include_directories : core_inc)
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 32d8813..6c7e814 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -1,7 +1,7 @@
#include "mainwindow.h"
#include "basketmodel.h"
-#include "config.h"
+#include
#include "pricedialog.h"
#include "reportdialog.h"
#include "salemodel.h"
diff --git a/src/gui/meson.build b/src/gui/meson.build
index e169e40..07d7147 100644
--- a/src/gui/meson.build
+++ b/src/gui/meson.build
@@ -1,5 +1,8 @@
qt5 = import('qt5')
-qt5_dep = dependency('qt5', modules: ['Core', 'Gui', 'PrintSupport'])
+qt5_dep = dependency('qt5', modules: ['Core', 'Gui', 'PrintSupport', 'Network'])
+
+thread_dep = dependency('threads')
+
src = ['kima2.cpp', 'mainwindow.cpp', 'sellerdialog.cpp', 'sellermodel.cpp',
'pricedialog.cpp', 'basketmodel.cpp', 'salemodel.cpp', 'reportdialog.cpp',
@@ -7,9 +10,12 @@ src = ['kima2.cpp', 'mainwindow.cpp', 'sellerdialog.cpp', 'sellermodel.cpp',
ui = ['mainwindow.ui', 'sellerdialog.ui', 'pricedialog.ui', 'reportdialog.ui', 'settingsdialog.ui']
-processed = qt5.preprocess(moc_headers : ['basketmodel.h', 'mainwindow.h', 'pricedialog.h', 'reportdialog.h', 'sellerdialog.h', 'settingsdialog.h'],
+processed = qt5.preprocess(moc_headers : ['basketmodel.h', 'mainwindow.h', 'pricedialog.h',
+ 'reportdialog.h', 'sellerdialog.h', 'settingsdialog.h',
+ 'sellermodel.h', 'salemodel.h'],
ui_files : ui,
qresources : '../../kima2.qrc',
dependencies: qt5_dep)
-kima2 = executable('kima2', sources : [src, processed], dependencies : qt5_dep)
+kima2 = executable('kima2', sources : [src, processed], dependencies : [qt5_dep, singleapp_dep, core_dep, printer_dep, thread_dep],
+ include_directories : [configuration_inc])
diff --git a/src/gui/settingsdialog.h b/src/gui/settingsdialog.h
index da03ddc..a1a7026 100644
--- a/src/gui/settingsdialog.h
+++ b/src/gui/settingsdialog.h
@@ -9,6 +9,8 @@
class SettingsDialog : public QDialog
{
+ Q_OBJECT
+
public:
SettingsDialog(QWidget* parent = nullptr,
Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
diff --git a/src/meson.build b/src/meson.build
index 572c4c3..439c81e 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,5 +1,3 @@
-printer = dependency('printer_dep', fallback : ['printer', 'printer_dep'])
-
subdir('core')
subdir('printer')
subdir('gui')
diff --git a/src/printer/meson.build b/src/printer/meson.build
index b5af280..64f0602 100644
--- a/src/printer/meson.build
+++ b/src/printer/meson.build
@@ -1,5 +1,9 @@
libusb = dependency('libusb-1.0')
-src = ['posprinter.cpp']
+src = ['posprinter.cpp', 'utils.cpp']
-printer_lib = static_library('printer', src, dependencies: [libusb])
+printer_inc = include_directories('..')
+
+printer_lib = static_library('printer', src, dependencies: [libusb, core_dep])
+
+printer_dep = declare_dependency(link_with : printer_lib, include_directories : printer_inc)
From e987692c7a23ca955dfa7edb5c39187970eceb90 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 10 Oct 2019 14:42:11 +0200
Subject: [PATCH 006/134] add files to be installed to meson
---
meson.build | 4 ++++
src/gui/meson.build | 6 ++++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/meson.build b/meson.build
index 7934a7a..46a64ac 100644
--- a/meson.build
+++ b/meson.build
@@ -18,3 +18,7 @@ singleapp_lib = singleapp_proj.get_variable('singleapp_lib')
singleapp_dep = singleapp_proj.get_variable('singleapp_dep')
subdir('src')
+
+install_data('misc/kima2.svg', install_dir : get_option('datadir') / 'icons/hicolor/scalable/apps')
+install_data('misc/kima2.desktop', install_dir : get_option('datadir') / 'applications')
+install_data('manual/Benutzerhandbuch.pdf', install_dir : get_option('datadir') / 'kima2')
diff --git a/src/gui/meson.build b/src/gui/meson.build
index 07d7147..18bfcee 100644
--- a/src/gui/meson.build
+++ b/src/gui/meson.build
@@ -17,5 +17,7 @@ processed = qt5.preprocess(moc_headers : ['basketmodel.h', 'mainwindow.h', 'pric
qresources : '../../kima2.qrc',
dependencies: qt5_dep)
-kima2 = executable('kima2', sources : [src, processed], dependencies : [qt5_dep, singleapp_dep, core_dep, printer_dep, thread_dep],
- include_directories : [configuration_inc])
+kima2 = executable('kima2', sources : [src, processed],
+ dependencies : [qt5_dep, singleapp_dep, core_dep, printer_dep, thread_dep],
+ include_directories : [configuration_inc],
+ install : true)
From 7ca04f79cef14884269c098f240be44ca4353365 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 10 Oct 2019 14:52:00 +0200
Subject: [PATCH 007/134] more on meson
---
meson.build | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/meson.build b/meson.build
index 46a64ac..35b6250 100644
--- a/meson.build
+++ b/meson.build
@@ -19,6 +19,8 @@ singleapp_dep = singleapp_proj.get_variable('singleapp_dep')
subdir('src')
-install_data('misc/kima2.svg', install_dir : get_option('datadir') / 'icons/hicolor/scalable/apps')
-install_data('misc/kima2.desktop', install_dir : get_option('datadir') / 'applications')
-install_data('manual/Benutzerhandbuch.pdf', install_dir : get_option('datadir') / 'kima2')
+if build_machine.system() == 'linux'
+ install_data('misc/kima2.svg', install_dir : get_option('datadir') / 'icons/hicolor/scalable/apps')
+ install_data('misc/kima2.desktop', install_dir : get_option('datadir') / 'applications')
+ install_data('manual/Benutzerhandbuch.pdf', install_dir : get_option('datadir') / 'kima2')
+endif
From b016452a06323e72778ad0cfda1d8d692f58b52a Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 10 Oct 2019 15:00:09 +0200
Subject: [PATCH 008/134] adjust cmake files to changed filesystem
---
CMakeLists.txt | 2 +-
src/gui/CMakeLists.txt | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5aa0bb0..842ff8f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@ if(KIMA2_USE_EXTERNAL_JSON)
find_package(nlohmann_json REQUIRED)
endif()
-add_subdirectory(3rdparty)
+add_subdirectory(subprojects)
add_subdirectory(src)
#if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE MATCHES Debug)
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index 8992f6f..3f62bef 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -33,13 +33,13 @@ set(GUI_SOURCES
settingsdialog.cpp
settingsdialog.ui
../../kima2.qrc
- ${PROJECT_SOURCE_DIR}/3rdparty/singleapplication/singleapplication.cpp
- ${PROJECT_SOURCE_DIR}/3rdparty/singleapplication/singleapplication_p.cpp
+ ${PROJECT_SOURCE_DIR}/subprojects/singleapplication/singleapplication.git/singleapplication.cpp
+ ${PROJECT_SOURCE_DIR}/subprojects/singleapplication/singleapplication.git/singleapplication_p.cpp
)
add_executable(kima2 ${GUI_SOURCES} kima2.rc)
target_include_directories(kima2 PRIVATE ${PROJECT_BINARY_DIR})
-target_include_directories(kima2 PRIVATE ${PROJECT_SOURCE_DIR}/3rdparty/singleapplication)
+target_include_directories(kima2 PRIVATE ${PROJECT_SOURCE_DIR}/subprojects/singleapplication/singleapplication.git)
target_link_libraries(kima2 core printer Qt5::Widgets Qt5::PrintSupport Qt5::Network stdc++fs)
if(WIN32)
set_target_properties(kima2 PROPERTIES LINK_FLAGS "-mwindows")
From f37cd7550285d9c2528e8a94991b91fe83af7b1e Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 11 Oct 2019 09:09:18 +0200
Subject: [PATCH 009/134] using system json lib if available (works on Arch
Linux)
---
meson.build | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/meson.build b/meson.build
index 35b6250..bceed86 100644
--- a/meson.build
+++ b/meson.build
@@ -10,8 +10,14 @@ cmake = import('cmake')
#csv = cmake.subproject('csv-parser')
#csv_lib = csv.dependency('csv')
-nlohmann = cmake.subproject('nlohmann_json', cmake_options : ['-DJSON_BuildTests=OFF', '-DCMAKE_BUILD_TYPE=Release'])
-nlohmann_lib = nlohmann.dependency('nlohmann_json')
+
+nlohmann_lib = dependency('nlohmann_json', version : '>=3.5.0', required : false)
+
+if not nlohmann_lib.found()
+ nlohmann = cmake.subproject('nlohmann_json',
+ cmake_options : ['-DJSON_BuildTests=OFF', '-DCMAKE_BUILD_TYPE=Release'])
+ nlohmann_lib = nlohmann.dependency('nlohmann_json')
+endif
singleapp_proj = subproject('singleapplication')
singleapp_lib = singleapp_proj.get_variable('singleapp_lib')
From b9d4375f5a842e70c9343209658906a7a1c9cdbf Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 11 Oct 2019 10:01:21 +0200
Subject: [PATCH 010/134] improved build instructions
---
meson.build | 12 ++++++------
src/core/CMakeLists.txt | 12 ++++++++----
src/core/csvreader.cpp | 4 ++--
src/core/meson.build | 2 +-
subprojects/CMakeLists.txt | 2 +-
5 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/meson.build b/meson.build
index bceed86..d40c67d 100644
--- a/meson.build
+++ b/meson.build
@@ -6,19 +6,19 @@ configure_file(output : 'config.h',
configuration : conf_data)
configuration_inc = include_directories('.')
-cmake = import('cmake')
-
#csv = cmake.subproject('csv-parser')
#csv_lib = csv.dependency('csv')
-nlohmann_lib = dependency('nlohmann_json', version : '>=3.5.0', required : false)
+nlohmann_lib = dependency('nlohmann_json', version : '>=3.55.0', required : false)
if not nlohmann_lib.found()
- nlohmann = cmake.subproject('nlohmann_json',
- cmake_options : ['-DJSON_BuildTests=OFF', '-DCMAKE_BUILD_TYPE=Release'])
- nlohmann_lib = nlohmann.dependency('nlohmann_json')
+ nlohmann_inc = include_directories('subprojects/nlohmann_json/single_include/nlohmann')
+ nlohmann_lib = declare_dependency(include_directories : nlohmann_inc)
endif
+csv_inc = include_directories('subprojects/csv-parser/single_include')
+csv_dep = declare_dependency(include_directories : csv_inc)
+
singleapp_proj = subproject('singleapplication')
singleapp_lib = singleapp_proj.get_variable('singleapp_lib')
singleapp_dep = singleapp_proj.get_variable('singleapp_dep')
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 8add251..0e4b100 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -3,6 +3,11 @@ set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.62 COMPONENTS date_time REQUIRED)
find_package(SQLite3 REQUIRED)
+# Because csv-parser needs threads:
+set(THREADS_PREFER_PTHREAD_FLAG ON)
+find_package(Threads REQUIRED)
+
+
if (MINGW)
find_package(XLNT REQUIRED STATIC)
else (MINGW)
@@ -27,13 +32,12 @@ set(CORE_SOURCES
add_library(core STATIC ${CORE_SOURCES})
-target_include_directories(core PRIVATE ${PROJECT_SOURCE_DIR}/3rdparty/csv-parser/include)
+target_include_directories(core PRIVATE ${PROJECT_SOURCE_DIR}/subprojects/csv-parser/single_include)
if (WIN32)
- target_link_libraries(core PRIVATE Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARY} csv)
+ target_link_libraries(core PRIVATE Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARY} Threads::Threads)
target_link_libraries(core PRIVATE bcrypt)
else()
- target_link_libraries(core PRIVATE Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARIES} csv)
+ target_link_libraries(core PRIVATE Boost::boost Boost::date_time sqlite3 nlohmann_json::nlohmann_json ${XLNT_LIBRARIES} Threads::Threads)
endif()
-#target_include_directories(core PRIVATE ${PROJECT_SOURCE_DIR}/3rdparty/csv-parser)
target_include_directories(core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)
diff --git a/src/core/csvreader.cpp b/src/core/csvreader.cpp
index 848ddde..7b87044 100644
--- a/src/core/csvreader.cpp
+++ b/src/core/csvreader.cpp
@@ -2,8 +2,8 @@
#include "utils.h"
#include
-#include "../../subprojects/csv-parser/single_include/csv.hpp"
-//#include
+
+#include
namespace fs = std::filesystem;
diff --git a/src/core/meson.build b/src/core/meson.build
index c515eb8..a2923b9 100644
--- a/src/core/meson.build
+++ b/src/core/meson.build
@@ -8,6 +8,6 @@ src = ['database.cpp', 'entity.cpp', 'entityint.cpp', 'entityuuid.cpp',
core_inc = include_directories('..')
-core_lib = static_library('core', src, dependencies :[boost, xlnt, sqlite, nlohmann_lib])
+core_lib = static_library('core', src, dependencies :[boost, xlnt, sqlite, nlohmann_lib, csv_dep])
core_dep = declare_dependency(link_with : core_lib, include_directories : core_inc)
diff --git a/subprojects/CMakeLists.txt b/subprojects/CMakeLists.txt
index 94fa640..6ef42eb 100644
--- a/subprojects/CMakeLists.txt
+++ b/subprojects/CMakeLists.txt
@@ -2,4 +2,4 @@ if(NOT KIMA2_USE_EXTERNAL_JSON)
set(JSON_BuildTests OFF CACHE INTERNAL "")
add_subdirectory(nlohmann_json EXCLUDE_FROM_ALL)
endif()
-add_subdirectory(csv-parser)
+#add_subdirectory(csv-parser)
From 03f1c7cca51a9a9d7351ef965eb60cc632f322dc Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 11 Oct 2019 11:09:54 +0200
Subject: [PATCH 011/134] Initial commit of rpm spec file
---
misc/kima2.spec | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
create mode 100644 misc/kima2.spec
diff --git a/misc/kima2.spec b/misc/kima2.spec
new file mode 100644
index 0000000..9d154ff
--- /dev/null
+++ b/misc/kima2.spec
@@ -0,0 +1,42 @@
+Name: kima2
+Version: # FIXME
+Release: 1%{?dist}
+Summary: A small cash point program for children's things markets
+License: custom
+
+Source0: %{name}-%{version}.tar.xz # FIXME
+
+BuildRequires: meson
+BuildRequires: gcc-c++
+BuildRequires: pkgconfig(nlohmann_json)
+BuildRequires: pkgconfig(qt5)
+BuildRequires: pkgconfig(boost)
+BuildRequires: pkgconfig(xlnt)
+BuildRequires: pkgconfig(sqlite3)
+BuildRequires: pkgconfig(libusb-1.0)
+BuildRequires: pkgconfig(qt5)
+BuildRequires: pkgconfig(threads)
+
+%description
+
+%prep
+%autosetup
+
+%build
+%meson
+%meson_build
+
+%install
+%meson_install
+
+%check
+%meson_test
+
+%files
+%{_bindir}/kima2
+
+
+%changelog
+* Fri Oct 11 2019 Martin Brodbeck - dev builds
+-
+
From 77226f294b3f84a0279c9e5b0bc06f672510ccf3 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 11 Oct 2019 12:48:54 +0200
Subject: [PATCH 012/134] rpm builds now
---
misc/kima2.spec | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/misc/kima2.spec b/misc/kima2.spec
index 9d154ff..0c3feff 100644
--- a/misc/kima2.spec
+++ b/misc/kima2.spec
@@ -1,21 +1,20 @@
Name: kima2
-Version: # FIXME
+Version: 1.6.0
Release: 1%{?dist}
Summary: A small cash point program for children's things markets
License: custom
-Source0: %{name}-%{version}.tar.xz # FIXME
+Source0: %{name}-%{version}.tar.gz
BuildRequires: meson
BuildRequires: gcc-c++
-BuildRequires: pkgconfig(nlohmann_json)
-BuildRequires: pkgconfig(qt5)
-BuildRequires: pkgconfig(boost)
-BuildRequires: pkgconfig(xlnt)
-BuildRequires: pkgconfig(sqlite3)
-BuildRequires: pkgconfig(libusb-1.0)
-BuildRequires: pkgconfig(qt5)
-BuildRequires: pkgconfig(threads)
+#BuildRequires: pkgconfig(nlohmann_json)
+BuildRequires: boost-date-time
+BuildRequires: sqlite-devel
+BuildRequires: libusb-devel
+BuildRequires: qt5-qtdeclarative-devel
+#BuildRequires: pkgconfig(xlnt)
+#BuildRequires: pkgconfig(pthreads)
%description
@@ -34,6 +33,9 @@ BuildRequires: pkgconfig(threads)
%files
%{_bindir}/kima2
+%{_datadir}/applications/kima2.desktop
+%{_datadir}/icons/hicolor/scalable/apps/kima2.svg
+%{_datadir}/kima2/Benutzerhandbuch.pdf
%changelog
From 5aa4e3a5f0456e87c32cba44540d2681fbc8896d Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 11 Oct 2019 12:49:32 +0200
Subject: [PATCH 013/134] typo
---
meson.build | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index d40c67d..2d3f1ae 100644
--- a/meson.build
+++ b/meson.build
@@ -9,7 +9,7 @@ configuration_inc = include_directories('.')
#csv = cmake.subproject('csv-parser')
#csv_lib = csv.dependency('csv')
-nlohmann_lib = dependency('nlohmann_json', version : '>=3.55.0', required : false)
+nlohmann_lib = dependency('nlohmann_json', version : '>=3.5.0', required : false)
if not nlohmann_lib.found()
nlohmann_inc = include_directories('subprojects/nlohmann_json/single_include/nlohmann')
@@ -30,3 +30,6 @@ if build_machine.system() == 'linux'
install_data('misc/kima2.desktop', install_dir : get_option('datadir') / 'applications')
install_data('manual/Benutzerhandbuch.pdf', install_dir : get_option('datadir') / 'kima2')
endif
+
+rpm = import('rpm')
+rpm.generate_spec_template()
From a8181729f919a3ca43cda0a13e48058d85d9296e Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Mon, 14 Oct 2019 19:32:14 +0200
Subject: [PATCH 014/134] more on meson
---
meson.build | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/meson.build b/meson.build
index 2d3f1ae..61a111b 100644
--- a/meson.build
+++ b/meson.build
@@ -12,7 +12,7 @@ configuration_inc = include_directories('.')
nlohmann_lib = dependency('nlohmann_json', version : '>=3.5.0', required : false)
if not nlohmann_lib.found()
- nlohmann_inc = include_directories('subprojects/nlohmann_json/single_include/nlohmann')
+ nlohmann_inc = include_directories('subprojects/nlohmann_json/single_include')
nlohmann_lib = declare_dependency(include_directories : nlohmann_inc)
endif
@@ -31,5 +31,3 @@ if build_machine.system() == 'linux'
install_data('manual/Benutzerhandbuch.pdf', install_dir : get_option('datadir') / 'kima2')
endif
-rpm = import('rpm')
-rpm.generate_spec_template()
From 77791e142c1f2fc3af0c805225f5450d65e53b3b Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 17 Oct 2019 16:03:12 +0200
Subject: [PATCH 015/134] more on build scripts
---
misc/PKGBUILD | 6 +++---
src/core/meson.build | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/misc/PKGBUILD b/misc/PKGBUILD
index af5389c..f679f03 100644
--- a/misc/PKGBUILD
+++ b/misc/PKGBUILD
@@ -1,6 +1,6 @@
# Maintainer: Martin Brodbeck
pkgname=kima2
-pkgver=1.1.0
+pkgver=1.5.0
pkgrel=1
pkgdesc="A small cash point program for children's things markets (German only)"
arch=('i686' 'x86_64')
@@ -9,7 +9,7 @@ license=('custom')
depends=('glibc' 'libusb' 'qt5-base' 'sqlite3' 'xlnt')
makedepends=('boost>=1.62')
source=($pkgname-$pkgver.tar.gz)
-md5sums=('')
+md5sums=('c0e6a64b5037675edce4ba8bc4639bd3')
build() {
if [ ! -d $pkgname/build ]; then
@@ -17,7 +17,7 @@ build() {
fi
cd $pkgname/build
- cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DKIMA2_USE_EXTERNAL_JSON=ON ..
+ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DKIMA2_USE_EXTERNAL_JSON=OFF ..
make
}
diff --git a/src/core/meson.build b/src/core/meson.build
index a2923b9..b54f484 100644
--- a/src/core/meson.build
+++ b/src/core/meson.build
@@ -1,4 +1,4 @@
-boost = dependency('boost', modules :['date_time'])
+boost = dependency('boost', modules: ['date_time'], static: true)
xlnt = dependency('xlnt')
sqlite = dependency('sqlite3')
@@ -8,6 +8,6 @@ src = ['database.cpp', 'entity.cpp', 'entityint.cpp', 'entityuuid.cpp',
core_inc = include_directories('..')
-core_lib = static_library('core', src, dependencies :[boost, xlnt, sqlite, nlohmann_lib, csv_dep])
+core_lib = static_library('core', src, dependencies: [boost, xlnt, sqlite, nlohmann_lib, csv_dep])
-core_dep = declare_dependency(link_with : core_lib, include_directories : core_inc)
+core_dep = declare_dependency(link_with: core_lib, include_directories : core_inc)
From 2d06de9907fcdbcfc860b59a987c6200f02a3b24 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Wed, 12 Feb 2020 14:04:15 +0100
Subject: [PATCH 016/134] Fix Excel import
---
src/core/excelreader.cpp | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/src/core/excelreader.cpp b/src/core/excelreader.cpp
index 7ef401d..7c6abe2 100644
--- a/src/core/excelreader.cpp
+++ b/src/core/excelreader.cpp
@@ -22,20 +22,14 @@ std::size_t ExcelReader::readSellersFromFile(const fs::path& filePath, Marketpla
market->storeToDb(true);
auto ws = wb.sheet_by_index(0);
- const int START_ROW = 5;
- const int END_ROW = 504;
-
- int rowCount{};
- for (const auto& row : ws.rows(false)) {
- if (rowCount < START_ROW) {
- ++rowCount;
+ for (auto row : ws.rows(true)) {
+ // Skip the row if the first value is not a number (= seller no)
+ if (row[0].data_type() != xlnt::cell::type::number) {
continue;
- } else if (rowCount > END_ROW) {
- break;
}
+ //Skip the row if the seller has neither a first name nor a surname
if (row[2].value().empty() && row[3].value().empty()) {
- ++rowCount;
continue;
}
auto seller = std::make_unique();
@@ -46,7 +40,6 @@ std::size_t ExcelReader::readSellersFromFile(const fs::path& filePath, Marketpla
std::string lastName = row[3].value();
seller->setLastName(trim(lastName));
market->getSellers().push_back(std::move(seller));
- rowCount++;
}
// If there was no special seller "Sonderkonto" in import data, then create one
From e41ce5a1172936c278db2bb2478bc3a5a5482983 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Wed, 12 Feb 2020 14:06:59 +0100
Subject: [PATCH 017/134] Push to version 1.5.1
---
CMakeLists.txt | 2 +-
meson.build | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 842ff8f..ef44d97 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.8)
-project(kima2 VERSION 1.5.0)
+project(kima2 VERSION 1.5.1)
set(CMAKE_MODULE_PATH "${CMAKE_HOME_DIRECTORY}/cmake")
diff --git a/meson.build b/meson.build
index 61a111b..fe4c54b 100644
--- a/meson.build
+++ b/meson.build
@@ -1,4 +1,4 @@
-project('kima2', 'cpp', default_options : ['cpp_std=c++17'], version : '1.6.0')
+project('kima2', 'cpp', default_options : ['cpp_std=c++17'], version : '1.5.1')
conf_data = configuration_data()
conf_data.set('PROJECT_VERSION', '"' + meson.project_version() + '"')
From ff9dc9b05ea8fd76fd563e82e5b07a3106462f3f Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Wed, 12 Feb 2020 16:12:40 +0100
Subject: [PATCH 018/134] Fix cpack for windows (dlls)
---
CMakeLists.txt | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ef44d97..857f4d5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -91,13 +91,14 @@ if( MINGW )
${MINGW_PATH}/Qt5Gui.dll
${MINGW_PATH}/Qt5Widgets.dll
${MINGW_PATH}/Qt5PrintSupport.dll
+ ${MINGW_PATH}/Qt5Network.dll
${MINGW_PATH}/libwinpthread-1.dll
${MINGW_PATH}/libsqlite3-0.dll
${MINGW_PATH}/libusb-1.0.dll
${MINGW_PATH}/libxlnt.dll
- ${MINGW_PATH}/libicuuc64.dll
- ${MINGW_PATH}/libicuin64.dll
- ${MINGW_PATH}/libicudt64.dll
+ ${MINGW_PATH}/libicuuc65.dll
+ ${MINGW_PATH}/libicuin65.dll
+ ${MINGW_PATH}/libicudt65.dll
${MINGW_PATH}/libpcre2-16-0.dll
${MINGW_PATH}/zlib1.dll
${MINGW_PATH}/libharfbuzz-0.dll
From 01bf3c29a28df2d6ed31e7aa2272f8763aeaf540 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Wed, 12 Feb 2020 16:13:16 +0100
Subject: [PATCH 019/134] [Windows] undefine DELETE macro if defined
---
src/core/csvreader.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/core/csvreader.cpp b/src/core/csvreader.cpp
index 7b87044..6c384f7 100644
--- a/src/core/csvreader.cpp
+++ b/src/core/csvreader.cpp
@@ -5,6 +5,10 @@
#include
+#ifdef DELETE
+#undef DELETE
+#endif
+
namespace fs = std::filesystem;
std::size_t CsvReader::readSellersFromFile(const fs::path& filePath, Marketplace* market)
From 8374175087e60d98314514bd1dab5fd741794388 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Sat, 15 Feb 2020 09:55:01 +0100
Subject: [PATCH 020/134] 2019 -> 2020
---
src/gui/mainwindow.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 6c7e814..e3c6683 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -107,7 +107,7 @@ MainWindow::MainWindow()
});
connect(ui_.licenseAction, &QAction::triggered, this, [=]() {
QString licenseText(
- "Copyright © 2018-2019 Martin Brodbeck\n\n"
+ "Copyright © 2018-2020 Martin Brodbeck\n\n"
"Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der "
"zugehörigen Dokumentationen (die \"Software\") erhält, die Erlaubnis erteilt, "
"sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, "
From 305d41f2e1bd2c538edee0f6c7363c554a72f6d2 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 17 Apr 2020 10:22:52 +0200
Subject: [PATCH 021/134] Added missing dlls to Windows deployment
---
.gitmodules | 6 +++---
CMakeLists.txt | 2 ++
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/.gitmodules b/.gitmodules
index e9cb36c..672e543 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,9 +1,9 @@
-[submodule "3rdparty/nlohmann_json"]
+[submodule "subprojects/nlohmann_json"]
path = subprojects/nlohmann_json
url = https://github.com/nlohmann/json.git
-[submodule "3rdparty/singleapplication"]
+[submodule "subprojects/singleapplication"]
path = subprojects/singleapplication/singleapplication.git
url = https://github.com/itay-grudev/SingleApplication.git
-[submodule "3rdparty/csv-parser"]
+[submodule "subprojects/csv-parser"]
path = subprojects/csv-parser
url = https://github.com/vincentlaucsb/csv-parser.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 857f4d5..7a32cbf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -109,6 +109,8 @@ if( MINGW )
${MINGW_PATH}/libbz2-1.dll
${MINGW_PATH}/libintl-8.dll
${MINGW_PATH}/libpcre-1.dll
+ ${MINGW_PATH}/libdouble-conversion.dll
+ ${MINGW_PATH}/libzstd.dll
${MINGW_PATH}/libiconv-2.dll)
install(FILES ${MINGW_PATH}/../share/qt5/plugins/platforms/qwindows.dll
${MINGW_PATH}/../share/qt5/plugins/platforms/qminimal.dll
From 26804ba03ede50ce446831da51a37b974467477a Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 28 Aug 2020 19:07:16 +0200
Subject: [PATCH 022/134] push singleapplication subproject
---
subprojects/singleapplication/singleapplication.git | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/subprojects/singleapplication/singleapplication.git b/subprojects/singleapplication/singleapplication.git
index e18babe..e93c12a 160000
--- a/subprojects/singleapplication/singleapplication.git
+++ b/subprojects/singleapplication/singleapplication.git
@@ -1 +1 @@
-Subproject commit e18babe5598d53a9e51ac9263d5b62ea2c3276e6
+Subproject commit e93c12ab69a25fcaa963416f0e348d3269263190
From a547b6f3c3a90bc4e73c3afd016d988993c9092e Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 28 Aug 2020 19:10:01 +0200
Subject: [PATCH 023/134] push csv-parser subproject
---
subprojects/csv-parser | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/subprojects/csv-parser b/subprojects/csv-parser
index e4a899d..6c91e84 160000
--- a/subprojects/csv-parser
+++ b/subprojects/csv-parser
@@ -1 +1 @@
-Subproject commit e4a899dcafcfa14e448348e9b3c8c06d7697dbf8
+Subproject commit 6c91e845320e907658fa5192f6884d1fcbbf3ad9
From 8b299bacc38f0c966577a801debc51a2c84aa7e8 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 15 Oct 2020 15:47:05 +0200
Subject: [PATCH 024/134] Set default style on Windows to "Fusion".
---
src/gui/kima2.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/gui/kima2.cpp b/src/gui/kima2.cpp
index 5ff27fb..20fb3ba 100644
--- a/src/gui/kima2.cpp
+++ b/src/gui/kima2.cpp
@@ -8,6 +8,7 @@
#include
#include
#include
+#include
#include
@@ -25,6 +26,7 @@ int main(int argc, char* argv[])
qTranslator.load("qt_" + german.name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
#endif
#ifdef _WIN32
+ QApplication::setStyle(QStyleFactory::create("Fusion"));
qTranslator.load("qt_" + german.name(),
QApplication::applicationDirPath() + QDir::separator() + "translations");
#endif
From a156c5331aff147d7c3805eb05b3f00c8264ed92 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 15 Oct 2020 16:43:00 +0200
Subject: [PATCH 025/134] Added warning message when Excel import fails.
---
src/gui/mainwindow.cpp | 67 +++++++++++++++++++++++++-----------------
1 file changed, 40 insertions(+), 27 deletions(-)
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index e3c6683..1cf383c 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -40,7 +40,7 @@ MainWindow::MainWindow()
QMessageBox(QMessageBox::Icon::Information, "Datenbankinformation",
"Es wurde eine veraltete Datenbankdatei erkannt.
Diese wurde "
"umbenannt und eine neue Datei wurde erstellt.")
- .exec();
+ .exec();
}
statusBar()->showMessage("Gespeicherte Daten wurden geladen.", STATUSBAR_TIMEOUT);
@@ -63,7 +63,7 @@ MainWindow::MainWindow()
QMessageBox(QMessageBox::Icon::Warning, "Sind Sie sicher?",
"Möchten Sie wirklich alle gespeicherten Daten verwerfen?",
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this)
- .exec();
+ .exec();
if (dlgResult == QMessageBox::No)
return;
@@ -126,7 +126,9 @@ MainWindow::MainWindow()
"SOFTWARE ODER SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN.");
QMessageBox::information(this, "Lizenzinformation", licenseText);
});
- connect(ui_.reportAction, &QAction::triggered, this, [=]() { ReportDialog(this).exec(); });
+ connect(ui_.reportAction, &QAction::triggered, this, [=]() {
+ ReportDialog(this).exec();
+ });
connect(ui_.configAction, &QAction::triggered, this, [=]() {
int result = SettingsDialog(this).exec();
if (result == QDialog::Accepted) {
@@ -298,7 +300,7 @@ void MainWindow::onGivenSpinBoxValueChanged(double value)
}
void MainWindow::onBasketViewSelectionChanged(const QItemSelection& selected,
- [[maybe_unused]] const QItemSelection& deselected)
+ [[maybe_unused]] const QItemSelection& deselected)
{
if (selected.size() > 0) {
ui_.cancelArticleButton->setEnabled(true);
@@ -308,7 +310,7 @@ void MainWindow::onBasketViewSelectionChanged(const QItemSelection& selected,
}
void MainWindow::onSalesViewSelectionChanged(const QItemSelection& selected,
- [[maybe_unused]] const QItemSelection& deselected)
+ [[maybe_unused]] const QItemSelection& deselected)
{
if (selected.size() > 0) {
ui_.cancelSaleButton->setEnabled(true);
@@ -333,7 +335,7 @@ void MainWindow::onCancelArticleButtonClicked([[maybe_unused]] bool checked)
QMessageBox(QMessageBox::Icon::Warning, "Sind Sie sicher?",
"Möchten Sie wirklich den Artikel stornieren?",
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this)
- .exec();
+ .exec();
if (dlgResult == QMessageBox::No)
return;
@@ -359,7 +361,7 @@ void MainWindow::onCancelSaleButtonClicked([[maybe_unused]] bool checked)
QMessageBox(QMessageBox::Icon::Warning, "Sind Sie sicher?",
"Möchten Sie wirklich aus abgeschlossenen Verkäufen stornieren?",
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this)
- .exec();
+ .exec();
if (dlgResult == QMessageBox::No)
return;
@@ -422,7 +424,7 @@ void MainWindow::onCancelAllArticlesButtonClicked([[maybe_unused]] bool checked)
QMessageBox(QMessageBox::Icon::Warning, "Sind Sie sicher?",
"Möchten Sie wirklich *alle* Artikel des aktuellen Einkaufs stornieren?",
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No, this)
- .exec();
+ .exec();
if (dlgResult == QMessageBox::No)
return;
@@ -432,17 +434,19 @@ void MainWindow::onCancelAllArticlesButtonClicked([[maybe_unused]] bool checked)
ui_.sellerNoEdit->setFocus();
}
-void MainWindow::onAboutQt() { QMessageBox::aboutQt(this); }
+void MainWindow::onAboutQt() {
+ QMessageBox::aboutQt(this);
+}
void MainWindow::onAbout()
{
QMessageBox::about(
this, "Über",
QString("KIMA2 - Version ") + PROJECT_VERSION +
- "
"
- "KIMA2 ist ein kleines Kassenprogramm für Kindersachenmärkte.
"
- "Copyright © Martin Brodbeck <info@rustysoft.de>
");
+ "
"
+ "KIMA2 ist ein kleines Kassenprogramm für Kindersachenmärkte.
"
+ "Copyright © Martin Brodbeck <info@rustysoft.de>
");
}
void MainWindow::onImportSellerExcelActionTriggered()
@@ -451,13 +455,13 @@ void MainWindow::onImportSellerExcelActionTriggered()
QMessageBox(QMessageBox::Icon::Information, "Import nicht möglich",
"Der Import ist nicht möglich, da schon Verkäufe getätigt wurden.",
QMessageBox::StandardButton::Ok, this)
- .exec();
+ .exec();
return;
}
auto filename = QFileDialog::getOpenFileName(
- this, "Verkäufer importieren", QString(),
- "Alle unterstützte Dateien (*.xlsx *.csv);;Excel Dateien (*.xlsx);;CSV Dateien (*.csv)");
+ this, "Verkäufer importieren", QString(),
+ "Alle unterstützte Dateien (*.xlsx *.csv);;Excel Dateien (*.xlsx);;CSV Dateien (*.csv)");
if (filename.isEmpty())
return;
@@ -470,7 +474,16 @@ void MainWindow::onImportSellerExcelActionTriggered()
std::size_t numImported{};
if (case_insensitive_match(filePath.extension().string(), std::string(".xlsx"))) {
- numImported = ExcelReader::readSellersFromFile(filePath, marketplace_.get());
+ try {
+ numImported = ExcelReader::readSellersFromFile(filePath, marketplace_.get());
+ } catch (const std::exception& e) {
+ QMessageBox(QMessageBox::Icon::Critical, "Fehler beim Importieren",
+ "Beim Import aus der Excel-Datei ist ein Fehler aufgetreten. "
+ "Sie könnten ggf. versuchen, die Daten aus einer .csv Datei zu imporieren.",
+ QMessageBox::StandardButton::Ok, this).exec();
+ std::cerr << e.what() << std::endl;
+ return;
+ }
} else {
numImported = CsvReader::readSellersFromFile(filePath, marketplace_.get());
}
@@ -483,7 +496,7 @@ void MainWindow::onImportSellerExcelActionTriggered()
<< " Verkäufer importiert.";
QMessageBox(QMessageBox::Icon::Information, "Verkäufer erfolgreich importiert",
msg.str().c_str(), QMessageBox::StandardButton::Ok, this)
- .exec();
+ .exec();
}
void MainWindow::onImportSellerJsonActionTriggered()
@@ -492,12 +505,12 @@ void MainWindow::onImportSellerJsonActionTriggered()
QMessageBox(QMessageBox::Icon::Information, "Import nicht möglich",
"Der Import ist nicht möglich, da schon Verkäufe getätigt wurden.",
QMessageBox::StandardButton::Ok, this)
- .exec();
+ .exec();
return;
}
auto filename = QFileDialog::getOpenFileName(this, "Verkäufer importieren", QString(),
- "JSON Dateien (*.json)");
+ "JSON Dateien (*.json)");
if (filename.isEmpty())
return;
@@ -519,13 +532,13 @@ void MainWindow::onImportSellerJsonActionTriggered()
<< " Verkäufer importiert.";
QMessageBox(QMessageBox::Icon::Information, "Verkäufer erfolgreich importiert",
msg.str().c_str(), QMessageBox::StandardButton::Ok, this)
- .exec();
+ .exec();
}
void MainWindow::onExportSellerJsonActionTriggered()
{
auto filename = QFileDialog::getSaveFileName(
- this, "Verkäufer exportieren", QString("kima2_verkaeufer.json"), "JSON Dateien (*.json)");
+ this, "Verkäufer exportieren", QString("kima2_verkaeufer.json"), "JSON Dateien (*.json)");
if (filename.isEmpty())
return;
@@ -544,9 +557,9 @@ void MainWindow::onExportSalesJsonActionTriggered()
QSettings settings;
auto filename = QFileDialog::getSaveFileName(
- this, "Umsätze/Transaktionen exportieren",
- QString("kima2_umsaetze_kasse") + settings.value("global/cashPointNo").toString() + ".json",
- "JSON Dateien (*.json)");
+ this, "Umsätze/Transaktionen exportieren",
+ QString("kima2_umsaetze_kasse") + settings.value("global/cashPointNo").toString() + ".json",
+ "JSON Dateien (*.json)");
if (filename.isEmpty())
return;
@@ -566,7 +579,7 @@ void MainWindow::onImportSalesJsonActionTriggered()
QSettings settings;
auto filename = QFileDialog::getOpenFileName(this, "Umsätze/Transaktionen importieren",
- QString(), "JSON Dateien (*.json)");
+ QString(), "JSON Dateien (*.json)");
if (filename.isEmpty())
return;
@@ -584,7 +597,7 @@ void MainWindow::onImportSalesJsonActionTriggered()
} catch (std::runtime_error& err) {
QMessageBox(QMessageBox::Icon::Warning, "Import nicht möglich", err.what(), QMessageBox::Ok,
this)
- .exec();
+ .exec();
}
setSaleModel();
updateStatLabel();
From b9f09fcd4c747b981fef11a438241fca749d3ec3 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Thu, 15 Oct 2020 16:50:37 +0200
Subject: [PATCH 026/134] ...
---
subprojects/nlohmann_json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/subprojects/nlohmann_json b/subprojects/nlohmann_json
index 53c3eef..db78ac1 160000
--- a/subprojects/nlohmann_json
+++ b/subprojects/nlohmann_json
@@ -1 +1 @@
-Subproject commit 53c3eefa2cf790a7130fed3e13a3be35c2f2ace2
+Subproject commit db78ac1d7716f56fc9f1b030b715f872f93964e4
From c65e7be4150e9378dd490af423d79a4ee56f4390 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Mon, 19 Oct 2020 07:50:30 +0200
Subject: [PATCH 027/134] new version 1.5.2
---
CMakeLists.txt | 2 +-
meson.build | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7a32cbf..6ef7fda 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.8)
-project(kima2 VERSION 1.5.1)
+project(kima2 VERSION 1.5.2)
set(CMAKE_MODULE_PATH "${CMAKE_HOME_DIRECTORY}/cmake")
diff --git a/meson.build b/meson.build
index fe4c54b..962b66b 100644
--- a/meson.build
+++ b/meson.build
@@ -1,4 +1,4 @@
-project('kima2', 'cpp', default_options : ['cpp_std=c++17'], version : '1.5.1')
+project('kima2', 'cpp', default_options : ['cpp_std=c++17'], version : '1.5.2')
conf_data = configuration_data()
conf_data.set('PROJECT_VERSION', '"' + meson.project_version() + '"')
From 8ef821dcc0cd115cef8e505ba646e05bed79cc5e Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 17 Sep 2021 21:13:21 +0200
Subject: [PATCH 028/134] singleapplication updated
---
subprojects/singleapplication/singleapplication.git | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/subprojects/singleapplication/singleapplication.git b/subprojects/singleapplication/singleapplication.git
index e93c12a..bdbb09b 160000
--- a/subprojects/singleapplication/singleapplication.git
+++ b/subprojects/singleapplication/singleapplication.git
@@ -1 +1 @@
-Subproject commit e93c12ab69a25fcaa963416f0e348d3269263190
+Subproject commit bdbb09b5f21ebea4cd7dfb43b29114a94e04a3a1
From e48fbe82e0f6c0e243ef7419b62953f362d762aa Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Fri, 17 Sep 2021 21:16:08 +0200
Subject: [PATCH 029/134] csv-parser updated
---
subprojects/csv-parser | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/subprojects/csv-parser b/subprojects/csv-parser
index 6c91e84..ea547fd 160000
--- a/subprojects/csv-parser
+++ b/subprojects/csv-parser
@@ -1 +1 @@
-Subproject commit 6c91e845320e907658fa5192f6884d1fcbbf3ad9
+Subproject commit ea547fdb16c7baf99bd9ced5febba52cc5da3ca3
From 92ecc92bf79a2e403fa972dd606795871987ee66 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Sun, 19 Sep 2021 19:52:32 +0200
Subject: [PATCH 030/134] Fix umlaut-crash on linux machines
---
src/gui/reportdialog.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/gui/reportdialog.cpp b/src/gui/reportdialog.cpp
index 84971ec..02717aa 100644
--- a/src/gui/reportdialog.cpp
+++ b/src/gui/reportdialog.cpp
@@ -48,7 +48,11 @@ void ReportDialog::onExportCsvButtonClicked()
if (filename.isEmpty())
return;
+#if defined(_WIN64) || defined(_WIN32)
fs::path filePath(filename.toStdWString());
+#else
+ fs::path filePath(filename.toStdString());
+#endif
market_->exportReportToCSV(filePath, feeInPercent, maxFeeInEuro);
}
From 072af76de197ac673c1c7fa0d584e4f1ca90a0aa Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Sun, 19 Sep 2021 19:53:20 +0200
Subject: [PATCH 031/134] ...
---
subprojects/csv-parser | 2 +-
subprojects/singleapplication/singleapplication.git | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/subprojects/csv-parser b/subprojects/csv-parser
index ea547fd..6c91e84 160000
--- a/subprojects/csv-parser
+++ b/subprojects/csv-parser
@@ -1 +1 @@
-Subproject commit ea547fdb16c7baf99bd9ced5febba52cc5da3ca3
+Subproject commit 6c91e845320e907658fa5192f6884d1fcbbf3ad9
diff --git a/subprojects/singleapplication/singleapplication.git b/subprojects/singleapplication/singleapplication.git
index bdbb09b..e93c12a 160000
--- a/subprojects/singleapplication/singleapplication.git
+++ b/subprojects/singleapplication/singleapplication.git
@@ -1 +1 @@
-Subproject commit bdbb09b5f21ebea4cd7dfb43b29114a94e04a3a1
+Subproject commit e93c12ab69a25fcaa963416f0e348d3269263190
From b8b5d8b1407e21aee717b2a5c9d9c7ea30e824ae Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Sun, 19 Sep 2021 19:58:49 +0200
Subject: [PATCH 032/134] =?UTF-8?q?2021=20=E2=86=92=202021?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/gui/mainwindow.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 1cf383c..0d727b8 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -107,7 +107,7 @@ MainWindow::MainWindow()
});
connect(ui_.licenseAction, &QAction::triggered, this, [=]() {
QString licenseText(
- "Copyright © 2018-2020 Martin Brodbeck\n\n"
+ "Copyright © 2018-2021 Martin Brodbeck\n\n"
"Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der "
"zugehörigen Dokumentationen (die \"Software\") erhält, die Erlaubnis erteilt, "
"sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, "
From edf9cb1a2c3f7614c443ba69a45e6fd8910258e7 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Sun, 19 Sep 2021 19:59:51 +0200
Subject: [PATCH 033/134] =?UTF-8?q?Revert=20"2020=20=E2=86=92=202021"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit b8b5d8b1407e21aee717b2a5c9d9c7ea30e824ae.
---
src/gui/mainwindow.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 0d727b8..1cf383c 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -107,7 +107,7 @@ MainWindow::MainWindow()
});
connect(ui_.licenseAction, &QAction::triggered, this, [=]() {
QString licenseText(
- "Copyright © 2018-2021 Martin Brodbeck\n\n"
+ "Copyright © 2018-2020 Martin Brodbeck\n\n"
"Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der "
"zugehörigen Dokumentationen (die \"Software\") erhält, die Erlaubnis erteilt, "
"sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, "
From 059ae5ca664514c5a9b2a5c3381a0a9ea98e031e Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Mon, 20 Sep 2021 07:39:37 +0200
Subject: [PATCH 034/134] =?UTF-8?q?2020=20=E2=86=92=202021?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
LICENSE | 2 +-
src/gui/mainwindow.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/LICENSE b/LICENSE
index 082cdac..c8865df 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright © 2018 Martin Brodbeck
+Copyright © 2018-2021 Martin Brodbeck
Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der
zugehörigen Dokumentationen (die "Software") erhält, die Erlaubnis erteilt,
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index 1cf383c..0d727b8 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -107,7 +107,7 @@ MainWindow::MainWindow()
});
connect(ui_.licenseAction, &QAction::triggered, this, [=]() {
QString licenseText(
- "Copyright © 2018-2020 Martin Brodbeck\n\n"
+ "Copyright © 2018-2021 Martin Brodbeck\n\n"
"Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der "
"zugehörigen Dokumentationen (die \"Software\") erhält, die Erlaubnis erteilt, "
"sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, "
From 83b6cd1d26d9622c38a8049785becb3521be279f Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Mon, 20 Sep 2021 07:40:05 +0200
Subject: [PATCH 035/134] =?UTF-8?q?=E2=80=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
subprojects/csv-parser | 2 +-
subprojects/nlohmann_json | 2 +-
subprojects/singleapplication/singleapplication.git | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/subprojects/csv-parser b/subprojects/csv-parser
index 6c91e84..e4a899d 160000
--- a/subprojects/csv-parser
+++ b/subprojects/csv-parser
@@ -1 +1 @@
-Subproject commit 6c91e845320e907658fa5192f6884d1fcbbf3ad9
+Subproject commit e4a899dcafcfa14e448348e9b3c8c06d7697dbf8
diff --git a/subprojects/nlohmann_json b/subprojects/nlohmann_json
index db78ac1..53c3eef 160000
--- a/subprojects/nlohmann_json
+++ b/subprojects/nlohmann_json
@@ -1 +1 @@
-Subproject commit db78ac1d7716f56fc9f1b030b715f872f93964e4
+Subproject commit 53c3eefa2cf790a7130fed3e13a3be35c2f2ace2
diff --git a/subprojects/singleapplication/singleapplication.git b/subprojects/singleapplication/singleapplication.git
index e93c12a..e18babe 160000
--- a/subprojects/singleapplication/singleapplication.git
+++ b/subprojects/singleapplication/singleapplication.git
@@ -1 +1 @@
-Subproject commit e93c12ab69a25fcaa963416f0e348d3269263190
+Subproject commit e18babe5598d53a9e51ac9263d5b62ea2c3276e6
From 8feb122c114f732c2cc36156ae30b87d536befd9 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Mon, 20 Sep 2021 07:44:22 +0200
Subject: [PATCH 036/134] subprojects updated
---
subprojects/csv-parser | 2 +-
subprojects/singleapplication/singleapplication.git | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/subprojects/csv-parser b/subprojects/csv-parser
index e4a899d..ea547fd 160000
--- a/subprojects/csv-parser
+++ b/subprojects/csv-parser
@@ -1 +1 @@
-Subproject commit e4a899dcafcfa14e448348e9b3c8c06d7697dbf8
+Subproject commit ea547fdb16c7baf99bd9ced5febba52cc5da3ca3
diff --git a/subprojects/singleapplication/singleapplication.git b/subprojects/singleapplication/singleapplication.git
index e18babe..3d152b0 160000
--- a/subprojects/singleapplication/singleapplication.git
+++ b/subprojects/singleapplication/singleapplication.git
@@ -1 +1 @@
-Subproject commit e18babe5598d53a9e51ac9263d5b62ea2c3276e6
+Subproject commit 3d152b03d872b99d7f36e8463ac253e41194a17a
From 329c3a1540f20b6d15591868e9ee50638c396478 Mon Sep 17 00:00:00 2001
From: Martin Brodbeck
Date: Mon, 20 Sep 2021 08:04:39 +0200
Subject: [PATCH 037/134] Manual updated
---
manual/Benutzerhandbuch.odt | Bin 275425 -> 278856 bytes
manual/Benutzerhandbuch.pdf | Bin 415674 -> 413646 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/manual/Benutzerhandbuch.odt b/manual/Benutzerhandbuch.odt
index cb1354edbea5a8caa8262f214859d007b72d03a0..eefacccbb41fbb1c973662ed17c0136783673191 100644
GIT binary patch
delta 32443
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