Compare commits

...

406 Commits
v1.2.1 ... main

Author SHA1 Message Date
b916d4feef
Merge pull request #54 from QuasarApp/sys_install
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
Sys install
2025-04-27 12:26:00 +02:00
d516530f5c
Apply suggestions from code review
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
Signed-off-by: Andrei Yankovich <EndrIIMail@gmail.com>
2025-04-27 13:25:16 +03:00
33b3112d58 update version 2025-04-27 12:18:01 +02:00
76c3d7a8b9 Merge branch 'main' into sys_install 2025-04-27 12:14:39 +02:00
f51b78c8d9 add install target for cmake build scripts
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
2025-04-27 12:13:30 +02:00
6e494a13f1
Merge pull request #53 from QuasarApp/production_game
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
added constexper crc 32 hash fucntion
2025-03-16 19:30:53 +01:00
703fff317c added constexper crc 32 hash fucntion
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
2025-03-15 00:21:51 +01:00
4eb85b8cbb
Merge pull request #52 from QuasarApp/loggerPath
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
added getter of log file path
2025-02-19 13:55:10 +01:00
0ce9053539 added getter of log file path 2025-02-19 13:53:52 +01:00
5d020006bb
Merge pull request #51 from QuasarApp/production_game
the "Productions" game fixes
2025-02-19 13:34:40 +01:00
7e84073393 ixes of the loger and settings classes
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
2025-02-18 14:12:54 +01:00
9c6c6d257c uppdate docs 2025-02-17 14:13:47 +01:00
1e61c3578b
Merge pull request #50 from QuasarApp/fix_log_initialisation
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
fix log initialisation
2025-02-07 15:44:40 +01:00
ebdd860531 fix logs 2025-02-07 15:41:00 +01:00
37a1f76ba1
Merge pull request #49 from QuasarApp/fix_log_handler
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
Fix log handler
2025-02-07 12:14:38 +01:00
961e6608d9 update docs 2025-02-07 12:13:03 +01:00
86c9036f13 fix standart path location 2025-02-07 12:11:26 +01:00
6b8bb9f2cd update docs 2025-02-07 12:00:00 +01:00
945da5be9d fix logger 2025-02-07 11:56:30 +01:00
8b710eaa67
Merge pull request #48 from QuasarApp/update_cmake
Some checks failed
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
update cmake
2025-01-22 19:20:20 +01:00
580a4ce1bd update cmake 2025-01-22 19:16:48 +01:00
5302846051
Merge pull request #47 from QuasarApp/update_copyright
Some checks failed
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
update copyright to 2025
2024-12-30 22:40:57 +01:00
7f24b57b41 update copyright to 2025 2024-12-30 22:39:49 +01:00
88414ce06f
Merge pull request #46 from Snegovoy98/fix_macos_apppath
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
Fix for MacOS application path params
2024-08-02 15:34:10 +03:00
Alex
d61ef581ce There was added check os type for header include
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
2024-08-02 15:06:04 +03:00
Alex
5218f2094c There were change logic for get applicationPath 2024-08-02 12:37:38 +03:00
Alex
06b71bd9aa There was fixed merge conflict 2024-08-01 12:33:03 +03:00
Alex
f06e675631 There was fixed macos apppath fro params 2024-08-01 07:05:11 +03:00
65a467054a
Merge pull request #45 from QuasarApp/qt_logger
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
update readme
2024-06-24 13:35:34 +02:00
ccd47b8be3 update readme 2024-06-24 13:35:09 +02:00
e59bc728b3
Merge pull request #44 from QuasarApp/qt_logger
remove deprecated macrosses
2024-06-24 13:34:28 +02:00
97260fea2d remove deprecated macrosses 2024-06-24 13:33:53 +02:00
a21c8d38ed
Merge pull request #43 from QuasarApp/qt_logger
move to qt logger system
2024-06-24 13:30:20 +02:00
f82a69db36 update docs 2024-06-24 13:27:03 +02:00
ee0f7fb2ee move to qt logger system 2024-06-24 13:23:40 +02:00
ad939ab45e update cmake
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2024-03-19 18:12:21 +01:00
f3fabf4f64 update qasecretservice handler functions
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
2024-02-05 15:40:00 +01:00
78ceff0f09 fix ios build
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/IOSCMakeBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2024-01-21 18:33:48 +01:00
53c73c2913 update getSecret methods
Some checks failed
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
2024-01-21 17:12:36 +01:00
c17c20e51f update get functionsx 2024-01-21 17:03:46 +01:00
08c27ec560 added qasecret support 2024-01-21 16:44:23 +01:00
10d0361ae1
Merge pull request #42 from QuasarApp/platformutils
added support snap platform
2024-01-21 11:03:51 +01:00
b7b0f330c6 try to fix ios build 2024-01-21 10:58:07 +01:00
ad27b38b10 fix build on android and ios 2024-01-21 10:47:50 +01:00
00b80d9454 added support snap platform 2024-01-21 10:42:50 +01:00
0551a56944 update cmake
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/IOSCMakeBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2024-01-20 20:34:06 +01:00
0e8a402e9a
Merge pull request #41 from QuasarApp/new_year2024
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
update copyright
2023-12-31 10:08:36 +01:00
8b5fce889f update cmake 2023-12-31 09:35:19 +01:00
37fe8a069b update copyright 2023-12-31 09:23:23 +01:00
5ab1c66525 update cmake
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
2023-11-05 17:33:36 +01:00
3b797f9a78 added new option for desable logs 2023-11-05 11:24:09 +01:00
334e209ff4 fix qt 6.6 warnings
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/IOSCMakeBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2023-10-28 21:31:17 +02:00
4d445ef7fc
Merge pull request #40 from QuasarApp/customtranslations
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
added tr method for custom translations
2023-10-01 12:49:02 +03:00
90a4284c56 added tr method for custom translations 2023-10-01 11:27:35 +02:00
a23bbe9268 increment version
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
2023-08-16 13:35:53 +02:00
d4a3e7dff2 fix qaservice (autoInstance method) 2023-08-16 13:34:40 +02:00
53a67709ff update cmake
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/IOSCMakeBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2023-07-21 20:01:03 +02:00
fb8c76feb6 update cmake 2023-06-12 12:47:07 +02:00
62c9d4e7c2 update cmake 2023-06-09 17:49:12 +02:00
c427dd9349 fix load sub languages 2023-04-15 21:35:09 +02:00
21b07bfdb0 update cmake 2023-04-15 14:41:34 +02:00
b3d577165d update cmake 2023-04-15 13:54:10 +02:00
d2c1e7819c fix xcode cccache 2023-04-15 13:48:14 +02:00
cb9dc9d3d2 update cmake 2023-04-15 13:23:28 +02:00
11588289c0 update cmake 2023-04-15 12:25:24 +02:00
f3519b341a try fix android behavior 2023-04-07 15:01:10 +02:00
c462f44e6b try fix services on android 2023-04-07 13:52:17 +02:00
d7b9ccef40 try create universaly service class 2023-04-06 21:44:47 +02:00
c29c9edc52 fix work service class on the android and windows apps for the shared applications 2023-04-06 14:48:23 +02:00
7737b28258 fix work with languages 2023-04-01 12:59:51 +02:00
7b4c10be77 fix random generator
All checks were successful
buildbot/WindowsCMakeBuilder Build finished.
2023-02-24 20:53:06 +01:00
9fcdeb42dd update cmake
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-12-31 11:25:02 +03:00
38e609e128 fix documentation style
All checks were successful
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
2022-12-28 00:50:03 +03:00
07943dfc37 update copyright 2022-12-28 00:45:09 +03:00
edd7176e56 remove ruddiments 2022-12-28 00:43:01 +03:00
00c013beac fix work with translations. Now selection not load empty qm files
All checks were successful
buildbot/DocsGenerator Build finished.
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/LinuxCMakeBuilder Build finished.
buildbot/AndroidBuilder_v8 Build finished.
buildbot/AndroidBuilder_v7 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
2022-12-25 20:38:08 +03:00
f06e1e290a change behavior of the log 2022-12-23 22:32:11 +03:00
afb0ef5fd8 Merge branch 'main' of github.com:QuasarApp/QuasarAppLib 2022-11-05 15:16:17 +03:00
f1067da2d7 fix warning message of deprecated options 2022-11-05 15:15:57 +03:00
c492fa2fe8 added build shared libs option 2022-11-03 22:56:21 +03:00
5616b7e6fd fix hro interface 2022-10-31 22:30:14 +03:00
a50d7a0348 fix output 2022-10-31 21:55:11 +03:00
7ff9620735 update cmake 2022-10-22 23:03:13 +03:00
744ec83b7d update cmake 2022-10-22 20:15:59 +03:00
cac23de957 update cmake submodule
Some checks failed
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2022-10-18 17:46:28 +03:00
3b54cebae8 update cmake 2022-10-16 20:47:30 +03:00
8da7dd8759 fix build (cmake) 2022-10-16 20:21:10 +03:00
7d2331b666 update cmake 2022-10-16 20:18:17 +03:00
668aa59436 udpate cmake 2022-10-16 12:28:26 +03:00
a825977705 update cmake submodule 2022-10-15 21:30:15 +03:00
1f708e971a update cmake 2022-10-13 20:43:45 +03:00
80eb3fcca8 fix log output of the windows buildbot system g
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-08-28 19:21:19 +03:00
ff2a2dbed0 fix service
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-08-21 22:25:59 +03:00
dcb12781be update cmake 2022-08-15 21:51:17 +03:00
bc08092e1a update cmake 2022-08-14 02:23:29 +03:00
5bf7366b6d update cmake 2022-08-13 21:36:54 +03:00
00cdfae297 update dependecies 2022-08-13 20:34:30 +03:00
6f8308db6d added auto initialize method for the service class
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-08-08 00:45:25 +03:00
ee6df818d0 added the new validableobject interface 2022-08-06 22:01:02 +03:00
246ea80b36
Update qaglobalutils.cpp 2022-07-26 13:09:04 +03:00
81316a23d3
Update qaglobalutils.cpp 2022-07-26 13:07:39 +03:00
2d2e1a9a5f added new interface for working with human readably strings 2022-07-24 13:44:52 +03:00
2559e3d560 fix service method names 2022-07-23 22:28:39 +03:00
8e61cf5551 added base service class 2022-07-23 21:23:19 +03:00
f5ca59a2e9 fix windows build 2022-07-06 11:52:52 +03:00
79d2a8ccb3 fix load languags
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
buildbot/WindowsBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2022-07-06 01:17:30 +03:00
3cf69bb5a3 addded more features to the settings model
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-06-24 23:54:04 +03:00
093ea662ee fix settings (stil has a bug with boolean variables )
All checks were successful
buildbot/WindowsCMakeBuilder Build finished.
buildbot/WindowsBuilder Build finished.
2022-06-24 17:36:22 +03:00
ea4f1cda31 fix default settings implementation
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-06-24 00:29:23 +03:00
99473b2167 update quasarapp library (added reset to default method into settings class ) 2022-06-22 19:12:11 +03:00
96043e36e6 regExp
All checks were successful
buildbot/WindowsCMakeBuilder Build finished.
2022-06-21 19:31:01 +03:00
85185d2430 Revert "added the template service class"
This reverts commit 803870ea08adcea3a94e57e64a496447c05d55e0.
2022-06-21 19:14:59 +03:00
aa4e7971bb fix build with qt6 2022-06-21 18:25:37 +03:00
fcf2f50f2f fix debug assert macro o 2022-06-21 18:13:48 +03:00
97cbfebebf Merge branch 'main' of github.com:QuasarApp/QuasarAppLib 2022-06-20 18:01:46 +03:00
803870ea08 added the template service class 2022-06-20 18:01:06 +03:00
a4e3768dfb added force reloade function into settings implementation 2022-06-19 15:04:34 +03:00
b9ad1c41b2 update cmake (fix wasm32 build ) 2022-06-05 22:12:15 +03:00
071a01a2d6 fix load translations on android and ios dvices 2022-05-29 14:03:56 +03:00
11947d4cde fix docs 2022-05-25 18:08:51 +03:00
b26c9ea62d added QA_ASSERT_ON_WARN QA_ASSERT_ON_ERROR and QA_ALLOW_NOT_SUPPORTED_OPTIONS options 2022-05-25 18:05:36 +03:00
9e6e642f13 added warnings to a loading language function 2022-04-30 12:07:19 +03:00
8b848650b8 update cmake 2022-04-29 09:29:49 +03:00
76482dd08f fix language loader
All checks were successful
buildbot/WindowsBuilder Build finished.
2022-04-26 20:55:50 +03:00
4c596e3088 update copyright
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-03-03 19:00:49 +03:00
b0321a2c08 update settings docs 2022-02-22 17:01:53 +03:00
f466dd6437 added support method for getting current languages values 2022-02-21 14:45:00 +03:00
b6d3b0f72e Merge branch 'main' of https://github.com/QuasarApp/QuasarAppLib 2022-02-13 18:44:12 +03:00
5426711796 update log 2022-02-13 18:44:02 +03:00
ef5dc565bb update cmake
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-02-11 23:28:18 +03:00
c080361126 fix build 2022-02-11 17:21:01 +03:00
c3d94013c2 Merge branch 'main' of github.com:QuasarApp/QuasarAppLib 2022-02-11 15:39:44 +03:00
748fd9fd94 update cmake 2022-02-11 15:39:34 +03:00
9cc9e77bab add random array fuction into glabal header 2022-02-10 20:02:48 +03:00
d6ee73aff1 update cmake 2022-02-09 14:09:41 +03:00
a9d81a2eb5 update cmake 2022-02-09 11:11:38 +03:00
b971e3dffb add aple support 2022-02-09 09:57:01 +03:00
909bff8142 update cmake
All checks were successful
buildbot/IOSCMakeBuilder Build finished.
2022-02-08 20:36:30 +03:00
f7ee5cd272 update cmake 2022-01-22 16:53:22 +03:00
61badc9ff0 update cmake 2022-01-22 00:36:42 +03:00
2b0f879580 update cmake 2022-01-22 00:01:09 +03:00
8f9a778baf Merge branch 'main' of github.com:QuasarApp/QuasarAppLib 2022-01-21 19:53:13 +03:00
4ed7f0880a update cmake 2022-01-21 19:52:57 +03:00
461fcb6c82 git build qmake 2022-01-21 19:49:58 +03:00
d3c72639c4 remove ios toolchain 2022-01-21 17:05:42 +03:00
f7355aad58 update cmake 2022-01-20 18:32:22 +03:00
12582fc2eb fix global utils header 2022-01-20 17:12:04 +03:00
10ed7648a1 remove the global header from main quasarapp header 2022-01-20 17:09:19 +03:00
fa66066021 added empty distro filder 2022-01-19 00:03:39 +03:00
fe224bdc99 added headers to prijects 2022-01-18 23:55:45 +03:00
04b73772d8 remove depricated code. see The QuasarApp DoctorPill library 2022-01-18 23:21:11 +03:00
03e5ecb541 update cmake 2022-01-16 13:07:44 +03:00
ddd0ef996b update cmake 2022-01-15 17:17:14 +03:00
ccea0a2f17 fix cmake lib 2022-01-15 17:12:49 +03:00
b8c0663ca9 update cmake 2022-01-14 20:19:05 +03:00
3ef2547ebd update cmake 2022-01-13 18:49:42 +03:00
47b00c0152 update cmake 2022-01-13 18:33:11 +03:00
50176cc974 update cmake 2022-01-13 18:12:25 +03:00
953b1fb465 update cmake 2022-01-13 18:08:55 +03:00
adaa01346d update cmake 2022-01-13 17:47:11 +03:00
e3815b8029 update cmake 2022-01-12 18:57:52 +03:00
2e6c010b14 update cmake 2022-01-12 18:52:05 +03:00
d01a58570c update cmake 2022-01-12 18:42:15 +03:00
6bdaa0e9ef update cmake 2022-01-12 17:29:01 +03:00
302ee6d369 update cmake 2022-01-12 17:06:17 +03:00
0d9b75268d update cmake 2022-01-12 10:54:39 +03:00
6c4645899a
Merge pull request #39 from QuasarApp/doctor
Doctor
2022-01-11 11:21:25 +03:00
bcff3c3619 fix documentation 2022-01-11 10:59:45 +03:00
e2f3fed163 fix qt6 build 2022-01-11 10:53:25 +03:00
3bf106665d added pills for app 2022-01-11 10:17:29 +03:00
eb18b6c969 added doctor header 2022-01-10 20:36:41 +03:00
8a93dd9062 fix log function 2022-01-08 12:23:46 +03:00
2dca907f8b update cmake 2022-01-05 13:00:12 +03:00
78facac89b update cmake 2021-12-26 14:12:23 +03:00
2464bf55cf added clear cache method to isettings interface 2021-12-24 15:21:23 +03:00
bf0283a8c2 update cmake lib
All checks were successful
buildbot/WindowsBuilder Build finished.
buildbot/WindowsCMakeBuilder Build finished.
2021-12-11 18:50:33 +03:00
4b0dd805ad fix update cmake 2021-11-23 16:35:58 +03:00
eb7ba6cfcc Revert "fix subsribe to settings changes"
This reverts commit bd6dd8ecca2c0e2210b55e2fff1a3bee200736bc.
2021-11-20 13:19:23 +03:00
bd6dd8ecca fix subsribe to settings changes 2021-11-20 13:02:57 +03:00
6d5f602b7b fix multithread handling 2021-11-20 11:40:27 +03:00
a1680f59cc fix windows build 2021-11-19 23:34:03 +03:00
e56482ab50 added settings listner 2021-11-19 21:54:45 +03:00
c27ca21445 fix default value for getter with null objects 2021-11-19 00:34:50 +03:00
d7e11e644c added cahce tot settings class 2021-11-18 15:01:53 +03:00
165e61a86d fix init methods 2021-11-18 13:55:05 +03:00
ed56d729ad
Merge pull request #38 from QuasarApp/fix_by_task11
Added new method and fix logic
2021-11-18 12:13:12 +03:00
dc54e2bbc3
Apply suggestions from code review 2021-11-18 11:56:03 +03:00
IgorekLoschinin
53d5cd4ff2 ref # Added new method and fix logic 2021-11-18 00:26:44 +03:00
Igor loschinin
0c04d41712
Merge pull request #37 from QuasarApp/task_111_fix
Added change in template method instance
2021-11-08 23:22:29 +03:00
IgorekLoschinin
c309260b46 Merge branch 'main' into task_111_fix 2021-11-08 23:17:47 +03:00
IgorekLoschinin
0a03a081c0 ref # Added change in template method instance 2021-11-08 22:59:26 +03:00
Igor loschinin
66aa7eca11
Merge pull request #36 from QuasarApp/task_111
Added new functional over intarfece
2021-11-06 20:48:28 +03:00
4573b7dfa1 fix build 2021-11-06 20:10:49 +03:00
IgorekLoschinin
049283c287 ref #111 Fixing Change name Settingstype = Settingstype
All checks were successful
buildbot/LinuxCMakeBuilderQt6 Build finished.
2021-11-06 18:29:57 +03:00
IgorekLoschinin
2709f1141a Merge branch 'task_111' of github.com:QuasarApp/QuasarAppLib into task_111 2021-11-06 18:25:25 +03:00
Igor loschinin
b62144cd4b
Update isettings.h
Co-authored-by: Andrei Yankovich <EndrIIMail@gmail.com>
2021-11-06 18:24:58 +03:00
Igor loschinin
26156be771
Update isettings.h
Co-authored-by: Andrei Yankovich <EndrIIMail@gmail.com>
2021-11-06 18:24:54 +03:00
IgorekLoschinin
bbdf744514 ref #111 Fixing add zero at the end of the virtual method 2021-11-06 18:21:28 +03:00
IgorekLoschinin
3994904b0a ref #111 Added intarface for settings 2021-11-06 18:07:15 +03:00
IgorekLoschinin
bd14ed499f ref #111 Fixing added return 2021-11-06 10:20:20 +03:00
IgorekLoschinin
3e83214d34 ref #111 Added new functional over intarfece 2021-11-05 23:58:23 +03:00
4554cf393d update cmake 2021-10-25 16:25:57 +03:00
0c25573875 update cmake 2021-10-24 17:48:10 +03:00
698d5364cb update cmake 2021-10-24 16:44:13 +03:00
500186ef52 fix cmake 2021-10-15 18:23:15 +03:00
45ff443288 update cmake 2021-10-15 17:33:44 +03:00
72ec98c4cd Merge branch 'withoutSignApk' 2021-10-15 16:53:56 +03:00
421be4a1d8 update cmake lib 2021-10-15 16:53:16 +03:00
88df62884a
Merge pull request #35 from QuasarApp/withoutSignApk
update cmake submodule
2021-10-08 18:18:21 +03:00
0ad790d7f6 update cmake 2021-10-08 18:06:49 +03:00
20ceb9ba9d update cmake 2021-10-08 17:55:31 +03:00
ae03daea64 update cmake 2021-10-08 17:29:30 +03:00
7646d2a6db update cmake macrosses 2021-10-05 00:25:31 +03:00
5f1ebf22e2 update cmake 2021-09-28 13:45:42 +03:00
d69306c121 version 1.5.1 2021-07-28 13:29:33 +03:00
d37c6a1ff0
Merge pull request #33 from QuasarApp/optionValidator
Option validator
2021-07-28 13:28:33 +03:00
665eec418c fix build 2021-07-28 13:23:50 +03:00
cc87accb8b fix docs 2021-07-28 13:17:26 +03:00
864fe83d42 Merge branch 'main' into optionValidator 2021-07-28 12:51:51 +03:00
cae874728f added support validation wrong options 2021-07-28 12:38:44 +03:00
e021209f95 update cmake 2021-07-27 20:53:23 +03:00
93839d1dc0 fix option validataor 2021-07-27 17:24:43 +03:00
87e2fb4b99 update cmake 2021-07-26 16:53:41 +03:00
d7244c7442 update cmake 2021-07-26 16:52:35 +03:00
313f7f2cc5 update cmake 2021-07-26 16:16:49 +03:00
fc80dba292 added option validataor 2021-07-26 13:17:06 +03:00
dee8b58fd8 added support qt6 2021-07-23 18:44:13 +03:00
a5cfed3688 update cmake 2021-07-23 14:16:20 +03:00
9f997369d2 Merge branch 'main' of github.com:QuasarApp/QuasarAppLib 2021-07-23 13:59:31 +03:00
fea42f1ced update cmake 2021-07-23 13:59:19 +03:00
12c20dc83f remove depricated macros 2021-07-22 11:28:35 +03:00
cd84e72484 update cmake 2021-07-20 11:55:56 +03:00
ed3be09bde use QT_DEBUG define 2021-07-14 16:40:55 +03:00
97b2580498 fix build 2021-07-03 15:05:42 +03:00
ed0145dd39 update cmake 2021-07-03 15:02:39 +03:00
5cca105e57 update cmake 2021-07-03 14:55:51 +03:00
7a2e525ac8 update cmake 2021-06-05 10:40:30 +03:00
7c9308b3ff change rule of the search qt libs 2021-06-04 13:37:34 +03:00
9182b1bf1e fix find qt6 2021-06-04 13:23:50 +03:00
553e337e6a update cmake 2021-05-19 19:39:06 +03:00
68e6b32bd5 update cmake 2021-05-15 13:40:38 +03:00
a6a5c8f1b5 update cmake 2021-05-14 18:41:21 +03:00
6f0754fa22 update cmake 2021-05-09 11:41:36 +03:00
d66dbc7faa update CMake 2021-05-09 10:37:17 +03:00
87a0d37a6e update cmake 2021-05-09 10:10:55 +03:00
39d6d034b6 Merge branch 'main' of github.com:QuasarApp/QuasarAppLib 2021-05-05 15:44:46 +03:00
621fc4a5d0 addd addLocation method 2021-05-05 15:44:21 +03:00
438a6fe855
Update params.h 2021-05-01 11:38:35 +03:00
f9d81280c8
Update README.md 2021-05-01 11:34:40 +03:00
f5a8f4de82 chenge default verbose level 2021-04-30 12:06:50 +03:00
da1df65ada update cmake 2021-04-28 14:53:46 +03:00
461c5169bd update cmake 2021-04-27 12:26:12 +03:00
ba39d68abb update cmake 2021-04-27 11:15:42 +03:00
fc5dbe3702 update cmake 2021-04-27 00:18:40 +03:00
2cb6709b3e update cmake 2021-04-26 23:46:03 +03:00
c478359c60
Merge pull request #31 from QuasarApp/task_28
Add detailed documentation for all methods and classes.
2021-04-26 21:23:54 +03:00
75ad22b2df Merge branch 'task_28' of github.com:QuasarApp/QuasarAppLib into task_28 2021-04-26 21:20:34 +03:00
c7968c3f5f ref #28 "fix typo error (hask to hash)" 2021-04-26 21:19:49 +03:00
e51bf43b09
Update params.h
Co-authored-by: Igor loschinin <igor.loschinin2014@yandex.ru>
2021-04-26 21:17:59 +03:00
92f9c9c27a
Merge pull request #32 from QuasarApp/android_cmake
Android cmake
2021-04-26 18:00:14 +03:00
da3b928e63 fix warnings 2021-04-26 12:05:48 +03:00
8615e4162d fix docs warnings 2021-04-26 12:01:08 +03:00
c25ec6e68f ref #28 fix readme 2021-04-26 11:54:40 +03:00
95b8359efd fix windows build 2021-04-26 11:46:52 +03:00
271829781c ref #28 typo error 2021-04-26 11:36:15 +03:00
ebfd0b0ff3 rev #28 add detailed documentation for all methods and classes. 2021-04-26 11:27:19 +03:00
19a2437d0c update cmake 2021-04-25 19:14:32 +03:00
db974c911e update cmake 2021-04-22 17:17:46 +03:00
fe2ba8e5d3 update cmake 2021-04-21 19:36:16 +03:00
680a42202c update cmake 2021-04-21 19:26:04 +03:00
87eb1cdd12 update cmake 2021-04-21 19:18:37 +03:00
ebf0c7894a update cmake 2021-04-21 18:53:22 +03:00
d0d791e9e3 update cmake 2021-04-21 18:24:51 +03:00
7ea6c9af26 update comake 2021-04-20 17:02:05 +03:00
aab6cca7f5
Merge pull request #30 from QuasarApp/update_cmake
update cmake
2021-04-20 11:54:35 +03:00
ec864de682 update cmake 2021-04-20 11:50:46 +03:00
b3b8307172 udpate cmeke 2021-04-19 19:35:32 +03:00
51ab2bf3d3 update cmake 2021-04-19 17:51:06 +03:00
f33f915887 Merge branch 'main' of github.com:QuasarApp/QuasarAppLib into main 2021-04-19 16:51:40 +03:00
401409a87f update cmake 2021-04-19 16:51:30 +03:00
3f602cbfac
Merge pull request #29 from QuasarApp/newdocumentation
Added side bar and change html root dir
2021-04-17 00:17:32 +03:00
73f51c2fff fix html output path 2021-04-17 00:11:55 +03:00
ef8774c134 added side bar and change html root dir 2021-04-16 23:54:57 +03:00
693e0e9948 update cmake 2021-04-13 16:35:38 +03:00
caabc17e2f fix link qt libraryes 2021-04-11 17:01:36 +03:00
Oleg-designer
8bdb0b38f1
Merge pull request #27 from QuasarApp/task_26
Docs fix
2021-04-08 09:02:00 +03:00
5a2e19e5ab
Update README.md 2021-04-07 21:55:10 +03:00
a7f5756f52 added description and usage example 2021-04-07 21:25:05 +03:00
e2ae121a7c
Update params.h 2021-04-07 18:59:58 +03:00
d978f47ea5 update cmake 2021-04-07 18:57:01 +03:00
67eac71d91 update cmake 2021-04-07 18:46:34 +03:00
e8e7721518 fix #26 Docs fix 2021-04-07 13:24:30 +03:00
b643f5ec96 fix deploy step on windows 2021-04-01 20:50:31 +03:00
681dab9741 fix windows shared build
n# Please enter the commit message for your changes. Lines starting
2021-04-01 08:25:12 -07:00
80661ff685 remove include qt method 2021-04-01 16:36:44 +03:00
d011e2bada
Merge pull request #25 from QuasarApp/updateCmake
update cmake
2021-04-01 13:52:37 +03:00
cf88bc8264 move doxygen into cmake 2021-04-01 13:48:24 +03:00
1130c1d2a6 udapte log 2021-04-01 13:41:19 +03:00
37dc7a7c80 update cmake 2021-04-01 13:37:58 +03:00
ca54815677 update cmake 2021-04-01 13:28:13 +03:00
7af6efb0c6 fix typo error 2021-04-01 13:07:15 +03:00
d24908f7c8 update cmake 2021-04-01 13:04:01 +03:00
30b3669ce4 Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2021-03-30 21:27:56 +03:00
34e0c6b502 fix android builds (cmake) 2021-03-30 21:27:36 +03:00
e6751c86d5
Merge pull request #24 from QuasarApp/task_20
Readme update
2021-03-29 15:59:54 +03:00
fd2aad7890 fix #20 radme update 2021-03-29 11:25:56 +03:00
81e0ed8a19 change params map to QString map 2021-03-26 17:18:29 +03:00
9c7aa9b8a3 fix release builds 2021-03-22 21:08:46 +03:00
e06d6d3634 v 1.4.5 "added description for the debug assert macross " 2021-03-22 19:55:56 +03:00
a0676fbc84 update cmake 2021-03-19 21:40:04 +03:00
681d2492db
Merge pull request #23 from pzhlkj6612/output_options_map
Output all the working options and their value at the debug verbose level (-verbose 3)
2021-02-22 08:50:08 +03:00
Mozi
647055ec21 Output all the working options and their value
At the debug verbose level (-verbose 3) only.
2021-02-22 10:29:57 +08:00
7b978a5561
Merge pull request #22 from QuasarApp/ci
Addeed support ci targets
2021-02-20 12:46:41 +03:00
9a1a870993 fix build on the Qt5 2021-02-20 12:42:34 +03:00
38068ec75f added deploy step for the qmake 2021-02-20 12:35:01 +03:00
23b5f47a44 addeed support ci targets 2021-02-20 12:29:16 +03:00
1fe4fa3b25 fix translations 2021-02-15 13:17:28 +03:00
81e4ef9bb4 added example 2021-02-12 13:28:47 +03:00
b5316127aa v 1.4.4 "fix translations" 2021-02-12 12:39:46 +03:00
e520e9da41 update cmake 2021-02-11 18:46:51 +03:00
d0971dbcb7 update cmake 2021-02-11 18:38:03 +03:00
5042527ffb Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2021-01-24 14:05:16 +03:00
fcdda0b0af added the isDebugBuild method 2021-01-24 14:04:31 +03:00
f4a720bd24 Merge branch 'updateCopyRight' 2021-01-05 13:04:26 +03:00
e1f0f13c8e updatecopyright 2021-01-05 13:04:05 +03:00
7106ed22d9 remove the !operator for enum classes it is not secure 2020-12-27 16:26:42 +03:00
2934cdc09f added support qt6 2020-12-27 14:59:13 +03:00
e634961b4a added !operator for enum classes 2020-11-14 00:56:58 +03:00
ffc95d077b Merge branch 'tmp' 2020-10-23 14:13:28 +03:00
a3e435823c update cmake 2020-10-23 14:13:13 +03:00
f873269780 ufdate cmake 2020-09-28 23:42:54 +03:00
f84faab0dd update cmake 2020-09-23 15:42:20 +03:00
9d22f8a219 update cmake 2020-09-23 14:07:03 +03:00
c8a3dae894 fix cmake 2020-09-23 08:40:25 +03:00
68a0185c5a update cmake 2020-09-22 09:30:35 +03:00
fec2b1d13b update cmake 2020-09-21 20:21:46 +03:00
c4a1b14149 Merge branch 'wasm_32' 2020-09-21 20:20:52 +03:00
9c68064b48 fix wasm platform 2020-09-21 20:20:09 +03:00
b1fb180221 fix verbose of logs on qmake build systems 2020-09-07 14:45:39 +03:00
2d26f15603 fix build on old gcc compilers 2020-09-07 10:16:55 +03:00
05ac25e92a fix build for qt 5.9 2020-09-07 09:54:25 +03:00
df333341ce added new hash calc methods into QusarApp::global 2020-09-06 00:41:32 +03:00
68dc207db0 remove not working code 2020-08-25 15:33:38 +03:00
100b70b4d6 Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-08-21 16:03:55 +03:00
ad21d646d0 added debug_assert function 2020-08-21 16:03:32 +03:00
3ff083ab33 fix warnings for Qt 5.15 2020-08-14 10:14:38 +03:00
bdb77471ac fix warnings 2020-08-06 14:14:29 +03:00
80cae9f7ac fix windows build 2020-06-30 13:13:08 +03:00
3947277ce2 fix copyright 2020-05-23 02:29:13 +03:00
18226f2753 added copyright 2020-05-23 02:13:32 +03:00
88a3632807 fix static hash function 2020-05-23 02:12:35 +03:00
c65aba6329 added defines for hash methods 2020-05-22 22:36:42 +03:00
a4734f877f added staticHashDunction 2020-05-22 22:34:06 +03:00
05254ad0cd update cmake 2020-05-22 12:54:29 +03:00
eff3a3055d Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-05-17 23:21:37 +03:00
44791d19c2 update library 2020-05-17 23:21:12 +03:00
bb6ced3b79 Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-05-16 15:47:21 +03:00
537d7b0634 fix locales 2020-05-16 15:46:41 +03:00
ec0622fa12 new translation logick 2020-05-15 01:43:32 +03:00
3b0c06626c update cmake 2020-05-09 00:39:35 +03:00
1abd8f522a fix cmake 2020-05-04 12:09:59 +03:00
8afe9cdd87 fix cmake 2020-05-04 11:58:20 +03:00
e428da03a0 fix 2020-05-04 09:09:20 +03:00
c138c75cb5 Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-05-03 16:13:41 +03:00
b3820d7b15 update cmake 2020-05-03 16:12:49 +03:00
60f961375a update cmake 2020-04-26 15:16:05 +03:00
9a9a5d6322 update cmake 2020-04-25 22:19:11 +03:00
c76e611a9f Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-04-25 22:06:48 +03:00
4129ff8c1d fix qmake build 2020-04-25 17:12:41 +03:00
7b413c0539 Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-04-25 14:48:49 +03:00
4e0c569c00 fix print help 2020-04-25 14:48:27 +03:00
8d11470d99 update cmake 2020-04-25 13:58:05 +03:00
ee268f348e update cmqke 2020-04-22 21:10:19 +03:00
cebdc74ab6 cmake update 2020-04-21 21:30:28 +03:00
40846764a5 added message for build 2020-04-19 17:51:26 +03:00
c5c74c393f added validation for dublicate include 2020-04-19 17:48:14 +03:00
4af60d539e Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-04-19 17:29:12 +03:00
f138989588 fix quasarApp 2020-04-19 17:28:59 +03:00
f5a6e542ea Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-04-19 13:04:45 +03:00
2343a11c7a fix global file 2020-04-19 13:04:33 +03:00
762f421db4 fix cmake master 2020-04-19 13:02:27 +03:00
7070d77012 added ew method for get all users arguments 2020-04-18 21:28:35 +03:00
d580ac1a20 added isDebug method 2020-04-14 17:57:54 +03:00
273045d966 new cmake 2020-04-09 21:46:20 +03:00
ad7b644573 update cmake with android targets 2020-04-09 17:54:47 +03:00
a98ed022c8 updated cmake libs 2020-04-08 18:30:44 +03:00
eea36f0e62 Merge branch 'master' of github.com:QuasarApp/QuasarAppLib 2020-04-04 19:50:58 +03:00
0bc7d99080 update cmake 2020-04-04 19:50:43 +03:00
b932e8c65e fix log 2020-04-04 18:17:26 +03:00
48cde49139 1.3.2 2020-04-04 15:43:23 +03:00
5b2e25567b fix printing logs 2020-04-04 15:42:56 +03:00
b9e8a900c7 Merge branch 'master' of https://github.com/QuasarApp/QuasarAppLib 2020-04-03 10:39:55 +03:00
a3db249c8f update cmake 2020-04-03 10:39:40 +03:00
32b5693872 update cmake libs 2020-03-31 12:06:36 +03:00
0dda7b9189 fix work users options 2020-03-09 15:32:39 +03:00
40b9616ad6 fix parse params 2020-03-09 15:13:06 +03:00
76ec898818 version 1.3.1 2020-03-09 14:36:20 +03:00
99b6aa1474 fix customParamasSize 2020-03-09 14:35:08 +03:00
5deea5073a
Merge pull request #19 from QuasarApp/1.3
Update CMakeLists.txt
2020-02-25 16:33:42 +03:00
9847582222
Update QuasarApp.pro 2020-02-25 16:33:22 +03:00
ee3f9d1d7a
Update CMakeLists.txt 2020-02-25 16:32:11 +03:00
2df4876f7c added description for help module 2020-02-22 12:41:14 +03:00
a5aca0e487 added sorting of help and dynamic risize 2020-02-20 10:33:45 +03:00
105f019aa7 fix help printer 2020-02-19 19:25:22 +03:00
663c1571c7 fix print Help 2020-02-19 13:32:22 +03:00
5a971a5b21 added new help functions 2020-02-18 22:28:17 +03:00
44 changed files with 5368 additions and 1050 deletions

