Wizards: Add support for QSharedData.

This commit is contained in:
Friedemann Kleint
2009-12-01 16:17:45 +01:00
parent 0fffad22ad
commit f63fd177f5
3 changed files with 65 additions and 8 deletions

View File

@@ -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();

View File

@@ -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">

View File

@@ -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;
}