Changeset View
Changeset View
Standalone View
Standalone View
src/formeditor/form.cpp
Show All 28 Lines | |||||
29 | #include "widgetlibrary.h" | 29 | #include "widgetlibrary.h" | ||
30 | #include "events.h" | 30 | #include "events.h" | ||
31 | #include "utils.h" | 31 | #include "utils.h" | ||
32 | #include "widgetwithsubpropertiesinterface.h" | 32 | #include "widgetwithsubpropertiesinterface.h" | ||
33 | #include "tabstopdialog.h" | 33 | #include "tabstopdialog.h" | ||
34 | #include <kexiutils/utils.h> | 34 | #include <kexiutils/utils.h> | ||
35 | #include <KexiIcon.h> | 35 | #include <KexiIcon.h> | ||
36 | #include <core/kexi.h> | 36 | #include <core/kexi.h> | ||
37 | #include <KexiMainWindowIface.h> | ||||
37 | 38 | | |||
38 | #include <kundo2stack.h> | 39 | #include <kundo2stack.h> | ||
39 | 40 | | |||
40 | #include <KDb> | 41 | #include <KDb> | ||
41 | #include <KDbUtils> | 42 | #include <KDbUtils> | ||
42 | 43 | | |||
43 | #include <KMessageBox> | 44 | #include <KMessageBox> | ||
44 | #include <KActionCollection> | 45 | #include <KActionCollection> | ||
45 | #include <KTextEdit> | 46 | #include <KTextEdit> | ||
46 | #include <KLocalizedString> | 47 | #include <KLocalizedString> | ||
47 | 48 | | |||
48 | #include <QApplication> | 49 | #include <QApplication> | ||
49 | #include <QClipboard> | 50 | #include <QClipboard> | ||
50 | #include <QLabel> | 51 | #include <QLabel> | ||
51 | #include <QDomDocument> | 52 | #include <QDomDocument> | ||
52 | #include <QLineEdit> | 53 | #include <QLineEdit> | ||
53 | #include <QMenu> | 54 | #include <QMenu> | ||
54 | #include <QAction> | 55 | #include <QAction> | ||
55 | #include <QDebug> | 56 | #include <QDebug> | ||
56 | #include <QFontDialog> | 57 | #include <QFontDialog> | ||
57 | #include <QMimeData> | 58 | #include <QMimeData> | ||
59 | #include <QTimer> | ||||
58 | 60 | | |||
59 | using namespace KFormDesigner; | 61 | using namespace KFormDesigner; | ||
60 | 62 | | |||
61 | Form::Form(WidgetLibrary* library, Mode mode, KActionCollection &col, ActionGroup& group) | 63 | Form::Form(WidgetLibrary* library, Mode mode, KActionCollection &col, ActionGroup& group) | ||
62 | : QObject(library) | 64 | : QObject(library) | ||
63 | , d( new FormPrivate(this, library) ) | 65 | , d( new FormPrivate(this, library) ) | ||
64 | { | 66 | { | ||
65 | init(mode, col, group); | 67 | init(mode, col, group); | ||
▲ Show 20 Lines • Show All 202 Lines • ▼ Show 20 Line(s) | |||||
268 | 270 | | |||
269 | Container* Form::toplevelContainer() const | 271 | Container* Form::toplevelContainer() const | ||
270 | { | 272 | { | ||
271 | return d->toplevel; | 273 | return d->toplevel; | ||
272 | } | 274 | } | ||
273 | 275 | | |||
274 | void Form::createToplevel(QWidget *container, FormWidget *formWidget, const QByteArray &) | 276 | void Form::createToplevel(QWidget *container, FormWidget *formWidget, const QByteArray &) | ||
275 | { | 277 | { | ||
276 | //qDebug() << "container= " << (container ? container->objectName() : "<NULL>") | 278 | //qDebug() << "container=" << (container ? container->objectName() : "<NULL>") | ||
277 | // << " formWidget=" << formWidget; | 279 | // << "formWidget=" << formWidget; | ||
278 | 280 | | |||
279 | setFormWidget(formWidget); | 281 | setFormWidget(formWidget); | ||
280 | d->toplevel = new Container(0, container, this); | 282 | d->toplevel = new Container(0, container, this); | ||
281 | d->toplevel->setObjectName(objectName()); | 283 | d->toplevel->setObjectName(objectName()); | ||
282 | d->topTree = new ObjectTree(xi18n("Form"), container->objectName(), container, d->toplevel); | 284 | d->topTree = new ObjectTree(xi18n("Form"), container->objectName(), container, d->toplevel); | ||
283 | d->toplevel->setObjectTree(d->topTree); | 285 | d->toplevel->setObjectTree(d->topTree); | ||
284 | d->toplevel->setForm(this); | 286 | d->toplevel->setForm(this); | ||
285 | 287 | | |||
▲ Show 20 Lines • Show All 105 Lines • ▼ Show 20 Line(s) | 368 | { | |||
391 | d->designModeStyle = 0; | 393 | d->designModeStyle = 0; | ||
392 | } | 394 | } | ||
393 | 395 | | |||
394 | 396 | | |||
395 | ///////////////////////////// Selection stuff /////////////////////// | 397 | ///////////////////////////// Selection stuff /////////////////////// | ||
396 | 398 | | |||
397 | void Form::selectWidget(QWidget *w, WidgetSelectionFlags flags) | 399 | void Form::selectWidget(QWidget *w, WidgetSelectionFlags flags) | ||
398 | { | 400 | { | ||
399 | if (!d->selectWidgetEnabled) | 401 | if (!d->selectWidgetEnabled) { | ||
400 | return; | 402 | return; | ||
403 | } | ||||
404 | if (selectedWidget() && !checkNameValidity(d->propertySet.propertyValue("objectName").toString(), CheckValidityOnly)) { | ||||
405 | // current selection has invalid objectName: don't allow to switch so user is able to fix it! | ||||
406 | //qDebug() << "disallow!"; | ||||
407 | return; | ||||
408 | } | ||||
409 | | ||||
401 | d->selectWidgetEnabled = false; | 410 | d->selectWidgetEnabled = false; | ||
402 | selectWidgetInternal(w, flags); | 411 | selectWidgetInternal(w, flags); | ||
403 | d->selectWidgetEnabled = true; | 412 | d->selectWidgetEnabled = true; | ||
404 | } | 413 | } | ||
405 | 414 | | |||
406 | void Form::selectWidgetInternal(QWidget *w, WidgetSelectionFlags flags) | 415 | void Form::selectWidgetInternal(QWidget *w, WidgetSelectionFlags flags) | ||
407 | { | 416 | { | ||
408 | if (!w) { | 417 | if (!w) { | ||
▲ Show 20 Lines • Show All 449 Lines • ▼ Show 20 Line(s) | |||||
858 | 867 | | |||
859 | //! Collects all the containers reculsively. Used by Form::autoAssignTabStops(). | 868 | //! Collects all the containers reculsively. Used by Form::autoAssignTabStops(). | ||
860 | static void collectContainers(ObjectTreeItem* item, QSet<Container*>& containers) | 869 | static void collectContainers(ObjectTreeItem* item, QSet<Container*>& containers) | ||
861 | { | 870 | { | ||
862 | if (!item->container()) | 871 | if (!item->container()) | ||
863 | return; | 872 | return; | ||
864 | if (!containers.contains(item->container())) { | 873 | if (!containers.contains(item->container())) { | ||
865 | //qDebug() << item->container()->objectTree()->className() | 874 | //qDebug() << item->container()->objectTree()->className() | ||
866 | // << " " << item->container()->objectTree()->name(); | 875 | // << item->container()->objectTree()->name(); | ||
867 | containers.insert(item->container()); | 876 | containers.insert(item->container()); | ||
868 | } | 877 | } | ||
869 | foreach (ObjectTreeItem *child, *item->children()) { | 878 | foreach (ObjectTreeItem *child, *item->children()) { | ||
870 | collectContainers(child, containers); | 879 | collectContainers(child, containers); | ||
871 | } | 880 | } | ||
872 | } | 881 | } | ||
873 | 882 | | |||
874 | void Form::autoAssignTabStops() | 883 | void Form::autoAssignTabStops() | ||
875 | { | 884 | { | ||
876 | VerticalWidgetList list(toplevelContainer()->widget()); | 885 | VerticalWidgetList list(toplevelContainer()->widget()); | ||
877 | HorizontalWidgetList hlist(toplevelContainer()->widget()); | 886 | HorizontalWidgetList hlist(toplevelContainer()->widget()); | ||
878 | 887 | | |||
879 | // 1. Collect all the containers, as we'll be sorting widgets groupped by containers | 888 | // 1. Collect all the containers, as we'll be sorting widgets groupped by containers | ||
880 | QSet<Container*> containers; | 889 | QSet<Container*> containers; | ||
881 | 890 | | |||
882 | collectContainers(toplevelContainer()->objectTree(), containers); | 891 | collectContainers(toplevelContainer()->objectTree(), containers); | ||
883 | 892 | | |||
884 | foreach (ObjectTreeItem *item, d->tabstops) { | 893 | foreach (ObjectTreeItem *item, d->tabstops) { | ||
885 | if (item->widget()) { | 894 | if (item->widget()) { | ||
886 | //qDebug() << "Widget to sort: " << item->widget(); | 895 | //qDebug() << "Widget to sort:" << item->widget(); | ||
887 | list.append(item->widget()); | 896 | list.append(item->widget()); | ||
888 | } | 897 | } | ||
889 | } | 898 | } | ||
890 | 899 | | |||
891 | list.sort(); | 900 | list.sort(); | ||
892 | //foreach (QWidget *w, list) { | 901 | //foreach (QWidget *w, list) { | ||
893 | // qDebug() << w->metaObject()->className() << w->objectName(); | 902 | // qDebug() << w->metaObject()->className() << w->objectName(); | ||
894 | //} | 903 | //} | ||
Show All 31 Lines | 920 | for (; it!=list.constEnd(); ++it) { | |||
926 | } | 935 | } | ||
927 | hlist.append(nextw); | 936 | hlist.append(nextw); | ||
928 | } | 937 | } | ||
929 | hlist.sort(); | 938 | hlist.sort(); | ||
930 | 939 | | |||
931 | foreach (QWidget *w, hlist) { | 940 | foreach (QWidget *w, hlist) { | ||
932 | ObjectTreeItem *tree = d->topTree->lookup(w->objectName()); | 941 | ObjectTreeItem *tree = d->topTree->lookup(w->objectName()); | ||
933 | if (tree) { | 942 | if (tree) { | ||
934 | //qDebug() << "adding " << tree->name(); | 943 | //qDebug() << "adding" << tree->name(); | ||
935 | d->tabstops.append(tree); | 944 | d->tabstops.append(tree); | ||
936 | } | 945 | } | ||
937 | } | 946 | } | ||
938 | 947 | | |||
939 | --it; | 948 | --it; | ||
940 | hlist.clear(); | 949 | hlist.clear(); | ||
941 | } | 950 | } | ||
942 | } | 951 | } | ||
▲ Show 20 Lines • Show All 270 Lines • ▼ Show 20 Line(s) | 1212 | { | |||
1213 | const QVariant value( p.value() ); | 1222 | const QVariant value( p.value() ); | ||
1214 | 1223 | | |||
1215 | // check if the name is valid (ie is correct identifier) and there is no name conflict | 1224 | // check if the name is valid (ie is correct identifier) and there is no name conflict | ||
1216 | if (property == "objectName") { | 1225 | if (property == "objectName") { | ||
1217 | if (d->selected.count() != 1) { | 1226 | if (d->selected.count() != 1) { | ||
1218 | qWarning() << "changing objectName property only allowed for single selection"; | 1227 | qWarning() << "changing objectName property only allowed for single selection"; | ||
1219 | return; | 1228 | return; | ||
1220 | } | 1229 | } | ||
1221 | if (!isNameValid(value.toString())) | 1230 | if (!checkNameValidity(value.toString(), CheckValidityOnly)) { | ||
1231 | // Tricky: revert later so if there's selectWidget() before, we can cancel selectWidget() | ||||
1232 | QTimer::singleShot(500, this, &Form::checkNameValidityForSelection); | ||||
1222 | return; | 1233 | return; | ||
1223 | } | 1234 | } | ||
1235 | } | ||||
1224 | else if (property == "paletteBackgroundPixmap") { | 1236 | else if (property == "paletteBackgroundPixmap") { | ||
1225 | // a widget with a background pixmap should have its own origin | 1237 | // a widget with a background pixmap should have its own origin | ||
1226 | // special types of properties handled separately | 1238 | // special types of properties handled separately | ||
1227 | } | 1239 | } | ||
1228 | else if (property == "paletteBackgroundColor") { | 1240 | else if (property == "paletteBackgroundColor") { | ||
1229 | d->setColorProperty(p, &QWidget::backgroundRole, p.value()); | 1241 | d->setColorProperty(p, &QWidget::backgroundRole, p.value()); | ||
1230 | return; | 1242 | return; | ||
1231 | } | 1243 | } | ||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Line(s) | 1305 | { | |||
1300 | foreach(QWidget* widget, d->selected) { | 1312 | foreach(QWidget* widget, d->selected) { | ||
1301 | ObjectTreeItem *titem = objectTree()->lookup(widget->objectName()); | 1313 | ObjectTreeItem *titem = objectTree()->lookup(widget->objectName()); | ||
1302 | if (titem && titem->modifiedProperties()->contains(property.name())) | 1314 | if (titem && titem->modifiedProperties()->contains(property.name())) | ||
1303 | widget->setProperty( | 1315 | widget->setProperty( | ||
1304 | property.name(), titem->modifiedProperties()->find(property.name()).value()); | 1316 | property.name(), titem->modifiedProperties()->find(property.name()).value()); | ||
1305 | } | 1317 | } | ||
1306 | } | 1318 | } | ||
1307 | 1319 | | |||
1308 | bool Form::isNameValid(const QString &name) const | 1320 | bool Form::checkNameValidity(const QString &name, CheckValidityMode mode) const | ||
1309 | { | 1321 | { | ||
1310 | if (d->selected.isEmpty()) | 1322 | if (d->selected.isEmpty()) | ||
1311 | return false; | 1323 | return false; | ||
1312 | //! @todo add to the undo buffer | 1324 | //! @todo add to the undo buffer | ||
1313 | QWidget *w = d->selected.first(); | 1325 | QWidget *w = d->selected.first(); | ||
1314 | //also update widget's name in QObject member | 1326 | | ||
1327 | if (name.isEmpty()) { | ||||
1328 | if (mode == CheckValidityShowMessages) { | ||||
1329 | KMessageBox::sorry(widget(), xi18n("Widget name could not be empty.")); | ||||
1330 | } | ||||
1331 | return false; | ||||
1332 | } | ||||
1315 | if (!KDb::isIdentifier(name)) { | 1333 | if (!KDb::isIdentifier(name)) { | ||
1334 | if (mode == CheckValidityShowMessages) { | ||||
1316 | KMessageBox::sorry(widget(), | 1335 | KMessageBox::sorry(widget(), | ||
1317 | xi18nc("@info", | 1336 | xi18nc("@info", | ||
1318 | "Could not rename widget <resource>%1</resource> to " | 1337 | "Could not rename widget <resource>%1</resource> to " | ||
1319 | "<resource>%2</resource> because " | 1338 | "<resource>%2</resource> because " | ||
1320 | "<resource>%3</resource> is not a valid name (identifier) for a widget.", | 1339 | "<resource>%3</resource> is not a valid name (identifier) for a widget.", | ||
1321 | w->objectName(), name, name)); | 1340 | w->objectName(), name, name)); | ||
1322 | d->slotPropertyChangedEnabled = false; | 1341 | } | ||
1323 | d->propertySet["objectName"].resetValue(); | | |||
1324 | d->slotPropertyChangedEnabled = true; | | |||
1325 | return false; | 1342 | return false; | ||
1326 | } | 1343 | } | ||
1327 | 1344 | if (name != w->objectName() && objectTree()->lookup(name)) { | |||
1328 | if (objectTree()->lookup(name)) { | 1345 | if (mode == CheckValidityShowMessages) { | ||
1329 | KMessageBox::sorry(widget(), | 1346 | KMessageBox::sorry(widget(), | ||
1330 | xi18nc("@info", | 1347 | xi18nc("@info", | ||
1331 | "Could not rename widget <resource>%1</resource> to <resource>%2</resource> " | 1348 | "Could not rename widget <resource>%1</resource> to <resource>%2</resource> " | ||
1332 | "because a widget with the name <resource>%3</resource> already exists.", | 1349 | "because a widget with the name <resource>%3</resource> already exists.", | ||
1333 | w->objectName(), name, name)); | 1350 | w->objectName(), name, name)); | ||
1334 | d->slotPropertyChangedEnabled = false; | 1351 | } | ||
1335 | d->propertySet["objectName"].resetValue(); | | |||
1336 | d->slotPropertyChangedEnabled = true; | | |||
1337 | return false; | 1352 | return false; | ||
1338 | } | 1353 | } | ||
1339 | 1354 | | |||
1340 | return true; | 1355 | return true; | ||
1341 | } | 1356 | } | ||
1342 | 1357 | | |||
1358 | void Form::checkNameValidityForSelection() | ||||
1359 | { | ||||
1360 | if (!checkNameValidity(d->propertySet.propertyValue("objectName").toString(), CheckValidityShowMessages)) { | ||||
1361 | KexiUtils::BoolBlocker blocker(&d->slotPropertyChangedEnabled, false); | ||||
1362 | d->propertySet["objectName"].resetValue(); | ||||
1363 | KexiMainWindowIface::global()->updatePropertyEditorInfoLabel(); | ||||
1364 | } | ||||
1365 | } | ||||
1366 | | ||||
1343 | void Form::undo() | 1367 | void Form::undo() | ||
1344 | { | 1368 | { | ||
1345 | if (!objectTree()) | 1369 | if (!objectTree()) | ||
1346 | return; | 1370 | return; | ||
1347 | if (!d->undoStack.canUndo()) { | 1371 | if (!d->undoStack.canUndo()) { | ||
1348 | qWarning() << "cannot redo"; | 1372 | qWarning() << "cannot redo"; | ||
1349 | return; | 1373 | return; | ||
1350 | } | 1374 | } | ||
▲ Show 20 Lines • Show All 127 Lines • ▼ Show 20 Line(s) | 1494 | //! @todo ineffective, get property names directly | |||
1478 | 1502 | | |||
1479 | // add subproperties if available | 1503 | // add subproperties if available | ||
1480 | WidgetWithSubpropertiesInterface* subpropIface | 1504 | WidgetWithSubpropertiesInterface* subpropIface | ||
1481 | = dynamic_cast<WidgetWithSubpropertiesInterface*>(w); | 1505 | = dynamic_cast<WidgetWithSubpropertiesInterface*>(w); | ||
1482 | if (subpropIface) { | 1506 | if (subpropIface) { | ||
1483 | const QSet<QByteArray> subproperties(subpropIface->subproperties()); | 1507 | const QSet<QByteArray> subproperties(subpropIface->subproperties()); | ||
1484 | foreach(const QByteArray& propName, subproperties) { | 1508 | foreach(const QByteArray& propName, subproperties) { | ||
1485 | propNames.insert(propName); | 1509 | propNames.insert(propName); | ||
1486 | //qDebug() << "Added subproperty: " << propName; | 1510 | //qDebug() << "Added subproperty:" << propName; | ||
1487 | } | 1511 | } | ||
1488 | } | 1512 | } | ||
1489 | 1513 | | |||
1490 | // iterate over the property list, and create Property objects | 1514 | // iterate over the property list, and create Property objects | ||
1491 | foreach(const QByteArray& propName, propNames) { | 1515 | foreach(const QByteArray& propName, propNames) { | ||
1492 | //qDebug() << ">> " << propName; | 1516 | //qDebug() << ">>" << propName; | ||
1493 | const QMetaProperty subMeta = // special case - subproperty | 1517 | const QMetaProperty subMeta = // special case - subproperty | ||
1494 | subpropIface ? subpropIface->findMetaSubproperty(propName) : QMetaProperty(); | 1518 | subpropIface ? subpropIface->findMetaSubproperty(propName) : QMetaProperty(); | ||
1495 | const QMetaProperty meta = subMeta.isValid() ? subMeta | 1519 | const QMetaProperty meta = subMeta.isValid() ? subMeta | ||
1496 | : KexiUtils::findPropertyWithSuperclasses(w, propName.constData()); | 1520 | : KexiUtils::findPropertyWithSuperclasses(w, propName.constData()); | ||
1497 | if (!meta.isValid()) { | 1521 | if (!meta.isValid()) { | ||
1498 | //qDebug() << "!meta.isValid()"; | 1522 | //qDebug() << "!meta.isValid()"; | ||
1499 | continue; | 1523 | continue; | ||
1500 | } | 1524 | } | ||
1501 | const char* propertyName = meta.name(); | 1525 | const char* propertyName = meta.name(); | ||
1502 | QWidget *subwidget = subMeta.isValid()//subpropIface | 1526 | QWidget *subwidget = subMeta.isValid()//subpropIface | ||
1503 | ? (subpropIface ? subpropIface->subwidget() : 0) | 1527 | ? (subpropIface ? subpropIface->subwidget() : 0) | ||
1504 | : w; | 1528 | : w; | ||
1505 | WidgetInfo *subwinfo = subwidget ? library()->widgetInfoForClassName( | 1529 | WidgetInfo *subwinfo = subwidget ? library()->widgetInfoForClassName( | ||
1506 | subwidget->metaObject()->className()) : 0; | 1530 | subwidget->metaObject()->className()) : 0; | ||
1507 | // qDebug() << "$$$ " << subwidget->className(); | 1531 | // qDebug() << "$$$" << subwidget->className(); | ||
1508 | 1532 | | |||
1509 | if ( subwinfo | 1533 | if ( subwinfo | ||
1510 | && meta.isDesignable(subwidget) | 1534 | && meta.isDesignable(subwidget) | ||
1511 | && meta.isWritable() | 1535 | && meta.isWritable() | ||
1512 | && meta.isReadable() && !d->propertySet.contains(propertyName) | 1536 | && meta.isReadable() && !d->propertySet.contains(propertyName) | ||
1513 | ) | 1537 | ) | ||
1514 | { | 1538 | { | ||
1515 | //! \todo add another list for property description | 1539 | //! \todo add another list for property description | ||
▲ Show 20 Lines • Show All 123 Lines • ▼ Show 20 Line(s) | |||||
1639 | } | 1663 | } | ||
1640 | 1664 | | |||
1641 | void Form::updatePropertiesForSelection(QWidget *w, WidgetSelectionFlags flags) | 1665 | void Form::updatePropertiesForSelection(QWidget *w, WidgetSelectionFlags flags) | ||
1642 | { | 1666 | { | ||
1643 | if (!w) { | 1667 | if (!w) { | ||
1644 | //! @todo clearSet()? | 1668 | //! @todo clearSet()? | ||
1645 | return; | 1669 | return; | ||
1646 | } | 1670 | } | ||
1671 | KexiMainWindowIface::global()->beginPropertyPaneUpdate(); | ||||
1647 | 1672 | | |||
1648 | // if our list is empty,don't use add parameter value | 1673 | // if our list is empty,don't use add parameter value | ||
1649 | if (d->selected.isEmpty() == 0) { | 1674 | if (d->selected.isEmpty() == 0) { | ||
1650 | flags |= ReplacePreviousSelection; | 1675 | flags |= ReplacePreviousSelection; | ||
1651 | } | 1676 | } | ||
1652 | 1677 | | |||
1653 | if (flags & ReplacePreviousSelection) { | 1678 | if (flags & ReplacePreviousSelection) { | ||
1654 | createPropertiesForWidget(w); | 1679 | createPropertiesForWidget(w); | ||
1655 | w->installEventFilter(this); | 1680 | w->installEventFilter(this); | ||
1656 | connect(w, SIGNAL(destroyed()), this, SLOT(widgetDestroyed())); | 1681 | connect(w, SIGNAL(destroyed()), this, SLOT(widgetDestroyed())); | ||
1657 | } | 1682 | } | ||
1658 | else { | 1683 | else { | ||
1659 | addWidget(w); | 1684 | addWidget(w); | ||
1660 | } | 1685 | } | ||
1661 | 1686 | | |||
1662 | if (flags & LastSelection) { | 1687 | if (flags & LastSelection) { | ||
1663 | emit propertySetSwitched(); | 1688 | emit propertySetSwitched(); | ||
1664 | } | 1689 | } | ||
1690 | KexiMainWindowIface::global()->endPropertyPaneUpdate(); | ||||
1665 | } | 1691 | } | ||
1666 | 1692 | | |||
1667 | KPropertySet* Form::propertySet() | 1693 | KPropertySet* Form::propertySet() | ||
1668 | { | 1694 | { | ||
1669 | return &d->propertySet; | 1695 | return &d->propertySet; | ||
1670 | } | 1696 | } | ||
1671 | 1697 | | |||
1672 | bool Form::isSnapToGridEnabled() const | 1698 | bool Form::isSnapToGridEnabled() const | ||
▲ Show 20 Lines • Show All 1004 Lines • Show Last 20 Lines |