1
.gitignore vendored
View File

@ -59,3 +59,4 @@ compile_commands.json
CTestTestfile.cmake CTestTestfile.cmake
_deps _deps
*_autogen *_autogen
docs/html

2
CMake

@ -1 +1 @@
Subproject commit 682c00fca702776925f66511ae76b2fe88dece75 Subproject commit 76d88f13235574890fa72e9a811c6ff524d6abaa

View File

@ -1,34 +1,70 @@
# #
# Copyright (C) 2018-2019 QuasarApp. # Copyright (C) 2018-2025 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying # Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies # Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed. # of this license document, but changing it is not allowed.
# #
if(DEFINED QUASARAPP_LIBRARY)
return()
else()
set(QUASARAPP_LIBRARY 1)
add_definitions(-DQUASARAPP_LIBRARY)
endif()
project(QuasarApp)
if(TARGET ${PROJECT_NAME})
message("The ${PROJECT_NAME} arledy included in main Project")
return()
endif()
cmake_minimum_required(VERSION 3.1) cmake_minimum_required(VERSION 3.1)
include(CMake/crossplatform/crossplatform.cmake)
project(QuasarApp LANGUAGES CXX)
include(CMake/ProjectOut.cmake) include(CMake/QuasarApp.cmake)
include(CMake/ccache.cmake)
include(CMake/Version.cmake) include(CMake/Version.cmake)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
option(BUILD_SHARED_LIBS "Enable or disable shared libraryes" OFF)
find_package(Qt5 COMPONENTS Core REQUIRED) if (NOT QT_VERSION_MAJOR)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
endif()
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
option(QA_ALLOW_NOT_SUPPORTED_OPTIONS "Enable for allow any command line options" ON)
option(QA_DISABLE_LOG "Disabled all logs (force sets verbose to 0)" OFF)
if (QA_DISABLE_LOG)
add_definitions(-DQA_DISABLE_LOG)
endif()
if (QA_ALLOW_NOT_SUPPORTED_OPTIONS)
add_definitions(-DQA_ALLOW_NOT_SUPPORTED_OPTIONS)
endif()
file(GLOB SOURCE_CPP file(GLOB SOURCE_CPP
"*.cpp" "*.cpp" "*.h"
) )
add_library(${PROJECT_NAME} SHARED ${SOURCE_CPP}) add_library(${PROJECT_NAME} ${SOURCE_CPP})
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core) target_link_libraries(${PROJECT_NAME} PUBLIC Qt${QT_VERSION_MAJOR}::Core)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
setVersion(1 2 0) setVersion(1 6 0)
initAll()
make_directory("${CMAKE_CURRENT_SOURCE_DIR}/Distro")
addDoc(${PROJECT_NAME}Docs ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf)
install(TARGETS ${PROJECT_NAME}
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

View File

@ -1,22 +0,0 @@
#
# Copyright (C) 2018-2020 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
#
!isEmpty(CCACHE_INCLUDE):error("ccache.pri already included")
CCACHE_INCLUDE = 1
contains(QMAKE_HOST.os, Linux):{
BIN = $$system(which ccache)
!isEmpty(BIN) {
message(ccache detected in $$BIN)
QMAKE_CXX='$$BIN $$QMAKE_CXX'
}
}

View File

@ -1,33 +0,0 @@
#
# Copyright (C) 2018-2019 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
#
QT_DIR = $$dirname(QMAKE_QMAKE)
LUPDATE = $$QT_DIR/lupdate
LRELEASE = $$QT_DIR/lrelease
win32 {
LUPDATE = $${LUPDATE}.exe
LRELEASE = $${LRELEASE}.exe
}
PRO_FILES = $$files(*.pro, true)
for(PRO, PRO_FILES) {
commands += "$$LUPDATE $$PRO"
}
TS_FILES = $$files(*.ts, true)
for(TS, TS_FILES) {
commands += "$$LRELEASE $$TS"
}
for(command, commands) {
system($$command)|error("Failed to run: $$command")
}

View File

@ -1,442 +0,0 @@
#!/bin/bash
#################
# Launcher init #
#################
START=$(date +%s.%N)
# On Fedora $SNAP is under /var and there is some magic to map it to /snap.
# # We need to handle that case and reset $SNAP
SNAP=`echo $SNAP | sed -e "s|/var/lib/snapd||g"`
needs_update=true
. $SNAP_USER_DATA/.last_revision 2>/dev/null || true
if [ "$SNAP_DESKTOP_LAST_REVISION" = "$SNAP_REVISION" ]; then
needs_update=false
fi
# Set $REALHOME to the users real home directory
REALHOME=`getent passwd $UID | cut -d ':' -f 6`
# If the user has modified their user-dirs settings, force an update
if [[ -f $HOME/.config/user-dirs.dirs.md5sum && -f $HOME/.config/user-dirs.locale.md5sum ]]; then
if [[ "$(md5sum < $REALHOME/.config/user-dirs.dirs)" != "$(cat $HOME/.config/user-dirs.dirs.md5sum)" ||
"$(md5sum < $REALHOME/.config/user-dirs.locale)" != "$(cat $HOME/.config/user-dirs.locale.md5sum)" ]]; then
needs_update=true
fi
fi
if [ "$SNAP_ARCH" == "amd64" ]; then
ARCH="x86_64-linux-gnu"
elif [ "$SNAP_ARCH" == "armhf" ]; then
ARCH="arm-linux-gnueabihf"
elif [ "$SNAP_ARCH" == "arm64" ]; then
ARCH="aarch64-linux-gnu"
else
ARCH="$SNAP_ARCH-linux-gnu"
fi
export SNAP_LAUNCHER_ARCH_TRIPLET=$ARCH
# Don't LD_PRELOAD bindtextdomain for classic snaps
if ! grep -qs "^\s*confinement:\s*classic\s*" $SNAP/meta/snap.yaml; then
if [ -f $SNAP/lib/bindtextdomain.so ]; then
export LD_PRELOAD=$LD_PRELOAD:$SNAP/lib/bindtextdomain.so
fi
fi
###############################################
# Launcher common exports for any desktop app #
###############################################
function prepend_dir() {
local var="$1"
local dir="$2"
if [ -d "$dir" ]; then
eval "export $var=\"\$dir\${$var:+:\$$var}\""
fi
}
function append_dir() {
local var="$1"
local dir="$2"
if [ -d "$dir" ]; then
eval "export $var=\"\${$var:+\$$var:}\$dir\""
fi
}
function can_open_file() {
return `head -c0 "$1" &> /dev/null`;
}
WITH_RUNTIME=no
if [ -z "$RUNTIME" ]; then
RUNTIME=$SNAP
else
# add general paths not added by snapcraft due to runtime snap
append_dir LD_LIBRARY_PATH $RUNTIME/lib/$ARCH
append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH
append_dir PATH $RUNTIME/usr/bin
WITH_RUNTIME=yes
fi
# XKB config
export XKB_CONFIG_ROOT=$RUNTIME/usr/share/X11/xkb
# Give XOpenIM a chance to locate locale data.
# This is required for text input to work in SDL2 games.
export XLOCALEDIR=$RUNTIME/usr/share/X11/locale
# Set XCursors path
export XCURSOR_PATH=$RUNTIME/usr/share/icons
# Mesa Libs for OpenGL support
append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/mesa
append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/mesa-egl
# Tell libGL where to find the drivers
export LIBGL_DRIVERS_PATH=$RUNTIME/usr/lib/$ARCH/dri
append_dir LD_LIBRARY_PATH $LIBGL_DRIVERS_PATH
# Workaround in snapd for proprietary nVidia drivers mounts the drivers in
# /var/lib/snapd/lib/gl that needs to be in LD_LIBRARY_PATH
# Without that OpenGL using apps do not work with the nVidia drivers.
# Ref.: https://bugs.launchpad.net/snappy/+bug/1588192
append_dir LD_LIBRARY_PATH /var/lib/snapd/lib/gl
# Unity7 export (workaround for https://launchpad.net/bugs/1638405)
append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/libunity
# Pulseaudio export
append_dir LD_LIBRARY_PATH $RUNTIME/usr/lib/$ARCH/pulseaudio
# EGL vendor files on glvnd enabled systems
[ -d /var/lib/snapd/lib/glvnd/egl_vendor.d ] && \
append_dir __EGL_VENDOR_LIBRARY_DIRS /var/lib/snapd/lib/glvnd/egl_vendor.d
# Tell GStreamer where to find its plugins
export GST_PLUGIN_PATH=$SNAP/usr/lib/$ARCH/gstreamer-1.0
export GST_PLUGIN_SYSTEM_PATH=$RUNTIME/usr/lib/$ARCH/gstreamer-1.0
# gst plugin scanner doesn't install in the correct path: https://github.com/ubuntu/snapcraft-desktop-helpers/issues/43
export GST_PLUGIN_SCANNER=$RUNTIME/usr/lib/$ARCH/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner
# XDG Config
[ "$WITH_RUNTIME" = yes ] && prepend_dir XDG_CONFIG_DIRS $RUNTIME/etc/xdg
prepend_dir XDG_CONFIG_DIRS $SNAP/etc/xdg
# Define snaps' own data dir
[ "$WITH_RUNTIME" = yes ] && prepend_dir XDG_DATA_DIRS $RUNTIME/usr/share
prepend_dir XDG_DATA_DIRS $SNAP/usr/share
prepend_dir XDG_DATA_DIRS $SNAP/share
prepend_dir XDG_DATA_DIRS $SNAP/data-dir
prepend_dir XDG_DATA_DIRS $SNAP_USER_DATA
# Set XDG_DATA_HOME to local path
export XDG_DATA_HOME=$SNAP_USER_DATA/.local/share
mkdir -p $XDG_DATA_HOME
# Workaround for GLib < 2.53.2 not searching for schemas in $XDG_DATA_HOME:
# https://bugzilla.gnome.org/show_bug.cgi?id=741335
prepend_dir XDG_DATA_DIRS $XDG_DATA_HOME
# Set cache folder to local path
export XDG_CACHE_HOME=$SNAP_USER_COMMON/.cache
if [[ -d $SNAP_USER_DATA/.cache && ! -e $XDG_CACHE_HOME ]]; then
# the .cache directory used to be stored under $SNAP_USER_DATA, migrate it
mv $SNAP_USER_DATA/.cache $SNAP_USER_COMMON/
fi
mkdir -p $XDG_CACHE_HOME
# Set config folder to local path
export XDG_CONFIG_HOME=$SNAP_USER_DATA/.config
mkdir -p $XDG_CONFIG_HOME
# Create $XDG_RUNTIME_DIR if not exists (to be removed when LP: #1656340 is fixed)
[ -n "$XDG_RUNTIME_DIR" ] && mkdir -p $XDG_RUNTIME_DIR -m 700
# Ensure the app finds locale definitions (requires locales-all to be installed)
append_dir LOCPATH $RUNTIME/usr/lib/locale
# If any, keep track of where XDG dirs were so we can potentially migrate the content later
test -f ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs
for d in DOCUMENTS DESKTOP DOWNLOAD MUSIC PICTURES VIDEOS PUBLICSHARE TEMPLATES; do
eval $(echo "OLD_XDG_${d}_DIR")=`eval "$(echo "echo \\$XDG_${d}_DIR")"`
done
# Setup user-dirs.* or run xdg-user-dirs-update if needed
needs_xdg_update=false
needs_xdg_links=false
if can_open_file "$REALHOME/.config/user-dirs.dirs" && can_open_file "$REALHOME/.config/user-dirs.locale"; then
mkdir -p $HOME/.config -m 700
sed /^#/!s#\$HOME#${REALHOME}#g $REALHOME/.config/user-dirs.dirs > $HOME/.config/user-dirs.dirs
cp -a $REALHOME/.config/user-dirs.locale $HOME/.config/
for f in user-dirs.dirs user-dirs.locale; do
md5sum < $REALHOME/.config/$f > $HOME/.config/$f.md5sum
done
else
needs_xdg_update=true
needs_xdg_links=true
fi
# Check if we can actually read the contents of each xdg dir
test -f ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs
XDG_SPECIAL_DIRS=($XDG_DOCUMENTS_DIR $XDG_DESKTOP_DIR $XDG_DOWNLOAD_DIR $XDG_MUSIC_DIR $XDG_PICTURES_DIR $XDG_VIDEOS_DIR $XDG_PUBLIC_DIR $XDG_TEMPLATES_DIR)
for d in ${XDG_SPECIAL_DIRS[@]}; do
if ! can_open_file $d; then
needs_xdg_update=true
fi
done
# If needs XDG update and xdg-user-dirs-update exists in $PATH, run it
if [ $needs_xdg_update = true ] && command -v xdg-user-dirs-update >/dev/null; then
xdg-user-dirs-update
fi
# Create links for user-dirs.dirs
if [ $needs_xdg_links = true ]; then
test -f ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs && . ${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs
XDG_SPECIAL_DIRS=($XDG_DOCUMENTS_DIR $XDG_DESKTOP_DIR $XDG_DOWNLOAD_DIR $XDG_MUSIC_DIR $XDG_PICTURES_DIR $XDG_VIDEOS_DIR $XDG_PUBLIC_DIR $XDG_TEMPLATES_DIR)
for d in ${XDG_SPECIAL_DIRS[@]}; do
b=$(realpath "$d" --relative-to="$REALHOME")
if [ -e $REALHOME/$b ] && [ ! -e $HOME/$b ]; then
ln -s $REALHOME/$b $HOME/$b
fi
done
else
# If we aren't creating new links, check if we have content saved in old locations and move it
for d in DOCUMENTS DESKTOP DOWNLOAD MUSIC PICTURES VIDEOS PUBLICSHARE TEMPLATES; do
old=`eval "$(echo "echo \\$OLD_XDG_${d}_DIR")"`
new=`eval "$(echo "echo \\$XDG_${d}_DIR")"`
if [ -L "$old" ] && [ -d "$new" ] && [ `readlink "$old"` != "$new" ]; then
mv "$old"/* "$new"/ 2>/dev/null
elif [ -d "$old" ] && [ -d "$new" ] && [ "$old" != "$new" ]; then
mv "$old"/* "$new"/ 2>/dev/null
fi
done
fi
# If detect wayland server socket, then set environment so applications prefer
# wayland, and setup compat symlink (until we use user mounts. Remember,
# XDG_RUNTIME_DIR is /run/user/<uid>/snap.$SNAP so look in the parent directory
# for the socket. For details:
# https://forum.snapcraft.io/t/wayland-dconf-and-xdg-runtime-dir/186/10
# Applications that don't support wayland natively may define DISABLE_WAYLAND
# (to any non-empty value) to skip that logic entirely.
wayland_available=false
if [[ -n "$XDG_RUNTIME_DIR" && -z "$DISABLE_WAYLAND" ]]; then
wdisplay="wayland-0"
if [ -n "$WAYLAND_DISPLAY" ]; then
wdisplay="$WAYLAND_DISPLAY"
fi
wayland_sockpath="$XDG_RUNTIME_DIR/../$wdisplay"
wayland_snappath="$XDG_RUNTIME_DIR/$wdisplay"
if [ -S "$wayland_sockpath" ]; then
# if running under wayland, use it
#export WAYLAND_DEBUG=1
wayland_available=true
# create the compat symlink for now
if [ ! -e "$wayland_snappath" ]; then
ln -s "$wayland_sockpath" "$wayland_snappath"
fi
fi
fi
# Make PulseAudio socket available inside the snap-specific $XDG_RUNTIME_DIR
if [ -n "$XDG_RUNTIME_DIR" ]; then
pulsenative="pulse/native"
pulseaudio_sockpath="$XDG_RUNTIME_DIR/../$pulsenative"
if [ -S "$pulseaudio_sockpath" ]; then
export PULSE_SERVER="unix:${pulseaudio_sockpath}"
fi
fi
# GI repository
[ "$WITH_RUNTIME" = yes ] && prepend_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/$ARCH/girepository-1.0
[ "$WITH_RUNTIME" = yes ] && prepend_dir GI_TYPELIB_PATH $RUNTIME/usr/lib/girepository-1.0
prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/$ARCH/girepository-1.0
prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/girepository-1.0
prepend_dir GI_TYPELIB_PATH $SNAP/usr/lib/gjs/girepository-1.0
# Keep an array of data dirs, for looping through them
IFS=':' read -r -a data_dirs_array <<< "$XDG_DATA_DIRS"
# Font Config and themes
export FONTCONFIG_PATH=$RUNTIME/etc/fonts
export FONTCONFIG_FILE=$RUNTIME/etc/fonts/fonts.conf
function make_user_fontconfig {
echo "<fontconfig>"
if [ -d $REALHOME/.local/share/fonts ]; then
echo " <dir>$REALHOME/.local/share/fonts</dir>"
fi
if [ -d $REALHOME/.fonts ]; then
echo " <dir>$REALHOME/.fonts</dir>"
fi
for d in "${data_dirs_array[@]}"; do
if [ -d "$d/fonts" ]; then
echo " <dir>$d/fonts</dir>"
fi
done
echo ' <include ignore_missing="yes">conf.d</include>'
# We need to include this default cachedir first so that caching
# works: without it, fontconfig will try to write to the real user home
# cachedir and be blocked by AppArmor.
echo ' <cachedir prefix="xdg">fontconfig</cachedir>'
if [ -d $REALHOME/.cache/fontconfig ]; then
echo " <cachedir>$REALHOME/.cache/fontconfig</cachedir>"
fi
echo "</fontconfig>"
}
if [ $needs_update = true ]; then
rm -rf $XDG_DATA_HOME/{fontconfig,fonts,fonts-*,themes,.themes}
# This fontconfig fragment is installed in a location that is
# included by the system fontconfig configuration: namely the
# etc/fonts/conf.d/50-user.conf file.
mkdir -p $XDG_CONFIG_HOME/fontconfig
make_user_fontconfig > $XDG_CONFIG_HOME/fontconfig/fonts.conf
# the themes symlink are needed for GTK 3.18 when the prefix isn't changed
# GTK 3.20 looks into XDG_DATA_DIR which has connected themes.
ln -sf $RUNTIME/usr/share/themes $XDG_DATA_HOME
ln -sfn $RUNTIME/usr/share/themes $SNAP_USER_DATA/.themes
fi
# Build mime.cache
# needed for gtk and qt icon
if [ $needs_update = true ]; then
rm -rf $XDG_DATA_HOME/mime
if [ ! -f $RUNTIME/usr/share/mime/mime.cache ]; then
if command -v update-mime-database >/dev/null; then
cp --preserve=timestamps -dR $RUNTIME/usr/share/mime $XDG_DATA_HOME
update-mime-database $XDG_DATA_HOME/mime
fi
fi
fi
# Gio modules and cache (including gsettings module)
export GIO_MODULE_DIR=$XDG_CACHE_HOME/gio-modules
function compile_giomodules {
if [ -f $1/glib-2.0/gio-querymodules ]; then
rm -rf $GIO_MODULE_DIR
mkdir -p $GIO_MODULE_DIR
ln -s $1/gio/modules/*.so $GIO_MODULE_DIR
$1/glib-2.0/gio-querymodules $GIO_MODULE_DIR
fi
}
if [ $needs_update = true ]; then
compile_giomodules $RUNTIME/usr/lib/$ARCH
fi
# Setup compiled gsettings schema
GS_SCHEMA_DIR=$XDG_DATA_HOME/glib-2.0/schemas
function compile_schemas {
if [ -f "$1" ]; then
rm -rf $GS_SCHEMA_DIR
mkdir -p $GS_SCHEMA_DIR
for d in "${data_dirs_array[@]}"; do
schema_dir=$d/glib-2.0/schemas
if [ -f "$schema_dir/gschemas.compiled" ]; then
# This directory already has compiled schemas
continue
fi
if [ -n "$(ls -A $schema_dir/*.xml 2>/dev/null)" ]; then
ln -s $schema_dir/*.xml $GS_SCHEMA_DIR
fi
if [ -n "$(ls -A $schema_dir/*.override 2>/dev/null)" ]; then
ln -s $schema_dir/*.override $GS_SCHEMA_DIR
fi
done
# Only compile schemas if we copied anyting
if [ -n "$(ls -A $GS_SCHEMA_DIR/*.xml $GS_SCHEMA_DIR/*.override 2>/dev/null)" ]; then
"$1" $GS_SCHEMA_DIR
fi
fi
}
if [ $needs_update = true ]; then
compile_schemas $RUNTIME/usr/lib/$ARCH/glib-2.0/glib-compile-schemas
fi
# Enable gsettings user changes
# symlink the dconf file if home plug is connected for read
DCONF_DEST_USER_DIR=$SNAP_USER_DATA/.config/dconf
if [ ! -f $DCONF_DEST_USER_DIR/user ]; then
if [ -f $REALHOME/.config/dconf/user ]; then
mkdir -p $DCONF_DEST_USER_DIR
ln -s $REALHOME/.config/dconf/user $DCONF_DEST_USER_DIR
fi
fi
# Testability support
append_dir LD_LIBRARY_PATH $SNAP/testability
append_dir LD_LIBRARY_PATH $SNAP/testability/$ARCH
append_dir LD_LIBRARY_PATH $SNAP/testability/$ARCH/mesa
# Gdk-pixbuf loaders
export GDK_PIXBUF_MODULE_FILE=$XDG_CACHE_HOME/gdk-pixbuf-loaders.cache
export GDK_PIXBUF_MODULEDIR=$RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/2.10.0/loaders
if [ $needs_update = true ]; then
rm -f $GDK_PIXBUF_MODULE_FILE
if [ -f $RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders ]; then
$RUNTIME/usr/lib/$ARCH/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders > $GDK_PIXBUF_MODULE_FILE
fi
fi
# Icon themes cache
if [ $needs_update = true ]; then
rm -rf $XDG_DATA_HOME/icons
mkdir -p $XDG_DATA_HOME/icons
for d in "${data_dirs_array[@]}"; do
for i in $d/icons/*; do
if [ -f "$i/index.theme" -a ! -f "$i/icon-theme.cache" ]; then
theme_dir=$XDG_DATA_HOME/icons/$(basename "$i")
if [ ! -d "$theme_dir" ]; then
mkdir -p "$theme_dir"
ln -s $i/* "$theme_dir"
if [ -f $RUNTIME/usr/sbin/update-icon-caches ]; then
$RUNTIME/usr/sbin/update-icon-caches "$theme_dir"
elif [ -f $RUNTIME/usr/sbin/update-icon-cache.gtk2 ]; then
$RUNTIME/usr/sbin/update-icon-cache.gtk2 "$theme_dir"
fi
fi
fi
done
done
fi
# GTK theme and behavior modifier
# Those can impact the theme engine used by Qt as well
gtk_configs=(.config/gtk-3.0/settings.ini .config/gtk-3.0/bookmarks .config/gtk-2.0/gtkfilechooser.ini)
for f in ${gtk_configs[@]}; do
dest="$SNAP_USER_DATA/$f"
if [ ! -L "$dest" ]
then
mkdir -p `dirname $dest`
ln -s $REALHOME/$f $dest
fi
done
# create symbolic link to ibus socket path for ibus to look up its socket files
# (see comments #3 and #6 on https://launchpad.net/bugs/1580463)
IBUS_CONFIG_PATH=$XDG_CONFIG_HOME/ibus
mkdir -p $IBUS_CONFIG_PATH
[ -d $IBUS_CONFIG_PATH/bus ] && rm -rf $IBUS_CONFIG_PATH/bus
ln -sfn $REALHOME/.config/ibus/bus $IBUS_CONFIG_PATH
##############################
# Glib minimum specific part #
##############################
###############################
# Mark update and exec binary #
###############################
[ $needs_update = true ] && echo "SNAP_DESKTOP_LAST_REVISION=$SNAP_REVISION" > $SNAP_USER_DATA/.last_revision
if [ -n "$SNAP_DESKTOP_DEBUG" ]; then
echo "desktop-launch elapsed time: " $(date +%s.%N --date="$START seconds ago")
echo "Now running: exec $@"
fi
exec "$@"

View File

@ -1,61 +0,0 @@
#
# Copyright (C) 2018-2020 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
#
QT -= gui
CONFIG += c++17
TARGET = QuasarApp
TEMPLATE = lib
DEFINES += QUASARAAPP_LIBRARY
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG(release, debug|release): {
DESTDIR = $$PWD/build/release
} else {
DESTDIR = $$PWD/build/debug
}
SOURCES += \
quasarapp.cpp \
params.cpp \
locales.cpp \
settings.cpp \
global.cpp
HEADERS += \
quasarapp.h \
quasarapp_global.h \
params.h \
locales.h \
settings.h \
global.h
DISTFILES += \
QuasarLib.pri \
qmakeEtalons/locales.pri
RESOURCES += \
res.qrc
include(Etalons/qmake/ccache.pri)
VERSION = 1.2.1

View File

@ -1,26 +0,0 @@
#
# Copyright (C) 2018-2020 QuasarApp.
# Distributed under the lgplv3 software license, see the accompanying
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
#
!isEmpty(QUASARAPP_LIB):error("QuasarLib.pri already included")
QUASARAPP_LIB = 1
#DEPENDS
CONFIG(release, debug|release): {
QUASARAPP_LIB_OUTPUT_DIR="$$PWD/build/release"
} else {
QUASARAPP_LIB_OUTPUT_DIR="$$PWD/build/debug"
}
unix:LIBS += -L$$QUASARAPP_LIB_OUTPUT_DIR -lQuasarApp
win32:LIBS += -L$$QUASARAPP_LIB_OUTPUT_DIR -lQuasarApp1
INCLUDEPATH += "$$PWD/"
include(Etalons/qmake/ccache.pri);

101
README.md
View File

@ -1,63 +1,68 @@
# QuasarAppLib # QuasarAppLib
Global function for quasar app. Global functions used in applications QuasarApp.
This lib include base functions for the all applications of QuasarApp group. This lib include include next modules:
All methods of the Quasar AppUtils is static
* parseParams - parase input data of started application * Locales - This module use for parse local files. This module allows you to work with translations.
* argc - count of arguments * Params - This module use for parese app params and create log.
* argv - arrat of arguments * Settings - This is a module that allows you to work with application settings.
* return true if all arguments read else false * Global - This module contains other global functions.
------------------------
* getStrArg - get string value of key
* key
* return string value of argument
------------------------ ## Build
* getArg - get string value of key
* key
* return string value of argument
------------------------
* isEndable - check if enable argument of key * git clone https://github.com/QuasarApp/QuasarAppLib.git
* key * git submodule update --init --recursive
* return true if argument enabled * cd QuasarAppLib
* cmake -DCMAKE_PREFIX_PATH=Yuor/Qt/Dir/Path .
* make -j8
* make test #(for testing)
------------------------
* initLocale init translation of applictaion
* locale - string value of locale. example (en)
* app - app core of qt
* translator - translator core of qt
* return return true if locale funded
# QuasarAppLib ### Available build options:
Глобальная функция для приложений quasar.
Эта библиотека включает базовые функции для всех приложений группы QuasarApp.
Все методы Quasar AppUtils являются статическими
* parseParams - парсит входные данные запускаемого приложения ```cmake
* argc - количество аргументов option(QA_ALLOW_NOT_SUPPORTED_OPTIONS "Enable for allow any command line options" ON)
* argv - аргумент аргументов option(QA_DISABLE_LOG "Disabled all logs (force sets verbose to 0)" OFF)
* вернет true, если все аргументы прочитаны верно иначе false
------------------------ ```
* getStrArg - получить строковое значение ключа
* возвращаемое строковое значение аргумента
------------------------ ## Include
* getArg - получить строковое значение ключа #### The cmake build do not required Qt libraries.
* возвращаемое строковое значение аргумента
------------------------ * cd yourRepo
* git submodule add https://github.com/QuasarApp/QuasarAppLib.git # add the repository of QtBigInt into your repo like submodule
* git submodule update --init --recursive
* Include in your CMakeLists.txt file the main CMakeLists.txt file of QuasarAppLib library
>> add_subdirectory(QuasarAppLib)
* Rebuild yuor project
* isEndable - проверить, разрешен ли аргумент ключа ```cmake
* вернет true, если аргумент включен add_subdirectory(QuasarAppLib)
target_link_libraries(MyBinary PUBLIC QuasarApp)
```
------------------------ ### Note
* initLocale инициализирует перевод приложения
* locale - строковое значение locale. пример (en) By Default QuasarAppLib makes as a static library. If you want to create a shared library just add the BUILD_SHARED_LIBS into your main CMakeLists.txt file.
* app - ядро приложения qt Example :
* translator - ядро переводчика qt
* вернет true, если все аргументы прочитаны верно иначе false ```cmake
set(BUILD_SHARED_LIBS ON)
add_subdirectory(QuasarAppLib)
target_link_libraries(MyBinary PUBLIC QuasarApp)
```
# Usage
```cpp
#include <quasarapp.h>
if (!QuasarAppUtils::Params::parseParams(argc, argv)) {
QuasarAppUtils::Params::log("Warning message", QuasarAppUtils::Warning);
QuasarAppUtils::Params::showHelp();
exit(0);
}
```

83
crc32constexper.h Normal file
View File

@ -0,0 +1,83 @@
/*
* Copyright (C) 2025-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef CRC32CONSTEXPER_H
#define CRC32CONSTEXPER_H
#include <array>
#include <cstddef>
#include <cstdint>
namespace QuasarAppUtils {
/**
* @brief generateCrc32Table This method generate crc32 table for fast calculate crc32 hash.
* @param polynomial This is polynomial for crc32 hash.
* @return return table for fast calculate crc32 hash.
* @note This method is constexpr and available in compile time.
*/
constexpr std::array<uint32_t, 256> generateCrc32Table(uint32_t polynomial = 0xEDB88320) {
std::array<uint32_t, 256> table{};
for (uint32_t i = 0; i < 256; ++i) {
uint32_t crc = i;
for (int j = 0; j < 8; ++j) {
crc = (crc >> 1) ^ (-(crc & 1) & polynomial);
}
table[i] = crc;
}
return table;
}
/**
* @brief crc32Table This is crc32 table for fast calculate crc32 hash.
* @note This table is used for fast calculate crc32 hash.
*/
constexpr std::array<uint32_t, 256> crc32Table = generateCrc32Table();
/**
* @brief calculateCrc32 This method calculate crc32 hash for data.
* @param data This is data for calculate crc32 hash.
* @param size This is size of data.
* @param initialCrc This is initial crc value.
* @return return crc32 hash for data.
* @note This method is constexpr and available in compile time.
*/
constexpr uint32_t calculateCrc32(const char* data, size_t size, uint32_t initialCrc = 0xFFFFFFFF) {
uint32_t crc = initialCrc;
for (size_t i = 0; i < size; ++i) {
crc = crc32Table[(crc ^ data[i]) & 0xFF] ^ (crc >> 8);
}
return crc ^ 0xFFFFFFFF;
}
/**
* @brief calculateCrc16 This method calculate crc16 hash for data.
* @param data This is data for calculate crc16 hash.
* @param size This is size of data.
* @param initialCrc This is initial crc value.
* @return return crc16 hash for data.
* @note This method is constexpr and available in compile time.
*/
constexpr uint16_t calculateCrc16(const char* data, size_t size, uint32_t initialCrc = 0xFFFFFFFF) {
return calculateCrc32(data, size, initialCrc) % 0xFFFF;
}
/**
* @brief calculateCrc8 This method calculate crc8 hash for data.
* @param data This is data for calculate crc8 hash.
* @param size This is size of data.
* @param initialCrc This is initial crc value.
* @return return crc8 hash for data.
* @note This method is constexpr and available in compile time.
*/
constexpr uint16_t calculateCrc8(const char* data, size_t size, uint32_t initialCrc = 0xFFFFFFFF) {
return calculateCrc32(data, size, initialCrc) % 0xFF;
}
}
#endif // CRC32CONSTEXPER_H

2496
doxygen.conf Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
#include "global.h"

View File

@ -1,67 +0,0 @@
#ifndef GLOBAL_H
#define GLOBAL_H
#include <cstdlib>
#include <type_traits>
template <typename T>
constexpr inline T operator | (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) | static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator & (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) & static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator >> (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) >> static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator << (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) << static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator ~ (T lhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(~static_cast<int>(lhs));
}
template <typename T>
constexpr inline T operator ^ (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) ^ static_cast<int>(rhs));
}
#endif // GLOBAL_H

