diff --git a/src/libs/utils/newclasswidget.h b/src/libs/utils/newclasswidget.h index c8923a3a3edaff2d3759be3ae6d9ae938810fc00..72b8a7fa61f95d0f1af177062ac8b26a88560d3f 100644 --- a/src/libs/utils/newclasswidget.h +++ b/src/libs/utils/newclasswidget.h @@ -77,7 +77,8 @@ class QTCREATOR_UTILS_EXPORT NewClassWidget : public QWidget Q_PROPERTY(QStringList files READ files DESIGNABLE false USER true) Q_ENUMS(ClassType) public: - enum ClassType { NoClassType, ClassInheritsQObject, ClassInheritsQWidget }; + enum ClassType { NoClassType, ClassInheritsQObject, ClassInheritsQWidget, + SharedDataClass }; explicit NewClassWidget(QWidget *parent = 0); ~NewClassWidget(); diff --git a/src/libs/utils/newclasswidget.ui b/src/libs/utils/newclasswidget.ui index 2e725644bc7d9600eedf1d9058f74e3b5501f6ab..92576f3aeec31c3099c46bc95bf075dacd995ca1 100644 --- a/src/libs/utils/newclasswidget.ui +++ b/src/libs/utils/newclasswidget.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>418</width> + <width>431</width> <height>291</height> </rect> </property> @@ -68,6 +68,11 @@ <string>Inherits QWidget</string> </property> </item> + <item> + <property name="text"> + <string>Based on QSharedData</string> + </property> + </item> </widget> </item> <item row="3" column="0"> diff --git a/src/plugins/cppeditor/cppclasswizard.cpp b/src/plugins/cppeditor/cppclasswizard.cpp index 199f56573cec7b8ab31d931ad1d855794c9dc89f..ce9625eecc6e6f2660113f72737b1f5eecbc3b4c 100644 --- a/src/plugins/cppeditor/cppclasswizard.cpp +++ b/src/plugins/cppeditor/cppclasswizard.cpp @@ -262,12 +262,20 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par headerStr << '\n'; Utils::writeIncludeFileDirective(baseClass, true, headerStr); } + if (params.classType == Utils::NewClassWidget::SharedDataClass) { + headerStr << '\n'; + Utils::writeIncludeFileDirective(QLatin1String("QSharedDataPointer"), true, headerStr); + } const QString namespaceIndent = Utils::writeOpeningNameSpaces(namespaceList, QString(), headerStr); + const QString sharedDataClass = unqualifiedClassName + QLatin1String("Data"); + + if (params.classType == Utils::NewClassWidget::SharedDataClass) + headerStr << '\n' << "class " << sharedDataClass << ";\n"; + // Class declaration - headerStr << '\n'; - headerStr << namespaceIndent << "class " << unqualifiedClassName; + headerStr << '\n' << namespaceIndent << "class " << unqualifiedClassName; if (!baseClass.isEmpty()) headerStr << " : public " << baseClass << "\n"; else @@ -284,8 +292,21 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par headerStr << "explicit " << unqualifiedClassName << '(' << parentQObjectClass << " *parent = 0);\n"; } + // Copy/Assignment for shared data classes. + if (params.classType == Utils::NewClassWidget::SharedDataClass) { + headerStr << namespaceIndent << indent + << unqualifiedClassName << "(const " << unqualifiedClassName << "&);\n" + << namespaceIndent << indent + << unqualifiedClassName << "& operator=(const " << unqualifiedClassName << "&);\n" + << namespaceIndent << indent + << '~' << unqualifiedClassName << "();\n"; + } if (defineQObjectMacro) headerStr << '\n' << namespaceIndent << "signals:\n\n" << namespaceIndent << "public slots:\n\n"; + if (params.classType == Utils::NewClassWidget::SharedDataClass) { + headerStr << '\n' << namespaceIndent << "private:\n" + << namespaceIndent << indent << "QSharedDataPointer<" << sharedDataClass << "> data;\n"; + } headerStr << namespaceIndent << "};\n"; Utils::writeClosingNameSpaces(namespaceList, QString(), headerStr); @@ -293,17 +314,29 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par headerStr << '\n'; headerStr << "#endif // "<< guard << '\n'; - // == Source file == QTextStream sourceStr(source); sourceStr << license; Utils::writeIncludeFileDirective(params.headerFile, false, sourceStr); + if (params.classType == Utils::NewClassWidget::SharedDataClass) + Utils::writeIncludeFileDirective(QLatin1String("QSharedData"), true, sourceStr); + Utils::writeOpeningNameSpaces(namespaceList, QString(), sourceStr); + // Private class: + if (params.classType == Utils::NewClassWidget::SharedDataClass) { + sourceStr << '\n' << namespaceIndent << "class " << sharedDataClass + << " : public QSharedData {\n" + << namespaceIndent << "public:\n" + << namespaceIndent << "};\n"; + } // Constructor - sourceStr << '\n' << namespaceIndent ; + sourceStr << '\n' << namespaceIndent; if (parentQObjectClass.isEmpty()) { - sourceStr << unqualifiedClassName << "::" << unqualifiedClassName << "()\n"; + sourceStr << unqualifiedClassName << "::" << unqualifiedClassName << "()"; + if (params.classType == Utils::NewClassWidget::SharedDataClass) + sourceStr << " : data(new " << sharedDataClass << ')'; + sourceStr << '\n'; } else { sourceStr << unqualifiedClassName << "::" << unqualifiedClassName << '(' << parentQObjectClass << " *parent) :\n" @@ -311,7 +344,25 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par } sourceStr << namespaceIndent << "{\n" << namespaceIndent << "}\n"; - + if (params.classType == Utils::NewClassWidget::SharedDataClass) { + // Copy + sourceStr << '\n' << namespaceIndent << unqualifiedClassName << "::" << unqualifiedClassName << "(const " + << unqualifiedClassName << " &rhs) : data(rhs.data)\n" + << namespaceIndent << "{\n" << namespaceIndent << "}\n\n"; + // Assignment + sourceStr << namespaceIndent << unqualifiedClassName << " &" + << unqualifiedClassName << "::operator=(const " << unqualifiedClassName << " &rhs)\n" + << namespaceIndent << "{\n" + << namespaceIndent << indent << "if (this != &rhs)\n" + << namespaceIndent << indent << indent << "data.operator=(rhs.data);\n" + << namespaceIndent << indent << "return *this;\n" + << namespaceIndent << "}\n\n"; + // Destructor + sourceStr << namespaceIndent << unqualifiedClassName << "::~" + << unqualifiedClassName << "()\n" + << namespaceIndent << "{\n" + << namespaceIndent << "}\n"; + } Utils::writeClosingNameSpaces(namespaceList, QString(), sourceStr); return true; }