[2] | 1 | /****************************************************************************
|
---|
| 2 | **
|
---|
[846] | 3 | ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
---|
[561] | 4 | ** All rights reserved.
|
---|
| 5 | ** Contact: Nokia Corporation ([email protected])
|
---|
[2] | 6 | **
|
---|
| 7 | ** This file is part of the Qt Designer of the Qt Toolkit.
|
---|
| 8 | **
|
---|
| 9 | ** $QT_BEGIN_LICENSE:LGPL$
|
---|
| 10 | ** Commercial Usage
|
---|
| 11 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
---|
| 12 | ** accordance with the Qt Commercial License Agreement provided with the
|
---|
| 13 | ** Software or, alternatively, in accordance with the terms contained in
|
---|
| 14 | ** a written agreement between you and Nokia.
|
---|
| 15 | **
|
---|
| 16 | ** GNU Lesser General Public License Usage
|
---|
| 17 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
---|
| 18 | ** General Public License version 2.1 as published by the Free Software
|
---|
| 19 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
---|
| 20 | ** packaging of this file. Please review the following information to
|
---|
| 21 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
---|
| 22 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
---|
| 23 | **
|
---|
[561] | 24 | ** In addition, as a special exception, Nokia gives you certain additional
|
---|
| 25 | ** rights. These rights are described in the Nokia Qt LGPL Exception
|
---|
| 26 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
---|
[2] | 27 | **
|
---|
| 28 | ** GNU General Public License Usage
|
---|
| 29 | ** Alternatively, this file may be used under the terms of the GNU
|
---|
| 30 | ** General Public License version 3.0 as published by the Free Software
|
---|
| 31 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
---|
| 32 | ** packaging of this file. Please review the following information to
|
---|
| 33 | ** ensure the GNU General Public License version 3.0 requirements will be
|
---|
| 34 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
---|
| 35 | **
|
---|
[561] | 36 | ** If you have questions regarding the use of this file, please contact
|
---|
| 37 | ** Nokia at [email protected].
|
---|
[2] | 38 | ** $QT_END_LICENSE$
|
---|
| 39 | **
|
---|
| 40 | ****************************************************************************/
|
---|
| 41 |
|
---|
| 42 | #include "qdesigner_integration_p.h"
|
---|
| 43 | #include "qdesigner_propertycommand_p.h"
|
---|
| 44 | #include "qdesigner_propertyeditor_p.h"
|
---|
| 45 | #include "qdesigner_objectinspector_p.h"
|
---|
| 46 | #include "widgetdatabase_p.h"
|
---|
| 47 | #include "pluginmanager_p.h"
|
---|
| 48 | #include "widgetfactory_p.h"
|
---|
| 49 | #include "qdesigner_widgetbox_p.h"
|
---|
| 50 | #include "qtgradientmanager.h"
|
---|
| 51 | #include "qtgradientutils.h"
|
---|
| 52 | #include "qtresourcemodel_p.h"
|
---|
| 53 |
|
---|
| 54 | // sdk
|
---|
| 55 | #include <QtDesigner/QDesignerFormEditorInterface>
|
---|
| 56 | #include <QtDesigner/QDesignerFormWindowInterface>
|
---|
| 57 | #include <QtDesigner/QDesignerFormWindowManagerInterface>
|
---|
| 58 | #include <QtDesigner/QDesignerFormWindowCursorInterface>
|
---|
| 59 | #include <QtDesigner/QDesignerActionEditorInterface>
|
---|
| 60 | #include <QtDesigner/QDesignerWidgetBoxInterface>
|
---|
| 61 | #include <QtDesigner/QExtensionManager>
|
---|
| 62 | #include <QtDesigner/QDesignerResourceBrowserInterface>
|
---|
| 63 | #include <QtDesigner/QDesignerPropertySheetExtension>
|
---|
| 64 |
|
---|
| 65 | #include <QtCore/QVariant>
|
---|
| 66 | #include <QtCore/QFile>
|
---|
| 67 | #include <QtCore/QDir>
|
---|
| 68 |
|
---|
| 69 | #include <QtCore/qdebug.h>
|
---|
| 70 |
|
---|
| 71 | QT_BEGIN_NAMESPACE
|
---|
| 72 |
|
---|
| 73 | namespace qdesigner_internal {
|
---|
| 74 |
|
---|
| 75 | // ---------------- DesignerIntegrationPrivate
|
---|
| 76 | class QDesignerIntegrationPrivate {
|
---|
| 77 | public:
|
---|
| 78 | QDesignerIntegrationPrivate()
|
---|
| 79 | : m_gradientManager(0),
|
---|
| 80 | m_fileWatcherBehaviour(QDesignerIntegration::PromptAndReload),
|
---|
| 81 | m_resourceEditingEnabled(true),
|
---|
| 82 | m_slotNavigationEnabled(false)
|
---|
| 83 | {}
|
---|
| 84 |
|
---|
| 85 | QString m_gradientsPath;
|
---|
| 86 | QtGradientManager *m_gradientManager;
|
---|
| 87 | QDesignerIntegration::ResourceFileWatcherBehaviour m_fileWatcherBehaviour;
|
---|
| 88 | bool m_resourceEditingEnabled;
|
---|
| 89 | bool m_slotNavigationEnabled;
|
---|
| 90 | };
|
---|
| 91 |
|
---|
| 92 | // -------------- QDesignerIntegration
|
---|
| 93 | // As of 4.4, the header will be distributed with the Eclipse plugin.
|
---|
| 94 |
|
---|
| 95 | QDesignerIntegration::QDesignerIntegration(QDesignerFormEditorInterface *core, QObject *parent) :
|
---|
| 96 | QDesignerIntegrationInterface(core, parent),
|
---|
| 97 | m_d(new QDesignerIntegrationPrivate)
|
---|
| 98 | {
|
---|
| 99 | initialize();
|
---|
| 100 | }
|
---|
| 101 |
|
---|
| 102 | QDesignerIntegration::~QDesignerIntegration()
|
---|
| 103 | {
|
---|
| 104 | QFile f(m_d->m_gradientsPath);
|
---|
| 105 | if (f.open(QIODevice::WriteOnly)) {
|
---|
| 106 | f.write(QtGradientUtils::saveState(m_d->m_gradientManager).toUtf8());
|
---|
| 107 | f.close();
|
---|
| 108 | }
|
---|
| 109 | delete m_d;
|
---|
| 110 | }
|
---|
| 111 |
|
---|
| 112 | void QDesignerIntegration::initialize()
|
---|
| 113 | {
|
---|
| 114 | //
|
---|
| 115 | // integrate the `Form Editor component'
|
---|
| 116 | //
|
---|
| 117 |
|
---|
| 118 | // Extensions
|
---|
| 119 | if (QDesignerPropertyEditor *designerPropertyEditor= qobject_cast<QDesignerPropertyEditor *>(core()->propertyEditor())) {
|
---|
[561] | 120 | connect(designerPropertyEditor, SIGNAL(propertyValueChanged(QString,QVariant,bool)), this, SLOT(updateProperty(QString,QVariant,bool)));
|
---|
[2] | 121 | connect(designerPropertyEditor, SIGNAL(resetProperty(QString)), this, SLOT(resetProperty(QString)));
|
---|
| 122 | connect(designerPropertyEditor, SIGNAL(addDynamicProperty(QString,QVariant)),
|
---|
| 123 | this, SLOT(addDynamicProperty(QString,QVariant)));
|
---|
| 124 | connect(designerPropertyEditor, SIGNAL(removeDynamicProperty(QString)),
|
---|
| 125 | this, SLOT(removeDynamicProperty(QString)));
|
---|
| 126 | } else {
|
---|
| 127 | connect(core()->propertyEditor(), SIGNAL(propertyChanged(QString,QVariant)),
|
---|
| 128 | this, SLOT(updatePropertyPrivate(QString,QVariant)));
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 | connect(core()->formWindowManager(), SIGNAL(formWindowAdded(QDesignerFormWindowInterface*)),
|
---|
| 132 | this, SLOT(setupFormWindow(QDesignerFormWindowInterface*)));
|
---|
| 133 |
|
---|
| 134 | connect(core()->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),
|
---|
| 135 | this, SLOT(updateActiveFormWindow(QDesignerFormWindowInterface*)));
|
---|
| 136 |
|
---|
| 137 | m_d->m_gradientManager = new QtGradientManager(this);
|
---|
| 138 | core()->setGradientManager(m_d->m_gradientManager);
|
---|
| 139 |
|
---|
| 140 | QString designerFolder = QDir::homePath();
|
---|
| 141 | designerFolder += QDir::separator();
|
---|
| 142 | designerFolder += QLatin1String(".designer");
|
---|
| 143 | m_d->m_gradientsPath = designerFolder;
|
---|
| 144 | m_d->m_gradientsPath += QDir::separator();
|
---|
| 145 | m_d->m_gradientsPath += QLatin1String("gradients.xml");
|
---|
| 146 |
|
---|
| 147 | QFile f(m_d->m_gradientsPath);
|
---|
| 148 | if (f.open(QIODevice::ReadOnly)) {
|
---|
| 149 | QtGradientUtils::restoreState(m_d->m_gradientManager, QString::fromAscii(f.readAll()));
|
---|
| 150 | f.close();
|
---|
| 151 | } else {
|
---|
| 152 | QFile defaultGradients(QLatin1String(":/trolltech/designer/defaultgradients.xml"));
|
---|
| 153 | if (defaultGradients.open(QIODevice::ReadOnly)) {
|
---|
| 154 | QtGradientUtils::restoreState(m_d->m_gradientManager, QString::fromAscii(defaultGradients.readAll()));
|
---|
| 155 | defaultGradients.close();
|
---|
| 156 | }
|
---|
| 157 | }
|
---|
| 158 |
|
---|
| 159 | if (WidgetDataBase *widgetDataBase = qobject_cast<WidgetDataBase*>(core()->widgetDataBase()))
|
---|
| 160 | widgetDataBase->grabStandardWidgetBoxIcons();
|
---|
| 161 | }
|
---|
| 162 |
|
---|
| 163 | void QDesignerIntegration::updateProperty(const QString &name, const QVariant &value, bool enableSubPropertyHandling)
|
---|
| 164 | {
|
---|
| 165 | QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow();
|
---|
| 166 | if (!formWindow)
|
---|
| 167 | return;
|
---|
| 168 |
|
---|
| 169 | Selection selection;
|
---|
| 170 | getSelection(selection);
|
---|
| 171 | if (selection.empty())
|
---|
| 172 | return;
|
---|
| 173 |
|
---|
| 174 | SetPropertyCommand *cmd = new SetPropertyCommand(formWindow);
|
---|
| 175 | // find a reference object to compare to and to find the right group
|
---|
| 176 | if (cmd->init(selection.selection(), name, value, propertyEditorObject(), enableSubPropertyHandling)) {
|
---|
| 177 | formWindow->commandHistory()->push(cmd);
|
---|
| 178 | } else {
|
---|
| 179 | delete cmd;
|
---|
| 180 | qDebug() << "Unable to set property " << name << '.';
|
---|
| 181 | }
|
---|
| 182 |
|
---|
| 183 | emit propertyChanged(formWindow, name, value);
|
---|
| 184 | }
|
---|
| 185 |
|
---|
| 186 | void QDesignerIntegration::updatePropertyPrivate(const QString &name, const QVariant &value)
|
---|
| 187 | {
|
---|
| 188 | updateProperty(name, value, true);
|
---|
| 189 | }
|
---|
| 190 |
|
---|
| 191 | void QDesignerIntegration::resetProperty(const QString &name)
|
---|
| 192 | {
|
---|
| 193 | QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow();
|
---|
| 194 | if (!formWindow)
|
---|
| 195 | return;
|
---|
| 196 |
|
---|
| 197 | Selection selection;
|
---|
| 198 | getSelection(selection);
|
---|
| 199 | if (selection.empty())
|
---|
| 200 | return;
|
---|
| 201 |
|
---|
| 202 |
|
---|
| 203 | ResetPropertyCommand *cmd = new ResetPropertyCommand(formWindow);
|
---|
| 204 | // find a reference object to find the right group
|
---|
| 205 | if (cmd->init(selection.selection(), name, propertyEditorObject())) {
|
---|
| 206 | formWindow->commandHistory()->push(cmd);
|
---|
| 207 | } else {
|
---|
| 208 | delete cmd;
|
---|
| 209 | qDebug() << "** WARNING Unable to reset property " << name << '.';
|
---|
| 210 | }
|
---|
| 211 | }
|
---|
| 212 |
|
---|
| 213 | void QDesignerIntegration::addDynamicProperty(const QString &name, const QVariant &value)
|
---|
| 214 | {
|
---|
| 215 | QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow();
|
---|
| 216 | if (!formWindow)
|
---|
| 217 | return;
|
---|
| 218 |
|
---|
| 219 | Selection selection;
|
---|
| 220 | getSelection(selection);
|
---|
| 221 | if (selection.empty())
|
---|
| 222 | return;
|
---|
| 223 |
|
---|
| 224 | AddDynamicPropertyCommand *cmd = new AddDynamicPropertyCommand(formWindow);
|
---|
| 225 | if (cmd->init(selection.selection(), propertyEditorObject(), name, value)) {
|
---|
| 226 | formWindow->commandHistory()->push(cmd);
|
---|
| 227 | } else {
|
---|
| 228 | delete cmd;
|
---|
| 229 | qDebug() << "** WARNING Unable to add dynamic property " << name << '.';
|
---|
| 230 | }
|
---|
| 231 | }
|
---|
| 232 |
|
---|
| 233 | void QDesignerIntegration::removeDynamicProperty(const QString &name)
|
---|
| 234 | {
|
---|
| 235 | QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow();
|
---|
| 236 | if (!formWindow)
|
---|
| 237 | return;
|
---|
| 238 |
|
---|
| 239 | Selection selection;
|
---|
| 240 | getSelection(selection);
|
---|
| 241 | if (selection.empty())
|
---|
| 242 | return;
|
---|
| 243 |
|
---|
| 244 | RemoveDynamicPropertyCommand *cmd = new RemoveDynamicPropertyCommand(formWindow);
|
---|
| 245 | if (cmd->init(selection.selection(), propertyEditorObject(), name)) {
|
---|
| 246 | formWindow->commandHistory()->push(cmd);
|
---|
| 247 | } else {
|
---|
| 248 | delete cmd;
|
---|
| 249 | qDebug() << "** WARNING Unable to remove dynamic property " << name << '.';
|
---|
| 250 | }
|
---|
| 251 |
|
---|
| 252 | }
|
---|
| 253 |
|
---|
| 254 |
|
---|
| 255 | void QDesignerIntegration::updateActiveFormWindow(QDesignerFormWindowInterface *formWindow)
|
---|
| 256 | {
|
---|
| 257 | Q_UNUSED(formWindow);
|
---|
| 258 | updateSelection();
|
---|
| 259 | }
|
---|
| 260 |
|
---|
| 261 | void QDesignerIntegration::setupFormWindow(QDesignerFormWindowInterface *formWindow)
|
---|
| 262 | {
|
---|
| 263 | connect(formWindow, SIGNAL(selectionChanged()), this, SLOT(updateSelection()));
|
---|
| 264 | connect(formWindow, SIGNAL(activated(QWidget*)), this, SLOT(activateWidget(QWidget*)));
|
---|
| 265 | }
|
---|
| 266 |
|
---|
| 267 | void QDesignerIntegration::updateGeometry()
|
---|
| 268 | {
|
---|
| 269 | }
|
---|
| 270 |
|
---|
| 271 | void QDesignerIntegration::updateSelection()
|
---|
| 272 | {
|
---|
| 273 | QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow();
|
---|
| 274 | QWidget *selection = 0;
|
---|
| 275 |
|
---|
| 276 | if (formWindow) {
|
---|
| 277 | selection = formWindow->cursor()->current();
|
---|
| 278 | }
|
---|
| 279 |
|
---|
| 280 | if (QDesignerActionEditorInterface *actionEditor = core()->actionEditor())
|
---|
| 281 | actionEditor->setFormWindow(formWindow);
|
---|
| 282 |
|
---|
| 283 | if (QDesignerPropertyEditorInterface *propertyEditor = core()->propertyEditor())
|
---|
| 284 | propertyEditor->setObject(selection);
|
---|
| 285 |
|
---|
| 286 | if (QDesignerObjectInspectorInterface *objectInspector = core()->objectInspector())
|
---|
| 287 | objectInspector->setFormWindow(formWindow);
|
---|
| 288 |
|
---|
| 289 | }
|
---|
| 290 |
|
---|
| 291 | void QDesignerIntegration::activateWidget(QWidget *widget)
|
---|
| 292 | {
|
---|
| 293 | Q_UNUSED(widget);
|
---|
| 294 | }
|
---|
| 295 |
|
---|
| 296 | QWidget *QDesignerIntegration::containerWindow(QWidget *widget) const
|
---|
| 297 | {
|
---|
| 298 | // Find the parent window to apply a geometry to.
|
---|
| 299 | while (widget) {
|
---|
| 300 | if (widget->isWindow())
|
---|
| 301 | break;
|
---|
| 302 | if (!qstrcmp(widget->metaObject()->className(), "QMdiSubWindow"))
|
---|
| 303 | break;
|
---|
| 304 |
|
---|
| 305 | widget = widget->parentWidget();
|
---|
| 306 | }
|
---|
| 307 |
|
---|
| 308 | return widget;
|
---|
| 309 | }
|
---|
| 310 |
|
---|
| 311 | void QDesignerIntegration::getSelection(Selection &s)
|
---|
| 312 | {
|
---|
| 313 | // Get multiselection from object inspector
|
---|
| 314 | if (QDesignerObjectInspector *designerObjectInspector = qobject_cast<QDesignerObjectInspector *>(core()->objectInspector())) {
|
---|
| 315 | designerObjectInspector->getSelection(s);
|
---|
| 316 | // Action editor puts actions that are not on the form yet
|
---|
| 317 | // into the property editor only.
|
---|
| 318 | if (s.empty())
|
---|
| 319 | if (QObject *object = core()->propertyEditor()->object())
|
---|
| 320 | s.objects.push_back(object);
|
---|
| 321 |
|
---|
| 322 | } else {
|
---|
| 323 | // Just in case someone plugs in an old-style object inspector: Emulate selection
|
---|
| 324 | s.clear();
|
---|
| 325 | QDesignerFormWindowInterface *formWindow = core()->formWindowManager()->activeFormWindow();
|
---|
| 326 | if (!formWindow)
|
---|
| 327 | return;
|
---|
| 328 |
|
---|
| 329 | QObject *object = core()->propertyEditor()->object();
|
---|
| 330 | if (object->isWidgetType()) {
|
---|
| 331 | QWidget *widget = static_cast<QWidget*>(object);
|
---|
| 332 | QDesignerFormWindowCursorInterface *cursor = formWindow->cursor();
|
---|
| 333 | if (cursor->isWidgetSelected(widget)) {
|
---|
| 334 | s.managed.push_back(widget);
|
---|
| 335 | } else {
|
---|
| 336 | s.unmanaged.push_back(widget);
|
---|
| 337 | }
|
---|
| 338 | } else {
|
---|
| 339 | s.objects.push_back(object);
|
---|
| 340 | }
|
---|
| 341 | }
|
---|
| 342 | }
|
---|
| 343 |
|
---|
| 344 | QObject *QDesignerIntegration::propertyEditorObject()
|
---|
| 345 | {
|
---|
| 346 | QDesignerPropertyEditorInterface *propertyEditor = core()->propertyEditor();
|
---|
| 347 | if (!propertyEditor)
|
---|
| 348 | return 0;
|
---|
| 349 | return propertyEditor->object();
|
---|
| 350 | }
|
---|
| 351 |
|
---|
| 352 | // Load plugins into widget database and factory.
|
---|
| 353 | void QDesignerIntegration::initializePlugins(QDesignerFormEditorInterface *formEditor)
|
---|
| 354 | {
|
---|
| 355 | // load the plugins
|
---|
| 356 | WidgetDataBase *widgetDataBase = qobject_cast<WidgetDataBase*>(formEditor->widgetDataBase());
|
---|
| 357 | if (widgetDataBase) {
|
---|
| 358 | widgetDataBase->loadPlugins();
|
---|
| 359 | }
|
---|
| 360 |
|
---|
| 361 | if (WidgetFactory *widgetFactory = qobject_cast<WidgetFactory*>(formEditor->widgetFactory())) {
|
---|
| 362 | widgetFactory->loadPlugins();
|
---|
| 363 | }
|
---|
| 364 |
|
---|
| 365 | if (widgetDataBase) {
|
---|
| 366 | widgetDataBase->grabDefaultPropertyValues();
|
---|
| 367 | }
|
---|
| 368 | }
|
---|
| 369 |
|
---|
| 370 | void QDesignerIntegration::updateCustomWidgetPlugins()
|
---|
| 371 | {
|
---|
| 372 | QDesignerFormEditorInterface *formEditor = core();
|
---|
| 373 | if (QDesignerPluginManager *pm = formEditor->pluginManager())
|
---|
| 374 | pm->registerNewPlugins();
|
---|
| 375 |
|
---|
| 376 | initializePlugins(formEditor);
|
---|
| 377 |
|
---|
| 378 | // Do not just reload the last file as the WidgetBox merges the compiled-in resources
|
---|
| 379 | // and $HOME/.designer/widgetbox.xml. This would also double the scratchpad.
|
---|
| 380 | if (QDesignerWidgetBox *wb = qobject_cast<QDesignerWidgetBox*>(formEditor->widgetBox())) {
|
---|
| 381 | const QDesignerWidgetBox::LoadMode oldLoadMode = wb->loadMode();
|
---|
| 382 | wb->setLoadMode(QDesignerWidgetBox::LoadCustomWidgetsOnly);
|
---|
| 383 | wb->load();
|
---|
| 384 | wb->setLoadMode(oldLoadMode);
|
---|
| 385 | }
|
---|
| 386 | }
|
---|
| 387 |
|
---|
| 388 | void QDesignerIntegration::emitObjectNameChanged(QDesignerFormWindowInterface *formWindow, QObject *object, const QString &newName, const QString &oldName)
|
---|
| 389 | {
|
---|
| 390 | emit objectNameChanged(formWindow, object, newName, oldName);
|
---|
| 391 | }
|
---|
| 392 |
|
---|
| 393 | void QDesignerIntegration::emitNavigateToSlot(const QString &objectName,
|
---|
| 394 | const QString &signalSignature,
|
---|
| 395 | const QStringList ¶meterNames)
|
---|
| 396 | {
|
---|
| 397 | emit navigateToSlot(objectName, signalSignature, parameterNames);
|
---|
| 398 | }
|
---|
| 399 |
|
---|
| 400 | void QDesignerIntegration::emitNavigateToSlot(const QString &slotSignature)
|
---|
| 401 | {
|
---|
| 402 | emit navigateToSlot(slotSignature);
|
---|
| 403 | }
|
---|
| 404 |
|
---|
| 405 | void QDesignerIntegration::requestHelp(const QDesignerFormEditorInterface *core, const QString &manual, const QString &document)
|
---|
| 406 | {
|
---|
| 407 | if (QDesignerIntegration *di = qobject_cast<QDesignerIntegration *>(core->integration()))
|
---|
| 408 | emit di->helpRequested(manual, document);
|
---|
| 409 | }
|
---|
| 410 |
|
---|
| 411 | QDesignerResourceBrowserInterface *QDesignerIntegration::createResourceBrowser(QWidget *)
|
---|
| 412 | {
|
---|
| 413 | return 0;
|
---|
| 414 | }
|
---|
| 415 |
|
---|
| 416 | void QDesignerIntegration::setResourceFileWatcherBehaviour(ResourceFileWatcherBehaviour behaviour)
|
---|
| 417 | {
|
---|
| 418 | m_d->m_fileWatcherBehaviour = behaviour;
|
---|
| 419 | core()->resourceModel()->setWatcherEnabled(behaviour != QDesignerIntegration::NoWatcher);
|
---|
| 420 | }
|
---|
| 421 |
|
---|
| 422 | QDesignerIntegration::ResourceFileWatcherBehaviour QDesignerIntegration::resourceFileWatcherBehaviour() const
|
---|
| 423 | {
|
---|
| 424 | return m_d->m_fileWatcherBehaviour;
|
---|
| 425 | }
|
---|
| 426 |
|
---|
| 427 | void QDesignerIntegration::setResourceEditingEnabled(bool enable)
|
---|
| 428 | {
|
---|
| 429 | m_d->m_resourceEditingEnabled = enable;
|
---|
| 430 | }
|
---|
| 431 |
|
---|
| 432 | bool QDesignerIntegration::isResourceEditingEnabled() const
|
---|
| 433 | {
|
---|
| 434 | return m_d->m_resourceEditingEnabled;
|
---|
| 435 | }
|
---|
| 436 |
|
---|
| 437 | void QDesignerIntegration::setSlotNavigationEnabled(bool enable)
|
---|
| 438 | {
|
---|
| 439 | m_d->m_slotNavigationEnabled = enable;
|
---|
| 440 | }
|
---|
| 441 |
|
---|
| 442 | bool QDesignerIntegration::isSlotNavigationEnabled() const
|
---|
| 443 | {
|
---|
| 444 | return m_d->m_slotNavigationEnabled;
|
---|
| 445 | }
|
---|
| 446 |
|
---|
| 447 | static QString fixHelpClassName(const QString &className)
|
---|
| 448 | {
|
---|
| 449 | // ### generalize using the Widget Data Base
|
---|
| 450 | if (className == QLatin1String("Line"))
|
---|
| 451 | return QLatin1String("QFrame");
|
---|
| 452 | if (className == QLatin1String("Spacer"))
|
---|
| 453 | return QLatin1String("QSpacerItem");
|
---|
| 454 | if (className == QLatin1String("QLayoutWidget"))
|
---|
| 455 | return QLatin1String("QLayout");
|
---|
| 456 | return className;
|
---|
| 457 | }
|
---|
| 458 |
|
---|
| 459 | // Return class in which the property is defined
|
---|
| 460 | static QString classForProperty(QDesignerFormEditorInterface *core,
|
---|
| 461 | QObject *object,
|
---|
| 462 | const QString &property)
|
---|
| 463 | {
|
---|
| 464 | if (const QDesignerPropertySheetExtension *ps = qt_extension<QDesignerPropertySheetExtension *>(core->extensionManager(), object)) {
|
---|
| 465 | const int index = ps->indexOf(property);
|
---|
| 466 | if (index >= 0)
|
---|
| 467 | return ps->propertyGroup(index);
|
---|
| 468 | }
|
---|
| 469 | return QString();
|
---|
| 470 | }
|
---|
| 471 |
|
---|
| 472 | QString QDesignerIntegration::contextHelpId() const
|
---|
| 473 | {
|
---|
| 474 | QObject *currentObject = core()->propertyEditor()->object();
|
---|
| 475 | if (!currentObject)
|
---|
| 476 | return QString();
|
---|
| 477 | // Return a help index id consisting of "class::property"
|
---|
| 478 | QString className;
|
---|
| 479 | QString currentPropertyName = core()->propertyEditor()->currentPropertyName();
|
---|
| 480 | if (!currentPropertyName.isEmpty())
|
---|
| 481 | className = classForProperty(core(), currentObject, currentPropertyName);
|
---|
| 482 | if (className.isEmpty()) {
|
---|
| 483 | currentPropertyName.clear(); // We hit on some fake property.
|
---|
| 484 | className = WidgetFactory::classNameOf(core(), currentObject);
|
---|
| 485 | }
|
---|
| 486 | QString helpId = fixHelpClassName(className);
|
---|
| 487 | if (!currentPropertyName.isEmpty()) {
|
---|
| 488 | helpId += QLatin1String("::");
|
---|
| 489 | helpId += currentPropertyName;
|
---|
| 490 | }
|
---|
| 491 | return helpId;
|
---|
| 492 | }
|
---|
| 493 |
|
---|
| 494 | } // namespace qdesigner_internal
|
---|
| 495 |
|
---|
| 496 | QT_END_NAMESPACE
|
---|