Warning, /graphics/krita/HACKING is written in an unsupported language. File is not indexed.
0001 Since 1999, people have been hacking on Krita. Everyone brought their
0002 own coding style, their own code conventions, their own likes and
0003 dislikes. Me, (Halla that is), I like indents of four spaces, and
0004 no scope prefixes for variables. However, in the interests of
0005 consistency, these are the rules new code should adhere to:
0006
0007 See also https://community.kde.org/Policies/Frameworks_Coding_Style --
0008 that document is leading.
0009
0010 Qt vs STD vs Boost:
0011
0012 In general, use the Qt classes wherever possible, even if someone tells you
0013 that the STD class is better or whatever. We're dealing with a big project
0014 with lots of developers here and we should keep the code as consistent and
0015 easy to grasp as possible. Since people need to know Qt in the first place,
0016 keep to Qt. Discuss deviations on #krita
0017
0018 C++11 and C++14
0019
0020 Yes, but.
0021
0022 * Prefer normal functions over lambdas, unless really needed (e.g. when replacing
0023 the use of QSignalMapper)
0024
0025 * Try to avoid auto as a shortcut for the type name, except when used
0026 in range-based for-loops and iterators. Using auto as a replacement
0027 for a templated code (or inside templated code) is perfectly fine.
0028
0029 * Generic lambdas. Use generic lambdas only when you want to solve a
0030 problem that would otherwise require templates, not just as a shortcut for
0031 the argument typenames.
0032
0033 * auto as a deduced return type of functions that would otherwise require
0034 templates is perfectly fine
0035
0036 * In some cases it might be okay to use auto as a shortcut for the typename,
0037 e.g. when using very long types returned by boost. But better discuss that
0038 on #krita.
0039
0040 * Avoid the new sig/slot connection syntax _unless_ you are porting all of
0041 Krita to the new syntax. Sure, it has some advantages, but having two different
0042 ways of doing the same thing is begging for trouble and comprehension problems.
0043
0044 * For now, keep using Q_FOREACH, we're using it all over the place, and it has
0045 different constness semantics over the standard range-based for-loop.
0046
0047 * Use nullptr in new code. When changing existing code, make sure that 1) the whole
0048 .cpp/.h files pair uses the same style, 2) the change of the style outweigh the
0049 loss of the git-blame history (that is, your changes do already change the file
0050 significantly)
0051
0052 * Before using other new features, discuss on #krita so we can expand this list.
0053
0054
0055 Indentation
0056
0057 With four spaces. Use the default kdelibs indentation
0058 (http://techbase.kde.org/Policies/Kdelibs_Coding_Style)
0059
0060 Includes
0061
0062 Avoid as much as possible #includes in header files; use forward declarations
0063 of classes.
0064
0065 Initializers
0066
0067 Avoid as much as possible initializers in the body of the constructor. Use
0068 initializer lists instead. Write the initializers as follows
0069
0070 Class(A a, B b)
0071 : Subclass(a)
0072 , m_b(b)
0073 {
0074 }
0075
0076 Note the location of the colon and comma.
0077
0078 It is also preferred to use {}-initialization for class members and
0079 global namespace scope variables, e.g.
0080
0081 class Foo
0082 {
0083 int m_value {0};
0084 };
0085
0086 namespace Bar
0087 {
0088 int SomeGlobalValue {0};
0089 };
0090
0091 Since Krita has a long history of usage =-initialization everywhere, it is **not**
0092 recommended to use {}-initialization in function bodies, especially, when it results
0093 in a mix of styles in the same file. You can still use that as an exception to solve
0094 some specific problems like the most vexing parse.
0095
0096 Scope prefixes
0097
0098 Use only m_ for class-level variables. No other scope prefixes; no g_, l_,
0099 no 'p' for pointer variables.
0100
0101 Shared pointers
0102
0103 Use shared pointers wherever possible. Prefer Qt's shared pointer classes
0104 to our home-grown shared pointer classes.
0105
0106 Getter/setter
0107
0108 Krita doesn't use Qt's properties -- yet. If you want to introduce use of
0109 properties, convert any and all classes in Krita before committing.
0110
0111 Getter/setters are named 'x() for getters and setX(int x) for setters. If you
0112 come across violations of this rule, change the code.
0113
0114 Class naming
0115
0116 If you use a well-known design pattern, name the class according to the design
0117 pattern. All files should start with 'Kis', all classes with the 'Kis' prefix.
0118 This filename should be the same as the classname: KisNewClass.h, KisNewClass.
0119
0120 Filenames in plugins do not start with Kis; only in libraries. Do not make new
0121 classes that start with Ko.
0122
0123 Function naming
0124
0125 Functions should be named in camelBackedFashion, to conform to Qt's standards.
0126 If you encounter functions in c_style_like_this, feel free to rename. Also:
0127 verbNoun -- i.e., rotateLayer, not layer_rotate. The latter is a true c-ism,
0128 introduced by a language that needs to prefix the 'class' name to every function
0129 in order to have something that's not quite OO.
0130
0131 Variable/Parameter names
0132
0133 Variable/parameter names start with a lower case letter. A name composed of different
0134 words is done in camelBackedStyle.
0135
0136 Try to avoid abbreviations except for the most common cases, like cs for KoColorSpace.
0137 It's okay for variable names to be long and explicit and derived from the type name.
0138
0139 Designer
0140
0141 Krita has started to use designer. All dialogs and all widgets that have a layout
0142 manager must be done in designer. Do not add code or signal/slot connections
0143 in designer.
0144
0145 Enums
0146
0147 All enums should be prefixed with 'enum'.
0148
0149 Namespaces
0150
0151 Currently, we only use anonymous namespaces for things like undo
0152 commands. For the rest, some classes have a 'Kis' prefix, others don't. This should
0153 be made consistent, and we might want to use namespaces to keep all of Krita
0154 inside.
0155
0156 Files and classes
0157
0158 It's preferred (and strongly preferred) to have only one class per .h/.cpp file.
0159 (Which is logical, because otherwise you won't be able to keep to the naming scheme.)
0160
0161 Spaces
0162
0163 Keep the source airy and open. In particular, there should be empty lines between function
0164 declarations and definitions.
0165
0166 Slots and signals
0167
0168 Prefix slots with slot and signals with sig: slotUpdateSelection, sigSelectionUpdated.
0169
0170 Boolean operators
0171
0172 Use the standard !, !=, ==, && etc style, not the "not", "and" etc. style. Keep krita code
0173 using one, easily recognizable, C++ style.
0174
0175 Static initializers
0176
0177 Sometimes we need to declare a static object that performs some actions on Krita
0178 loading, e.g. to register Qt's metatype for a Krita type. We have a special macro
0179 for that:
0180
0181 KIS_DECLARE_STATIC_INITIALIZER {
0182 qRegisterMetaType<KoResourceSP>("KoResourceSP");
0183 }
0184
0185 What the macro does is basically defining a static variable that is initialized
0186 on loading of the library:
0187
0188 struct KoResourceSPStaticInitializer {
0189 KoResourceSPStaticInitializer() {
0190 qRegisterMetaType<KoResourceSP>("KoResourceSP");
0191 }
0192 };
0193 static KoResourceSPStaticInitializer __initializer1;
0194
0195 This macro is usually added to the same .cpp file as the class itself.
0196
0197 WARNING: do not use this pattern in **plugins**. All Krita's plugins are
0198 actually static libraries that are pulled into dynamic .so libraries at the
0199 linking stage. It means that all "unused" objects will never be pulled
0200 into the final plugin. Instead, do all the initialization in the "plugin"
0201 class (the one that is passed to registerPlugin<>() in
0202 K_PLUGIN_FACTORY_WITH_JSON).
0203
0204 The problem can be worked around with `$<LINK_LIBRARY:WHOLE_ARCHIVE,...>`
0205 CMake feature, but it is available only since CMake 3.24, so for now
0206 just avoid using initializers in plugins.
0207
0208 With Krita now supporting Python scripting, we need guidelines for these as well.
0209 These guidelines are preliminary and may be further refined in the future.
0210
0211 To keep it simple, we have chosen to follow the style guide suggested by Python: PEP8.
0212
0213 All rules should be followed, except the max limit of 79 characters per line. As this
0214 can reduce readability in some cases, this rule is optional.
0215
0216 The full PEP8 specification is available here: https://www.python.org/dev/peps/pep-0008/
0217
0218 To check compliance you can run pep8.py against the code.
0219 You can also use autopep8.py to automatically fix detected compliance issues.
0220
0221 pep8.py can be downloaded via Python's package manager (pip) [https://pypi.python.org/pypi/pep8],
0222 or your distribution's package manager.
0223 autopep8.py can also be downloaded via Python's package manager [https://pypi.python.org/pypi/autopep8],
0224 or your distribution's package manager.
0225
0226 Both of these scripts come bundled with the PyDev plugin, which is available for Eclipse and other IDEs.
0227 The PyDev integration can be configured to visually highlight portions of the code which is not in compliance,
0228 as well as run autopep8 via shortcuts.
0229
0230 pep8.py and autopep8.py can suppress select rules via the "--ignore" command line argument.
0231 To ignore the 79 characters per line rule, pep8.py can be called like this:
0232
0233 pep8.py --ignore=E501
0234
0235 You can read more about the error codes and what they mean here:
0236 http://pep8.readthedocs.io/en/release-1.7.x/intro.html#error-codes