108
helpdata.cpp Normal file
View File

@ -0,0 +1,108 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "helpdata.h"
#include <iostream>
#ifdef Q_OS_WIN32
#include <windows.h>
#else
#include <sys/ioctl.h>
#include <unistd.h>
#endif
namespace QuasarAppUtils {
namespace Help {
static int MAX_LENGTH = -1;
static int SectionMargin = 2;
#define EXPANDER(COUNT, ITEM) QString(COUNT, ITEM).toStdString()
#define SPACES(X) EXPANDER(X, ' ')
#define SECTION_MARGIN SPACES(SectionMargin)
#define WIDTH ((MAX_LENGTH > 10)? MAX_LENGTH: width())
/*
* @brief print This method prints the one line of the help.
* @param key This is Option name.
* @param value This is Description of option.
* @param keyLength This is length of the current line.
* This is private method of the QuasarAppLibrary.
*/
void print(const QString& key, const QString& value, int keyLength) {
auto diffExpander = QString(keyLength - key.size(), ' ');
std::cout << SECTION_MARGIN << key.toStdString() << diffExpander.toStdString() << ":";
QString expander(keyLength + SectionMargin, ' ');
auto words = value.split(" ");
int currentLength = std::max(keyLength, static_cast<int>(key.size()));
for (const auto& word : words) {
if (currentLength + 2 + word.size() < WIDTH) {
std::cout << " " << word.toStdString();
currentLength += 2 + word.size();
} else {
std::cout << std::endl << expander.toStdString() << ":";
currentLength = keyLength;
std::cout << " " << word.toStdString();
currentLength += 2 + word.size();
}
}
}
void print(const QuasarAppUtils::Help::Options &oprionsList) {
int maxLength = 0;
for (auto line = oprionsList.begin(); line != oprionsList.end(); ++line) {
if (line.key().size() > maxLength)
maxLength = line.key().size();
}
maxLength = std::min(WIDTH / 3, maxLength);
for (auto line = oprionsList.begin(); line != oprionsList.end(); ++line) {
print(line.key(), line.value(), maxLength + SectionMargin);
std::cout << std::endl;
}
}
void print(const Section &help) {
for (auto line = help.begin(); line != help.end(); ++line) {
QString expander(WIDTH, '-');
std::cout << line.key().toStdString() << std::endl;
std::cout << expander.toStdString() << std::endl;
print(line.value());
std::cout << std::endl << expander.toStdString() << std::endl;
}
}
void setLineLength(int newLength) {
MAX_LENGTH = newLength;
}
int width() {
#ifdef Q_OS_WIN32
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
return csbi.srWindow.Right - csbi.srWindow.Left + 1;
#else
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
return w.ws_col;
#endif
}
}
}

