diff --git a/.clang-format b/.clang-format index 548068d..b8140ac 100644 --- a/.clang-format +++ b/.clang-format @@ -31,11 +31,11 @@ BinPackArguments: true BinPackParameters: true BraceWrapping: AfterCaseLabel: false - AfterClass: false + AfterClass: true AfterControlStatement: Never AfterEnum: false - AfterFunction: false - AfterNamespace: false + AfterFunction: true + AfterNamespace: true AfterObjCDeclaration: false AfterStruct: false AfterUnion: false @@ -51,10 +51,6 @@ BraceWrapping: BreakBeforeBinaryOperators: None BreakBeforeConceptDeclarations: true BreakBeforeBraces: Custom -BraceWrapping: - AfterClass: true - AfterFunction: true - AfterNamespace: true BreakBeforeInheritanceComma: false BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: true diff --git a/.gitmodules b/.gitmodules index 934c21f..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +0,0 @@ -[submodule "subprojects/nlohmann_json"] - path = subprojects/nlohmann_json - url = https://github.com/nlohmann/json.git -[submodule "subprojects/singleapplication"] - path = subprojects/singleapplication/singleapplication.git - url = https://github.com/itay-grudev/SingleApplication.git \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index c97b843..86b072a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,14 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.30) -project(kima2 VERSION 1.9.0) +project(kima2 VERSION 1.9.2) set(CMAKE_MODULE_PATH "${CMAKE_HOME_DIRECTORY}/cmake") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -#include(InstallRequiredSystemLibraries) +# For SingleApplication and nlohmann_json +include(FetchContent) if(MSVC) add_compile_options(/W4 /WX) @@ -29,7 +30,6 @@ if(KIMA2_USE_EXTERNAL_JSON) find_package(nlohmann_json REQUIRED) endif() -add_subdirectory(subprojects) add_subdirectory(src) #if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE MATCHES Debug) diff --git a/LICENSE b/LICENSE index 8317a22..0b127da 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright © 2018-2024 Martin Brodbeck +Copyright © 2018-2025 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/meson.build b/meson.build deleted file mode 100644 index 0f06586..0000000 --- a/meson.build +++ /dev/null @@ -1,33 +0,0 @@ -project('kima2', 'cpp', default_options : ['cpp_std=c++20'], version : '1.8.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('.') - -#csv = cmake.subproject('csv-parser') -#csv_lib = csv.dependency('csv') - -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_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') - -subdir('src') - -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 - diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 402c687..681cf5c 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -3,11 +3,12 @@ set(Boost_USE_STATIC_LIBS ON) find_package(Boost 1.78 REQUIRED) find_package(SQLite3 REQUIRED) -# Because csv-parser needs threads: +FetchContent_Declare(json URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz) +FetchContent_MakeAvailable(json) -find_package(fmt) +add_library(core STATIC) -set(CORE_SOURCES +target_sources(core PRIVATE database.cpp entity.cpp entityint.cpp @@ -21,9 +22,6 @@ set(CORE_SOURCES utils.cpp ) - -add_library(core STATIC ${CORE_SOURCES}) -#target_include_directories(core PRIVATE ${PROJECT_SOURCE_DIR}/subprojects/csv-parser/single_include) if (WIN32) target_link_libraries(core PRIVATE sqlite3 nlohmann_json::nlohmann_json) target_link_libraries(core PRIVATE bcrypt) diff --git a/src/core/meson.build b/src/core/meson.build deleted file mode 100644 index b54f484..0000000 --- a/src/core/meson.build +++ /dev/null @@ -1,13 +0,0 @@ -boost = dependency('boost', modules: ['date_time'], static: true) -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_inc = include_directories('..') - -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/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 8fa22e8..edd2102 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -9,40 +9,43 @@ set(CMAKE_AUTORCC ON) # Find the QtWidgets library find_package(Qt6 COMPONENTS Widgets Network PrintSupport CONFIG REQUIRED) -#find_package(Qt5Widgets CONFIG REQUIRED) -#find_package(Qt5PrintSupport CONFIG REQUIRED) # For SingleApplication: -#find_package(Qt5Network CONFIG REQUIRED) -set(QAPPLICATION_CLASS QApplication) +set(QT_DEFAULT_MAJOR_VERSION 6 CACHE STRING "Qt version to use, defaults to 6") +set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication") +FetchContent_Declare( + SingleApplication + GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication + GIT_TAG v3.5.2 +) +FetchContent_MakeAvailable(SingleApplication) add_compile_definitions(QAPPLICATION_CLASS=${QAPPLICATION_CLASS}) -set(GUI_SOURCES - kima2.cpp - mainwindow.cpp - mainwindow.ui - sellerdialog.cpp - sellerdialog.ui - sellermodel.cpp - pricedialog.cpp - pricedialog.ui - basketmodel.cpp - salemodel.cpp - reportdialog.cpp - reportdialog.ui - reportmodel.cpp - settingsdialog.cpp - settingsdialog.ui - ../../kima2.qrc - ${PROJECT_SOURCE_DIR}/subprojects/singleapplication/singleapplication.git/singleapplication.cpp - ${PROJECT_SOURCE_DIR}/subprojects/singleapplication/singleapplication.git/singleapplication_p.cpp +add_executable(kima2) + +target_sources(kima2 PRIVATE + kima2.cpp + mainwindow.cpp + mainwindow.ui + sellerdialog.cpp + sellerdialog.ui + sellermodel.cpp + pricedialog.cpp + pricedialog.ui + basketmodel.cpp + salemodel.cpp + reportdialog.cpp + reportdialog.ui + reportmodel.cpp + settingsdialog.cpp + settingsdialog.ui + ../../kima2.qrc + kima2.rc ) -add_executable(kima2 ${GUI_SOURCES} kima2.rc) target_include_directories(kima2 PRIVATE ${PROJECT_BINARY_DIR}) -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) -target_link_libraries(kima2 core printer Qt::Core Qt::PrintSupport Qt::Network) + +target_link_libraries(kima2 core printer Qt::Core Qt::PrintSupport Qt::Network SingleApplication::SingleApplication) if(WIN32) set_target_properties(kima2 PROPERTIES LINK_FLAGS "-mwindows") diff --git a/src/gui/kima2.cpp b/src/gui/kima2.cpp index b71fdfd..d2826bd 100644 --- a/src/gui/kima2.cpp +++ b/src/gui/kima2.cpp @@ -13,6 +13,8 @@ #include #include +using namespace Qt::Literals::StringLiterals; + int main(int argc, char *argv[]) { SingleApplication kimaApp(argc, argv, false, SingleApplication::Mode::User | SingleApplication::ExcludeAppPath | SingleApplication::ExcludeAppVersion); @@ -23,7 +25,7 @@ int main(int argc, char *argv[]) QTranslator qtTranslator; - if (qtTranslator.load(QLocale::system(), u"qtbase"_qs, u"_"_qs, + if (qtTranslator.load(QLocale::system(), u"qtbase"_s, u"_"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath))) { kimaApp.installTranslator(&qtTranslator); } diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 6ffa13e..ca9031e 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -105,7 +105,7 @@ MainWindow::MainWindow() }); connect(m_ui.licenseAction, &QAction::triggered, this, [this]() { QString licenseText( - "Copyright © 2018-2024 Martin Brodbeck\n\n" + "Copyright © 2018-2025 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, " diff --git a/src/gui/meson.build b/src/gui/meson.build deleted file mode 100644 index 18bfcee..0000000 --- a/src/gui/meson.build +++ /dev/null @@ -1,23 +0,0 @@ -qt5 = import('qt5') -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', - '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', - 'sellermodel.h', 'salemodel.h'], - ui_files : ui, - 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], - install : true) diff --git a/src/gui/reportdialog.cpp b/src/gui/reportdialog.cpp index 6edc590..2c13baf 100644 --- a/src/gui/reportdialog.cpp +++ b/src/gui/reportdialog.cpp @@ -201,6 +201,7 @@ void ReportDialog::onPrintSellerReceiptButtonClicked() return; auto indexes = selModel->selectedRows(); + std::ranges::sort(indexes); auto printerDevice = convertToPosPrinterDevice(posPrinterDevice.toStdString(), posPrinterEndpoint.toStdString()); diff --git a/src/gui/reportdialog.ui b/src/gui/reportdialog.ui index f70be52..5ac21c8 100644 --- a/src/gui/reportdialog.ui +++ b/src/gui/reportdialog.ui @@ -19,7 +19,7 @@ - QAbstractItemView::MultiSelection + QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows diff --git a/src/meson.build b/src/meson.build deleted file mode 100644 index 439c81e..0000000 --- a/src/meson.build +++ /dev/null @@ -1,3 +0,0 @@ -subdir('core') -subdir('printer') -subdir('gui') diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt index 18c480b..6205d41 100644 --- a/src/printer/CMakeLists.txt +++ b/src/printer/CMakeLists.txt @@ -9,12 +9,12 @@ else() pkg_check_modules(LibUSB REQUIRED libusb-1.0) endif() -set(PRINTER_SOURCES - posprinter.cpp - utils.cpp +add_library(printer STATIC) +target_sources(printer PRIVATE + posprinter.cpp + utils.cpp ) -add_library(printer STATIC ${PRINTER_SOURCES}) if(WIN32) target_link_libraries(printer core ${LIBUSB_1_LIBRARIES}) else() diff --git a/src/printer/meson.build b/src/printer/meson.build deleted file mode 100644 index 64f0602..0000000 --- a/src/printer/meson.build +++ /dev/null @@ -1,9 +0,0 @@ -libusb = dependency('libusb-1.0') - -src = ['posprinter.cpp', 'utils.cpp'] - -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) diff --git a/src/printer/posprinter.cpp b/src/printer/posprinter.cpp index 8a06f63..61926fc 100644 --- a/src/printer/posprinter.cpp +++ b/src/printer/posprinter.cpp @@ -19,6 +19,8 @@ const std::string PosPrinter::Command::RIGHT_ALIGN = {0x1b, 0x61, 0x02}; const std::string PosPrinter::Command::FONT_SIZE_BIG = {0x1b, 0x21, 0x10}; const std::string PosPrinter::Command::FONT_SIZE_NORMAL = {0x1b, 0x21, 0x00}; const std::string PosPrinter::Command::FEED = {0x1b, 0x64, 0x03}; +const std::string PosPrinter::Command::PARTIAL_CUT = {0x1b, 0x69}; +const std::string PosPrinter::Command::FULL_CUT = {0x1b, 0x6d}; PosPrinter::PosPrinter() : PosPrinter(PrinterDevice()) {} diff --git a/src/printer/posprinter.h b/src/printer/posprinter.h index 4ddd083..1cdbff6 100644 --- a/src/printer/posprinter.h +++ b/src/printer/posprinter.h @@ -49,6 +49,8 @@ class PosPrinter static const std::string FONT_SIZE_BIG; static const std::string FONT_SIZE_NORMAL; static const std::string FEED; + static const std::string PARTIAL_CUT; + static const std::string FULL_CUT; }; private: diff --git a/subprojects/CMakeLists.txt b/subprojects/CMakeLists.txt deleted file mode 100644 index 6ef42eb..0000000 --- a/subprojects/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -if(NOT KIMA2_USE_EXTERNAL_JSON) - set(JSON_BuildTests OFF CACHE INTERNAL "") - add_subdirectory(nlohmann_json EXCLUDE_FROM_ALL) -endif() -#add_subdirectory(csv-parser) diff --git a/subprojects/nlohmann_json b/subprojects/nlohmann_json deleted file mode 160000 index 9cca280..0000000 --- a/subprojects/nlohmann_json +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9cca280a4d0ccf0c08f47a99aa71d1b0e52f8d03 diff --git a/subprojects/singleapplication/meson.build b/subprojects/singleapplication/meson.build deleted file mode 100644 index 1b43463..0000000 --- a/subprojects/singleapplication/meson.build +++ /dev/null @@ -1,27 +0,0 @@ -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/subprojects/singleapplication/singleapplication.git b/subprojects/singleapplication/singleapplication.git deleted file mode 160000 index 8c48163..0000000 --- a/subprojects/singleapplication/singleapplication.git +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8c48163c4d3fbba603cfe8a5b94046c9dad71825