diff options
| -rw-r--r-- | .clang-format | 91 | ||||
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | CMakeLists.txt | 72 | ||||
| -rw-r--r-- | LICENSES/BSD-3-Clause.txt | 26 | ||||
| -rw-r--r-- | LICENSES/CC0-1.0.txt | 121 | ||||
| -rw-r--r-- | LICENSES/FSFAP.txt | 3 | ||||
| -rw-r--r-- | LICENSES/GPL-2.0-or-later.txt | 311 | ||||
| -rw-r--r-- | org.kde.kue.desktop | 13 | ||||
| -rw-r--r-- | org.kde.kue.metainfo.xml | 25 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 57 | ||||
| -rw-r--r-- | src/kueapplication.cpp | 73 | ||||
| -rw-r--r-- | src/kueapplication.h | 37 | ||||
| -rw-r--r-- | src/kueconfig.kcfg | 16 | ||||
| -rw-r--r-- | src/kueconfig.kcfgc | 10 | ||||
| -rw-r--r-- | src/main.cpp | 74 | ||||
| -rw-r--r-- | src/qml/Main.qml | 168 | ||||
| -rw-r--r-- | src/settings/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | src/settings/GeneralPage.qml | 27 | ||||
| -rw-r--r-- | src/settings/KueConfigurationView.qml | 20 |
19 files changed, 1157 insertions, 0 deletions
diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..bb67ea6 --- /dev/null +++ b/.clang-format @@ -0,0 +1,91 @@ +--- +# SPDX-FileCopyrightText: 2019 Christoph Cullmann <cullmann@kde.org> +# SPDX-FileCopyrightText: 2019 Gernot Gebhard <gebhard@absint.com> +# +# 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 +--- + +# 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<std::vector<lala>> +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/.gitignore b/.gitignore new file mode 100644 index 0000000..7194ea7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.cache +build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..8c652ed --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,72 @@ +# SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +project(kue VERSION 0.1) + +include(FeatureSummary) + +set(QT6_MIN_VERSION 6.5.0) +set(KF6_MIN_VERSION 6.0.0) +set(KIRIGAMI_ADDONS_MIN_VERSION 1.2.40) + +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(ECMQmlModule) + +include(KDEGitCommitHooks) +include(KDEClangFormat) + +ecm_setup_version(${PROJECT_VERSION} + VARIABLE_PREFIX KUE + VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/src/version-kue.h" +) + +set(QT_EXTRA_COMPONENTS) +list(APPEND QT_EXTRA_COMPONENTS Widgets) + +find_package(Qt6 ${QT6_MIN_VERSION} REQUIRED COMPONENTS Core Gui Qml QuickControls2 Svg ${QT_EXTRA_COMPONENTS}) +find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS Kirigami CoreAddons Config I18n) + +# akonadi +set(LIBKDEPIM_VERSION "6.2.3") +find_package(KPim6Akonadi ${LIBKDEPIM_VERSION} CONFIG REQUIRED) +find_package(KPim6Libkdepim ${LIBKDEPIM_VERSION} CONFIG REQUIRED) +find_package(KPim6AkonadiMime ${LIBKDEPIM_VERSION} CONFIG REQUIRED) +find_package(KPim6Mime ${LIBKDEPIM_VERSION} CONFIG REQUIRED) +find_package(KPim6MailCommon ${LIBKDEPIM_VERSION} CONFIG REQUIRED) + +find_package(KF6KirigamiAddons ${KIRIGAMI_ADDONS_MIN_VERSION} REQUIRED) +set_package_properties(KF6KirigamiAddons PROPERTIES + TYPE REQUIRED + PURPOSE "Required application components and runtime dependency" +) + +qt_policy(SET QTP0001 NEW) + +ecm_find_qmlmodule(org.kde.kirigamiaddons.formcard) +ecm_find_qmlmodule(org.kde.kirigamiaddons.statefulapp) + +add_subdirectory(src) + +install(FILES org.kde.kue.desktop DESTINATION ${KDE_INSTALL_APPDIR}) +install(FILES org.kde.kue.metainfo.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) +ki18n_install(po) + +feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) + +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) 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) <year> <owner>. 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/org.kde.kue.desktop b/org.kde.kue.desktop new file mode 100644 index 0000000..85e92c4 --- /dev/null +++ b/org.kde.kue.desktop @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: CC0-1.0 +# SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +[Desktop Entry] +Name=Kue +Comment=Kue Kirigami Application +Version=1.0 +Exec=kue +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/org.kde.kue.metainfo.xml b/org.kde.kue.metainfo.xml new file mode 100644 index 0000000..e6f3662 --- /dev/null +++ b/org.kde.kue.metainfo.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + SPDX-License-Identifier: CC0-1.0 + SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> + --> +<component type="desktop-application"> + <id>org.kde.kue</id> + <name>Kue Kirigami Application</name> + <summary>A short summary describing what this software is about</summary> + <metadata_license>CC0-1.0</metadata_license> + <project_license>The license of this software as SPDX string, e.g. "GPL-2.0-or-later"</project_license> + <developer id="kde.org"> + <name>The KDE Community</name> + <url>https://kde.org</url> + </developer> + <description> + <p>Multiple paragraphs of long description, describing this software component.</p> + <p>You can also use ordered and unordered lists:</p> + <ul> + <li>Feature 1</li> + <li>Feature 2</li> + </ul> + <p>Keep in mind to XML-escape characters, and that this is not HTML markup.</p> + </description> +</component> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..e28db18 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,57 @@ +# SPDX-License-Identifier: BSD-2-Clause +# SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> + +add_subdirectory(settings) + +qt_add_library(kue_static STATIC) +ecm_add_qml_module(kue_static + URI org.kde.kue + GENERATE_PLUGIN_SOURCE + VERSION 1.0 + QML_FILES + qml/Main.qml + DEPENDENCIES + org.kde.kirigamiaddons.statefulapp + org.kde.kirigami + org.kde.kue.settings +) + +target_sources(kue_static PUBLIC + kueapplication.cpp + kueapplication.h +) + +target_link_libraries(kue_static PUBLIC + Qt6::Core + Qt6::Gui + Qt6::Qml + Qt6::Quick + Qt6::QuickControls2 + Qt6::Svg + KF6::I18n + KF6::CoreAddons + KF6::ConfigCore + KF6::ConfigGui + KirigamiAddonsStatefulApp + KPim6::AkonadiCore + KPim6::AkonadiAgentBase + KPim6::AkonadiWidgets + KPim6::AkonadiXml + KPim6::AkonadiMime + KPim6::Mime + KPim6::MailCommon +) +target_include_directories(kue_static PUBLIC ${CMAKE_BINARY_DIR} /home/hawk/kde/usr/include) + +target_link_libraries(kue_static PUBLIC Qt::Widgets) + +kconfig_add_kcfg_files(kue_static GENERATE_MOC kueconfig.kcfgc) + +add_executable(kue main.cpp) +target_link_libraries(kue PUBLIC + kue_static + kue_staticplugin + kue_settings + kue_settingsplugin +) +install(TARGETS kue ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/src/kueapplication.cpp b/src/kueapplication.cpp new file mode 100644 index 0000000..b459acf --- /dev/null +++ b/src/kueapplication.cpp @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> + +#include "kueapplication.h" +#include <KAuthorized> +#include <KLocalizedString> +#include <KDescendantsProxyModel> +#include <Akonadi/ServerManager> +#include <Akonadi/Session> +#include <Akonadi/Monitor> +#include <Akonadi/EntityTreeModel> +#include <Akonadi/CollectionFilterProxyModel> +#include <KMime/Message> +#include <QApplication> +#include <QDebug> + +using namespace Qt::StringLiterals; + +KueApplication::KueApplication(QObject *parent) + : AbstractKirigamiApplication(parent) + , m_loading(true) +{ + m_session = new Akonadi::Session(QByteArrayLiteral("Kue Kernel"), this); + + auto monitor = new Akonadi::Monitor(this); + + auto treeModel = new Akonadi::EntityTreeModel(monitor, this); + treeModel->setItemPopulationStrategy(Akonadi::EntityTreeModel::LazyPopulation); + + auto entityTreeModel = new Akonadi::CollectionFilterProxyModel(this); + entityTreeModel->setSourceModel(treeModel); + entityTreeModel->addMimeTypeFilter(KMime::Message::mimeType()); + + m_descendantsProxyModel = new KDescendantsProxyModel(this); + m_descendantsProxyModel->setSourceModel(entityTreeModel); + qDebug() << m_descendantsProxyModel->rowCount(); + + if (Akonadi::ServerManager::isRunning()) { + m_loading = false; + } else { + connect(Akonadi::ServerManager::self(), &Akonadi::ServerManager::stateChanged, this, [this](Akonadi::ServerManager::State state) { + if (state == Akonadi::ServerManager::Broken) { + qDebug() << "ServerManager Broken"; + qApp->exit(-1); + return; + } + bool loading = state != Akonadi::ServerManager::State::Running; + if (loading == m_loading) { + return; + } + m_loading = loading; + Q_EMIT loadingChanged(); + disconnect(Akonadi::ServerManager::self(), &Akonadi::ServerManager::stateChanged, this, nullptr); + }); + } +} + +bool KueApplication::loading() const +{ + return m_loading; +} + +KDescendantsProxyModel *KueApplication::descendantsProxyModel() const +{ + return m_descendantsProxyModel; +} + +Akonadi::Session *KueApplication::session() const +{ + return m_session; +} + +#include "moc_kueapplication.cpp" diff --git a/src/kueapplication.h b/src/kueapplication.h new file mode 100644 index 0000000..888c592 --- /dev/null +++ b/src/kueapplication.h @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <QQmlEngine> +#include <AbstractKirigamiApplication> +#include <KDescendantsProxyModel> + +using namespace Qt::StringLiterals; + +namespace Akonadi { + class Session; +} + +class KueApplication : public AbstractKirigamiApplication +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(bool loading READ loading NOTIFY loadingChanged) + Q_PROPERTY(KDescendantsProxyModel *descendantsProxyModel READ descendantsProxyModel CONSTANT) + + bool loading() const; + Akonadi::Session *session() const; + +public: + explicit KueApplication(QObject *parent = nullptr); + KDescendantsProxyModel *descendantsProxyModel() const; + +Q_SIGNALS: + void loadingChanged(); + +private: + bool m_loading; + Akonadi::Session *m_session; + KDescendantsProxyModel *m_descendantsProxyModel; +}; diff --git a/src/kueconfig.kcfg b/src/kueconfig.kcfg new file mode 100644 index 0000000..1ad1fd2 --- /dev/null +++ b/src/kueconfig.kcfg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 + http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > +<!-- +SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +SPDX-License-Identifier: LGPL-2.0-or-later +--> + <group name="General"> + <entry name="someSetting" type="Bool"> + <label>Some setting description</label> + <default>true</default> + </entry> + </group> +</kcfg> diff --git a/src/kueconfig.kcfgc b/src/kueconfig.kcfgc new file mode 100644 index 0000000..0a02a78 --- /dev/null +++ b/src/kueconfig.kcfgc @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +# SPDX-License-Identifier: LGPL-2.0-or-later + +File=kueconfig.kcfg +ClassName=KueConfig +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..41f7fef --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,74 @@ +/* + SPDX-License-Identifier: GPL-2.0-or-later + SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +*/ + +#include <QtGlobal> +#include <QApplication> + +#include <QIcon> +#include <QQmlApplicationEngine> +#include <QQmlContext> +#include <QQuickStyle> +#include <QUrl> +#include <QDebug> +#include <KDescendantsProxyModel> + +#include "version-kue.h" +#include <KAboutData> +#include <KLocalizedContext> +#include <KLocalizedString> + +#include "kueconfig.h" + +using namespace Qt::Literals::StringLiterals; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + // Default to org.kde.desktop style unless the user forces another style + if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) { + QQuickStyle::setStyle(u"org.kde.desktop"_s); + } + + KLocalizedString::setApplicationDomain("kue"); + QCoreApplication::setOrganizationName(u"KDE"_s); + + KAboutData aboutData( + // The program name used internally. + u"kue"_s, + // A displayable program name string. + i18nc("@title", "Kue"), + // The program version string. + QStringLiteral(KUE_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) 2024")); + aboutData.addAuthor(i18nc("@info:credit", "Alexander Kavon"), + i18nc("@info:credit", "Maintainer"), + u"me+kue@alexkavon.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"org.kde.kue"_s)); + + QQmlApplicationEngine engine; + + auto config = KueConfig::self(); + + qRegisterMetaType<KDescendantsProxyModel*>("KDescendantsProxyModel*"); + qmlRegisterSingletonInstance("org.kde.kue.private", 1, 0, "Kue", config); + + engine.rootContext()->setContextObject(new KLocalizedContext(&engine)); + engine.loadFromModule("org.kde.kue", u"Main"_s); + + if (engine.rootObjects().isEmpty()) { + return -1; + } + + return app.exec(); +} diff --git a/src/qml/Main.qml b/src/qml/Main.qml new file mode 100644 index 0000000..cef37e9 --- /dev/null +++ b/src/qml/Main.qml @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> + +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.kue +import org.kde.kue.settings as Settings + +StatefulApp.StatefulWindow { + id: root + + property int counter: 0 + + title: i18nc("@title:window", "Kue") + + windowName: "Kue" + + minimumWidth: Kirigami.Units.gridUnit * 20 + minimumHeight: Kirigami.Units.gridUnit * 20 + + application: KueApplication { + configurationView: Settings.KueConfigurationView {} + } + + // 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: KueApplication.loading ? loadingPage : mainPage + + Component { + id: loadingPage + Kirigami.Page { + Kirigami.PlaceholderMessage { + anchors.centerIn: parent + text: i18n("Loading, please wait...") + } + } + } + + Kirigami.ScrollablePage { + id: mainPage + + title: i18nc("@title", "Kue") + + supportsRefreshing: true + + ListView { + model: KueApplication.descendantsProxyModel + highlight: Rectangle { + width: parent.width + color: "blue" + } + delegate: Kirigami.SwipeListItem { + id: task + + required property bool completed + + contentItem: RowLayout { + QQC2.CheckBox { + id: control + checked: task.completed + onCheckedChanged: { + if (control.checked != task.completed) { + task.completed = control.checked; + } + } + indicator: Rectangle { + implicitWidth: 30 + implicitHeight: 30 + x: control.leftPadding + y: parent.height / 2 - height / 2 + border.color: control.down ? "darkblue" : "gray" + border.width: 2 + Rectangle { + visible: control.checked + color: "red" + radius: 1 + width: 15 + height: 15 + anchors.margins: 5 + anchors.fill: parent + } + } + } + + QQC2.TextField { + id: taskEdit + Layout.fillWidth: true + height: Math.max(implicitHeight, Kirigami.Units.iconSizes.smallMedium) + placeholderText: "Task Info..." + text: model.display + " : " + task.completed + wrapMode: TextInput.Wrap + background: Rectangle { + id: taskEditBg + border.color: "transparent" + color: "transparent" + Rectangle { + visible: taskEdit.activeFocus + anchors.bottom: taskEditBg.bottom + height: 2 + width: parent.width + color: "green" + } + } + } + + Kirigami.Icon { + source: "view-list-details" + visible: taskEdit.activeFocus + implicitHeight: 20 + implicitWidth: 20 + } + } + } + section { + property: "section" + delegate: Kirigami.ListSectionHeader { + required property string section + + text: qsTr("Section %1").arg(parseInt(section) + 1) + width: ListView.view.width - ListView.view.leftMargin - ListView.view.rightMargin + } + } + } + } +} diff --git a/src/settings/CMakeLists.txt b/src/settings/CMakeLists.txt new file mode 100644 index 0000000..d4847a6 --- /dev/null +++ b/src/settings/CMakeLists.txt @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +# SPDX-License-Identifier: BSD-2-Clause + +qt_add_library(kue_settings STATIC) +ecm_add_qml_module(kue_settings + GENERATE_PLUGIN_SOURCE + URI org.kde.kue.settings + QML_FILES + KueConfigurationView.qml + GeneralPage.qml +) diff --git a/src/settings/GeneralPage.qml b/src/settings/GeneralPage.qml new file mode 100644 index 0000000..3324c95 --- /dev/null +++ b/src/settings/GeneralPage.qml @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +// 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/KueConfigurationView.qml b/src/settings/KueConfigurationView.qml new file mode 100644 index 0000000..c93ec52 --- /dev/null +++ b/src/settings/KueConfigurationView.qml @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2024 Alexander Kavon <me+kue@alexkavon.com> +// 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("org.kde.kue.settings", "GeneralPage") + } + ] +} |