80
helpdata.h Normal file
View File

@ -0,0 +1,80 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef HELPDATA_H
#define HELPDATA_H
#include <QMap>
#include "quasarapp_global.h"
namespace QuasarAppUtils{
/**
* @brief Help namespace contains functions for printing help in to console. All Print fucntions automaticly calc width of the console and aligns the text to fit the window.
*/
namespace Help {
/**
* @brief Options this is list of **key-descriptions** pairs of help.
* The **key** is name of the available argument and **description** is description of the available argument.
*
* **Example**:
*
* @code{cpp}
* Options myOptionsList = {{"argument1", "This is test argumetn1 of my application."},
* {"argument2", "This is test argumetn2 of my application."}};
*
* @endcode
*/
typedef QMultiMap<QString, QString> Options;
/**
* @brief Section This is list of the help Sections. The one section it is Title of the section and Help::Options list.
*
* **Example:**
* @code{cpp}
* Options myOptionsList = {{"argument1", "This is test argumetn1 of my application."},
* {"argument2", "This is test argumetn2 of my application."}};
* Section mySections = {{"This Is main section of the help", myOptionsList}};
* QuasarAppUtils::Help::print(mySections);
* @endcode
*/
typedef QMultiMap<QString, Options> Section;
/**
* @brief Charters is wraper of the Section type.
* @warning This type is depricated. Use the Help:Section type.
*/
typedef Section Charters;
/**
* @brief width This method return current width of the cosole window.
* @return width in pxels of the cosole window.
*/
int width();
/**
* @brief print This method print a one options list.
* @param oprionsList This is options list.
*/
void QUASARAPPSHARED_EXPORT print(const Options& oprionsList);
/**
* @brief print This method print all sections of the help.
* @note This is main method for printing helps.
* @param help This is sections list.
*/
void QUASARAPPSHARED_EXPORT print(const Section& help);
/**
* @brief setLineLength sets new length of the help line (width of the console window). If you set this into -1 then the window width will be selected automatically.
* @param newLength This is a new size of the console window.
*/
void QUASARAPPSHARED_EXPORT setLineLength(int newLength);
}
}
#endif // HELPDATA_H

18
humanreadableobject.cpp Normal file
View File

@ -0,0 +1,18 @@
//#
//# Copyright (C) 2022-2025 QuasarApp.
//# Distributed under the GPLv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#include "humanreadableobject.h"
namespace QuasarAppUtils{
HumanReadableObject::HumanReadableObject()
{
}
}

39
humanreadableobject.h Normal file
View File

@ -0,0 +1,39 @@
//#
//# Copyright (C) 2022-2025 QuasarApp.
//# Distributed under the GPLv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#ifndef HUMANREADABLEOBJECT_H
#define HUMANREADABLEOBJECT_H
#include <QString>
#include "quasarapp_global.h"
namespace QuasarAppUtils {
/**
* @brief The HumanReadableObject interface This is simple class that add one virtula method toString.
* All childs object should be override this method.
*/
class QUASARAPPSHARED_EXPORT HumanReadableObject
{
public:
/**
* @brief toString This method convert this object to human readable string.
* @return human readable string of this object.
*/
virtual QString toString() const = 0;
protected:
HumanReadableObject();
};
/**
* @brief iHRO This is short abriviature of the HumanReadableObject class.
*/
typedef HumanReadableObject iHRO;
}
#endif // HUMANREADABLEOBJECT_H

