initial commit
This commit is contained in:
commit
fae3d30dbd
26 changed files with 18409 additions and 0 deletions
258
.clang-format
Normal file
258
.clang-format
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: Chromium
|
||||||
|
AccessModifierOffset: -1
|
||||||
|
AlignAfterOpenBracket: AlwaysBreak
|
||||||
|
AlignArrayOfStructures: None
|
||||||
|
AlignConsecutiveAssignments:
|
||||||
|
Enabled: true
|
||||||
|
AcrossEmptyLines: false
|
||||||
|
AcrossComments: false
|
||||||
|
AlignCompound: false
|
||||||
|
PadOperators: true
|
||||||
|
AlignConsecutiveBitFields:
|
||||||
|
Enabled: false
|
||||||
|
AcrossEmptyLines: false
|
||||||
|
AcrossComments: false
|
||||||
|
AlignCompound: false
|
||||||
|
PadOperators: false
|
||||||
|
AlignConsecutiveDeclarations:
|
||||||
|
Enabled: true
|
||||||
|
AcrossEmptyLines: false
|
||||||
|
AcrossComments: false
|
||||||
|
AlignCompound: false
|
||||||
|
PadOperators: false
|
||||||
|
AlignConsecutiveMacros:
|
||||||
|
Enabled: true
|
||||||
|
AcrossEmptyLines: false
|
||||||
|
AcrossComments: false
|
||||||
|
AlignCompound: false
|
||||||
|
PadOperators: false
|
||||||
|
AlignEscapedNewlines: Left
|
||||||
|
AlignOperands: Align
|
||||||
|
AlignTrailingComments:
|
||||||
|
Kind: Always
|
||||||
|
OverEmptyLines: 0
|
||||||
|
AllowAllArgumentsOnNextLine: false
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
|
AllowShortBlocksOnASingleLine: Always
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortEnumsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
|
AllowShortIfStatementsOnASingleLine: WithoutElse
|
||||||
|
AllowShortLambdasOnASingleLine: All
|
||||||
|
AllowShortLoopsOnASingleLine: true
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: true
|
||||||
|
AlwaysBreakTemplateDeclarations: Yes
|
||||||
|
AttributeMacros:
|
||||||
|
- __capability
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: false
|
||||||
|
BitFieldColonSpacing: Both
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: false
|
||||||
|
AfterClass: false
|
||||||
|
AfterControlStatement: Never
|
||||||
|
AfterEnum: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
AfterFunction: false
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
BeforeWhile: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakAfterAttributes: Never
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakArrays: true
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeConceptDeclarations: Always
|
||||||
|
BreakBeforeBraces: Attach
|
||||||
|
BreakBeforeInlineASMColon: OnlyMultiline
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 160
|
||||||
|
CommentPragmas: "^ IWYU pragma:"
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
EmptyLineAfterAccessModifier: Never
|
||||||
|
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: false
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IfMacros:
|
||||||
|
- KJ_IF_MAYBE
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<ext/.*\.h>'
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
- Regex: '^<.*\.h>'
|
||||||
|
Priority: 1
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
- Regex: "^<.*"
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
- Regex: ".*"
|
||||||
|
Priority: 3
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
IncludeIsMainRegex: "([-_](test|unittest))?$"
|
||||||
|
IncludeIsMainSourceRegex: ""
|
||||||
|
IndentAccessModifiers: true
|
||||||
|
IndentCaseBlocks: false
|
||||||
|
IndentCaseLabels: true
|
||||||
|
IndentExternBlock: AfterExternBlock
|
||||||
|
IndentGotoLabels: true
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentRequiresClause: true
|
||||||
|
IndentWidth: 2
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
InsertBraces: false
|
||||||
|
InsertNewlineAtEOF: true
|
||||||
|
InsertTrailingCommas: None
|
||||||
|
IntegerLiteralSeparator:
|
||||||
|
Binary: 0
|
||||||
|
BinaryMinDigits: 0
|
||||||
|
Decimal: 0
|
||||||
|
DecimalMinDigits: 0
|
||||||
|
Hex: 0
|
||||||
|
HexMinDigits: 0
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
LambdaBodyIndentation: Signature
|
||||||
|
LineEnding: LF
|
||||||
|
MacroBlockBegin: ""
|
||||||
|
MacroBlockEnd: ""
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: All
|
||||||
|
ObjCBinPackProtocolList: Never
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCBreakBeforeNestedBlockParam: true
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PackConstructorInitializers: NextLine
|
||||||
|
PenaltyBreakAssignment: 2
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 1
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakOpenParenthesis: 0
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyIndentedWhitespace: 0
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 200
|
||||||
|
PointerAlignment: Left
|
||||||
|
PPIndentWidth: -1
|
||||||
|
QualifierAlignment: Leave
|
||||||
|
RawStringFormats:
|
||||||
|
- Language: Cpp
|
||||||
|
Delimiters:
|
||||||
|
- cc
|
||||||
|
- CC
|
||||||
|
- cpp
|
||||||
|
- Cpp
|
||||||
|
- CPP
|
||||||
|
- "c++"
|
||||||
|
- "C++"
|
||||||
|
CanonicalDelimiter: ""
|
||||||
|
BasedOnStyle: google
|
||||||
|
- Language: TextProto
|
||||||
|
Delimiters:
|
||||||
|
- pb
|
||||||
|
- PB
|
||||||
|
- proto
|
||||||
|
- PROTO
|
||||||
|
EnclosingFunctions:
|
||||||
|
- EqualsProto
|
||||||
|
- EquivToProto
|
||||||
|
- PARSE_PARTIAL_TEXT_PROTO
|
||||||
|
- PARSE_TEST_PROTO
|
||||||
|
- PARSE_TEXT_PROTO
|
||||||
|
- ParseTextOrDie
|
||||||
|
- ParseTextProtoOrDie
|
||||||
|
- ParseTestProto
|
||||||
|
- ParsePartialTestProto
|
||||||
|
CanonicalDelimiter: pb
|
||||||
|
BasedOnStyle: google
|
||||||
|
ReferenceAlignment: Pointer
|
||||||
|
ReflowComments: true
|
||||||
|
RemoveBracesLLVM: false
|
||||||
|
RemoveSemicolon: false
|
||||||
|
RequiresClausePosition: OwnLine
|
||||||
|
RequiresExpressionIndentation: OuterScope
|
||||||
|
SeparateDefinitionBlocks: Leave
|
||||||
|
ShortNamespaceLines: 1
|
||||||
|
SortIncludes: CaseSensitive
|
||||||
|
SortJavaStaticImport: Before
|
||||||
|
SortUsingDeclarations: LexicographicNumeric
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceAroundPointerQualifiers: Default
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCaseColon: false
|
||||||
|
SpaceBeforeCpp11BracedList: true
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeParensOptions:
|
||||||
|
AfterControlStatements: true
|
||||||
|
AfterForeachMacros: true
|
||||||
|
AfterFunctionDefinitionName: false
|
||||||
|
AfterFunctionDeclarationName: false
|
||||||
|
AfterIfMacros: true
|
||||||
|
AfterOverloadedOperator: false
|
||||||
|
AfterRequiresInClause: false
|
||||||
|
AfterRequiresInExpression: false
|
||||||
|
BeforeNonEmptyParentheses: false
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInAngles: Never
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInLineCommentPrefix:
|
||||||
|
Minimum: 1
|
||||||
|
Maximum: -1
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Auto
|
||||||
|
StatementAttributeLikeMacros:
|
||||||
|
- Q_EMIT
|
||||||
|
StatementMacros:
|
||||||
|
- Q_UNUSED
|
||||||
|
- QT_REQUIRE_VERSION
|
||||||
|
TabWidth: 8
|
||||||
|
UseTab: Never
|
||||||
|
WhitespaceSensitiveMacros:
|
||||||
|
- BOOST_PP_STRINGIZE
|
||||||
|
- CF_SWIFT_NAME
|
||||||
|
- NS_SWIFT_NAME
|
||||||
|
- PP_STRINGIZE
|
||||||
|
- STRINGIZE
|
||||||
|
---
|
2
.clangd
Normal file
2
.clangd
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
CompileFlags:
|
||||||
|
Add: [-std=c++20]
|
83
.gitignore
vendored
Normal file
83
.gitignore
vendored
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
# This file is used to ignore files which are generated
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
*~
|
||||||
|
*.autosave
|
||||||
|
*.a
|
||||||
|
*.core
|
||||||
|
*.moc
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*_pch.h.cpp
|
||||||
|
*_resource.rc
|
||||||
|
*.qm
|
||||||
|
.#*
|
||||||
|
*.*#
|
||||||
|
core
|
||||||
|
!core/
|
||||||
|
tags
|
||||||
|
.DS_Store
|
||||||
|
.directory
|
||||||
|
*.debug
|
||||||
|
Makefile*
|
||||||
|
*.prl
|
||||||
|
*.app
|
||||||
|
moc_*.cpp
|
||||||
|
ui_*.h
|
||||||
|
qrc_*.cpp
|
||||||
|
Thumbs.db
|
||||||
|
*.res
|
||||||
|
*.rc
|
||||||
|
/.qmake.cache
|
||||||
|
/.qmake.stash
|
||||||
|
|
||||||
|
# qtcreator generated files
|
||||||
|
*.pro.user*
|
||||||
|
CMakeLists.txt.user*
|
||||||
|
|
||||||
|
# xemacs temporary files
|
||||||
|
*.flc
|
||||||
|
|
||||||
|
# Vim temporary files
|
||||||
|
.*.swp
|
||||||
|
|
||||||
|
# Visual Studio generated files
|
||||||
|
*.ib_pdb_index
|
||||||
|
*.idb
|
||||||
|
*.ilk
|
||||||
|
*.pdb
|
||||||
|
*.sln
|
||||||
|
*.suo
|
||||||
|
*.vcproj
|
||||||
|
*vcproj.*.*.user
|
||||||
|
*.ncb
|
||||||
|
*.sdf
|
||||||
|
*.opensdf
|
||||||
|
*.vcxproj
|
||||||
|
*vcxproj.*
|
||||||
|
|
||||||
|
# MinGW generated files
|
||||||
|
*.Debug
|
||||||
|
*.Release
|
||||||
|
|
||||||
|
# Python byte code
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Binaries
|
||||||
|
# --------
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
.qt/
|
||||||
|
.rcc/
|
||||||
|
bin/
|
||||||
|
build/
|
||||||
|
**/qmldir
|
||||||
|
**/meta_types
|
||||||
|
**/qmltypes
|
||||||
|
**/*.qrc
|
||||||
|
CMakeCache.txt
|
8
CMakeLists.txt
Normal file
8
CMakeLists.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
project(koto VERSION 0.1 LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
|
|
||||||
|
add_subdirectory(desktop)
|
373
COPYING
Normal file
373
COPYING
Normal file
|
@ -0,0 +1,373 @@
|
||||||
|
Mozilla Public License Version 2.0
|
||||||
|
==================================
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
--------------
|
||||||
|
|
||||||
|
1.1. "Contributor"
|
||||||
|
means each individual or legal entity that creates, contributes to
|
||||||
|
the creation of, or owns Covered Software.
|
||||||
|
|
||||||
|
1.2. "Contributor Version"
|
||||||
|
means the combination of the Contributions of others (if any) used
|
||||||
|
by a Contributor and that particular Contributor's Contribution.
|
||||||
|
|
||||||
|
1.3. "Contribution"
|
||||||
|
means Covered Software of a particular Contributor.
|
||||||
|
|
||||||
|
1.4. "Covered Software"
|
||||||
|
means Source Code Form to which the initial Contributor has attached
|
||||||
|
the notice in Exhibit A, the Executable Form of such Source Code
|
||||||
|
Form, and Modifications of such Source Code Form, in each case
|
||||||
|
including portions thereof.
|
||||||
|
|
||||||
|
1.5. "Incompatible With Secondary Licenses"
|
||||||
|
means
|
||||||
|
|
||||||
|
(a) that the initial Contributor has attached the notice described
|
||||||
|
in Exhibit B to the Covered Software; or
|
||||||
|
|
||||||
|
(b) that the Covered Software was made available under the terms of
|
||||||
|
version 1.1 or earlier of the License, but not also under the
|
||||||
|
terms of a Secondary License.
|
||||||
|
|
||||||
|
1.6. "Executable Form"
|
||||||
|
means any form of the work other than Source Code Form.
|
||||||
|
|
||||||
|
1.7. "Larger Work"
|
||||||
|
means a work that combines Covered Software with other material, in
|
||||||
|
a separate file or files, that is not Covered Software.
|
||||||
|
|
||||||
|
1.8. "License"
|
||||||
|
means this document.
|
||||||
|
|
||||||
|
1.9. "Licensable"
|
||||||
|
means having the right to grant, to the maximum extent possible,
|
||||||
|
whether at the time of the initial grant or subsequently, any and
|
||||||
|
all of the rights conveyed by this License.
|
||||||
|
|
||||||
|
1.10. "Modifications"
|
||||||
|
means any of the following:
|
||||||
|
|
||||||
|
(a) any file in Source Code Form that results from an addition to,
|
||||||
|
deletion from, or modification of the contents of Covered
|
||||||
|
Software; or
|
||||||
|
|
||||||
|
(b) any new file in Source Code Form that contains any Covered
|
||||||
|
Software.
|
||||||
|
|
||||||
|
1.11. "Patent Claims" of a Contributor
|
||||||
|
means any patent claim(s), including without limitation, method,
|
||||||
|
process, and apparatus claims, in any patent Licensable by such
|
||||||
|
Contributor that would be infringed, but for the grant of the
|
||||||
|
License, by the making, using, selling, offering for sale, having
|
||||||
|
made, import, or transfer of either its Contributions or its
|
||||||
|
Contributor Version.
|
||||||
|
|
||||||
|
1.12. "Secondary License"
|
||||||
|
means either the GNU General Public License, Version 2.0, the GNU
|
||||||
|
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||||
|
Public License, Version 3.0, or any later versions of those
|
||||||
|
licenses.
|
||||||
|
|
||||||
|
1.13. "Source Code Form"
|
||||||
|
means the form of the work preferred for making modifications.
|
||||||
|
|
||||||
|
1.14. "You" (or "Your")
|
||||||
|
means an individual or a legal entity exercising rights under this
|
||||||
|
License. For legal entities, "You" includes any entity that
|
||||||
|
controls, is controlled by, or is under common control with You. For
|
||||||
|
purposes of this definition, "control" means (a) the power, direct
|
||||||
|
or indirect, to cause the direction or management of such entity,
|
||||||
|
whether by contract or otherwise, or (b) ownership of more than
|
||||||
|
fifty percent (50%) of the outstanding shares or beneficial
|
||||||
|
ownership of such entity.
|
||||||
|
|
||||||
|
2. License Grants and Conditions
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
2.1. Grants
|
||||||
|
|
||||||
|
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||||
|
non-exclusive license:
|
||||||
|
|
||||||
|
(a) under intellectual property rights (other than patent or trademark)
|
||||||
|
Licensable by such Contributor to use, reproduce, make available,
|
||||||
|
modify, display, perform, distribute, and otherwise exploit its
|
||||||
|
Contributions, either on an unmodified basis, with Modifications, or
|
||||||
|
as part of a Larger Work; and
|
||||||
|
|
||||||
|
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||||
|
for sale, have made, import, and otherwise transfer either its
|
||||||
|
Contributions or its Contributor Version.
|
||||||
|
|
||||||
|
2.2. Effective Date
|
||||||
|
|
||||||
|
The licenses granted in Section 2.1 with respect to any Contribution
|
||||||
|
become effective for each Contribution on the date the Contributor first
|
||||||
|
distributes such Contribution.
|
||||||
|
|
||||||
|
2.3. Limitations on Grant Scope
|
||||||
|
|
||||||
|
The licenses granted in this Section 2 are the only rights granted under
|
||||||
|
this License. No additional rights or licenses will be implied from the
|
||||||
|
distribution or licensing of Covered Software under this License.
|
||||||
|
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||||
|
Contributor:
|
||||||
|
|
||||||
|
(a) for any code that a Contributor has removed from Covered Software;
|
||||||
|
or
|
||||||
|
|
||||||
|
(b) for infringements caused by: (i) Your and any other third party's
|
||||||
|
modifications of Covered Software, or (ii) the combination of its
|
||||||
|
Contributions with other software (except as part of its Contributor
|
||||||
|
Version); or
|
||||||
|
|
||||||
|
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||||
|
its Contributions.
|
||||||
|
|
||||||
|
This License does not grant any rights in the trademarks, service marks,
|
||||||
|
or logos of any Contributor (except as may be necessary to comply with
|
||||||
|
the notice requirements in Section 3.4).
|
||||||
|
|
||||||
|
2.4. Subsequent Licenses
|
||||||
|
|
||||||
|
No Contributor makes additional grants as a result of Your choice to
|
||||||
|
distribute the Covered Software under a subsequent version of this
|
||||||
|
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||||
|
permitted under the terms of Section 3.3).
|
||||||
|
|
||||||
|
2.5. Representation
|
||||||
|
|
||||||
|
Each Contributor represents that the Contributor believes its
|
||||||
|
Contributions are its original creation(s) or it has sufficient rights
|
||||||
|
to grant the rights to its Contributions conveyed by this License.
|
||||||
|
|
||||||
|
2.6. Fair Use
|
||||||
|
|
||||||
|
This License is not intended to limit any rights You have under
|
||||||
|
applicable copyright doctrines of fair use, fair dealing, or other
|
||||||
|
equivalents.
|
||||||
|
|
||||||
|
2.7. Conditions
|
||||||
|
|
||||||
|
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||||
|
in Section 2.1.
|
||||||
|
|
||||||
|
3. Responsibilities
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
3.1. Distribution of Source Form
|
||||||
|
|
||||||
|
All distribution of Covered Software in Source Code Form, including any
|
||||||
|
Modifications that You create or to which You contribute, must be under
|
||||||
|
the terms of this License. You must inform recipients that the Source
|
||||||
|
Code Form of the Covered Software is governed by the terms of this
|
||||||
|
License, and how they can obtain a copy of this License. You may not
|
||||||
|
attempt to alter or restrict the recipients' rights in the Source Code
|
||||||
|
Form.
|
||||||
|
|
||||||
|
3.2. Distribution of Executable Form
|
||||||
|
|
||||||
|
If You distribute Covered Software in Executable Form then:
|
||||||
|
|
||||||
|
(a) such Covered Software must also be made available in Source Code
|
||||||
|
Form, as described in Section 3.1, and You must inform recipients of
|
||||||
|
the Executable Form how they can obtain a copy of such Source Code
|
||||||
|
Form by reasonable means in a timely manner, at a charge no more
|
||||||
|
than the cost of distribution to the recipient; and
|
||||||
|
|
||||||
|
(b) You may distribute such Executable Form under the terms of this
|
||||||
|
License, or sublicense it under different terms, provided that the
|
||||||
|
license for the Executable Form does not attempt to limit or alter
|
||||||
|
the recipients' rights in the Source Code Form under this License.
|
||||||
|
|
||||||
|
3.3. Distribution of a Larger Work
|
||||||
|
|
||||||
|
You may create and distribute a Larger Work under terms of Your choice,
|
||||||
|
provided that You also comply with the requirements of this License for
|
||||||
|
the Covered Software. If the Larger Work is a combination of Covered
|
||||||
|
Software with a work governed by one or more Secondary Licenses, and the
|
||||||
|
Covered Software is not Incompatible With Secondary Licenses, this
|
||||||
|
License permits You to additionally distribute such Covered Software
|
||||||
|
under the terms of such Secondary License(s), so that the recipient of
|
||||||
|
the Larger Work may, at their option, further distribute the Covered
|
||||||
|
Software under the terms of either this License or such Secondary
|
||||||
|
License(s).
|
||||||
|
|
||||||
|
3.4. Notices
|
||||||
|
|
||||||
|
You may not remove or alter the substance of any license notices
|
||||||
|
(including copyright notices, patent notices, disclaimers of warranty,
|
||||||
|
or limitations of liability) contained within the Source Code Form of
|
||||||
|
the Covered Software, except that You may alter any license notices to
|
||||||
|
the extent required to remedy known factual inaccuracies.
|
||||||
|
|
||||||
|
3.5. Application of Additional Terms
|
||||||
|
|
||||||
|
You may choose to offer, and to charge a fee for, warranty, support,
|
||||||
|
indemnity or liability obligations to one or more recipients of Covered
|
||||||
|
Software. However, You may do so only on Your own behalf, and not on
|
||||||
|
behalf of any Contributor. You must make it absolutely clear that any
|
||||||
|
such warranty, support, indemnity, or liability obligation is offered by
|
||||||
|
You alone, and You hereby agree to indemnify every Contributor for any
|
||||||
|
liability incurred by such Contributor as a result of warranty, support,
|
||||||
|
indemnity or liability terms You offer. You may include additional
|
||||||
|
disclaimers of warranty and limitations of liability specific to any
|
||||||
|
jurisdiction.
|
||||||
|
|
||||||
|
4. Inability to Comply Due to Statute or Regulation
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
If it is impossible for You to comply with any of the terms of this
|
||||||
|
License with respect to some or all of the Covered Software due to
|
||||||
|
statute, judicial order, or regulation then You must: (a) comply with
|
||||||
|
the terms of this License to the maximum extent possible; and (b)
|
||||||
|
describe the limitations and the code they affect. Such description must
|
||||||
|
be placed in a text file included with all distributions of the Covered
|
||||||
|
Software under this License. Except to the extent prohibited by statute
|
||||||
|
or regulation, such description must be sufficiently detailed for a
|
||||||
|
recipient of ordinary skill to be able to understand it.
|
||||||
|
|
||||||
|
5. Termination
|
||||||
|
--------------
|
||||||
|
|
||||||
|
5.1. The rights granted under this License will terminate automatically
|
||||||
|
if You fail to comply with any of its terms. However, if You become
|
||||||
|
compliant, then the rights granted under this License from a particular
|
||||||
|
Contributor are reinstated (a) provisionally, unless and until such
|
||||||
|
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||||
|
ongoing basis, if such Contributor fails to notify You of the
|
||||||
|
non-compliance by some reasonable means prior to 60 days after You have
|
||||||
|
come back into compliance. Moreover, Your grants from a particular
|
||||||
|
Contributor are reinstated on an ongoing basis if such Contributor
|
||||||
|
notifies You of the non-compliance by some reasonable means, this is the
|
||||||
|
first time You have received notice of non-compliance with this License
|
||||||
|
from such Contributor, and You become compliant prior to 30 days after
|
||||||
|
Your receipt of the notice.
|
||||||
|
|
||||||
|
5.2. If You initiate litigation against any entity by asserting a patent
|
||||||
|
infringement claim (excluding declaratory judgment actions,
|
||||||
|
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||||
|
directly or indirectly infringes any patent, then the rights granted to
|
||||||
|
You by any and all Contributors for the Covered Software under Section
|
||||||
|
2.1 of this License shall terminate.
|
||||||
|
|
||||||
|
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||||
|
end user license agreements (excluding distributors and resellers) which
|
||||||
|
have been validly granted by You or Your distributors under this License
|
||||||
|
prior to termination shall survive termination.
|
||||||
|
|
||||||
|
************************************************************************
|
||||||
|
* *
|
||||||
|
* 6. Disclaimer of Warranty *
|
||||||
|
* ------------------------- *
|
||||||
|
* *
|
||||||
|
* Covered Software is provided under this License on an "as is" *
|
||||||
|
* basis, without warranty of any kind, either expressed, implied, or *
|
||||||
|
* statutory, including, without limitation, warranties that the *
|
||||||
|
* Covered Software is free of defects, merchantable, fit for a *
|
||||||
|
* particular purpose or non-infringing. The entire risk as to the *
|
||||||
|
* quality and performance of the Covered Software is with You. *
|
||||||
|
* Should any Covered Software prove defective in any respect, You *
|
||||||
|
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||||
|
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||||
|
* essential part of this License. No use of any Covered Software is *
|
||||||
|
* authorized under this License except under this disclaimer. *
|
||||||
|
* *
|
||||||
|
************************************************************************
|
||||||
|
|
||||||
|
************************************************************************
|
||||||
|
* *
|
||||||
|
* 7. Limitation of Liability *
|
||||||
|
* -------------------------- *
|
||||||
|
* *
|
||||||
|
* Under no circumstances and under no legal theory, whether tort *
|
||||||
|
* (including negligence), contract, or otherwise, shall any *
|
||||||
|
* Contributor, or anyone who distributes Covered Software as *
|
||||||
|
* permitted above, be liable to You for any direct, indirect, *
|
||||||
|
* special, incidental, or consequential damages of any character *
|
||||||
|
* including, without limitation, damages for lost profits, loss of *
|
||||||
|
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||||
|
* and all other commercial damages or losses, even if such party *
|
||||||
|
* shall have been informed of the possibility of such damages. This *
|
||||||
|
* limitation of liability shall not apply to liability for death or *
|
||||||
|
* personal injury resulting from such party's negligence to the *
|
||||||
|
* extent applicable law prohibits such limitation. Some *
|
||||||
|
* jurisdictions do not allow the exclusion or limitation of *
|
||||||
|
* incidental or consequential damages, so this exclusion and *
|
||||||
|
* limitation may not apply to You. *
|
||||||
|
* *
|
||||||
|
************************************************************************
|
||||||
|
|
||||||
|
8. Litigation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Any litigation relating to this License may be brought only in the
|
||||||
|
courts of a jurisdiction where the defendant maintains its principal
|
||||||
|
place of business and such litigation shall be governed by laws of that
|
||||||
|
jurisdiction, without reference to its conflict-of-law provisions.
|
||||||
|
Nothing in this Section shall prevent a party's ability to bring
|
||||||
|
cross-claims or counter-claims.
|
||||||
|
|
||||||
|
9. Miscellaneous
|
||||||
|
----------------
|
||||||
|
|
||||||
|
This License represents the complete agreement concerning the subject
|
||||||
|
matter hereof. If any provision of this License is held to be
|
||||||
|
unenforceable, such provision shall be reformed only to the extent
|
||||||
|
necessary to make it enforceable. Any law or regulation which provides
|
||||||
|
that the language of a contract shall be construed against the drafter
|
||||||
|
shall not be used to construe this License against a Contributor.
|
||||||
|
|
||||||
|
10. Versions of the License
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
10.1. New Versions
|
||||||
|
|
||||||
|
Mozilla Foundation is the license steward. Except as provided in Section
|
||||||
|
10.3, no one other than the license steward has the right to modify or
|
||||||
|
publish new versions of this License. Each version will be given a
|
||||||
|
distinguishing version number.
|
||||||
|
|
||||||
|
10.2. Effect of New Versions
|
||||||
|
|
||||||
|
You may distribute the Covered Software under the terms of the version
|
||||||
|
of the License under which You originally received the Covered Software,
|
||||||
|
or under the terms of any subsequent version published by the license
|
||||||
|
steward.
|
||||||
|
|
||||||
|
10.3. Modified Versions
|
||||||
|
|
||||||
|
If you create software not governed by this License, and you want to
|
||||||
|
create a new license for such software, you may create and use a
|
||||||
|
modified version of this License if you rename the license and remove
|
||||||
|
any references to the name of the license steward (except to note that
|
||||||
|
such modified license differs from this License).
|
||||||
|
|
||||||
|
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||||
|
Licenses
|
||||||
|
|
||||||
|
If You choose to distribute Source Code Form that is Incompatible With
|
||||||
|
Secondary Licenses under the terms of this version of the License, the
|
||||||
|
notice described in Exhibit B of this License must be attached.
|
||||||
|
|
||||||
|
Exhibit A - Source Code Form License Notice
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
If it is not possible or desirable to put the notice in a particular
|
||||||
|
file, then You may include the notice in a location (such as a LICENSE
|
||||||
|
file in a relevant directory) where a recipient would be likely to look
|
||||||
|
for such a notice.
|
||||||
|
|
||||||
|
You may add additional accurate notices of copyright ownership.
|
||||||
|
|
||||||
|
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||||
|
defined by the Mozilla Public License, v. 2.0.
|
8
KotoQt/data/com.github.joshstrobl.koto.desktop
Normal file
8
KotoQt/data/com.github.joshstrobl.koto.desktop
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Koto
|
||||||
|
Exec=com.github.joshstrobl.koto
|
||||||
|
Icon=audio-headphones
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Categories=AudioVideo;Audio;GTK;Music;Player;
|
||||||
|
StartupNotify=true
|
7
README.md
Normal file
7
README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Koto Qt
|
||||||
|
|
||||||
|
Work in progress implementation of Koto in Qt6, Kirigami, and C++.
|
||||||
|
|
||||||
|
## LICENSE
|
||||||
|
|
||||||
|
Licensed under the Mozilla Public License 2.0 (MPL-2.0).
|
17
Taskfile.yml
Normal file
17
Taskfile.yml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
sdbus-gen-desktop:
|
||||||
|
cmds:
|
||||||
|
- sdbus-c++-xml2cpp desktop/dbus/schema.xml --adaptor=desktop/dbus/daemon-server.h --proxy=desktop/dbus/daemon-client.h
|
||||||
|
setup-desktop:
|
||||||
|
desc: "Run cmake configuration for desktop Koto"
|
||||||
|
cmds:
|
||||||
|
- cmake -S . -B build
|
||||||
|
build: cmake --build build --verbose
|
||||||
|
build-watch-desktop: watchman-make -p '**/*.cpp' '**/*.h' --run "task cook-desktop"
|
||||||
|
cook-desktop:
|
||||||
|
cmds:
|
||||||
|
- task setup-desktop
|
||||||
|
- task build
|
||||||
|
install: sudo make install -C build
|
38
desktop/CMakeLists.txt
Normal file
38
desktop/CMakeLists.txt
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
find_package(Qt6 6.4 REQUIRED COMPONENTS Quick QuickControls2)
|
||||||
|
find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
|
||||||
|
find_package(KF6Baloo)
|
||||||
|
find_package(KF6FileMetaData)
|
||||||
|
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
|
||||||
|
|
||||||
|
include(KDEInstallDirs)
|
||||||
|
include(ECMFindQmlModule)
|
||||||
|
include(ECMQmlModule)
|
||||||
|
|
||||||
|
qt_standard_project_setup()
|
||||||
|
|
||||||
|
qt_add_executable(koto
|
||||||
|
main.cpp
|
||||||
|
config/config.cpp
|
||||||
|
config/library.cpp
|
||||||
|
config/ui_prefs.cpp
|
||||||
|
datalake/indexer.cpp
|
||||||
|
datalake/track.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
ecm_add_qml_module(koto URI "com.github.joshstrobl.koto" GENERATE_PLUGIN_SOURCE)
|
||||||
|
|
||||||
|
ecm_target_qml_sources(koto
|
||||||
|
SOURCES
|
||||||
|
qml/PrimaryNavigation.qml
|
||||||
|
qml/HomePage.qml
|
||||||
|
qml/Main.qml
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(koto
|
||||||
|
PRIVATE KF6::Baloo KF6::FileMetaData Qt6::Quick Qt6::QuickControls2
|
||||||
|
)
|
||||||
|
|
||||||
|
install(FILES com.github.joshstrobl.koto.desktop DESTINATION ${KDE_INSTALL_APPDIR})
|
||||||
|
install(TARGETS koto ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||||
|
|
||||||
|
ecm_finalize_qml_module(koto)
|
40
desktop/config/config.cpp
Normal file
40
desktop/config/config.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#include "config.hpp"
|
||||||
|
#include <QDir>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <filesystem>
|
||||||
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
KotoConfig::KotoConfig() {
|
||||||
|
// Define our application's config location
|
||||||
|
auto configDir = QDir(QStandardPaths::writableLocation(QStandardPaths::StandardLocation::AppConfigLocation));
|
||||||
|
auto configDirPath = configDir.absolutePath();
|
||||||
|
fs::path filePath {};
|
||||||
|
auto configPathStd = configDirPath.toStdString();
|
||||||
|
filePath /= configPathStd;
|
||||||
|
filePath /= "config.toml";
|
||||||
|
|
||||||
|
auto data = toml::parse(filePath);
|
||||||
|
std::optional<toml::value> ui_prefs;
|
||||||
|
|
||||||
|
if (data.contains("preferences.ui")) {
|
||||||
|
auto ui_prefs_at = data.at("preferences.ui");
|
||||||
|
if (ui_prefs_at.is_table()) ui_prefs = ui_prefs_at.as_table();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto prefs = KotoUiPreferences(ui_prefs);
|
||||||
|
this->i_uiPreferences = &prefs;
|
||||||
|
|
||||||
|
this->i_libraries = {};
|
||||||
|
for (const auto& lib_value : toml::find<std::vector<toml::value>>(data, "libraries")) {
|
||||||
|
auto lib = KotoLibraryConfig(lib_value);
|
||||||
|
this->i_libraries.push_back(lib);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KotoUiPreferences * KotoConfig::getUiPreferences() {
|
||||||
|
return this->i_uiPreferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<KotoLibraryConfig> KotoConfig::getLibraries() {
|
||||||
|
return this->i_libraries;
|
||||||
|
}
|
18
desktop/config/config.hpp
Normal file
18
desktop/config/config.hpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "library.hpp"
|
||||||
|
#include "ui_prefs.hpp"
|
||||||
|
|
||||||
|
class KotoConfig {
|
||||||
|
public:
|
||||||
|
KotoConfig();
|
||||||
|
~KotoConfig();
|
||||||
|
std::vector<KotoLibraryConfig> getLibraries();
|
||||||
|
KotoUiPreferences * getUiPreferences();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<KotoLibraryConfig> i_libraries;
|
||||||
|
KotoUiPreferences * i_uiPreferences;
|
||||||
|
|
||||||
|
};
|
15
desktop/config/library.cpp
Normal file
15
desktop/config/library.cpp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include "library.hpp"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
KotoLibraryConfig::KotoLibraryConfig(const toml::value &v) {
|
||||||
|
this->i_name = toml::find<std::string>(v, "name");
|
||||||
|
this->i_path = toml::find<std::string>(v, "path");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string KotoLibraryConfig::getName() {
|
||||||
|
return this->i_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::path KotoLibraryConfig::getPath() {
|
||||||
|
return this->i_path;
|
||||||
|
}
|
17
desktop/config/library.hpp
Normal file
17
desktop/config/library.hpp
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#pragma once
|
||||||
|
#include "includes/toml.hpp"
|
||||||
|
#include <filesystem>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
class KotoLibraryConfig {
|
||||||
|
public:
|
||||||
|
KotoLibraryConfig(const toml::value &v);
|
||||||
|
~KotoLibraryConfig();
|
||||||
|
std::string getName();
|
||||||
|
fs::path getPath();
|
||||||
|
private:
|
||||||
|
std::string i_name;
|
||||||
|
fs::path i_path;
|
||||||
|
};
|
38
desktop/config/ui_prefs.cpp
Normal file
38
desktop/config/ui_prefs.cpp
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#include "ui_prefs.hpp"
|
||||||
|
|
||||||
|
KotoUiPreferences::KotoUiPreferences(std::optional<toml::value> v) {
|
||||||
|
this->i_albumInfoShowDescription = true;
|
||||||
|
this->i_albumInfoShowGenre = true;
|
||||||
|
this->i_albumInfoShowNarrator = true;
|
||||||
|
this->i_albumInfoShowYear = true;
|
||||||
|
this->i_lastUsedVolume = 0.5;
|
||||||
|
|
||||||
|
// No UI prefs provided
|
||||||
|
if (!v.has_value()) return;
|
||||||
|
toml::value& uiPrefs = v.value();
|
||||||
|
this->i_albumInfoShowDescription = toml::find_or<bool>(uiPrefs, "album_info_show_description", false);
|
||||||
|
this->i_albumInfoShowGenre = toml::find_or<bool>(uiPrefs, "album_info_show_genre", false);
|
||||||
|
this->i_albumInfoShowNarrator = toml::find_or<bool>(uiPrefs, "album_info_show_narrator", false);
|
||||||
|
this->i_albumInfoShowYear = toml::find_or<bool>(uiPrefs, "album_info_show_year", false);
|
||||||
|
this->i_lastUsedVolume = toml::find_or<float>(uiPrefs, "last_used_volume", 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KotoUiPreferences::getAlbumInfoShowDescription() {
|
||||||
|
return this->i_albumInfoShowDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KotoUiPreferences::getAlbumInfoShowGenre() {
|
||||||
|
return this->i_albumInfoShowGenre;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KotoUiPreferences::getAlbumInfoShowNarrator() {
|
||||||
|
return this->i_albumInfoShowNarrator;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KotoUiPreferences::getAlbumInfoShowYear() {
|
||||||
|
return this->i_albumInfoShowYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
float KotoUiPreferences::getLastUsedVolume() {
|
||||||
|
return this->i_lastUsedVolume;
|
||||||
|
}
|
30
desktop/config/ui_prefs.hpp
Normal file
30
desktop/config/ui_prefs.hpp
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
#include "includes/toml.hpp"
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class KotoUiPreferences {
|
||||||
|
public:
|
||||||
|
KotoUiPreferences(std::optional<toml::value> v);
|
||||||
|
~KotoUiPreferences();
|
||||||
|
|
||||||
|
bool getAlbumInfoShowDescription();
|
||||||
|
bool getAlbumInfoShowGenre();
|
||||||
|
bool getAlbumInfoShowNarrator();
|
||||||
|
bool getAlbumInfoShowYear();
|
||||||
|
float getLastUsedVolume();
|
||||||
|
|
||||||
|
void setAlbumInfoShowDescription(bool show);
|
||||||
|
void setAlbumInfoShowGenre(bool show);
|
||||||
|
void setAlbumInfoShowNarrator(bool show);
|
||||||
|
void setAlbumInfoShowYear(bool show);
|
||||||
|
void setLastUsedVolume(float volume);
|
||||||
|
private:
|
||||||
|
bool i_albumInfoShowDescription;
|
||||||
|
bool i_albumInfoShowGenre;
|
||||||
|
bool i_albumInfoShowNarrator;
|
||||||
|
bool i_albumInfoShowYear;
|
||||||
|
float i_lastUsedVolume;
|
||||||
|
};
|
0
desktop/datalake/artist.hpp
Normal file
0
desktop/datalake/artist.hpp
Normal file
6
desktop/datalake/indexer.cpp
Normal file
6
desktop/datalake/indexer.cpp
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include "indexer.hpp"
|
||||||
|
#include <QDirIterator>
|
||||||
|
|
||||||
|
FileIndexer::FileIndexer(KotoLibraryConfig * config) {
|
||||||
|
|
||||||
|
}
|
19
desktop/datalake/indexer.hpp
Normal file
19
desktop/datalake/indexer.hpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "config/library.hpp"
|
||||||
|
#include "track.hpp"
|
||||||
|
|
||||||
|
class FileIndexer {
|
||||||
|
public:
|
||||||
|
FileIndexer(KotoLibraryConfig * config);
|
||||||
|
~FileIndexer();
|
||||||
|
|
||||||
|
std::vector<KotoTrack *> getFiles();
|
||||||
|
std::string getRoot();
|
||||||
|
|
||||||
|
void index();
|
||||||
|
protected:
|
||||||
|
std::vector<KotoTrack *> i_tracks;
|
||||||
|
std::string i_root;
|
||||||
|
};
|
0
desktop/datalake/track.cpp
Normal file
0
desktop/datalake/track.cpp
Normal file
26
desktop/datalake/track.hpp
Normal file
26
desktop/datalake/track.hpp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
#include <KFileMetaData/SimpleExtractionResult>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class KotoTrack {
|
||||||
|
public:
|
||||||
|
KotoTrack(); // No-op constructor
|
||||||
|
static KotoTrack * fromDb();
|
||||||
|
static KotoTrack * fromMetadata(KFileMetaData::SimpleExtractionResult metadata);
|
||||||
|
~KotoTrack();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string album;
|
||||||
|
std::string album_artist;
|
||||||
|
std::string artist;
|
||||||
|
int disc_number;
|
||||||
|
int duration;
|
||||||
|
std::vector<std::string> genres;
|
||||||
|
std::string lyrics;
|
||||||
|
std::string narrator;
|
||||||
|
std::string path;
|
||||||
|
std::string title;
|
||||||
|
int track_number;
|
||||||
|
int year;
|
||||||
|
};
|
26
desktop/example-config.toml
Normal file
26
desktop/example-config.toml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
[preferences.ui]
|
||||||
|
album_info_show_description = true
|
||||||
|
album_info_show_genre = true
|
||||||
|
album_info_show_narrator = true
|
||||||
|
album_info_show_year = true
|
||||||
|
last_used_volume = 0.5
|
||||||
|
|
||||||
|
[preferences.podcasts]
|
||||||
|
jump_backwards_seconds = 30
|
||||||
|
jump_forward_seconds = 30
|
||||||
|
|
||||||
|
[[libraries]]
|
||||||
|
name = "Audiobooks"
|
||||||
|
path = "/home/joshua/Audiobooks"
|
||||||
|
|
||||||
|
[[libraries]]
|
||||||
|
name = "Music"
|
||||||
|
path = "/home/joshua/Music"
|
||||||
|
|
||||||
|
[[libraries]]
|
||||||
|
name = "Streaming"
|
||||||
|
path = "/home/joshua/StreamingMusic"
|
||||||
|
|
||||||
|
[[libraries]]
|
||||||
|
name = "Podcasts"
|
||||||
|
path = "/home/joshua/Podcasts"
|
17240
desktop/includes/toml.hpp
Normal file
17240
desktop/includes/toml.hpp
Normal file
File diff suppressed because it is too large
Load diff
21
desktop/main.cpp
Normal file
21
desktop/main.cpp
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QQmlApplicationEngine>
|
||||||
|
#include <QQuickStyle>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QQuickStyle::setStyle(QStringLiteral("org.kde.breeze"));
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
app.setApplicationDisplayName("Koto");
|
||||||
|
app.setDesktopFileName("com.github.joshstrobl.koto.desktop");
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
|
||||||
|
engine.loadFromModule("com.github.joshstrobl.koto", "Main");
|
||||||
|
|
||||||
|
if (engine.rootObjects().isEmpty()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
12
desktop/qml/HomePage.qml
Normal file
12
desktop/qml/HomePage.qml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls as Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
Kirigami.Page {
|
||||||
|
ColumnLayout {
|
||||||
|
Controls.Label {
|
||||||
|
text: qsTr("blah!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
desktop/qml/Main.qml
Normal file
20
desktop/qml/Main.qml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls as Controls
|
||||||
|
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
Kirigami.ApplicationWindow {
|
||||||
|
id: root
|
||||||
|
width: 1000
|
||||||
|
height: 600
|
||||||
|
visible: true
|
||||||
|
title: "Koto"
|
||||||
|
|
||||||
|
// TODO: Implement an onboarding page
|
||||||
|
pageStack.initialPage: PrimaryNavigation {
|
||||||
|
Component.onCompleted: {
|
||||||
|
pageStack.push(Qt.createComponent("HomePage.qml"), {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
87
desktop/qml/PrimaryNavigation.qml
Normal file
87
desktop/qml/PrimaryNavigation.qml
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls as Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
// Kirigami.Page {
|
||||||
|
// ColumnLayout {
|
||||||
|
// Controls.TextArea {
|
||||||
|
// Layout.alignment: Qt.AlignTop
|
||||||
|
// id: searchEntry
|
||||||
|
// placeholderText: qsTr("Search")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
Kirigami.GlobalDrawer {
|
||||||
|
width: 200
|
||||||
|
height: parent.height
|
||||||
|
edge: Qt.LeftEdge
|
||||||
|
modal: false
|
||||||
|
|
||||||
|
header: Kirigami.SearchField {
|
||||||
|
id: searchEntry
|
||||||
|
placeholderText: qsTr("Search")
|
||||||
|
}
|
||||||
|
|
||||||
|
actions: [
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Home"
|
||||||
|
icon.name: "go-home"
|
||||||
|
onTriggered: console.log("Home triggered")
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Audiobooks"
|
||||||
|
expandible: true
|
||||||
|
icon.name: "bookmark"
|
||||||
|
onTriggered: console.log("Audiobooks triggered")
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Music"
|
||||||
|
expandible: true
|
||||||
|
icon.name: "emblem-music-symbolic"
|
||||||
|
children: [
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Local Library"
|
||||||
|
onTriggered: console.log("Music Local Library triggered")
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Radio"
|
||||||
|
onTriggered: console.log("Music Radio triggered")
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Podcasts"
|
||||||
|
expandible: true
|
||||||
|
icon.name: "application-rss+xml-symbolic"
|
||||||
|
children: [
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Library"
|
||||||
|
onTriggered: console.log("Podcasts Library triggered")
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Find new podcasts"
|
||||||
|
onTriggered: console.log("Podcasts Find new podcasts triggered")
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Playlists"
|
||||||
|
expandible: true
|
||||||
|
icon.name: "music-playlist-symbolic"
|
||||||
|
children: [
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Library"
|
||||||
|
onTriggered: console.log("Playlists Library triggered")
|
||||||
|
},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: "Find new playlists"
|
||||||
|
onTriggered: console.log("Playlists Find new playlists triggered")
|
||||||
|
}
|
||||||
|
]
|
||||||
|
// TODO: Generate list of playlists
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue