115 typeHash["typedef"] = Node::Typedef; |
115 typeHash["typedef"] = Node::Typedef; |
116 typeHash["function"] = Node::Function; |
116 typeHash["function"] = Node::Function; |
117 typeHash["property"] = Node::Property; |
117 typeHash["property"] = Node::Property; |
118 typeHash["variable"] = Node::Variable; |
118 typeHash["variable"] = Node::Variable; |
119 typeHash["target"] = Node::Target; |
119 typeHash["target"] = Node::Target; |
|
120 #ifdef QDOC_QML |
|
121 typeHash["qmlproperty"] = Node::QmlProperty; |
|
122 typeHash["qmlsignal"] = Node::QmlSignal; |
|
123 typeHash["qmlmethod"] = Node::QmlMethod; |
|
124 #endif |
120 |
125 |
121 QHash<QString, Node::SubType> subTypeHash; |
126 QHash<QString, Node::SubType> subTypeHash; |
122 subTypeHash["example"] = Node::Example; |
127 subTypeHash["example"] = Node::Example; |
123 subTypeHash["headerfile"] = Node::HeaderFile; |
128 subTypeHash["headerfile"] = Node::HeaderFile; |
124 subTypeHash["file"] = Node::File; |
129 subTypeHash["file"] = Node::File; |
126 subTypeHash["module"] = Node::Module; |
131 subTypeHash["module"] = Node::Module; |
127 subTypeHash["page"] = Node::Page; |
132 subTypeHash["page"] = Node::Page; |
128 subTypeHash["externalpage"] = Node::ExternalPage; |
133 subTypeHash["externalpage"] = Node::ExternalPage; |
129 #ifdef QDOC_QML |
134 #ifdef QDOC_QML |
130 subTypeHash["qmlclass"] = Node::QmlClass; |
135 subTypeHash["qmlclass"] = Node::QmlClass; |
|
136 subTypeHash["qmlpropertygroup"] = Node::QmlPropertyGroup; |
|
137 subTypeHash["qmlbasictype"] = Node::QmlBasicType; |
131 #endif |
138 #endif |
132 |
139 |
133 QSet<Node::SubType> allSubTypes = QSet<Node::SubType>::fromList(subTypeHash.values()); |
140 QSet<Node::SubType> allSubTypes = QSet<Node::SubType>::fromList(subTypeHash.values()); |
134 |
141 |
135 foreach (const QString &selector, selectors) { |
142 foreach (const QString &selector, selectors) { |
175 */ |
182 */ |
176 QStringList HelpProjectWriter::keywordDetails(const Node *node) const |
183 QStringList HelpProjectWriter::keywordDetails(const Node *node) const |
177 { |
184 { |
178 QStringList details; |
185 QStringList details; |
179 |
186 |
180 if (node->parent() && !node->parent()->name().isEmpty()) { |
187 if (node->type() == Node::QmlProperty) { |
|
188 // "name" |
|
189 details << node->name(); |
|
190 // "id" |
|
191 details << node->parent()->parent()->name()+"::"+node->name(); |
|
192 } |
|
193 else if (node->parent() && !node->parent()->name().isEmpty()) { |
181 // "name" |
194 // "name" |
182 if (node->type() == Node::Enum || node->type() == Node::Typedef) |
195 if (node->type() == Node::Enum || node->type() == Node::Typedef) |
183 details << node->parent()->name()+"::"+node->name(); |
196 details << node->parent()->name()+"::"+node->name(); |
184 else |
197 else |
185 details << node->name(); |
198 details << node->name(); |
186 // "id" |
199 // "id" |
187 details << node->parent()->name()+"::"+node->name(); |
200 details << node->parent()->name()+"::"+node->name(); |
188 } else if (node->type() == Node::Fake) { |
201 } |
|
202 else if (node->type() == Node::Fake) { |
189 const FakeNode *fake = static_cast<const FakeNode *>(node); |
203 const FakeNode *fake = static_cast<const FakeNode *>(node); |
190 #ifdef QDOC_QML |
|
191 if (fake->subType() == Node::QmlClass) { |
204 if (fake->subType() == Node::QmlClass) { |
192 details << (QmlClassNode::qmlOnly ? fake->name() : fake->fullTitle()); |
205 details << (QmlClassNode::qmlOnly ? fake->name() : fake->fullTitle()); |
193 details << "QML." + fake->name(); |
206 details << "QML." + fake->name(); |
194 } else |
207 } |
195 #endif |
208 else { |
196 { |
|
197 details << fake->fullTitle(); |
209 details << fake->fullTitle(); |
198 details << fake->fullTitle(); |
210 details << fake->fullTitle(); |
199 } |
211 } |
200 } else { |
212 } |
|
213 else { |
201 details << node->name(); |
214 details << node->name(); |
202 details << node->name(); |
215 details << node->name(); |
203 } |
216 } |
204 details << tree->fullDocumentLocation(node); |
217 details << tree->fullDocumentLocation(node); |
205 |
|
206 return details; |
218 return details; |
207 } |
219 } |
208 |
220 |
209 bool HelpProjectWriter::generateSection(HelpProject &project, |
221 bool HelpProjectWriter::generateSection(HelpProject &project, |
210 QXmlStreamWriter & /* writer */, const Node *node) |
222 QXmlStreamWriter & /* writer */, |
|
223 const Node *node) |
211 { |
224 { |
212 if (!node->url().isEmpty()) |
225 if (!node->url().isEmpty()) |
213 return false; |
226 return false; |
214 |
227 |
215 if (node->access() == Node::Private || node->status() == Node::Internal) |
228 if (node->access() == Node::Private || node->status() == Node::Internal) |
224 |
237 |
225 QString objName; |
238 QString objName; |
226 if (node->type() == Node::Fake) { |
239 if (node->type() == Node::Fake) { |
227 const FakeNode *fake = static_cast<const FakeNode *>(node); |
240 const FakeNode *fake = static_cast<const FakeNode *>(node); |
228 objName = fake->fullTitle(); |
241 objName = fake->fullTitle(); |
229 } else |
242 } |
|
243 else |
230 objName = tree->fullDocumentName(node); |
244 objName = tree->fullDocumentName(node); |
231 |
245 |
232 // Only add nodes to the set for each subproject if they match a selector. |
246 // Only add nodes to the set for each subproject if they match a selector. |
233 // Those that match will be listed in the table of contents. |
247 // Those that match will be listed in the table of contents. |
234 |
248 |
235 foreach (const QString &name, project.subprojects.keys()) { |
249 foreach (const QString &name, project.subprojects.keys()) { |
236 SubProject subproject = project.subprojects[name]; |
250 SubProject subproject = project.subprojects[name]; |
398 void HelpProjectWriter::generateSections(HelpProject &project, |
415 void HelpProjectWriter::generateSections(HelpProject &project, |
399 QXmlStreamWriter &writer, const Node *node) |
416 QXmlStreamWriter &writer, const Node *node) |
400 { |
417 { |
401 if (!generateSection(project, writer, node)) |
418 if (!generateSection(project, writer, node)) |
402 return; |
419 return; |
403 |
420 |
404 if (node->isInnerNode()) { |
421 if (node->isInnerNode()) { |
405 const InnerNode *inner = static_cast<const InnerNode *>(node); |
422 const InnerNode *inner = static_cast<const InnerNode *>(node); |
406 |
423 |
407 // Ensure that we don't visit nodes more than once. |
424 // Ensure that we don't visit nodes more than once. |
408 QMap<QString, const Node*> childMap; |
425 QMap<QString, const Node*> childMap; |
409 foreach (const Node *node, inner->childNodes()) { |
426 foreach (const Node *node, inner->childNodes()) { |
410 if (node->access() == Node::Private) |
427 if (node->access() == Node::Private) |
411 continue; |
428 continue; |
412 if (node->type() == Node::Fake) |
429 if (node->type() == Node::Fake) { |
413 childMap[static_cast<const FakeNode *>(node)->fullTitle()] = node; |
430 /* |
|
431 Don't visit QML property group nodes, |
|
432 but visit their children, which are all |
|
433 QML property nodes. |
|
434 */ |
|
435 if (node->subType() == Node::QmlPropertyGroup) { |
|
436 const InnerNode* inner = static_cast<const InnerNode*>(node); |
|
437 foreach (const Node* n, inner->childNodes()) { |
|
438 if (n->access() == Node::Private) |
|
439 continue; |
|
440 childMap[tree->fullDocumentName(n)] = n; |
|
441 } |
|
442 } |
|
443 else |
|
444 childMap[static_cast<const FakeNode *>(node)->fullTitle()] = node; |
|
445 } |
414 else { |
446 else { |
415 if (node->type() == Node::Function) { |
447 if (node->type() == Node::Function) { |
416 const FunctionNode *funcNode = static_cast<const FunctionNode *>(node); |
448 const FunctionNode *funcNode = static_cast<const FunctionNode *>(node); |
417 if (funcNode->isOverload()) |
449 if (funcNode->isOverload()) |
418 continue; |
450 continue; |