128
isettings.cpp Normal file
View File

@ -0,0 +1,128 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "isettings.h"
#include <QSettings>
#include <QCoreApplication>
#include "qaglobalutils.h"
namespace QuasarAppUtils {
ISettings::ISettings(SettingsSaveMode mode) {
_mode = mode;
}
ISettings::~ISettings() {
if (_defaultConfig)
delete _defaultConfig;
}
void ISettings::clearCache() {
_cache.clear();
}
QHash<QString, QVariant> &ISettings::settingsMap() {
if (!_defaultConfig)
_defaultConfig = new QHash<QString, QVariant>(defaultSettings());
return *_defaultConfig;
}
SettingsSaveMode ISettings::getMode() const {
return _mode;
}
void ISettings::setMode(const SettingsSaveMode &mode) {
_mode = mode;
}
ISettings *ISettings::instance() {
return Service<ISettings>::instance();
}
bool ISettings::initService(std::unique_ptr<ISettings> obj) {
return Service<ISettings>::initService(std::move(obj));
}
QVariant ISettings::getValue(const QString &key, const QVariant &def) {
debug_assert(key.size(), "You can't use the empty key value!");
if (!_cache.contains(key)) {
QVariant defVal = def;
if (defVal.isNull()) {
defVal = settingsMap().value(key);
}
_cache[key] = getValueImplementation(key, def);
}
return _cache[key];
}
QString ISettings::getStrValue(const QString &key, const QString &def) {
if (def.isEmpty()) {
return getValue(key).toString();
}
return getValue(key, QVariant(def)).toString();
}
void ISettings::resetToDefault() {
auto &defaultConfig = settingsMap();
for (auto it = defaultConfig.begin(); it != defaultConfig.end(); ++it) {
if (!ignoreToRest(it.key()))
setValue(it.key(), defaultConfig.value(it.key()));
}
}
bool ISettings::ignoreToRest(const QString &) const {
return false;
}
void ISettings::sync() {
for (auto it = _cache.begin(); it != _cache.end(); ++it) {
setValueImplementation(it.key(), it.value());
}
return syncImplementation();
}
void ISettings::forceReloadCache() {
auto &defaultConfig = settingsMap();
for (auto it = defaultConfig.begin(); it != defaultConfig.end(); ++it) {
setValue(it.key(), getValueImplementation(it.key(), it.value()));
}
}
void ISettings::setValue(const QString &key, const QVariant &value) {
debug_assert(key.size(), "You can't use the empty key value!");
if (_cache.contains(key) && _cache.value(key) == value) {
return;
}
_cache[key] = value;
emit valueChanged(key, value);
emit valueStrChanged(key, value.toString());
if (_mode == SettingsSaveMode::Auto) {
setValueImplementation(key, value);
}
}
void ISettings::setStrValue(const QString &key, const QString &value) {
setValue(key, value);
}
}

230
isettings.h Normal file
View File

@ -0,0 +1,230 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef ISETTINGS_H
#define ISETTINGS_H
#include "qaservice.h"
#include "quasarapp_global.h"
#include <QObject>
#include <QVariant>
class QSettings;
namespace QuasarAppUtils {
/**
* @brief The SettingsSaveMode enum
*/
enum class SettingsSaveMode: quint64 {
/// a settings will be saved on hard disk when called the Settings::setValue method.
Auto,
/// a settings will be saved on hard disk when called the Settings::Sync method.
Manual
};
/**
* @brief The Settings class base interface for implementation settings backends.
* Available implementations:
* Setting (based on QSettings backend)
* @note This is singleton object.
*
* @note The all child classes should be initialized before used.
*
* @code{cpp}
* auto settingsInstance = Setting::initService<Setting>();
* @endcode
*
* @see ISettings::init method.
*
*/
class QUASARAPPSHARED_EXPORT ISettings : public QObject, public Service<ISettings>
{
Q_OBJECT
public:
~ISettings() override;
/**
* @brief getValue This method return the value of the settings.
* @param key This is name of the required settings value.
* @param def This is default value if a value is not finded. If this params will be skipped, then The Settngs model try find default value in the defaultSettings map.
* @return value of a @a key
* @see ISettings::defaultSettings
*/
Q_INVOKABLE QVariant getValue(const QString &key, const QVariant& def = {});
/**
* @brief getStrValue some as getValue but convert result object to QString type.
* @param key This is name of the required settings value.
* @param def This is default value if a value is not finded. If this params will be skipped, then The Settngs model try find default value in the defaultSettings map.
* @return value of a @a key
* @see ISettings::defaultSettings
* @warning If you set a def arguments to empty string then this method will return default value from the defaultSettings map.
*/
Q_INVOKABLE QString getStrValue(const QString &key, const QString& def = {});
/**
* @brief resetToDefault This method reset all settings to default values.
*/
Q_INVOKABLE void resetToDefault();
/**
* @brief ignoreToRest This method should be returns true if the @a key setting is not be reset on the resetToDefault method.
* @param key This is keuy value.
* @return true if the @a key option can't be reset to default.
* The default implementaion alwayes return false.
*/
virtual bool ignoreToRest(const QString& key) const;
/**
* @brief sync This method save all setings data on a hard disk;
*/
void sync();
/**
* @brief forceReloadCache This method force reload settings data from disk.
* @note Cache will be refreshed
*/
void forceReloadCache();
/**
* @brief getMode This method return the current mode of the settings.
* @return the current mode of the settings.
*/
SettingsSaveMode getMode() const;
/**
* @brief setMode This method sets a new value of the settings mode.
* @param mode This is a new value of the settings mode.
*/
void setMode(const SettingsSaveMode &mode);
/**
* @brief instance This method returns pointer to current settings object.
* @return pointer to current settings object.
* @see Service::instance
*/
static ISettings* instance();
/**
* @brief initService This method initialize the global settings object.
* @param obj This is prepared settings object. You should create a your object monyaly, and add to initialization
* @code{cpp}
* bool result = initService(std::make_unique<MySettings>());
* @endcode
* @return true if initialization finished successful else false.
* @see Service::initService
*/
static bool initService(std::unique_ptr<ISettings> obj);
public slots:
/**
* @brief setValue This slot sets new value for a @a key setting
* @param key This is name of the changed setting.
* @param value This is a new value of the setting
*/
void setValue(const QString &key, const QVariant& value);
/**
* @brief setStrValue This is some as setValue but working with the QString type.
* @param key This is name of the changed setting.
* @param value This is a new value of the setting
*/
void setStrValue(const QString& key, const QString& value);
signals:
/**
* @brief valueChanged This signal when value of the @a key settings changed
* @param key This is name of change setting.
* @param value This is a new value of @a key.
*/
void valueChanged(QString key, QVariant value);
/**
* @brief valueStrChanged some as valueChanged(QString key, QVariant value) but value has ben converted to the QString type.
* @param key This is name of change setting.
* @param value This is a new value of @a key.
*/
void valueStrChanged(QString key, QString value);
protected:
explicit ISettings(SettingsSaveMode mode = SettingsSaveMode::Auto);
/**
* @brief defaultSettings This method must be return default map of the settings and them values. If the default value argument in a getValue method will be skipped, then settings model try find a default value in this map.
* @return The default settings map.
* @see ISettings::getValue
* **example:** example of implementation of this method:
*
* @code{cpp}
*
QHash<QString, QVariant> SettingsModel::defaultSettings() {
QHash<QString, QVariant> settings;
settings["colorTheme"] = "#ff6b01";
settings["shareName"] = true;
settings["devSettingEnable"] = false;
settings["host"] = "";
settings["APIVersion"] = 2;
return settings;
}
* @endcode
*/
virtual QHash<QString, QVariant> defaultSettings() = 0;
/**
* @brief syncImplementation This method should save all configuration data to the hard drive;
*/
virtual void syncImplementation() = 0;
/**
* @brief getValueImplementation This method will return the value of the settings.
* @param key This is name of the required settings value.
* @param def This is default value if a value is not finded.
* @return value of a @a key
*/
virtual QVariant getValueImplementation(const QString &key, const QVariant& def) = 0;
/**
* @brief setValueImplementation This slot will set a new value for the @a key parameter.
* @param key This is name of the changed setting.
* @param value This is a new value of the setting
*/
virtual void setValueImplementation(const QString key, const QVariant& value) = 0;
/**
* @brief clearCache This method clear all data from cache.
*/
void clearCache();
/**
* @brief settingsMap This method returns initialized settings map.
* Settings map contains pairs with settings key and default value.
* @return initialized settings map.
* @see ISettings::defaultSettings method
*/
QHash<QString, QVariant>& settingsMap();
private:
SettingsSaveMode _mode = SettingsSaveMode::Auto;
QHash<QString, QVariant> _cache;
QHash<QString, QVariant> *_defaultConfig = nullptr;
friend class Service<ISettings>;
};
};
#endif // ISETTINGS_H

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
@ -11,22 +11,234 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QTranslator> #include <QTranslator>
#include <QLocale> #include <QLocale>
#include <QLibraryInfo>
#include <QRegularExpression>
#include <QLocale>
#include <QMap>
using namespace QuasarAppUtils; using namespace QuasarAppUtils;
bool QuasarAppUtils::Locales::findQmPrivate(const QString &prefix,
QList<QTranslator*> &qmFiles) {
bool Locales::initLocale(const QString& prefix, const QString &locale, QCoreApplication *app, QTranslator *translator){ for (const auto &location: std::as_const(_locations)) {
QString defaultLocale = QLocale::system().name(); const auto availableFiles = QDir(location).entryInfoList(
defaultLocale.truncate(defaultLocale.lastIndexOf('_')); {prefix + ".qm"}, QDir::Files);
if(!locale.isEmpty() && translator->load(QString("%0/%1").arg(prefix, locale))) { for (const auto &file : availableFiles) {
return app->installTranslator(translator); auto qmFile = new QTranslator();
if(!qmFile->load(file.absoluteFilePath())) {
qWarning() << "Failed to load translation file : "
+ file.absoluteFilePath();
delete qmFile;
continue;
}
if (qmFile->isEmpty()) {
qDebug() << "Translation file is Empty: " +
file.absoluteFilePath();
delete qmFile;
continue;
}
auto language = qmFile->language();
if (language.size() && !language.contains(prefix, Qt::CaseInsensitive)) {
auto message = QString("The target language (%0) and a choosed qm file (%1) "
"is different, Loading will be skiped: ").
arg(language, file.absoluteFilePath());
qDebug() << message;
delete qmFile;
continue;
}
qmFiles += qmFile;
}
} }
return qmFiles.size();
if(!translator->load(QString("%0/%1").arg(prefix, defaultLocale))) { }
return false;
} bool QuasarAppUtils::Locales::findQm(QString localePrefix,
QList<QTranslator *> &qmFiles) {
return app->installTranslator(translator);
if (localePrefix.size() < 2) {
if (localePrefix.compare('c', Qt::CaseInsensitive) == 0) {
return findQmPrivate("en", qmFiles);
}
return false;
} else if (localePrefix.size() >= 4) {
return findQmPrivate(localePrefix.replace('-', '_'), qmFiles);
}
return findQmPrivate(localePrefix, qmFiles);
}
void QuasarAppUtils::Locales::installTranslations( QList<QTranslator *> &qmFiles)
{
for (const auto & translator: std::as_const(qmFiles)) {
if (!QCoreApplication::installTranslator(translator)) {
qWarning() << "Failed to install translation file : " + translator->filePath();
delete translator;
// we use a link of qmFiles so remove all invalid translations.
qmFiles.removeAll(translator);
continue;
}
}
}
QString Locales::translatePrivate(const char *source, const QLocale &locale) {
auto translations = _translations.value(locale);
for (const auto& tr : translations) {
auto result = tr->translate("QuasarAppUtils::Locales", source);
if (result.size()) {
return result;
}
}
return source;
}
bool Locales::setLocalePrivate(const QLocale &locale, bool force, bool install) {
if (force) {
clearCache(locale);
}
removeOldTranslation(_currentLocate);
// take a link to list of translations.
QList<QTranslator *> &qmFiles = _translations[locale];
if (qmFiles.isEmpty()) {
// fill list of translations
const auto list = locale.uiLanguages();
auto it = list.rbegin();
while (qmFiles.isEmpty() && it != list.rend() && !findQm(*it, qmFiles)) {
it++;
}
if (qmFiles.isEmpty())
return false;
}
if (install)
installTranslations(qmFiles);
emit sigTranslationChanged();
_currentLocate = locale;
return _translations[locale].size();
}
const QLocale &Locales::currentLocate() {
auto obj = instance();
return obj->currentLocatePrivate();
}
QString Locales::tr(const char *source, const QLocale &locale) {
auto obj = instance();
return obj->translatePrivate(source, locale);
}
bool Locales::setLocale(const QLocale &locale, bool force) {
auto obj = instance();
return obj->setLocalePrivate(locale, force);
}
bool Locales::init(const QList<QLocale> &locales, const QSet<QString> &location) {
auto obj = instance();
return obj->initPrivate(locales, location);
}
bool Locales::init(const QLocale &locale, const QSet<QString> & location) {
auto obj = instance();
return obj->initPrivate(locale, location);
}
bool Locales::initPrivate(const QLocale &locale, const QSet<QString> & locations) {
#if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0)
auto defaultTr = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
#else
auto defaultTr = QLibraryInfo::path(QLibraryInfo::TranslationsPath);
#endif
_locations = locations;
if (!_locations.contains(defaultTr)) {
_locations += defaultTr;
}
return setLocalePrivate(locale);
}
bool Locales::initPrivate(const QList<QLocale> &locales, const QSet<QString> &locations) {
#if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0)
auto defaultTr = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
#else
auto defaultTr = QLibraryInfo::path(QLibraryInfo::TranslationsPath);
#endif
_locations = locations;
if (!_locations.contains(defaultTr)) {
_locations += defaultTr;
}
for (const auto& locale: locales) {
if (!setLocalePrivate(locale, false, false)) {
return false;
}
}
return true;
}
void Locales::clearCache(const QLocale &locale) {
for (const auto & tr :std::as_const(_translations[locale])) {
QCoreApplication::removeTranslator(tr);
delete tr;
}
_translations[locale].clear();
}
void Locales::clearCache() {
for (auto it = _translations.keyBegin(); it != _translations.keyEnd(); it = std::next(it)) {
clearCache(*it);
}
_translations.clear();
}
Locales *Locales::instance() {
static auto instance = new Locales();
return instance;
}
void Locales::removeOldTranslation(const QLocale &locale) {
for (const auto & tr :std::as_const(_translations[locale])) {
QCoreApplication::removeTranslator(tr);
}
}
void Locales::addLocationPrivate(const QString &location) {
_locations += location;
}
const QLocale &Locales::currentLocatePrivate() const {
return _currentLocate;
}
void Locales::addLocation(const QString &location) {
auto obj = instance();
obj->addLocationPrivate(location);
}
Locales::~Locales() {
clearCache();
} }

117
locales.h
View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
@ -11,6 +11,11 @@
#include "quasarapp_global.h" #include "quasarapp_global.h"
#include <QLocale>
#include <QSet>
#include <QString>
#include <QDir>
class QCoreApplication; class QCoreApplication;
class QTranslator; class QTranslator;
@ -18,21 +23,113 @@ namespace QuasarAppUtils {
/** /**
* @brief The Locales class for parese local files * @brief The Locales class for parese local files
* **Example :**
* @code{cpp}
* QuasarAppUtils::Locales::init();
* @endcode
*
* @note If you want to add you own location of the qm files then add this into seccond arguments of the Locales::init method.
*
* @code{cpp}
* QuasarAppUtils::Locales::init(QLocale::system(), "myPath");
* @endcode
*
* @note All translations qm files should be named with lower case example : en.qm
*/ */
class QUASARAPPSHARED_EXPORT Locales class QUASARAPPSHARED_EXPORT Locales : public QObject
{ {
Q_OBJECT
public: public:
Locales() = delete;
/** /**
* @brief initLocale init translation of applictaion * @brief setLocale This method sets locale for application and loaded all translations for this locale.
* @param prefix - path to folder with qm files. example (/home) * @param locale This is new locale.
* @param locale - string value of locale. example (en) * @return true if the all ltranstations files loaded successful.
* @param app - app core of qt
* @param translator - translator core of qt
* @return return true if locale funded
*/ */
static bool initLocale(const QString& prefix ,const QString &locale, QCoreApplication* app, QTranslator *translator); static bool setLocale(const QLocale &locale, bool force = false);
/**
* @brief init This method initialize translations of applictaion.
* @param locales This is list of locales that you want to locad to application cache. See info about QLocale.
* @param location Path to folder with qm files. example (:/tr).
* @return return true if locale set for application.
*/
static bool init(const QList<QLocale> & locales,
const QSet<QString> & location = {});
/**
* @brief init This method initialize translation of applictaion.
* @param locale See info about QLocale.
* @param location Path to folder with qm files. example (:/tr).
* @return return true if locale set for application.
*/
static bool init(const QLocale &locale = QLocale::system(),
const QSet<QString> & location = {});
/**
* @brief addLocation This method add location for qm files. Use This method if you create a own library with translations supports.
* @param location This is a new location of the qm files.
*/
static void addLocation(const QString& location);
/**
* @brief instance This method return pointer to the Locales service.
* @return return pointer to the Locales static object
*/
static Locales *instance();
/**
* @brief currentLocate This method return current locate of applicatuon.
* @return current or last sets locate of applciation.
*/
static const QLocale &currentLocate();
/**
* @brief tr This method will translate single string to choosed language.
* @param source This is source string of translations.
* @param locale This is choosed language.
* @return translated string value.
* @note use instant QOBject::tr, This method must be read by the lupdate utility
*/
static QString tr(const char *source, const QLocale& locale);
signals:
/**
* @brief sigTranslationChanged Emited when set new locale for application.
*/
void sigTranslationChanged();
private:
Locales() = default;
~Locales();
bool setLocalePrivate(const QLocale &locale = QLocale::system(), bool force = false, bool install = true);
bool initPrivate(const QLocale &locale = QLocale::system(),
const QSet<QString> &location = {});
bool initPrivate(const QList<QLocale> &locales,
const QSet<QString> &location = {});
void clearCache(const QLocale& locale);
void clearCache();
void removeOldTranslation(const QLocale& locale);
void addLocationPrivate(const QString& location);
const QLocale &currentLocatePrivate() const;
bool findQm(QString localePrefix,
QList<QTranslator *> &result);
bool findQmPrivate(const QString &prefix,
QList<QTranslator *> &qmFiles);
void installTranslations(QList<QTranslator *> &qmFiles);
QString translatePrivate(const char *source, const QLocale& locale);
QLocale _currentLocate;
QSet<QString> _locations;
QHash<QLocale, QList<QTranslator *>> _translations;
}; };
} }

