aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/ECMAddQtDesignerPlugin.cmake88
1 files changed, 49 insertions, 39 deletions
diff --git a/modules/ECMAddQtDesignerPlugin.cmake b/modules/ECMAddQtDesignerPlugin.cmake
index 4b4f467a..86fac970 100644
--- a/modules/ECMAddQtDesignerPlugin.cmake
+++ b/modules/ECMAddQtDesignerPlugin.cmake
@@ -72,11 +72,12 @@
# [TOOLTIP <tooltip>]
# [WHATSTHIS <whatsthis>]
# [GROUP <group>]
-# [CREATE_WIDGET_CODE <create_widget_code>]
-# [INITIALIZE_CODE <initialize_code]
-# [DOM_XML <dom_xml>]
+# [CREATE_WIDGET_CODE_FROM_VARIABLE <create_widget_code_variable>]
+# [INITIALIZE_CODE_FROM_VARIABLE <initialize_code_variable]
+# [DOM_XML_FROM_VARIABLE <dom_xml_variable>]
# [IMPL_CLASS_NAME <impl_class_name>]
# [CONSTRUCTOR_ARGS_CODE <constructor_args_code>]
+# [CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE <constructor_args_code_variable>]
# )
#
# ``CLASS_NAME`` specifies the name of the widget class, including namespaces.
@@ -105,31 +106,34 @@
# The default is set as configured by the ``DEFAULT_GROUP`` option of
# ``ecm_add_qtdesignerplugin``.
#
-# ``CREATE_WIDGET_CODE`` specifies C++ code to use as factory code to create
-# an instance of the widget, for the override of
+# ``CREATE_WIDGET_CODE_FROM_VARIABLE`` specifies the variable to get from the
+# C++ code to use as factory code to create an instance of the widget,
+# for the override of
# ``QDesignerCustomWidgetInterface::createWidget(QWidget* parent)``.
-# Replace any occurence of ";" with "@SEMICOLON@", as needed to pass the raw
-# code via CMake. The default is
-# "return new <impl_class_name><constructor_args_code>;".
+# The default is "return new <impl_class_name><constructor_args_code>;".
#
-# ``INITIALIZE_CODE`` specifies C++ code to use with the override of
+# ``INITIALIZE_CODE_FROM_VARIABLE`` specifies the variable to get from the C++
+# code to use with the override of
# ``QDesignerCustomWidgetInterface::initialize(QDesignerFormEditorInterface* core)``.
# The code has to use the present class member ``m_initialized`` to track and
-# update the state. Replace any occurence of ";" with "@SEMICOLON@", as needed
-# to pass the raw code via CMake. The default code simply sets
-# ``m_initialized`` to ``true``, if it was not before.
+# update the state. The default code simply sets ``m_initialized`` to
+# ``true``, if it was not before.
#
-# ``DOM_XML`` specifies the string to use with the optional override of
-# ``QDesignerCustomWidgetInterface::domXml()``. Replace any occurence of ";"
-# with "@SEMICOLON@", as needed to pass the raw XML string via CMake.
+# ``DOM_XML_FROM_VARIABLE`` specifies the variable to get from the string to
+# use with the optional override of
+# ``QDesignerCustomWidgetInterface::domXml()``.
# Default does not override.
#
# ``IMPL_CLASS_NAME`` specifies the name of the widget class to use for the
# widget instance with Qt Designer. The default is "<class_name>".
#
# ``CONSTRUCTOR_ARGS_CODE`` specifies the C++ code to use for the constructor
-# arguments with the default of <create_widget_code>. Note that the
-# parentheses are required. The default is "(parent)".
+# arguments with the default of ``CREATE_WIDGET_CODE_FROM_VARIABLE``. Note
+# that the parentheses are required. The default is "(parent)".
+#
+# ``CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE`` specifies the variable to get from
+# the C++ code instead of passing it directly via ``CONSTRUCTOR_ARGS_CODE``.
+# This can be needed if the code is more complex and e.g. includes ";" chars.
#
#
#
@@ -141,10 +145,18 @@
# TOOLTIP "Enables to browse foo."
# GROUP "Views (Foo)"
# )
-#
+#
+# set(BarWidget_CREATE_WIDGET_CODE
+# "
+# auto* widget = new BarWidget(parent);
+# widget->setBar("Example bar");
+# return widget;
+# ")
+#
# ecm_qtdesignerplugin_widget(BarWidget
# TOOLTIP "Displays bars."
# GROUP "Display (Foo)"
+# CREATE_WIDGET_CODE_FROM_VARIABLE BarWidget_CREATE_WIDGET_CODE
# )
#
# ecm_add_qtdesignerplugin(foowidgets
@@ -190,13 +202,6 @@
include(CMakeParseArguments)
# helper method
-# unescapes "@SEMICOLON@" into ";"
-function(_ecm_qtdesignerplugin_unescape_code _varName input)
- string(REPLACE "@SEMICOLON@" ";" _code ${input})
- set(${_varName} "${_code}" PARENT_SCOPE)
-endfunction()
-
-# helper method
# escapes string for C++ code
function(_ecm_qtdesignerplugin_escape_cpp_string _varName input)
string(REPLACE "\"" "\\\"" _string ${input})
@@ -218,11 +223,12 @@ function(ecm_qtdesignerplugin_widget widget)
TOOLTIP
WHATSTHIS
GROUP
- CREATE_WIDGET_CODE
- INITIALIZE_CODE
- DOM_XML
+ CREATE_WIDGET_CODE_FROM_VARIABLE
+ INITIALIZE_CODE_FROM_VARIABLE
+ DOM_XML_FROM_VARIABLE
IMPL_CLASS_NAME
CONSTRUCTOR_ARGS_CODE
+ CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE
)
set(multiValueArgs
)
@@ -242,16 +248,23 @@ function(ecm_qtdesignerplugin_widget widget)
else()
set(_is_container FALSE)
endif()
- if(NOT ARGS_CREATE_WIDGET_CODE)
+ if(ARGS_CONSTRUCTOR_ARGS_CODE AND ARGS_CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE)
+ message(FATAL_ERROR "Either CONSTRUCTOR_ARGS_CODE or CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE can be passed when calling ecm_qtdesignerplugin_widget().")
+ endif()
+ if(NOT ARGS_CREATE_WIDGET_CODE_FROM_VARIABLE)
if(NOT ARGS_IMPL_CLASS_NAME)
set(ARGS_IMPL_CLASS_NAME "${ARGS_CLASS_NAME}")
endif()
- if(NOT ARGS_CONSTRUCTOR_ARGS_CODE)
- set(ARGS_CONSTRUCTOR_ARGS_CODE "(parent)")
+ if(ARGS_CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE)
+ set(_constructor_args "${${ARGS_CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE}}")
+ elseif(ARGS_CONSTRUCTOR_ARGS_CODE)
+ set(_constructor_args "${ARGS_CONSTRUCTOR_ARGS_CODE}")
+ else()
+ set(_constructor_args "(parent)")
endif()
- set(ARGS_CREATE_WIDGET_CODE " return new ${ARGS_IMPL_CLASS_NAME}${ARGS_CONSTRUCTOR_ARGS_CODE};")
+ set(_create_widget_code " return new ${ARGS_IMPL_CLASS_NAME}${_constructor_args};")
else()
- _ecm_qtdesignerplugin_unescape_code(ARGS_CREATE_WIDGET_CODE "${ARGS_CREATE_WIDGET_CODE}")
+ set(_create_widget_code "${${ARGS_CREATE_WIDGET_CODE_FROM_VARIABLE}}")
endif()
if(ARGS_ICON)
if (NOT IS_ABSOLUTE ${ARGS_ICON})
@@ -270,9 +283,9 @@ function(ecm_qtdesignerplugin_widget widget)
set(ECM_QTDESIGNERPLUGIN_${widget}_GROUP "${ARGS_GROUP}" PARENT_SCOPE)
set(ECM_QTDESIGNERPLUGIN_${widget}_ICON "${ARGS_ICON}" PARENT_SCOPE)
set(ECM_QTDESIGNERPLUGIN_${widget}_IS_CONTAINER "${_is_container}" PARENT_SCOPE)
- set(ECM_QTDESIGNERPLUGIN_${widget}_CREATE_WIDGET_CODE "${ARGS_CREATE_WIDGET_CODE}" PARENT_SCOPE)
- set(ECM_QTDESIGNERPLUGIN_${widget}_INITIALIZE_CODE "${ARGS_INITIALIZE_CODE}" PARENT_SCOPE)
- set(ECM_QTDESIGNERPLUGIN_${widget}_DOM_XML "${ARGS_DOM_XML}" PARENT_SCOPE)
+ set(ECM_QTDESIGNERPLUGIN_${widget}_CREATE_WIDGET_CODE "${_create_widget_code}" PARENT_SCOPE)
+ set(ECM_QTDESIGNERPLUGIN_${widget}_INITIALIZE_CODE "${${INITIALIZE_CODE_FROM_VARIABLE}}" PARENT_SCOPE)
+ set(ECM_QTDESIGNERPLUGIN_${widget}_DOM_XML "${${ARGS_DOM_XML_FROM_VARIABLE}}" PARENT_SCOPE)
endfunction()
# helper method
@@ -296,7 +309,6 @@ function(_ecm_qtdesignerplugin_write_widget designer_src_file widget default_gro
_ecm_qtdesignerplugin_escape_cpp_string(_group "${_group}")
set(_dom_xml "${ECM_QTDESIGNERPLUGIN_${widget}_DOM_XML}")
if(_dom_xml)
- _ecm_qtdesignerplugin_unescape_code(_dom_xml "${_dom_xml}")
string(REPLACE "\"" "\\\"" _dom_xml "${_dom_xml}")
set(_dom_xml_method " QString domXml() const override { return QStringLiteral(\"${_dom_xml}\"); }")
else()
@@ -318,8 +330,6 @@ function(_ecm_qtdesignerplugin_write_widget designer_src_file widget default_gro
m_initialized = true;"
)
- else()
- _ecm_qtdesignerplugin_unescape_code(_initialize_code "${_initialize_code}")
endif()
# write code