diff --git a/file_templates/CMakeLists.txt b/file_templates/CMakeLists.txt
--- a/file_templates/CMakeLists.txt
+++ b/file_templates/CMakeLists.txt
@@ -10,6 +10,16 @@
classes/qt_shared
classes/qt_interface
+ kdevelop/kdev_file_template
+ kdevelop/kdev_file_template_options
+ kdevelop/kdev_cpp_class_template
+ kdevelop/kdev_cpp_class_template_options
+
+ kdevelop/kdev_plugin
+ kdevelop/kdev_mainwindowactions
+ kdevelop/kdev_contextmenuextension
+ kdevelop/kdev_projectconfig
+
testing/cpp_cpputest
testing/cpp_gtest
testing/cpp_qtestlib
diff --git a/file_templates/kdevelop/kdev_contextmenuextension/kdev_contextmenuextension.desktop b/file_templates/kdevelop/kdev_contextmenuextension/kdev_contextmenuextension.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_contextmenuextension/kdev_contextmenuextension.desktop
@@ -0,0 +1,18 @@
+[General]
+Name=Plugin Contextmenu Extensions
+Comment=Extends a KDevPlatform plugin with contextmenu extensions
+Category=C++/KDevelop
+Language=C++
+Type=
+Files=Header,Implementation
+OptionsFile=options.kcfg
+
+[Header]
+Name=Header
+File=plugin.h
+OutputFile={{ class_name }}.h
+
+[Implementation]
+Name=Implementation
+File=plugin.cpp
+OutputFile={{ class_name }}.cpp
diff --git a/file_templates/kdevelop/kdev_contextmenuextension/options.kcfg b/file_templates/kdevelop/kdev_contextmenuextension/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_contextmenuextension/options.kcfg
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+ KDevPlugin
+
+
+
+
+
+
+
+
+
+
+ EditorContext
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EditGroup
+
+
+
+ m_action
+
+
+
diff --git a/file_templates/kdevelop/kdev_contextmenuextension/plugin.h b/file_templates/kdevelop/kdev_contextmenuextension/plugin.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_contextmenuextension/plugin.h
@@ -0,0 +1,3 @@
+ // TODO: add to plugin class header
+ KDevelop::ContextMenuExtension contextMenuExtension(KDevelop::Context* context) override;
+
diff --git a/file_templates/kdevelop/kdev_contextmenuextension/plugin.cpp b/file_templates/kdevelop/kdev_contextmenuextension/plugin.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_contextmenuextension/plugin.cpp
@@ -0,0 +1,17 @@
+// TODO: add to plugin class implementation
+#include
+#include
+
+
+KDevelop::ContextMenuExtension {{ class_name }}::contextMenuExtension(KDevelop::Context* context)
+{
+ KDevelop::ContextMenuExtension extension;
+
+
+ if (context->hasType(KDevelop::Context::{{ handled_context }})) {
+ extension.addAction(KDevelop::ContextMenuExtension::{{ menu_group }}, {{ action_member_name }});
+ }
+
+
+ return extension;
+}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template/kdev_cpp_class_template.desktop b/file_templates/kdevelop/kdev_cpp_class_template/kdev_cpp_class_template.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template/kdev_cpp_class_template.desktop
@@ -0,0 +1,23 @@
+[General]
+Name=C++ class template for KDevPlatform
+Comment=A file template for creating C++ class templates
+Category=C++/KDevelop
+Files=HeaderTemplate,ImplementationTemplate,Metadata
+OptionsFile=options.kcfg
+
+[Metadata]
+Name=Template Description
+File=template.desktop
+# TODO: underscores crashes KDevelop, after log: grantlee.template: "Unknown filter: underscores, line 0, "
+#OutputFile={{ name|underscores }}.desktop
+OutputFile={{ name }}.desktop
+
+[HeaderTemplate]
+Name=Header Template
+File=template_class.h
+OutputFile={{ header_template_filename }}
+
+[ImplementationTemplate]
+Name=Implementation Template
+File=template_class.cpp
+OutputFile={{ impl_template_filename }}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template/options.kcfg b/file_templates/kdevelop/kdev_cpp_class_template/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template/options.kcfg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+ C++ Class Template
+
+
+
+
+
+
+
+ C++/X
+
+
+
+ public Foo, public Bar
+
+
+
+
+
+ Header
+
+
+
+ Header
+
+
+
+ class.h
+
+
+
+ {% templatetag openvariable %} name {% templatetag closevariable %}.h
+
+
+
+
+
+ Implementation
+
+
+
+ Implementation
+
+
+
+ class.cpp
+
+
+
+ {% templatetag openvariable %} name {% templatetag closevariable %}.cpp
+
+
+
diff --git a/file_templates/kdevelop/kdev_cpp_class_template/template.desktop b/file_templates/kdevelop/kdev_cpp_class_template/template.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template/template.desktop
@@ -0,0 +1,20 @@
+[General]
+Name={{ name }}
+Comment={{ description }}
+Category={{ category }}
+Language=C++
+Type=Class
+BaseClasses={{ base_classes }}
+Files={{ header_template_id }},{{ impl_template_id }}
+
+
+[{{ header_template_id }}]
+Name={{ header_template_name }}
+File={{ header_template_filename }}
+OutputFile={{ header_template_output_filename }}
+
+
+[{{ impl_template_id }}]
+Name={{ impl_template_name }}
+File={{ impl_template_filename }}
+OutputFile={{ impl_template_output_filename }}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template/template_class.h b/file_templates/kdevelop/kdev_cpp_class_template/template_class.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template/template_class.h
@@ -0,0 +1,2 @@
+{% templatetag openblock %} extends "cpp_header.h" {% templatetag closeblock %}
+{% templatetag openblock %} load kdev_filters {% templatetag closeblock %}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template/template_class.cpp b/file_templates/kdevelop/kdev_cpp_class_template/template_class.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template/template_class.cpp
@@ -0,0 +1,2 @@
+{% templatetag openblock %} extends "cpp_implementation.cpp" {% templatetag closeblock %}
+{% templatetag openblock %} load kdev_filters {% templatetag closeblock %}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template_options/kdev_cpp_class_template_options.desktop b/file_templates/kdevelop/kdev_cpp_class_template_options/kdev_cpp_class_template_options.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template_options/kdev_cpp_class_template_options.desktop
@@ -0,0 +1,28 @@
+[General]
+Name=C++ class template with options for KDevPlatform
+Comment=A file template for creating C++ class templates with options
+Category=C++/KDevelop
+Files=HeaderTemplate,ImplementationTemplate,Options,Metadata
+OptionsFile=options.kcfg
+
+[Metadata]
+Name=Template Description
+File=template.desktop
+# TODO: underscores crashes KDevelop, after log: grantlee.template: "Unknown filter: underscores, line 0, "
+#OutputFile={{ name|underscores }}.desktop
+OutputFile={{ name }}.desktop
+
+[Options]
+Name=Options
+File=template.kcfg
+OutputFile=options.kcfg
+
+[HeaderTemplate]
+Name=Header Template
+File=template_class.h
+OutputFile={{ header_template_filename }}
+
+[ImplementationTemplate]
+Name=Implementation Template
+File=template_class.cpp
+OutputFile={{ impl_template_filename }}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template_options/options.kcfg b/file_templates/kdevelop/kdev_cpp_class_template_options/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template_options/options.kcfg
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+ C++ Class Template
+
+
+
+
+
+
+
+ C++/X
+
+
+
+ public Foo, public Bar
+
+
+
+
+
+ Header
+
+
+
+ Header
+
+
+
+ class.h
+
+
+
+ {% templatetag openvariable %} name {% templatetag closevariable %}.h
+
+
+
+
+
+ Implementation
+
+
+
+ Implementation
+
+
+
+ class.cpp
+
+
+
+ {% templatetag openvariable %} name {% templatetag closevariable %}.cpp
+
+
+
+
+
+ Options
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
diff --git a/file_templates/kdevelop/kdev_cpp_class_template_options/template.desktop b/file_templates/kdevelop/kdev_cpp_class_template_options/template.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template_options/template.desktop
@@ -0,0 +1,21 @@
+[General]
+Name={{ name }}
+Comment={{ description }}
+Category={{ category }}
+Language=C++
+Type=Class
+BaseClasses={{ base_classes }}
+Files={{ header_template_id }},{{ impl_template_id }}
+OptionsFile={{ output_file_options }}
+
+
+[{{ header_template_id }}]
+Name={{ header_template_name }}
+File={{ header_template_filename }}
+OutputFile={{ header_template_output_filename }}
+
+
+[{{ impl_template_id }}]
+Name={{ impl_template_name }}
+File={{ impl_template_filename }}
+OutputFile={{ impl_template_output_filename }}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template_options/template.kcfg b/file_templates/kdevelop/kdev_cpp_class_template_options/template.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template_options/template.kcfg
@@ -0,0 +1,32 @@
+
+
+
+
+ {% if add_bool_sample %}
+
+
+ true
+
+ {% endif %}
+ {% if add_string_sample %}
+
+
+ Some text
+
+ {% endif %}
+ {% if add_enum_sample %}
+
+
+
+
+
+
+
+ First
+
+ {% endif %}
+
+
diff --git a/file_templates/kdevelop/kdev_cpp_class_template_options/template_class.h b/file_templates/kdevelop/kdev_cpp_class_template_options/template_class.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template_options/template_class.h
@@ -0,0 +1,2 @@
+{% templatetag openblock %} extends "cpp_header.h" {% templatetag closeblock %}
+{% templatetag openblock %} load kdev_filters {% templatetag closeblock %}
diff --git a/file_templates/kdevelop/kdev_cpp_class_template_options/template_class.cpp b/file_templates/kdevelop/kdev_cpp_class_template_options/template_class.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_cpp_class_template_options/template_class.cpp
@@ -0,0 +1,2 @@
+{% templatetag openblock %} extends "cpp_implementation.cpp" {% templatetag closeblock %}
+{% templatetag openblock %} load kdev_filters {% templatetag closeblock %}
diff --git a/file_templates/kdevelop/kdev_file_template/kdev_file_template.desktop b/file_templates/kdevelop/kdev_file_template/kdev_file_template.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template/kdev_file_template.desktop
@@ -0,0 +1,18 @@
+[General]
+Name=Simple file template for KDevPlatform
+Comment=A file template for creating other file templates
+Category=C++/KDevelop
+Files=Metadata,Template
+OptionsFile=options.kcfg
+
+[Metadata]
+Name=Template Description
+File=template.desktop
+# TODO: underscores crashes KDevelop, after log: grantlee.template: "Unknown filter: underscores, line 0, "
+#OutputFile={{ name|underscores }}.desktop
+OutputFile={{ name }}.desktop
+
+[Template]
+Name=Template
+File=template_template.txt
+OutputFile={{ template_filename }}
diff --git a/file_templates/kdevelop/kdev_file_template/options.kcfg b/file_templates/kdevelop/kdev_file_template/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template/options.kcfg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ Template
+
+
+
+
+
+
+
+ Foo/Bar
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Template
+
+
+
+ Template
+
+
+
+ template.txt
+
+
+
+ output.txt
+
+
+
diff --git a/file_templates/kdevelop/kdev_file_template/template.desktop b/file_templates/kdevelop/kdev_file_template/template.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template/template.desktop
@@ -0,0 +1,17 @@
+[General]
+Name={{ name }}
+Comment={{ description }}
+Category={{ category }}
+{% if language %}
+Language={{ language }}
+{% endif %}
+{% if type %}
+Type={{ type }}
+{% endif %}
+Files={{ template_id }}
+
+
+[{{ template_id }}]
+Name={{ template_name }}
+File={{ template_filename }}
+OutputFile={{ template_output_filename }}
diff --git a/file_templates/kdevelop/kdev_file_template/template_template.txt b/file_templates/kdevelop/kdev_file_template/template_template.txt
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template/template_template.txt
@@ -0,0 +1,4 @@
+Template
+
+
+Name: {% templatetag openvariable %} name {% templatetag closevariable %}
diff --git a/file_templates/kdevelop/kdev_file_template_options/kdev_file_template_options.desktop b/file_templates/kdevelop/kdev_file_template_options/kdev_file_template_options.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template_options/kdev_file_template_options.desktop
@@ -0,0 +1,23 @@
+[General]
+Name=A simple file template for KDevPlatform with options
+Comment=A file template with options for creating other file templates
+Category=C++/KDevelop
+Files=Metadata,Options,Template
+OptionsFile=options.kcfg
+
+[Metadata]
+Name=Template Description
+File=template.desktop
+# TODO: underscores crashes KDevelop, after log: grantlee.template: "Unknown filter: underscores, line 0, "
+#OutputFile={{ name|underscores }}.desktop
+OutputFile={{ name }}.desktop
+
+[Options]
+Name=Options
+File=template.kcfg
+OutputFile=options.kcfg
+
+[Template]
+Name=Template
+File=template_template.txt
+OutputFile={{ template_filename }}
diff --git a/file_templates/kdevelop/kdev_file_template_options/options.kcfg b/file_templates/kdevelop/kdev_file_template_options/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template_options/options.kcfg
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+ Template
+
+
+
+
+
+
+
+ Foo/Bar
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Options
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
+
+
+ Template
+
+
+
+ Template
+
+
+
+ template.txt
+
+
+
+ output.txt
+
+
+
diff --git a/file_templates/kdevelop/kdev_file_template_options/template.desktop b/file_templates/kdevelop/kdev_file_template_options/template.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template_options/template.desktop
@@ -0,0 +1,18 @@
+[General]
+Name={{ name }}
+Comment={{ description }}
+Category={{ category }}
+{% if language %}
+Language={{ language }}
+{% endif %}
+{% if type %}
+Type={{ type }}
+{% endif %}
+Files={{ template_id }}
+OptionsFile={{ output_file_options }}
+
+
+[{{ template_id }}]
+Name={{ template_name }}
+File={{ template_filename }}
+OutputFile={{ template_output_filename }}
diff --git a/file_templates/kdevelop/kdev_file_template_options/template.kcfg b/file_templates/kdevelop/kdev_file_template_options/template.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template_options/template.kcfg
@@ -0,0 +1,32 @@
+
+
+
+
+ {% if add_bool_sample %}
+
+
+ true
+
+ {% endif %}
+ {% if add_string_sample %}
+
+
+ Some text
+
+ {% endif %}
+ {% if add_enum_sample %}
+
+
+
+
+
+
+
+ First
+
+ {% endif %}
+
+
diff --git a/file_templates/kdevelop/kdev_file_template_options/template_template.txt b/file_templates/kdevelop/kdev_file_template_options/template_template.txt
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_file_template_options/template_template.txt
@@ -0,0 +1,15 @@
+Template
+
+
+Name: {% templatetag openvariable %} name {% templatetag closevariable %}
+
+
+{% if add_bool_sample %}
+Bool option: "{% templatetag openblock %} if bool_option {% templatetag closeblock %}true{% templatetag openblock %} else {% templatetag closeblock %}false{% templatetag openblock %} endif {% templatetag closeblock %}"
+{% endif %}
+{% if add_string_sample %}
+String option: "{% templatetag openvariable %} string_option {% templatetag closevariable %}"
+{% endif %}
+{% if add_enum_sample %}
+Enum option: "{% templatetag openvariable %} enum_option {% templatetag closevariable %}"
+{% endif %}
diff --git a/file_templates/kdevelop/kdev_mainwindowactions/CMakeLists.txt b/file_templates/kdevelop/kdev_mainwindowactions/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_mainwindowactions/CMakeLists.txt
@@ -0,0 +1 @@
+install(FILES {{ output_file_rc }} DESTINATION ${KXMLGUI_INSTALL_DIR}/{{ plugin_id }})
diff --git a/file_templates/kdevelop/kdev_mainwindowactions/kdev_mainwindowactions.desktop b/file_templates/kdevelop/kdev_mainwindowactions/kdev_mainwindowactions.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_mainwindowactions/kdev_mainwindowactions.desktop
@@ -0,0 +1,28 @@
+[General]
+Name=Plugin Mainwindow Actions
+Comment=Extends a KDevPlatform plugin with actions in the mainwindow
+Category=C++/KDevelop
+Language=C++
+Type=
+Files=Header,Implementation,RC,CMake
+OptionsFile=options.kcfg
+
+[Header]
+Name=Header
+File=plugin.h
+OutputFile={{ class_name }}.h
+
+[Implementation]
+Name=Implementation
+File=plugin.cpp
+OutputFile={{ class_name }}.cpp
+
+[RC]
+Name=KXmlGui RC
+File=template.rc
+OutputFile={{ plugin_file_basename }}ui.rc
+
+[CMake]
+Name=CMakeLists.txt
+File=CMakeLists.txt
+OutputFile=CMakeLists.txt
diff --git a/file_templates/kdevelop/kdev_mainwindowactions/options.kcfg b/file_templates/kdevelop/kdev_mainwindowactions/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_mainwindowactions/options.kcfg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ KDevPlugin
+
+
+
+ kdevplugin
+
+
+
+ kdevplugin
+
+
+
+ onAction
+
+
+
+
+
+ edit
+
+
+
+
+
+
+
+ do_action
+
+
+
+ Do Action
+
+
+
+
+
+ false
+
+
+
+ mainToolBar
+
+
+
+
+
+
+
diff --git a/file_templates/kdevelop/kdev_mainwindowactions/plugin.h b/file_templates/kdevelop/kdev_mainwindowactions/plugin.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_mainwindowactions/plugin.h
@@ -0,0 +1,5 @@
+ // TODO: add to plugin class header
+ void createActionsForMainWindow(Sublime::MainWindow* window, QString& xmlFile, KActionCollection& actions) override;
+
+
+ void {{ handler_method_name }}();
diff --git a/file_templates/kdevelop/kdev_mainwindowactions/plugin.cpp b/file_templates/kdevelop/kdev_mainwindowactions/plugin.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_mainwindowactions/plugin.cpp
@@ -0,0 +1,17 @@
+// TODO: add to plugin class implementation
+void {{ class_name }}::createActionsForMainWindow(Sublime::MainWindow* window, QString& xmlFile, KActionCollection& actions)
+{
+ xmlFile = QStringLiteral("{{ output_file_rc }}");
+
+
+ QAction* action = actions.addAction(QStringLiteral("{{ action_id }}"));
+ action->setText(i18n("{{ action_text }}"));
+ connect(action, &QAction::triggered, this, &{{ class_name }}::{{ handler_method_name }});
+}
+
+
+void {{ class_name }}::{{ handler_method_name }}()
+{
+
+
+}
diff --git a/file_templates/kdevelop/kdev_mainwindowactions/template.rc b/file_templates/kdevelop/kdev_mainwindowactions/template.rc
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_mainwindowactions/template.rc
@@ -0,0 +1,21 @@
+
+
+
+
+{% if toolbar %}
+
+
+
+{% if toolbar_title %}
+ {{ toolbar_title }}
+{% endif %}
+
+
+
+{% endif %}
+
diff --git a/file_templates/kdevelop/kdev_plugin/CMakeLists.txt b/file_templates/kdevelop/kdev_plugin/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/CMakeLists.txt
@@ -0,0 +1,20 @@
+add_definitions(-DTRANSLATION_DOMAIN=\"{{ plugin_basename|lower }}\")
+
+
+set({{ plugin_basename }}_SRCS
+ {# hack: grantlee on a line with just whitespace and var drops any whitespace/linebreaks since the last output #}
+
+
+ {{ " "|add:output_file_implementation }}
+)
+
+
+kdevplatform_add_plugin({{ plugin_basename }}
+ JSON {{ output_file_metadata }}
+ SOURCES ${% templatetag openbrace %}{{ plugin_basename }}_SRCS{% templatetag closebrace %}
+)
+
+
+target_link_libraries({{ plugin_basename }}
+ KDev::Interfaces
+)
diff --git a/file_templates/kdevelop/kdev_plugin/Messages.sh.in b/file_templates/kdevelop/kdev_plugin/Messages.sh.in
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/Messages.sh.in
@@ -0,0 +1,4 @@
+#!/bin/sh
+$EXTRACTRC `find . -name \*.rc` `find . -name \*.ui` >> rc.cpp
+$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h` -o $podir/{{ plugin_basename|lower }}.pot
+rm -f rc.cpp
diff --git a/file_templates/kdevelop/kdev_plugin/class.h b/file_templates/kdevelop/kdev_plugin/class.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/class.h
@@ -0,0 +1,87 @@
+{% extends "cpp_header.h" %}
+{% load kdev_filters %}
+
+{% block includes %}
+{{ block.super }}
+{% if not base_classes %}
+#include
+{% endif %}
+{% endblock includes %}
+
+{% block class_declaration_open %}
+{% if base_classes %}
+{{ block.super }}
+{% else %}
+{% include "class_declaration_apidox_cpp.txt" %}
+class {{ name }} : public KDevelop::IPlugin
+{
+{% endif %}
+{% endblock class_declaration_open %}
+
+{% block class_body %}
+ Q_OBJECT
+
+
+public:
+ /**
+ * Constructor with arguments as needed with KPluginFactory
+ *
+ * @param parent
+ * @param args
+ */
+ {{ name }}(QObject* parent, const QVariantList& args);
+
+ ~{{ name }}() override;
+
+ {% for method in public_functions %}
+ {% if not method.isConstructor and not method.isDestructor %}
+
+ {% include "class_method_declaration_apidox_cpp.txt" %}
+ {% include "class_method_declaration_cpp.txt" %}
+
+ {% endif %}
+ {% endfor %}
+
+ {% for property in members %}
+
+ {% include "class_property_getter_declaration_apidox_cpp.txt" %}
+ {% include "class_property_getter_declaration_cpp.txt" %}
+
+ {% endfor %}
+
+
+{% if members %}
+public Q_SLOTS:
+ {% for property in members %}
+
+ {% include "class_property_setter_declaration_apidox_cpp.txt" %}
+ {% include "class_property_setter_declaration_cpp.txt" %}
+
+ {% endfor %}
+
+{% endif %}
+
+
+{% if protected_functions %}
+protected:
+ {% for method in protected_functions %}
+
+ {% include "class_method_declaration_apidox_cpp.txt" %}
+ {% include "class_method_declaration_cpp.txt" %}
+
+ {% endfor %}
+{% endif %}
+
+
+private:
+ {% for method in private_functions %}
+
+ {% include "class_method_declaration_apidox_cpp.txt" %}
+ {% include "class_method_declaration_cpp.txt" %}
+
+ {% endfor %}
+
+ {% for property in members %}
+ {{property.type}} m_{{property.name}};
+ {% endfor %}
+{% endblock class_body %}
diff --git a/file_templates/kdevelop/kdev_plugin/class.cpp b/file_templates/kdevelop/kdev_plugin/class.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/class.cpp
@@ -0,0 +1,101 @@
+{% extends "cpp_implementation.cpp" %}
+{% load kdev_filters %}
+
+{% block includes %}
+#include "{{ output_file_header }}"
+
+
+#include
+{% endblock includes %}
+
+{% block extra_definitions %}
+K_PLUGIN_FACTORY_WITH_JSON({{ name }}Factory, "{{ output_file_metadata }}", registerPlugin<{{ name }}>();)
+
+{% for method in private_functions %}
+{% if not method.isConstructor and not method.isDestructor %}
+{% with method.arguments as arguments %}
+
+{% include "method_definition_cpp.txt" %}
+{
+
+ {% if method.type %}
+ return {{ method.default_return_value }};
+ {% endif %}
+
+}
+
+{% endwith %}
+{% endif %}
+{% endfor %}
+
+{% endblock extra_definitions %}
+
+{% block function_definitions %}
+
+{{ name }}::{{ name }}(QObject *parent, const QVariantList& args)
+ : KDevelop::IPlugin(QStringLiteral("{{ plugin_basename|lower }}"), parent)
+{
+ Q_UNUSED(args);
+
+
+}
+
+{{ name }}::~{{ name }}() = default;
+
+
+{% for method in public_functions %}
+{% if not method.isConstructor and not method.isDestructor %}
+{% with method.arguments as arguments %}
+
+{% include "method_definition_cpp.txt" %}
+{
+
+ {% if method.type %}
+ return {{ method.default_return_value }};
+ {% endif %}
+
+}
+
+{% endwith %}
+{% endif %}
+{% endfor %}
+
+{% for method in protected_functions %}
+{% if not method.isConstructor and not method.isDestructor %}
+{% with method.arguments as arguments %}
+
+{% include "method_definition_cpp.txt" %}
+{
+
+ {% if method.type %}
+ return {{ method.default_return_value }};
+ {% endif %}
+
+}
+
+{% endwith %}
+{% endif %}
+{% endfor %}
+
+{% for property in members %}
+
+
+{% include "class_property_getter_definition_cpp.txt" %}
+{
+ return m_{{ property.name }};
+}
+
+
+{% include "class_property_setter_definition_cpp.txt" %}
+{
+ m_{{ property.name }} = {{ property.name }};
+}
+
+{% endfor %}
+
+{% endblock function_definitions %}
+
+{% block bottom %}
+// needed for QObject class created from K_PLUGIN_FACTORY_WITH_JSON
+#include "{{ output_file_implementation|cut:".cpp" }}.moc"
+{% endblock bottom %}
diff --git a/file_templates/kdevelop/kdev_plugin/kdev_plugin.desktop b/file_templates/kdevelop/kdev_plugin/kdev_plugin.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/kdev_plugin.desktop
@@ -0,0 +1,34 @@
+[General]
+Name=Plugin
+Comment=
+Category=C++/KDevelop
+Language=C++
+Type=Class
+BaseClasses=public KDevelop::IPlugin
+Files=Header,Implementation,Metadata,CMake,Messages
+OptionsFile=options.kcfg
+
+[Header]
+Name=Header
+File=class.h
+OutputFile={{ name|lower }}.h
+
+[Implementation]
+Name=Implementation
+File=class.cpp
+OutputFile={{ name|lower }}.cpp
+
+[Metadata]
+Name=Metadata
+File=plugin.json.in
+OutputFile={{ name|lower }}.json
+
+[CMake]
+Name=CMakeLists.txt
+File=CMakeLists.txt
+OutputFile=CMakeLists.txt
+
+[Messages]
+Name=Messages.sh
+File=Messages.sh.in
+OutputFile=Messages.sh
diff --git a/file_templates/kdevelop/kdev_plugin/options.kcfg b/file_templates/kdevelop/kdev_plugin/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/options.kcfg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ {{ name }}
+
+
+
+
+
+
+
+ plugins
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Utilities
+
+
+
+
+
+ {{ name|lower }}
+
+
+
diff --git a/file_templates/kdevelop/kdev_plugin/plugin.json.in b/file_templates/kdevelop/kdev_plugin/plugin.json.in
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_plugin/plugin.json.in
@@ -0,0 +1,27 @@
+{% templatetag openbrace %}
+ "KPlugin": {% templatetag openbrace %}
+ "Id": "{{ plugin_basename }}",
+ "Name": "{{ plugin_name }}",
+ "Description": "{{ plugin_description }}",
+ {% if plugin_icon_name %}
+ "Icon": "{{ plugin_icon_name }}",
+ {% endif %}
+ {% if plugin_category %}
+ "Category": "{{ plugin_category }}",
+ {% endif %}
+ {% if author_name %}
+ "Authors": [
+ {% templatetag openbrace %}
+ "Name": "{{ author_name }}",
+ "Email": "{{ author_emailaddress }}"
+ {% templatetag closebrace %}
+ ],
+ {% endif %}
+ "ServiceTypes": [
+ "KDevelop/Plugin"
+ ]
+ {% templatetag closebrace %},
+ "X-KDevelop-Category": "Global",
+ "X-KDevelop-Mode": "GUI"
+
+{% templatetag closebrace %}
diff --git a/file_templates/kdevelop/kdev_projectconfig/CMakeLists.txt b/file_templates/kdevelop/kdev_projectconfig/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/CMakeLists.txt
@@ -0,0 +1,30 @@
+set({{ plugin_base_name }}_CONFIG_SRCS
+ {# hack: grantlee on a line with just whitespace and var drop any whitespace/linebreaks since the last output #}
+
+
+ {{ " "|add:output_file_implementation }}
+)
+
+
+ki18n_wrap_ui({{ plugin_base_name }}_CONFIG_SRCS
+ {# hack: grantlee on a line with just whitespace and var drops any whitespace/linebreaks since the last output #}
+
+
+ {{ " "|add:output_file_ui }}
+)
+
+
+kconfig_add_kcfg_files({{ plugin_base_name }}_CONFIG_SRCS
+ {# hack: grantlee on a line with just whitespace and var drops any whitespace/linebreaks since the last output #}
+
+
+ {{ " "|add:output_file_kcfgc }}
+)
+
+
+# TODO: add ${% templatetag openbrace %}{{ plugin_base_name }}_CONFIG_SRCS{% templatetag closebrace %} to plugin sources
+
+
+target_link_libraries({{ plugin_base_name }}
+ KDev::Project
+)
diff --git a/file_templates/kdevelop/kdev_projectconfig/kdev_projectconfig.desktop b/file_templates/kdevelop/kdev_projectconfig/kdev_projectconfig.desktop
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/kdev_projectconfig.desktop
@@ -0,0 +1,49 @@
+[General]
+Name=Plugin Project Configuration
+Comment=Extends a KDevPlatform plugin with project configuration
+Category=C++/KDevelop
+Language=C++
+Type=Class
+BaseClasses=public KDevelop::ConfigPage
+Files=Header,Implementation,UI,KCFG,KCFGC,CMake,PluginHeader,PluginImplementation
+OptionsFile=options.kcfg
+
+[Header]
+Name=Header
+File=projectconfigpage.h
+OutputFile=projectconfigpage.h
+
+[Implementation]
+Name=Implementation
+File=projectconfigpage.cpp
+OutputFile=projectconfigpage.cpp
+
+[UI]
+Name=User Interface
+File=projectconfigpage.ui
+OutputFile=projectconfigpage.ui
+
+[KCFG]
+Name=Configuration options
+File=projectconfig.kcfg
+OutputFile=projectconfig.kcfg
+
+[KCFGC]
+Name=Configuration code options
+File=projectconfig.kcfgc
+OutputFile=projectconfig.kcfgc
+
+[CMake]
+Name=CMakeLists.txt
+File=CMakeLists.txt
+OutputFile=CMakeLists.txt
+
+[PluginHeader]
+Name=Plugin Header
+File=plugin.h
+OutputFile={{ plugin_class_name|lower }}.h
+
+[PluginImplementation]
+Name=Plugin Implementation
+File=plugin.cpp
+OutputFile={{ plugin_class_name|lower }}.cpp
diff --git a/file_templates/kdevelop/kdev_projectconfig/options.kcfg b/file_templates/kdevelop/kdev_projectconfig/options.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/options.kcfg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ Plugin
+
+
+
+ plugins
+
+
+
+
+
+ ProjectConfig
+
+
+
+ kdevplugin
+
+
+
+ KDevPlugin
+
+
+
+
+
+ Plugin
+
+
+
+ true
+
+
+
+ true
+
+
+
+ true
+
+
+
diff --git a/file_templates/kdevelop/kdev_projectconfig/plugin.h b/file_templates/kdevelop/kdev_projectconfig/plugin.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/plugin.h
@@ -0,0 +1,3 @@
+ // TODO: add to plugin class header
+ int perProjectConfigPages() const override;
+ KDevelop::ConfigPage* perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options, QWidget* parent) override;
diff --git a/file_templates/kdevelop/kdev_projectconfig/plugin.cpp b/file_templates/kdevelop/kdev_projectconfig/plugin.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/plugin.cpp
@@ -0,0 +1,22 @@
+// TODO: add to plugin class implementation
+#include "{{ output_file_header }}"
+
+
+#include
+
+
+int {{ plugin_class_name }}::perProjectConfigPages() const
+{
+ return 1;
+}
+
+
+KDevelop::ConfigPage* {{ plugin_class_name }}::perProjectConfigPage(int number, const KDevelop::ProjectConfigOptions& options, QWidget* parent)
+{
+ if (number != 0) {
+ return nullptr;
+ }
+
+
+ return new {% if namespaces %}{{ namespaces|join:"::" }}::{% endif %}{{ name }}(this, options.project, parent);
+}
diff --git a/file_templates/kdevelop/kdev_projectconfig/projectconfig.kcfg b/file_templates/kdevelop/kdev_projectconfig/projectconfig.kcfg
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/projectconfig.kcfg
@@ -0,0 +1,28 @@
+
+
+
+{% if add_bool_sample %}
+
+ true
+
+{% endif %}
+{% if add_string_sample %}
+
+ Some text
+
+{% endif %}
+{% if add_enum_sample %}
+
+
+
+
+
+
+ First
+
+{% endif %}
+
+
diff --git a/file_templates/kdevelop/kdev_projectconfig/projectconfig.kcfgc b/file_templates/kdevelop/kdev_projectconfig/projectconfig.kcfgc
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/projectconfig.kcfgc
@@ -0,0 +1,3 @@
+File={{ output_file_kcfg }}
+NameSpace={% for ns in namespaces %}{{ ns }}{% if not forloop.last %}::{% endif %}{% endfor %}
+ClassName={{ config_class_name }}
diff --git a/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.h b/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.h
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.h
@@ -0,0 +1,102 @@
+{% extends "cpp_header.h" %}
+{% load kdev_filters %}
+
+{% block includes %}
+{{ block.super }}
+{% if not base_classes %}
+#include
+{% endif %}
+
+
+namespace KDevelop
+{
+class IProject;
+}
+{% endblock includes %}
+
+{% block forward_declarations %}
+namespace Ui
+{
+class {{ name }};
+}
+{% endblock forward_declarations %}
+
+
+{% block class_declaration_open %}
+{% if base_classes %}
+{{ block.super }}
+{% else %}
+{% include "class_declaration_apidox_cpp.txt" %}
+class {{ name }} : public KDevelop::ConfigPage
+{
+{% endif %}
+{% endblock class_declaration_open %}
+
+{% block class_body %}
+ Q_OBJECT
+
+
+public:
+ /**
+ * Constructor
+ *
+ * @param plugin
+ * @param project
+ * @param parent
+ */
+ {{ name }}(KDevelop::IPlugin* plugin, KDevelop::IProject* project, QWidget* parent);
+ ~{{ name }}() override;
+
+ {% for method in public_functions %}
+ {% if not method.isConstructor and not method.isDestructor %}
+
+ {% include "class_method_declaration_apidox_cpp.txt" %}
+ {% include "class_method_declaration_cpp.txt" %}
+
+ {% endif %}
+ {% endfor %}
+
+ {% for property in members %}
+
+ {% include "class_property_getter_declaration_apidox_cpp.txt" %}
+ {% include "class_property_getter_declaration_cpp.txt" %}
+
+ {% endfor %}
+
+
+{% if members %}
+public Q_SLOTS:
+ {% for property in members %}
+
+ {% include "class_property_setter_declaration_apidox_cpp.txt" %}
+ {% include "class_property_setter_declaration_cpp.txt" %}
+
+ {% endfor %}
+
+{% endif %}
+
+
+{% if protected_functions %}
+protected:
+ {% for method in protected_functions %}
+
+ {% include "class_method_declaration_apidox_cpp.txt" %}
+ {% include "class_method_declaration_cpp.txt" %}
+
+ {% endfor %}
+{% endif %}
+
+
+private:
+ {% for method in private_functions %}
+
+ {% include "class_method_declaration_apidox_cpp.txt" %}
+ {% include "class_method_declaration_cpp.txt" %}
+
+ {% endfor %}
+
+ {% for property in members %}
+ {{property.type}} m_{{property.name}};
+ {% endfor %}
+ QScopedPointer ui;
+{% endblock class_body %}
diff --git a/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.cpp b/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.cpp
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.cpp
@@ -0,0 +1,118 @@
+{% extends "cpp_implementation.cpp" %}
+{% load kdev_filters %}
+
+{% block includes %}
+#include "{{ output_file_header }}"
+#include "ui_{{ output_file_ui|cut:".ui" }}.h"
+
+
+#include "{{ config_class_name|lower }}.h"
+
+
+#include
+{% endblock includes %}
+
+{% block extra_definitions %}
+
+{% for method in private_functions %}
+{% if not method.isConstructor and not method.isDestructor %}
+{% with method.arguments as arguments %}
+
+{% include "method_definition_cpp.txt" %}
+{
+
+ {% if method.name == "icon" %}
+ return QIcon::fromTheme(QStringLiteral("{{ page_icon_name }}"));
+ {% elif method.name == "name" %}
+ return i18n("{{ page_name }}");
+ {% elif method.type %}
+ return {{ method.default_return_value }};
+ {% endif %}
+
+}
+
+{% endwith %}
+{% endif %}
+{% endfor %}
+
+{% endblock extra_definitions %}
+
+{% block function_definitions %}
+
+{{ name }}::{{ name }}(KDevelop::IPlugin* plugin, KDevelop::IProject* project, QWidget* parent)
+ : ConfigPage(plugin, new {{ config_class_name }}, parent)
+ , ui(new Ui::{{ name }})
+{
+ configSkeleton()->setSharedConfig(project->projectConfiguration());
+ configSkeleton()->load();
+
+
+ ui->setupUi(this);
+}
+
+
+{{ name }}::~{{ name }}() = default;
+
+
+{% for method in public_functions %}
+{% if not method.isConstructor and not method.isDestructor %}
+{% with method.arguments as arguments %}
+
+{% include "method_definition_cpp.txt" %}
+{
+
+ {% if method.name == "icon" %}
+ return QIcon::fromTheme(QStringLiteral("{{ page_icon_name }}"));
+ {% elif method.name == "name" %}
+ return i18n("{{ page_name }}");
+ {% elif method.type %}
+ return {{ method.default_return_value }};
+ {% endif %}
+
+}
+
+{% endwith %}
+{% endif %}
+{% endfor %}
+
+{% for method in protected_functions %}
+{% if not method.isConstructor and not method.isDestructor %}
+{% with method.arguments as arguments %}
+
+{% include "method_definition_cpp.txt" %}
+{
+
+ {% if method.name == "icon" %}
+ return QIcon::fromTheme(QStringLiteral("{{ page_icon_name }}"));
+ {% elif method.name == "name" %}
+ return i18n("{{ page_name }}");
+ {% elif method.type %}
+ return {{ method.default_return_value }};
+ {% endif %}
+
+}
+
+{% endwith %}
+{% endif %}
+{% endfor %}
+
+{% for property in members %}
+
+
+{% include "class_property_getter_definition_cpp.txt" %}
+{
+ return m_{{ property.name }};
+}
+
+
+{% include "class_property_setter_definition_cpp.txt" %}
+{
+ m_{{ property.name }} = {{ property.name }};
+}
+
+{% endfor %}
+
+{% endblock function_definitions %}
+
+{% block bottom %}
+{% endblock bottom %}
diff --git a/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.ui b/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.ui
new file mode 100644
--- /dev/null
+++ b/file_templates/kdevelop/kdev_projectconfig/projectconfigpage.ui
@@ -0,0 +1,62 @@
+
+
+ {% for ns in namespaces %}{{ ns }}::{% endfor %}{{ name }}
+
+
+
+ 0
+
+{% if add_bool_sample %}
+ -
+
+
+ Bool option:
+
+
+ kcfg_boolOption
+
+
+
+ -
+
+
+
+
+
+
+{% endif %}
+{% if add_string_sample %}
+ -
+
+
+ String option:
+
+
+ kcfg_stringOption
+
+
+
+ -
+
+
+{% endif %}
+{% if add_enum_sample %}
+ -
+
+
+ Enum option:
+
+
+ kcfg_enumOption
+
+
+
+ -
+
+
+ {% endif %}
+
+
+
+
+
diff --git a/file_templates/testing/cpp_qtestlib_kdevelop/CMakeLists.txt b/file_templates/testing/cpp_qtestlib_kdevelop/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/file_templates/testing/cpp_qtestlib_kdevelop/CMakeLists.txt
@@ -0,0 +1,4 @@
+ecm_add_test({{ output_file_implementation }}
+ LINK_LIBRARIES
+ KDev::Tests
+)
diff --git a/file_templates/testing/cpp_qtestlib_kdevelop/cpp_qtestlib_kdevelop.desktop b/file_templates/testing/cpp_qtestlib_kdevelop/cpp_qtestlib_kdevelop.desktop
--- a/file_templates/testing/cpp_qtestlib_kdevelop/cpp_qtestlib_kdevelop.desktop
+++ b/file_templates/testing/cpp_qtestlib_kdevelop/cpp_qtestlib_kdevelop.desktop
@@ -98,7 +98,7 @@
Language[zh_CN]=C++
Language[zh_TW]=C++
Type=Test
-Files=Header,Implementation
+Files=Header,Implementation,CMake
OptionsFile=options.kcfg
[Header]
@@ -174,3 +174,7 @@
File=class.cpp
OutputFile={{ name }}.cpp
+[CMake]
+Name=CMakeLists.txt
+File=CMakeLists.txt
+OutputFile=CMakeLists.txt