90
optiondata.cpp Normal file
View File

@ -0,0 +1,90 @@
/*
* Copyright (C) 2021-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "optiondata.h"
namespace QuasarAppUtils{
OptionData::OptionData(const QStringList& name,
const QString& arguments,
const QString& description,
const QString& example,
const QString& depricatedMsg,
bool removed) {
setNames(name);
setArguments(arguments);
setDescription(description);
setExample(example);
setDepricatedMsg(depricatedMsg);
_removed = removed;
}
const QStringList &OptionData::names() const {
return _name;
}
void OptionData::setNames(const QStringList &newName) {
_name = newName;
}
const QString &OptionData::description() const {
return _description;
}
void OptionData::setDescription(const QString &newDescription) {
_description = newDescription;
}
const QString &OptionData::example() const {
return _example;
}
void OptionData::setExample(const QString &newExample) {
_example = newExample;
}
const QString &OptionData::arguments() const {
return _arguments;
}
void OptionData::setArguments(const QString &newArguments) {
_arguments = newArguments;
}
const QString &OptionData::depricatedMsg() const {
return _depricatedMsg;
}
void OptionData::setDepricatedMsg(const QString &newDepricatedMsg) {
_depricatedMsg = newDepricatedMsg;
}
bool OptionData::isRemoved() const {
return _removed;
}
bool OptionData::isDepricated() const {
return depricatedMsg().size();
}
Help::Options OptionData::toHelp() const {
QString left = names().join(" / ") + " " + arguments();
QString right = description();
if (example().size()) {
right += " Example: " + example();
}
return {{left, {right}}};
}
bool OptionData::isValid() const {
return names().size();
}
}

152
optiondata.h Normal file
View File

@ -0,0 +1,152 @@
/*
* Copyright (C) 2021-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef OPTIONDATA_H
#define OPTIONDATA_H
#include "quasarapp_global.h"
#include "helpdata.h"
namespace QuasarAppUtils{
/**
* @brief The OptionData class contains information about one option.
*/
class QUASARAPPSHARED_EXPORT OptionData
{
public:
/**
* @brief OptionData This is main constructor
* @param names This is names list of the option. It is a required argument and cannot be empty.
* @param arguments This is input arguments of this option or help meesage about arguments.
* @param description This is description message of this option.
* @param example This is example of use string.
* @param depricatedMsg This is a message that will be printed as a warning if user will use this option. If you set this argument to empty value then warning message will be ignored and option not be marked asa a depricated. An option will be marked as a depricated when this arguments will not equal empty string.
* @param removed This option show depricatedMsg as a error and force the parseParams method return false. This option will be ignored if the depricatedMsg will be empty.
*/
OptionData(const QStringList& names,
const QString& arguments = "",
const QString& description = "",
const QString& example = "",
const QString& depricatedMsg = "",
bool removed = false);
/**
* @brief name This is name of the option. It is a required argument and cannot be empty.
* @return return name of this option.
*/
const QStringList &names() const;
/**
* @brief description This is description message of this option.
* @return return description of this option.
*/
const QString &description() const;
/**
* @brief example This is example of use string.
* @return return example if use of this option.
*/
const QString &example() const;
/**
* @brief arguments This is input arguments of this option or help meesage about arguments.
* @return return arguments of this option.
*/
const QString &arguments() const;
/**
* @brief depricatedWarning This is a message that will be printed as a warning if user will use this option. If you set this argument to empty value then warning message will be ignored and option not be marked asa a depricated. An option will be marked as a depricated when this arguments will not equal empty string.
* @note if this value is empty the option are not depricated.
* @return warning meessage of the depricated options.
*/
const QString &depricatedMsg() const;
/**
* @brief toHelp This method convert this option into help line.
* The help line have next structure :
*
* Key: {name [arguments]}
* Value: {description examples}
* @return The Help::Options set with one line.
*/
Help::Options toHelp() const;
/**
* @brief isValid This method return true if the option is valid. If option do not contain a name then it is invalid.
* @return true if the option valid else false.
*/
bool isValid() const;
/**
* @brief isRemoved This method return true if the option is removed.
* @return true if option is removed else false.
*/
bool isRemoved() const;
/**
* @brief isDepricated This method return true if this option is depricated.
* @return true if options is depricated else false
*/
bool isDepricated() const;
protected:
/**
* @brief setNames This method sets new value of the option name.
* @param newNames This is a new value of the options name.
* @note see the OptionData::name method.
*/
void setNames(const QStringList &newNames);
/**
* @brief setDescription This method sets new description of this options.
* @param newDescription This is new value of optons description
* @note See the OptionData::description method.
*/
void setDescription(const QString &newDescription);
/**
* @brief setExample This method sets a new example value of this option
* @param newExample This is a new value of the options example.
* @note See the OptionData::example method.
*/
void setExample(const QString &newExample);
/**
* @brief setArguments This method sets new value of the options arguments
* @param newArguments new value of the options arguments
* @note See the OptionData::arguments method.
*/
void setArguments(const QString &newArguments);
/**
* @brief setDepricatedMsg This method sets new value of the depricated warnning message of this option.
* @param newDepricatedMsg This is new value of the depricated message.
* @note See the OptionData::depricatedMsg method.
*/
void setDepricatedMsg(const QString &newDepricatedMsg);
private:
QStringList _name;
QString _description;
QString _example;
QString _arguments;
QString _depricatedMsg;
bool _removed;
};
/**
* @brief OptionsList is Hash map of the OptionData items. Where the key it is group name and value it is option data.
*/
typedef QMultiHash<QString, OptionData> OptionsDataList;
}
#endif // OPTIONDATA_H

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
@ -9,188 +9,178 @@
#include <QVariantMap> #include <QVariantMap>
#include <QDebug> #include <QDebug>
#include <QFileInfo> #include <QFileInfo>
#include <iostream>
#include <QDateTime> #include <QDateTime>
#include <QCoreApplication>
#include "qaglobalutils.h"
#include <QtLogging>
#ifdef Q_OS_DARWIN
#include <mach-o/dyld.h>
#endif
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#include "windows.h" #include "windows.h"
#else #else
#include <unistd.h> #include <unistd.h>
#include <limits.h>
#endif #endif
using namespace QuasarAppUtils; using namespace QuasarAppUtils;
QMap<QString, QString> Params::params = QMap<QString, QString>();
QString Params::appPath = "";
QString Params::appName = "";
Help::Section Params::userHelp = {};
OptionsDataList Params::inputOptions = {};
static QVariantMap params = QVariantMap();
bool Params::isEndable(const QString& key) { bool Params::isEndable(const QString& key) {
return params.contains(key); return params.contains(key);
} }
void Params::verboseLog(const QString &log, VerboseLvl vLvl) { void Params::log(const QString &log, VerboseLvl vLvl) {
writeLoginFile(log, vLvl); auto lvl = getVerboseLvl();
if (vLvl <= lvl) {
if (isEndable("verbose")) { switch (vLvl) {
auto lvl = static_cast<VerboseLvl>(getArg("verbose").toInt()); case VerboseLvl::Error:
qCritical().noquote() << log;
break;
if (vLvl <= lvl) { case VerboseLvl::Warning: {
qWarning().noquote() << log;
break;
}
case VerboseLvl::Debug: {
qDebug().noquote() << log;
break;
}
switch (vLvl) { case VerboseLvl::Info:
default: {
qInfo().noquote() << log;
break;
}
case VerboseLvl::Error: { }
qCritical() << lvlToString(vLvl) + ": " + log;
break; }
}
VerboseLvl Params::getVerboseLvl() {
return static_cast<VerboseLvl>(getArg("verbose", DEFAULT_VERBOSE_LVL).toInt());
}
bool Params::isDebug() {
return getVerboseLvl() >= VerboseLvl::Debug;
}
bool Params::isDebugBuild() {
#ifdef QT_DEBUG
return true;
#else
return false;
#endif
}
void Params::showHelp() {
if (inputOptions.size() > 1) {
showHelpForInputOptions();
} else {
Help::print(userHelp);
}
}
void Params::showHelpForInputOptions() {
Help::print(getHelpOfInputOptions());
}
Help::Section Params::getHelpOfInputOptions() {
if (inputOptions.size() <= 1 ) {
return {};
}
Help::Options help;
for (const auto &optionData: std::as_const(inputOptions) ) {
help.unite(optionData.toHelp());
}
return Help::Section{{"Information about using options", help}};
}
const Help::Section &Params::getHelp() {
return userHelp;
}
const QMap<QString, QString>& Params::getUserParamsMap() {
return params;
}
void Params::clearParsedData() {
params.clear();
appPath = "";
appName = "";
}
QString Params::getCurrentExecutable() {
return getCurrentExecutableDir() + "/" + appName;
}
QString Params::getCurrentExecutableDir() {
return appPath;
}
OptionsDataList Params::availableArguments() {
return OptionsDataList{
{
"Base Options",
OptionData{
{"-verbose"}, "(level 1 - 3)", "Shows debug log"
} }
case VerboseLvl::Warning: { },
qWarning() << lvlToString(vLvl) + ": " + log; {
break; "Base Options",
} OptionData{
{"-fileLog"}, "(path to file)", "Sets path of log file. Default it is path to executable file with suffix '.log'"
case VerboseLvl::Info: {
qInfo() << lvlToString(vLvl) + ": " + log;
break;
}
default: {
qDebug() << lvlToString(vLvl) + ": " + log;
break;
}
} }
} }
}
}
QStringList Params::getparamsHelp() {
return
{
{""},
{ " -verbose (level 1 - 3) : Shows debug log"},
{ " -fileLog (path to file) : Sets path of log file"},
{ " : Default it is path to executable file"},
{ " : with suffix '.log' "},
{ " noWriteInFileLog : Disables loging into file"},
{ ""}
}; };
} }
void Params::showHelp(const QStringList &help) {
for (const QString& line : help) {
std::cout << line.toStdString() << std::endl;
}
}
int Params::size() { int Params::size() {
return params.size(); return params.size();
} }
int Params::customParamasSize() { bool Params::optionsForEach(const QStringList &paramsArray,
return size() - 2; const OptionsDataList& availableOptions) {
}
QString Params::timeString() { for (int i = 0 ; i < paramsArray.size(); ++i) {
return QDateTime::currentDateTime().toString();
}
QString Params::lvlToString(VerboseLvl vLvl) { QStringList virtualOptionsList = paramsArray[i].split('=');
switch (vLvl) {
case VerboseLvl::Error: { if (virtualOptionsList.size() > 1) {
return "Error"; return optionsForEach(virtualOptionsList, availableOptions);
}
case VerboseLvl::Warning: {
return "Warning";
}
case VerboseLvl::Info: {
return "Info";
}
case VerboseLvl::Debug: {
return "Verbose log";
}
}
return "";
}
bool Params::writeLoginFile(const QString &log, VerboseLvl vLvl) {
if (!isEndable("noWriteInFileLog")) {
QString path = getStrArg("appPath") + "/" + getStrArg("appName") + ".log";
if (isEndable("fileLog")) {
QString path = getStrArg("fileLog");
} }
QFile logFile(path); auto optionData = availableOptions.value(paramsArray[i], {{}});
if (!checkOption(optionData, paramsArray[i])) {
if (logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
QTextStream stream(&logFile);
stream << timeString() <<"| " << lvlToString(vLvl) + ": " + log << endl;
logFile.close();
} else {
return false; return false;
} }
} inputOptions.insert(paramsArray[i], optionData);
return true;
}
bool Params::parseParams(int argc, const char *argv[]) {
QStringList params;
for (int i = 1; i < argc; i++) {
params.push_back(argv[i]);
}
return parseParams(params);
}
bool Params::parseParams(int argc, char *argv[]) {
return parseParams(argc, const_cast<const char**>(argv));
}
bool Params::parseParams(const QStringList &paramsArray) {
params.clear();
#ifdef Q_OS_WIN
char buffer[MAX_PATH];
memset(buffer, 0, sizeof buffer);
GetModuleFileNameA(nullptr, buffer, MAX_PATH);
params ["appPath"] = QFileInfo(buffer).absolutePath();
params ["appName"] = QFileInfo(buffer).fileName();
#else
char path[2048];
memset(path, 0, sizeof path);
if (readlink("/proc/self/exe", path, 2048) < 0) {
qWarning() << "parseParams can't get self path!" ;
return false;
}
params ["appPath"] = QFileInfo(path).absolutePath();
params ["appName"] = QFileInfo(path).fileName();
#endif
if (!getStrArg("appPath").size()) {
return false;
}
for (int i = 0 ; i < paramsArray.size(); ++i) {
if (paramsArray[i][0] == '-') { if (paramsArray[i][0] == '-') {
if (i < (paramsArray.size() - 1) && paramsArray[i + 1][0] != '-') { if (i < (paramsArray.size() - 1) && paramsArray[i + 1][0] != '-') {
params[paramsArray[i].mid(1)] = paramsArray[i + 1]; params[paramsArray[i].mid(1)] = paramsArray[i + 1];
i++; i++;
} else { } else {
qWarning() << "Missing argument for " + paramsArray[i] ; qCritical() << "Missing argument for " + paramsArray[i];
return false;
} }
} else { } else {
params[paramsArray[i]] = ""; params[paramsArray[i]] = "";
@ -200,15 +190,166 @@ bool Params::parseParams(const QStringList &paramsArray) {
return true; return true;
} }
QString Params::getStrArg(const QString& key, const QString &def) { bool Params::parseParams(const int argc, const char *argv[], const OptionsDataList& options) {
return params.value(key, def).toString();
QStringList params;
for (int i = 1; i < argc; i++) {
params.push_back(argv[i]);
}
return parseParams(params, options);
} }
QVariant Params::getArg(const QString& key,const QVariant& def) { bool Params::parseParams(int argc, char *argv[], const OptionsDataList& options) {
return parseParams(argc, const_cast<const char**>(argv), options);
}
bool Params::parseParams(const QStringList &paramsArray, const OptionsDataList &options) {
params.clear();
OptionsDataList availableOptions;
parseAvailableOptions(OptionsDataList{}.unite(options).unite(availableArguments()),
&availableOptions,
&userHelp);
#ifdef Q_OS_WIN
char buffer[MAX_PATH];
memset(buffer, 0, sizeof buffer);
GetModuleFileNameA(nullptr, buffer, MAX_PATH);
appPath = QFileInfo(buffer).absolutePath();
appName = QFileInfo(buffer).fileName();
#endif
#ifdef Q_OS_LINUX
char path[2048];
memset(path, 0, sizeof path);
if (readlink("/proc/self/exe", path, 2048) < 0) {
qCritical() << "parseParams can't get self path!";
return false;
}
appPath = QFileInfo(path).absolutePath();
appName = QFileInfo(path).fileName();
#endif
#ifdef Q_OS_DARWIN
uint32_t size = 0;
_NSGetExecutablePath(nullptr, &size); // request to buffer size
std::vector<char> buffer(size);
if (_NSGetExecutablePath(buffer.data(), &size) == 0) {
appPath = QString::fromUtf8(buffer.data());
} else {
appPath = QString();
}
appName = QCoreApplication::applicationName();
#endif
if (!appPath.size()) {
return false;
}
if (!optionsForEach(paramsArray, availableOptions)) {
return false;
}
printWorkingOptions();
return true;
}
void Params::printWorkingOptions() {
qDebug() << "--- Working options table start ---";
QMap<QString, QString>::const_iterator iter = params.constBegin();
while (iter != params.constEnd()) {
QString row = QString{"Option[%0]"}.arg(iter.key());
QString value = iter.value();
if (!value.isEmpty()) {
row += QString{": %1"}.arg(value);
}
qDebug() << row;
++iter;
}
qDebug() << "--- Working options table end ---";
}
bool Params::checkOption(const OptionData& optionData, const QString& rawOptionName) {
#ifndef QA_ALLOW_NOT_SUPPORTED_OPTIONS
if (!optionData.isValid()) {
qCritical() << QString("The '%0' option not exists!"
" You use wrong option name,"
" please check the help before run your commnad.").
arg(rawOptionName);
return false;
}
#else
Q_UNUSED(rawOptionName);
#endif
if (optionData.isDepricated()) {
if (optionData.isRemoved()) {
qCritical() << optionData.depricatedMsg();
return false;
}
qWarning() << QString("The %0 option(s) marked as deprecated! "
"And most likely will be removed in next release.").
arg(optionData.names().join("/"));
qWarning() << QString("Option message: %0").arg(optionData.depricatedMsg());
}
return true;
}
void Params::parseAvailableOptions(const OptionsDataList &availableOptionsListIn,
OptionsDataList *availableOptionsListOut,
Help::Section *helpOut) {
if (!(availableOptionsListOut && helpOut))
return;
helpOut->clear();
QHash<QString, Help::Options> options;
for (auto it = availableOptionsListIn.begin(); it != availableOptionsListIn.end(); ++it) {
if (availableOptionsListOut) {
for (const auto &name : std::as_const(it.value().names())) {
availableOptionsListOut->insert(name, it.value());
}
}
if (helpOut) {
options[it.key()].unite(it.value().toHelp());
}
}
for (auto it = options.begin(); it != options.end(); ++it) {
helpOut->insert(it.key(), it.value());
}
}
QString Params::getArg(const QString& key,const QString& def) {
return params.value(key, def); return params.value(key, def);
} }
void Params::setArg(const QString &key, const QVariant &val) { void Params::setArg(const QString &key, const QString &val) {
params.insert(key, val); params.insert(key, val);
} }

252
params.h
View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
@ -8,113 +8,253 @@
#ifndef PARAMS_H #ifndef PARAMS_H
#define PARAMS_H #define PARAMS_H
#include <QMap>
#include <QVariant> #include <QVariant>
#include "quasarapp_global.h" #include "quasarapp_global.h"
#include "helpdata.h"
#include "optiondata.h"
namespace QuasarAppUtils { namespace QuasarAppUtils {
/** /**
* @brief The Params class for parese app params * @brief The VerboseLvl enum uses for sets log level.
*/ */
enum VerboseLvl { enum VerboseLvl {
Debug = 0x0, /// Error message. This logs will marked as a **Error** and printing if the verbose lvl >= 0
Error = 0x1, Error = 0x0,
Warning = 0x2, /// Warning message. This logs will marked as a **Warning** and printing if the verbose lvl >= 1
Info = 0x3, Warning = 0x1,
}; /// General information. This logs will marked as a **Info** and and printing if the verbose lvl >= 2.
Info = 0x2,
/// Debug message. This logs will marked as a **Debug** and printing if the verbose lvl >= 3
Debug = 0x3,
};
#ifdef QA_DISABLE_LOG
#define DEFAULT_VERBOSE_LVL "0"
#else
#ifdef QT_DEBUG
#define DEFAULT_VERBOSE_LVL "3"
#else
#define DEFAULT_VERBOSE_LVL "2"
#endif
#endif
/**
* @brief The Params class Contains fonctions for working with input arguments and logs.
* This Class support next comandline arguments.
* * **-verbose** (level 1 - 3) Shows debug log
* * **-fileLog** (path to file) Sets path of log file. Default it is path to executable file with suffix '.log'
*
* ### Usage
*
* ```cpp
#include <quasarapp.h>
if (!QuasarAppUtils::Params::parseParams(argc, argv)) {
QuasarAppUtils::Params::log("Warning message", QuasarAppUtils::Warning);
QuasarAppUtils::Params::showHelp();
exit(0);
}
```
*/
class QUASARAPPSHARED_EXPORT Params class QUASARAPPSHARED_EXPORT Params
{ {
private:
static QString timeString();
static QString lvlToString(VerboseLvl vLvl);
static bool writeLoginFile(const QString& log, VerboseLvl vLvl = VerboseLvl::Debug);
public: public:
Params() = delete; Params() = delete;
/** /**
* @brief parseParams - parase input data of started application * @brief parseParams Parse input data of started application.
* @param argc - count of arguments * @param argc Count of arguments.
* @param argv - arrat of arguments * @param argv Array of arguments.
* @return true if all arguments read else false * @param options This is list of the available options for parse. See the OptionData class for more inforamtion.
* If you skip thi argument then QuasarAppLib will not check input options.
* @return true if all arguments read successful else false.
*/ */
static bool parseParams(int argc, const char *argv[]); static bool parseParams(const int argc, const char *argv[], const OptionsDataList& options = {});
static bool parseParams(int argc, char *argv[]);
/** /**
* @brief parseParams - parase input data of started application * @brief parseParams Parse input data of started application.
* @param params - arguments * @param argc Count of arguments.
* @return true if all arguments read else false * @param argv Array of arguments.
* @param options This is list of the available options for parse. See the OptionData class for more inforamtion.
* If you skip thi argument then QuasarAppLib will not check input options.
* @return true if all arguments read successful else false.
*/ */
static bool parseParams(const QStringList& paramsArray); static bool parseParams(int argc, char *argv[], const OptionsDataList& options = {});
/** /**
* @brief getStrArg - get string value of key * @brief parseParams Parse input data of started application.
* @param key * @param paramsArray Arguments.
* @param def - default value * @param options This is list of the available options for parse. See the OptionData class for more inforamtion.
* @return string value of argument * If you skip thi argument then QuasarAppLib will not check input options.
* @return true if all arguments read successful else false.
*/ */
static QString getStrArg(const QString& key, const QString& def = ""); static bool parseParams(const QStringList& paramsArray, const OptionsDataList& options = {});
/** /**
* @brief getArg - get string value of key * @brief getArg return string value of a @a key if key is exits else return a @a def value.
* @param key * If a @a def value not defined retunr empty string.
* @param def - default value * @param key This is key of a console argument.
* @return string value of argument * @param def This is Default value. If key not exits This function will return a default value.
* @return a string value of argument.
*/ */
static QVariant getArg(const QString& key, const QVariant &def = {}); static QString getArg(const QString& key, const QString &def = {});
/** /**
* @brief setArg - set value of key * @brief setArg sets a new value of a @a key.
* @param key * @param key This is a name of sets option.
* @param val This is a new value of the @a key.
*/ */
static void setArg(const QString& key, const QVariant& val); static void setArg(const QString& key, const QString& val);
/** /**
* @brief setArg - set boolean value of key * @brief setArg This method sets boolean value of key.
* @param key * @param key This is name of the console option.
* @param enable - new value of key * @param enable New value of key.
* @note For check is enable @a key argument use the Params::isEndable method.
*/ */
static void setEnable(const QString& key, bool enable); static void setEnable(const QString& key, bool enable);
/** /**
* @brief isEndable - check if enable argument of key * @brief isEndable This method check if enable a @a key argument.
* @param key * @param key This is name of the validate arguments
* @return true if argument enabled * @return true if argument enabled.
*/ */
static bool isEndable(const QString& key); static bool isEndable(const QString& key);
/** /**
* @brief verboseLog - print text on console if the flag "vergose" is enabled * @brief log This method print @a log text on console.
* @param log - printed text * @param log This is printed text message.
* @param vLvl This is verbose level of message, for get more information see the QuasarAppUtils::VerboseLvl enum.
* @note All messages will be printed according to the current verbose setting.
* @note The verbose level sets by verbose option on console.
*/ */
static void verboseLog(const QString& log, VerboseLvl vLvl = VerboseLvl::Debug); [[deprecated("Use QALogger and qt debug functions(qDebug, qInfo, qError...)")]]
static void log(const QString& log, VerboseLvl vLvl = VerboseLvl::Debug);
/** /**
* @brief getparamsHelp * @brief getVerboseLvl This method return the verbose log level.
* @return help string of default params * @return verbose log lvl.
*/ */
static QStringList getparamsHelp(); static VerboseLvl getVerboseLvl();
/** /**
* @brief showHelp - show all strings of help * @brief isDebug This method return true if the application verbose level >= VerboseLvl::Debug.
* @param help * @return true if a verbose level >= VerboseLvl::Debug
*/ */
static void showHelp(const QStringList& help); static bool isDebug();
/** /**
* @brief size * @brief isDebugBuild This method return true if the library buildet in debug mode.
* @return size of all params array * @return true if this library buildet in debug mode.
*/
[[deprecated("Use Qt MACROSSSES")]]
static bool isDebugBuild();
/**
* @brief size This method return count of the all input arguments.
* @return size of all params array.
*/ */
static int size(); static int size();
/** /**
* @brief customParamasSize * @brief showHelp This method shows all help message.
* @return size of params entered in conosole
*/ */
static int customParamasSize(); static void showHelp();
/**
* @brief showHelpForInputOptions This method show help for each input option.
* @note Befor using of this method invoke the parseParams method. This is needed for generate the help message.
*
* **Example:**
*
* ```bash
* myTool help option1 -option2 argumets
* ```
*/
static void showHelpForInputOptions();
/**
* @brief getHelpOfInputOptions This method return help abut input options only. Exept help and h options.
* @return help abut input options only. Exept help and h options.
*/
static Help::Section getHelpOfInputOptions();
/**
* @brief getHelp This method return options help page.
* @note Befor using of this method invoke the parseParams method. This is needed for generate the help message.
* @return help of available options.
*/
static const Help::Section& getHelp();
/**
* @brief getUserParamsMap This method return const reference to the parsed arguments map.
* @return A map object with parsed arguments.
*/
static const QMap<QString, QString> &getUserParamsMap();
/**
* @brief clearParsedData This method clear all parsed data.
*/
static void clearParsedData();
/**
* @brief getCurrentExecutable This method return path to the current executable.
* @return path to current executable.
*/
static QString getCurrentExecutable();
/**
* @brief getCurrentExecutableDir This method return a path to a folder with the current executable.
* @return path of the folder with current executable.
*/
static QString getCurrentExecutableDir();
/**
* @brief availableArguments This method return list of the available arguments of QuasarAppLibrary
* @return list of the available arguments
*/
static OptionsDataList availableArguments();
private:
static bool optionsForEach(const QStringList& paramsArray,
const OptionsDataList &availableOptions);
/**
* @brief Traverse @a params and output its content (all the working
* options) to stdout in the form of option-value groups at the
* debug verbose level (-verbose 3).
*/
static void printWorkingOptions();
/**
* @brief checkOption return tru if the option is supported
* @param option checked option
* @return true if option is supported
*/
static bool checkOption(const OptionData &option, const QString &rawOptionName);
/**
* @brief parseAvailableOptions This is private method for parsing availabel options.
* @param availableOptionsListIn input data of the available options.
* @param availableOptionsListOut hash of available options wher key it options name and value it is options data
* @param helpOut This is help object that generated from the
*/
static void parseAvailableOptions(const OptionsDataList& availableOptionsListIn,
OptionsDataList* availableOptionsListOut,
Help::Section* helpOut);
static QMap<QString, QString> params;
static OptionsDataList inputOptions;
static Help::Section userHelp;
static QString appPath;
static QString appName;
}; };
} }

29
qaglobalutils.cpp Normal file
View File

@ -0,0 +1,29 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "qaglobalutils.h"
#include <limits>
template<class NUM>
void gen(int size, QByteArray &result) {
for (; size > 0; size -= sizeof(NUM)) {
NUM random = (rand() * rand()) % std::numeric_limits<NUM>::max();
result.insert(0, reinterpret_cast<char*>(&random), sizeof(random));
}
}
// to do. The random function should generate 4 bit numbers anywhere except last number
void randomArray(int size, QByteArray &result) {
if (size % sizeof(unsigned long long) == 0) {
gen<unsigned long long>(size, result);
} else if (size % sizeof(unsigned int) == 0) {
gen<unsigned int>(size, result);
} else if (size % sizeof(unsigned short) == 0) {
gen<unsigned short>(size, result);
} else {
gen<unsigned char>(size, result);
}
}

159
qaglobalutils.h Normal file
View File

@ -0,0 +1,159 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef QU_GLOBAL_UTILS_H
#define QU_GLOBAL_UTILS_H
#include <type_traits>
#include <typeinfo>
#include <QByteArray>
#include "QtGlobal"
#include "quasarapp_global.h"
template <typename T>
constexpr inline T operator | (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) | static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator & (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) & static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator >> (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) >> static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator << (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) << static_cast<int>(rhs));
}
template <typename T>
constexpr inline T operator ~ (T lhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(~static_cast<int>(lhs));
}
template <typename T>
constexpr inline T operator ^ (T lhs, T rhs)
{
static_assert(std::is_enum<T>::value,
"template parameter is not an enum type");
return static_cast<T>(static_cast<int>(lhs) ^ static_cast<int>(rhs));
}
template<class T>
/**
* @brief static_type_hash_32 This function return hash code of the class T.
* For get more information see the std [documentation](https://en.cppreference.com/w/cpp/types/type_info/hash_code).
* @note This method will create a T object on stack, so if you have a alredy created object use the static_type_hash_32(const T&) function.
* @return uint32_t hash code of the class T
*/
uint32_t static_type_hash_32() noexcept {
return typeid (T).hash_code();
};
template<class T>
/**
* @brief static_type_hash_16 This function return hash code of the class T.
* For get more information see the std [documentation](https://en.cppreference.com/w/cpp/types/type_info/hash_code).
* @note This method will create a T object on stack, so if you have a alredy created object use the static_type_hash_16(const T&) function.
* @return uint16_t hash code of the class T
*/
uint16_t static_type_hash_16() noexcept {
return typeid (T).hash_code() % 0xFFFF;
};
template<class T>
/**
* @brief static_type_hash_8 This function return hash code of the class T.
* For get more information see the std [documentation](https://en.cppreference.com/w/cpp/types/type_info/hash_code).
* @note This method will create a T object on stack, so if you have a alredy created object use the static_type_hash_8(const T&) function.
* @return uint8_t hash code of the class T
*/
uint8_t static_type_hash_8() noexcept {
return typeid (T).hash_code() % 0xFF;
};
template<class T>
/**
* @brief static_type_hash_32 This function return hash code of a T type using @a object.
* @param object This is object of the T type using for generate hash.
* @return uint32_t hash code of the class T
*/
uint32_t static_type_hash_32(T& object) noexcept {
return typeid (object).hash_code();
};
template<class T>
/**
* @brief static_type_hash_16 This function return hash code of a T type using @a object.
* @param object This is object of the T type using for generate hash.
* @return uint16_t hash code of the class T
*/
uint16_t static_type_hash_16(T& object) noexcept {
return typeid (object).hash_code() % 0xFFFF;
};
template<class T>
/**
* @brief static_type_hash_8 This function return hash code of a T type using @a object.
* @param object This is object of the T type using for generate hash.
* @return uint8_t hash code of the class T
*/
uint8_t static_type_hash_8(T& object) noexcept {
return typeid (object).hash_code() % 0xFF;
};
/// @brief H_8 This is short wraper of the static_type_hash_8 fucntion.
#define H_8 static_type_hash_8
/// @brief H_16 This is short wraper of the static_type_hash_16 fucntion.
#define H_16 static_type_hash_16
/// @brief H_32 This is short wraper of the static_type_hash_32 fucntion.
#define H_32 static_type_hash_32
#define debug_assert(C, M) Q_ASSERT(C && M)
/**
* @brief randomArray This function return random arrat with size @a size
* @param size This is size of needed array.
* @param result This is result value of generated array.
*/
void QUASARAPPSHARED_EXPORT randomArray(int size, QByteArray &result);
#endif // GLOBAL_H

114
qalogger.cpp Normal file
View File

@ -0,0 +1,114 @@
/*
* Copyright (C) 2024-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "qalogger.h"
#include "params.h"
#include <iostream>
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QStandardPaths>
namespace QuasarAppUtils {
Q_GLOBAL_STATIC(QString, _logFile)
static bool _toFile = false;
static VerboseLvl _verboseLevel = Debug;
#define MESSAGE_PATTERN \
"[%{time MM-dd h:mm:ss.zzz} %{threadid} " \
"%{if-debug}Debug%{endif}%{if-info}Info%{endif}%{if-warning}Warning%{endif}%{if-critical}Error%{endif}%{if-fatal}Fatal%{endif}] " \
"%{message}"
QALogger::QALogger() {
}
QALogger::~QALogger() {
}
bool checkLogType(QtMsgType type, VerboseLvl lvl) {
switch (type) {
case QtDebugMsg: return lvl >= Debug;
case QtInfoMsg: return lvl >= Info;
case QtWarningMsg: return lvl >= Warning;
case QtCriticalMsg:
case QtFatalMsg:
return true;
}
return true;
}
void messageHandler(QtMsgType type, const QMessageLogContext & context, const QString &msg) {
if (checkLogType(type, _verboseLevel)) {
if (_toFile && _logFile->size()) {
QFile logFile(*_logFile);
if (logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
QTextStream stream(&logFile);
stream << qFormatLogMessage(type, context, msg) << Qt::endl;
}
}
switch (type) {
case QtMsgType::QtFatalMsg:
case QtMsgType::QtCriticalMsg:
case QtMsgType::QtWarningMsg: {
std::cerr << qFormatLogMessage(type, context, msg).toStdString() << std::endl;
break;
}
case QtMsgType::QtDebugMsg:
case QtMsgType::QtInfoMsg:
default: {
std::cout << qFormatLogMessage(type, context, msg).toStdString() << std::endl;
break;
}
}
}
}
void QALogger::init() {
qSetMessagePattern(MESSAGE_PATTERN);
qInstallMessageHandler(messageHandler);
_verboseLevel = Params::getVerboseLvl();
if (Params::isEndable("fileLog")) {
_toFile = true;
QString path = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
QString filePath = path + "/" + QCoreApplication::applicationName() +
" " + QDate::currentDate().toString(Qt::DateFormat::ISODate) + ".log";
auto file = Params::getArg("fileLog");
if (file.size()) {
filePath = file;
}
QDir().mkpath(path);
*_logFile = filePath;
}
}
QString QALogger::getLogFilePath() {
return *_logFile;
}
}

66
qalogger.h Normal file
View File

@ -0,0 +1,66 @@
/*
* Copyright (C) 2024-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef QALOGGER_H
#define QALOGGER_H
#include "quasarapp_global.h"
#include <QFile>
#include <QList>
namespace QuasarAppUtils {
/**
* @brief The QALogger class is logger handler for app.
* This class allow to log all message from app to file.
*
* Example:
* @code
* #include <qalogger.h>
*
* QuasarAppUtils::QALogger logger;
*
* QuasarAppUtils::Params::setEnable("fileLog", true); //force enable file writing using efault file location - located in localApplication data.
*
* QuasarAppUtils::Params::parseParams(argc, argv);
*
* logger.init();
* @endcode
*
*
* Standart file log locations per platforms :
* - Windows: %APPDATA%/OrganisationName/YourAppName/YourAppName.log
* - Linux: $HOME/.config/OrganisationName/YourAppName/YourAppName.log
* - Mac: $HOME/Library/Application Support/OrganisationName/YourAppName/YourAppName.log
* - Android: /data/data/com.organisationName.yourAppName/files/YourAppName.log
* - iOS: /var/mobile/Applications/Data/YourAppName/YourAppName.log
*
* you can overiwite this location by setting "fileLog" option in Params.
*/
class QUASARAPPSHARED_EXPORT QALogger
{
public:
QALogger();
~QALogger();
/**
* @brief init This method initialize logging of all qt message into file.
* @note This function should be invokae after parsing arguments.
* if you invoke this before parsing arguments, verbose level of logs will not created correct.
*/
void init();
/**
* @brief setVerboseLevel This method set verbose level of the logger.
* @param lvl This is new verbose level.
*/
static QString getLogFilePath();
};
}
#endif // QALOGGER_H

53
qaplatformutils.h Normal file
View File

@ -0,0 +1,53 @@
/*
* Copyright (C) 2024-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef PLATFORMUTILS_H
#define PLATFORMUTILS_H
#include <QString>
#include "quasarapp_global.h"
namespace QuasarAppUtils {
/**
* @brief The iPlatformUtils class bas interface for get access platform dependet functions and constants.
*/
class QUASARAPPSHARED_EXPORT PlatformUtils
{
public:
PlatformUtils();
/**
* @brief isSnap This method check destribution type. true if the application packed as a snap.
* @return true if the application packaged as a snap else false.
*/
static bool isSnap();
/**
* @brief snapRootFS returns root file system of main OS (available read only)
* @return path ro main os root.
*/
static QString snapRootFS();
/**
* @brief transportPathToSnapRoot change path to snap avaialble.
* @param path source path of main OS.
* @return readable path location for snap pacakge.
* @note this method is not a fast, so not invoke it too offten.
*/
static QString transportPathToSnapRoot(const QString &path);
/**
* @brief checkSystemBakupSnapInterface This method check access to bakcup permision of snap pacakge.
* This permision required to get access to rootfs of main OS.
* @return true if the app have this accesss.
*/
static bool checkSystemBakupSnapInterface();
};
}
#endif // IPLATFORMUTILS_H

99
qaplatformutils_linux.cpp Normal file
View File

@ -0,0 +1,99 @@
/*
* Copyright (C) 2024-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "qaplatformutils.h"
#if defined(Q_OS_LINUX)
#include <QDir>
#include <QFileInfo>
#include <QProcessEnvironment>
#elif defined(Q_OS_ANDROID)
#elif defined(Q_OS_WIN32)
#elif defined(Q_OS_MACOS)
#elif defined(Q_OS_IOS)
#endif
namespace QuasarAppUtils {
#if defined(Q_OS_LINUX)
bool PlatformUtils::isSnap() {
return QProcessEnvironment::systemEnvironment().value("SNAP").size();
}
QString PlatformUtils::snapRootFS() {
return "/var/lib/snapd/hostfs";
}
QString PlatformUtils::transportPathToSnapRoot(const QString &path) {
if (isSnap() && checkSystemBakupSnapInterface()) {
if(QFileInfo(path).isWritable()) {
return path;
}
if (path.size() && path[0] != QString("/")) {
auto absalutPath = QProcessEnvironment::systemEnvironment().value("PWD") + "/" + path;
if (!absalutPath.contains(snapRootFS())) {
return snapRootFS() + "/" + absalutPath;
}
}
if (!path.contains(snapRootFS())) {
return snapRootFS() + "/" + path;
}
}
return path;
}
bool PlatformUtils::checkSystemBakupSnapInterface() {
return QDir(snapRootFS()).entryList(QDir::AllEntries | QDir::NoDotAndDotDot).size();
}
#elif defined(Q_OS_ANDROID)
bool PlatformUtils::isSnap() { return false;}
QString PlatformUtils::snapRootFS() { return "";}
QString PlatformUtils::transportPathToSnapRoot(const QString &path) { return path; }
bool PlatformUtils::checkSystemBakupSnapInterface() { return false; }
#elif defined(Q_OS_WIN32)
bool PlatformUtils::isSnap() { return false;}
QString PlatformUtils::snapRootFS() { return "";}
QString PlatformUtils::transportPathToSnapRoot(const QString &path) { return path; }
bool PlatformUtils::checkSystemBakupSnapInterface() { return false; }
#elif defined(Q_OS_MACOS)
bool PlatformUtils::isSnap() { return false;}
QString PlatformUtils::snapRootFS() { return "";}
QString PlatformUtils::transportPathToSnapRoot(const QString &path) { return path; }
bool PlatformUtils::checkSystemBakupSnapInterface() { return false; }
#elif defined(Q_OS_IOS)
bool PlatformUtils::isSnap() { return false;}
QString PlatformUtils::snapRootFS() { return "";}
QString PlatformUtils::transportPathToSnapRoot(const QString &path) { return path; }
bool PlatformUtils::checkSystemBakupSnapInterface() { return false; }
#endif
}

48
qasecretservice.cpp Normal file
View File

@ -0,0 +1,48 @@
#include "qasecretservice.h"
#ifdef Q_OS_LINUX
#include <QProcess>
QByteArray QuasarAppUtils::QASecretService::getByAlias(const QString &alias) {
QProcess proc;
proc.setProgram("qasecretservice");
proc.setArguments(QStringList() << "get" << "-alias" << alias);
proc.start();
if (!proc.waitForFinished(2000)) {
return "";
}
if (proc.exitCode()) {
return "";
}
QByteArray result = proc.readAllStandardOutput();
// drop \n
return result.left(result.size() - 1);
}
QByteArray QuasarAppUtils::QASecretService::getByHash(const QByteArray &hash)
{
QProcess proc;
proc.setProgram("qasecretservice");
proc.setArguments(QStringList() << "get" << "-hash" << hash);
proc.start();
if (!proc.waitForFinished(2000)) {
return "";
}
if (proc.exitCode()) {
return "";
}
QByteArray result = proc.readAllStandardOutput();
// drop \n
return result.left(result.size() - 1);
}
#endif

35
qasecretservice.h Normal file
View File

@ -0,0 +1,35 @@
/*
* Copyright (C) 2024-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef QASECRETSERVICE_H
#define QASECRETSERVICE_H
#include <QByteArray>
namespace QuasarAppUtils {
/**
* @brief The qasecretservice class This is a simeple provider of QASecretService tool
* See https://github.com/QuasarApp/SecretService
* @note Before use this class please install QASecretService to your runtime mashine.
*
*/
class QASecretService
{
public:
QASecretService();
#ifdef Q_OS_LINUX
static QByteArray getByAlias(const QString& alias);
static QByteArray getByHash(const QByteArray& hash);
#endif
};
}
#endif // QASECRETSERVICE_H

