From 1430210424efb27a0afffec9225eade425e81e12 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 25 Mar 2022 13:23:44 +0100 Subject: [PATCH] changes from master --- .uncrustify | 1851 ++++++++++++----- README.md | 1 + examples/gallery/main.cpp | 4 +- examples/iotdashboard/LightDisplay.cpp | 11 +- examples/iotdashboard/LightDisplaySkinlet.cpp | 48 +- examples/iotdashboard/MenuBar.cpp | 2 +- examples/iotdashboard/ShadowedBox.cpp | 2 +- examples/iotdashboard/iotdashboard.pro | 1 + examples/iotdashboard/nodes/BoxShadowNode.cpp | 4 +- .../nodes/RadialTickmarksNode.cpp | 84 +- .../iotdashboard/nodes/RadialTickmarksNode.h | 18 +- examples/listbox/main.cpp | 7 +- examples/mycontrols/main.cpp | 1 + features/qskconfig.pri | 47 +- playground/anchors/kiwi/Solver.cpp | 9 - playground/grids/GridQuick.cpp | 4 +- playground/grids/main.cpp | 2 +- playground/images/Image.h | 15 +- playground/shadows/BoxShadowNode.cpp | 4 +- qmlexport/QskQml.cpp | 6 +- qmlexport/QskShortcutQml.h | 2 +- qskinny.pro | 1 + skins/material/QskMaterialSkin.cpp | 2 +- skins/squiek/QskSquiekSkin.cpp | 2 +- src/common/QskArcMetrics.cpp | 4 +- src/common/QskArcMetrics.h | 4 +- src/common/QskBoxBorderColors.cpp | 4 +- src/common/QskBoxBorderColors.h | 2 +- src/common/QskBoxBorderMetrics.cpp | 4 +- src/common/QskBoxBorderMetrics.h | 2 +- src/common/QskBoxHints.cpp | 6 +- src/common/QskBoxShapeMetrics.cpp | 4 +- src/common/QskBoxShapeMetrics.h | 2 +- src/common/QskFunctions.cpp | 4 +- src/common/QskGlobal.h | 41 +- src/common/QskGradient.cpp | 38 +- src/common/QskGradient.h | 21 +- src/common/QskGradientStop.cpp | 4 +- src/common/QskGradientStop.h | 9 +- src/common/QskObjectCounter.cpp | 6 +- src/common/QskObjectCounter.h | 2 + src/common/QskScaleTickmarks.cpp | 2 +- src/common/QskScaleTickmarks.h | 2 +- src/common/QskShadowMetrics.cpp | 4 +- src/common/QskShadowMetrics.h | 2 +- src/common/QskTextColors.cpp | 2 +- src/common/QskTextColors.h | 2 +- src/common/QskTextOptions.cpp | 14 +- src/common/QskTextOptions.h | 4 +- src/common/common.pro | 2 - src/controls/QskBoundedInput.cpp | 6 +- src/controls/QskEvent.cpp | 19 +- src/controls/QskEvent.h | 4 + src/controls/QskFlickAnimator.h | 2 +- src/controls/QskFocusIndicator.cpp | 2 +- src/controls/QskGesture.h | 2 + src/controls/QskGestureRecognizer.cpp | 8 +- src/controls/QskInputGrabber.h | 2 +- src/controls/QskListView.cpp | 8 +- src/controls/QskMenu.cpp | 16 +- src/controls/QskMenuSkinlet.cpp | 5 +- src/controls/QskObjectTree.cpp | 3 + src/controls/QskObjectTree.h | 6 +- src/controls/QskPageIndicator.cpp | 24 +- src/controls/QskPageIndicatorSkinlet.cpp | 13 +- src/controls/QskPopup.cpp | 8 +- src/controls/QskQuick.cpp | 2 +- src/controls/QskQuick.h | 2 +- src/controls/QskQuickItem.cpp | 15 +- src/controls/QskShortcutMap.cpp | 4 +- src/controls/QskSkin.cpp | 14 + src/controls/QskSkin.h | 1 + src/controls/QskSkinHintTableEditor.cpp | 34 +- src/controls/QskSkinHintTableEditor.h | 42 +- src/controls/QskSkinManager.cpp | 6 +- src/controls/QskSkinTransition.cpp | 67 +- src/controls/QskSkinTransition.h | 10 +- src/controls/QskSkinlet.cpp | 2 +- src/controls/QskSkinlet.h | 2 + src/controls/QskSkinnable.cpp | 28 +- src/controls/QskSkinnable.h | 6 +- src/controls/QskSubWindow.h | 2 +- src/controls/QskSubWindowArea.h | 2 +- src/controls/QskTabBar.cpp | 2 +- src/controls/QskTextInput.cpp | 8 +- src/controls/QskTextInput.h | 2 +- src/controls/QskVariantAnimator.cpp | 5 +- src/controls/QskWindow.cpp | 25 +- src/controls/QskWindow.h | 2 +- src/controls/controls.pro | 2 - src/dialogs/QskDialog.cpp | 14 +- src/dialogs/QskDialog.h | 4 +- src/dialogs/QskDialogButton.cpp | 20 +- src/dialogs/QskDialogButton.h | 2 + src/dialogs/QskDialogButtonBox.cpp | 48 +- src/dialogs/QskDialogButtonBox.h | 1 - src/dialogs/QskDialogSubWindow.cpp | 3 +- src/dialogs/QskDialogSubWindow.h | 2 +- src/dialogs/QskDialogWindow.cpp | 3 +- src/dialogs/QskDialogWindow.h | 2 +- src/dialogs/QskMessageSubWindow.h | 2 +- src/dialogs/QskMessageWindow.h | 2 +- src/dialogs/QskSelectionSubWindow.h | 2 +- src/dialogs/QskSelectionWindow.h | 2 +- src/dialogs/dialogs.pro | 2 - src/graphic/QskGraphic.cpp | 8 +- src/graphic/QskGraphic.h | 14 +- src/graphic/QskGraphicImageProvider.h | 2 + src/graphic/QskGraphicProviderMap.cpp | 3 +- src/graphic/QskGraphicProviderMap.h | 2 + src/graphic/QskGraphicTextureFactory.h | 2 + src/graphic/graphic.pro | 2 - src/inputpanel/QskHunspellTextPredictor.cpp | 132 +- src/inputpanel/QskHunspellTextPredictor.h | 3 +- src/inputpanel/QskInputContext.cpp | 8 +- src/inputpanel/QskInputPanel.cpp | 327 ++- src/inputpanel/QskInputPanel.h | 2 +- src/inputpanel/QskInputPanelBox.cpp | 2 +- src/inputpanel/inputpanel.pro | 2 - src/layouts/QskGridBox.cpp | 2 +- src/layouts/QskGridLayoutEngine.cpp | 2 +- src/layouts/QskIndexedLayoutBox.cpp | 2 +- src/layouts/QskLayoutChain.cpp | 2 +- src/layouts/QskStackBox.cpp | 4 +- src/layouts/layouts.pro | 2 - src/nodes/QskArcNode.cpp | 6 +- src/nodes/QskArcNode.h | 2 +- src/nodes/QskArcRenderer.cpp | 8 +- src/nodes/QskBoxClipNode.cpp | 6 +- src/nodes/QskBoxClipNode.h | 2 +- src/nodes/QskBoxNode.cpp | 73 +- src/nodes/QskBoxNode.h | 7 +- src/nodes/QskBoxRendererEllipse.cpp | 119 +- src/nodes/QskBoxRendererRect.cpp | 15 +- src/nodes/QskGraphicNode.cpp | 4 +- src/nodes/QskGraphicNode.h | 2 +- src/nodes/QskPaintedNode.h | 4 +- src/nodes/QskScaleRenderer.cpp | 74 +- src/nodes/QskScaleRenderer.h | 27 +- src/nodes/QskTextNode.cpp | 8 +- src/nodes/QskTextNode.h | 2 +- src/nodes/QskTextureRenderer.cpp | 4 - src/nodes/QskTextureRenderer.h | 7 +- src/nodes/QskTickmarksNode.cpp | 4 +- src/nodes/QskVertex.cpp | 6 +- src/nodes/QskVertex.h | 4 +- src/nodes/nodes.pro | 2 - src/src.pro | 2 - support/SkinnyShortcut.cpp | 1 + tools/svg2qvg/svg2qvg.pro | 2 +- 150 files changed, 2426 insertions(+), 1329 deletions(-) delete mode 100644 src/common/common.pro delete mode 100644 src/controls/controls.pro delete mode 100644 src/dialogs/dialogs.pro delete mode 100644 src/graphic/graphic.pro delete mode 100644 src/inputpanel/inputpanel.pro delete mode 100644 src/layouts/layouts.pro delete mode 100644 src/nodes/nodes.pro diff --git a/.uncrustify b/.uncrustify index 43ae453c..c20650e8 100644 --- a/.uncrustify +++ b/.uncrustify @@ -26,30 +26,40 @@ string_escape_char = 92 # unsigned number # Only works right before the quote char. string_escape_char2 = 0 # unsigned number -# Replace tab characters found in string literals with the escape sequence \t instead. -string_replace_tab_chars = true # false/true +# Replace tab characters found in string literals with the escape sequence \t +# instead. +string_replace_tab_chars = true # true/false # Allow interpreting '>=' and '>>=' as part of a template in code like # 'void f(list>=val);'. If true, 'assert(x<0 && y>=3)' will be broken. # Improvements to template detection may make this option obsolete. tok_split_gte = false # true/false +# Disable formatting of NL_CONT ('\\n') ended lines (e.g. multi-line macros). +disable_processing_nl_cont = false # true/false + # Specify the marker used in comments to disable processing of part of the # file. # # Default: *INDENT-OFF* -disable_processing_cmt = "" # string +disable_processing_cmt = " *INDENT-OFF*" # string # Specify the marker used in comments to (re)enable processing in a file. # # Default: *INDENT-ON* -enable_processing_cmt = "" # string +enable_processing_cmt = " *INDENT-ON*" # string # Enable parsing of digraphs. enable_digraphs = false # true/false +# Option to allow both disable_processing_cmt and enable_processing_cmt +# strings, if specified, to be interpreted as ECMAScript regular expressions. +# If true, a regex search will be performed within comments according to the +# specified patterns in order to disable/enable processing. +processing_cmt_as_regex = false # true/false + # Add or remove the UTF-8 BOM (recommend 'remove'). -utf8_bom = ignore # ignore/add/remove/force +utf8_bom = ignore # ignore/add/remove/force/not_defined # If the file contains bytes with values between 128 and 255, but is not # UTF-8, then output as UTF-8. @@ -64,184 +74,236 @@ utf8_force = false # true/false # Add or remove space around non-assignment symbolic operators ('+', '/', '%', # '<<', and so forth). -sp_arith = force # ignore/add/remove/force +sp_arith = force # ignore/add/remove/force/not_defined # Add or remove space around arithmetic operators '+' and '-'. # # Overrides sp_arith. -sp_arith_additive = force # ignore/add/remove/force +sp_arith_additive = force # ignore/add/remove/force/not_defined # Add or remove space around assignment operator '=', '+=', etc. -sp_assign = force # ignore/add/remove/force +sp_assign = force # ignore/add/remove/force/not_defined # Add or remove space around '=' in C++11 lambda capture specifications. # # Overrides sp_assign. -sp_cpp_lambda_assign = force # ignore/add/remove/force +sp_cpp_lambda_assign = force # ignore/add/remove/force/not_defined -# Add or remove space after the capture specification in C++11 lambda. -sp_cpp_lambda_paren = ignore # ignore/add/remove/force +# Add or remove space after the capture specification of a C++11 lambda when +# an argument list is present, as in '[] (int x){ ... }'. +sp_cpp_lambda_square_paren = remove # ignore/add/remove/force/not_defined + +# Add or remove space after the capture specification of a C++11 lambda with +# no argument list is present, as in '[] { ... }'. +sp_cpp_lambda_square_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space after the opening parenthesis and before the closing +# parenthesis of a argument list of a C++11 lambda, as in +# '[]( int x ){ ... }'. +sp_cpp_lambda_argument_list = force # ignore/add/remove/force/not_defined + +# Add or remove space after the argument list of a C++11 lambda, as in +# '[](int x) { ... }'. +sp_cpp_lambda_paren_brace = force # ignore/add/remove/force/not_defined + +# Add or remove space between a lambda body and its call operator of an +# immediately invoked lambda, as in '[]( ... ){ ... } ( ... )'. +sp_cpp_lambda_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space around assignment operator '=' in a prototype. -sp_assign_default = force # ignore/add/remove/force +# +# If set to ignore, use sp_assign. +sp_assign_default = force # ignore/add/remove/force/not_defined # Add or remove space before assignment operator '=', '+=', etc. # # Overrides sp_assign. -sp_before_assign = ignore # ignore/add/remove/force +sp_before_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space after assignment operator '=', '+=', etc. # # Overrides sp_assign. -sp_after_assign = ignore # ignore/add/remove/force +sp_after_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space in 'NS_ENUM ('. -sp_enum_paren = ignore # ignore/add/remove/force +sp_enum_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space around assignment '=' in enum. -sp_enum_assign = add # ignore/add/remove/force +sp_enum_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space before assignment '=' in enum. # # Overrides sp_enum_assign. -sp_enum_before_assign = ignore # ignore/add/remove/force +sp_enum_before_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space after assignment '=' in enum. # # Overrides sp_enum_assign. -sp_enum_after_assign = ignore # ignore/add/remove/force +sp_enum_after_assign = ignore # ignore/add/remove/force/not_defined # Add or remove space around assignment ':' in enum. -sp_enum_colon = force # ignore/add/remove/force +sp_enum_colon = force # ignore/add/remove/force/not_defined # Add or remove space around preprocessor '##' concatenation operator. # # Default: add -sp_pp_concat = force # ignore/add/remove/force +sp_pp_concat = force # ignore/add/remove/force/not_defined # Add or remove space after preprocessor '#' stringify operator. # Also affects the '#@' charizing operator. -sp_pp_stringify = ignore # ignore/add/remove/force +sp_pp_stringify = ignore # ignore/add/remove/force/not_defined # Add or remove space before preprocessor '#' stringify operator # as in '#define x(y) L#y'. -sp_before_pp_stringify = ignore # ignore/add/remove/force +sp_before_pp_stringify = ignore # ignore/add/remove/force/not_defined # Add or remove space around boolean operators '&&' and '||'. -sp_bool = force # ignore/add/remove/force +sp_bool = force # ignore/add/remove/force/not_defined # Add or remove space around compare operator '<', '>', '==', etc. -sp_compare = force # ignore/add/remove/force +sp_compare = force # ignore/add/remove/force/not_defined # Add or remove space inside '(' and ')'. -sp_inside_paren = force # ignore/add/remove/force +sp_inside_paren = force # ignore/add/remove/force/not_defined # Add or remove space between nested parentheses, i.e. '((' vs. ') )'. -sp_paren_paren = force # ignore/add/remove/force +sp_paren_paren = force # ignore/add/remove/force/not_defined # Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('. -sp_cparen_oparen = ignore # ignore/add/remove/force +sp_cparen_oparen = ignore # ignore/add/remove/force/not_defined # Whether to balance spaces inside nested parentheses. sp_balance_nested_parens = false # true/false # Add or remove space between ')' and '{'. -sp_paren_brace = force # ignore/add/remove/force +sp_paren_brace = force # ignore/add/remove/force/not_defined -# Add or remove space between nested braces, i.e. '{{' vs '{ {'. -sp_brace_brace = force # ignore/add/remove/force +# Add or remove space between nested braces, i.e. '{{' vs. '{ {'. +sp_brace_brace = force # ignore/add/remove/force/not_defined # Add or remove space before pointer star '*'. -sp_before_ptr_star = remove # ignore/add/remove/force +sp_before_ptr_star = remove # ignore/add/remove/force/not_defined # Add or remove space before pointer star '*' that isn't followed by a -# variable name. If set to 'ignore', sp_before_ptr_star is used instead. -sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force +# variable name. If set to ignore, sp_before_ptr_star is used instead. +sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force/not_defined -# Add or remove space between pointer stars '*'. -sp_between_ptr_star = remove # ignore/add/remove/force +# Add or remove space between pointer stars '*', as in 'int ***a;'. +sp_between_ptr_star = remove # ignore/add/remove/force/not_defined # Add or remove space after pointer star '*', if followed by a word. -sp_after_ptr_star = force # ignore/add/remove/force +# +# Overrides sp_type_func. +sp_after_ptr_star = force # ignore/add/remove/force/not_defined # Add or remove space after pointer caret '^', if followed by a word. -sp_after_ptr_block_caret = remove # ignore/add/remove/force +sp_after_ptr_block_caret = remove # ignore/add/remove/force/not_defined # Add or remove space after pointer star '*', if followed by a qualifier. -sp_after_ptr_star_qualifier = force # ignore/add/remove/force +sp_after_ptr_star_qualifier = force # ignore/add/remove/force/not_defined # Add or remove space after a pointer star '*', if followed by a function # prototype or function definition. -sp_after_ptr_star_func = force # ignore/add/remove/force +# +# Overrides sp_after_ptr_star and sp_type_func. +sp_after_ptr_star_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after a pointer star '*' in the trailing return of a +# function prototype or function definition. +sp_after_ptr_star_trailing = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the pointer star '*' and the name of the variable +# in a function pointer definition. +sp_ptr_star_func_var = ignore # ignore/add/remove/force/not_defined # Add or remove space after a pointer star '*', if followed by an open -# parenthesis, as in 'void* (*)(). -sp_ptr_star_paren = force # ignore/add/remove/force +# parenthesis, as in 'void* (*)()'. +sp_ptr_star_paren = force # ignore/add/remove/force/not_defined # Add or remove space before a pointer star '*', if followed by a function # prototype or function definition. -sp_before_ptr_star_func = remove # ignore/add/remove/force +sp_before_ptr_star_func = remove # ignore/add/remove/force/not_defined + +# Add or remove space before a pointer star '*' in the trailing return of a +# function prototype or function definition. +sp_before_ptr_star_trailing = ignore # ignore/add/remove/force/not_defined # Add or remove space before a reference sign '&'. -sp_before_byref = remove # ignore/add/remove/force +sp_before_byref = remove # ignore/add/remove/force/not_defined # Add or remove space before a reference sign '&' that isn't followed by a -# variable name. If set to 'ignore', sp_before_byref is used instead. -sp_before_unnamed_byref = remove # ignore/add/remove/force +# variable name. If set to ignore, sp_before_byref is used instead. +sp_before_unnamed_byref = remove # ignore/add/remove/force/not_defined # Add or remove space after reference sign '&', if followed by a word. -sp_after_byref = force # ignore/add/remove/force +# +# Overrides sp_type_func. +sp_after_byref = force # ignore/add/remove/force/not_defined # Add or remove space after a reference sign '&', if followed by a function # prototype or function definition. -sp_after_byref_func = force # ignore/add/remove/force +# +# Overrides sp_after_byref and sp_type_func. +sp_after_byref_func = force # ignore/add/remove/force/not_defined # Add or remove space before a reference sign '&', if followed by a function # prototype or function definition. -sp_before_byref_func = remove # ignore/add/remove/force +sp_before_byref_func = remove # ignore/add/remove/force/not_defined -# Add or remove space between type and word. +# Add or remove space between type and word. In cases where total removal of +# whitespace would be a syntax error, a value of 'remove' is treated the same +# as 'force'. +# +# This also affects some other instances of space following a type that are +# not covered by other options; for example, between the return type and +# parenthesis of a function type template argument, between the type and +# parenthesis of an array parameter, or between 'decltype(...)' and the +# following word. # # Default: force -sp_after_type = force # ignore/add/remove/force +sp_after_type = force # ignore/add/remove/force/not_defined -# Add or remove space between 'decltype(...)' and word. -sp_after_decltype = ignore # ignore/add/remove/force +# Add or remove space between 'decltype(...)' and word, +# brace or function call. +sp_after_decltype = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space before the parenthesis in the D constructs # 'template Foo(' and 'class Foo('. -sp_before_template_paren = ignore # ignore/add/remove/force +sp_before_template_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'template' and '<'. # If set to ignore, sp_before_angle is used. -sp_template_angle = remove # ignore/add/remove/force +sp_template_angle = remove # ignore/add/remove/force/not_defined # Add or remove space before '<'. -sp_before_angle = ignore # ignore/add/remove/force +sp_before_angle = ignore # ignore/add/remove/force/not_defined # Add or remove space inside '<' and '>'. -sp_inside_angle = force # ignore/add/remove/force +sp_inside_angle = force # ignore/add/remove/force/not_defined + +# Add or remove space inside '<>'. +sp_inside_angle_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and ':'. -sp_angle_colon = ignore # ignore/add/remove/force +sp_angle_colon = ignore # ignore/add/remove/force/not_defined -# Add or remove space after '<>'. -sp_after_angle = ignore # ignore/add/remove/force +# Add or remove space after '>'. +sp_after_angle = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and '(' as found in 'new List(foo);'. -sp_angle_paren = ignore # ignore/add/remove/force +sp_angle_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and '()' as found in 'new List();'. -sp_angle_paren_empty = ignore # ignore/add/remove/force +sp_angle_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and a word as in 'List m;' or # 'template static ...'. -sp_angle_word = ignore # ignore/add/remove/force +sp_angle_word = ignore # ignore/add/remove/force/not_defined # Add or remove space between '>' and '>' in '>>' (template stuff). # # Default: add -sp_angle_shift = add # ignore/add/remove/force +sp_angle_shift = add # ignore/add/remove/force/not_defined # (C++11) Permit removal of the space between '>>' in 'foo >'. Note # that sp_angle_shift cannot remove the space without this option. @@ -249,492 +311,724 @@ sp_permit_cpp11_shift = false # true/false # Add or remove space before '(' of control statements ('if', 'for', 'switch', # 'while', etc.). -sp_before_sparen = ignore # ignore/add/remove/force +sp_before_sparen = ignore # ignore/add/remove/force/not_defined -# Add or remove space inside '(' and ')' of control statements. -sp_inside_sparen = ignore # ignore/add/remove/force +# Add or remove space inside '(' and ')' of control statements other than +# 'for'. +sp_inside_sparen = ignore # ignore/add/remove/force/not_defined -# Add or remove space after '(' of control statements. +# Add or remove space after '(' of control statements other than 'for'. # # Overrides sp_inside_sparen. -sp_inside_sparen_open = ignore # ignore/add/remove/force +sp_inside_sparen_open = ignore # ignore/add/remove/force/not_defined -# Add or remove space before ')' of control statements. +# Add or remove space before ')' of control statements other than 'for'. # # Overrides sp_inside_sparen. -sp_inside_sparen_close = ignore # ignore/add/remove/force +sp_inside_sparen_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '(' and ')' of 'for' statements. +sp_inside_for = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after '(' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before ')' of 'for' statements. +# +# Overrides sp_inside_for. +sp_inside_for_close = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '((' or '))' of control statements. +sp_sparen_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space after ')' of control statements. -sp_after_sparen = ignore # ignore/add/remove/force +sp_after_sparen = ignore # ignore/add/remove/force/not_defined -# Add or remove space between ')' and '{' of of control statements. -sp_sparen_brace = ignore # ignore/add/remove/force +# Add or remove space between ')' and '{' of control statements. +sp_sparen_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'do' and '{'. +sp_do_brace_open = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '}' and 'while'. +sp_brace_close_while = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between 'while' and '('. Overrides sp_before_sparen. +sp_while_paren_open = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space between 'invariant' and '('. -sp_invariant_paren = ignore # ignore/add/remove/force +sp_invariant_paren = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space after the ')' in 'invariant (C) c'. -sp_after_invariant_paren = ignore # ignore/add/remove/force +sp_after_invariant_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space before empty statement ';' on 'if', 'for' and 'while'. -sp_special_semi = ignore # ignore/add/remove/force +sp_special_semi = ignore # ignore/add/remove/force/not_defined # Add or remove space before ';'. # # Default: remove -sp_before_semi = remove # ignore/add/remove/force +sp_before_semi = remove # ignore/add/remove/force/not_defined # Add or remove space before ';' in non-empty 'for' statements. -sp_before_semi_for = ignore # ignore/add/remove/force +sp_before_semi_for = ignore # ignore/add/remove/force/not_defined -# Add or remove space before a semicolon of an empty part of a for statement. -sp_before_semi_for_empty = ignore # ignore/add/remove/force +# Add or remove space before a semicolon of an empty left part of a for +# statement, as in 'for ( ; ; )'. +sp_before_semi_for_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between the semicolons of an empty middle part of a for +# statement, as in 'for ( ; ; )'. +sp_between_semi_for_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space after ';', except when followed by a comment. # # Default: add -sp_after_semi = add # ignore/add/remove/force +sp_after_semi = add # ignore/add/remove/force/not_defined # Add or remove space after ';' in non-empty 'for' statements. # # Default: force -sp_after_semi_for = force # ignore/add/remove/force +sp_after_semi_for = force # ignore/add/remove/force/not_defined # Add or remove space after the final semicolon of an empty part of a for # statement, as in 'for ( ; ; )'. -sp_after_semi_for_empty = ignore # ignore/add/remove/force +sp_after_semi_for_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space before '[' (except '[]'). -sp_before_square = ignore # ignore/add/remove/force +sp_before_square = ignore # ignore/add/remove/force/not_defined -# Add or remove space before '[]'. -sp_before_squares = ignore # ignore/add/remove/force - -# Add or remove space before C++17 structured bindings. -sp_cpp_before_struct_binding = ignore # ignore/add/remove/force - -# Add or remove space inside a non-empty '[' and ']'. -sp_inside_square = ignore # ignore/add/remove/force - -# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. -sp_after_comma = ignore # ignore/add/remove/force - -# Add or remove space before ','. +# Add or remove space before '[' for a variable definition. # # Default: remove -sp_before_comma = remove # ignore/add/remove/force +sp_before_vardef_square = remove # ignore/add/remove/force/not_defined + +# Add or remove space before '[' for asm block. +sp_before_square_asm_block = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before '[]'. +sp_before_squares = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before C++17 structured bindings. +sp_cpp_before_struct_binding = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside a non-empty '[' and ']'. +sp_inside_square = ignore # ignore/add/remove/force/not_defined + +# Add or remove space inside '[]'. +sp_inside_square_empty = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside a non-empty Objective-C boxed array '@[' and +# ']'. If set to ignore, sp_inside_square is used. +sp_inside_square_oc_array = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after ',', i.e. 'a,b' vs. 'a, b'. +sp_after_comma = ignore # ignore/add/remove/force/not_defined + +# Add or remove space before ',', i.e. 'a,b' vs. 'a ,b'. +# +# Default: remove +sp_before_comma = remove # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between ',' and ']' in multidimensional array type +# like 'int[,,]'. +sp_after_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between '[' and ',' in multidimensional array type +# like 'int[,,]'. +sp_before_mdatype_commas = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove space between ',' in multidimensional array type +# like 'int[,,]'. +sp_between_mdatype_commas = ignore # ignore/add/remove/force/not_defined # Add or remove space between an open parenthesis and comma, # i.e. '(,' vs. '( ,'. # # Default: force -sp_paren_comma = force # ignore/add/remove/force +sp_paren_comma = force # ignore/add/remove/force/not_defined + +# Add or remove space after the variadic '...' when preceded by a +# non-punctuator. +# The value REMOVE will be overriden with FORCE +sp_after_ellipsis = add # ignore/add/remove/force/not_defined # Add or remove space before the variadic '...' when preceded by a # non-punctuator. -sp_before_ellipsis = add # ignore/add/remove/force +# The value REMOVE will be overriden with FORCE +sp_before_ellipsis = add # ignore/add/remove/force/not_defined # Add or remove space between a type and '...'. -sp_type_ellipsis = add # ignore/add/remove/force +sp_type_ellipsis = add # ignore/add/remove/force/not_defined + +# Add or remove space between a '*' and '...'. +sp_ptr_type_ellipsis = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove space between a type and '?'. +sp_type_question = ignore # ignore/add/remove/force/not_defined # Add or remove space between ')' and '...'. -sp_paren_ellipsis = add # ignore/add/remove/force +sp_paren_ellipsis = add # ignore/add/remove/force/not_defined + +# Add or remove space between '&&' and '...'. +sp_byref_ellipsis = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and a qualifier such as 'const'. +sp_paren_qualifier = add # ignore/add/remove/force/not_defined + +# Add or remove space between ')' and 'noexcept'. +sp_paren_noexcept = add # ignore/add/remove/force/not_defined # Add or remove space after class ':'. -sp_after_class_colon = add # ignore/add/remove/force +sp_after_class_colon = add # ignore/add/remove/force/not_defined # Add or remove space before class ':'. -sp_before_class_colon = add # ignore/add/remove/force +sp_before_class_colon = add # ignore/add/remove/force/not_defined # Add or remove space after class constructor ':'. -sp_after_constr_colon = add # ignore/add/remove/force +# +# Default: add +sp_after_constr_colon = add # ignore/add/remove/force/not_defined # Add or remove space before class constructor ':'. -sp_before_constr_colon = remove # ignore/add/remove/force +# +# Default: add +sp_before_constr_colon = remove # ignore/add/remove/force/not_defined # Add or remove space before case ':'. # # Default: remove -sp_before_case_colon = remove # ignore/add/remove/force +sp_before_case_colon = remove # ignore/add/remove/force/not_defined # Add or remove space between 'operator' and operator sign. -sp_after_operator = ignore # ignore/add/remove/force +sp_after_operator = ignore # ignore/add/remove/force/not_defined # Add or remove space between the operator symbol and the open parenthesis, as # in 'operator ++('. -sp_after_operator_sym = ignore # ignore/add/remove/force +sp_after_operator_sym = ignore # ignore/add/remove/force/not_defined # Overrides sp_after_operator_sym when the operator has no arguments, as in # 'operator *()'. -sp_after_operator_sym_empty = ignore # ignore/add/remove/force +sp_after_operator_sym_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space after C/D cast, i.e. 'cast(int)a' vs. 'cast(int) a' or # '(int)a' vs. '(int) a'. -sp_after_cast = ignore # ignore/add/remove/force +sp_after_cast = ignore # ignore/add/remove/force/not_defined # Add or remove spaces inside cast parentheses. -sp_inside_paren_cast = ignore # ignore/add/remove/force +sp_inside_paren_cast = ignore # ignore/add/remove/force/not_defined # Add or remove space between the type and open parenthesis in a C++ cast, # i.e. 'int(exp)' vs. 'int (exp)'. -sp_cpp_cast_paren = remove # ignore/add/remove/force +sp_cpp_cast_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between 'sizeof' and '('. -sp_sizeof_paren = remove # ignore/add/remove/force +sp_sizeof_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between 'sizeof' and '...'. -sp_sizeof_ellipsis = force # ignore/add/remove/force +sp_sizeof_ellipsis = force # ignore/add/remove/force/not_defined # Add or remove space between 'sizeof...' and '('. -sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force +sp_sizeof_ellipsis_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between '...' and a parameter pack. +sp_ellipsis_parameter_pack = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between a parameter pack and '...'. +sp_parameter_pack_ellipsis = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'decltype' and '('. -sp_decltype_paren = ignore # ignore/add/remove/force +sp_decltype_paren = ignore # ignore/add/remove/force/not_defined # (Pawn) Add or remove space after the tag keyword. -sp_after_tag = ignore # ignore/add/remove/force +sp_after_tag = ignore # ignore/add/remove/force/not_defined # Add or remove space inside enum '{' and '}'. -sp_inside_braces_enum = ignore # ignore/add/remove/force +sp_inside_braces_enum = ignore # ignore/add/remove/force/not_defined # Add or remove space inside struct/union '{' and '}'. -sp_inside_braces_struct = ignore # ignore/add/remove/force +sp_inside_braces_struct = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside Objective-C boxed dictionary '{' and '}' +sp_inside_braces_oc_dict = ignore # ignore/add/remove/force/not_defined # Add or remove space after open brace in an unnamed temporary -# direct-list-initialization. -sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force +# direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore. +sp_after_type_brace_init_lst_open = ignore # ignore/add/remove/force/not_defined # Add or remove space before close brace in an unnamed temporary -# direct-list-initialization. -sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force +# direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore. +sp_before_type_brace_init_lst_close = ignore # ignore/add/remove/force/not_defined -# Add or remove space inside an unnamed temporary direct-list-initialization. -sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force +# Add or remove space inside an unnamed temporary direct-list-initialization +# if statement is a brace_init_lst +# works only if sp_brace_brace is set to ignore +# works only if sp_before_type_brace_init_lst_close is set to ignore. +sp_inside_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined # Add or remove space inside '{' and '}'. -sp_inside_braces = ignore # ignore/add/remove/force +sp_inside_braces = ignore # ignore/add/remove/force/not_defined # Add or remove space inside '{}'. -sp_inside_braces_empty = ignore # ignore/add/remove/force +sp_inside_braces_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space around trailing return operator '->'. +sp_trailing_return = ignore # ignore/add/remove/force/not_defined # Add or remove space between return type and function name. A minimum of 1 # is forced except for pointer return types. -sp_type_func = ignore # ignore/add/remove/force +sp_type_func = ignore # ignore/add/remove/force/not_defined # Add or remove space between type and open brace of an unnamed temporary # direct-list-initialization. -sp_type_brace_init_lst = force # ignore/add/remove/force +sp_type_brace_init_lst = force # ignore/add/remove/force/not_defined # Add or remove space between function name and '(' on function declaration. -sp_func_proto_paren = ignore # ignore/add/remove/force +sp_func_proto_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '()' on function declaration # without parameters. -sp_func_proto_paren_empty = ignore # ignore/add/remove/force +sp_func_proto_paren_empty = ignore # ignore/add/remove/force/not_defined -# Add or remove space between function name and '(' on function definition. -sp_func_def_paren = ignore # ignore/add/remove/force +# Add or remove space between function name and '(' with a typedef specifier. +sp_func_type_paren = ignore # ignore/add/remove/force/not_defined + +# Add or remove space between alias name and '(' of a non-pointer function type typedef. +sp_func_def_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '()' on function definition # without parameters. -sp_func_def_paren_empty = ignore # ignore/add/remove/force +sp_func_def_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space inside empty function '()'. -sp_inside_fparens = remove # ignore/add/remove/force +# Overrides sp_after_angle unless use_sp_after_angle_always is set to true. +sp_inside_fparens = remove # ignore/add/remove/force/not_defined # Add or remove space inside function '(' and ')'. -sp_inside_fparen = ignore # ignore/add/remove/force +sp_inside_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space inside the first parentheses in a function type, as in # 'void (*x)(...)'. -sp_inside_tparen = ignore # ignore/add/remove/force +sp_inside_tparen = ignore # ignore/add/remove/force/not_defined # Add or remove space between the ')' and '(' in a function type, as in # 'void (*x)(...)'. -sp_after_tparen_close = ignore # ignore/add/remove/force +sp_after_tparen_close = ignore # ignore/add/remove/force/not_defined # Add or remove space between ']' and '(' when part of a function call. -sp_square_fparen = ignore # ignore/add/remove/force +sp_square_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space between ')' and '{' of function. -sp_fparen_brace = ignore # ignore/add/remove/force +sp_fparen_brace = ignore # ignore/add/remove/force/not_defined -# Add or remove space between ')' and '{' of s function call in object +# Add or remove space between ')' and '{' of a function call in object # initialization. # # Overrides sp_fparen_brace. -sp_fparen_brace_initializer = ignore # ignore/add/remove/force +sp_fparen_brace_initializer = ignore # ignore/add/remove/force/not_defined # (Java) Add or remove space between ')' and '{{' of double brace initializer. -sp_fparen_dbrace = ignore # ignore/add/remove/force +sp_fparen_dbrace = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '(' on function calls. -sp_func_call_paren = ignore # ignore/add/remove/force +sp_func_call_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between function name and '()' on function calls without -# parameters. If set to 'ignore' (the default), sp_func_call_paren is used. -sp_func_call_paren_empty = ignore # ignore/add/remove/force +# parameters. If set to ignore (the default), sp_func_call_paren is used. +sp_func_call_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove space between the user function name and '(' on function # calls. You need to set a keyword to be a user function in the config file, # like: # set func_call_user tr _ i18n -sp_func_call_user_paren = ignore # ignore/add/remove/force +sp_func_call_user_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space inside user function '(' and ')'. -sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force +sp_func_call_user_inside_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove space between nested parentheses with user functions, # i.e. '((' vs. '( ('. -sp_func_call_user_paren_paren = ignore # ignore/add/remove/force +sp_func_call_user_paren_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between a constructor/destructor and the open # parenthesis. -sp_func_class_paren = ignore # ignore/add/remove/force +sp_func_class_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between a constructor without parameters or destructor # and '()'. -sp_func_class_paren_empty = ignore # ignore/add/remove/force +sp_func_class_paren_empty = ignore # ignore/add/remove/force/not_defined + +# Add or remove space after 'return'. +# +# Default: force +sp_return = force # ignore/add/remove/force/not_defined # Add or remove space between 'return' and '('. -sp_return_paren = ignore # ignore/add/remove/force +sp_return_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'return' and '{'. -sp_return_brace = force # ignore/add/remove/force +sp_return_brace = force # ignore/add/remove/force/not_defined # Add or remove space between '__attribute__' and '('. -sp_attribute_paren = ignore # ignore/add/remove/force +sp_attribute_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'defined' and '(' in '#if defined (FOO)'. -sp_defined_paren = ignore # ignore/add/remove/force +sp_defined_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'throw' and '(' in 'throw (something)'. -sp_throw_paren = ignore # ignore/add/remove/force +sp_throw_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'throw' and anything other than '(' as in # '@throw [...];'. -sp_after_throw = ignore # ignore/add/remove/force +sp_after_throw = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'catch' and '(' in 'catch (something) { }'. # If set to ignore, sp_before_sparen is used. -sp_catch_paren = ignore # ignore/add/remove/force +sp_catch_paren = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@catch' and '(' +# in '@catch (something) { }'. If set to ignore, sp_catch_paren is used. +sp_oc_catch_paren = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before Objective-C protocol list +# as in '@protocol Protocol' or '@interface MyClass : NSObject'. +sp_before_oc_proto_list = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between class name and '(' +# in '@interface className(categoryName):BaseClass' +sp_oc_classname_paren = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space between 'version' and '(' # in 'version (something) { }'. If set to ignore, sp_before_sparen is used. -sp_version_paren = ignore # ignore/add/remove/force +sp_version_paren = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space between 'scope' and '(' # in 'scope (something) { }'. If set to ignore, sp_before_sparen is used. -sp_scope_paren = ignore # ignore/add/remove/force +sp_scope_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'super' and '(' in 'super (something)'. # # Default: remove -sp_super_paren = remove # ignore/add/remove/force +sp_super_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between 'this' and '(' in 'this (something)'. # # Default: remove -sp_this_paren = remove # ignore/add/remove/force +sp_this_paren = remove # ignore/add/remove/force/not_defined # Add or remove space between a macro name and its definition. -sp_macro = ignore # ignore/add/remove/force +sp_macro = ignore # ignore/add/remove/force/not_defined # Add or remove space between a macro function ')' and its definition. -sp_macro_func = ignore # ignore/add/remove/force +sp_macro_func = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'else' and '{' if on the same line. -sp_else_brace = ignore # ignore/add/remove/force +sp_else_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and 'else' if on the same line. -sp_brace_else = ignore # ignore/add/remove/force +sp_brace_else = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and the name of a typedef on the same line. -sp_brace_typedef = ignore # ignore/add/remove/force +sp_brace_typedef = ignore # ignore/add/remove/force/not_defined # Add or remove space before the '{' of a 'catch' statement, if the '{' and # 'catch' are on the same line, as in 'catch (decl) {'. -sp_catch_brace = ignore # ignore/add/remove/force +sp_catch_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the '{' of a '@catch' statement, if the '{' +# and '@catch' are on the same line, as in '@catch (decl) {'. +# If set to ignore, sp_catch_brace is used. +sp_oc_catch_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and 'catch' if on the same line. -sp_brace_catch = ignore # ignore/add/remove/force +sp_brace_catch = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '}' and '@catch' if on the same line. +# If set to ignore, sp_brace_catch is used. +sp_oc_brace_catch = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'finally' and '{' if on the same line. -sp_finally_brace = ignore # ignore/add/remove/force +sp_finally_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between '}' and 'finally' if on the same line. -sp_brace_finally = ignore # ignore/add/remove/force +sp_brace_finally = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'try' and '{' if on the same line. -sp_try_brace = ignore # ignore/add/remove/force +sp_try_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between get/set and '{' if on the same line. -sp_getset_brace = ignore # ignore/add/remove/force +sp_getset_brace = ignore # ignore/add/remove/force/not_defined # Add or remove space between a variable and '{' for C++ uniform # initialization. -# -# Default: add -sp_word_brace = add # ignore/add/remove/force +sp_word_brace_init_lst = add # ignore/add/remove/force/not_defined # Add or remove space between a variable and '{' for a namespace. # # Default: add -sp_word_brace_ns = add # ignore/add/remove/force +sp_word_brace_ns = add # ignore/add/remove/force/not_defined # Add or remove space before the '::' operator. -sp_before_dc = ignore # ignore/add/remove/force +sp_before_dc = ignore # ignore/add/remove/force/not_defined # Add or remove space after the '::' operator. -sp_after_dc = ignore # ignore/add/remove/force +sp_after_dc = ignore # ignore/add/remove/force/not_defined + +# (D) Add or remove around the D named array initializer ':' operator. +sp_d_array_colon = ignore # ignore/add/remove/force/not_defined # Add or remove space after the '!' (not) unary operator. # # Default: remove -sp_not = remove # ignore/add/remove/force +sp_not = remove # ignore/add/remove/force/not_defined # Add or remove space after the '~' (invert) unary operator. # # Default: remove -sp_inv = remove # ignore/add/remove/force +sp_inv = remove # ignore/add/remove/force/not_defined # Add or remove space after the '&' (address-of) unary operator. This does not # affect the spacing after a '&' that is part of a type. # # Default: remove -sp_addr = remove # ignore/add/remove/force +sp_addr = remove # ignore/add/remove/force/not_defined # Add or remove space around the '.' or '->' operators. # # Default: remove -sp_member = remove # ignore/add/remove/force +sp_member = remove # ignore/add/remove/force/not_defined # Add or remove space after the '*' (dereference) unary operator. This does # not affect the spacing after a '*' that is part of a type. # # Default: remove -sp_deref = remove # ignore/add/remove/force +sp_deref = remove # ignore/add/remove/force/not_defined # Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. # # Default: remove -sp_sign = remove # ignore/add/remove/force +sp_sign = remove # ignore/add/remove/force/not_defined # Add or remove space between '++' and '--' the word to which it is being # applied, as in '(--x)' or 'y++;'. # # Default: remove -sp_incdec = remove # ignore/add/remove/force +sp_incdec = remove # ignore/add/remove/force/not_defined # Add or remove space before a backslash-newline at the end of a line. # # Default: add -sp_before_nl_cont = add # ignore/add/remove/force +sp_before_nl_cont = add # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the scope '+' or '-', as in '-(void) foo;' +# or '+(int) bar;'. +sp_after_oc_scope = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in message specs, +# i.e. '-(int) f:(int) x;' vs. '-(int) f: (int) x;'. +sp_after_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in message specs, +# i.e. '-(int) f: (int) x;' vs. '-(int) f : (int) x;'. +sp_before_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_after_oc_dict_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};'. +sp_before_oc_dict_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue: 1];'. +sp_after_send_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before the colon in message specs, +# i.e. '[object setValue:1];' vs. '[object setValue :1];'. +sp_before_send_oc_colon = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the (type) in message specs, +# i.e. '-(int)f: (int) x;' vs. '-(int)f: (int)x;'. +sp_after_oc_type = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after the first (type) in message specs, +# i.e. '-(int) f:(int)x;' vs. '-(int)f:(int)x;'. +sp_after_oc_return_type = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@selector' and '(', +# i.e. '@selector(msgName)' vs. '@selector (msgName)'. +# Also applies to '@protocol()' constructs. +sp_after_oc_at_sel = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@selector(x)' and the following word, +# i.e. '@selector(foo) a:' vs. '@selector(foo)a:'. +sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space inside '@selector' parentheses, +# i.e. '@selector(foo)' vs. '@selector( foo )'. +# Also applies to '@protocol()' constructs. +sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space before a block pointer caret, +# i.e. '^int (int arg){...}' vs. ' ^int (int arg){...}'. +sp_before_oc_block_caret = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after a block pointer caret, +# i.e. '^int (int arg){...}' vs. '^ int (int arg){...}'. +sp_after_oc_block_caret = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between the receiver and selector in a message, +# as in '[receiver selector ...]'. +sp_after_oc_msg_receiver = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space after '@property'. +sp_after_oc_property = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove space between '@synchronized' and the open parenthesis, +# i.e. '@synchronized(foo)' vs. '@synchronized (foo)'. +sp_after_oc_synchronized = ignore # ignore/add/remove/force/not_defined # Add or remove space around the ':' in 'b ? t : f'. -sp_cond_colon = force # ignore/add/remove/force +sp_cond_colon = force # ignore/add/remove/force/not_defined # Add or remove space before the ':' in 'b ? t : f'. # # Overrides sp_cond_colon. -sp_cond_colon_before = ignore # ignore/add/remove/force +sp_cond_colon_before = ignore # ignore/add/remove/force/not_defined # Add or remove space after the ':' in 'b ? t : f'. # # Overrides sp_cond_colon. -sp_cond_colon_after = ignore # ignore/add/remove/force +sp_cond_colon_after = ignore # ignore/add/remove/force/not_defined # Add or remove space around the '?' in 'b ? t : f'. -sp_cond_question = force # ignore/add/remove/force +sp_cond_question = force # ignore/add/remove/force/not_defined # Add or remove space before the '?' in 'b ? t : f'. # # Overrides sp_cond_question. -sp_cond_question_before = ignore # ignore/add/remove/force +sp_cond_question_before = ignore # ignore/add/remove/force/not_defined # Add or remove space after the '?' in 'b ? t : f'. # # Overrides sp_cond_question. -sp_cond_question_after = ignore # ignore/add/remove/force +sp_cond_question_after = ignore # ignore/add/remove/force/not_defined # In the abbreviated ternary form '(a ?: b)', add or remove space between '?' # and ':'. # # Overrides all other sp_cond_* options. -sp_cond_ternary_short = ignore # ignore/add/remove/force +sp_cond_ternary_short = ignore # ignore/add/remove/force/not_defined # Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make # sense here. -sp_case_label = ignore # ignore/add/remove/force +sp_case_label = ignore # ignore/add/remove/force/not_defined # (D) Add or remove space around the D '..' operator. -sp_range = ignore # ignore/add/remove/force +sp_range = ignore # ignore/add/remove/force/not_defined # Add or remove space after ':' in a Java/C++11 range-based 'for', -# as in 'for (Type var : expr)'. -sp_after_for_colon = force # ignore/add/remove/force +# as in 'for (Type var : expr)'. +sp_after_for_colon = force # ignore/add/remove/force/not_defined # Add or remove space before ':' in a Java/C++11 range-based 'for', -# as in 'for (Type var : expr)'. -sp_before_for_colon = force # ignore/add/remove/force +# as in 'for (Type var : expr)'. +sp_before_for_colon = force # ignore/add/remove/force/not_defined -# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. -sp_extern_paren = ignore # ignore/add/remove/force +# (D) Add or remove space between 'extern' and '(' as in 'extern (C)'. +sp_extern_paren = ignore # ignore/add/remove/force/not_defined -# Add or remove space after the opening of a C++ comment, -# i.e. '// A' vs. '//A'. -sp_cmt_cpp_start = ignore # ignore/add/remove/force +# Add or remove space after the opening of a C++ comment, as in '// A'. +sp_cmt_cpp_start = ignore # ignore/add/remove/force/not_defined -# If true, space is added with sp_cmt_cpp_start will be added after doxygen +# Add or remove space in a C++ region marker comment, as in '// BEGIN'. +# A region marker is defined as a comment which is not preceded by other text +# (i.e. the comment is the first non-whitespace on the line), and which starts +# with either 'BEGIN' or 'END'. +# +# Overrides sp_cmt_cpp_start. +sp_cmt_cpp_region = ignore # ignore/add/remove/force/not_defined + +# If true, space added with sp_cmt_cpp_start will be added after Doxygen # sequences like '///', '///<', '//!' and '//!<'. sp_cmt_cpp_doxygen = false # true/false -# If true, space is added with sp_cmt_cpp_start will be added after Qt -# translator or meta-data comments like '//:', '//=', and '//~'. +# If true, space added with sp_cmt_cpp_start will be added after Qt translator +# or meta-data comments like '//:', '//=', and '//~'. sp_cmt_cpp_qttr = false # true/false # Add or remove space between #else or #endif and a trailing comment. -sp_endif_cmt = ignore # ignore/add/remove/force +sp_endif_cmt = ignore # ignore/add/remove/force/not_defined # Add or remove space after 'new', 'delete' and 'delete[]'. -sp_after_new = ignore # ignore/add/remove/force +sp_after_new = ignore # ignore/add/remove/force/not_defined # Add or remove space between 'new' and '(' in 'new()'. -sp_between_new_paren = ignore # ignore/add/remove/force +sp_between_new_paren = ignore # ignore/add/remove/force/not_defined # Add or remove space between ')' and type in 'new(foo) BAR'. -sp_after_newop_paren = force # ignore/add/remove/force +sp_after_newop_paren = force # ignore/add/remove/force/not_defined # Add or remove space inside parenthesis of the new operator # as in 'new(foo) BAR'. -sp_inside_newop_paren = force # ignore/add/remove/force +sp_inside_newop_paren = force # ignore/add/remove/force/not_defined # Add or remove space after the open parenthesis of the new operator, # as in 'new(foo) BAR'. # # Overrides sp_inside_newop_paren. -sp_inside_newop_paren_open = force # ignore/add/remove/force +sp_inside_newop_paren_open = force # ignore/add/remove/force/not_defined # Add or remove space before the close parenthesis of the new operator, # as in 'new(foo) BAR'. # # Overrides sp_inside_newop_paren. -sp_inside_newop_paren_close = force # ignore/add/remove/force +sp_inside_newop_paren_close = force # ignore/add/remove/force/not_defined -# Add or remove space before a trailing or embedded comment. -sp_before_tr_emb_cmt = ignore # ignore/add/remove/force +# Add or remove space before a trailing comment. +sp_before_tr_cmt = ignore # ignore/add/remove/force/not_defined -# Number of spaces before a trailing or embedded comment. -sp_num_before_tr_emb_cmt = 0 # unsigned number +# Number of spaces before a trailing comment. +sp_num_before_tr_cmt = 0 # unsigned number + +# Add or remove space before an embedded comment. +# +# Default: force +sp_before_emb_cmt = force # ignore/add/remove/force/not_defined + +# Number of spaces before an embedded comment. +# +# Default: 1 +sp_num_before_emb_cmt = 1 # unsigned number + +# Add or remove space after an embedded comment. +# +# Default: force +sp_after_emb_cmt = force # ignore/add/remove/force/not_defined + +# Number of spaces after an embedded comment. +# +# Default: 1 +sp_num_after_emb_cmt = 1 # unsigned number # (Java) Add or remove space between an annotation and the open parenthesis. -sp_annotation_paren = ignore # ignore/add/remove/force +sp_annotation_paren = ignore # ignore/add/remove/force/not_defined # If true, vbrace tokens are dropped to the previous token and skipped. sp_skip_vbrace_tokens = false # true/false # Add or remove space after 'noexcept'. -sp_after_noexcept = force # ignore/add/remove/force +sp_after_noexcept = force # ignore/add/remove/force/not_defined + +# Add or remove space after '_'. +sp_vala_after_translation = ignore # ignore/add/remove/force/not_defined # If true, a is inserted after #define. force_tab_after_define = false # true/false @@ -748,9 +1042,9 @@ force_tab_after_define = false # true/false # Default: 8 indent_columns = 4 # unsigned number -# The continuation indent. If non-zero, this overrides the indent of '(' and -# '=' continuation indents. Negative values are OK; negative value is absolute -# and not increased for each '(' level. +# The continuation indent. If non-zero, this overrides the indent of '(', '[' +# and '=' continuation indents. Negative values are OK; negative value is +# absolute and not increased for each '(' or '[' level. # # For FreeBSD, this is set to 4. indent_continue = 4 # number @@ -803,13 +1097,20 @@ indent_braces_no_class = false # true/false indent_braces_no_struct = false # true/false # Whether to indent based on the size of the brace parent, -# i.e. 'if' → 3 spaces, 'for' → 4 spaces, etc. +# i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. indent_brace_parent = false # true/false # Whether to indent based on the open parenthesis instead of the open brace # in '({\n'. indent_paren_open_brace = false # true/false +# (C#) Whether to indent the brace of a C# delegate by another level. +indent_cs_delegate_brace = false # true/false + +# (C#) Whether to indent a C# delegate (to handle delegates with no brace) by +# another level. +indent_cs_delegate_body = false # true/false + # Whether to indent the body of a 'namespace'. indent_namespace = true # true/false @@ -818,6 +1119,7 @@ indent_namespace = true # true/false indent_namespace_single_indent = false # true/false # The number of spaces to indent a namespace block. +# If set to zero, use the value indent_columns indent_namespace_level = 0 # unsigned number # If the body of the namespace is longer than this number, it won't be @@ -830,6 +1132,12 @@ indent_extern = true # true/false # Whether the 'class' body is indented. indent_class = true # true/false +# Additional indent before the leading base class colon. +# Negative values decrease indent down to the first column. +# Requires a newline break before colon (see pos_class_colon +# and nl_class_colon) +indent_before_class_colon = 0 # number + # Whether to indent the stuff after a leading base class colon. indent_class_colon = false # true/false @@ -840,11 +1148,16 @@ indent_class_on_colon = false # true/false # Whether to indent the stuff after a leading class initializer colon. indent_constr_colon = false # true/false -# Virtual indent from the ':' for member initializers. +# Virtual indent from the ':' for leading member initializers. # # Default: 2 indent_ctor_init_leading = 2 # unsigned number +# Virtual indent from the ':' for following member initializers. +# +# Default: 2 +indent_ctor_init_following = 2 # unsigned number + # Additional indent for constructor initializer list. # Negative values decrease indent down to the first column. indent_ctor_init = 0 # number @@ -855,8 +1168,8 @@ indent_else_if = false # true/false # Amount to indent variable declarations after a open brace. # -# <0: Relative -# ≥0: Absolute +# <0: Relative +# >=0: Absolute indent_var_def_blk = 0 # number # Whether to indent continued variable declarations instead of aligning. @@ -873,19 +1186,30 @@ indent_func_def_force_col1 = false # true/false # rather than aligning parameters under the open parenthesis. indent_func_call_param = true # true/false -# Same as indent_func_call_param, but for function definitions. +# Whether to indent continued function definition parameters one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_def_param = true # true/false -# Same as indent_func_call_param, but for function prototypes. +# for function definitions, only if indent_func_def_param is false +# Allows to align params when appropriate and indent them when not +# behave as if it was true if paren position is more than this value +# if paren position is more than the option value +indent_func_def_param_paren_pos_threshold = 0 # unsigned number + +# Whether to indent continued function call prototype one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_proto_param = true # true/false -# Same as indent_func_call_param, but for class declarations. +# Whether to indent continued function call declaration one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_class_param = true # true/false -# Same as indent_func_call_param, but for class variable constructors. +# Whether to indent continued class variable constructors one indent level, +# rather than aligning parameters under the open parenthesis. indent_func_ctor_var_param = true # true/false -# Same as indent_func_call_param, but for template parameter lists. +# Whether to indent continued template parameter list one indent level, +# rather than aligning parameters under the open parenthesis. indent_template_param = true # true/false # Double the indent for indent_func_xxx_param options. @@ -900,6 +1224,16 @@ indent_func_const = 0 # unsigned number # prototype. indent_func_throw = 0 # unsigned number +# How to indent within a macro followed by a brace on the same line +# This allows reducing the indent in macros that have (for example) +# `do { ... } while (0)` blocks bracketing them. +# +# true: add an indent for the brace on the same line as the macro +# false: do not add an indent for the brace on the same line as the macro +# +# Default: true +indent_macro_brace = true # true/false + # The number of spaces to indent a continued '->' or '.'. # Usually set to 0, 1, or indent_columns. indent_member = 4 # unsigned number @@ -909,15 +1243,35 @@ indent_member = 4 # unsigned number indent_member_single = true # true/false # Spaces to indent single line ('//') comments on lines before code. -indent_sing_line_comments = 0 # unsigned number +indent_single_line_comments_before = 0 # unsigned number + +# Spaces to indent single line ('//') comments on lines after code. +indent_single_line_comments_after = 0 # unsigned number + +# When opening a paren for a control statement (if, for, while, etc), increase +# the indent level by this value. Negative values decrease the indent level. +indent_sparen_extra = 0 # number # Whether to indent trailing single line ('//') comments relative to the code # instead of trying to keep the same absolute column. indent_relative_single_line_comments = false # true/false # Spaces to indent 'case' from 'switch'. Usually 0 or indent_columns. +# It might be wise to choose the same value for the option indent_case_brace. indent_switch_case = 4 # unsigned number +# Spaces to indent the body of a 'switch' before any 'case'. +# Usually the same as indent_columns or indent_switch_case. +indent_switch_body = 0 # unsigned number + +# Spaces to indent '{' from 'case'. By default, the brace will appear under +# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. +# It might be wise to choose the same value for the option indent_switch_case. +indent_case_brace = 0 # number + +# indent 'break' with 'case' from 'switch'. +indent_switch_break_with_case = false # true/false + # Whether to indent preprocessor statements inside of switch statements. # # Default: true @@ -927,24 +1281,44 @@ indent_switch_pp = true # true/false # Usually 0. indent_case_shift = 0 # unsigned number -# Spaces to indent '{' from 'case'. By default, the brace will appear under -# the 'c' in case. Usually set to 0 or indent_columns. Negative values are OK. -indent_case_brace = 0 # number +# Whether to align comments before 'case' with the 'case'. +# +# Default: true +indent_case_comment = true # true/false + +# Whether to indent comments not found in first column. +# +# Default: true +indent_comment = true # true/false # Whether to indent comments found in first column. indent_col1_comment = false # true/false -# How to indent goto labels. +# Whether to indent multi string literal in first column. +indent_col1_multi_string_literal = false # true/false + +# Align comments on adjacent lines that are this many columns apart or less. # -# >0: Absolute column where 1 is the leftmost column -# ≤0: Subtract from brace indent +# Default: 3 +indent_comment_align_thresh = 3 # unsigned number + +# Whether to ignore indent for goto labels. +indent_ignore_label = false # true/false + +# How to indent goto labels. Requires indent_ignore_label=false. +# +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent # # Default: 1 indent_label = 1 # number -# Same as indent_label, but for access specifiers that are followed by a +# How to indent access specifiers that are followed by a # colon. # +# >0: Absolute column where 1 is the leftmost column +# <=0: Subtract from brace indent +# # Default: 1 indent_access_spec = -2 # number @@ -975,6 +1349,10 @@ indent_paren_after_func_decl = false # true/false # if the parenthesis is on its own line. indent_paren_after_func_call = false # true/false +# Whether to indent a comma when inside a brace. +# If true, aligns under the open brace. +indent_comma_brace = false # true/false + # Whether to indent a comma when inside a parenthesis. # If true, aligns under the open parenthesis. indent_comma_paren = false # true/false @@ -1008,18 +1386,66 @@ indent_preserve_sql = false # true/false # Default: true indent_align_assign = false # true/false -# Whether to align continued statements at the '('. If false or the '(' is not +# If true, the indentation of the chunks after a '=' sequence will be set at +# LHS token indentation column before '='. +indent_off_after_assign = false # true/false + +# Whether to align continued statements at the '('. If false or the '(' is # followed by a newline, the next line indent is one tab. # # Default: true indent_align_paren = true # true/false +# (OC) Whether to indent Objective-C code inside message selectors. +indent_oc_inside_msg_sel = false # true/false + +# (OC) Whether to indent Objective-C blocks at brace level instead of usual +# rules. +indent_oc_block = false # true/false + +# (OC) Indent for Objective-C blocks in a message relative to the parameter +# name. +# +# =0: Use indent_oc_block rules +# >0: Use specified number of spaces to indent +indent_oc_block_msg = 0 # unsigned number + +# (OC) Minimum indent for subsequent parameters +indent_oc_msg_colon = 0 # unsigned number + +# (OC) Whether to prioritize aligning with initial colon (and stripping spaces +# from lines, if necessary). +# +# Default: true +indent_oc_msg_prioritize_first_colon = true # true/false + +# (OC) Whether to indent blocks the way that Xcode does by default +# (from the keyword if the parameter is on its own line; otherwise, from the +# previous indentation level). Requires indent_oc_block_msg=true. +indent_oc_block_msg_xcode_style = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a +# message keyword. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_keyword = false # true/false + +# (OC) Whether to indent blocks from where the brace is, relative to a message +# colon. Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_colon = false # true/false + +# (OC) Whether to indent blocks from where the block caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_caret = false # true/false + +# (OC) Whether to indent blocks from where the brace caret is. +# Requires indent_oc_block_msg=true. +indent_oc_block_msg_from_brace = false # true/false + # When indenting after virtual brace open and newline add further spaces to # reach this minimum indent. indent_min_vbrace_open = 0 # unsigned number # Whether to add further spaces after regular indent to reach next tabstop -# when identing after virtual brace open and newline. +# when indenting after virtual brace open and newline. indent_vbrace_open_on_tabstop = false # true/false # How to indent after a brace followed by another token (not a newline). @@ -1032,6 +1458,20 @@ indent_token_after_brace = true # true/false # Whether to indent the body of a C++11 lambda. indent_cpp_lambda_body = false # true/false +# How to indent compound literals that are being returned. +# true: add both the indent from return & the compound literal open brace +# (i.e. 2 indent levels) +# false: only indent 1 level, don't add the indent for the open brace, only +# add the indent for the return. +# +# Default: true +indent_compound_literal_return = true # true/false + +# (C#) Whether to indent a 'using' block if no braces are used. +# +# Default: true +indent_using_block = true # true/false + # How to indent the continuation of ternary operator. # # 0: Off (default) @@ -1039,6 +1479,12 @@ indent_cpp_lambda_body = false # true/false # 2: When the `:` is a continuation, indent it under `?` indent_ternary_operator = 0 # unsigned number +# Whether to indent the statements inside ternary operator. +indent_inside_ternary_operator = false # true/false + +# If true, the indentation of the chunks after a `return` sequence will be set at return indentation column. +indent_off_after_return = false # true/false + # If true, the indentation of the chunks after a `return new` sequence will be set at return indentation column. indent_off_after_return_new = false # true/false @@ -1049,11 +1495,16 @@ indent_single_after_return = false # true/false # have their own indentation). indent_ignore_asm_block = false # true/false +# Don't indent the close parenthesis of a function definition, +# if the parenthesis is on its own line. +donot_indent_func_def_close_paren = false # true/false + # # Newline adding and removing options # # Whether to collapse empty blocks between '{' and '}'. +# If true, overrides nl_inside_empty_func nl_collapse_empty_body = false # true/false # Don't split one-line braced assignments, as in 'foo_t f = { 1, 2 };'. @@ -1068,7 +1519,11 @@ nl_enum_leave_one_liners = true # true/false # Don't split one-line get or set functions. nl_getset_leave_one_liners = true # true/false +# (C#) Don't split one-line property get or set functions. +nl_cs_property_leave_one_liners = true # true/false + # Don't split one-line function definitions, as in 'int foo() { return 0; }'. +# might modify nl_func_type_name nl_func_leave_one_liners = true # true/false # Don't split one-line C++11 lambdas, as in '[]() { return 0; }'. @@ -1080,176 +1535,176 @@ nl_if_leave_one_liners = false # true/false # Don't split one-line while statements, as in 'while(...) b++;'. nl_while_leave_one_liners = false # true/false +# Don't split one-line do statements, as in 'do { b++; } while(...);'. +nl_do_leave_one_liners = true # true/false + # Don't split one-line for statements, as in 'for(...) b++;'. nl_for_leave_one_liners = true # true/false +# (OC) Don't split one-line Objective-C messages. +nl_oc_msg_leave_one_liner = false # true/false + +# (OC) Add or remove newline between method declaration and '{'. +nl_oc_mdef_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between Objective-C block signature and '{'. +nl_oc_block_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@interface' statement. +nl_oc_before_interface = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@implementation' statement. +nl_oc_before_implementation = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove blank line before '@end' statement. +nl_oc_before_end = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '@interface' and '{'. +nl_oc_interface_brace = ignore # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '@implementation' and '{'. +nl_oc_implementation_brace = ignore # ignore/add/remove/force/not_defined + # Add or remove newlines at the start of the file. -nl_start_of_file = ignore # ignore/add/remove/force +nl_start_of_file = ignore # ignore/add/remove/force/not_defined # The minimum number of newlines at the start of the file (only used if # nl_start_of_file is 'add' or 'force'). nl_start_of_file_min = 0 # unsigned number # Add or remove newline at the end of the file. -nl_end_of_file = ignore # ignore/add/remove/force +nl_end_of_file = ignore # ignore/add/remove/force/not_defined # The minimum number of newlines at the end of the file (only used if # nl_end_of_file is 'add' or 'force'). nl_end_of_file_min = 0 # unsigned number # Add or remove newline between '=' and '{'. -nl_assign_brace = ignore # ignore/add/remove/force +nl_assign_brace = ignore # ignore/add/remove/force/not_defined # (D) Add or remove newline between '=' and '['. -nl_assign_square = ignore # ignore/add/remove/force +nl_assign_square = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '[]' and '{'. -nl_tsquare_brace = force # ignore/add/remove/force +nl_tsquare_brace = force # ignore/add/remove/force/not_defined # (D) Add or remove newline after '= ['. Will also affect the newline before # the ']'. -nl_after_square_assign = ignore # ignore/add/remove/force - -# The number of blank lines after a block of variable definitions at the top -# of a function body. -# -# 0 = No change (default). -nl_func_var_def_blk = 0 # unsigned number - -# The number of newlines before a block of typedefs. If nl_after_access_spec -# is non-zero, that option takes precedence. -# -# 0 = No change (default). -nl_typedef_blk_start = 0 # unsigned number - -# The number of newlines after a block of typedefs. -# -# 0 = No change (default). -nl_typedef_blk_end = 0 # unsigned number - -# The maximum number of consecutive newlines within a block of typedefs. -# -# 0 = No change (default). -nl_typedef_blk_in = 0 # unsigned number - -# The number of newlines before a block of variable definitions not at the top -# of a function body. If nl_after_access_spec is non-zero, that option takes -# precedence. -# -# 0 = No change (default). -nl_var_def_blk_start = 0 # unsigned number - -# The number of newlines after a block of variable definitions not at the top -# of a function body. -# -# 0 = No change (default). -nl_var_def_blk_end = 0 # unsigned number - -# The maximum number of consecutive newlines within a block of variable -# definitions. -# -# 0 = No change (default). -nl_var_def_blk_in = 0 # unsigned number +nl_after_square_assign = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function call's ')' and '{', as in # 'list_for_each(item, &list) { }'. -nl_fcall_brace = ignore # ignore/add/remove/force +nl_fcall_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'enum' and '{'. -nl_enum_brace = add # ignore/add/remove/force +nl_enum_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'enum' and 'class'. -nl_enum_class = remove # ignore/add/remove/force +nl_enum_class = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'enum class' and the identifier. -nl_enum_class_identifier = remove # ignore/add/remove/force +nl_enum_class_identifier = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'enum class' type and ':'. -nl_enum_identifier_colon = remove # ignore/add/remove/force +nl_enum_identifier_colon = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'enum class identifier :' and type. -nl_enum_colon_type = remove # ignore/add/remove/force +nl_enum_colon_type = remove # ignore/add/remove/force/not_defined # Add or remove newline between 'struct and '{'. -nl_struct_brace = add # ignore/add/remove/force +nl_struct_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'union' and '{'. -nl_union_brace = add # ignore/add/remove/force +nl_union_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'if' and '{'. -nl_if_brace = add # ignore/add/remove/force +nl_if_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'else'. -nl_brace_else = add # ignore/add/remove/force +nl_brace_else = add # ignore/add/remove/force/not_defined # Add or remove newline between 'else if' and '{'. If set to ignore, # nl_if_brace is used instead. -nl_elseif_brace = add # ignore/add/remove/force +nl_elseif_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'else' and '{'. -nl_else_brace = add # ignore/add/remove/force +nl_else_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'else' and 'if'. -nl_else_if = ignore # ignore/add/remove/force +nl_else_if = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline before '{' opening brace +nl_before_opening_brace_func_class_def = add # ignore/add/remove/force/not_defined # Add or remove newline before 'if'/'else if' closing parenthesis. -nl_before_if_closing_paren = ignore # ignore/add/remove/force +nl_before_if_closing_paren = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'finally'. -nl_brace_finally = add # ignore/add/remove/force +nl_brace_finally = add # ignore/add/remove/force/not_defined # Add or remove newline between 'finally' and '{'. -nl_finally_brace = add # ignore/add/remove/force +nl_finally_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'try' and '{'. -nl_try_brace = add # ignore/add/remove/force +nl_try_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between get/set and '{'. -nl_getset_brace = add # ignore/add/remove/force +nl_getset_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between 'for' and '{'. -nl_for_brace = add # ignore/add/remove/force +nl_for_brace = add # ignore/add/remove/force/not_defined # Add or remove newline before the '{' of a 'catch' statement, as in # 'catch (decl) {'. -nl_catch_brace = add # ignore/add/remove/force +nl_catch_brace = add # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline before the '{' of a '@catch' statement, as in +# '@catch (decl) {'. If set to ignore, nl_catch_brace is used. +nl_oc_catch_brace = add # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'catch'. -nl_brace_catch = add # ignore/add/remove/force +nl_brace_catch = add # ignore/add/remove/force/not_defined + +# (OC) Add or remove newline between '}' and '@catch'. If set to ignore, +# nl_brace_catch is used. +nl_oc_brace_catch = add # ignore/add/remove/force/not_defined # Add or remove newline between '}' and ']'. -nl_brace_square = ignore # ignore/add/remove/force +nl_brace_square = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '}' and ')' in a function invocation. -nl_brace_fparen = ignore # ignore/add/remove/force +nl_brace_fparen = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'while' and '{'. -nl_while_brace = ignore # ignore/add/remove/force +nl_while_brace = ignore # ignore/add/remove/force/not_defined # (D) Add or remove newline between 'scope (x)' and '{'. -nl_scope_brace = add # ignore/add/remove/force +nl_scope_brace = add # ignore/add/remove/force/not_defined # (D) Add or remove newline between 'unittest' and '{'. -nl_unittest_brace = ignore # ignore/add/remove/force +nl_unittest_brace = ignore # ignore/add/remove/force/not_defined # (D) Add or remove newline between 'version (x)' and '{'. -nl_version_brace = ignore # ignore/add/remove/force +nl_version_brace = ignore # ignore/add/remove/force/not_defined + +# (C#) Add or remove newline between 'using' and '{'. +nl_using_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between two open or close braces. Due to general # newline/brace handling, REMOVE may not work. -nl_brace_brace = ignore # ignore/add/remove/force +nl_brace_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'do' and '{'. -nl_do_brace = ignore # ignore/add/remove/force +nl_do_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '}' and 'while' of 'do' statement. -nl_brace_while = ignore # ignore/add/remove/force +nl_brace_while = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'switch' and '{'. -nl_switch_brace = ignore # ignore/add/remove/force +nl_switch_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'synchronized' and '{'. -nl_synchronized_brace = ignore # ignore/add/remove/force +nl_synchronized_brace = ignore # ignore/add/remove/force/not_defined # Add a newline between ')' and '{' if the ')' is on a different line than the # if/for/etc. @@ -1258,6 +1713,14 @@ nl_synchronized_brace = ignore # ignore/add/remove/force # nl_catch_brace. nl_multi_line_cond = false # true/false +# Add a newline after '(' if an if/for/while/switch condition spans multiple +# lines +nl_multi_line_sparen_open = ignore # ignore/add/remove/force/not_defined + +# Add a newline before ')' if an if/for/while/switch condition spans multiple +# lines. Overrides nl_before_if_closing_paren if both are specified. +nl_multi_line_sparen_close = ignore # ignore/add/remove/force/not_defined + # Force a newline in a define after the macro name for multi-line defines. nl_multi_line_define = false # true/false @@ -1271,86 +1734,141 @@ nl_after_case = false # true/false # Add or remove newline between a case ':' and '{'. # # Overrides nl_after_case. -nl_case_colon_brace = ignore # ignore/add/remove/force +nl_case_colon_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between ')' and 'throw'. -nl_before_throw = ignore # ignore/add/remove/force +nl_before_throw = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'namespace' and '{'. -nl_namespace_brace = ignore # ignore/add/remove/force +nl_namespace_brace = ignore # ignore/add/remove/force/not_defined -# Add or remove newline between 'template<>' and whatever follows. -nl_template_class = ignore # ignore/add/remove/force +# Add or remove newline after 'template<...>' of a template class. +nl_template_class = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class declaration. +# +# Overrides nl_template_class. +nl_template_class_decl = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized class declaration. +# +# Overrides nl_template_class_decl. +nl_template_class_decl_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template class definition. +# +# Overrides nl_template_class. +nl_template_class_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized class definition. +# +# Overrides nl_template_class_def. +nl_template_class_def_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function. +nl_template_func = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function +# declaration. +# +# Overrides nl_template_func. +nl_template_func_decl = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized function +# declaration. +# +# Overrides nl_template_func_decl. +nl_template_func_decl_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template function +# definition. +# +# Overrides nl_template_func. +nl_template_func_def = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<>' of a specialized function +# definition. +# +# Overrides nl_template_func_def. +nl_template_func_def_special = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after 'template<...>' of a template variable. +nl_template_var = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between 'template<...>' and 'using' of a templated +# type alias. +nl_template_using = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'class' and '{'. -nl_class_brace = ignore # ignore/add/remove/force +nl_class_brace = ignore # ignore/add/remove/force/not_defined -# Add or remove newline before or after (depending on pos_class_comma) each -# ',' in the base class list. -nl_class_init_args = ignore # ignore/add/remove/force +# Add or remove newline before or after (depending on pos_class_comma, +# may not be IGNORE) each',' in the base class list. +nl_class_init_args = ignore # ignore/add/remove/force/not_defined # Add or remove newline after each ',' in the constructor member # initialization. Related to nl_constr_colon, pos_constr_colon and # pos_constr_comma. -nl_constr_init_args = force # ignore/add/remove/force +nl_constr_init_args = force # ignore/add/remove/force/not_defined # Add or remove newline before first element, after comma, and after last # element, in 'enum'. -nl_enum_own_lines = ignore # ignore/add/remove/force +nl_enum_own_lines = ignore # ignore/add/remove/force/not_defined # Add or remove newline between return type and function name in a function # definition. -nl_func_type_name = ignore # ignore/add/remove/force +# might be modified by nl_func_leave_one_liners +nl_func_type_name = ignore # ignore/add/remove/force/not_defined # Add or remove newline between return type and function name inside a class # definition. If set to ignore, nl_func_type_name or nl_func_proto_type_name # is used instead. -nl_func_type_name_class = ignore # ignore/add/remove/force +nl_func_type_name_class = ignore # ignore/add/remove/force/not_defined # Add or remove newline between class specification and '::' # in 'void A::f() { }'. Only appears in separate member implementation (does # not appear with in-line implementation). -nl_func_class_scope = ignore # ignore/add/remove/force +nl_func_class_scope = ignore # ignore/add/remove/force/not_defined # Add or remove newline between function scope and name, as in # 'void A :: f() { }'. -nl_func_scope_name = ignore # ignore/add/remove/force +nl_func_scope_name = ignore # ignore/add/remove/force/not_defined # Add or remove newline between return type and function name in a prototype. -nl_func_proto_type_name = ignore # ignore/add/remove/force +nl_func_proto_type_name = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function name and the opening '(' in the # declaration. -nl_func_paren = ignore # ignore/add/remove/force +nl_func_paren = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_paren for functions with no parameters. -nl_func_paren_empty = ignore # ignore/add/remove/force +nl_func_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function name and the opening '(' in the # definition. -nl_func_def_paren = ignore # ignore/add/remove/force +nl_func_def_paren = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_def_paren for functions with no parameters. -nl_func_def_paren_empty = ignore # ignore/add/remove/force +nl_func_def_paren_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between a function name and the opening '(' in the # call. -nl_func_call_paren = remove # ignore/add/remove/force +nl_func_call_paren = remove # ignore/add/remove/force/not_defined # Overrides nl_func_call_paren for functions with no parameters. -nl_func_call_paren_empty = remove # ignore/add/remove/force +nl_func_call_paren_empty = remove # ignore/add/remove/force/not_defined # Add or remove newline after '(' in a function declaration. -nl_func_decl_start = ignore # ignore/add/remove/force +nl_func_decl_start = ignore # ignore/add/remove/force/not_defined # Add or remove newline after '(' in a function definition. -nl_func_def_start = ignore # ignore/add/remove/force +nl_func_def_start = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_decl_start when there is only one parameter. -nl_func_decl_start_single = ignore # ignore/add/remove/force +nl_func_decl_start_single = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_def_start when there is only one parameter. -nl_func_def_start_single = ignore # ignore/add/remove/force +nl_func_def_start_single = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after '(' in a function declaration if '(' and ')' # are in different lines. If false, nl_func_decl_start is used instead. @@ -1361,10 +1879,13 @@ nl_func_decl_start_multi_line = false # true/false nl_func_def_start_multi_line = false # true/false # Add or remove newline after each ',' in a function declaration. -nl_func_decl_args = ignore # ignore/add/remove/force +nl_func_decl_args = ignore # ignore/add/remove/force/not_defined # Add or remove newline after each ',' in a function definition. -nl_func_def_args = ignore # ignore/add/remove/force +nl_func_def_args = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline after each ',' in a function call. +nl_func_call_args = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after each ',' in a function declaration if '(' # and ')' are in different lines. If false, nl_func_decl_args is used instead. @@ -1375,16 +1896,16 @@ nl_func_decl_args_multi_line = false # true/false nl_func_def_args_multi_line = false # true/false # Add or remove newline before the ')' in a function declaration. -nl_func_decl_end = ignore # ignore/add/remove/force +nl_func_decl_end = ignore # ignore/add/remove/force/not_defined # Add or remove newline before the ')' in a function definition. -nl_func_def_end = ignore # ignore/add/remove/force +nl_func_def_end = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_decl_end when there is only one parameter. -nl_func_decl_end_single = ignore # ignore/add/remove/force +nl_func_decl_end_single = ignore # ignore/add/remove/force/not_defined # Overrides nl_func_def_end when there is only one parameter. -nl_func_def_end_single = ignore # ignore/add/remove/force +nl_func_def_end_single = ignore # ignore/add/remove/force/not_defined # Whether to add a newline before ')' in a function declaration if '(' and ')' # are in different lines. If false, nl_func_decl_end is used instead. @@ -1395,13 +1916,20 @@ nl_func_decl_end_multi_line = false # true/false nl_func_def_end_multi_line = false # true/false # Add or remove newline between '()' in a function declaration. -nl_func_decl_empty = ignore # ignore/add/remove/force +nl_func_decl_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '()' in a function definition. -nl_func_def_empty = ignore # ignore/add/remove/force +nl_func_def_empty = ignore # ignore/add/remove/force/not_defined # Add or remove newline between '()' in a function call. -nl_func_call_empty = remove # ignore/add/remove/force +nl_func_call_empty = remove # ignore/add/remove/force/not_defined + +# Whether to add a newline after '(' in a function call, +# has preference over nl_func_call_start_multi_line. +nl_func_call_start = ignore # ignore/add/remove/force/not_defined + +# Whether to add a newline before ')' in a function call. +nl_func_call_end = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after '(' in a function call if '(' and ')' are in # different lines. @@ -1415,36 +1943,58 @@ nl_func_call_args_multi_line = false # true/false # different lines. nl_func_call_end_multi_line = false # true/false +# Whether to respect nl_func_call_XXX option in case of closure args. +nl_func_call_args_multi_line_ignore_closures = false # true/false + +# Whether to add a newline after '<' of a template parameter list. +nl_template_start = false # true/false + +# Whether to add a newline after each ',' in a template parameter list. +nl_template_args = false # true/false + +# Whether to add a newline before '>' of a template parameter list. +nl_template_end = false # true/false + +# (OC) Whether to put each Objective-C message parameter on a separate line. +# See nl_oc_msg_leave_one_liner. +nl_oc_msg_args = false # true/false + # Add or remove newline between function signature and '{'. -nl_fdef_brace = ignore # ignore/add/remove/force +nl_fdef_brace = ignore # ignore/add/remove/force/not_defined + +# Add or remove newline between function signature and '{', +# if signature ends with ')'. Overrides nl_fdef_brace. +nl_fdef_brace_cond = ignore # ignore/add/remove/force/not_defined # Add or remove newline between C++11 lambda signature and '{'. -nl_cpp_ldef_brace = ignore # ignore/add/remove/force +nl_cpp_ldef_brace = ignore # ignore/add/remove/force/not_defined # Add or remove newline between 'return' and the return expression. -nl_return_expr = ignore # ignore/add/remove/force +nl_return_expr = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after semicolons, except in 'for' statements. nl_after_semicolon = false # true/false # (Java) Add or remove newline between the ')' and '{{' of the double brace # initializer. -nl_paren_dbrace_open = ignore # ignore/add/remove/force +nl_paren_dbrace_open = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after the type in an unnamed temporary # direct-list-initialization. -nl_type_brace_init_lst = ignore # ignore/add/remove/force +nl_type_brace_init_lst = ignore # ignore/add/remove/force/not_defined # Whether to add a newline after the open brace in an unnamed temporary # direct-list-initialization. -nl_type_brace_init_lst_open = ignore # ignore/add/remove/force +nl_type_brace_init_lst_open = ignore # ignore/add/remove/force/not_defined # Whether to add a newline before the close brace in an unnamed temporary # direct-list-initialization. -nl_type_brace_init_lst_close = ignore # ignore/add/remove/force +nl_type_brace_init_lst_close = ignore # ignore/add/remove/force/not_defined -# Whether to add a newline after '{'. This also adds a newline before the -# matching '}'. +# Whether to add a newline before '{'. +nl_before_brace_open = false # true/false + +# Whether to add a newline after '{'. nl_after_brace_open = false # true/false # Whether to add a newline between the open brace and a trailing single-line @@ -1470,7 +2020,7 @@ nl_after_vbrace_close = false # true/false # Add or remove newline between the close brace and identifier, # as in 'struct { int a; } b;'. Affects enumerations, unions and # structures. If set to ignore, uses nl_after_brace_close. -nl_brace_struct_var = ignore # ignore/add/remove/force +nl_brace_struct_var = ignore # ignore/add/remove/force/not_defined # Whether to alter newlines in '#define' macros. nl_define_macro = false # true/false @@ -1488,41 +2038,61 @@ nl_squeeze_ifdef = false # true/false nl_squeeze_ifdef_top_level = false # true/false # Add or remove blank line before 'if'. -nl_before_if = ignore # ignore/add/remove/force +nl_before_if = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'if' statement. Add/Force work only if the # next token is not a closing brace. -nl_after_if = ignore # ignore/add/remove/force +nl_after_if = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'for'. -nl_before_for = ignore # ignore/add/remove/force +nl_before_for = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'for' statement. -nl_after_for = ignore # ignore/add/remove/force +nl_after_for = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'while'. -nl_before_while = ignore # ignore/add/remove/force +nl_before_while = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'while' statement. -nl_after_while = ignore # ignore/add/remove/force +nl_after_while = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'switch'. -nl_before_switch = ignore # ignore/add/remove/force +nl_before_switch = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'switch' statement. -nl_after_switch = ignore # ignore/add/remove/force +nl_after_switch = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'synchronized'. -nl_before_synchronized = ignore # ignore/add/remove/force +nl_before_synchronized = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'synchronized' statement. -nl_after_synchronized = ignore # ignore/add/remove/force +nl_after_synchronized = ignore # ignore/add/remove/force/not_defined # Add or remove blank line before 'do'. -nl_before_do = ignore # ignore/add/remove/force +nl_before_do = ignore # ignore/add/remove/force/not_defined # Add or remove blank line after 'do/while' statement. -nl_after_do = ignore # ignore/add/remove/force +nl_after_do = ignore # ignore/add/remove/force/not_defined + +# Ignore nl_before_{if,for,switch,do,synchronized} if the control +# statement is immediately after a case statement. +# if nl_before_{if,for,switch,do} is set to remove, this option +# does nothing. +nl_before_ignore_after_case = false # true/false + +# Whether to put a blank line before 'return' statements, unless after an open +# brace. +nl_before_return = false # true/false + +# Whether to put a blank line after 'return' statements, unless followed by a +# close brace. +nl_after_return = false # true/false + +# Whether to put a blank line before a member '.' or '->' operators. +nl_before_member = ignore # ignore/add/remove/force/not_defined + +# (Java) Whether to put a blank line after a member '.' or '->' operators. +nl_after_member = ignore # ignore/add/remove/force/not_defined # Whether to double-space commented-entries in 'struct'/'union'/'enum'. nl_ds_struct_enum_cmt = false # true/false @@ -1533,27 +2103,27 @@ nl_ds_struct_enum_close_brace = false # true/false # Add or remove newline before or after (depending on pos_class_colon) a class # colon, as in 'class Foo : public Bar'. -nl_class_colon = ignore # ignore/add/remove/force +nl_class_colon = ignore # ignore/add/remove/force/not_defined # Add or remove newline around a class constructor colon. The exact position # depends on nl_constr_init_args, pos_constr_colon and pos_constr_comma. -nl_constr_colon = ignore # ignore/add/remove/force +nl_constr_colon = ignore # ignore/add/remove/force/not_defined # Whether to collapse a two-line namespace, like 'namespace foo\n{ decl; }' # into a single line. If true, prevents other brace newline rules from turning -# such code into four lines. +# such code into four lines. If true, it also preserves one-liner namespaces. nl_namespace_two_to_one_liner = false # true/false # Whether to remove a newline in simple unbraced if statements, turning them -# into one-liners, as in 'if(b)\n i++;' → 'if(b) i++;'. +# into one-liners, as in 'if(b)\n i++;' => 'if(b) i++;'. nl_create_if_one_liner = false # true/false # Whether to remove a newline in simple unbraced for statements, turning them -# into one-liners, as in 'for (...)\n stmt;' → 'for (...) stmt;'. +# into one-liners, as in 'for (...)\n stmt;' => 'for (...) stmt;'. nl_create_for_one_liner = false # true/false # Whether to remove a newline in simple unbraced while statements, turning -# them into one-liners, as in 'while (expr)\n stmt;' → 'while (expr) stmt;'. +# them into one-liners, as in 'while (expr)\n stmt;' => 'while (expr) stmt;'. nl_create_while_one_liner = false # true/false # Whether to collapse a function definition whose body (not counting braces) @@ -1561,6 +2131,10 @@ nl_create_while_one_liner = false # true/false # a single line. nl_create_func_def_one_liner = false # true/false +# Whether to split one-line simple list definitions into three lines by +# adding newlines, as in 'int a[12] = { 0 };'. +nl_create_list_one_liner = false # true/false + # Whether to split one-line simple unbraced if statements into two lines by # adding a newline, as in 'if(b) i++;'. nl_split_if_one_liner = false # true/false @@ -1573,6 +2147,10 @@ nl_split_for_one_liner = false # true/false # adding a newline, as in 'while (expr) stmt;'. nl_split_while_one_liner = false # true/false +# Don't add a newline before a cpp-comment in a parameter list of a function +# call. +donot_add_nl_before_cpp_comment = false # true/false + # # Blank line options # @@ -1583,10 +2161,17 @@ nl_max = 0 # unsigned number # The maximum number of consecutive newlines in a function. nl_max_blank_in_func = 0 # unsigned number +# The number of newlines inside an empty function body. +# This option overrides eat_blanks_after_open_brace and +# eat_blanks_before_close_brace, but is ignored when +# nl_collapse_empty_body=true +nl_inside_empty_func = 0 # unsigned number + # The number of newlines before a function prototype. nl_before_func_body_proto = 0 # unsigned number -# The number of newlines before a multi-line function definition. +# The number of newlines before a multi-line function definition. Where +# applicable, this option is overridden with eat_blanks_after_open_brace=true nl_before_func_body_def = 0 # unsigned number # The number of newlines before a class constructor/destructor prototype. @@ -1631,6 +2216,47 @@ nl_after_func_body_class = 0 # unsigned number # Overrides nl_after_func_body and nl_after_func_body_class. nl_after_func_body_one_liner = 0 # unsigned number +# The number of blank lines after a block of variable definitions at the top +# of a function body. +# +# 0: No change (default). +nl_func_var_def_blk = 0 # unsigned number + +# The number of newlines before a block of typedefs. If nl_after_access_spec +# is non-zero, that option takes precedence. +# +# 0: No change (default). +nl_typedef_blk_start = 0 # unsigned number + +# The number of newlines after a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of typedefs. +# +# 0: No change (default). +nl_typedef_blk_in = 0 # unsigned number + +# The number of newlines before a block of variable definitions not at the top +# of a function body. If nl_after_access_spec is non-zero, that option takes +# precedence. +# +# 0: No change (default). +nl_var_def_blk_start = 0 # unsigned number + +# The number of newlines after a block of variable definitions not at the top +# of a function body. +# +# 0: No change (default). +nl_var_def_blk_end = 0 # unsigned number + +# The maximum number of consecutive newlines within a block of variable +# definitions. +# +# 0: No change (default). +nl_var_def_blk_in = 0 # unsigned number + # The minimum number of newlines before a multi-line comment. # Doesn't apply if after a brace open or another multi-line comment. nl_before_block_comment = 0 # unsigned number @@ -1649,6 +2275,9 @@ nl_after_multiline_comment = false # true/false # Whether to force a newline after a label's colon. nl_after_label_colon = false # true/false +# The number of newlines before a struct definition. +nl_before_struct = 0 # unsigned number + # The number of newlines after '}' or ';' of a struct/enum/union definition. nl_after_struct = 0 # unsigned number @@ -1658,18 +2287,33 @@ nl_before_class = 0 # unsigned number # The number of newlines after '}' or ';' of a class definition. nl_after_class = 0 # unsigned number +# The number of newlines before a namespace. +nl_before_namespace = 0 # unsigned number + +# The number of newlines after '{' of a namespace. This also adds newlines +# before the matching '}'. +# +# 0: Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if +# applicable, otherwise no change. +# +# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. +nl_inside_namespace = 0 # unsigned number + +# The number of newlines after '}' of a namespace. +nl_after_namespace = 0 # unsigned number + # The number of newlines before an access specifier label. This also includes # the Qt-specific 'signals:' and 'slots:'. Will not change the newline count # if after a brace open. # -# 0 = No change (default). +# 0: No change (default). nl_before_access_spec = 0 # unsigned number # The number of newlines after an access specifier label. This also includes # the Qt-specific 'signals:' and 'slots:'. Will not change the newline count # if after a brace open. # -# 0 = No change (default). +# 0: No change (default). # # Overrides nl_typedef_blk_start and nl_var_def_blk_start. nl_after_access_spec = 0 # unsigned number @@ -1677,23 +2321,28 @@ nl_after_access_spec = 0 # unsigned number # The number of newlines between a function definition and the function # comment, as in '// comment\n void foo() {...}'. # -# 0 = No change (default). +# 0: No change (default). nl_comment_func_def = 0 # unsigned number # The number of newlines after a try-catch-finally block that isn't followed # by a brace close. # -# 0 = No change (default). +# 0: No change (default). nl_after_try_catch_finally = 0 # unsigned number -# The number of newlines after '{' of a namespace. This also adds newlines -# before the matching '}'. +# (C#) The number of newlines before and after a property, indexer or event +# declaration. # -# 0 = Apply eat_blanks_after_open_brace or eat_blanks_before_close_brace if -# applicable, otherwise no change. +# 0: No change (default). +nl_around_cs_property = 0 # unsigned number + +# (C#) The number of newlines between the get/set/add/remove handlers. # -# Overrides eat_blanks_after_open_brace and eat_blanks_before_close_brace. -nl_inside_namespace = 0 # unsigned number +# 0: No change (default). +nl_between_get_set = 0 # unsigned number + +# (C#) Add or remove newline between property and the '{'. +nl_property_brace = ignore # ignore/add/remove/force/not_defined # Whether to remove blank lines after '{'. eat_blanks_after_open_brace = false # true/false @@ -1708,20 +2357,32 @@ eat_blanks_before_close_brace = false # true/false # 2: Remove all newlines and reformat completely by config nl_remove_extra_newlines = 0 # unsigned number -# Whether to put a blank line before 'return' statements, unless after an open -# brace. -nl_before_return = false # true/false - -# Whether to put a blank line after 'return' statements, unless followed by a -# close brace. -nl_after_return = false # true/false - # (Java) Add or remove newline after an annotation statement. Only affects # annotations that are after a newline. -nl_after_annotation = ignore # ignore/add/remove/force +nl_after_annotation = ignore # ignore/add/remove/force/not_defined # (Java) Add or remove newline between two annotations. -nl_between_annotation = ignore # ignore/add/remove/force +nl_between_annotation = ignore # ignore/add/remove/force/not_defined + +# The number of newlines before a whole-file #ifdef. +# +# 0: No change (default). +nl_before_whole_file_ifdef = 0 # unsigned number + +# The number of newlines after a whole-file #ifdef. +# +# 0: No change (default). +nl_after_whole_file_ifdef = 0 # unsigned number + +# The number of newlines before a whole-file #endif. +# +# 0: No change (default). +nl_before_whole_file_endif = 0 # unsigned number + +# The number of newlines after a whole-file #endif. +# +# 0: No change (default). +nl_after_whole_file_endif = 0 # unsigned number # # Positioning options @@ -1766,21 +2427,26 @@ pos_class_colon = ignore # ignore/break/force/lead/trail/join/ # Related to nl_constr_colon, nl_constr_init_args and pos_constr_comma. pos_constr_colon = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force +# The position of shift operators in wrapped expressions. +pos_shift = ignore # ignore/break/force/lead/trail/join/lead_break/lead_force/trail_break/trail_force + # # Line splitting options # # Try to limit code width to N columns. -code_width = 0 # unsigned number +code_width = 100 # unsigned number # Whether to fully split long 'for' statements at semi-colons. ls_for_split_full = false # true/false # Whether to fully split long function prototypes/calls at commas. +# The option ls_code_width has priority over the option ls_func_split_full. ls_func_split_full = false # true/false # Whether to split lines as close to code_width as possible and ignore some # groupings. +# The option ls_code_width has priority over the option ls_func_split_full. ls_code_width = false # true/false # @@ -1807,55 +2473,74 @@ align_func_params = false # true/false # The span for aligning parameter definitions in function on parameter name. # -# 0 = Don't align (default). +# 0: Don't align (default). align_func_params_span = 0 # unsigned number # The threshold for aligning function parameter definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_func_params_thresh = 0 # unsigned number +# 0: No limit (default). +align_func_params_thresh = 0 # number # The gap for aligning function parameter definitions. align_func_params_gap = 0 # unsigned number +# The span for aligning constructor value. +# +# 0: Don't align (default). +align_constr_value_span = 0 # unsigned number + +# The threshold for aligning constructor value. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_constr_value_thresh = 0 # number + +# The gap for aligning constructor value. +align_constr_value_gap = 0 # unsigned number + # Whether to align parameters in single-line functions that have the same # name. The function names must already be aligned with each other. align_same_func_call_params = false # true/false # The span for aligning function-call parameters for single line functions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_same_func_call_params_span = 0 # unsigned number # The threshold for aligning function-call parameters for single line # functions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_same_func_call_params_thresh = 0 # unsigned number +# 0: No limit (default). +align_same_func_call_params_thresh = 0 # number # The span for aligning variable definitions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_var_def_span = 0 # unsigned number -# How to align the '*' in variable definitions. +# How to consider (or treat) the '*' in the alignment of variable definitions. # # 0: Part of the type 'void * foo;' (default) # 1: Part of the variable 'void *foo;' # 2: Dangling 'void *foo;' +# Dangling: the '*' will not be taken into account when aligning. align_var_def_star_style = 0 # unsigned number -# How to align the '&' in variable definitions. +# How to consider (or treat) the '&' in the alignment of variable definitions. # # 0: Part of the type 'long & foo;' (default) # 1: Part of the variable 'long &foo;' # 2: Dangling 'long &foo;' +# Dangling: the '&' will not be taken into account when aligning. align_var_def_amp_style = 0 # unsigned number # The threshold for aligning variable definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_var_def_thresh = 0 # unsigned number +# 0: No limit (default). +align_var_def_thresh = 0 # number # The gap for aligning variable definitions. align_var_def_gap = 0 # unsigned number @@ -1874,13 +2559,19 @@ align_var_def_inline = false # true/false # The span for aligning on '=' in assignments. # -# 0 = Don't align (default). +# 0: Don't align (default). align_assign_span = 0 # unsigned number -# The threshold for aligning on '=' in assignments. +# The span for aligning on '=' in function prototype modifier. # -# 0 = No limit (default). -align_assign_thresh = 0 # unsigned number +# 0: Don't align (default). +align_assign_func_proto_span = 0 # unsigned number + +# The threshold for aligning on '=' in assignments. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_assign_thresh = 0 # number # How to apply align_assign_span to function declaration "assignments", i.e. # 'virtual void foo() = 0' or '~foo() = {default|delete}'. @@ -1892,53 +2583,56 @@ align_assign_decl_func = 0 # unsigned number # The span for aligning on '=' in enums. # -# 0 = Don't align (default). +# 0: Don't align (default). align_enum_equ_span = 0 # unsigned number # The threshold for aligning on '=' in enums. +# Use a negative number for absolute thresholds. # -# 0 = no limit (default). -align_enum_equ_thresh = 0 # unsigned number +# 0: no limit (default). +align_enum_equ_thresh = 0 # number # The span for aligning class member definitions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_var_class_span = 0 # unsigned number # The threshold for aligning class member definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_var_class_thresh = 0 # unsigned number +# 0: No limit (default). +align_var_class_thresh = 0 # number # The gap for aligning class member definitions. align_var_class_gap = 0 # unsigned number # The span for aligning struct/union member definitions. # -# 0 = Don't align (default). +# 0: Don't align (default). align_var_struct_span = 0 # unsigned number # The threshold for aligning struct/union member definitions. +# Use a negative number for absolute thresholds. # -# 0 = No limit (default). -align_var_struct_thresh = 0 # unsigned number +# 0: No limit (default). +align_var_struct_thresh = 0 # number # The gap for aligning struct/union member definitions. align_var_struct_gap = 0 # unsigned number # The span for aligning struct initializer values. # -# 0 = Don't align (default). +# 0: Don't align (default). align_struct_init_span = 0 # unsigned number -# The minimum space between the type and the synonym of a typedef. -align_typedef_gap = 0 # unsigned number - # The span for aligning single-line typedefs. # -# 0 = Don't align (default). +# 0: Don't align (default). align_typedef_span = 0 # unsigned number +# The minimum space between the type and the synonym of a typedef. +align_typedef_gap = 0 # unsigned number + # How to align typedef'd functions with other typedefs. # # 0: Don't mix them at all (default) @@ -1946,25 +2640,32 @@ align_typedef_span = 0 # unsigned number # 2: Align the function type name with the other type names align_typedef_func = 0 # unsigned number -# How to align the '*' in typedefs. +# How to consider (or treat) the '*' in the alignment of typedefs. # -# 0: Align on typedef type, ignore '*' (default) -# 1: The '*' is part of type name: 'typedef int *pint;' -# 2: The '*' is part of the type, but dangling: 'typedef int *pint;' +# 0: Part of the typedef type, 'typedef int * pint;' (default) +# 1: Part of type name: 'typedef int *pint;' +# 2: Dangling: 'typedef int *pint;' +# Dangling: the '*' will not be taken into account when aligning. align_typedef_star_style = 0 # unsigned number -# How to align the '&' in typedefs. +# How to consider (or treat) the '&' in the alignment of typedefs. # -# 0: Align on typedef type, ignore '&' (default) -# 1: The '&' is part of type name: 'typedef int &pint;' -# 2: The '&' is part of the type, but dangling: 'typedef int &pint;' +# 0: Part of the typedef type, 'typedef int & intref;' (default) +# 1: Part of type name: 'typedef int &intref;' +# 2: Dangling: 'typedef int &intref;' +# Dangling: the '&' will not be taken into account when aligning. align_typedef_amp_style = 0 # unsigned number # The span for aligning comments that end lines. # -# 0 = Don't align (default). +# 0: Don't align (default). align_right_cmt_span = 0 # unsigned number +# Minimum number of columns between preceding text and a trailing comment in +# order for the comment to qualify for being aligned. Must be non-zero to have +# an effect. +align_right_cmt_gap = 0 # unsigned number + # If aligning comments, whether to mix with comments after '}' and #endif with # less than three spaces before the comment. align_right_cmt_mix = false # true/false @@ -1972,23 +2673,40 @@ align_right_cmt_mix = false # true/false # Whether to only align trailing comments that are at the same brace level. align_right_cmt_same_level = false # true/false -# Minimum number of columns between preceding text and a trailing comment in -# order for the comment to qualify for being aligned. Must be non-zero to have -# an effect. -align_right_cmt_gap = 0 # unsigned number - # Minimum column at which to align trailing comments. Comments which are # aligned beyond this column, but which can be aligned in a lesser column, # may be "pulled in". # -# 0 = Ignore (default). +# 0: Ignore (default). align_right_cmt_at_col = 0 # unsigned number # The span for aligning function prototypes. # -# 0 = Don't align (default). +# 0: Don't align (default). align_func_proto_span = 0 # unsigned number +# How to consider (or treat) the '*' in the alignment of function prototypes. +# +# 0: Part of the type 'void * foo();' (default) +# 1: Part of the function 'void *foo();' +# 2: Dangling 'void *foo();' +# Dangling: the '*' will not be taken into account when aligning. +align_func_proto_star_style = 0 # unsigned number + +# How to consider (or treat) the '&' in the alignment of function prototypes. +# +# 0: Part of the type 'long & foo();' (default) +# 1: Part of the function 'long &foo();' +# 2: Dangling 'long &foo();' +# Dangling: the '&' will not be taken into account when aligning. +align_func_proto_amp_style = 0 # unsigned number + +# The threshold for aligning function prototypes. +# Use a negative number for absolute thresholds. +# +# 0: No limit (default). +align_func_proto_thresh = 0 # number + # Minimum gap between the return type and the function name. align_func_proto_gap = 0 # unsigned number @@ -2011,6 +2729,11 @@ align_single_line_brace = false # true/false # Gap for align_single_line_brace. align_single_line_brace_gap = 0 # unsigned number +# (OC) The span for aligning Objective-C message specifications. +# +# 0: Don't align (default). +align_oc_msg_spec_span = 0 # unsigned number + # Whether to align macros wrapped with a backslash and a newline. This will # not work right if the macro contains a multi-line comment. align_nl_cont = false # true/false @@ -2018,23 +2741,46 @@ align_nl_cont = false # true/false # Whether to align macro functions and variables together. align_pp_define_together = false # true/false -# The minimum space between label and value of a preprocessor define. -align_pp_define_gap = 0 # unsigned number - # The span for aligning on '#define' bodies. # # =0: Don't align (default) # >0: Number of lines (including comments) between blocks align_pp_define_span = 0 # unsigned number +# The minimum space between label and value of a preprocessor define. +align_pp_define_gap = 0 # unsigned number + # Whether to align lines that start with '<<' with previous '<<'. # # Default: true align_left_shift = true # true/false +# Whether to align comma-separated statements following '<<' (as used to +# initialize Eigen matrices). +align_eigen_comma_init = false # true/false + # Whether to align text after 'asm volatile ()' colons. align_asm_colon = false # true/false +# (OC) Span for aligning parameters in an Objective-C message call +# on the ':'. +# +# 0: Don't align. +align_oc_msg_colon_span = 0 # unsigned number + +# (OC) Whether to always align with the first parameter, even if it is too +# short. +align_oc_msg_colon_first = false # true/false + +# (OC) Whether to align parameters in an Objective-C '+' or '-' declaration +# on the ':'. +align_oc_decl_colon = false # true/false + +# (OC) Whether to not align parameters in an Objectve-C message call if first +# colon is not on next line of the message call (the same way Xcode does +# aligment) +align_oc_msg_colon_xcode_like = false # true/false + # # Comment modification options # @@ -2046,9 +2792,44 @@ cmt_width = 0 # unsigned number # # 0: No reflowing (apart from the line wrapping due to cmt_width) (default) # 1: No touching at all -# 2: Full reflow +# 2: Full reflow (enable cmt_indent_multi for indent with line wrapping due to cmt_width) cmt_reflow_mode = 0 # unsigned number +# Path to a file that contains regular expressions describing patterns for +# which the end of one line and the beginning of the next will be folded into +# the same sentence or paragraph during full comment reflow. The regular +# expressions are described using ECMAScript syntax. The syntax for this +# specification is as follows, where "..." indicates the custom regular +# expression and "n" indicates the nth end_of_prev_line_regex and +# beg_of_next_line_regex regular expression pair: +# +# end_of_prev_line_regex[1] = "...$" +# beg_of_next_line_regex[1] = "^..." +# end_of_prev_line_regex[2] = "...$" +# beg_of_next_line_regex[2] = "^..." +# . +# . +# . +# end_of_prev_line_regex[n] = "...$" +# beg_of_next_line_regex[n] = "^..." +# +# Note that use of this option overrides the default reflow fold regular +# expressions, which are internally defined as follows: +# +# end_of_prev_line_regex[1] = "[\w,\]\)]$" +# beg_of_next_line_regex[1] = "^[\w,\[\(]" +# end_of_prev_line_regex[2] = "\.$" +# beg_of_next_line_regex[2] = "^[A-Z]" +cmt_reflow_fold_regex_file = "" # string + +# Whether to indent wrapped lines to the start of the encompassing paragraph +# during full comment reflow (cmt_reflow_mode = 2). Overrides the value +# specified by cmt_sp_after_star_cont. +# +# Note that cmt_align_doxygen_javadoc_tags overrides this option for +# paragraphs associated with javadoc tags +cmt_reflow_indent_to_paragraph_start = false # true/false + # Whether to convert all tabs to spaces in comments. If false, tabs in # comments are left alone, unless used for indenting. cmt_convert_tab_to_spaces = true # true/false @@ -2059,6 +2840,25 @@ cmt_convert_tab_to_spaces = true # true/false # Default: true cmt_indent_multi = true # true/false +# Whether to align doxygen javadoc-style tags ('@param', '@return', etc.) +# and corresponding fields such that groups of consecutive block tags, +# parameter names, and descriptions align with one another. Overrides that +# which is specified by the cmt_sp_after_star_cont. If cmt_width > 0, it may +# be necessary to enable cmt_indent_multi and set cmt_reflow_mode = 2 +# in order to achieve the desired alignment for line-wrapping. +cmt_align_doxygen_javadoc_tags = false # true/false + +# The number of spaces to insert after the star and before doxygen +# javadoc-style tags (@param, @return, etc). Requires enabling +# cmt_align_doxygen_javadoc_tags. Overrides that which is specified by the +# cmt_sp_after_star_cont. +# +# Default: 1 +cmt_sp_before_doxygen_javadoc_tags = 1 # unsigned number + +# Whether to change trailing, single-line c-comments into cpp-comments. +cmt_trailing_single_line_c_to_cpp = false # true/false + # Whether to group c-comments that look like they are in a block. cmt_c_group = false # true/false @@ -2132,10 +2932,17 @@ cmt_insert_func_header = "" # string # that will be replaced with the class name. cmt_insert_class_header = "" # string +# Path to a file that contains text to insert before an Objective-C message +# specification, if the method isn't preceded by a C/C++ comment. If the +# inserted text contains '$(message)' or '$(javaparam)', these will be +# replaced with, respectively, the name of the function, or the javadoc +# '@param' and '@return' stuff. +cmt_insert_oc_msg_header = "" # string + # Whether a comment should be inserted if a preprocessor is encountered when # stepping backwards from a function name. # -# Applies to cmt_insert_func_header and +# Applies to cmt_insert_oc_msg_header, cmt_insert_func_header and # cmt_insert_class_header. cmt_insert_before_preproc = false # true/false @@ -2158,17 +2965,17 @@ cmt_insert_before_ctor_dtor = false # true/false # # Add or remove braces on a single-line 'do' statement. -mod_full_brace_do = ignore # ignore/add/remove/force +mod_full_brace_do = ignore # ignore/add/remove/force/not_defined # Add or remove braces on a single-line 'for' statement. -mod_full_brace_for = ignore # ignore/add/remove/force +mod_full_brace_for = ignore # ignore/add/remove/force/not_defined # (Pawn) Add or remove braces on a single-line function definition. -mod_full_brace_function = ignore # ignore/add/remove/force +mod_full_brace_function = ignore # ignore/add/remove/force/not_defined # Add or remove braces on a single-line 'if' statement. Braces will not be # removed if the braced statement contains an 'else'. -mod_full_brace_if = ignore # ignore/add/remove/force +mod_full_brace_if = ignore # ignore/add/remove/force/not_defined # Whether to enforce that all blocks of an 'if'/'else if'/'else' chain either # have, or do not have, braces. If true, braces will be added if any block @@ -2184,10 +2991,10 @@ mod_full_brace_if_chain = false # true/false mod_full_brace_if_chain_only = false # true/false # Add or remove braces on single-line 'while' statement. -mod_full_brace_while = ignore # ignore/add/remove/force +mod_full_brace_while = ignore # ignore/add/remove/force/not_defined # Add or remove braces on single-line 'using ()' statement. -mod_full_brace_using = ignore # ignore/add/remove/force +mod_full_brace_using = ignore # ignore/add/remove/force/not_defined # Don't remove braces around statements that span N newlines mod_full_brace_nl = 0 # unsigned number @@ -2209,18 +3016,21 @@ mod_full_brace_nl = 0 # unsigned number mod_full_brace_nl_block_rem_mlcond = false # true/false # Add or remove unnecessary parenthesis on 'return' statement. -mod_paren_on_return = ignore # ignore/add/remove/force +mod_paren_on_return = ignore # ignore/add/remove/force/not_defined # (Pawn) Whether to change optional semicolons to real semicolons. mod_pawn_semicolon = false # true/false # Whether to fully parenthesize Boolean expressions in 'while' and 'if' -# statement, as in 'if (a && b > c)' → 'if (a && (b > c))'. +# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'. mod_full_paren_if_bool = false # true/false # Whether to remove superfluous semicolons. mod_remove_extra_semicolon = false # true/false +# Whether to remove duplicate include. +mod_remove_duplicate_include = true # true/false + # If a function body exceeds the specified number of newlines and doesn't have # a comment after the close brace, a comment will be added. mod_add_long_function_closebrace_comment = 0 # unsigned number @@ -2245,28 +3055,80 @@ mod_add_long_ifdef_endif_comment = 0 # unsigned number # doesn't have a comment after the #else, a comment will be added. mod_add_long_ifdef_else_comment = 0 # unsigned number +# Whether to take care of the case by the mod_sort_xx options. +mod_sort_case_sensitive = false # true/false + # Whether to sort consecutive single-line 'import' statements. mod_sort_import = false # true/false +# (C#) Whether to sort consecutive single-line 'using' statements. +mod_sort_using = false # true/false + # Whether to sort consecutive single-line '#include' statements (C/C++) and # '#import' statements (Objective-C). Be aware that this has the potential to # break your code if your includes/imports have ordering dependencies. mod_sort_include = false # true/false +# Whether to prioritize '#include' and '#import' statements that contain +# filename without extension when sorting is enabled. +mod_sort_incl_import_prioritize_filename = false # true/false + +# Whether to prioritize '#include' and '#import' statements that does not +# contain extensions when sorting is enabled. +mod_sort_incl_import_prioritize_extensionless = false # true/false + +# Whether to prioritize '#include' and '#import' statements that contain +# angle over quotes when sorting is enabled. +mod_sort_incl_import_prioritize_angle_over_quotes = false # true/false + +# Whether to ignore file extension in '#include' and '#import' statements +# for sorting comparison. +mod_sort_incl_import_ignore_extension = false # true/false + +# Whether to group '#include' and '#import' statements when sorting is enabled. +mod_sort_incl_import_grouping_enabled = false # true/false + # Whether to move a 'break' that appears after a fully braced 'case' before -# the close brace, as in 'case X: { ... } break;' → 'case X: { ... break; }'. +# the close brace, as in 'case X: { ... } break;' => 'case X: { ... break; }'. mod_move_case_break = false # true/false # Add or remove braces around a fully braced case statement. Will only remove # braces if there are no variable declarations in the block. -mod_case_brace = ignore # ignore/add/remove/force +mod_case_brace = ignore # ignore/add/remove/force/not_defined # Whether to remove a void 'return;' that appears as the last statement in a # function. mod_remove_empty_return = false # true/false # Add or remove the comma after the last value of an enumeration. -mod_enum_last_comma = ignore # ignore/add/remove/force +mod_enum_last_comma = ignore # ignore/add/remove/force/not_defined + +# (OC) Whether to organize the properties. If true, properties will be +# rearranged according to the mod_sort_oc_property_*_weight factors. +mod_sort_oc_properties = false # true/false + +# (OC) Weight of a class property modifier. +mod_sort_oc_property_class_weight = 0 # number + +# (OC) Weight of 'atomic' and 'nonatomic'. +mod_sort_oc_property_thread_safe_weight = 0 # number + +# (OC) Weight of 'readwrite' when organizing properties. +mod_sort_oc_property_readwrite_weight = 0 # number + +# (OC) Weight of a reference type specifier ('retain', 'copy', 'assign', +# 'weak', 'strong') when organizing properties. +mod_sort_oc_property_reference_weight = 0 # number + +# (OC) Weight of getter type ('getter=') when organizing properties. +mod_sort_oc_property_getter_weight = 0 # number + +# (OC) Weight of setter type ('setter=') when organizing properties. +mod_sort_oc_property_setter_weight = 0 # number + +# (OC) Weight of nullability type ('nullable', 'nonnull', 'null_unspecified', +# 'null_resettable') when organizing properties. +mod_sort_oc_property_nullability_weight = 0 # number # # Preprocessor options @@ -2274,7 +3136,7 @@ mod_enum_last_comma = ignore # ignore/add/remove/force # Add or remove indentation of preprocessor directives inside #if blocks # at brace level 0 (file-level). -pp_indent = ignore # ignore/add/remove/force +pp_indent = ignore # ignore/add/remove/force/not_defined # Whether to indent #if/#else/#endif at the brace level. If false, these are # indented from column 1. @@ -2289,7 +3151,7 @@ pp_indent_at_level = false # true/false pp_indent_count = 1 # unsigned number # Add or remove space after # based on pp_level of #if blocks. -pp_space = ignore # ignore/add/remove/force +pp_space = ignore # ignore/add/remove/force/not_defined # Sets the number of spaces per level added with pp_space. pp_space_count = 0 # unsigned number @@ -2311,10 +3173,16 @@ pp_indent_if = 0 # number # Whether to indent the code between #if, #else and #endif. pp_if_indent_code = false # true/false +# Whether to indent the body of an #if that encompasses all the code in the file. +pp_indent_in_guard = false # true/false + # Whether to indent '#define' at the brace level. If false, these are # indented from column 1. pp_define_at_level = false # true/false +# Whether to indent '#include' at the brace level. +pp_include_at_level = false # true/false + # Whether to ignore the '#define' body while formatting. pp_ignore_define_body = false # true/false @@ -2396,6 +3264,11 @@ use_indent_continue_only_once = false # true/false # false: indentation will be used every time (default) indent_cpp_lambda_only_once = false # true/false +# Whether sp_after_angle takes precedence over sp_inside_fparen. This was the +# historic behavior, but is probably not the desired behavior, so this is off +# by default. +use_sp_after_angle_always = false # true/false + # Whether to apply special formatting for Qt SIGNAL/SLOT macros. Essentially, # this tries to format these so that they match Qt's normalized form (i.e. the # result of QMetaObject::normalizedSignature), which can slightly improve the @@ -2407,10 +3280,39 @@ indent_cpp_lambda_only_once = false # true/false # Default: true use_options_overriding_for_qt_macros = true # true/false +# If true: the form feed character is removed from the list of whitespace +# characters. See https://en.cppreference.com/w/cpp/string/byte/isspace. +use_form_feed_no_more_as_whitespace_character = false # true/false + # # Warn levels - 1: error, 2: warning (default), 3: note # +# (C#) Warning is given if doing tab-to-\t replacement and we have found one +# in a C# verbatim string literal. +# +# Default: 2 +warn_level_tabs_found_in_verbatim_string_literals = 2 # unsigned number + +# Limit the number of loops. +# Used by uncrustify.cpp to exit from infinite loop. +# 0: no limit. +debug_max_number_of_loops = 0 # number + +# Set the number of the line to protocol; +# Used in the function prot_the_line if the 2. parameter is zero. +# 0: nothing protocol. +debug_line_number_to_protocol = 0 # number + +# Set the number of second(s) before terminating formatting the current file, +# 0: no timeout. +# only for linux +debug_timeout = 0 # number + +# Set the number of characters to be printed if the text is too long, +# 0: do not truncate. +debug_truncate = 0 # unsigned number + # Meaning of the settings: # Ignore - do not do any changes # Add - makes sure there is 1 or more space/brace/newline/etc @@ -2426,7 +3328,7 @@ use_options_overriding_for_qt_macros = true # true/false # `set BOOL __AND__ __OR__` # # tokenTypes are defined in src/token_enum.h, use them without the -# 'CT_' prefix: 'CT_BOOL' → 'BOOL' +# 'CT_' prefix: 'CT_BOOL' => 'BOOL' # # # - Token(s) can be treated as type(s) with the 'type' option. @@ -2450,7 +3352,7 @@ use_options_overriding_for_qt_macros = true # true/false # `file_ext CPP .ch .cxx .cpp.in` # # langTypes are defined in uncrusify_types.h in the lang_flag_e enum, use -# them without the 'LANG_' prefix: 'LANG_CPP' → 'CPP' +# them without the 'LANG_' prefix: 'LANG_CPP' => 'CPP' # # # - Custom macro-based indentation can be set up using 'macro-open', @@ -2465,3 +3367,6 @@ use_options_overriding_for_qt_macros = true # true/false # # option(s) with 'not default' value: 0 # + +type QWindow +type QQuickItem diff --git a/README.md b/README.md index 9831aa97..e64891aa 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ But so far only Linux is actively tested. It might support all versions Qt >= 5.6, but you can rely on: - Qt 5.6 +- Qt 5.15 - current long term supported ( LTS ) version of Qt - current version of Qt diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 4e5d278c..58e52f7a 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -33,7 +33,7 @@ namespace connect( this, &QskTabView::currentIndexChanged, this, &TabView::updateViewPanel ); - } + } protected: void aboutToShow() override @@ -48,7 +48,7 @@ namespace We should have a better way to set individual colors for each tab page background */ - + if ( auto page = dynamic_cast< const ::Page* >( currentItem() ) ) setGradientHint( QskTabView::Page, page->gradient() ); } diff --git a/examples/iotdashboard/LightDisplay.cpp b/examples/iotdashboard/LightDisplay.cpp index 0e349197..7c345a11 100644 --- a/examples/iotdashboard/LightDisplay.cpp +++ b/examples/iotdashboard/LightDisplay.cpp @@ -165,14 +165,15 @@ bool LightDisplay::arcContainsPoint( const QRectF& rect, const QPointF& point ) const int tolerance = 20; // 1. check angle - QPointF circlePos( point.x() - rect.center().x(), - rect.center().y() - point.y() ); + QPointF circlePos( + point.x() - rect.center().x(), + rect.center().y() - point.y() ); const qreal angle = angleFromPoint( rect, point ); const bool angleWithinRange = angleInRange( metrics, angle ) - || angleDiff( angle, metrics.startAngle() ) <= tolerance - || angleDiff( angle, metrics.endAngle() ) <= tolerance; + || angleDiff( angle, metrics.startAngle() ) <= tolerance + || angleDiff( angle, metrics.endAngle() ) <= tolerance; // 2. check whether point is on arc const qreal radiusMax = rect.width() / 2; @@ -181,7 +182,7 @@ bool LightDisplay::arcContainsPoint( const QRectF& rect, const QPointF& point ) const qreal polarRadius = qSqrt( qPow( circlePos.x(), 2 ) + qPow( circlePos.y(), 2 ) ); const bool pointOnArc = ( polarRadius + tolerance ) > radiusMin - && ( polarRadius - tolerance ) < radiusMax; + && ( polarRadius - tolerance ) < radiusMax; bool ret = angleWithinRange && pointOnArc; diff --git a/examples/iotdashboard/LightDisplaySkinlet.cpp b/examples/iotdashboard/LightDisplaySkinlet.cpp index 0219985c..fd560cf8 100644 --- a/examples/iotdashboard/LightDisplaySkinlet.cpp +++ b/examples/iotdashboard/LightDisplaySkinlet.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -33,15 +34,15 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable, QRectF rect = contentsRect; const qreal ticksSpacing = 4; // space between the ticks and the arc - if( subControl == LightDisplay::Groove - || subControl == LightDisplay::Panel ) + if( subControl == LightDisplay::Groove || subControl == LightDisplay::Panel ) { QSizeF textSize = textLabelsSize( display ); QskArcMetrics arcMetrics = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ); const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing; const qreal x = textSize.width() + arcMetrics.width() + ticksWidth; - const qreal w = contentsRect.width() - ( 2 * ( textSize.width() + arcMetrics.width() + ticksWidth ) ); + const qreal w = contentsRect.width() - + ( 2 * ( textSize.width() + arcMetrics.width() + ticksWidth ) ); const qreal y = arcMetrics.width() + ticksWidth; const qreal h = contentsRect.height() - 2 * ( arcMetrics.width() + ticksWidth ); @@ -52,24 +53,24 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable, } else if( subControl == LightDisplay::ColdAndWarmArc ) { - const QRectF panelRect = subControlRect( skinnable, contentsRect, - LightDisplay::Panel ); + const QRectF panelRect = subControlRect( skinnable, contentsRect, LightDisplay::Panel ); auto barWidth = display->arcMetricsHint( LightDisplay::ColdAndWarmArc ).width(); auto rect = panelRect.marginsAdded( { barWidth, barWidth, barWidth, barWidth } ); return rect; } else if( subControl == LightDisplay::Tickmarks ) { - const QRectF arcRect = subControlRect( skinnable, contentsRect, - LightDisplay::ColdAndWarmArc ); - const qreal ticksWidth = display->arcMetricsHint( LightDisplay::Tickmarks ).width() + ticksSpacing; - const QRectF rect = arcRect.marginsAdded( { ticksWidth, ticksWidth, ticksWidth, ticksWidth } ); + const QRectF arcRect = subControlRect( + skinnable, contentsRect, LightDisplay::ColdAndWarmArc ); + const qreal ticksWidth = display->arcMetricsHint( + LightDisplay::Tickmarks ).width() + ticksSpacing; + const QRectF rect = + arcRect.marginsAdded( { ticksWidth, ticksWidth, ticksWidth, ticksWidth } ); return rect; } else if( subControl == LightDisplay::ValueText ) { - QRectF valueTextRect = subControlRect( skinnable, contentsRect, - LightDisplay::Panel ); + QRectF valueTextRect = subControlRect( skinnable, contentsRect, LightDisplay::Panel ); const QFontMetricsF fm( skinnable->effectiveFont( subControl ) ); const qreal fontWidth = fm.width( QStringLiteral( "100 %" ) ); const QPointF center = valueTextRect.center(); @@ -125,8 +126,7 @@ QRectF LightDisplaySkinlet::subControlRect( const QskSkinnable* skinnable, QSGNode* LightDisplaySkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { - auto* display = static_cast< const LightDisplay* >( skinnable ); - + const auto* display = static_cast< const LightDisplay* >( skinnable ); switch( nodeRole ) { @@ -166,16 +166,16 @@ QSGNode* LightDisplaySkinlet::updateSubNode( if ( ticksNode == nullptr ) ticksNode = new RadialTickmarksNode(); - QColor color = display->color( LightDisplay::Tickmarks ); - QRectF ticksRect = display->subControlRect( LightDisplay::Tickmarks ); - QskArcMetrics arcMetrics = display->arcMetricsHint( LightDisplay::Tickmarks ); - QskIntervalF boundaries = display->boundaries(); - QskScaleTickmarks tickmarks; - tickmarks.setMajorTicks( {0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180 } ); - int tickLineWidth = display->metric( LightDisplay::Tickmarks ); + const auto color = display->color( LightDisplay::Tickmarks ); + const auto ticksRect = display->subControlRect( LightDisplay::Tickmarks ); + const auto arcMetrics = display->arcMetricsHint( LightDisplay::Tickmarks ); - ticksNode->update( color, ticksRect, arcMetrics, boundaries, - tickmarks, tickLineWidth, Qt::Horizontal ); + QskScaleTickmarks tickmarks; + tickmarks.setMajorTicks( { 0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180 } ); + + const auto tickLineWidth = display->metric( LightDisplay::Tickmarks ); + + ticksNode->update( color, ticksRect, arcMetrics, tickmarks, tickLineWidth ); return ticksNode; } @@ -207,11 +207,11 @@ QSGNode* LightDisplaySkinlet::updateSubNode( QSizeF LightDisplaySkinlet::textLabelsSize( const LightDisplay* display ) const { - QFont font = display->effectiveFont( LightDisplay::LeftLabel ); - QFontMetricsF fm( font ); + const QFontMetricsF fm( display->effectiveFont( LightDisplay::LeftLabel ) ); qreal w = fm.width( QStringLiteral( " 100" ) ); qreal h = fm.height(); + return { w, h }; } diff --git a/examples/iotdashboard/MenuBar.cpp b/examples/iotdashboard/MenuBar.cpp index 817d95bf..ccbcd5d3 100644 --- a/examples/iotdashboard/MenuBar.cpp +++ b/examples/iotdashboard/MenuBar.cpp @@ -46,7 +46,7 @@ MenuBar::MenuBar( QQuickItem* parent ) m_entryStrings = { "Dashboard", "Rooms", "Devices", "Statistics", "Storage", "Members" }; - for( const auto& entryString : qskAsConst( m_entryStrings ) ) + for( const auto& entryString : qAsConst( m_entryStrings ) ) { auto* entry = new MenuItem( entryString, this ); m_entries.append( entry ); diff --git a/examples/iotdashboard/ShadowedBox.cpp b/examples/iotdashboard/ShadowedBox.cpp index 1422d087..92f2f2d7 100644 --- a/examples/iotdashboard/ShadowedBox.cpp +++ b/examples/iotdashboard/ShadowedBox.cpp @@ -125,7 +125,7 @@ QColor ShadowedBox::shadowColor() const return m_shadowColor; } -QRectF ShadowedBox::layoutRectForSize( const QSizeF &size ) const +QRectF ShadowedBox::layoutRectForSize( const QSizeF& size ) const { auto padding = paddingHint( Panel ); return { padding.left() / 2, padding.top() / 2, diff --git a/examples/iotdashboard/iotdashboard.pro b/examples/iotdashboard/iotdashboard.pro index 1b6a87b7..1669d26d 100644 --- a/examples/iotdashboard/iotdashboard.pro +++ b/examples/iotdashboard/iotdashboard.pro @@ -1,6 +1,7 @@ CONFIG += qskexample QT += svg +QT += quick_private # TODO: examples should not use private headers SOURCES += \ Box.cpp \ diff --git a/examples/iotdashboard/nodes/BoxShadowNode.cpp b/examples/iotdashboard/nodes/BoxShadowNode.cpp index dee3da36..db9ea9fd 100644 --- a/examples/iotdashboard/nodes/BoxShadowNode.cpp +++ b/examples/iotdashboard/nodes/BoxShadowNode.cpp @@ -46,9 +46,9 @@ namespace int compare( const QSGMaterial* other ) const override; - QVector2D aspect = QVector2D{1.0, 1.0}; + QVector2D aspect = QVector2D{ 1.0, 1.0 }; float blurExtent = 0.0; - QVector4D radius = QVector4D{0.0, 0.0, 0.0, 0.0}; + QVector4D radius = QVector4D{ 0.0, 0.0, 0.0, 0.0 }; QColor color = Qt::black; }; diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp index 13a86dbc..41e3c4eb 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.cpp +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.cpp @@ -5,82 +5,48 @@ #include "RadialTickmarksNode.h" -#include +#include +#include #include -QSK_QT_PRIVATE_BEGIN -#include -QSK_QT_PRIVATE_END - -static constexpr inline qreal qskTickFactor( QskScaleTickmarks::TickType type ) -{ - using TM = QskScaleTickmarks; - return type == TM::MinorTick ? 0.7 : ( type == TM::MinorTick ? 0.85 : 1.0 ); -} - -class RadialTickmarksNodePrivate final : public QSGGeometryNodePrivate -{ - public: - RadialTickmarksNodePrivate() - : geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) - { -#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) - geometry.setDrawingMode( QSGGeometry::DrawLines ); -#else - geometry.setDrawingMode( GL_LINES ); -#endif - geometry.setVertexDataPattern( QSGGeometry::StaticPattern ); - } - - QSGGeometry geometry; - QSGFlatColorMaterial material; - - QskIntervalF boundaries; - QskScaleTickmarks tickmarks; - - QRectF rect; - int lineWidth = 0; - - uint hash = 0; -}; - RadialTickmarksNode::RadialTickmarksNode() - : QSGGeometryNode( *new RadialTickmarksNodePrivate ) + : m_geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) { - Q_D( RadialTickmarksNode ); +#if QT_VERSION >= QT_VERSION_CHECK( 5, 8, 0 ) + m_geometry.setDrawingMode( QSGGeometry::DrawLines ); +#else + m_geometry.setDrawingMode( GL_LINES ); +#endif + m_geometry.setVertexDataPattern( QSGGeometry::StaticPattern ); - setGeometry( &d->geometry ); - setMaterial( &d->material ); + setGeometry( &m_geometry ); + setMaterial( &m_material ); } RadialTickmarksNode::~RadialTickmarksNode() { } -void RadialTickmarksNode::update(const QColor& color, const QRectF& rect, - const QskArcMetrics& arcMetrics, const QskIntervalF& /*boundaries*/, - const QskScaleTickmarks& tickmarks, int lineWidth, - Qt::Orientation /*orientation*/ ) +void RadialTickmarksNode::update( const QColor& color, const QRectF& rect, + const QskArcMetrics& arcMetrics, const QskScaleTickmarks& tickmarks, int lineWidth ) { - Q_D( RadialTickmarksNode ); - - if( lineWidth != d->lineWidth ) + if( lineWidth != m_lineWidth ) { - d->lineWidth = lineWidth; - d->geometry.setLineWidth( lineWidth ); + m_lineWidth = lineWidth; + m_geometry.setLineWidth( lineWidth ); markDirty( QSGNode::DirtyGeometry ); } - const uint hash = tickmarks.hash( 17435 ); + const auto hash = tickmarks.hash( 17435 ); - if( ( hash != d->hash ) || ( rect != d->rect ) ) + if( ( hash != m_hash ) || ( rect != m_rect ) ) { - d->hash = hash; - d->rect = rect; + m_hash = hash; + m_rect = rect; - d->geometry.allocate( tickmarks.tickCount() * 2 ); - auto vertexData = d->geometry.vertexDataAsPoint2D(); + m_geometry.allocate( tickmarks.tickCount() * 2 ); + auto vertexData = m_geometry.vertexDataAsPoint2D(); const auto center = rect.center(); const auto radius = 0.5 * rect.width(); @@ -117,13 +83,13 @@ void RadialTickmarksNode::update(const QColor& color, const QRectF& rect, } } - d->geometry.markVertexDataDirty(); + m_geometry.markVertexDataDirty(); markDirty( QSGNode::DirtyGeometry ); } - if ( color != d->material.color() ) + if ( color != m_material.color() ) { - d->material.setColor( color ); + m_material.setColor( color ); markDirty( QSGNode::DirtyMaterial ); } } diff --git a/examples/iotdashboard/nodes/RadialTickmarksNode.h b/examples/iotdashboard/nodes/RadialTickmarksNode.h index 27fc82a9..188dc888 100644 --- a/examples/iotdashboard/nodes/RadialTickmarksNode.h +++ b/examples/iotdashboard/nodes/RadialTickmarksNode.h @@ -5,13 +5,13 @@ #pragma once -#include #include -#include #include +#include -class RadialTickmarksNodePrivate; +class QskArcMetrics; +class QskScaleTickmarks; class RadialTickmarksNode : public QSGGeometryNode { @@ -19,9 +19,15 @@ class RadialTickmarksNode : public QSGGeometryNode RadialTickmarksNode(); ~RadialTickmarksNode() override; - void update( const QColor&, const QRectF&, const QskArcMetrics&, - const QskIntervalF&, const QskScaleTickmarks&, int, Qt::Orientation ); + void update( const QColor&, const QRectF&, + const QskArcMetrics&, const QskScaleTickmarks&, int lineWidth ); private: - Q_DECLARE_PRIVATE( RadialTickmarksNode ) + QSGGeometry m_geometry; + QSGFlatColorMaterial m_material; + + QRectF m_rect; + int m_lineWidth = 0; + + QskHashValue m_hash = 0; }; diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp index 582740d8..487796aa 100644 --- a/examples/listbox/main.cpp +++ b/examples/listbox/main.cpp @@ -34,9 +34,14 @@ class ListBox : public QskSimpleListBox private: void populate() { + const int count = 10000; + const QString format( "Row %1: The quick brown fox jumps over the lazy dog" ); + QStringList entries; - for ( int i = 0; i < 10000; i++ ) + entries.reserve( count ); + + for ( int i = 0; i < count; i++ ) { entries += format.arg( i + 1 ); } diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index 3a764814..996bcd02 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/features/qskconfig.pri b/features/qskconfig.pri index bb79ee5f..1054f7c4 100644 --- a/features/qskconfig.pri +++ b/features/qskconfig.pri @@ -37,7 +37,7 @@ CONFIG += no_private_qt_headers_warning CONFIG += warn_on CONFIG += no_keywords CONFIG += silent -CONFIG -= depend_includepath +#CONFIG -= depend_includepath CONFIG += strict_c++ CONFIG += c++11 @@ -64,16 +64,6 @@ RCC_DIR = rcc QSK_CONFIG += QskDll -*-g++* { - - GCC_VERSION = $$system("$$QMAKE_CXX -dumpversion") - equals(GCC_VERSION,4) || contains(GCC_VERSION, 4.* ) { - - # gcc4 is too old for certain checks - CONFIG -= pedantic sanitize - } -} - linux { pedantic { @@ -83,16 +73,20 @@ linux { # Qt headers do not stand pedantic checks, so it's better # to exclude them by declaring them as system includes + CONFIG += qtassysteminclude + } + + qtassysteminclude { + # As most distros set QT_INSTALL_HEADERS to /usr/include we # would run into gcc compiler errors and better drop it # from the list below. Should be no problem as we don't # add the Qt module to our includes and therefore don't # need this path. - # QMAKE_CXXFLAGS += -isystem $$[QT_INSTALL_HEADERS] - QMAKE_CXXFLAGS += \ -isystem $$[QT_INSTALL_HEADERS]/QtCore \ + -isystem $$[QT_INSTALL_HEADERS]/QtCore/$$[QT_VERSION]/QtCore \ -isystem $$[QT_INSTALL_HEADERS]/QtGui \ -isystem $$[QT_INSTALL_HEADERS]/QtGui/$$[QT_VERSION]/QtGui \ -isystem $$[QT_INSTALL_HEADERS]/QtQuick \ @@ -114,13 +108,6 @@ linux-g++ | linux-g++-64 { # QMAKE_CXXFLAGS_RELEASE *= -Ofast # QMAKE_CXXFLAGS_RELEASE *= -Os - - # Some versions ( here 2.31.1 ) of the BFD linker may generate shared - # libraries with corrupt symbol version info which leads to - # "invalid version 21" errors when the corrupt shared library is used. - # One possible workaround is to use the gold linker instead. - - # QMAKE_LFLAGS *= -Wl,-fuse-ld=gold } pedantic { @@ -130,7 +117,7 @@ pedantic { QMAKE_CXXFLAGS *= -pedantic-errors QMAKE_CXXFLAGS *= -Wextra QMAKE_CXXFLAGS *= -Werror=format-security - QMAKE_CXXFLAGS *= -Wlogical-op + #QMAKE_CXXFLAGS *= -Wlogical-op # QMAKE_CXXFLAGS *= -Wconversion # QMAKE_CXXFLAGS *= -Wfloat-equal @@ -172,8 +159,7 @@ sanitize { CONFIG += sanitizer CONFIG += sanitize_address - #CONFIG *= sanitize_memory - CONFIG *= sanitize_undefined + # CONFIG *= sanitize_undefined linux-g++ | linux-g++-64 { #QMAKE_CXXFLAGS *= -fsanitize-address-use-after-scope @@ -185,7 +171,16 @@ debug { DEFINES += ITEM_STATISTICS=1 } -# Help out Qt Creator -ide: DEFINES += QT_IDE - # DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x000000 +DEFINES += QSK_BUILD + +LOCAL_PRI=$$(QSK_LOCAL_PRI) + +if ( exists( $${LOCAL_PRI} ) ) { + + # When not working with the Qt/Creator it is often more convenient + # to include the specific options of your local build, than passing + # them all on the command line + + include( $${LOCAL_PRI} ) +} diff --git a/playground/anchors/kiwi/Solver.cpp b/playground/anchors/kiwi/Solver.cpp index 3c94c567..a0a6a9b5 100644 --- a/playground/anchors/kiwi/Solver.cpp +++ b/playground/anchors/kiwi/Solver.cpp @@ -1,12 +1,3 @@ -/****************************************************************************** - * This code is a stripped down version of the Cassowary constraint solving - * algorithm. The implementation has been taken from the Kiwi project: - * - * Copyright (c) 2013-2017, Nucleic Development Team. - * Distributed under the terms of the Modified BSD License. - * https://github.com/nucleic/kiwi/blob/master/LICENSE - *****************************************************************************/ - #include "Solver.h" #include "Constraint.h" #include "Variable.h" diff --git a/playground/grids/GridQuick.cpp b/playground/grids/GridQuick.cpp index c92c88ef..f10d5a0b 100644 --- a/playground/grids/GridQuick.cpp +++ b/playground/grids/GridQuick.cpp @@ -59,7 +59,7 @@ GridQuick::GridQuick( QWidget* parent ) createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.1\nItem { GridLayout {} }" ); setContent( QUrl(), nullptr, contentItem ); - m_grid = contentItem->childItems().first(); + m_grid = contentItem->childItems().constFirst(); m_grid->setProperty( "rowSpacing", 5 ); m_grid->setProperty( "columnSpacing", 5 ); } @@ -78,7 +78,7 @@ void GridQuick::insert( const QByteArray& colorName, */ auto layout = createQml( "import QtQuick 2.0\nimport QtQuick.Layouts 1.15\nGridLayout { Rectangle {} }" ); - auto rectangle = layout->childItems().first(); + auto rectangle = layout->childItems().constFirst(); rectangle->setParent( nullptr ); delete layout; diff --git a/playground/grids/main.cpp b/playground/grids/main.cpp index b16c5fd0..40dd8a8a 100644 --- a/playground/grids/main.cpp +++ b/playground/grids/main.cpp @@ -391,7 +391,7 @@ int main( int argc, char** argv ) #if 1 /* - we don't need the fonts, but by calling something from + we don't need the fonts, but by calling something from the support library initializations regarding the skins are loaded. TODO ... */ diff --git a/playground/images/Image.h b/playground/images/Image.h index b3c9df96..3eaabe49 100644 --- a/playground/images/Image.h +++ b/playground/images/Image.h @@ -7,17 +7,18 @@ #include "QskGlobal.h" -#ifdef QT_NO_KEYWORDS - -// qquickimage_p.h uses emit -#define emit Q_EMIT -#include -#undef emit +QSK_QT_PRIVATE_BEGIN +#ifndef emit + #define emit + #include + #undef emit #else -#include + #include #endif +QSK_QT_PRIVATE_END + #include class Image : public QQuickImage diff --git a/playground/shadows/BoxShadowNode.cpp b/playground/shadows/BoxShadowNode.cpp index 0087fa58..17dd412f 100644 --- a/playground/shadows/BoxShadowNode.cpp +++ b/playground/shadows/BoxShadowNode.cpp @@ -46,9 +46,9 @@ namespace int compare( const QSGMaterial* other ) const override; - QVector2D aspect = QVector2D{1.0, 1.0}; + QVector2D aspect = QVector2D{ 1.0, 1.0 }; float blurExtent = 0.0; - QVector4D radius = QVector4D{0.0, 0.0, 0.0, 0.0}; + QVector4D radius = QVector4D{ 0.0, 0.0, 0.0, 0.0 }; QColor color = Qt::black; }; diff --git a/qmlexport/QskQml.cpp b/qmlexport/QskQml.cpp index eefde44e..d247ecf4 100644 --- a/qmlexport/QskQml.cpp +++ b/qmlexport/QskQml.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -115,8 +114,8 @@ namespace static inline QskGradientStop qskToGradientStop( const QJSValue& value ) { return QskGradientStop( - value.property( QLatin1String( "position" ) ).toNumber(), - value.property( QLatin1String( "color" ) ).toVariant().value< QColor >() + value.property( QStringLiteral( "position" ) ).toNumber(), + value.property( QStringLiteral( "color" ) ).toVariant().value< QColor >() ); } @@ -194,7 +193,6 @@ void QskQml::registerTypes() #endif QSK_REGISTER_GADGET( QskRgbValueQml, "RgbValue" ); - QSK_REGISTER_GADGET( QskStandardSymbol, "StandardSymbol" ); QSK_REGISTER_GADGET( QskBoxBorderMetrics, "BorderMetrics" ); QSK_REGISTER_GADGET( QskBoxShapeMetrics, "Shape" ); QSK_REGISTER_GADGET( QskShadowMetrics, "ShadowMetrics" ); diff --git a/qmlexport/QskShortcutQml.h b/qmlexport/QskShortcutQml.h index a6fb1adc..3604a198 100644 --- a/qmlexport/QskShortcutQml.h +++ b/qmlexport/QskShortcutQml.h @@ -79,7 +79,7 @@ class QskShortcutQml : public QObject, public QQmlParserStatus void activated(); void activatedAmbiguously(); - int shortcutIdChanged( int ); + void shortcutIdChanged( int ); protected: bool event( QEvent* ) override; diff --git a/qskinny.pro b/qskinny.pro index 97705c65..7a41eef1 100644 --- a/qskinny.pro +++ b/qskinny.pro @@ -21,6 +21,7 @@ OTHER_FILES = \ qmlexport.depends = src inputcontext.depends = src skins.depends = src +tools.depends = src support.depends = src skins examples.depends = tools support skins qmlexport playground.depends = tools support skins qmlexport diff --git a/skins/material/QskMaterialSkin.cpp b/skins/material/QskMaterialSkin.cpp index 2bf3432d..a096179e 100644 --- a/skins/material/QskMaterialSkin.cpp +++ b/skins/material/QskMaterialSkin.cpp @@ -785,7 +785,7 @@ QskMaterialSkin::QskMaterialSkin( QObject* parent ) QskRgb::Blue500, QskRgb::White ); // Default theme colors - setupFonts( "Roboto" ); + setupFonts( QStringLiteral( "Roboto" ) ); auto buttonFont = font( QskSkin::DefaultFont ); buttonFont.setCapitalization( QFont::AllUppercase ); diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index 377141c7..f7031ae1 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -941,7 +941,7 @@ QskSquiekSkin::QskSquiekSkin( QObject* parent ) : Inherited( parent ) , m_data( new PrivateData() ) { - setupFonts( "DejaVuSans" ); + setupFonts( QStringLiteral( "DejaVuSans" ) ); Editor editor( &hintTable(), m_data->palette ); editor.setup(); diff --git a/src/common/QskArcMetrics.cpp b/src/common/QskArcMetrics.cpp index 989474a6..991b075d 100644 --- a/src/common/QskArcMetrics.cpp +++ b/src/common/QskArcMetrics.cpp @@ -86,9 +86,9 @@ QskArcMetrics QskArcMetrics::toAbsolute( const QSizeF& size ) const noexcept return absoluted; } -uint QskArcMetrics::hash( uint seed ) const noexcept +QskHashValue QskArcMetrics::hash( QskHashValue seed ) const noexcept { - uint hash = qHash( m_width, seed ); + auto hash = qHash( m_width, seed ); hash = qHash( m_startAngle, hash ); hash = qHash( m_spanAngle, hash ); diff --git a/src/common/QskArcMetrics.h b/src/common/QskArcMetrics.h index 2ff493ee..7d5d6751 100644 --- a/src/common/QskArcMetrics.h +++ b/src/common/QskArcMetrics.h @@ -24,7 +24,7 @@ class QSK_EXPORT QskArcMetrics public: constexpr QskArcMetrics() noexcept; constexpr QskArcMetrics( qreal width, qreal startAngle, qreal spanAngle, - Qt::SizeMode = Qt::AbsoluteSize ) noexcept; + Qt::SizeMode = Qt::AbsoluteSize ) noexcept; bool operator==( const QskArcMetrics& ) const noexcept; bool operator!=( const QskArcMetrics& ) const noexcept; @@ -50,7 +50,7 @@ class QSK_EXPORT QskArcMetrics QskArcMetrics toAbsolute( const QSizeF& ) const noexcept; - uint hash( uint seed = 0 ) const noexcept; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; static QVariant interpolate( const QskArcMetrics&, const QskArcMetrics&, qreal progress ); diff --git a/src/common/QskBoxBorderColors.cpp b/src/common/QskBoxBorderColors.cpp index dce16657..054696dd 100644 --- a/src/common/QskBoxBorderColors.cpp +++ b/src/common/QskBoxBorderColors.cpp @@ -185,9 +185,9 @@ QVariant QskBoxBorderColors::interpolate( return QVariant::fromValue( from.interpolated( to, ratio ) ); } -uint QskBoxBorderColors::hash( uint seed ) const +QskHashValue QskBoxBorderColors::hash( QskHashValue seed ) const { - uint h = m_gradients[ 0 ].hash( seed ); + auto h = m_gradients[ 0 ].hash( seed ); h = m_gradients[ 1 ].hash( h ); h = m_gradients[ 2 ].hash( h ); h = m_gradients[ 3 ].hash( h ); diff --git a/src/common/QskBoxBorderColors.h b/src/common/QskBoxBorderColors.h index 5a71df73..b6ca4b68 100644 --- a/src/common/QskBoxBorderColors.h +++ b/src/common/QskBoxBorderColors.h @@ -49,7 +49,7 @@ class QSK_EXPORT QskBoxBorderColors static QVariant interpolate( const QskBoxBorderColors&, const QskBoxBorderColors&, qreal ratio ); - uint hash( uint seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const; bool isMonochrome() const; bool isVisible() const; diff --git a/src/common/QskBoxBorderMetrics.cpp b/src/common/QskBoxBorderMetrics.cpp index 5f4756cc..25de9fe6 100644 --- a/src/common/QskBoxBorderMetrics.cpp +++ b/src/common/QskBoxBorderMetrics.cpp @@ -92,9 +92,9 @@ QVariant QskBoxBorderMetrics::interpolate( return QVariant::fromValue( from.interpolated( to, progress ) ); } -uint QskBoxBorderMetrics::hash( uint seed ) const noexcept +QskHashValue QskBoxBorderMetrics::hash( QskHashValue seed ) const noexcept { - uint hash = qHashBits( &m_widths, sizeof( m_widths ), seed ); + auto hash = qHashBits( &m_widths, sizeof( m_widths ), seed ); const int mode = m_sizeMode; return qHashBits( &mode, sizeof( mode ), hash ); diff --git a/src/common/QskBoxBorderMetrics.h b/src/common/QskBoxBorderMetrics.h index 1849b789..10b7961c 100644 --- a/src/common/QskBoxBorderMetrics.h +++ b/src/common/QskBoxBorderMetrics.h @@ -55,7 +55,7 @@ class QSK_EXPORT QskBoxBorderMetrics QskBoxBorderMetrics toAbsolute( const QSizeF& ) const noexcept; - uint hash( uint seed = 0 ) const noexcept; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; static QVariant interpolate( const QskBoxBorderMetrics&, const QskBoxBorderMetrics&, qreal progress ); diff --git a/src/common/QskBoxHints.cpp b/src/common/QskBoxHints.cpp index a2f4db05..9f18e9f7 100644 --- a/src/common/QskBoxHints.cpp +++ b/src/common/QskBoxHints.cpp @@ -36,17 +36,17 @@ QskBoxHints QskBoxHints::interpolated( } #ifndef QT_NO_DEBUG_STREAM - + #include QDebug operator<<( QDebug debug, const QskBoxHints& hints ) -{ +{ debug << hints.shape << hints.borderMetrics << hints.borderColors << hints.gradient; return debug; } - + #endif #include "moc_QskBoxHints.cpp" diff --git a/src/common/QskBoxShapeMetrics.cpp b/src/common/QskBoxShapeMetrics.cpp index 4268b51b..09e9cc70 100644 --- a/src/common/QskBoxShapeMetrics.cpp +++ b/src/common/QskBoxShapeMetrics.cpp @@ -151,9 +151,9 @@ QVariant QskBoxShapeMetrics::interpolate( return QVariant::fromValue( from.interpolated( to, progress ) ); } -uint QskBoxShapeMetrics::hash( uint seed ) const noexcept +QskHashValue QskBoxShapeMetrics::hash( QskHashValue seed ) const noexcept { - uint hash = qHash( static_cast< int >( m_sizeMode ), seed ); + auto hash = qHash( static_cast< int >( m_sizeMode ), seed ); return qHashBits( m_radii, sizeof( m_radii ), hash ); } diff --git a/src/common/QskBoxShapeMetrics.h b/src/common/QskBoxShapeMetrics.h index 2019aaa8..637400fd 100644 --- a/src/common/QskBoxShapeMetrics.h +++ b/src/common/QskBoxShapeMetrics.h @@ -93,7 +93,7 @@ class QSK_EXPORT QskBoxShapeMetrics constexpr QskBoxShapeMetrics transposed() const noexcept; - uint hash( uint seed = 0 ) const noexcept; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; static QVariant interpolate( const QskBoxShapeMetrics&, const QskBoxShapeMetrics&, qreal progress ) noexcept; diff --git a/src/common/QskFunctions.cpp b/src/common/QskFunctions.cpp index aa5870bc..9a4a7bcb 100644 --- a/src/common/QskFunctions.cpp +++ b/src/common/QskFunctions.cpp @@ -122,7 +122,7 @@ QRectF qskValidOrEmptyInnerRect( const QRectF& rect, const QMarginsF& margins ) return QRectF( x, y, w, h ); } -QRectF qskInterpolatedRect( const QRectF &from, const QRectF &to, qreal progress ) +QRectF qskInterpolatedRect( const QRectF& from, const QRectF& to, qreal progress ) { if ( progress <= 0.0 ) return from; @@ -138,7 +138,7 @@ QRectF qskInterpolatedRect( const QRectF &from, const QRectF &to, qreal progress return QRectF( x, y, w, h ); } -QSizeF qskInterpolatedSize( const QSizeF &from, const QSizeF &to, qreal progress ) +QSizeF qskInterpolatedSize( const QSizeF& from, const QSizeF& to, qreal progress ) { if ( progress <= 0.0 ) return from; diff --git a/src/common/QskGlobal.h b/src/common/QskGlobal.h index a4451f77..35b5bd94 100644 --- a/src/common/QskGlobal.h +++ b/src/common/QskGlobal.h @@ -17,15 +17,15 @@ #ifdef QSK_DLL #if defined( QSK_MAKEDLL ) // create a DLL library -#define QSK_EXPORT Q_DECL_EXPORT + #define QSK_EXPORT Q_DECL_EXPORT #else // use a DLL library -#define QSK_EXPORT Q_DECL_IMPORT + #define QSK_EXPORT Q_DECL_IMPORT #endif #endif // QSK_DLL #ifndef QSK_EXPORT -#define QSK_EXPORT + #define QSK_EXPORT #endif #define QSK_QT_PRIVATE_BEGIN \ @@ -39,27 +39,26 @@ #define QSK_QT_PRIVATE_END \ QT_WARNING_POP -#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) +#if defined( QSK_BUILD ) -#define qskAsConst qAsConst + #if QT_VERSION < QT_VERSION_CHECK( 5, 7, 0 ) + template< typename T > + struct QskAddConst { typedef const T Type; }; + + template< typename T > + constexpr typename QskAddConst< T >::Type& qAsConst( T& t ) noexcept { return t; } + + template< typename T > + void qAsConst( const T&& ) = delete; + + #endif +#endif + +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + using QskHashValue = uint; #else - -template< typename T > -struct QskAddConst { typedef const T Type; }; - -template< typename T > -constexpr typename QskAddConst< T >::Type& qskAsConst( T& t ) noexcept { return t; } - -template< typename T > -void qskAsConst( const T&& ) = delete; - -#endif - -#ifdef Q_FALLTHROUGH -#define QSK_FALLTHROUGH Q_FALLTHROUGH -#else -#define QSK_FALLTHROUGH + using QskHashValue = size_t; #endif #endif diff --git a/src/common/QskGradient.cpp b/src/common/QskGradient.cpp index 7e1ec065..101d4d21 100644 --- a/src/common/QskGradient.cpp +++ b/src/common/QskGradient.cpp @@ -70,7 +70,7 @@ static inline bool qskIsVisible( const QskGradientStops& stops ) const auto& c = stop.color(); if ( c.isValid() && c.alpha() > 0 ) return true; - } + } return false; } @@ -179,6 +179,17 @@ static inline QskGradientStops qskExtractedStops( return extracted; } +static inline QskGradientStops qskGradientStops( const QGradientStops& qtStops ) +{ + QskGradientStops stops; + stops.reserve( qtStops.count() ); + + for ( const auto& s : qtStops ) + stops += QskGradientStop( s.first, s.second ); + + return stops; +} + QskGradient::QskGradient( Orientation orientation ) : m_orientation( orientation ) , m_isDirty( false ) @@ -218,6 +229,16 @@ QskGradient::QskGradient( Orientation orientation, const QskGradientStops& stops setStops( stops ); } +#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 ) + +QskGradient::QskGradient( Orientation orientation, QGradient::Preset preset ) + : QskGradient( orientation ) +{ + setStops( qskGradientStops( QGradient( preset ).stops() ) ); +} + +#endif + QskGradient::~QskGradient() { } @@ -301,8 +322,17 @@ void QskGradient::setStops( const QskGradientStops& stops ) m_isDirty = true; } -QskGradientStops QskGradient::stops() const +const QskGradientStops& QskGradient::stops() const { +#if 1 + /* + Returning a const& so that it is possible to write: + for ( const auto& stop : qAsConst( gradient.stops() ) ) + + Once we have changed QskGradientStop from QColor to QRgb + we should check if there is a better solution possible + */ +#endif return m_stops; } @@ -387,14 +417,14 @@ bool QskGradient::hasStopAt( qreal value ) const return false; } -uint QskGradient::hash( uint seed ) const +QskHashValue QskGradient::hash( QskHashValue seed ) const { if ( m_stops.isEmpty() ) return seed; const auto o = orientation(); - uint hash = qHashBits( &o, sizeof( o ), seed ); + auto hash = qHashBits( &o, sizeof( o ), seed ); for ( const auto& stop : m_stops ) hash = stop.hash( hash ); diff --git a/src/common/QskGradient.h b/src/common/QskGradient.h index 01b0bc4a..c69c59fe 100644 --- a/src/common/QskGradient.h +++ b/src/common/QskGradient.h @@ -9,7 +9,7 @@ #include "QskGlobal.h" #include "QskGradientStop.h" -#include +#include #include #include @@ -49,12 +49,18 @@ class QSK_EXPORT QskGradient QskGradient( QRgb ); QskGradient( const QColor& ); + QskGradient( Qt::Orientation, const QVector< QskGradientStop >& ); QskGradient( Qt::Orientation, const QColor&, const QColor& ); QskGradient( Orientation, const QVector< QskGradientStop >& ); QskGradient( Orientation, const QColor&, const QColor& ); +#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 ) + QskGradient( QGradient::Preset ); + QskGradient( Orientation, QGradient::Preset ); +#endif + ~QskGradient(); void setOrientation( Qt::Orientation ); @@ -74,7 +80,7 @@ class QSK_EXPORT QskGradient Q_INVOKABLE QColor endColor() const; Q_INVOKABLE void setStops( const QVector< QskGradientStop >& ); - Q_INVOKABLE QVector< QskGradientStop > stops() const; + Q_INVOKABLE const QVector< QskGradientStop >& stops() const; Q_INVOKABLE bool hasStopAt( qreal value ) const; @@ -94,7 +100,7 @@ class QSK_EXPORT QskGradient static QVariant interpolate( const QskGradient&, const QskGradient&, qreal progress ); - uint hash( uint seed ) const; + QskHashValue hash( QskHashValue seed ) const; Q_INVOKABLE qreal stopAt( int index ) const; Q_INVOKABLE QColor colorAt( int index ) const; @@ -133,6 +139,15 @@ inline QskGradient::QskGradient( QRgb rgb ) { } +#if QT_VERSION >= QT_VERSION_CHECK( 5, 12, 0 ) + +inline QskGradient::QskGradient( QGradient::Preset preset ) + : QskGradient( Vertical, preset ) +{ +} + +#endif + inline QskGradient::Orientation QskGradient::orientation() const { return static_cast< Orientation >( m_orientation ); diff --git a/src/common/QskGradientStop.cpp b/src/common/QskGradientStop.cpp index b4e8f341..530a2a1d 100644 --- a/src/common/QskGradientStop.cpp +++ b/src/common/QskGradientStop.cpp @@ -44,9 +44,9 @@ void QskGradientStop::setStop( qreal position, const QColor& color ) noexcept m_color = color; } -uint QskGradientStop::hash( uint seed ) const noexcept +QskHashValue QskGradientStop::hash( QskHashValue seed ) const noexcept { - uint hash = qHashBits( &m_position, sizeof( m_position ), seed ); + auto hash = qHashBits( &m_position, sizeof( m_position ), seed ); return qHashBits( &m_color, sizeof( m_color ), hash ); } diff --git a/src/common/QskGradientStop.h b/src/common/QskGradientStop.h index d3cf8931..c3ed9b2a 100644 --- a/src/common/QskGradientStop.h +++ b/src/common/QskGradientStop.h @@ -11,13 +11,6 @@ #include #include -#if QT_VERSION < QT_VERSION_CHECK( 5, 14, 0 ) -/* - since Qt >= 5.14 QColor has constexpr declarations and we could declare - several methods of QskGradientStop being constexpr as well. TODO ... - */ -#endif - class QSK_EXPORT QskGradientStop { Q_GADGET @@ -47,7 +40,7 @@ class QSK_EXPORT QskGradientStop static QColor interpolated( const QskGradientStop&, const QskGradientStop&, qreal position ) noexcept; - uint hash( uint seed ) const noexcept; + QskHashValue hash( QskHashValue seed ) const noexcept; private: qreal m_position; diff --git a/src/common/QskObjectCounter.cpp b/src/common/QskObjectCounter.cpp index 7cc95051..b6f8b585 100644 --- a/src/common/QskObjectCounter.cpp +++ b/src/common/QskObjectCounter.cpp @@ -70,7 +70,7 @@ namespace int maximum; }; - class CounterData final : public QObject + class CounterData { public: Counter counter[ 2 ]; @@ -162,7 +162,7 @@ void CounterHook::addObject( QObject* object ) { const bool isItem = qskIsItem( object ); - for ( auto counterData : qskAsConst( m_counterDataSet ) ) + for ( auto counterData : qAsConst( m_counterDataSet ) ) { counterData->counter[ QskObjectCounter::Objects ].increment(); @@ -182,7 +182,7 @@ void CounterHook::removeObject( QObject* object ) { const bool isItem = qskIsItem( object ); - for ( auto counterData : qskAsConst( m_counterDataSet ) ) + for ( auto counterData : qAsConst( m_counterDataSet ) ) { counterData->counter[ QskObjectCounter::Objects ].decrement(); diff --git a/src/common/QskObjectCounter.h b/src/common/QskObjectCounter.h index dafddb3e..5de71cc7 100644 --- a/src/common/QskObjectCounter.h +++ b/src/common/QskObjectCounter.h @@ -37,6 +37,8 @@ class QSK_EXPORT QskObjectCounter void dump() const; private: + Q_DISABLE_COPY( QskObjectCounter ) + class PrivateData; std::unique_ptr< PrivateData > m_data; diff --git a/src/common/QskScaleTickmarks.cpp b/src/common/QskScaleTickmarks.cpp index 201bfc67..836fc474 100644 --- a/src/common/QskScaleTickmarks.cpp +++ b/src/common/QskScaleTickmarks.cpp @@ -63,7 +63,7 @@ void QskScaleTickmarks::invert() std::reverse( m_ticks[ 2 ].begin(), m_ticks[ 2 ].end() ); } -uint QskScaleTickmarks::hash( uint seed ) const +QskHashValue QskScaleTickmarks::hash( QskHashValue seed ) const noexcept { seed = qHash( m_ticks[0], seed ); seed = qHash( m_ticks[1], seed ); diff --git a/src/common/QskScaleTickmarks.h b/src/common/QskScaleTickmarks.h index 07e7e26f..0eb859fe 100644 --- a/src/common/QskScaleTickmarks.h +++ b/src/common/QskScaleTickmarks.h @@ -53,7 +53,7 @@ class QSK_EXPORT QskScaleTickmarks void invert(); void reset(); - uint hash( uint seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; private: QVector< qreal > m_ticks[ 3 ]; diff --git a/src/common/QskShadowMetrics.cpp b/src/common/QskShadowMetrics.cpp index 66a25f3f..37b951b0 100644 --- a/src/common/QskShadowMetrics.cpp +++ b/src/common/QskShadowMetrics.cpp @@ -83,9 +83,9 @@ QRectF QskShadowMetrics::shadowRect( const QRectF& sourceRect ) const sourceRect.height() + 2 * extent ); } -uint QskShadowMetrics::hash( uint seed ) const noexcept +QskHashValue QskShadowMetrics::hash( QskHashValue seed ) const noexcept { - uint hash; + QskHashValue hash; hash = qHash( m_offset.x(), seed ); hash = qHash( m_offset.y(), seed ); diff --git a/src/common/QskShadowMetrics.h b/src/common/QskShadowMetrics.h index 6bcc4039..8dd4a5a2 100644 --- a/src/common/QskShadowMetrics.h +++ b/src/common/QskShadowMetrics.h @@ -56,7 +56,7 @@ class QSK_EXPORT QskShadowMetrics QRectF shadowRect( const QRectF& sourceRect ) const; - uint hash( uint seed = 0 ) const noexcept; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; static QVariant interpolate( const QskShadowMetrics&, const QskShadowMetrics&, qreal progress ); diff --git a/src/common/QskTextColors.cpp b/src/common/QskTextColors.cpp index 10378fa7..787aa258 100644 --- a/src/common/QskTextColors.cpp +++ b/src/common/QskTextColors.cpp @@ -9,7 +9,7 @@ #include #include -uint QskTextColors::hash( uint seed ) const +QskHashValue QskTextColors::hash( QskHashValue seed ) const noexcept { const QRgb rgb[] = { textColor.rgba(), styleColor.rgba(), linkColor.rgba() }; return qHashBits( rgb, sizeof( rgb ), seed ); diff --git a/src/common/QskTextColors.h b/src/common/QskTextColors.h index 291a5de8..45859135 100644 --- a/src/common/QskTextColors.h +++ b/src/common/QskTextColors.h @@ -25,7 +25,7 @@ class QSK_EXPORT QskTextColors static QVariant interpolate( const QskTextColors&, const QskTextColors&, qreal ratio ); - uint hash( uint seed = 0 ) const; + QskHashValue hash( QskHashValue seed = 0 ) const noexcept; QColor textColor; QColor styleColor; diff --git a/src/common/QskTextOptions.cpp b/src/common/QskTextOptions.cpp index 40ee67f9..c3a3c3c1 100644 --- a/src/common/QskTextOptions.cpp +++ b/src/common/QskTextOptions.cpp @@ -50,15 +50,13 @@ QskTextOptions::TextFormat QskTextOptions::effectiveFormat( const QString& text return m_format; } -uint qHash( const QskTextOptions& options, uint seed ) noexcept +QskHashValue QskTextOptions::hash( QskHashValue seed ) const noexcept { - uint hash; - - hash = qHash( options.maximumLineCount(), seed ); - hash = qHash( options.fontSizeMode(), hash ); - hash = qHash( options.wrapMode(), hash ); - hash = qHash( options.format(), hash ); - hash = qHash( options.elideMode(), hash ); + auto hash = qHash( m_maximumLineCount, seed ); + hash = qHash( m_fontSizeMode, hash ); + hash = qHash( m_wrapMode, hash ); + hash = qHash( m_format, hash ); + hash = qHash( m_elideMode, hash ); return hash; } diff --git a/src/common/QskTextOptions.h b/src/common/QskTextOptions.h index c585aa89..b10b20cb 100644 --- a/src/common/QskTextOptions.h +++ b/src/common/QskTextOptions.h @@ -74,6 +74,8 @@ class QSK_EXPORT QskTextOptions constexpr bool operator==( const QskTextOptions& other ) const noexcept; constexpr bool operator!=( const QskTextOptions& other ) const noexcept; + QskHashValue hash( QskHashValue seed ) const noexcept; + int textFlags() const noexcept; private: @@ -164,8 +166,6 @@ inline constexpr bool QskTextOptions::operator!=( return !( *this == other ); } -QSK_EXPORT uint qHash( const QskTextOptions&, uint seed = 0 ) noexcept; - #ifndef QT_NO_DEBUG_STREAM class QDebug; diff --git a/src/common/common.pro b/src/common/common.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/common/common.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/controls/QskBoundedInput.cpp b/src/controls/QskBoundedInput.cpp index 26aac2e6..4b6e647b 100644 --- a/src/controls/QskBoundedInput.cpp +++ b/src/controls/QskBoundedInput.cpp @@ -181,13 +181,15 @@ void QskBoundedInput::keyPressEvent( QKeyEvent* event ) { if ( !isReadOnly() ) { - if ( event->key() == Qt::Key_Up || event->matches( QKeySequence::MoveToNextChar ) ) + if ( event->key() == Qt::Key_Up || + qskIsStandardKeyInput( event, QKeySequence::MoveToNextChar ) ) { increment( m_stepSize ); return; } - if ( event->key() == Qt::Key_Down || event->matches( QKeySequence::MoveToPreviousChar ) ) + if ( event->key() == Qt::Key_Down || + qskIsStandardKeyInput( event, QKeySequence::MoveToPreviousChar ) ) { increment( -m_stepSize ); return; diff --git a/src/controls/QskEvent.cpp b/src/controls/QskEvent.cpp index 6a77d9b8..5656041d 100644 --- a/src/controls/QskEvent.cpp +++ b/src/controls/QskEvent.cpp @@ -92,7 +92,7 @@ qreal qskWheelSteps( const QWheelEvent* event ) const auto angleDelta = event->angleDelta(); const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); - return delta / QWheelEvent::DefaultDeltasPerStep; + return delta / QWheelEvent::DefaultDeltasPerStep; } qreal qskWheelIncrement( const QWheelEvent* event ) @@ -111,11 +111,26 @@ qreal qskWheelIncrement( const QWheelEvent* event ) #endif const qreal delta = angleDelta.y() ? angleDelta.y() : angleDelta.x(); - return delta / QWheelEvent::DefaultDeltasPerStep; + return delta / QWheelEvent::DefaultDeltasPerStep; } #endif +bool qskIsStandardKeyInput( const QKeyEvent* event, QKeySequence::StandardKey key ) +{ +#if 1 + return event->matches( key ); +#else + constexpr auto mask = ~( Qt::KeypadModifier | Qt::GroupSwitchModifier ); + + // We should route this call through the skin. TODO + const auto theme = QGuiApplicationPrivate::platformTheme(); + const auto bindings = theme->keyBindings( ( event->modifiers() | event->key() ) & mask ); + + return bindings.contains( QKeySequence(searchkey) ); +#endif +} + QskEvent::QskEvent( QskEvent::Type type ) : QEvent( static_cast< QEvent::Type >( type ) ) { diff --git a/src/controls/QskEvent.h b/src/controls/QskEvent.h index 51efd964..bd5b8e90 100644 --- a/src/controls/QskEvent.h +++ b/src/controls/QskEvent.h @@ -10,6 +10,7 @@ #include #include +#include #include class QskGesture; @@ -20,6 +21,7 @@ class QQuickItem; class QMouseEvent; class QWheelEvent; class QHoverEvent; +class QKeyEvent; class QSK_EXPORT QskEvent : public QEvent { @@ -148,4 +150,6 @@ QSK_EXPORT qreal qskWheelIncrement( const QWheelEvent* ); #endif +QSK_EXPORT bool qskIsStandardKeyInput( const QKeyEvent*, QKeySequence::StandardKey ); + #endif diff --git a/src/controls/QskFlickAnimator.h b/src/controls/QskFlickAnimator.h index 92dce7d3..e9168383 100644 --- a/src/controls/QskFlickAnimator.h +++ b/src/controls/QskFlickAnimator.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_FLICK_ANIMATOR_H -#define QSK_FLICK_ANIMATOR_H 1 +#define QSK_FLICK_ANIMATOR_H #include "QskAnimator.h" diff --git a/src/controls/QskFocusIndicator.cpp b/src/controls/QskFocusIndicator.cpp index 42a12bb8..5e4f18aa 100644 --- a/src/controls/QskFocusIndicator.cpp +++ b/src/controls/QskFocusIndicator.cpp @@ -49,7 +49,7 @@ class QskFocusIndicator::PrivateData public: void resetConnections() { - for ( const auto& connection : qskAsConst( connections ) ) + for ( const auto& connection : qAsConst( connections ) ) QObject::disconnect( connection ); connections.clear(); diff --git a/src/controls/QskGesture.h b/src/controls/QskGesture.h index 008bcd5c..a10f7b3c 100644 --- a/src/controls/QskGesture.h +++ b/src/controls/QskGesture.h @@ -52,6 +52,8 @@ class QSK_EXPORT QskGesture inline State state() const { return m_state; } protected: + Q_DISABLE_COPY( QskGesture ) + QskGesture( Type type ); const Type m_type; diff --git a/src/controls/QskGestureRecognizer.cpp b/src/controls/QskGestureRecognizer.cpp index cd15a1f5..a5c376b2 100644 --- a/src/controls/QskGestureRecognizer.cpp +++ b/src/controls/QskGestureRecognizer.cpp @@ -11,13 +11,15 @@ #include QSK_QT_PRIVATE_BEGIN + #include -QSK_QT_PRIVATE_END #if QT_VERSION >= QT_VERSION_CHECK( 6, 3, 0 ) #include #endif +QSK_QT_PRIVATE_END + static QMouseEvent* qskClonedMouseEventAt( const QMouseEvent* event, QPointF* localPos ) { @@ -130,7 +132,7 @@ namespace { Timer* timer = nullptr; - for ( auto t : qskAsConst( m_table ) ) + for ( auto t : qAsConst( m_table ) ) { if ( t->recognizer() == nullptr || t->recognizer() == recognizer ) @@ -151,7 +153,7 @@ namespace void stopTimer( const QskGestureRecognizer* recognizer ) { - for ( auto timer : qskAsConst( m_table ) ) + for ( auto timer : qAsConst( m_table ) ) { if ( timer->recognizer() == recognizer ) { diff --git a/src/controls/QskInputGrabber.h b/src/controls/QskInputGrabber.h index 6e1a77b7..b13bc5ec 100644 --- a/src/controls/QskInputGrabber.h +++ b/src/controls/QskInputGrabber.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_INPUT_GRABBER_H -#define QSK_INPUT_GRABBER_H 1 +#define QSK_INPUT_GRABBER_H #include "QskControl.h" diff --git a/src/controls/QskListView.cpp b/src/controls/QskListView.cpp index 550ed06c..c7281362 100644 --- a/src/controls/QskListView.cpp +++ b/src/controls/QskListView.cpp @@ -8,10 +8,8 @@ #include "QskColorFilter.h" #include "QskEvent.h" -#if QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) #include #include -#endif #include @@ -198,11 +196,13 @@ void QskListView::keyPressEvent( QKeyEvent* event ) case Qt::Key_PageDown: { // TODO ... - return Inherited::keyPressEvent( event ); + Inherited::keyPressEvent( event ); + return; } default: { - return Inherited::keyPressEvent( event ); + Inherited::keyPressEvent( event ); + return; } } diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index e6ae839d..118510fd 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -108,13 +108,19 @@ QPointF QskMenu::origin() const void QskMenu::addOption( const QUrl& graphicSource, const QString& text ) { +#if 0 + // does not work with Qt 5.6 version of QVector. TODO ... m_data->options += Option( graphicSource, text ); +#else + Q_UNUSED( graphicSource ) + Q_UNUSED( text ) +#endif resetImplicitSize(); update(); if ( isComponentComplete() ) - countChanged( count() ); + Q_EMIT countChanged( count() ); } void QskMenu::addOption( const QString& graphicSource, const QString& text ) @@ -278,14 +284,14 @@ void QskMenu::traverse( int steps ) if ( hasAnimationHint( Cursor | QskAspect::Position | QskAspect::Metric ) ) { - // when cycling we want slide in + // when cycling we want slide in if ( index < 0 ) setPositionHint( Cursor, count() ); if ( index >= count() ) setPositionHint( Cursor, -1 ); - + movePositionHint( Cursor, newIndex ); } @@ -308,7 +314,7 @@ void QskMenu::mousePressEvent( QMouseEvent* event ) return; } - return Inherited::mousePressEvent( event ); + Inherited::mousePressEvent( event ); } void QskMenu::mouseReleaseEvent( QMouseEvent* event ) @@ -327,7 +333,7 @@ void QskMenu::mouseReleaseEvent( QMouseEvent* event ) return; } - return Inherited::mouseReleaseEvent( event ); + Inherited::mouseReleaseEvent( event ); } void QskMenu::aboutToShow() diff --git a/src/controls/QskMenuSkinlet.cpp b/src/controls/QskMenuSkinlet.cpp index cd29b528..6438b2b3 100644 --- a/src/controls/QskMenuSkinlet.cpp +++ b/src/controls/QskMenuSkinlet.cpp @@ -52,7 +52,8 @@ class QskMenuSkinlet::PrivateData { m_data->enableCache( false ); } - private: + + private: PrivateData* m_data; }; @@ -168,7 +169,7 @@ class QskMenuSkinlet::PrivateData const auto sample = skinlet->sampleAt( menu, QskMenu::Text, i ); if ( sample.canConvert< QString >() ) { - const auto text = sample.value< QString >(); + const auto text = sample.toString(); if( !text.isEmpty() ) { const auto w = qskHorizontalAdvance( fm, text ); diff --git a/src/controls/QskObjectTree.cpp b/src/controls/QskObjectTree.cpp index 163a1c7d..9315d882 100644 --- a/src/controls/QskObjectTree.cpp +++ b/src/controls/QskObjectTree.cpp @@ -21,6 +21,8 @@ QObjectList QskObjectTree::childNodes( const QObject* object ) if ( object == nullptr ) { const auto windows = QGuiApplication::topLevelWindows(); + children.reserve( windows.count() ); + for ( auto window : windows ) children += window; } @@ -43,6 +45,7 @@ QObjectList QskObjectTree::childNodes( const QObject* object ) else if ( auto item = qobject_cast< const QQuickItem* >( object ) ) { const auto childItems = item->childItems(); + children.reserve( childItems.count() ); for ( auto child : childItems ) children += child; diff --git a/src/controls/QskObjectTree.h b/src/controls/QskObjectTree.h index f8c3e757..1b13f732 100644 --- a/src/controls/QskObjectTree.h +++ b/src/controls/QskObjectTree.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_OBJECT_TREE_H -#define QSK_OBJECT_TREE_H 1 +#define QSK_OBJECT_TREE_H #include "QskControl.h" #include "QskWindow.h" @@ -16,10 +16,14 @@ namespace QskObjectTree class Visitor { public: + Visitor() = default; virtual ~Visitor() = default; virtual bool visitDown( QObject* object ) = 0; virtual bool visitUp( const QObject* object ) = 0; + + private: + Q_DISABLE_COPY( Visitor ) }; QSK_EXPORT QObjectList childNodes( const QObject* ); diff --git a/src/controls/QskPageIndicator.cpp b/src/controls/QskPageIndicator.cpp index 3b9a8071..9316d9a2 100644 --- a/src/controls/QskPageIndicator.cpp +++ b/src/controls/QskPageIndicator.cpp @@ -15,10 +15,10 @@ QSK_SYSTEM_STATE( QskPageIndicator, Selected, QskAspect::FirstSystemState << 1 ) static int qskKeyIncrement( const QskPageIndicator* indicator, const QKeyEvent* event ) { - if ( event->matches( QKeySequence::MoveToNextChar ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::MoveToNextChar ) ) return 1; - if ( event->matches( QKeySequence::MoveToPreviousChar ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::MoveToPreviousChar ) ) return -1; const auto key = event->key(); @@ -29,10 +29,10 @@ static int qskKeyIncrement( if ( key == Qt::Key_Left ) return mirrored ? 1 : -1; - + if ( key == Qt::Key_Right ) return mirrored ? -1 : 1; - } + } else { if ( key == Qt::Key_Up ) @@ -40,10 +40,10 @@ static int qskKeyIncrement( if ( key == Qt::Key_Down ) return 1; - } - + } + return 0; -} +} class QskPageIndicator::PrivateData @@ -145,8 +145,8 @@ qreal QskPageIndicator::valueRatioAt( int index ) const const qreal diff = 1.0 - std::abs( pos - index ); return std::max( diff, 0.0 ); - } - + } + return 0.0; } @@ -184,7 +184,7 @@ void QskPageIndicator::mousePressEvent( QMouseEvent* event ) return; } - return Inherited::mousePressEvent( event ); + Inherited::mousePressEvent( event ); } void QskPageIndicator::mouseUngrabEvent() @@ -205,11 +205,11 @@ void QskPageIndicator::mouseReleaseEvent( QMouseEvent* event ) if ( indexAtPosition( pos ) == index ) Q_EMIT pageRequested( index ); } - + return; } - return Inherited::mouseReleaseEvent( event ); + Inherited::mouseReleaseEvent( event ); } void QskPageIndicator::keyPressEvent( QKeyEvent* event ) diff --git a/src/controls/QskPageIndicatorSkinlet.cpp b/src/controls/QskPageIndicatorSkinlet.cpp index adc4b715..6b57eda2 100644 --- a/src/controls/QskPageIndicatorSkinlet.cpp +++ b/src/controls/QskPageIndicatorSkinlet.cpp @@ -10,15 +10,6 @@ #include "QskSGNode.h" #include "QskFunctions.h" -static inline int qskCurrentIndex( const QskPageIndicator* indicator ) -{ - int index = qRound( indicator->currentIndex() ); - if ( index >= indicator->count() ) - index = 0; - - return index; -} - static QRectF qskBulletRect( const QskPageIndicator* indicator, const QRectF& rect, int index ) { @@ -44,7 +35,7 @@ static QRectF qskBulletRect( const QskPageIndicator* indicator, { const auto maxWidth = n * size.width() + ( n - 1 ) * spacing; const auto r = qskAlignedRectF( rect, maxWidth, size.height(), alignment ); - + x = r.x() + index * ( size.width() + spacing ); y = r.y(); } @@ -52,7 +43,7 @@ static QRectF qskBulletRect( const QskPageIndicator* indicator, { const auto maxHeight = n * size.height() + ( n - 1 ) * spacing; const auto r = qskAlignedRectF( rect, maxHeight, size.height(), alignment ); - + x = r.x(); y = r.y() + index * ( size.height() + spacing );; } diff --git a/src/controls/QskPopup.cpp b/src/controls/QskPopup.cpp index 0c06b00e..49533dbd 100644 --- a/src/controls/QskPopup.cpp +++ b/src/controls/QskPopup.cpp @@ -382,7 +382,7 @@ bool QskPopup::hasFaderEffect() const void QskPopup::setPopupFlags( PopupFlags flags ) { - if ( static_cast(flags) != m_data->flags ) + if ( static_cast< int >( flags ) != m_data->flags ) { m_data->flags = flags; updateInputGrabber(); @@ -654,7 +654,7 @@ int QskPopup::execPopup() if ( popup->isOpen() || popup->isFading() ) return; } - + QEventLoop::exit( 0 ); } }; @@ -679,10 +679,10 @@ int QskPopup::execPopup() } if ( auto mouseGrabber = window()->mouseGrabberItem() ) - { + { // when being called from QQuickWindow::mouseReleaseEvent // the mouse grabber has not yet been released. - + if( !qskIsAncestorOf( this, mouseGrabber ) ) qskUngrabMouse( mouseGrabber ); } diff --git a/src/controls/QskQuick.cpp b/src/controls/QskQuick.cpp index 8f6d4f22..f9f9f348 100644 --- a/src/controls/QskQuick.cpp +++ b/src/controls/QskQuick.cpp @@ -649,7 +649,7 @@ void qskItemUpdateRecursive( QQuickItem* item ) static const QQuickPointerTouchEvent* qskPointerPressEvent( const QQuickWindowPrivate* wd ) { - for ( const auto event : wd->pointerEventInstances ) + for ( const auto event : qAsConst( wd->pointerEventInstances ) ) { if ( auto touchEvent = event->asPointerTouchEvent() ) { diff --git a/src/controls/QskQuick.h b/src/controls/QskQuick.h index 1fa917e5..74d29b6b 100644 --- a/src/controls/QskQuick.h +++ b/src/controls/QskQuick.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_QUICK_H -#define QSK_QUICK_H 1 +#define QSK_QUICK_H #include "QskGlobal.h" #include diff --git a/src/controls/QskQuickItem.cpp b/src/controls/QskQuickItem.cpp index e8165233..f88e1452 100644 --- a/src/controls/QskQuickItem.cpp +++ b/src/controls/QskQuickItem.cpp @@ -15,16 +15,21 @@ #include #if defined( QT_DEBUG ) + QSK_QT_PRIVATE_BEGIN + #if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) #ifndef emit - // qvariantanimation_p.h needs it #define emit + #include + #undef emit #endif #endif #include + QSK_QT_PRIVATE_END + #endif #include @@ -65,6 +70,10 @@ namespace QObject::connect( qskSetup, &QskSetup::itemUpdateFlagsChanged, qskSetup, [ this ] { updateControlFlags(); } ); + /* + We would also need to send QEvent::StyleChange, when + a window has a new skin. TODO ... + */ QObject::connect( qskSetup, &QskSetup::skinChanged, qskSetup, [ this ] { updateSkin(); } ); } @@ -200,9 +209,9 @@ void QskQuickItem::classBegin() void QskQuickItem::componentComplete() { #if defined( QT_DEBUG ) - if ( qobject_cast< const QQuickBasePositioner* >( parent() ) ) + if ( d_func()->updateFlags & QskQuickItem::DeferredLayout ) { - if ( d_func()->updateFlags & QskQuickItem::DeferredLayout ) + if ( qobject_cast< const QQuickBasePositioner* >( parent() ) ) { qWarning( "QskQuickItem in DeferredLayout mode under control of a positioner" ); } diff --git a/src/controls/QskShortcutMap.cpp b/src/controls/QskShortcutMap.cpp index 27f5a07e..0cd743df 100644 --- a/src/controls/QskShortcutMap.cpp +++ b/src/controls/QskShortcutMap.cpp @@ -173,7 +173,7 @@ void QskShortcutHandler::remove( int id ) Finally let's check if we can disconnect from the destroyed signals */ - for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) + for ( const auto& entry : qAsConst( m_invokeDataMap ) ) { if ( item == nullptr && receiver == nullptr ) break; @@ -276,7 +276,7 @@ bool QskShortcutHandler::invoke( QQuickItem* item, const QKeySequence& sequence { bool found = false; - for ( const auto& entry : qskAsConst( m_invokeDataMap ) ) + for ( const auto& entry : qAsConst( m_invokeDataMap ) ) { auto& data = entry.second; diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 429ac4cf..05ba53ed 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -321,6 +321,20 @@ bool QskSkin::hasGraphicProvider() const return m_data->graphicProviders.size() > 0; } +QString QskSkin::dialogButtonText( int action ) const +{ + const auto theme = QGuiApplicationPrivate::platformTheme(); + + auto text = theme->standardButtonText( action ); +#if QT_VERSION < QT_VERSION_CHECK( 5, 7, 0 ) + text.remove( '&' ); +#else + text = QPlatformTheme::removeMnemonics( text ); +#endif + + return text; +} + const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const { // auto policy = QPlatformDialogHelper::UnknownLayout; diff --git a/src/controls/QskSkin.h b/src/controls/QskSkin.h index a86dcd0d..adeb2c54 100644 --- a/src/controls/QskSkin.h +++ b/src/controls/QskSkin.h @@ -75,6 +75,7 @@ class QSK_EXPORT QskSkin : public QObject bool hasGraphicProvider() const; virtual const int* dialogButtonLayout( Qt::Orientation ) const; + virtual QString dialogButtonText( int button ) const; void setStateMask( QskAspect::States ); QskAspect::States stateMask() const; diff --git a/src/controls/QskSkinHintTableEditor.cpp b/src/controls/QskSkinHintTableEditor.cpp index ea88434a..91fc8f78 100644 --- a/src/controls/QskSkinHintTableEditor.cpp +++ b/src/controls/QskSkinHintTableEditor.cpp @@ -244,10 +244,10 @@ void QskSkinHintTableEditor::setPosition( setMetricHint( aspectPosition( aspect ), position, combination ); } -void QskSkinHintTableEditor::removePosition( +bool QskSkinHintTableEditor::removePosition( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectPosition( aspect ), combination ); + return removeMetricHint( aspectPosition( aspect ), combination ); } qreal QskSkinHintTableEditor::position( QskAspect aspect ) const @@ -268,10 +268,10 @@ void QskSkinHintTableEditor::setStrutSize( QSizeF( width, height ), combination ); } -void QskSkinHintTableEditor::removeStrutSize( +bool QskSkinHintTableEditor::removeStrutSize( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectStrutSize( aspect ), combination ); + return removeMetricHint( aspectStrutSize( aspect ), combination ); } QSizeF QskSkinHintTableEditor::strutSize( QskAspect aspect ) const @@ -293,10 +293,10 @@ void QskSkinHintTableEditor::setMargin( QskAspect aspect, setMetricHint( aspectMargin( aspect ), margins, combination ); } -void QskSkinHintTableEditor::removeMargin( +bool QskSkinHintTableEditor::removeMargin( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectMargin( aspect ), combination ); + return removeMetricHint( aspectMargin( aspect ), combination ); } QskMargins QskSkinHintTableEditor::margin( QskAspect aspect ) const @@ -319,10 +319,10 @@ void QskSkinHintTableEditor::setPadding( QskAspect aspect, setMetricHint( aspectPadding( aspect ), padding, combination ); } -void QskSkinHintTableEditor::removePadding( +bool QskSkinHintTableEditor::removePadding( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectPadding( aspect ), combination ); + return removeMetricHint( aspectPadding( aspect ), combination ); } QskMargins QskSkinHintTableEditor::padding( QskAspect aspect ) const @@ -336,10 +336,10 @@ void QskSkinHintTableEditor::setSpacing( setMetricHint( aspectSpacing( aspect ), spacing, combination ); } -void QskSkinHintTableEditor::removeSpacing( +bool QskSkinHintTableEditor::removeSpacing( QskAspect aspect, QskStateCombination combination ) { - removeMetricHint( aspectSpacing( aspect ), combination ); + return removeMetricHint( aspectSpacing( aspect ), combination ); } qreal QskSkinHintTableEditor::spacing( QskAspect aspect ) const @@ -354,7 +354,7 @@ void QskSkinHintTableEditor::setAlignment( static_cast< int >( alignment ), combination ); } -void QskSkinHintTableEditor::removeAlignment( +bool QskSkinHintTableEditor::removeAlignment( QskAspect aspect, QskStateCombination combination ) { return removeFlagHint( aspectAlignment( aspect ), combination ); @@ -371,7 +371,7 @@ void QskSkinHintTableEditor::setFontRole( setFlagHint( aspectFontRole( aspect ), fontRole, combination ); } -void QskSkinHintTableEditor::removeFontRole( +bool QskSkinHintTableEditor::removeFontRole( QskAspect aspect, QskStateCombination combination ) { return removeFlagHint( aspectFontRole( aspect ), combination ); @@ -388,7 +388,7 @@ void QskSkinHintTableEditor::setGraphicRole( setFlagHint( aspectGraphicRole( aspect ), graphicRole, combination ); } -void QskSkinHintTableEditor::removeGraphicRole( +bool QskSkinHintTableEditor::removeGraphicRole( QskAspect aspect, QskStateCombination combination ) { return removeFlagHint( aspectGraphicRole( aspect ), combination ); @@ -421,7 +421,7 @@ void QskSkinHintTableEditor::setBoxShape( setMetricHint( aspectShape( aspect ), shape, combination ); } -void QskSkinHintTableEditor::removeBoxShape( +bool QskSkinHintTableEditor::removeBoxShape( QskAspect aspect, QskStateCombination combination ) { return removeMetricHint( aspectShape( aspect ), combination ); @@ -453,7 +453,7 @@ void QskSkinHintTableEditor::setBoxBorderMetrics( setMetricHint( aspectBorder( aspect ), borderMetrics, combination ); } -void QskSkinHintTableEditor::removeBoxBorderMetric( +bool QskSkinHintTableEditor::removeBoxBorderMetric( QskAspect aspect, QskStateCombination combination ) { return removeMetricHint( aspectBorder( aspect ), combination ); @@ -480,7 +480,7 @@ void QskSkinHintTableEditor::setBoxBorderColors(QskAspect aspect, combination ); } -void QskSkinHintTableEditor::removeBoxBorderColors( +bool QskSkinHintTableEditor::removeBoxBorderColors( QskAspect aspect, QskStateCombination combination ) { return removeColorHint( aspectBorder( aspect ), combination ); @@ -504,7 +504,7 @@ void QskSkinHintTableEditor::setArcMetrics( QskAspect aspect, setMetricHint( aspectShape( aspect ), arcMetrics, combination ); } -void QskSkinHintTableEditor::removeArcMetrics( QskAspect aspect, +bool QskSkinHintTableEditor::removeArcMetrics( QskAspect aspect, QskStateCombination combination ) { return removeMetricHint( aspectShape( aspect ), combination ); diff --git a/src/controls/QskSkinHintTableEditor.h b/src/controls/QskSkinHintTableEditor.h index a6845d35..ce1b25cc 100644 --- a/src/controls/QskSkinHintTableEditor.h +++ b/src/controls/QskSkinHintTableEditor.h @@ -63,7 +63,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > void setFlagHint( QskAspect, const T&, QskStateCombination = QskStateCombination() ); - void removeFlagHint( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeFlagHint( QskAspect, QskStateCombination = QskStateCombination() ); QVariant flagHint( QskAspect ) const; template< typename T > T flagHint( QskAspect ) const; @@ -76,7 +76,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > void setMetricHint( QskAspect, const T&, QskStateCombination = QskStateCombination() ); - void removeMetricHint( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeMetricHint( QskAspect, QskStateCombination = QskStateCombination() ); QVariant metricHint( QskAspect ) const; template< typename T > T metricHint( QskAspect ) const; @@ -89,7 +89,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > void setColorHint( QskAspect, const T&, QskStateCombination = QskStateCombination() ); - void removeColorHint( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeColorHint( QskAspect, QskStateCombination = QskStateCombination() ); QVariant colorHint( QskAspect ) const; template< typename T > T colorHint( QskAspect ) const; @@ -126,7 +126,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setPosition( QskAspect, qreal, QskStateCombination = QskStateCombination() ); - void removePosition( QskAspect, QskStateCombination = QskStateCombination() ); + bool removePosition( QskAspect, QskStateCombination = QskStateCombination() ); qreal position( QskAspect ) const; @@ -138,7 +138,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setStrutSize( QskAspect, qreal width, qreal height, QskStateCombination = QskStateCombination() ); - void removeStrutSize( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeStrutSize( QskAspect, QskStateCombination = QskStateCombination() ); QSizeF strutSize( QskAspect ) const; @@ -151,7 +151,7 @@ class QSK_EXPORT QskSkinHintTableEditor qreal left, qreal top, qreal right, qreal bottom, QskStateCombination = QskStateCombination() ); - void removeMargin( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeMargin( QskAspect, QskStateCombination = QskStateCombination() ); QskMargins margin( QskAspect ) const; @@ -164,32 +164,32 @@ class QSK_EXPORT QskSkinHintTableEditor qreal left, qreal top, qreal right, qreal bottom, QskStateCombination = QskStateCombination() ); - void removePadding( QskAspect, QskStateCombination = QskStateCombination() ); + bool removePadding( QskAspect, QskStateCombination = QskStateCombination() ); QskMargins padding( QskAspect ) const; // spacing void setSpacing( QskAspect, qreal, QskStateCombination = QskStateCombination() ); - void removeSpacing( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeSpacing( QskAspect, QskStateCombination = QskStateCombination() ); qreal spacing( QskAspect ) const; // alignment void setAlignment( QskAspect, Qt::Alignment, QskStateCombination = QskStateCombination() ); - void removeAlignment( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeAlignment( QskAspect, QskStateCombination = QskStateCombination() ); Qt::Alignment alignment( QskAspect ) const; // fontRole void setFontRole( QskAspect, int, QskStateCombination = QskStateCombination() ); - void removeFontRole( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeFontRole( QskAspect, QskStateCombination = QskStateCombination() ); int fontRole( QskAspect ) const; // graphicRole void setGraphicRole( QskAspect, int, QskStateCombination = QskStateCombination() ); - void removeGraphicRole( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeGraphicRole( QskAspect, QskStateCombination = QskStateCombination() ); int graphicRole( QskAspect ) const; // boxShape @@ -202,7 +202,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setBoxShape( QskAspect, const QskBoxShapeMetrics&, QskStateCombination = QskStateCombination() ); - void removeBoxShape( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeBoxShape( QskAspect, QskStateCombination = QskStateCombination() ); QskBoxShapeMetrics boxShape( QskAspect ) const; @@ -217,7 +217,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setBoxBorderMetrics( QskAspect, const QskBoxBorderMetrics&, QskStateCombination = QskStateCombination() ); - void removeBoxBorderMetric( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeBoxBorderMetric( QskAspect, QskStateCombination = QskStateCombination() ); QskBoxBorderMetrics boxBorderMetrics( QskAspect ) const; @@ -231,7 +231,7 @@ class QSK_EXPORT QskSkinHintTableEditor const QskGradient& right, const QskGradient& bottom, QskStateCombination = QskStateCombination() ); - void removeBoxBorderColors( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeBoxBorderColors( QskAspect, QskStateCombination = QskStateCombination() ); QskBoxBorderColors boxBorderColors( QskAspect ) const; // arcMetrics @@ -241,7 +241,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setArcMetrics( QskAspect, const QskArcMetrics&, QskStateCombination = QskStateCombination() ); - void removeArcMetrics( QskAspect, QskStateCombination = QskStateCombination() ); + bool removeArcMetrics( QskAspect, QskStateCombination = QskStateCombination() ); QskArcMetrics arcMetrics( QskAspect ) const; @@ -294,10 +294,10 @@ inline void QskSkinHintTableEditor::setFlagHint( setHint( aspect | QskAspect::Flag, hint, combination ); } -inline void QskSkinHintTableEditor::removeFlagHint( +inline bool QskSkinHintTableEditor::removeFlagHint( QskAspect aspect, QskStateCombination combination ) { - removeHint( aspect | QskAspect::Flag, combination ); + return removeHint( aspect | QskAspect::Flag, combination ); } inline QVariant QskSkinHintTableEditor::flagHint( QskAspect aspect ) const @@ -326,10 +326,10 @@ inline void QskSkinHintTableEditor::setMetricHint( setHint( aspect | QskAspect::Metric, hint, combination ); } -inline void QskSkinHintTableEditor::removeMetricHint( +inline bool QskSkinHintTableEditor::removeMetricHint( QskAspect aspect, QskStateCombination combination ) { - removeHint( aspect | QskAspect::Metric, combination ); + return removeHint( aspect | QskAspect::Metric, combination ); } inline QVariant QskSkinHintTableEditor::metricHint( QskAspect aspect ) const @@ -358,10 +358,10 @@ inline void QskSkinHintTableEditor::setColorHint( setHint( aspect | QskAspect::Color, hint, combination ); } -inline void QskSkinHintTableEditor::removeColorHint( +inline bool QskSkinHintTableEditor::removeColorHint( QskAspect aspect, QskStateCombination combination ) { - removeHint( aspect | QskAspect::Color, combination ); + return removeHint( aspect | QskAspect::Color, combination ); } inline QVariant QskSkinHintTableEditor::colorHint( QskAspect aspect ) const diff --git a/src/controls/QskSkinManager.cpp b/src/controls/QskSkinManager.cpp index 287a363e..a2bc7d29 100644 --- a/src/controls/QskSkinManager.cpp +++ b/src/controls/QskSkinManager.cpp @@ -292,7 +292,7 @@ namespace m_skinMap.clear(); // first we try all factories, that have been added manually - for ( auto it = m_factoryMap.begin(); it != m_factoryMap.end(); ++it ) + for ( auto it = m_factoryMap.constBegin(); it != m_factoryMap.constEnd(); ++it ) { const auto& data = it.value(); @@ -301,7 +301,7 @@ namespace } // all factories from plugins are following - for ( auto it = m_factoryMap.begin(); it != m_factoryMap.end(); ++it ) + for ( auto it = m_factoryMap.constBegin(); it != m_factoryMap.constEnd(); ++it ) { const auto& data = it.value(); if ( data.loader ) @@ -341,7 +341,7 @@ class QskSkinManager::PrivateData { if ( !pluginsRegistered ) { - for ( const auto& path : qskAsConst( pluginPaths ) ) + for ( const auto& path : qAsConst( pluginPaths ) ) registerPlugins( path + QStringLiteral( "/skins" ) ); pluginsRegistered = true; diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index 5e20ca9f..9b769199 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -1,7 +1,13 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + #include "QskSkinTransition.h" #include "QskColorFilter.h" #include "QskControl.h" #include "QskWindow.h" +#include "QskAnimationHint.h" #include "QskHintAnimator.h" #include "QskSkin.h" #include "QskSkinHintTable.h" @@ -39,7 +45,8 @@ namespace public: AnimatorCandidate() = default; - inline AnimatorCandidate( QskAspect aspect, QVariant from, QVariant to ) + inline AnimatorCandidate( QskAspect aspect, + const QVariant& from, const QVariant& to ) : aspect( aspect ) , from( from ) , to( to ) @@ -518,10 +525,17 @@ namespace Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator ) -QskSkinTransition::QskSkinTransition() - : m_mask( QskSkinTransition::AllTypes ) +class QskSkinTransition::PrivateData +{ + public: + QskSkin* skins[ 2 ] = {}; + QskAnimationHint animationHint; + Type mask = QskSkinTransition::AllTypes; +}; + +QskSkinTransition::QskSkinTransition() + : m_data( new PrivateData() ) { - m_skins[ 0 ] = m_skins[ 1 ] = nullptr; } QskSkinTransition::~QskSkinTransition() @@ -530,42 +544,42 @@ QskSkinTransition::~QskSkinTransition() void QskSkinTransition::setMask( Type type ) { - m_mask = type; + m_data->mask = type; } QskSkinTransition::Type QskSkinTransition::mask() const { - return m_mask; + return m_data->mask; } void QskSkinTransition::setSourceSkin( QskSkin* skin ) { - m_skins[ 0 ] = skin; + m_data->skins[ 0 ] = skin; } QskSkin* QskSkinTransition::sourceSkin() const { - return m_skins[ 0 ]; + return m_data->skins[ 0 ]; } void QskSkinTransition::setTargetSkin( QskSkin* skin ) { - m_skins[ 1 ] = skin; + m_data->skins[ 1 ] = skin; } QskSkin* QskSkinTransition::targetSkin() const { - return m_skins[ 1 ]; + return m_data->skins[ 1 ]; } void QskSkinTransition::setAnimation( QskAnimationHint animationHint ) { - m_animationHint = animationHint; + m_data->animationHint = animationHint; } QskAnimationHint QskSkinTransition::animation() const { - return m_animationHint; + return m_data->animationHint; } void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) @@ -575,7 +589,10 @@ void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) void QskSkinTransition::process() { - if ( ( m_skins[ 0 ] == nullptr ) || ( m_skins[ 1 ] == nullptr ) ) + auto skinFrom = m_data->skins[ 0 ]; + auto skinTo = m_data->skins[ 1 ]; + + if ( ( skinFrom == nullptr ) || ( skinTo == nullptr ) ) { // do nothing return; @@ -583,32 +600,32 @@ void QskSkinTransition::process() qskSkinAnimator->reset(); - if ( ( m_animationHint.duration <= 0 ) || ( m_mask == 0 ) ) + if ( ( m_data->animationHint.duration <= 0 ) || ( m_data->mask == 0 ) ) { // no animations, we can apply the changes - updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); + updateSkin( skinFrom, skinTo ); return; } QVector< AnimatorCandidate > candidates; - const auto oldFilters = m_skins[ 0 ]->graphicFilters(); + const auto oldFilters = skinFrom->graphicFilters(); { // copy out all hints before updating the skin // - would be good to have Copy on Write here - const auto oldTable = m_skins[ 0 ]->hintTable(); + const auto oldTable = skinFrom->hintTable(); // apply the changes - updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); + updateSkin( skinFrom, skinTo ); - candidates = qskAnimatorCandidates( m_mask, oldTable, oldFilters, - m_skins[ 1 ]->hintTable(), m_skins[ 1 ]->graphicFilters() ); + candidates = qskAnimatorCandidates( m_data->mask, oldTable, oldFilters, + skinTo->hintTable(), skinTo->graphicFilters() ); } if ( !candidates.isEmpty() ) { - bool doGraphicFilter = m_mask & QskSkinTransition::Color; + bool doGraphicFilter = m_data->mask & QskSkinTransition::Color; const auto windows = qGuiApp->topLevelWindows(); @@ -617,7 +634,7 @@ void QskSkinTransition::process() if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) ) { if ( !quickWindow->isVisible() || - ( qskEffectiveSkin( quickWindow ) != m_skins[ 1 ] ) ) + ( qskEffectiveSkin( quickWindow ) != skinTo ) ) { continue; } @@ -627,8 +644,8 @@ void QskSkinTransition::process() if ( doGraphicFilter ) { group->addGraphicFilterAnimators( - m_animationHint, oldFilters, - m_skins[ 1 ]->graphicFilters() ); + m_data->animationHint, oldFilters, + skinTo->graphicFilters() ); doGraphicFilter = false; } @@ -639,7 +656,7 @@ void QskSkinTransition::process() */ group->addAnimators( quickWindow->contentItem(), - m_animationHint, candidates, m_skins[ 1 ] ); + m_data->animationHint, candidates, skinTo ); qskSkinAnimator->add( group ); } diff --git a/src/controls/QskSkinTransition.h b/src/controls/QskSkinTransition.h index 540f4456..6fc13f1b 100644 --- a/src/controls/QskSkinTransition.h +++ b/src/controls/QskSkinTransition.h @@ -1,10 +1,11 @@ #ifndef QSK_SKIN_TRANSITION_H #define QSK_SKIN_TRANSITION_H -#include "QskAnimationHint.h" #include "QskAspect.h" +#include class QskSkin; +class QskAnimationHint; class QQuickWindow; class QVariant; @@ -44,9 +45,10 @@ class QSK_EXPORT QskSkinTransition virtual void updateSkin( QskSkin*, QskSkin* ); private: - QskSkin* m_skins[ 2 ]; - QskAnimationHint m_animationHint; - Type m_mask : 2; + Q_DISABLE_COPY( QskSkinTransition ) + + class PrivateData; + std::unique_ptr< PrivateData > m_data; }; #endif diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index 8dda9f18..9e2b7a35 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -263,7 +263,7 @@ void QskSkinlet::updateNode( QskSkinnable* skinnable, QSGNode* parentNode ) cons replaceChildNode( DebugRole, parentNode, oldNode, newNode ); } - for ( const auto nodeRole : m_data->nodeRoles ) + for ( const auto nodeRole : qAsConst( m_data->nodeRoles ) ) { Q_ASSERT( nodeRole < FirstReservedRole ); diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index bf97a6ff..534b00f0 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -167,6 +167,8 @@ class QSK_EXPORT QskSkinlet const QSizeF& hint, const QSizeF& constraint ) const; private: + Q_DISABLE_COPY( QskSkinlet ) + class PrivateData; std::unique_ptr< PrivateData > m_data; }; diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 9801f35d..74f5787b 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -220,8 +220,7 @@ static inline QskAspect qskSubstitutedAspect( if ( aspect.hasStates() ) { qWarning() << "QskSkinnable::(re)setSkinHint: setting hints with states " - "is discouraged - use QskSkinTableEditor if you are " - "sure, that you need this."; + "is discouraged - use QskSkinTableEditor if you are sure, that you need this."; qWarning() << "QskAspect:" << aspect.stateless() << skinnable->skinStatesAsPrintable( aspect.states() ); @@ -1167,14 +1166,14 @@ bool QskSkinnable::isTransitionAccepted( QskAspect aspect ) const } void QskSkinnable::startTransition( QskAspect aspect, - QskAnimationHint animationHint, QVariant from, QVariant to ) + QskAnimationHint animationHint, const QVariant& from, const QVariant& to ) { aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) ); startHintTransition( aspect, animationHint, from, to ); } void QskSkinnable::startHintTransition( QskAspect aspect, - QskAnimationHint animationHint, QVariant from, QVariant to ) + QskAnimationHint animationHint, const QVariant& from, const QVariant& to ) { if ( animationHint.duration <= 0 || ( from == to ) ) return; @@ -1189,15 +1188,18 @@ void QskSkinnable::startHintTransition( QskAspect aspect, to fallback to 0.0 ). In this case we create a default one. */ - if ( !from.isValid() ) + auto v1 = from; + auto v2 = to; + + if ( !v1.isValid() ) { - from = qskTypedNullValue( to ); + v1 = qskTypedNullValue( v2 ); } - else if ( !to.isValid() ) + else if ( !v2.isValid() ) { - to = qskTypedNullValue( from ); + v2 = qskTypedNullValue( v1 ); } - else if ( from.userType() != to.userType() ) + else if ( v1.userType() != v2.userType() ) { return; } @@ -1206,8 +1208,8 @@ void QskSkinnable::startHintTransition( QskAspect aspect, { const auto skin = effectiveSkin(); - from.setValue( skin->graphicFilter( from.toInt() ) ); - to.setValue( skin->graphicFilter( to.toInt() ) ); + v1.setValue( skin->graphicFilter( v1.toInt() ) ); + v2.setValue( skin->graphicFilter( v2.toInt() ) ); } aspect.clearStates(); @@ -1220,9 +1222,9 @@ void QskSkinnable::startHintTransition( QskAspect aspect, auto animator = m_data->animators.animator( aspect ); if ( animator && animator->isRunning() ) - from = animator->currentValue(); + v1 = animator->currentValue(); - m_data->animators.start( control, aspect, animationHint, from, to ); + m_data->animators.start( control, aspect, animationHint, v1, v2 ); } void QskSkinnable::setSkinStateFlag( QskAspect::State stateFlag, bool on ) diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index 21f71e7f..b73ea956 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -119,7 +119,7 @@ class QSK_EXPORT QskSkinnable QskSkin* effectiveSkin() const; void startTransition( QskAspect, - QskAnimationHint, QVariant from, QVariant to ); + QskAnimationHint, const QVariant& from, const QVariant& to ); QskAspect::Subcontrol effectiveSubcontrol( QskAspect::Subcontrol ) const; @@ -240,8 +240,10 @@ class QSK_EXPORT QskSkinnable const QskSkinHintTable& hintTable() const; private: + Q_DISABLE_COPY( QskSkinnable ) + void startHintTransition( QskAspect, - QskAnimationHint, QVariant from, QVariant to ); + QskAnimationHint, const QVariant& from, const QVariant& to ); QVariant animatedValue( QskAspect, QskSkinHintStatus* ) const; const QVariant& storedHint( QskAspect, QskSkinHintStatus* = nullptr ) const; diff --git a/src/controls/QskSubWindow.h b/src/controls/QskSubWindow.h index aa8d5243..d13d5765 100644 --- a/src/controls/QskSubWindow.h +++ b/src/controls/QskSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SUB_WINDOW_H -#define QSK_SUB_WINDOW_H 1 +#define QSK_SUB_WINDOW_H #include "QskPopup.h" diff --git a/src/controls/QskSubWindowArea.h b/src/controls/QskSubWindowArea.h index e381c501..3cbc30d3 100644 --- a/src/controls/QskSubWindowArea.h +++ b/src/controls/QskSubWindowArea.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SUB_WINDOW_AREA_H -#define QSK_SUB_WINDOW_AREA_H 1 +#define QSK_SUB_WINDOW_AREA_H #include "QskControl.h" diff --git a/src/controls/QskTabBar.cpp b/src/controls/QskTabBar.cpp index 677d3acf..faac29ca 100644 --- a/src/controls/QskTabBar.cpp +++ b/src/controls/QskTabBar.cpp @@ -219,7 +219,7 @@ namespace inline QskLinearBox* buttonBox() const { - return qobject_cast< QskLinearBox* >( childItems().first() ); + return qobject_cast< QskLinearBox* >( childItems().constFirst() ); } void enableAutoTranslation( bool on ) diff --git a/src/controls/QskTextInput.cpp b/src/controls/QskTextInput.cpp index 229d0def..ccaa6dd6 100644 --- a/src/controls/QskTextInput.cpp +++ b/src/controls/QskTextInput.cpp @@ -766,12 +766,12 @@ int QskTextInput::passwordMaskDelay() const void QskTextInput::setPasswordMaskDelay( int ms ) { - return m_data->textInput->setPasswordMaskDelay( ms ); + m_data->textInput->setPasswordMaskDelay( ms ); } void QskTextInput::resetPasswordMaskDelay() { - return m_data->textInput->resetPasswordMaskDelay(); + m_data->textInput->resetPasswordMaskDelay(); } QString QskTextInput::displayText() const @@ -781,7 +781,7 @@ QString QskTextInput::displayText() const QString QskTextInput::preeditText() const { - auto d = QQuickTextInputPrivate::get( m_data->textInput ); + const auto d = QQuickTextInputPrivate::get( m_data->textInput ); return d->m_textLayout.preeditAreaText(); } @@ -816,7 +816,7 @@ QVariant QskTextInput::inputMethodQuery( } QVariant QskTextInput::inputMethodQuery( - Qt::InputMethodQuery query, QVariant argument ) const + Qt::InputMethodQuery query, const QVariant& argument ) const { switch ( query ) { diff --git a/src/controls/QskTextInput.h b/src/controls/QskTextInput.h index a9493463..9c0ab542 100644 --- a/src/controls/QskTextInput.h +++ b/src/controls/QskTextInput.h @@ -146,7 +146,7 @@ class QSK_EXPORT QskTextInput : public QskControl bool fixup(); QVariant inputMethodQuery( Qt::InputMethodQuery ) const override; - QVariant inputMethodQuery( Qt::InputMethodQuery, QVariant argument ) const; + QVariant inputMethodQuery( Qt::InputMethodQuery, const QVariant& argument ) const; bool canUndo() const; bool canRedo() const; diff --git a/src/controls/QskVariantAnimator.cpp b/src/controls/QskVariantAnimator.cpp index 9492106d..6372fbf0 100644 --- a/src/controls/QskVariantAnimator.cpp +++ b/src/controls/QskVariantAnimator.cpp @@ -21,14 +21,17 @@ #include QSK_QT_PRIVATE_BEGIN + #if QT_VERSION >= QT_VERSION_CHECK( 6, 2, 0 ) #ifndef emit - // qvariantanimation_p.h needs it #define emit + #include + #undef emit #endif #endif #include + QSK_QT_PRIVATE_END #if 1 diff --git a/src/controls/QskWindow.cpp b/src/controls/QskWindow.cpp index 92b20f23..2f6bd307 100644 --- a/src/controls/QskWindow.cpp +++ b/src/controls/QskWindow.cpp @@ -119,7 +119,7 @@ static inline void qskSetVisualizationMode( #endif } -static inline QByteArray qskVisualizationMode( const QQuickWindow* window ) +static inline const QByteArray& qskVisualizationMode( const QQuickWindow* window ) { auto d = QQuickWindowPrivate::get( const_cast< QQuickWindow* >( window ) ); #if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) @@ -128,6 +128,7 @@ static inline QByteArray qskVisualizationMode( const QQuickWindow* window ) return d->customRenderMode; #endif } + class QskWindowPrivate : public QQuickWindowPrivate { Q_DECLARE_PUBLIC( QskWindow ) @@ -201,23 +202,6 @@ QskWindow::QskWindow( QQuickRenderControl* renderControl, QWindow* parent ) QskWindow::~QskWindow() { -#if QT_VERSION < QT_VERSION_CHECK( 5, 12, 0 ) - // When being used from Qml the item destruction would run in the most - // unefficient way, leading to lots of QQuickItem::ItemChildRemovedChange - // depending operations. - - QVector< QPointer< QQuickItem > > items; - - const auto children = contentItem()->childItems(); - for ( auto child : children ) - { - if ( child->parent() == contentItem() ) - items += child; - } - - for ( auto& item : qskAsConst( items ) ) - delete item; -#endif } #if QT_VERSION < QT_VERSION_CHECK( 5, 9, 0 ) @@ -236,7 +220,8 @@ void QskWindow::setScreen( const QString& name ) { if ( !name.isEmpty() ) { - for ( auto screen : QGuiApplication::screens() ) + const auto screens = QGuiApplication::screens(); + for ( auto screen : screens ) { if ( screen->name() == name ) { @@ -579,7 +564,7 @@ void QskWindow::setCustomRenderMode( const char* mode ) class RenderJob final : public QRunnable { public: - RenderJob( QQuickWindow* window, const QByteArray mode ) + RenderJob( QQuickWindow* window, const QByteArray& mode ) : m_window( window ) , m_mode( mode ) { diff --git a/src/controls/QskWindow.h b/src/controls/QskWindow.h index de5ef4a5..efea96e0 100644 --- a/src/controls/QskWindow.h +++ b/src/controls/QskWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_WINDOW_H -#define QSK_WINDOW_H 1 +#define QSK_WINDOW_H #include "QskGlobal.h" #include diff --git a/src/controls/controls.pro b/src/controls/controls.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/controls/controls.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/dialogs/QskDialog.cpp b/src/dialogs/QskDialog.cpp index e73da52d..f243c3fb 100644 --- a/src/dialogs/QskDialog.cpp +++ b/src/dialogs/QskDialog.cpp @@ -19,6 +19,8 @@ #include #include +#include + static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox ) { // not the fastest code ever, but usually we always @@ -45,7 +47,7 @@ static QskDialog::Action qskActionCandidate( const QskDialogButtonBox* buttonBox static QskDialog::DialogCode qskExec( QskDialogWindow* dialogWindow ) { #if 1 - QskFocusIndicator* focusIndicator = new QskFocusIndicator(); + auto focusIndicator = new QskFocusIndicator(); focusIndicator->setObjectName( QStringLiteral( "DialogFocusIndicator" ) ); dialogWindow->addItem( focusIndicator ); #endif @@ -58,7 +60,7 @@ static QQuickWindow* qskSomeQuickWindow() // not the best code ever, but as it is a fallback only // maybe we should also add the stacking order - QWindowList windows = QGuiApplication::topLevelWindows(); + const auto windows = QGuiApplication::topLevelWindows(); for ( auto window : windows ) { if ( window->isVisible() ) @@ -336,4 +338,12 @@ QString QskDialog::select( } +QskDialog::ActionRole QskDialog::actionRole( Action action ) +{ + using Q = QPlatformDialogHelper; + + const auto role = Q::buttonRole( static_cast< Q::StandardButton >( action ) ); + return static_cast< ActionRole >( role ); +} + #include "moc_QskDialog.cpp" diff --git a/src/dialogs/QskDialog.h b/src/dialogs/QskDialog.h index 8203ed82..25e13c6f 100644 --- a/src/dialogs/QskDialog.h +++ b/src/dialogs/QskDialog.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_DIALOG_H -#define QSK_DIALOG_H 1 +#define QSK_DIALOG_H #include "QskGlobal.h" @@ -139,6 +139,8 @@ class QSK_EXPORT QskDialog : public QObject const QString& title, const QString& text, const QStringList& entries, int selectedRow = 0 ) const; + static ActionRole actionRole( Action action ); + Q_SIGNALS: void transientParentChanged(); void policyChanged(); diff --git a/src/dialogs/QskDialogButton.cpp b/src/dialogs/QskDialogButton.cpp index 4c40e4d1..c0294aae 100644 --- a/src/dialogs/QskDialogButton.cpp +++ b/src/dialogs/QskDialogButton.cpp @@ -5,6 +5,7 @@ #include "QskDialogButton.h" #include "QskDialogButtonBox.h" +#include "QskSkin.h" QSK_SUBCONTROL( QskDialogButton, Panel ) QSK_SUBCONTROL( QskDialogButton, Text ) @@ -15,7 +16,7 @@ QskDialogButton::QskDialogButton( : QskPushButton( parent ) , m_action( action ) { - setText( QskDialogButtonBox::buttonText( m_action ) ); + resetButton(); } QskDialogButton::QskDialogButton( QQuickItem* parent ) @@ -47,7 +48,7 @@ void QskDialogButton::setAction( QskDialog::Action action ) if ( action != m_action ) { m_action = action; - setText( QskDialogButtonBox::buttonText( m_action ) ); + resetButton(); Q_EMIT actionChanged(); } @@ -60,10 +61,21 @@ QskDialog::Action QskDialogButton::action() const void QskDialogButton::changeEvent( QEvent* event ) { - if ( event->type() == QEvent::LocaleChange ) - setText( QskDialogButtonBox::buttonText( m_action ) ); + switch( static_cast< int >( event->type() ) ) + { + case QEvent::LocaleChange: + case QEvent::StyleChange: + resetButton(); + break; + } Inherited::changeEvent( event ); } +void QskDialogButton::resetButton() +{ + if ( const auto skin = effectiveSkin() ) + setText( skin->dialogButtonText( m_action ) ); +} + #include "moc_QskDialogButton.cpp" diff --git a/src/dialogs/QskDialogButton.h b/src/dialogs/QskDialogButton.h index a093a481..afb9e875 100644 --- a/src/dialogs/QskDialogButton.h +++ b/src/dialogs/QskDialogButton.h @@ -39,6 +39,8 @@ class QSK_EXPORT QskDialogButton : public QskPushButton QskAspect::Subcontrol ) const override; private: + void resetButton(); + QskDialog::Action m_action; }; diff --git a/src/dialogs/QskDialogButtonBox.cpp b/src/dialogs/QskDialogButtonBox.cpp index 440c1142..cf2c8cfe 100644 --- a/src/dialogs/QskDialogButtonBox.cpp +++ b/src/dialogs/QskDialogButtonBox.cpp @@ -15,11 +15,6 @@ #include #include -#include - -QSK_QT_PRIVATE_BEGIN -#include -QSK_QT_PRIVATE_END #include @@ -31,14 +26,6 @@ static void qskSendEventTo( QObject* object, QEvent::Type type ) QCoreApplication::sendEvent( object, &event ); } -static inline QskDialog::ActionRole qskActionRole( QskDialog::Action action ) -{ - const auto role = QPlatformDialogHelper::buttonRole( - static_cast< QPlatformDialogHelper::StandardButton >( action ) ); - - return static_cast< QskDialog::ActionRole >( role ); -} - namespace { class LayoutEngine : public QskLinearLayoutEngine @@ -131,7 +118,7 @@ QskDialogButtonBox::~QskDialogButtonBox() { for ( int i = 0; i < QskDialog::NActionRoles; i++ ) { - for ( auto button : qskAsConst( m_data->buttons[ i ] ) ) + for ( auto button : qAsConst( m_data->buttons[ i ] ) ) { /* The destructor of QQuickItem sets the parentItem of @@ -346,9 +333,8 @@ void QskDialogButtonBox::addButton( void QskDialogButtonBox::addAction( QskDialog::Action action ) { - QskPushButton* button = createButton( action ); - if ( button ) - addButton( button, qskActionRole( action ) ); + if ( auto button = createButton( action ) ) + addButton( button, QskDialog::actionRole( action ) ); } void QskDialogButtonBox::removeButton( QskPushButton* button ) @@ -579,32 +565,10 @@ void QskDialogButtonBox::itemChange( bool QskDialogButtonBox::isDefaultButtonKeyEvent( const QKeyEvent* event ) { - if ( event->modifiers() & Qt::KeypadModifier && event->key() == Qt::Key_Enter ) - { - return ( event->modifiers() & Qt::KeypadModifier ) - && ( event->key() == Qt::Key_Enter ); - } - else - { - return ( event->key() == Qt::Key_Enter ) || - ( event->key() == Qt::Key_Return ); - } -} + if ( !event->modifiers() ) + return ( event->key() == Qt::Key_Enter ) || ( event->key() == Qt::Key_Return ); -QString QskDialogButtonBox::buttonText( QskDialog::Action action ) -{ - // should be redirected through the skin ! - - const QPlatformTheme* theme = QGuiApplicationPrivate::platformTheme(); - QString text = theme->standardButtonText( action ); - -#if QT_VERSION < QT_VERSION_CHECK( 5, 7, 0 ) - text.remove( '&' ); -#else - text = QPlatformTheme::removeMnemonics( text ); -#endif - - return text; + return ( event->modifiers() & Qt::KeypadModifier ) && ( event->key() == Qt::Key_Enter ); } #include "moc_QskDialogButtonBox.cpp" diff --git a/src/dialogs/QskDialogButtonBox.h b/src/dialogs/QskDialogButtonBox.h index bf872d23..3523bfef 100644 --- a/src/dialogs/QskDialogButtonBox.h +++ b/src/dialogs/QskDialogButtonBox.h @@ -61,7 +61,6 @@ class QSK_EXPORT QskDialogButtonBox : public QskBox QskPushButton* defaultButton() const; static bool isDefaultButtonKeyEvent( const QKeyEvent* ); - static QString buttonText( QskDialog::Action ); Q_SIGNALS: void clicked( QskPushButton* button ); diff --git a/src/dialogs/QskDialogSubWindow.cpp b/src/dialogs/QskDialogSubWindow.cpp index 3113c226..20c690e5 100644 --- a/src/dialogs/QskDialogSubWindow.cpp +++ b/src/dialogs/QskDialogSubWindow.cpp @@ -7,6 +7,7 @@ #include "QskDialogButtonBox.h" #include "QskPushButton.h" #include "QskQuick.h" +#include "QskEvent.h" #include #include @@ -280,7 +281,7 @@ void QskDialogSubWindow::keyPressEvent( QKeyEvent* event ) button->click(); } - if ( event->matches( QKeySequence::Cancel ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::Cancel ) ) { // using shortcuts instead ??? diff --git a/src/dialogs/QskDialogSubWindow.h b/src/dialogs/QskDialogSubWindow.h index 8d66471d..278ca5d7 100644 --- a/src/dialogs/QskDialogSubWindow.h +++ b/src/dialogs/QskDialogSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_DIALOG_SUB_WINDOW_H -#define QSK_DIALOG_SUB_WINDOW_H 1 +#define QSK_DIALOG_SUB_WINDOW_H #include "QskDialog.h" #include "QskSubWindow.h" diff --git a/src/dialogs/QskDialogWindow.cpp b/src/dialogs/QskDialogWindow.cpp index 6eb40646..29a5e714 100644 --- a/src/dialogs/QskDialogWindow.cpp +++ b/src/dialogs/QskDialogWindow.cpp @@ -8,6 +8,7 @@ #include "QskLinearBox.h" #include "QskPushButton.h" #include "QskQuick.h" +#include "QskEvent.h" #include #include @@ -248,7 +249,7 @@ void QskDialogWindow::keyPressEvent( QKeyEvent* event ) button->click(); } - if ( event->matches( QKeySequence::Cancel ) ) + if ( qskIsStandardKeyInput( event, QKeySequence::Cancel ) ) { // using shortcuts instead ??? diff --git a/src/dialogs/QskDialogWindow.h b/src/dialogs/QskDialogWindow.h index ad9d15ae..3131be5b 100644 --- a/src/dialogs/QskDialogWindow.h +++ b/src/dialogs/QskDialogWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_DIALOG_WINDOW_H -#define QSK_DIALOG_WINDOW_H 1 +#define QSK_DIALOG_WINDOW_H #include "QskDialog.h" #include "QskWindow.h" diff --git a/src/dialogs/QskMessageSubWindow.h b/src/dialogs/QskMessageSubWindow.h index 1d98232d..7a34cb18 100644 --- a/src/dialogs/QskMessageSubWindow.h +++ b/src/dialogs/QskMessageSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_MESSAGE_SUB_WINDOW_H -#define QSK_MESSAGE_SUB_WINDOW_H 1 +#define QSK_MESSAGE_SUB_WINDOW_H #include "QskDialogSubWindow.h" diff --git a/src/dialogs/QskMessageWindow.h b/src/dialogs/QskMessageWindow.h index 7fb40058..6fa68b1c 100644 --- a/src/dialogs/QskMessageWindow.h +++ b/src/dialogs/QskMessageWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_MESSAGE_WINDOW_H -#define QSK_MESSAGE_WINDOW_H 1 +#define QSK_MESSAGE_WINDOW_H #include "QskDialogWindow.h" diff --git a/src/dialogs/QskSelectionSubWindow.h b/src/dialogs/QskSelectionSubWindow.h index 5259c7df..7ab602de 100644 --- a/src/dialogs/QskSelectionSubWindow.h +++ b/src/dialogs/QskSelectionSubWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SELECTION_SUB_WINDOW_H -#define QSK_SELECTION_SUB_WINDOW_H 1 +#define QSK_SELECTION_SUB_WINDOW_H #include "QskDialogSubWindow.h" diff --git a/src/dialogs/QskSelectionWindow.h b/src/dialogs/QskSelectionWindow.h index dc13a322..0b279e87 100644 --- a/src/dialogs/QskSelectionWindow.h +++ b/src/dialogs/QskSelectionWindow.h @@ -4,7 +4,7 @@ *****************************************************************************/ #ifndef QSK_SELECTION_WINDOW_H -#define QSK_SELECTION_WINDOW_H 1 +#define QSK_SELECTION_WINDOW_H #include "QskDialogWindow.h" diff --git a/src/dialogs/dialogs.pro b/src/dialogs/dialogs.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/dialogs/dialogs.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/graphic/QskGraphic.cpp b/src/graphic/QskGraphic.cpp index 2705baf7..8355107b 100644 --- a/src/graphic/QskGraphic.cpp +++ b/src/graphic/QskGraphic.cpp @@ -565,7 +565,7 @@ QRectF QskGraphic::scaledBoundingRect( qreal sx, qreal sy ) const QRectF rect = transform.mapRect( m_data->pointRect ); - for ( const auto& info : qskAsConst( m_data->pathInfos ) ) + for ( const auto& info : qAsConst( m_data->pathInfos ) ) rect |= info.scaledBoundingRect( sx, sy, scalePens ); return rect; @@ -678,7 +678,7 @@ void QskGraphic::render( QPainter* painter, const QRectF& rect, const bool scalePens = !( m_data->renderHints & RenderPensUnscaled ); - for ( const auto& info : qskAsConst( m_data->pathInfos ) ) + for ( const auto& info : qAsConst( m_data->pathInfos ) ) { const qreal ssx = info.scaleFactorX( m_data->pointRect, rect, scalePens ); @@ -1007,7 +1007,7 @@ quint64 QskGraphic::modificationId() const return m_data->modificationId; } -uint QskGraphic::hash( uint seed ) const +QskHashValue QskGraphic::hash( QskHashValue seed ) const { auto hash = qHash( m_data->renderHints, seed ); @@ -1203,3 +1203,5 @@ QDebug operator<<( QDebug debug, const QskGraphic& graphic ) } #endif + +#include "moc_QskGraphic.cpp" diff --git a/src/graphic/QskGraphic.h b/src/graphic/QskGraphic.h index f7e5f6ef..ff27938f 100644 --- a/src/graphic/QskGraphic.h +++ b/src/graphic/QskGraphic.h @@ -26,6 +26,14 @@ class QDebug; class QSK_EXPORT QskGraphic : public QPaintDevice { + Q_GADGET + + Q_PROPERTY( qreal aspectRatio READ aspectRatio ) + Q_PROPERTY( QRectF boundingRect READ boundingRect ) + Q_PROPERTY( QRectF controlPointRect READ controlPointRect ) + Q_PROPERTY( QSizeF defaultSize READ defaultSize ) + Q_PROPERTY( quint64 modificationId READ modificationId ) + public: enum RenderHint { @@ -119,11 +127,9 @@ class QSK_EXPORT QskGraphic : public QPaintDevice static QskGraphic fromPixmapAsImage( const QPixmap& ); quint64 modificationId() const; - uint hash( uint seed ) const; + QskHashValue hash( QskHashValue seed ) const; protected: - friend class QskGraphicPaintEngine; - virtual QSize sizeMetrics() const; virtual void drawPath( const QPainterPath& ); @@ -142,6 +148,8 @@ class QSK_EXPORT QskGraphic : public QPaintDevice class PrivateData; QSharedDataPointer< PrivateData > m_data; + + friend class QskGraphicPaintEngine; mutable QskGraphicPaintEngine* m_paintEngine; }; diff --git a/src/graphic/QskGraphicImageProvider.h b/src/graphic/QskGraphicImageProvider.h index cc7ed2e0..ce1657da 100644 --- a/src/graphic/QskGraphicImageProvider.h +++ b/src/graphic/QskGraphicImageProvider.h @@ -32,6 +32,8 @@ class QSK_EXPORT QskGraphicImageProvider : public QQuickImageProvider const QskGraphic* requestGraphic( const QString& id ) const; private: + Q_DISABLE_COPY( QskGraphicImageProvider ) + const QString m_providerId; }; diff --git a/src/graphic/QskGraphicProviderMap.cpp b/src/graphic/QskGraphicProviderMap.cpp index 25b76ba9..1dd7d560 100644 --- a/src/graphic/QskGraphicProviderMap.cpp +++ b/src/graphic/QskGraphicProviderMap.cpp @@ -28,7 +28,8 @@ QskGraphicProviderMap::QskGraphicProviderMap() QskGraphicProviderMap::~QskGraphicProviderMap() { - for ( auto it = m_data->hashTab.begin(); it != m_data->hashTab.end(); ++it ) + const auto& hashTab = m_data->hashTab; + for ( auto it = hashTab.constBegin(); it != hashTab.constEnd(); ++it ) delete it.value(); } diff --git a/src/graphic/QskGraphicProviderMap.h b/src/graphic/QskGraphicProviderMap.h index 6d9ec38f..119dab2c 100644 --- a/src/graphic/QskGraphicProviderMap.h +++ b/src/graphic/QskGraphicProviderMap.h @@ -30,6 +30,8 @@ class QSK_EXPORT QskGraphicProviderMap int size() const; private: + Q_DISABLE_COPY( QskGraphicProviderMap ) + class PrivateData; std::unique_ptr< PrivateData > m_data; }; diff --git a/src/graphic/QskGraphicTextureFactory.h b/src/graphic/QskGraphicTextureFactory.h index 61be41ef..0a250bfd 100644 --- a/src/graphic/QskGraphicTextureFactory.h +++ b/src/graphic/QskGraphicTextureFactory.h @@ -35,6 +35,8 @@ class QSK_EXPORT QskGraphicTextureFactory : public QQuickTextureFactory QImage image() const override; private: + Q_DISABLE_COPY( QskGraphicTextureFactory ) + QskGraphic m_graphic; QskColorFilter m_colorFilter; QSize m_size; diff --git a/src/graphic/graphic.pro b/src/graphic/graphic.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/graphic/graphic.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/inputpanel/QskHunspellTextPredictor.cpp b/src/inputpanel/QskHunspellTextPredictor.cpp index 5e7e920b..77099176 100644 --- a/src/inputpanel/QskHunspellTextPredictor.cpp +++ b/src/inputpanel/QskHunspellTextPredictor.cpp @@ -1,15 +1,91 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + #include "QskHunspellTextPredictor.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include +#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) + +#include + +namespace +{ + class StringConverter + { + public: + StringConverter( const QByteArray& encoding ) + : m_codec( QTextCodec::codecForName( encoding ) ) + { + } + + inline QString fromHunspell( const char* text ) const + { + if ( m_codec ) + return m_codec->toUnicode( text ); + + return QString::fromUtf8( text ); + } + + inline QByteArray toHunspell( const QString& text ) const + { + if ( m_codec ) + return m_codec->fromUnicode( text ); + + return text.toUtf8(); + } + private: + QTextCodec* m_codec; + }; +} + +#else + +#include + +namespace +{ + class StringConverter + { + public: + StringConverter( const QByteArray& encoding ) + : m_decoder( encoding ) + , m_encoder( encoding ) + { + } + + inline QString fromHunspell( const char* text ) const + { + if ( m_decoder.isValid() ) + return m_decoder.decode( text ); + + return QString::fromUtf8( text ); + } + + inline QByteArray toHunspell( const QString& text ) const + { + if ( m_encoder.isValid() ) + return m_encoder.encode( text ); + + return text.toUtf8(); + } + + private: + mutable QStringDecoder m_decoder; + mutable QStringEncoder m_encoder; + }; +} + +#endif + class QskHunspellTextPredictor::PrivateData { public: @@ -19,7 +95,8 @@ class QskHunspellTextPredictor::PrivateData QLocale locale; }; -QskHunspellTextPredictor::QskHunspellTextPredictor( const QLocale &locale, QObject* object ) +QskHunspellTextPredictor::QskHunspellTextPredictor( + const QLocale& locale, QObject* object ) : Inherited( object ) , m_data( new PrivateData() ) { @@ -43,7 +120,8 @@ void QskHunspellTextPredictor::reset() } } -QPair< QString, QString > QskHunspellTextPredictor::affAndDicFile( const QString& path, const QLocale& locale ) +QPair< QString, QString > QskHunspellTextPredictor::affAndDicFile( + const QString& path, const QLocale& locale ) { QString prefix = QStringLiteral( "%1/%2" ).arg( path, locale.name() ); QString affFile = prefix + QStringLiteral( ".aff" ); @@ -61,19 +139,21 @@ QPair< QString, QString > QskHunspellTextPredictor::affAndDicFile( const QString void QskHunspellTextPredictor::loadDictionaries() { - QString userPaths = QString::fromUtf8( qgetenv( "QSK_HUNSPELL_PATH" ) ); - -#if defined(Q_OS_WIN32) - QChar separator( ';' ); - QStringList defaultPaths; + const auto splitBehavior = +#if QT_VERSION >= QT_VERSION_CHECK( 5, 14, 0 ) + Qt::SkipEmptyParts; #else - QChar separator( ':' ); - QStringList defaultPaths = { QStringLiteral( "/usr/share/hunspell" ), - QStringLiteral( "/usr/share/myspell/dicts" ) }; + QString::SkipEmptyParts; #endif - QStringList paths = userPaths.split( separator, QString::SkipEmptyParts ); - paths.append( defaultPaths ); + const auto userPaths = QString::fromUtf8( qgetenv( "QSK_HUNSPELL_PATH" ) ); + + auto paths = userPaths.split( QDir::listSeparator(), splitBehavior ); + +#if !defined( Q_OS_WIN32 ) + paths += QStringLiteral( "/usr/share/hunspell" ); + paths += QStringLiteral( "/usr/share/myspell/dicts" ); +#endif for( const auto& path : paths ) { @@ -104,21 +184,19 @@ void QskHunspellTextPredictor::request( const QString& text ) return; } + StringConverter converter( m_data->hunspellEncoding ); + char** suggestions; - QTextCodec *codec = QTextCodec::codecForName( m_data->hunspellEncoding ); - const QByteArray word = codec ? codec->fromUnicode( text ) : text.toUtf8(); - - const int count = Hunspell_suggest( - m_data->hunspellHandle, &suggestions, word.constData() ); + const int count = Hunspell_suggest( m_data->hunspellHandle, + &suggestions, converter.toHunspell( text ).constData() ); QStringList candidates; candidates.reserve( count ); for ( int i = 0; i < count; i++ ) { - const QString suggestion = codec ? codec->toUnicode( suggestions[ i ] ) - : QString::fromUtf8( suggestions [ i ] ); + const auto suggestion = converter.fromHunspell( suggestions[ i ] ); if ( suggestion.startsWith( text ) ) candidates.prepend( suggestion ); @@ -131,3 +209,5 @@ void QskHunspellTextPredictor::request( const QString& text ) m_data->candidates = candidates; Q_EMIT predictionChanged( text, m_data->candidates ); } + +#include "moc_QskHunspellTextPredictor.cpp" diff --git a/src/inputpanel/QskHunspellTextPredictor.h b/src/inputpanel/QskHunspellTextPredictor.h index 610f83e7..e2dab1d9 100644 --- a/src/inputpanel/QskHunspellTextPredictor.h +++ b/src/inputpanel/QskHunspellTextPredictor.h @@ -8,8 +8,7 @@ #include "QskTextPredictor.h" -#include - +#include #include class QSK_EXPORT QskHunspellTextPredictor : public QskTextPredictor diff --git a/src/inputpanel/QskInputContext.cpp b/src/inputpanel/QskInputContext.cpp index 2087eb28..4d59d36e 100644 --- a/src/inputpanel/QskInputContext.cpp +++ b/src/inputpanel/QskInputContext.cpp @@ -292,7 +292,7 @@ class QskInputContext::PrivateData QskInputContext::QskInputContext() : m_data( new PrivateData() ) { - setObjectName( "InputContext" ); + setObjectName( QStringLiteral( "InputContext" ) ); } QskInputContext::~QskInputContext() @@ -318,7 +318,7 @@ QskInputContextFactory* QskInputContext::factory() const return m_data->factory; } -std::shared_ptr QskInputContext::textPredictor( const QLocale& locale ) +std::shared_ptr< QskTextPredictor > QskInputContext::textPredictor( const QLocale& locale ) { if ( m_data->factory ) return m_data->factory->setupPredictor( locale ); @@ -550,12 +550,12 @@ std::shared_ptr< QskTextPredictor > QskInputContextFactory::setupPredictor( cons QskTextPredictor* QskInputContextFactory::createPredictor( const QLocale& locale ) { #if HUNSPELL - return new QskHunspellTextPredictor( locale ); + return new QskHunspellTextPredictor( locale ); #else Q_UNUSED( locale ); #endif - return nullptr; + return nullptr; } QskInputPanel* QskInputContextFactory::createPanel() const diff --git a/src/inputpanel/QskInputPanel.cpp b/src/inputpanel/QskInputPanel.cpp index c2eb0974..2b2fa71d 100644 --- a/src/inputpanel/QskInputPanel.cpp +++ b/src/inputpanel/QskInputPanel.cpp @@ -106,193 +106,195 @@ static inline void qskSendKey( QQuickItem* receiver, int key ) QCoreApplication::sendEvent( receiver, &keyRelease ); } -class KeyProcessor : public QObject +namespace { - Q_OBJECT - - public: - QString preedit() const + class KeyProcessor : public QObject { - return m_preedit; - } + Q_OBJECT - void processKey( - int key, Qt::InputMethodHints inputHints, QskInputPanel* panel, - QskTextPredictor* predictor, int spaceLeft ) - { - // reset: - m_currentResult.isFinal = true; - m_currentResult.text.clear(); - m_currentResult.key = 0; - - m_predictor = predictor; - m_spaceLeft = spaceLeft; - - // First we have to handle the control keys - - switch ( key ) + public: + QString preedit() const { - case Qt::Key_Backspace: - case Qt::Key_Muhenkan: + return m_preedit; + } + + void processKey( + int key, Qt::InputMethodHints inputHints, QskInputPanel* panel, + QskTextPredictor* predictor, int spaceLeft ) + { + // reset: + m_currentResult.isFinal = true; + m_currentResult.text.clear(); + m_currentResult.key = 0; + + m_predictor = predictor; + m_spaceLeft = spaceLeft; + + // First we have to handle the control keys + + switch ( key ) { - if ( predictor && !m_preedit.isEmpty() ) + case Qt::Key_Backspace: + case Qt::Key_Muhenkan: { - m_preedit.chop( 1 ); - - m_currentResult.text = m_preedit; - m_currentResult.isFinal = false; - - Q_EMIT panel->predictionRequested( m_preedit ); - // Let the input field update right away, otherwise - // we'll get weird effects with fast backspace presses: - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - else - { - m_currentResult.key = Qt::Key_Backspace; - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - - break; - } - case Qt::Key_Return: - { - if ( predictor ) - { - if ( !m_preedit.isEmpty() ) + if ( predictor && !m_preedit.isEmpty() ) { - if ( spaceLeft ) - { - m_currentResult.text = m_preedit.left( spaceLeft ); - m_currentResult.isFinal = true; - } - - reset(); - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - } - - if ( !( inputHints & Qt::ImhMultiLine ) ) - { - m_currentResult.key = Qt::Key_Return; - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - - break; - } - case Qt::Key_Space: - { - if ( predictor ) - { - if ( !m_preedit.isEmpty() && spaceLeft ) - { - m_preedit += keyString( key ); - m_preedit = m_preedit.left( spaceLeft ); + m_preedit.chop( 1 ); m_currentResult.text = m_preedit; - m_currentResult.isFinal = true; - - reset(); + m_currentResult.isFinal = false; + Q_EMIT panel->predictionRequested( m_preedit ); + // Let the input field update right away, otherwise + // we'll get weird effects with fast backspace presses: Q_EMIT keyProcessingFinished( m_currentResult ); return; } + else + { + m_currentResult.key = Qt::Key_Backspace; + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + + break; } + case Qt::Key_Return: + { + if ( predictor ) + { + if ( !m_preedit.isEmpty() ) + { + if ( spaceLeft ) + { + m_currentResult.text = m_preedit.left( spaceLeft ); + m_currentResult.isFinal = true; + } - break; + reset(); + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + } + + if ( !( inputHints & Qt::ImhMultiLine ) ) + { + m_currentResult.key = Qt::Key_Return; + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + + break; + } + case Qt::Key_Space: + { + if ( predictor ) + { + if ( !m_preedit.isEmpty() && spaceLeft ) + { + m_preedit += keyString( key ); + m_preedit = m_preedit.left( spaceLeft ); + + m_currentResult.text = m_preedit; + m_currentResult.isFinal = true; + + reset(); + + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } + } + + break; + } + case Qt::Key_Left: + case Qt::Key_Right: + case Qt::Key_Escape: + case Qt::Key_Cancel: + { + m_currentResult.key = key; + Q_EMIT keyProcessingFinished( m_currentResult ); + return; + } } - case Qt::Key_Left: - case Qt::Key_Right: - case Qt::Key_Escape: - case Qt::Key_Cancel: + + const QString text = keyString( key ); + + if ( predictor ) { - m_currentResult.key = key; - Q_EMIT keyProcessingFinished( m_currentResult ); - return; - } - } - - const QString text = keyString( key ); - - if ( predictor ) - { - m_preedit += text; - Q_EMIT panel->predictionRequested( m_preedit ); - } - else - { - m_currentResult.text = text; - m_currentResult.isFinal = true; - Q_EMIT keyProcessingFinished( m_currentResult ); - } - } - - void reset() - { - m_preedit.clear(); - } - - void continueProcessingKey( const QStringList& candidates ) - { - if ( m_predictor ) - { - if ( candidates.count() > 0 ) - { - m_currentResult.text = m_preedit; - m_currentResult.isFinal = false; + m_preedit += text; + Q_EMIT panel->predictionRequested( m_preedit ); } else { - m_currentResult.text = m_preedit.left( m_spaceLeft ); + m_currentResult.text = text; m_currentResult.isFinal = true; - - m_preedit.clear(); + Q_EMIT keyProcessingFinished( m_currentResult ); } } - Q_EMIT keyProcessingFinished( m_currentResult ); - } - - Q_SIGNALS: - void keyProcessingFinished( const Result& result ); - - private: - inline QString keyString( int keyCode ) const - { - // Special case entry codes here, else default to the symbol - switch ( keyCode ) + void reset() { - case Qt::Key_Shift: - case Qt::Key_CapsLock: - case Qt::Key_Mode_switch: - case Qt::Key_Backspace: - case Qt::Key_Muhenkan: - return QString(); - - case Qt::Key_Return: - case Qt::Key_Kanji: - return QChar( QChar::CarriageReturn ); - - case Qt::Key_Space: - return QChar( QChar::Space ); - - default: - break; + m_preedit.clear(); } - return QChar( keyCode ); - } + void continueProcessingKey( const QStringList& candidates ) + { + if ( m_predictor ) + { + if ( candidates.count() > 0 ) + { + m_currentResult.text = m_preedit; + m_currentResult.isFinal = false; + } + else + { + m_currentResult.text = m_preedit.left( m_spaceLeft ); + m_currentResult.isFinal = true; - QString m_preedit; - int m_spaceLeft = -1; - QskTextPredictor* m_predictor = nullptr; - Result m_currentResult; -}; + m_preedit.clear(); + } + } + Q_EMIT keyProcessingFinished( m_currentResult ); + } + + Q_SIGNALS: + void keyProcessingFinished( const Result& ); + + private: + inline QString keyString( int keyCode ) const + { + // Special case entry codes here, else default to the symbol + switch ( keyCode ) + { + case Qt::Key_Shift: + case Qt::Key_CapsLock: + case Qt::Key_Mode_switch: + case Qt::Key_Backspace: + case Qt::Key_Muhenkan: + return QString(); + + case Qt::Key_Return: + case Qt::Key_Kanji: + return QChar( QChar::CarriageReturn ); + + case Qt::Key_Space: + return QChar( QChar::Space ); + + default: + break; + } + + return QChar( keyCode ); + } + + QString m_preedit; + int m_spaceLeft = -1; + QskTextPredictor* m_predictor = nullptr; + Result m_currentResult; + }; +} class QskInputPanel::PrivateData { @@ -369,10 +371,7 @@ QskInputPanel::QskInputPanel( QQuickItem* parent ) this, &QskInputPanel::updateLocale ); connect( &m_data->keyProcessor, &KeyProcessor::keyProcessingFinished, - this, [this]( const Result& result ) - { - m_data->handleKeyProcessingFinished( result ); - } ); + this, [this]( const Result& result ) { m_data->handleKeyProcessingFinished( result ); } ); updateLocale( locale() ); } @@ -491,9 +490,9 @@ void QskInputPanel::resetPredictor( const QLocale& locale ) { // text predictor lives in another thread, so these will all be QueuedConnections: connect( this, &QskInputPanel::predictionReset, - predictor.get(), &QskTextPredictor::reset ); + predictor.get(), &QskTextPredictor::reset ); connect( this, &QskInputPanel::predictionRequested, - predictor.get(), &QskTextPredictor::request ); + predictor.get(), &QskTextPredictor::request ); connect( predictor.get(), &QskTextPredictor::predictionChanged, this, &QskInputPanel::updatePrediction ); diff --git a/src/inputpanel/QskInputPanel.h b/src/inputpanel/QskInputPanel.h index 66bd74c8..71381bc0 100644 --- a/src/inputpanel/QskInputPanel.h +++ b/src/inputpanel/QskInputPanel.h @@ -53,7 +53,7 @@ class QSK_EXPORT QskInputPanel : public QskControl virtual void attachItem( QQuickItem* ) = 0; private: - void updatePrediction( const QString &text, const QStringList &candidates ); + void updatePrediction( const QString&, const QStringList& candidates ); void resetPredictor( const QLocale& ); void updateLocale( const QLocale& ); diff --git a/src/inputpanel/QskInputPanelBox.cpp b/src/inputpanel/QskInputPanelBox.cpp index 7bc9f19c..54791995 100644 --- a/src/inputpanel/QskInputPanelBox.cpp +++ b/src/inputpanel/QskInputPanelBox.cpp @@ -22,7 +22,7 @@ namespace : QskTextInput( parentItem ) , m_panelBox( panelBox ) { - setObjectName( "InputBoxProxy" ); + setObjectName( QStringLiteral( "InputBoxProxy" ) ); setFocusPolicy( Qt::NoFocus ); initSizePolicy( QskSizePolicy::Ignored, QskSizePolicy::Fixed ); diff --git a/src/inputpanel/inputpanel.pro b/src/inputpanel/inputpanel.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/inputpanel/inputpanel.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/layouts/QskGridBox.cpp b/src/layouts/QskGridBox.cpp index f5d49516..40548887 100644 --- a/src/layouts/QskGridBox.cpp +++ b/src/layouts/QskGridBox.cpp @@ -79,7 +79,7 @@ static void qskUpdateFocusChain( } else { - const auto itemLast = box->childItems().last(); + const auto itemLast = box->childItems().constLast(); if ( itemLast != item ) item->stackAfter( itemLast ); } diff --git a/src/layouts/QskGridLayoutEngine.cpp b/src/layouts/QskGridLayoutEngine.cpp index c092ddd0..f957a491 100644 --- a/src/layouts/QskGridLayoutEngine.cpp +++ b/src/layouts/QskGridLayoutEngine.cpp @@ -116,7 +116,7 @@ namespace private: inline bool setValueAt( int pos, - const std::function< bool( Setting& ) > modify ) + const std::function< bool( Setting& ) >& modify ) { if ( pos < 0 ) return false; diff --git a/src/layouts/QskIndexedLayoutBox.cpp b/src/layouts/QskIndexedLayoutBox.cpp index bf6e23f9..b7a81f4f 100644 --- a/src/layouts/QskIndexedLayoutBox.cpp +++ b/src/layouts/QskIndexedLayoutBox.cpp @@ -83,7 +83,7 @@ void QskIndexedLayoutBox::itemChange( } } - return Inherited::itemChange( change, value ); + Inherited::itemChange( change, value ); } void QskIndexedLayoutBox::reparentItem( QQuickItem* item ) diff --git a/src/layouts/QskLayoutChain.cpp b/src/layouts/QskLayoutChain.cpp index 48ceb4a5..43a2f514 100644 --- a/src/layouts/QskLayoutChain.cpp +++ b/src/layouts/QskLayoutChain.cpp @@ -341,7 +341,7 @@ QskLayoutChain::Segments QskLayoutChain::minimumExpanded( qreal size ) const - according to the preferred sizes - items with a larger preferred size are stretchier: this is - what QSK_LAYOUT_COMPAT does ( compatible with QGridLayoutEngine ) + what QGridLayoutEngine does - somehow using the stretch factors */ diff --git a/src/layouts/QskStackBox.cpp b/src/layouts/QskStackBox.cpp index e2054d1e..44206cb4 100644 --- a/src/layouts/QskStackBox.cpp +++ b/src/layouts/QskStackBox.cpp @@ -316,7 +316,7 @@ void QskStackBox::autoRemoveItem( QQuickItem* item ) void QskStackBox::clear( bool autoDelete ) { - for ( const auto item : qskAsConst( m_data->items ) ) + for ( const auto item : qAsConst( m_data->items ) ) { if( autoDelete && ( item->parent() == this ) ) delete item; @@ -376,7 +376,7 @@ QSizeF QskStackBox::layoutSizeHint( qreal w = -1.0; qreal h = -1.0; - for ( const auto item : m_data->items ) + for ( const auto item : qAsConst( m_data->items ) ) { /* We ignore the retainSizeWhenVisible flag and include all diff --git a/src/layouts/layouts.pro b/src/layouts/layouts.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/layouts/layouts.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/nodes/QskArcNode.cpp b/src/nodes/QskArcNode.cpp index c57f6f40..698e8364 100644 --- a/src/nodes/QskArcNode.cpp +++ b/src/nodes/QskArcNode.cpp @@ -32,11 +32,11 @@ void QskArcNode::paint( QPainter* painter, const QSizeF& size ) renderer.renderArc( rect, m_metrics, m_gradient, painter ); } -uint QskArcNode::hash() const +QskHashValue QskArcNode::hash() const { - uint h = m_metrics.hash(); + auto h = m_metrics.hash(); - for( const auto& stop : m_gradient.stops() ) + for( const auto& stop : qAsConst( m_gradient.stops() ) ) h = stop.hash( h ); return h; diff --git a/src/nodes/QskArcNode.h b/src/nodes/QskArcNode.h index 191c271b..0bf3724c 100644 --- a/src/nodes/QskArcNode.h +++ b/src/nodes/QskArcNode.h @@ -20,7 +20,7 @@ class QSK_EXPORT QskArcNode : public QskPaintedNode const QskGradient&, QQuickWindow* ); void paint( QPainter* painter, const QSizeF& size ) override; - uint hash() const override; + QskHashValue hash() const override; private: QskArcMetrics m_metrics; diff --git a/src/nodes/QskArcRenderer.cpp b/src/nodes/QskArcRenderer.cpp index 28c96580..0f89d7d6 100644 --- a/src/nodes/QskArcRenderer.cpp +++ b/src/nodes/QskArcRenderer.cpp @@ -17,12 +17,10 @@ void QskArcRenderer::renderArc(const QRectF& rect, painter->setRenderHint( QPainter::Antialiasing, true ); QGradientStops stops; + stops.reserve( gradient.stops().count() ); - for( const QskGradientStop& stop : gradient.stops() ) - { - QGradientStop s( stop.position(), stop.color() ); - stops.append( s ); - } + for( const QskGradientStop& stop : qAsConst( gradient.stops() ) ) + stops += QGradientStop( stop.position(), stop.color() ); /* horizontal is interpreted as in direction of the arc, diff --git a/src/nodes/QskBoxClipNode.cpp b/src/nodes/QskBoxClipNode.cpp index 9408e22a..40b288e0 100644 --- a/src/nodes/QskBoxClipNode.cpp +++ b/src/nodes/QskBoxClipNode.cpp @@ -9,10 +9,10 @@ #include "QskBoxShapeMetrics.h" #include "QskFunctions.h" -static inline uint qskMetricsHash( +static inline QskHashValue qskMetricsHash( const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border ) { - uint hash = 13000; + QskHashValue hash = 13000; hash = shape.hash( hash ); return border.hash( hash ); @@ -32,7 +32,7 @@ QskBoxClipNode::~QskBoxClipNode() void QskBoxClipNode::setBox( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border ) { - const uint hash = qskMetricsHash( shape, border ); + const auto hash = qskMetricsHash( shape, border ); if ( hash == m_hash && rect == m_rect ) return; diff --git a/src/nodes/QskBoxClipNode.h b/src/nodes/QskBoxClipNode.h index 0eb6d05d..48194062 100644 --- a/src/nodes/QskBoxClipNode.h +++ b/src/nodes/QskBoxClipNode.h @@ -22,7 +22,7 @@ class QSK_EXPORT QskBoxClipNode : public QSGClipNode const QskBoxShapeMetrics&, const QskBoxBorderMetrics& ); private: - uint m_hash; + QskHashValue m_hash; QRectF m_rect; QSGGeometry m_geometry; diff --git a/src/nodes/QskBoxNode.cpp b/src/nodes/QskBoxNode.cpp index 586157ba..a8457684 100644 --- a/src/nodes/QskBoxNode.cpp +++ b/src/nodes/QskBoxNode.cpp @@ -14,32 +14,51 @@ #include #include +QSK_QT_PRIVATE_BEGIN +#include +QSK_QT_PRIVATE_END + Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialVertex ) -static inline uint qskMetricsHash( +static inline QskHashValue qskMetricsHash( const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics ) { - uint hash = 13000; + QskHashValue hash = 13000; hash = shape.hash( hash ); return borderMetrics.hash( hash ); } -static inline uint qskColorsHash( +static inline QskHashValue qskColorsHash( const QskBoxBorderColors& borderColors, const QskGradient& fillGradient ) { - uint hash = 13000; + QskHashValue hash = 13000; hash = borderColors.hash( hash ); return fillGradient.hash( hash ); } -QskBoxNode::QskBoxNode() - : m_metricsHash( 0 ) - , m_colorsHash( 0 ) - , m_geometry( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ) +class QskBoxNodePrivate final : public QSGGeometryNodePrivate { + public: + QskBoxNodePrivate() + : geometry( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ) + { + } + + QskHashValue metricsHash = 0; + QskHashValue colorsHash = 0; + QRectF rect; + + QSGGeometry geometry; +}; + +QskBoxNode::QskBoxNode() + : QSGGeometryNode( *new QskBoxNodePrivate ) +{ + Q_D( QskBoxNode ); + setMaterial( qskMaterialVertex ); - setGeometry( &m_geometry ); + setGeometry( &d->geometry ); } QskBoxNode::~QskBoxNode() @@ -58,6 +77,8 @@ void QskBoxNode::setBoxData( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, const QskBoxBorderColors& borderColors, const QskGradient& gradient ) { + Q_D( QskBoxNode ); + QskGradient fillGradient = gradient; #if 1 // Renderer is buggy for monochrome gradients with stops. TODO ... @@ -68,18 +89,18 @@ void QskBoxNode::setBoxData( const QRectF& rect, #endif #if 1 - const uint metricsHash = qskMetricsHash( shape, borderMetrics ); - const uint colorsHash = qskColorsHash( borderColors, fillGradient ); + const auto metricsHash = qskMetricsHash( shape, borderMetrics ); + const auto colorsHash = qskColorsHash( borderColors, fillGradient ); - if ( ( metricsHash == m_metricsHash ) && - ( colorsHash == m_colorsHash ) && ( rect == m_rect ) ) + if ( ( metricsHash == d->metricsHash ) && + ( colorsHash == d->colorsHash ) && ( rect == d->rect ) ) { return; } - m_metricsHash = metricsHash; - m_colorsHash = colorsHash; - m_rect = rect; + d->metricsHash = metricsHash; + d->colorsHash = colorsHash; + d->rect = rect; markDirty( QSGNode::DirtyMaterial ); markDirty( QSGNode::DirtyGeometry ); @@ -87,7 +108,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( rect.isEmpty() ) { - m_geometry.allocate( 0 ); + d->geometry.allocate( 0 ); return; } @@ -106,7 +127,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( !hasBorder && !hasFill ) { - m_geometry.allocate( 0 ); + d->geometry.allocate( 0 ); return; } @@ -118,7 +139,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( isFillMonochrome && isBorderMonochrome ) { if ( borderColors.gradient( Qsk::Left ).startColor() - == fillGradient.startColor() ) + == fillGradient.startColor() ) { // we can draw border and background in one hasBorder = false; @@ -155,7 +176,7 @@ void QskBoxNode::setBoxData( const QRectF& rect, { setMonochrome( false ); - renderer.renderBox( m_rect, shape, borderMetrics, + renderer.renderBox( d->rect, shape, borderMetrics, borderColors, fillGradient, *geometry() ); } else @@ -168,12 +189,12 @@ void QskBoxNode::setBoxData( const QRectF& rect, if ( hasFill ) { flatMaterial->setColor( fillGradient.startColor() ); - renderer.renderFill( m_rect, shape, QskBoxBorderMetrics(), *geometry() ); + renderer.renderFill( d->rect, shape, QskBoxBorderMetrics(), *geometry() ); } else { flatMaterial->setColor( borderColors.gradient( Qsk::Left ).startColor().rgba() ); - renderer.renderBorder( m_rect, shape, borderMetrics, *geometry() ); + renderer.renderBorder( d->rect, shape, borderMetrics, *geometry() ); } } } @@ -185,14 +206,16 @@ void QskBoxNode::setMonochrome( bool on ) if ( on == ( material != qskMaterialVertex ) ) return; - m_geometry.allocate( 0 ); + Q_D( QskBoxNode ); + + d->geometry.allocate( 0 ); if ( on ) { setMaterial( new QSGFlatColorMaterial() ); const QSGGeometry g( QSGGeometry::defaultAttributes_Point2D(), 0 ); - memcpy( ( void* ) &m_geometry, ( void* ) &g, sizeof( QSGGeometry ) ); + memcpy( ( void* ) &d->geometry, ( void* ) &g, sizeof( QSGGeometry ) ); } else { @@ -200,6 +223,6 @@ void QskBoxNode::setMonochrome( bool on ) delete material; const QSGGeometry g( QSGGeometry::defaultAttributes_ColoredPoint2D(), 0 ); - memcpy( ( void* ) &m_geometry, ( void* ) &g, sizeof( QSGGeometry ) ); + memcpy( ( void* ) &d->geometry, ( void* ) &g, sizeof( QSGGeometry ) ); } } diff --git a/src/nodes/QskBoxNode.h b/src/nodes/QskBoxNode.h index 77ae0b82..5aa9bab4 100644 --- a/src/nodes/QskBoxNode.h +++ b/src/nodes/QskBoxNode.h @@ -14,6 +14,8 @@ class QskBoxBorderMetrics; class QskBoxBorderColors; class QskGradient; +class QskBoxNodePrivate; + class QSK_EXPORT QskBoxNode : public QSGGeometryNode { public: @@ -29,11 +31,8 @@ class QSK_EXPORT QskBoxNode : public QSGGeometryNode private: void setMonochrome( bool on ); - uint m_metricsHash; - uint m_colorsHash; - QRectF m_rect; + Q_DECLARE_PRIVATE( QskBoxNode ) - QSGGeometry m_geometry; }; #endif diff --git a/src/nodes/QskBoxRendererEllipse.cpp b/src/nodes/QskBoxRendererEllipse.cpp index 2877e30e..a5dd34f9 100644 --- a/src/nodes/QskBoxRendererEllipse.cpp +++ b/src/nodes/QskBoxRendererEllipse.cpp @@ -561,9 +561,10 @@ namespace { } - void addAdditionalLines( float x11, float y11, float x12, float y12, // start line - float x21,float y21, float x22, float y22, // end line - const QskGradient& gradient, Line* lines ) + void addAdditionalLines( + float x11, float y11, float x12, float y12, // start line + float x21, float y21, float x22, float y22, // end line + const QskGradient& gradient, Line* lines ) { int additionalStopCount = additionalGradientStops( gradient ); @@ -712,35 +713,37 @@ namespace if( additionalGradientStops( borderMapTR.gradient() ) > 0 ) { float x1TR = c[ TopRight ].centerX + v.dx1( TopRight ), - y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), - x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), - y2TR = c[ TopRight ].centerY - v.dy2( TopRight ), + y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), + x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), + y2TR = c[ TopRight ].centerY - v.dy2( TopRight ), - x1TL = c[ TopLeft ].centerX - v.dx1( TopLeft ), - y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), - x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), - y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ); + x1TL = c[ TopLeft ].centerX - v.dx1( TopLeft ), + y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), + x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), + y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ); - addAdditionalLines( x1TR, y1TR, x2TR, y2TR, - x1TL, y1TL, x2TL, y2TL, - borderMapTR.gradient(), linesTR + k ); + addAdditionalLines( + x1TR, y1TR, x2TR, y2TR, + x1TL, y1TL, x2TL, y2TL, + borderMapTR.gradient(), linesTR + k ); } if( additionalGradientStops( borderMapBL.gradient() ) > 0 ) { float x1BL = c[ BottomLeft ].centerX - v.dx1( BottomLeft ), - y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), - x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), - y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ), + y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), + x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), + y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ), - x1BR = c[ BottomRight ].centerX + v.dx1( BottomRight ), - y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), - x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), - y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ); + x1BR = c[ BottomRight ].centerX + v.dx1( BottomRight ), + y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), + x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), + y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ); - addAdditionalLines( x1BL, y1BL, x2BL, y2BL, - x1BR, y1BR, x2BR, y2BR, - borderMapBL.gradient(), linesBL + k ); + addAdditionalLines( + x1BL, y1BL, x2BL, y2BL, + x1BR, y1BR, x2BR, y2BR, + borderMapBL.gradient(), linesBL + k ); } } @@ -749,35 +752,37 @@ namespace if( additionalGradientStops( borderMapTL.gradient() ) > 0 ) { float x1TL = c[ TopLeft ].centerX - v.dx1( TopLeft ), - y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), - x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), - y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ), + y1TL = c[ TopLeft ].centerY - v.dy1( TopLeft ), + x2TL = c[ TopLeft ].centerX - v.dx2( TopLeft ), + y2TL = c[ TopLeft ].centerY - v.dy2( TopLeft ), - x1BL = c[ BottomLeft ].centerX - v.dx1( BottomLeft ), - y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), - x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), - y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ); + x1BL = c[ BottomLeft ].centerX - v.dx1( BottomLeft ), + y1BL = c[ BottomLeft ].centerY + v.dy1( BottomLeft ), + x2BL = c[ BottomLeft ].centerX - v.dx2( BottomLeft ), + y2BL = c[ BottomLeft ].centerY + v.dy2( BottomLeft ); - addAdditionalLines( x1TL, y1TL, x2TL, y2TL, - x1BL, y1BL, x2BL, y2BL, - borderMapTL.gradient(), linesTL + j ); + addAdditionalLines( + x1TL, y1TL, x2TL, y2TL, + x1BL, y1BL, x2BL, y2BL, + borderMapTL.gradient(), linesTL + j ); } if( additionalGradientStops( borderMapBR.gradient() ) > 0 ) { float x1BR = c[ BottomRight ].centerX + v.dx1( BottomRight ), - y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), - x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), - y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ), + y1BR = c[ BottomRight ].centerY + v.dy1( BottomRight ), + x2BR = c[ BottomRight ].centerX + v.dx2( BottomRight ), + y2BR = c[ BottomRight ].centerY + v.dy2( BottomRight ), - x1TR = c[ TopRight ].centerX + v.dx1( TopRight ), - y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), - x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), - y2TR = c[ TopRight ].centerY - v.dy2( TopRight ); + x1TR = c[ TopRight ].centerX + v.dx1( TopRight ), + y1TR = c[ TopRight ].centerY - v.dy1( TopRight ), + x2TR = c[ TopRight ].centerX + v.dx2( TopRight ), + y2TR = c[ TopRight ].centerY - v.dy2( TopRight ); - addAdditionalLines( x1BR, y1BR, x2BR, y2BR, - x1TR, y1TR, x2TR, y2TR, - borderMapBR.gradient(), linesBR + j ); + addAdditionalLines( + x1BR, y1BR, x2BR, y2BR, + x1TR, y1TR, x2TR, y2TR, + borderMapBR.gradient(), linesBR + j ); } } } @@ -1011,17 +1016,13 @@ static inline void qskRenderBorder( const QskBoxRenderer::Metrics& metrics, const int stepCount = metrics.corner[ 0 ].stepCount; auto left = c.gradient( Qsk::Left ), top = c.gradient( Qsk::Top ), - right = c.gradient( Qsk::Right ), bottom = c.gradient( Qsk::Bottom ); + right = c.gradient( Qsk::Right ), bottom = c.gradient( Qsk::Bottom ); qskRenderBorderLines( metrics, orientation, line, - BorderMapGradient( stepCount, qskRgbGradientStart( top ), - qskRgbGradientEnd( left ), left ), - BorderMapGradient( stepCount, qskRgbGradientStart( right ), - qskRgbGradientEnd( top ), top ), - BorderMapGradient( stepCount, qskRgbGradientStart( left ), - qskRgbGradientEnd( bottom ), bottom ), - BorderMapGradient( stepCount, qskRgbGradientStart( bottom ), - qskRgbGradientEnd( right ), right ) ); + BorderMapGradient( stepCount, qskRgbGradientStart( top ), qskRgbGradientEnd( left ), left ), + BorderMapGradient( stepCount, qskRgbGradientStart( right ), qskRgbGradientEnd( top ), top ), + BorderMapGradient( stepCount, qskRgbGradientStart( left ), qskRgbGradientEnd( bottom ), bottom ), + BorderMapGradient( stepCount, qskRgbGradientStart( bottom ), qskRgbGradientEnd( right ), right ) ); } } @@ -1071,16 +1072,12 @@ static inline void qskRenderBoxRandom( const int n = metrics.corner[ 0 ].stepCount; auto left = bc.gradient( Qsk::Left ), top = bc.gradient( Qsk::Top ), - right = bc.gradient( Qsk::Right ), bottom = bc.gradient( Qsk::Bottom ); + right = bc.gradient( Qsk::Right ), bottom = bc.gradient( Qsk::Bottom ); - const BorderMapGradient tl( n, qskRgbGradientStart( top.startColor() ), - qskRgbGradientEnd( left.endColor() ), left ); - const BorderMapGradient tr( n, qskRgbGradientStart( right ), - qskRgbGradientEnd( top ), top ); - const BorderMapGradient bl( n, qskRgbGradientStart( left ), - qskRgbGradientEnd( bottom ), bottom ); - const BorderMapGradient br( n, qskRgbGradientStart( bottom ), - qskRgbGradientEnd( right ), right ); + const BorderMapGradient tl( n, qskRgbGradientStart( top.startColor() ), qskRgbGradientEnd( left.endColor() ), left ); + const BorderMapGradient tr( n, qskRgbGradientStart( right ), qskRgbGradientEnd( top ), top ); + const BorderMapGradient bl( n, qskRgbGradientStart( left ), qskRgbGradientEnd( bottom ), bottom ); + const BorderMapGradient br( n, qskRgbGradientStart( bottom ), qskRgbGradientEnd( right ), right ); if ( gradient.isMonochrome() ) { diff --git a/src/nodes/QskBoxRendererRect.cpp b/src/nodes/QskBoxRendererRect.cpp index fd4d6706..63c82034 100644 --- a/src/nodes/QskBoxRendererRect.cpp +++ b/src/nodes/QskBoxRendererRect.cpp @@ -434,7 +434,7 @@ static inline void qskCreateBorder( const qreal dy1 = in.top - in.bottom; const qreal dy2 = out.top - out.bottom; - for( const auto& stop : gradientBottom.stops() ) + for( const auto& stop : qAsConst( gradientBottom.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.right - stop.position() * dx1; @@ -445,7 +445,7 @@ static inline void qskCreateBorder( ( line++ )->setLine( x1, y1, x2, y2, c ); } - for( const auto& stop : gradientLeft.stops() ) + for( const auto& stop : qAsConst( gradientLeft.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.left; @@ -456,7 +456,7 @@ static inline void qskCreateBorder( ( line++ )->setLine( x1, y1, x2, y2, c ); } - for( const auto& stop : gradientTop.stops() ) + for( const auto& stop : qAsConst( gradientTop.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.left + stop.position() * dx1; @@ -467,7 +467,7 @@ static inline void qskCreateBorder( ( line++ )->setLine( x1, y1, x2, y2, c ); } - for( const auto& stop : gradientRight.stops() ) + for( const auto& stop : qAsConst( gradientRight.stops() ) ) { const Color c( stop.color() ); const qreal x1 = in.right; @@ -623,9 +623,14 @@ void QskBoxRenderer::renderRect( auto fillLines = line + fillLineCount; if ( bc.isMonochrome() ) - qskCreateBorderMonochrome( rect, in, bc.gradient( Qsk::Left ).startColor().rgba(), fillLines ); + { + const auto rgb = bc.gradient( Qsk::Left ).startColor().rgba(); + qskCreateBorderMonochrome( rect, in, rgb, fillLines ); + } else + { qskCreateBorder( rect, in, bc, fillLines ); + } } } diff --git a/src/nodes/QskGraphicNode.cpp b/src/nodes/QskGraphicNode.cpp index 4c0b9943..4e3e4d79 100644 --- a/src/nodes/QskGraphicNode.cpp +++ b/src/nodes/QskGraphicNode.cpp @@ -8,11 +8,11 @@ #include "QskColorFilter.h" #include "QskPainterCommand.h" -static inline uint qskHash( +static inline QskHashValue qskHash( const QskGraphic& graphic, const QskColorFilter& colorFilter, QskTextureRenderer::RenderMode renderMode ) { - uint hash = 12000; + QskHashValue hash = 12000; const auto& substitutions = colorFilter.substitutions(); if ( substitutions.size() > 0 ) diff --git a/src/nodes/QskGraphicNode.h b/src/nodes/QskGraphicNode.h index 1e814513..3d5925b5 100644 --- a/src/nodes/QskGraphicNode.h +++ b/src/nodes/QskGraphicNode.h @@ -28,7 +28,7 @@ class QSK_EXPORT QskGraphicNode : public QskTextureNode void setTexture( QQuickWindow*, const QRectF&, uint id, Qt::Orientations ) = delete; - uint m_hash; + QskHashValue m_hash; }; #endif diff --git a/src/nodes/QskPaintedNode.h b/src/nodes/QskPaintedNode.h index cb1ccf15..6b53ab6a 100644 --- a/src/nodes/QskPaintedNode.h +++ b/src/nodes/QskPaintedNode.h @@ -22,7 +22,7 @@ class QSK_EXPORT QskPaintedNode : public QskTextureNode virtual void paint( QPainter*, const QSizeF& ) = 0; // a hash value of '0' always results in repainting - virtual uint hash() const = 0; + virtual QskHashValue hash() const = 0; private: class PaintHelper; @@ -30,7 +30,7 @@ class QSK_EXPORT QskPaintedNode : public QskTextureNode void setTexture( QQuickWindow*, const QRectF&, uint id, Qt::Orientations ) = delete; - uint m_hash; + QskHashValue m_hash; }; #endif diff --git a/src/nodes/QskScaleRenderer.cpp b/src/nodes/QskScaleRenderer.cpp index fd097ffe..f647ad6e 100644 --- a/src/nodes/QskScaleRenderer.cpp +++ b/src/nodes/QskScaleRenderer.cpp @@ -4,14 +4,18 @@ *****************************************************************************/ #include "QskScaleRenderer.h" +#include "QskScaleTickmarks.h" #include "QskSkinlet.h" #include "QskSGNode.h" #include "QskTickmarksNode.h" #include "QskTextNode.h" #include "QskGraphicNode.h" #include "QskTextOptions.h" +#include "QskTextColors.h" #include "QskGraphic.h" +#include "QskColorFilter.h" #include "QskControl.h" +#include "QskIntervalF.h" #include "QskFunctions.h" #include @@ -45,44 +49,70 @@ static inline void qskInsertRemoveChild( QSGNode* parentNode, } } +class QskScaleRenderer::PrivateData +{ + public: + QskIntervalF boundaries; + QskScaleTickmarks tickmarks; + + QColor tickColor = Qt::black; + qreal tickWidth = 1.0; + + QFont font; + QskTextColors textColors; + + QskColorFilter colorFilter; + + Qt::Orientation orientation = Qt::Horizontal; +}; + +QskScaleRenderer::QskScaleRenderer() + : m_data( new PrivateData() ) +{ +} + +QskScaleRenderer::~QskScaleRenderer() +{ +} + void QskScaleRenderer::setOrientation( Qt::Orientation orientation ) { - m_orientation = orientation; + m_data->orientation = orientation; } void QskScaleRenderer::setBoundaries( const QskIntervalF& boundaries ) { - m_boundaries = boundaries; + m_data->boundaries = boundaries; } void QskScaleRenderer::setTickmarks( const QskScaleTickmarks& tickmarks ) { - m_tickmarks = tickmarks; + m_data->tickmarks = tickmarks; } void QskScaleRenderer::setTickColor( const QColor& color ) { - m_tickColor = color; + m_data->tickColor = color; } void QskScaleRenderer::setTickWidth( qreal width ) { - m_tickWidth = width; + m_data->tickWidth = width; } void QskScaleRenderer::setFont( const QFont& font ) { - m_font = font; + m_data->font = font; } void QskScaleRenderer::setTextColors( const QskTextColors& textColors ) { - m_textColors = textColors; + m_data->textColors = textColors; } void QskScaleRenderer::setColorFilter( const QskColorFilter& colorFilter ) { - m_colorFilter = colorFilter; + m_data->colorFilter = colorFilter; } QSGNode* QskScaleRenderer::updateScaleNode( @@ -140,8 +170,8 @@ QSGNode* QskScaleRenderer::updateTicksNode( if( ticksNode == nullptr ) ticksNode = new QskTickmarksNode; - ticksNode->update( m_tickColor, rect, m_boundaries, - m_tickmarks, m_tickWidth, m_orientation ); + ticksNode->update( m_data->tickColor, rect, m_data->boundaries, + m_data->tickmarks, m_data->tickWidth, m_data->orientation ); return ticksNode; } @@ -153,18 +183,18 @@ QSGNode* QskScaleRenderer::updateLabelsNode( if ( labelsRect.isEmpty() || tickmarksRect.isEmpty() ) return nullptr; - const auto ticks = m_tickmarks.majorTicks(); + const auto ticks = m_data->tickmarks.majorTicks(); if ( ticks.isEmpty() ) return nullptr; if( node == nullptr ) node = new QSGNode; - const QFontMetricsF fm( m_font ); + const QFontMetricsF fm( m_data->font ); - const qreal length = ( m_orientation == Qt::Horizontal ) + const qreal length = ( m_data->orientation == Qt::Horizontal ) ? tickmarksRect.width() : tickmarksRect.height(); - const qreal ratio = length / m_boundaries.width(); + const qreal ratio = length / m_data->boundaries.width(); auto nextNode = node->firstChild(); @@ -182,7 +212,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( if ( label.isNull() ) continue; - const qreal tickPos = ratio * ( tick - m_boundaries.lowerBound() ); + const qreal tickPos = ratio * ( tick - m_data->boundaries.lowerBound() ); if ( label.canConvert< QString >() ) { @@ -193,7 +223,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( QRectF r; Qt::Alignment alignment; - if( m_orientation == Qt::Horizontal ) + if( m_data->orientation == Qt::Horizontal ) { const auto w = qskHorizontalAdvance( fm, text ); @@ -261,8 +291,8 @@ QSGNode* QskScaleRenderer::updateLabelsNode( } auto textNode = static_cast< QskTextNode* >( nextNode ); - textNode->setTextData( skinnable->owningControl(), text, r, m_font, - QskTextOptions(), m_textColors, alignment, Qsk::Normal ); + textNode->setTextData( skinnable->owningControl(), text, r, m_data->font, + QskTextOptions(), m_data->textColors, alignment, Qsk::Normal ); nextNode = nextNode->nextSibling(); } @@ -277,7 +307,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( Qt::Alignment alignment; - if( m_orientation == Qt::Horizontal ) + if( m_data->orientation == Qt::Horizontal ) { auto pos = tickmarksRect.x() + tickPos - 0.5 * w; pos = qBound( labelsRect.left(), pos, labelsRect.right() - w ); @@ -310,7 +340,7 @@ QSGNode* QskScaleRenderer::updateLabelsNode( QskSkinlet::updateGraphicNode( skinnable->owningControl(), graphicNode, - graphic, m_colorFilter, labelRect, alignment ); + graphic, m_data->colorFilter, labelRect, alignment ); nextNode = nextNode->nextSibling(); } @@ -328,11 +358,11 @@ QVariant QskScaleRenderer::labelAt( qreal pos ) const QSizeF QskScaleRenderer::boundingLabelSize() const { - const auto ticks = m_tickmarks.majorTicks(); + const auto ticks = m_data->tickmarks.majorTicks(); if ( ticks.isEmpty() ) return QSizeF( 0.0, 0.0 ); - const QFontMetricsF fm( m_font ); + const QFontMetricsF fm( m_data->font ); qreal maxWidth = 0.0; const qreal h = fm.height(); diff --git a/src/nodes/QskScaleRenderer.h b/src/nodes/QskScaleRenderer.h index b17a9d55..9117a76e 100644 --- a/src/nodes/QskScaleRenderer.h +++ b/src/nodes/QskScaleRenderer.h @@ -7,16 +7,18 @@ #define QSK_SCALE_RENDERER_H #include "QskGlobal.h" -#include "QskIntervalF.h" -#include "QskScaleTickmarks.h" -#include "QskTextColors.h" -#include "QskColorFilter.h" #include #include #include +#include + class QskSkinnable; +class QskIntervalF; +class QskScaleTickmarks; +class QskTextColors; +class QskColorFilter; class QSGNode; class QVariant; @@ -25,6 +27,9 @@ class QRectF; class QSK_EXPORT QskScaleRenderer { public: + QskScaleRenderer(); + ~QskScaleRenderer(); + void setOrientation( Qt::Orientation ); void setBoundaries( const QskIntervalF& ); @@ -52,18 +57,10 @@ class QSK_EXPORT QskScaleRenderer const QRectF& labelsRect, QSGNode* node ) const; private: - Qt::Orientation m_orientation = Qt::Horizontal; + Q_DISABLE_COPY( QskScaleRenderer ) - QskIntervalF m_boundaries; - QskScaleTickmarks m_tickmarks; - - QColor m_tickColor = Qt::black; - qreal m_tickWidth = 1.0; - - QFont m_font; - QskTextColors m_textColors; - - QskColorFilter m_colorFilter; + class PrivateData; + std::unique_ptr< PrivateData > m_data; }; #endif diff --git a/src/nodes/QskTextNode.cpp b/src/nodes/QskTextNode.cpp index 67fe053d..75177271 100644 --- a/src/nodes/QskTextNode.cpp +++ b/src/nodes/QskTextNode.cpp @@ -11,16 +11,16 @@ #include #include -static inline uint qskHash( +static inline QskHashValue qskHash( const QString& text, const QSizeF& size, const QFont& font, const QskTextOptions& options, const QskTextColors& colors, Qt::Alignment alignment, Qsk::TextStyle textStyle ) { - uint hash = 11000; + QskHashValue hash = 11000; hash = qHash( text, hash ); hash = qHash( font, hash ); - hash = qHash( options, hash ); + hash = options.hash( hash ); hash = qHash( alignment, hash ); hash = qHash( textStyle, hash ); hash = colors.hash( hash ); @@ -49,7 +49,7 @@ void QskTextNode::setTextData( if ( matrix != this->matrix() ) // avoid setting DirtyMatrix accidently setMatrix( matrix ); - const uint hash = qskHash( text, rect.size(), font, + const auto hash = qskHash( text, rect.size(), font, options, colors, alignment, textStyle ); if ( hash != m_hash ) diff --git a/src/nodes/QskTextNode.h b/src/nodes/QskTextNode.h index f09328ba..a5bff603 100644 --- a/src/nodes/QskTextNode.h +++ b/src/nodes/QskTextNode.h @@ -29,7 +29,7 @@ class QSK_EXPORT QskTextNode : public QSGTransformNode Qt::Alignment, Qsk::TextStyle ); private: - uint m_hash; + QskHashValue m_hash; }; #endif diff --git a/src/nodes/QskTextureRenderer.cpp b/src/nodes/QskTextureRenderer.cpp index 3f46595f..d501d6f3 100644 --- a/src/nodes/QskTextureRenderer.cpp +++ b/src/nodes/QskTextureRenderer.cpp @@ -172,10 +172,6 @@ QSGTexture* QskTextureRenderer::textureFromId( return texture; } -QskTextureRenderer::PaintHelper::~PaintHelper() -{ -} - uint QskTextureRenderer::createTexture( QQuickWindow* window, RenderMode renderMode, const QSize& size, PaintHelper* helper ) diff --git a/src/nodes/QskTextureRenderer.h b/src/nodes/QskTextureRenderer.h index b69a3517..4e83b6fd 100644 --- a/src/nodes/QskTextureRenderer.h +++ b/src/nodes/QskTextureRenderer.h @@ -38,8 +38,13 @@ namespace QskTextureRenderer class QSK_EXPORT PaintHelper { public: - virtual ~PaintHelper(); + PaintHelper() = default; + virtual ~PaintHelper() = default; + virtual void paint( QPainter*, const QSize& ) = 0; + + private: + Q_DISABLE_COPY( PaintHelper ) }; QSK_EXPORT uint createTexture( diff --git a/src/nodes/QskTickmarksNode.cpp b/src/nodes/QskTickmarksNode.cpp index ab1d3f59..f67b5512 100644 --- a/src/nodes/QskTickmarksNode.cpp +++ b/src/nodes/QskTickmarksNode.cpp @@ -38,7 +38,7 @@ class QskTickmarksNodePrivate final : public QSGGeometryNodePrivate QRectF rect; int lineWidth = 0; - uint hash = 0; + QskHashValue hash = 0; }; QskTickmarksNode::QskTickmarksNode() @@ -69,7 +69,7 @@ void QskTickmarksNode::update( markDirty( QSGNode::DirtyGeometry ); } - const uint hash = tickmarks.hash( 17435 ); + const auto hash = tickmarks.hash( 17435 ); if( ( hash != d->hash ) || ( rect != d->rect ) ) { diff --git a/src/nodes/QskVertex.cpp b/src/nodes/QskVertex.cpp index ff741668..7916b3e0 100644 --- a/src/nodes/QskVertex.cpp +++ b/src/nodes/QskVertex.cpp @@ -22,7 +22,7 @@ QDebug operator<<( QDebug debug, Color color ) return debug; } -QDebug operator<<( QDebug debug, ColoredLine line ) +QDebug operator<<( QDebug debug, const ColoredLine& line ) { qDebug() << qRound( line.p1.x ) << qRound( line.p1.y ) << "->" << qRound( line.p2.x ) << qRound( line.p2.y ); @@ -30,7 +30,7 @@ QDebug operator<<( QDebug debug, ColoredLine line ) return debug; } -QDebug operator<<( QDebug debug, Line line ) +QDebug operator<<( QDebug debug, const Line& line ) { qDebug() << qRound( line.p1.x ) << qRound( line.p1.y ) << "->" << qRound( line.p2.x ) << qRound( line.p2.y ); @@ -41,7 +41,7 @@ QDebug operator<<( QDebug debug, Line line ) #endif template< class Line > -static inline void qskDebugGeometry( Line* lines, int count ) +static inline void qskDebugGeometry( const Line* lines, int count ) { #ifndef QT_NO_DEBUG_STREAM for ( int i = 0; i < count; i++ ) diff --git a/src/nodes/QskVertex.h b/src/nodes/QskVertex.h index f1874bbd..0700d0ae 100644 --- a/src/nodes/QskVertex.h +++ b/src/nodes/QskVertex.h @@ -170,8 +170,8 @@ namespace QskVertex #ifndef QT_NO_DEBUG_STREAM class QDebug; QDebug operator<<( QDebug debug, QskVertex::Color ); -QDebug operator<<( QDebug debug, QskVertex::ColoredLine ); -QDebug operator<<( QDebug debug, QskVertex::Line ); +QDebug operator<<( QDebug debug, const QskVertex::ColoredLine& ); +QDebug operator<<( QDebug debug, const QskVertex::Line& ); #endif #endif diff --git a/src/nodes/nodes.pro b/src/nodes/nodes.pro deleted file mode 100644 index cb7cab62..00000000 --- a/src/nodes/nodes.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../ diff --git a/src/src.pro b/src/src.pro index 9358bdf2..a25be7da 100644 --- a/src/src.pro +++ b/src/src.pro @@ -12,8 +12,6 @@ DEPENDPATH *= $${QSK_SUBDIRS} # CONFIG += pinyin # CONFIG += hunspell -# DEFINES += QSK_LAYOUT_COMPAT - HEADERS += \ common/QskArcMetrics.h \ common/QskAspect.h \ diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 44a3d423..670405ca 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include diff --git a/tools/svg2qvg/svg2qvg.pro b/tools/svg2qvg/svg2qvg.pro index e2b81f73..19a433f1 100644 --- a/tools/svg2qvg/svg2qvg.pro +++ b/tools/svg2qvg/svg2qvg.pro @@ -18,7 +18,7 @@ standalone { $${QSK_ROOT}/src/common \ $${QSK_ROOT}/src/graphic - INCLUDEPATH *= $${QSK_DIRS} + INCLUDEPATH *= $${QSK_DIRS} $${QSK_OUT_ROOT}/src/$${MOC_DIR} DEPENDPATH += $${QSK_DIRS} DEFINES += QSK_STANDALONE