From f0e12a476a9277ac1541de9acd0987f7b101e3d1 Mon Sep 17 00:00:00 2001 From: pluvium27 Date: Fri, 1 May 2026 03:10:37 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=93?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .clang-format | 95 +++++++ .flatpak-manifest.json | 50 ++++ .flatpak-manifest.json.license | 2 + .gitignore | 133 +++++++++ CMakeLists.txt | 68 +++++ LICENSES/BSD-3-Clause.txt | 26 ++ LICENSES/CC0-1.0.txt | 121 +++++++++ LICENSES/FSFAP.txt | 3 + LICENSES/GPL-2.0-or-later.txt | 311 ++++++++++++++++++++++ android/AndroidManifest.xml | 54 ++++ android/build.gradle | 81 ++++++ android/res/drawable/logo.png | Bin 0 -> 4954 bytes android/res/drawable/splash.xml | 10 + src/CMakeLists.txt | 58 ++++ src/heuramsapplication.cpp | 31 +++ src/heuramsapplication.h | 24 ++ src/heuramsconfig.kcfg | 16 ++ src/heuramsconfig.kcfgc | 10 + src/main.cpp | 85 ++++++ src/qml/Main.qml | 109 ++++++++ src/settings/CMakeLists.txt | 11 + src/settings/GeneralPage.qml | 27 ++ src/settings/HeurAMSConfigurationView.qml | 20 ++ top.pluv27.heurams.kiri.desktop | 13 + top.pluv27.heurams.kiri.metainfo.xml | 25 ++ 25 files changed, 1383 insertions(+) create mode 100644 .clang-format create mode 100644 .flatpak-manifest.json create mode 100644 .flatpak-manifest.json.license create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSES/BSD-3-Clause.txt create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 LICENSES/FSFAP.txt create mode 100644 LICENSES/GPL-2.0-or-later.txt create mode 100644 android/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/res/drawable/logo.png create mode 100644 android/res/drawable/splash.xml create mode 100644 src/CMakeLists.txt create mode 100644 src/heuramsapplication.cpp create mode 100644 src/heuramsapplication.h create mode 100644 src/heuramsconfig.kcfg create mode 100644 src/heuramsconfig.kcfgc create mode 100644 src/main.cpp create mode 100644 src/qml/Main.qml create mode 100644 src/settings/CMakeLists.txt create mode 100644 src/settings/GeneralPage.qml create mode 100644 src/settings/HeurAMSConfigurationView.qml create mode 100644 top.pluv27.heurams.kiri.desktop create mode 100644 top.pluv27.heurams.kiri.metainfo.xml diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..9b5ae0a --- /dev/null +++ b/.clang-format @@ -0,0 +1,95 @@ +--- +# SPDX-FileCopyrightText: 2019 Christoph Cullmann +# SPDX-FileCopyrightText: 2019 Gernot Gebhard +# +# SPDX-License-Identifier: MIT + +# This file got automatically created by ECM, do not edit +# See https://clang.llvm.org/docs/ClangFormatStyleOptions.html for the config options +# and https://community.kde.org/Policies/Frameworks_Coding_Style#Clang-format_automatic_code_formatting +# for clang-format tips & tricks +--- +Language: JavaScript +DisableFormat: true +--- +Language: Json +DisableFormat: false +IndentWidth: 4 +--- + +# Style for C++ +Language: Cpp + +# base is WebKit coding style: https://webkit.org/code-style-guidelines/ +# below are only things set that diverge from this style! +BasedOnStyle: WebKit + +# enforce C++11 (e.g. for std::vector> +Standard: Cpp11 + +# 4 spaces indent +TabWidth: 4 + +# 2 * 80 wide lines +ColumnLimit: 160 + +# sort includes inside line separated groups +SortIncludes: true + +# break before braces on function, namespace and class definitions. +BreakBeforeBraces: Linux + +# CrlInstruction *a; +PointerAlignment: Right + +# horizontally aligns arguments after an open bracket. +AlignAfterOpenBracket: Align + +# don't move all parameters to new line +AllowAllParametersOfDeclarationOnNextLine: false + +# no single line functions +AllowShortFunctionsOnASingleLine: None + +# no single line enums +AllowShortEnumsOnASingleLine: false + +# always break before you encounter multi line strings +AlwaysBreakBeforeMultilineStrings: true + +# don't move arguments to own lines if they are not all on the same +BinPackArguments: false + +# don't move parameters to own lines if they are not all on the same +BinPackParameters: false + +# In case we have an if statement with multiple lines the operator should be at the beginning of the line +# but we do not want to break assignments +BreakBeforeBinaryOperators: NonAssignment + +# format C++11 braced lists like function calls +Cpp11BracedListStyle: true + +# do not put a space before C++11 braced lists +SpaceBeforeCpp11BracedList: false + +# remove empty lines +KeepEmptyLinesAtTheStartOfBlocks: false + +# no namespace indentation to keep indent level low +NamespaceIndentation: None + +# we use template< without space. +SpaceAfterTemplateKeyword: false + +# Always break after template declaration +AlwaysBreakTemplateDeclarations: true + +# macros for which the opening brace stays attached. +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCHMARK, QBENCHMARK_ONCE , wl_resource_for_each, wl_resource_for_each_safe ] + +# keep lambda formatting multi-line if not empty +AllowShortLambdasOnASingleLine: Empty + +# We do not want clang-format to put all arguments on a new line +AllowAllArgumentsOnNextLine: false diff --git a/.flatpak-manifest.json b/.flatpak-manifest.json new file mode 100644 index 0000000..e2545de --- /dev/null +++ b/.flatpak-manifest.json @@ -0,0 +1,50 @@ +{ + "id": "top.pluv27.heurams.kiri", + "runtime": "org.kde.Platform", + "runtime-version": "6.8", + "sdk": "org.kde.Sdk", + "command": "heurams", + "tags": [ + "nightly" + ], + "desktop-file-name-suffix": " (Nightly)", + "finish-args": [ + "--share=ipc", + "--share=network", + "--socket=fallback-x11", + "--socket=wayland", + "--device=dri", + "--filesystem=home" + ], + "separate-locales": false, + "modules": [ + { + "name": "kirigami-addons", + "config-opts": [ + "-DBUILD_TESTING=OFF", + "-DCMAKE_BUILD_TYPE=RelWithDebInfo" + ], + "buildsystem": "cmake-ninja", + "sources": [ + { + "type": "git", + "url": "https://invent.kde.org/libraries/kirigami-addons.git" + } + ] + }, + { + "name": "heurams", + "buildsystem": "cmake-ninja", + "builddir": true, + "sources": [ + { + "type": "dir", + "path": ".", + "skip": [ + ".git" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.flatpak-manifest.json.license b/.flatpak-manifest.json.license new file mode 100644 index 0000000..dc56c2c --- /dev/null +++ b/.flatpak-manifest.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: None +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f069586 --- /dev/null +++ b/.gitignore @@ -0,0 +1,133 @@ +# --- Build directories --- +build/ +build-android/ +_build/ +_builds/ +cmake-build-*/ + +# --- CMake generated files --- +CMakeCache.txt +CMakeFiles/ +CMakeScripts/ +cmake_install.cmake +CMakeUserPresets.json +CTestTestfile.cmake +CPackConfig.cmake +CPackSourceConfig.cmake +*.cmake +!CMakeLists.txt +Makefile +DartConfiguration.tcl +CTestConfiguration.ini + +# --- Compiled objects --- +*.o +*.obj +*.a +*.lib +*.so +*.so.* +*.dll +*.dylib +*.exe +*.out +*.app + +# --- Qt / Qt Creator --- +*.pro.user +*.pro.user.* +*.creator.user +*.creator.user.* +moc_*.cpp +moc_*.h +qrc_*.cpp +ui_*.h +qmake_qmake_immediate/ +.qmake.stash +*.moc +Makefile.Release +Makefile.Debug +object_script.* +*.prl +*_plugin_import.cpp + +# --- KDE / KConfig --- +*.kcfg.linux +*.kcfg.mac +*.kcfg.win +.kdev_include_paths + +# --- IDE / Editor --- +.idea/ +*.iml +.vscode/ +*.swp +*.swo +*~ +*.bak +.project +.classpath +.cproject +.settings/ +.qtc_clangd/ +.clangd/ +compile_commands.json +.ninja_log +.ninja_deps +.ninja_state + +# --- OS files --- +.DS_Store +.DS_Store? +.AppleDouble +.LSOverride +Thumbs.db +Desktop.ini +ehthumbs.db +*.lnk + +# --- Flatpak --- +.flatpak-builder/ +flatpak-cache/ +*-flatpak/ + +# --- Android --- +android/.gradle/ +android/build/ +android/local.properties +android/gradle/ +android/gradlew +android/gradlew.bat +*.apk +*.aab +*.dex +*.ap_ +local.properties +.gradle/ + +# --- Packaging --- +*.tar.gz +*.tar.bz2 +*.tar.xz +*.zip +*.deb +*.rpm +*.AppDir +*.AppImage + +# --- Testing / Coverage --- +Testing/ +coverage/ +*.gcno +*.gcda +*.gcov +*.profraw +*.profdata +*.prof + +# --- Misc --- +*.log +*.tmp +*.temp +tags +cscope.* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..648c127 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2026 pluvium27 +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.24) + +project(heurams VERSION 1.0.0) + +include(FeatureSummary) + +set(QT6_MIN_VERSION 6.8.0) +set(KF6_MIN_VERSION 6.12.0) +set(KIRIGAMI_ADDONS_MIN_VERSION 1.10.0) + +find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH}) + +include(FeatureSummary) + +include(KDEInstallDirs) +include(KDECMakeSettings) +include(KDECompilerSettings NO_POLICY_SCOPE) + +include(ECMSetupVersion) +include(ECMFindQmlModule) +include(ECMQmlModule) +include(ECMAddAndroidApk) + +if (NOT ANDROID) + include(KDEGitCommitHooks) + include(KDEClangFormat) +endif() + +ecm_setup_version(${PROJECT_VERSION} + VARIABLE_PREFIX HEURAMS + VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/src/version-heurams.h" +) + +set(QT_EXTRA_COMPONENTS) +if (NOT ANDROID) + list(APPEND QT_EXTRA_COMPONENTS Widgets) +endif() + +find_package(Qt6 ${QT6_MIN_VERSION} REQUIRED COMPONENTS Qml ${QT_EXTRA_COMPONENTS}) +find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS Kirigami CoreAddons Config I18n) + +find_package(KF6KirigamiAddons ${KIRIGAMI_ADDONS_MIN_VERSION} REQUIRED) +set_package_properties(KF6KirigamiAddons PROPERTIES + TYPE REQUIRED + PURPOSE "Required application components and runtime dependency" +) + +ecm_find_qmlmodule(org.kde.kirigamiaddons.formcard) +ecm_find_qmlmodule(org.kde.kirigamiaddons.statefulapp) + +add_subdirectory(src) + +install(FILES top.pluv27.heurams.kiri.desktop DESTINATION ${KDE_INSTALL_APPDIR}) +install(FILES top.pluv27.heurams.kiri.metainfo.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) +ki18n_install(po) + +feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) + +if (NOT ANDROID) + file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES src/*.cpp src/*.h) + kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES}) + kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) +endif() diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt new file mode 100644 index 0000000..0741db7 --- /dev/null +++ b/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,26 @@ +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/LICENSES/FSFAP.txt b/LICENSES/FSFAP.txt new file mode 100644 index 0000000..c96c65e --- /dev/null +++ b/LICENSES/FSFAP.txt @@ -0,0 +1,3 @@ +Copying and distribution of this file, with or without modification, are permitted +in any medium without royalty provided the copyright notice and this notice +are preserved. This file is offered as-is, without any warranty. diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt new file mode 100644 index 0000000..3b6070f --- /dev/null +++ b/LICENSES/GPL-2.0-or-later.txt @@ -0,0 +1,311 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software +is covered by the GNU Lesser General Public License instead.) You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for this service if you +wish), that you receive source code or can get it if you want it, that you +can change the software or use pieces of it in new free programs; and that +you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of +the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And you +must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If +the software is modified by someone else and passed on, we want its recipients +to know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms +of this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or translated +into another language. (Hereinafter, translation is included without limitation +in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running the Program +is not restricted, and the output from the Program is covered only if its +contents constitute a work based on the Program (independent of having been +made by running the Program). Whether that is true depends on what the Program +does. + +1. You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and appropriately +publish on each copy an appropriate copyright notice and disclaimer of warranty; +keep intact all the notices that refer to this License and to the absence +of any warranty; and give any other recipients of the Program a copy of this +License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all +of these conditions: + +a) You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or +in part contains or is derived from the Program or any part thereof, to be +licensed as a whole at no charge to all third parties under the terms of this +License. + +c) If the modified program normally reads commands interactively when run, +you must cause it, when started running for such interactive use in the most +ordinary way, to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or else, saying that +you provide a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this License. +(Exception: if the Program itself is interactive but does not normally print +such an announcement, your work based on the Program is not required to print +an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Program, the distribution of the whole must be +on the terms of this License, whose permissions for other licensees extend +to the entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise +the right to control the distribution of derivative or collective works based +on the Program. + +In addition, mere aggregation of another work not based on the Program with +the Program (or with a work based on the Program) on a volume of a storage +or distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under Section +2) in object code or executable form under the terms of Sections 1 and 2 above +provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, +which must be distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give +any third party, for a charge no more than your cost of physically performing +source distribution, a complete machine-readable copy of the corresponding +source code, to be distributed under the terms of Sections 1 and 2 above on +a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute +corresponding source code. (This alternative is allowed only for noncommercial +distribution and only if you received the program in object code or executable +form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code distributed +need not include anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component itself +accompanies the executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with +the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except +as expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses terminated +so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the Program +(or any work based on the Program), you indicate your acceptance of this License +to do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor +to copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of +the rights granted herein. You are not responsible for enforcing compliance +by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement +or for any other reason (not limited to patent issues), conditions are imposed +on you (whether by court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the conditions of +this License. If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, then as +a consequence you may not distribute the Program at all. For example, if a +patent license would not permit royalty-free redistribution of the Program +by all those who receive copies directly or indirectly through you, then the +only way you could satisfy both it and this License would be to refrain entirely +from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents +or other property right claims or to contest validity of any such claims; +this section has the sole purpose of protecting the integrity of the free +software distribution system, which is implemented by public license practices. +Many people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose +that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit geographical +distribution limitation excluding those countries, so that distribution is +permitted only in or among countries not thus excluded. In such case, this +License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Program does not specify a version number of this License, you may choose +any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing and reuse +of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE +OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE +OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA +OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES +OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH +HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + +one line to give the program's name and an idea of what it does. Copyright +(C) yyyy name of author + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 51 Franklin +Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how +to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when +it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author Gnomovision comes +with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, +and you are welcome to redistribute it under certain conditions; type `show +c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than `show w' and `show c'; they could even be mouse-clicks +or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' +(which makes passes at compilers) written by James Hacker. + +signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..e6f64f2 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..1d92c3e --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,81 @@ +/* + SPDX-FileCopyrightText: 2026 pluvium27 + SPDX-License-Identifier: BSD-3-Clause +*/ + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.0.2' + } +} + +repositories { + google() + jcenter() +} + + +apply plugin: 'com.android.application' +apply from: '../ecm-version.gradle' + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) +} + +android { + /******************************************************* + * The following variables: + * - androidBuildToolsVersion, + * - androidCompileSdkVersion + * - qt5AndroidDir - holds the path to qt android files + * needed to build any Qt application + * on Android. + * + * are defined in gradle.properties file. This file is + * updated by QtCreator and androiddeployqt tools. + * Changing them manually might break the compilation! + *******************************************************/ + + compileSdkVersion androidCompileSdkVersion.toInteger() + + buildToolsVersion androidBuildToolsVersion + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] + aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] + res.srcDirs = [qt5AndroidDir + '/res', 'res'] + resources.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError false + } + + defaultConfig { + minSdkVersion qtMinSdkVersion + targetSdkVersion qtTargetSdkVersion + applicationId "top.pluv27.heurams.kiri" + namespace "top.pluv27.heurams.kiri" + versionCode ecmVersionCode + versionName ecmVersionName + manifestPlaceholders = [versionName: ecmVersionName, versionCode: ecmVersionCode] + } + +} + diff --git a/android/res/drawable/logo.png b/android/res/drawable/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a63448dd83b45947471963aeea2689466633153b GIT binary patch literal 4954 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 + + + + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..75016b3 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: BSD-2-Clause +# SPDX-FileCopyrightText: 2026 pluvium27 + +add_subdirectory(settings) + +qt_add_library(heurams_static STATIC) +ecm_add_qml_module(heurams_static + URI top.pluv27.heurams.kiri + GENERATE_PLUGIN_SOURCE + QML_FILES + qml/Main.qml + DEPENDENCIES + org.kde.kirigamiaddons.formcard + org.kde.kirigamiaddons.statefulapp + org.kde.kirigami + top.pluv27.heurams.kiri.settings +) + +target_sources(heurams_static PRIVATE + heuramsapplication.cpp + heuramsapplication.h +) + +target_link_libraries(heurams_static PUBLIC + Qt6::Quick + KF6::I18n + KF6::CoreAddons + KF6::ConfigGui + KirigamiAddonsStatefulApp +) +target_include_directories(heurams_static PUBLIC ${CMAKE_BINARY_DIR}) + +if (ANDROID) + kirigami_package_breeze_icons(ICONS + list-add + help-about + application-exit + applications-graphics + ) +else() + target_link_libraries(heurams_static PUBLIC + Qt::Widgets + KF6::I18nQml + ) +endif() + +kconfig_add_kcfg_files(heurams_static GENERATE_MOC heuramsconfig.kcfgc) + +add_executable(heurams main.cpp) +target_link_libraries(heurams PUBLIC + KirigamiApp + heurams_static + heurams_staticplugin + heurams_settings + heurams_settingsplugin +) +install(TARGETS heurams ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) +ecm_add_android_apk(heurams ANDROID_DIR ${CMAKE_SOURCE_DIR}/android) diff --git a/src/heuramsapplication.cpp b/src/heuramsapplication.cpp new file mode 100644 index 0000000..b97ea4b --- /dev/null +++ b/src/heuramsapplication.cpp @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: 2026 pluvium27 + +#include "heuramsapplication.h" +#include +#include + +using namespace Qt::StringLiterals; + +HeurAMSApplication::HeurAMSApplication(QObject *parent) + : AbstractKirigamiApplication(parent) +{ + setupActions(); +} + +void HeurAMSApplication::setupActions() +{ + AbstractKirigamiApplication::setupActions(); + + auto actionName = "increment_counter"_L1; + if (KAuthorized::authorizeAction(actionName)) { + auto action = mainCollection()->addAction(actionName, this, &HeurAMSApplication::incrementCounter); + action->setText(i18nc("@action:inmenu", "Increment")); + action->setIcon(QIcon::fromTheme(u"list-add-symbolic"_s)); + KirigamiActionCollection::setDefaultShortcut(action, Qt::CTRL | Qt::Key_I); + } + + readSettings(); +} + +#include "moc_heuramsapplication.cpp" diff --git a/src/heuramsapplication.h b/src/heuramsapplication.h new file mode 100644 index 0000000..fa5e7ad --- /dev/null +++ b/src/heuramsapplication.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2026 pluvium27 +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +using namespace Qt::StringLiterals; + +class HeurAMSApplication : public AbstractKirigamiApplication +{ + Q_OBJECT + QML_ELEMENT + +public: + explicit HeurAMSApplication(QObject *parent = nullptr); + +Q_SIGNALS: + void incrementCounter(); + +private: + void setupActions() override; +}; diff --git a/src/heuramsconfig.kcfg b/src/heuramsconfig.kcfg new file mode 100644 index 0000000..bc15949 --- /dev/null +++ b/src/heuramsconfig.kcfg @@ -0,0 +1,16 @@ + + + + + + + true + + + diff --git a/src/heuramsconfig.kcfgc b/src/heuramsconfig.kcfgc new file mode 100644 index 0000000..1ddfea0 --- /dev/null +++ b/src/heuramsconfig.kcfgc @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2026 pluvium27 +# SPDX-License-Identifier: LGPL-2.0-or-later + +File=heuramsconfig.kcfg +ClassName=HeurAMSConfig +Mutators=true +DefaultValueGetters=true +GenerateProperties=true +ParentInConstructor=true +Singleton=true diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..ca963db --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,85 @@ +/* + SPDX-License-Identifier: GPL-2.0-or-later + SPDX-FileCopyrightText: 2026 pluvium27 +*/ + +#include +#include + +#ifdef Q_OS_ANDROID +#include +#else +#include +#endif +#include +#include +#include + +#include "version-heurams.h" +#include +#include +#include +#include + +#include "heuramsconfig.h" + +using namespace Qt::Literals::StringLiterals; + +#ifdef Q_OS_ANDROID +Q_DECL_EXPORT +#endif +int main(int argc, char *argv[]) +{ +#ifdef Q_OS_ANDROID + QGuiApplication app(argc, argv); +#else + QApplication app(argc, argv); +#endif + KirigamiAppDefaults::apply(&app); + + KLocalizedString::setApplicationDomain("heurams"); + QCoreApplication::setOrganizationName(u"KDE"_s); + + KAboutData aboutData( + // The program name used internally. + u"heurams"_s, + // A displayable program name string. + i18nc("@title", "HeurAMS"), + // The program version string. + QStringLiteral(HEURAMS_VERSION_STRING), + // Short description of what the app does. + i18n("Application Description"), + // The license this code is released under. + KAboutLicense::GPL, + // Copyright Statement. + i18n("(c) 2026")); + aboutData.addAuthor(i18nc("@info:credit", "pluvium27"), + i18nc("@info:credit", "Maintainer"), + u"pluvium27@outlook.com"_s, + u"https://yourwebsite.com"_s); + aboutData.setTranslator(i18nc("NAME OF TRANSLATORS", "Your names"), i18nc("EMAIL OF TRANSLATORS", "Your emails")); + KAboutData::setApplicationData(aboutData); + QGuiApplication::setWindowIcon(QIcon::fromTheme(u"top.pluv27.heurams.kiri"_s)); + + QQmlApplicationEngine engine; + + KLocalization::setupLocalizedContext(&engine); + + auto config = HeurAMSConfig::self(); + + qmlRegisterSingletonInstance("top.pluv27.heurams.kiri.private", 1, 0, "Config", config); + + { + QCommandLineParser parser; + aboutData.setupCommandLine(&parser); + parser.process(app); + aboutData.processCommandLine(&parser); + } + + engine.loadFromModule("top.pluv27.heurams.kiri", u"Main"_s); + if (engine.rootObjects().isEmpty()) { + return EXIT_FAILURE; + } + + return app.exec(); +} diff --git a/src/qml/Main.qml b/src/qml/Main.qml new file mode 100644 index 0000000..c9d84bd --- /dev/null +++ b/src/qml/Main.qml @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: 2026 pluvium27 + +import QtQuick +import QtQuick.Controls as QQC2 +import QtQuick.Layouts + +import org.kde.kirigami as Kirigami +import org.kde.kirigamiaddons.statefulapp as StatefulApp +import org.kde.kirigamiaddons.formcard as FormCard + +import top.pluv27.heurams.kiri +import top.pluv27.heurams.kiri.settings as Settings + +StatefulApp.StatefulWindow { + id: root + + property int counter: 0 + + title: i18nc("@title:window", "HeurAMS") + + windowName: "HeurAMS" + + minimumWidth: Kirigami.Units.gridUnit * 20 + minimumHeight: Kirigami.Units.gridUnit * 20 + + application: HeurAMSApplication { + configurationView: Settings.HeurAMSConfigurationView {} + } + + Connections { + target: root.application + + function onIncrementCounter(): void { + root.counter += 1; + } + } + + globalDrawer: Kirigami.GlobalDrawer { + isMenu: !Kirigami.Settings.isMobile + actions: [ + Kirigami.Action { + id: incrementCounterAction + fromQAction: root.application.action("increment_counter") + }, + Kirigami.Action { + separator: true + }, + Kirigami.Action { + fromQAction: root.application.action("options_configure") + }, + Kirigami.Action { + fromQAction: root.application.action("options_configure_keybinding") + }, + Kirigami.Action { + separator: true + }, + Kirigami.Action { + id: aboutAction + fromQAction: root.application.action("open_about_page") + }, + Kirigami.Action { + fromQAction: root.application.action("open_about_kde_page") + }, + Kirigami.Action { + fromQAction: root.application.action("file_quit") + } + ] + } + + pageStack.initialPage: FormCard.FormCardPage { + id: page + + title: i18nc("@title", "HeurAMS") + + actions: [incrementCounterAction] + + Kirigami.Icon { + source: "applications-development" + implicitWidth: Math.round(Kirigami.Units.iconSizes.huge * 1.5) + implicitHeight: Math.round(Kirigami.Units.iconSizes.huge * 1.5) + + Layout.alignment: Qt.AlignHCenter + Layout.topMargin: Kirigami.Units.largeSpacing * 4 + } + + Kirigami.Heading { + text: i18nc("@title", "Welcome to HeurAMS") + '\n' + i18nc("@info:status", "Counter: %1", root.counter) + horizontalAlignment: Qt.AlignHCenter + + Layout.topMargin: Kirigami.Units.largeSpacing + Layout.fillWidth: true + } + + FormCard.FormCard { + Layout.topMargin: Kirigami.Units.largeSpacing * 4 + + FormCard.FormButtonDelegate { + action: incrementCounterAction + } + + FormCard.FormDelegateSeparator {} + + FormCard.FormButtonDelegate { + action: aboutAction + } + } + } +} diff --git a/src/settings/CMakeLists.txt b/src/settings/CMakeLists.txt new file mode 100644 index 0000000..bf3833f --- /dev/null +++ b/src/settings/CMakeLists.txt @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2026 pluvium27 +# SPDX-License-Identifier: BSD-2-Clause + +qt_add_library(heurams_settings STATIC) +ecm_add_qml_module(heurams_settings + GENERATE_PLUGIN_SOURCE + URI top.pluv27.heurams.kiri.settings + QML_FILES + HeurAMSConfigurationView.qml + GeneralPage.qml +) diff --git a/src/settings/GeneralPage.qml b/src/settings/GeneralPage.qml new file mode 100644 index 0000000..46a8276 --- /dev/null +++ b/src/settings/GeneralPage.qml @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2026 pluvium27 +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma ComponentBehavior: Bound + +import QtQuick +import org.kde.kirigamiaddons.formcard as FormCard + +FormCard.FormCardPage { + id: root + + title: i18nc("@title", "General") + + FormCard.FormHeader { + title: i18nc("@title:group", "My Group") + } + + FormCard.FormHeader { + title: i18nc("@title:group", "My Group:") + } + + FormCard.FormCard { + FormCard.FormTextFieldDelegate { + label: i18nc("@label:textbox", "My Label:") + } + } +} diff --git a/src/settings/HeurAMSConfigurationView.qml b/src/settings/HeurAMSConfigurationView.qml new file mode 100644 index 0000000..acec74c --- /dev/null +++ b/src/settings/HeurAMSConfigurationView.qml @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2026 pluvium27 +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma ComponentBehavior: Bound + +import QtQuick +import org.kde.kirigamiaddons.settings as KirigamiSettings + +KirigamiSettings.ConfigurationView { + id: root + + modules: [ + KirigamiSettings.ConfigurationModule { + moduleId: "general" + text: i18nc("@action:button", "General") + icon.name: "preferences-system-symbolic" + page: () => Qt.createComponent("top.pluv27.heurams.kiri.settings", "GeneralPage") + } + ] +} diff --git a/top.pluv27.heurams.kiri.desktop b/top.pluv27.heurams.kiri.desktop new file mode 100644 index 0000000..d94cb22 --- /dev/null +++ b/top.pluv27.heurams.kiri.desktop @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: CC0-1.0 +# SPDX-FileCopyrightText: 2026 pluvium27 +[Desktop Entry] +Name=HeurAMS +Comment=HeurAMS Kirigami Application +Version=1.0 +Exec=heurams +Icon=applications-development +Type=Application +Terminal=false +# Add an actual main category here (and possibly applicable additional ones) +# https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry +Categories=Qt;KDE; diff --git a/top.pluv27.heurams.kiri.metainfo.xml b/top.pluv27.heurams.kiri.metainfo.xml new file mode 100644 index 0000000..e6c51c2 --- /dev/null +++ b/top.pluv27.heurams.kiri.metainfo.xml @@ -0,0 +1,25 @@ + + + + top.pluv27.heurams.kiri + HeurAMS Kirigami Application + A short summary describing what this software is about + CC0-1.0 + The license of this software as SPDX string, e.g. "GPL-2.0-or-later" + + The KDE Community + https://kde.org + + +

Multiple paragraphs of long description, describing this software component.

+

You can also use ordered and unordered lists:

+
    +
  • Feature 1
  • +
  • Feature 2
  • +
+

Keep in mind to XML-escape characters, and that this is not HTML markup.

+
+