7
qaservice.cpp Normal file
View File

@ -0,0 +1,7 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/

159
qaservice.h Normal file
View File

@ -0,0 +1,159 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef QASERVICE_H
#define QASERVICE_H
#include <memory>
#include <utility>
namespace QuasarAppUtils {
/**
* @brief The Service class is a template class for creating a singleton services objects.
* This is manual control wrapper. You should be manually initializing your service object and manually deinitializing.
* If you don't destroy your service, then service object will be automatically destroyed when application will be closed.
* @warning If service was destroyed automatically, then destructor of your base class will be not invoked. Use The deinit method for this.
* @todo Remove the template Base class. Instead, it needs to use a general inherit paradigm
*
* **Examples**
*
* **Create a service class**
*
* @code{cpp}
*
* #include <qaservice.h>
*
* class MyService: public QuasarAppUtils::Service<MyService> {\
* // some implementation
* };
*
* @endcode
*
* **Initialise a service object**
*
* @code{cpp}
*
* #include <MyService.h>
*
* // initialise service
* MyService* serviceInstance = MyService::initService();
*
* // get service instance.
* serviceInstance = MyService::instance();
*
* // remove service instance object.
* MyService::deinitService();
*
* @endcode
*
*
* Or you can use the autoInstance method for initialize instance object if not exists.
* @note This method try initialize base instance object use default construct.
*
* @code{cpp}
*
* #include <MyService.h>
*
* // initialise service
* MyService* serviceInstance = MyService::autoInstance();
*
* @endcode
*/
template<class Base>
class Service
{
public:
Service() {};
/**
* @brief initService This method initialize the @a Base object as a service.
* @param args This is argumets of a constructo of the @a Base class.
* @return instance pointer. If the service alredy initialized then return pointer to current service object.
* @see instance
* @see deinitService
* @see autoInstance
*/
static inline std::unique_ptr<Base>& initService() {
auto& val = instancePrivat();
if(!val) {
val.reset(new Base());
}
return val;
}
/**
* @brief initService This is overrided static method of initialization cross libraryes object.
* @note If you want to create your own implementation of the settings object - you need to use this method for initioalisation instant qaservice::initService - template method.
* Becouse Some OS has every shared libraryes has itself isolation address space (for example Android).
* If you initialize instance of your settings model on one libarary the this instance will be available only on your library or upper.
* Bot not on the QuasarApp lib so SettingsListner will not work.
* @param obj This is inited settings object.
* @return true if the @a obj service was saved as a service object else false.
*/
static bool initService(std::unique_ptr<Base> obj) {
auto& val = instancePrivat();
if(!val) {
val = std::move(obj);
return true;
}
return false;
};
/**
* @brief instance This method return pointerer to current service object.
* @note If object was not initialized, then return false.
* @return pointerer to current service object if service initialized else nullptr.
* @see initService
* @see deinitService
* @see autoInstance
*/
static Base* instance() {
return instancePrivat().get();
}
/**
* @brief autoInstance This method return pointerer to current service object and if it is not inited try to initialize it use default constructor.
* @return pointerer to current service object if service initialized else nullptr.
* @see instance
*/
static Base* autoInstance() {
auto& val = instancePrivat();
if (!val) {
initService();
}
return val.get();
}
/**
* @brief deinitService This is distructor method for the service.
* @note do nothink if this object alredy distroyed.
* @see instance
* @see initService
* @see autoInstance
*/
static void deinitService() {
auto& val = instancePrivat();
if(val) {
val.release();
}
}
private:
static inline std::unique_ptr<Base>& instancePrivat() {
static std::unique_ptr<Base> instance = nullptr;
return instance;
}
};
}
#endif // QASERVICE_H

View File

@ -1,11 +1,10 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
*/ */
#include "quasarapp.h"

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
@ -11,12 +11,12 @@
#include "params.h" #include "params.h"
#include "locales.h" #include "locales.h"
#include "settings.h" #include "settings.h"
#include "global.h" #include "qaplatformutils.h"
/** /**
* @brief The QuasaraAppUtils class * @brief The QuasaraAppUtils class
* this lib include base functions for the all applications of QuasarApp group. * This lib include base functions for the all applications of QuasarApp group.
* all methods of the Quasar AppUtils is static * All methods of the Quasar AppUtils is static.
*/ */
namespace QuasarAppUtils{ namespace QuasarAppUtils{

View File

@ -3,7 +3,7 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#if defined(QUASARAAPP_LIBRARY) #if defined(QUASARAPP_LIBRARY)
# define QUASARAPPSHARED_EXPORT Q_DECL_EXPORT # define QUASARAPPSHARED_EXPORT Q_DECL_EXPORT
#else #else
# define QUASARAPPSHARED_EXPORT Q_DECL_IMPORT # define QUASARAPPSHARED_EXPORT Q_DECL_IMPORT

View File

@ -1,17 +1,19 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2021-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
*/ */
#include "settings.h" #include "settings.h"
#include <QSettings> #include <QSettings>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug>
using namespace QuasarAppUtils; namespace QuasarAppUtils {
Settings::Settings(SettingsSaveMode mode) { Settings::Settings() {
auto name = QCoreApplication::applicationName(); auto name = QCoreApplication::applicationName();
auto company = QCoreApplication::organizationName(); auto company = QCoreApplication::organizationName();
if (name.isEmpty()) { if (name.isEmpty()) {
@ -22,57 +24,58 @@ Settings::Settings(SettingsSaveMode mode) {
company = "QuasarApp"; company = "QuasarApp";
} }
_settings = new QSettings(QSettings::IniFormat, QSettings::Scope::UserScope, company, name); _settings = new QSettings(QSettings::NativeFormat, QSettings::Scope::UserScope, company, name);
_mode = mode;
} }
SettingsSaveMode Settings::getMode() const void Settings::syncImplementation() {
{ return _settings->sync();
return _mode;
} }
void Settings::setMode(const SettingsSaveMode &mode) QVariant Settings::getValueImplementation(const QString &key, const QVariant &def) {
{ if (isBool(key)) {
_mode = mode; return _settings->value(key, def).toBool();
} }
Settings *Settings::initSettings(SettingsSaveMode mode) {
static Settings* res = new Settings(mode);
return res;
}
Settings *Settings::get() {
return initSettings();
}
const Settings *Settings::getConst() {
return initSettings();
}
QVariant Settings::getValue(const QString &key, const QVariant &def) {
return _settings->value(key, def); return _settings->value(key, def);
} }
QString Settings::getStrValue(const QString &key, const QString &def) { void Settings::setValueImplementation(const QString key, const QVariant &value) {
return getValue(key, QVariant(def)).toString(); return _settings->setValue(key, value);
} }
void Settings::sync() { bool Settings::ignoreToRest(const QString &) const {
_settings->sync(); return false;
} }
void Settings::setValue(const QString key, const QVariant &value) { QHash<QString, QVariant> Settings::defaultSettings() {
_settings->setValue(key, value); return {};
}
emit valueChanged(key, value); bool Settings::isBool(const QString &) const {
emit valueStrChanged(key, value.toString()); return false;
}
if (_mode == SettingsSaveMode::Auto) { const QSet<QString> &Settings::boolOptions() const
sync(); {
return _boolOptions;
}
void Settings::setBoolOptions(const QSet<QString> &newBoolOptions)
{
_boolOptions = newBoolOptions;
}
bool Settings::initService() {
return ISettings::initService(std::make_unique<Settings>());
}
ISettings *Settings::autoInstance() {
if (auto result = instance()) {
return result;
} }
Settings::initService();
return ISettings::instance();
} }
void Settings::setStrValue(const QString &key, const QString &value) {
setValue(key, value);
} }

View File

@ -1,107 +1,106 @@
/* /*
* Copyright (C) 2018-2020 QuasarApp. * Copyright (C) 2021-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying * Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies * Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed. * of this license document, but changing it is not allowed.
*/ */
#ifndef SETTINGS_H #ifndef SETTINGS_H
#define SETTINGS_H #define SETTINGS_H
#include "quasarapp_global.h" #include "quasarapp_global.h"
#include <QObject> #include "isettings.h"
#include <QVariant> #include <QSet>
class QSettings;
namespace QuasarAppUtils { namespace QuasarAppUtils {
/** /**
* @brief The SettingsSaveMode enum * @brief The Settings class This is wraper of the QSettings object.
* Auto - value save on hard disk when calling method "value" *
* manual - save all data on hard disk when calling method Settings::sync * Example of initialisation :
*
* @code{cpp}
* auto settingsInstance = QuasarAppUtils::Setting::initService();
*
* // on any another site you can use the instance method for get settings instance object.
* auto settingsInstance = QuasarAppUtils::Setting::instance();
*
* // and you can destroy setting object if they are not needed anymore
* QuasarAppUtils::Setting::deinitService();
* @endcode
*
* **Or** you can use the Settings::autoInstance method.
*
* @code{cpp}
* auto settingsInstance = QuasarAppUtils::Setting::autoInstance();
* @endcode
*
* @see Settings::init
*/ */
enum class SettingsSaveMode: quint64 { class QUASARAPPSHARED_EXPORT Settings: public ISettings
Auto,
Manual
};
/**
* @brief The Settings class - singleton for QSettings
*/
class QUASARAPPSHARED_EXPORT Settings : public QObject
{ {
Q_OBJECT Q_OBJECT
private:
explicit Settings(SettingsSaveMode mode = SettingsSaveMode::Auto);
QSettings *_settings = nullptr;
SettingsSaveMode _mode = SettingsSaveMode::Auto;
static Settings* initSettings(SettingsSaveMode mode = SettingsSaveMode::Auto);
public: public:
Settings();
// ISettings interface
/**
* @brief boolOptions returns current map with keys that has a bool type.
* @return current map with keys that has a bool type
* @see Settings::setBoolOptions
* @see Settings::isBool
*/
const QSet<QString> &boolOptions() const;
/** /**
* @brief get * @brief setBoolOptions This method sets new map of the boolean options.
* @return object of all settings app; * @param newBoolOptions This is new map of the boolean options.
* @see Settings::boolOptions
* @see Settings::isBool
*/ */
static Settings* get(); void setBoolOptions(const QSet<QString> &newBoolOptions);
/** /**
* @brief get * @brief initService This method initialize default object of the QuasarAppUtils::Settings type.
* @return const object of all settings app; * @return true if initialization finished successfull else false.
* @see ISettings::initService
*/ */
static const Settings* getConst(); static bool initService();
/** /**
* @brief getValue * @brief deinitService This method destroy default object of the QuasarAppUtils::Settings type.
* @param key - key of value * @see ISettings::deinitService
* @param def - default value if is value not finded
* @return value of key
*/ */
Q_INVOKABLE QVariant getValue(const QString &key, const QVariant& def); static ISettings *autoInstance();
protected:
void syncImplementation() override;
QVariant getValueImplementation(const QString &key, const QVariant &def) override;
void setValueImplementation(const QString key, const QVariant &value) override;
bool ignoreToRest(const QString &) const override;
QHash<QString, QVariant> defaultSettings() override;
/** /**
* @brief getStrValue some as getValue but work with QString * @brief isBool This method should be return true if the key's type is bool.
* This is needed because QVariant will be converted alvays to true value in a qml code.
* @param key This is key of checks setting.
* @return true if the key is boolean variable.
* The default implementation check key in the inner map.
*
* @see Settings::setBoolOptions
* @see Settings::boolOptions
*/ */
Q_INVOKABLE QString getStrValue(const QString &key, const QString& def); virtual bool isBool(const QString& key) const;
void setGroup(const QString&);
/**
* @brief sync - save all data on hard disk;
*/
void sync();
/**
* @brief getMode
* @return
*/
SettingsSaveMode getMode() const;
/**
* @brief setMode
* @param mode
*/
void setMode(const SettingsSaveMode &mode);
public slots:
/**
* @brief setValue - set new value of key
* @param key - key pf settings
* @param value - new value
*/
void setValue(const QString key, const QVariant& value);
/**
* @brief setStrValue - some as setValue< but use QString
*/
void setStrValue(const QString& key, const QString& value);
signals:
void valueChanged(QString key, QVariant value);
void valueStrChanged(QString key, QString value);
private:
QSettings *_settings = nullptr;
QSet<QString> _boolOptions;
}; };
} ;
}
#endif // SETTINGS_H #endif // SETTINGS_H

32
settingslistner.cpp Normal file
View File

@ -0,0 +1,32 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "isettings.h"
#include "settingslistner.h"
namespace QuasarAppUtils {
SettingsListner::SettingsListner() {
auto settings = ISettings::instance();
if (settings) {
auto listner = [this](QString key, QVariant val){
this->handleSettingsChanged(key, val);
};
_listnerConnection = QObject::connect(settings,
&ISettings::valueChanged,
listner);
}
}
SettingsListner::~SettingsListner() {
QObject::disconnect(_listnerConnection);
}
}

59
settingslistner.h Normal file
View File

@ -0,0 +1,59 @@
/*
* Copyright (C) 2018-2025 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#ifndef SETTINGSLISTNER_H
#define SETTINGSLISTNER_H
#include <QString>
#include <QVariant>
#include "quasarapp_global.h"
namespace QuasarAppUtils {
/**
* @brief The SettingsListner class is listner of the ISettings global object.
* The SettingsListner class is abstrct class and contains only one method for hendling settings changes.
*
*
* ### Example of use :
*
* @code{cpp}
* class MyClass : protected QuasarAppUtils::SettingsListner {
* protected:
* void handleSettingsChanged(const QString& key, const QVariant& value) override {
*
* if (key == "shareName") {
setSessinon(static_cast<long long >(rand()) * rand());
}
* }
*
* };
* @endcode
* @see ISettings
*/
class QUASARAPPSHARED_EXPORT SettingsListner
{
public:
SettingsListner();
virtual ~SettingsListner();
protected:
/**
* @brief handleSettingsChanged This method will be invoked when settings of application has bean changed.
* @param key This is key of a changed settings.
* @param value This is a new value of a changed settings.
*/
virtual void handleSettingsChanged(const QString& key,
const QVariant& value) = 0;
private:
QMetaObject::Connection _listnerConnection;
};
}
#endif // SETTINGSLISTNER_H

18
validableobject.cpp Normal file
View File

@ -0,0 +1,18 @@
//#
//# Copyright (C) 2022-2025 QuasarApp.
//# Distributed under the GPLv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#include "validableobject.h"
namespace QuasarAppUtils{
ValidableObject::ValidableObject()
{
}
}

35
validableobject.h Normal file
View File

@ -0,0 +1,35 @@
//#
//# Copyright (C) 2022-2025 QuasarApp.
//# Distributed under the GPLv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#ifndef VALIDABLEOBJECT_H
#define VALIDABLEOBJECT_H
namespace QuasarAppUtils{
/**
* @brief The ValidableObject class is Base interface for all object that can be checked to valid.
*/
class ValidableObject
{
public:
ValidableObject();
/**
* @brief isValid This method return true if the object is valid else false.
* @return true if the object is valid else false.
*/
virtual bool isValid() const = 0;
};
/**
* @brief iVO This is short abriviature of the ValidableObject class.
*/
typedef ValidableObject iVO;
}
#endif // VALIDABLEOBJECT_H