1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2018 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the Qt Designer of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:BSD$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** BSD License Usage 18 ** Alternatively, you may use this file under the terms of the BSD license 19 ** as follows: 20 ** 21 ** "Redistribution and use in source and binary forms, with or without 22 ** modification, are permitted provided that the following conditions are 23 ** met: 24 ** * Redistributions of source code must retain the above copyright 25 ** notice, this list of conditions and the following disclaimer. 26 ** * Redistributions in binary form must reproduce the above copyright 27 ** notice, this list of conditions and the following disclaimer in 28 ** the documentation and/or other materials provided with the 29 ** distribution. 30 ** * Neither the name of The Qt Company Ltd nor the names of its 31 ** contributors may be used to endorse or promote products derived 32 ** from this software without specific prior written permission. 33 ** 34 ** 35 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 36 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 37 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 38 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 39 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 42 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 43 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 44 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 45 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 46 ** 47 ** $QT_END_LICENSE$ 48 ** 49 ****************************************************************************/ 50 51 #ifndef ABSTRACTFORMBUILDERPRIVATE_H 52 #define ABSTRACTFORMBUILDERPRIVATE_H 53 54 // 55 // W A R N I N G 56 // ------------- 57 // 58 // This file is not part of the Qt API. It exists purely as an 59 // implementation detail. This header file may change from version to 60 // version without notice, or even be removed. 61 // 62 // We mean it. 63 // 64 65 #include "uilib_global.h" 66 67 #include <QtCore/qhash.h> 68 #include <QtCore/qpointer.h> 69 #include <QtCore/qstringlist.h> 70 #include <QtCore/qmap.h> 71 #include <QtCore/qdir.h> 72 #include <QtGui/qpalette.h> 73 74 QT_BEGIN_NAMESPACE 75 76 class QDesignerCustomWidgetInterface; 77 class QObject; 78 class QVariant; 79 class QWidget; 80 class QObject; 81 class QLabel; 82 class QButtonGroup; 83 class QBoxLayout; 84 class QGridLayout; 85 class QAction; 86 class QActionGroup; 87 88 #ifdef QFORMINTERNAL_NAMESPACE 89 namespace QFormInternal 90 { 91 #endif 92 93 class DomBrush; 94 class DomButtonGroups; 95 class DomButtonGroup; 96 class DomColorGroup; 97 class DomCustomWidget; 98 class DomPalette; 99 class DomProperty; 100 class DomUI; 101 102 class QAbstractFormBuilder; 103 class QResourceBuilder; 104 class QTextBuilder; 105 106 class QDESIGNER_UILIB_EXPORT QFormBuilderExtra 107 { 108 public: 109 QFormBuilderExtra(); 110 ~QFormBuilderExtra(); 111 112 struct CustomWidgetData { 113 CustomWidgetData(); 114 explicit CustomWidgetData(const DomCustomWidget *dc); 115 116 QString addPageMethod; 117 QString script; 118 QString baseClass; 119 bool isContainer = false; 120 }; 121 122 void clear(); 123 124 DomUI *readUi(QIODevice *dev); 125 static QString msgInvalidUiFile(); 126 127 bool applyPropertyInternally(QObject *o, const QString &propertyName, const QVariant &value); 128 129 enum BuddyMode { BuddyApplyAll, BuddyApplyVisibleOnly }; 130 131 void applyInternalProperties() const; 132 static bool applyBuddy(const QString &buddyName, BuddyMode applyMode, QLabel *label); 133 134 const QPointer<QWidget> &parentWidget() const; 135 bool parentWidgetIsSet() const; 136 void setParentWidget(const QPointer<QWidget> &w); 137 138 void setProcessingLayoutWidget(bool processing); 139 bool processingLayoutWidget() const; 140 141 void setResourceBuilder(QResourceBuilder *builder); 142 QResourceBuilder *resourceBuilder() const; 143 144 void setTextBuilder(QTextBuilder *builder); 145 QTextBuilder *textBuilder() const; 146 147 void storeCustomWidgetData(const QString &className, const DomCustomWidget *d); 148 QString customWidgetAddPageMethod(const QString &className) const; 149 QString customWidgetBaseClass(const QString &className) const; 150 bool isCustomWidgetContainer(const QString &className) const; 151 152 // --- Hash used in creating button groups on demand. Store a map of name and pair of dom group and real group 153 void registerButtonGroups(const DomButtonGroups *groups); 154 155 using ButtonGroupEntry = QPair<DomButtonGroup *, QButtonGroup*>; 156 using ButtonGroupHash = QHash<QString, ButtonGroupEntry>; buttonGroups()157 const ButtonGroupHash &buttonGroups() const { return m_buttonGroups; } buttonGroups()158 ButtonGroupHash &buttonGroups() { return m_buttonGroups; } 159 160 // return stretch as a comma-separated list 161 static QString boxLayoutStretch(const QBoxLayout*); 162 // apply stretch 163 static bool setBoxLayoutStretch(const QString &, QBoxLayout*); 164 static void clearBoxLayoutStretch(QBoxLayout*); 165 166 static QString gridLayoutRowStretch(const QGridLayout *); 167 static bool setGridLayoutRowStretch(const QString &, QGridLayout *); 168 static void clearGridLayoutRowStretch(QGridLayout *); 169 170 static QString gridLayoutColumnStretch(const QGridLayout *); 171 static bool setGridLayoutColumnStretch(const QString &, QGridLayout *); 172 static void clearGridLayoutColumnStretch(QGridLayout *); 173 174 // return the row/column sizes as comma-separated lists 175 static QString gridLayoutRowMinimumHeight(const QGridLayout *); 176 static bool setGridLayoutRowMinimumHeight(const QString &, QGridLayout *); 177 static void clearGridLayoutRowMinimumHeight(QGridLayout *); 178 179 static QString gridLayoutColumnMinimumWidth(const QGridLayout *); 180 static bool setGridLayoutColumnMinimumWidth(const QString &, QGridLayout *); 181 static void clearGridLayoutColumnMinimumWidth(QGridLayout *); 182 183 static void setPixmapProperty(DomProperty *p, const QPair<QString, QString> &ip); 184 static QPalette loadPalette(const DomPalette *dom); 185 static void setupColorGroup(QPalette *palette, QPalette::ColorGroup colorGroup, 186 const DomColorGroup *group); 187 static DomColorGroup *saveColorGroup(const QPalette &palette, 188 QPalette::ColorGroup colorGroup); 189 static DomPalette *savePalette(const QPalette &palette); 190 static QBrush setupBrush(const DomBrush *brush); 191 static DomBrush *saveBrush(const QBrush &br); 192 193 QStringList m_pluginPaths; 194 QMap<QString, QDesignerCustomWidgetInterface*> m_customWidgets; 195 196 QHash<QObject*, bool> m_laidout; 197 QHash<QString, QAction*> m_actions; 198 QHash<QString, QActionGroup*> m_actionGroups; 199 int m_defaultMargin; 200 int m_defaultSpacing; 201 QDir m_workingDirectory; 202 QString m_errorString; 203 QString m_language; 204 205 private: 206 void clearResourceBuilder(); 207 void clearTextBuilder(); 208 209 using BuddyHash = QHash<QLabel*, QString>; 210 BuddyHash m_buddies; 211 212 QHash<QString, CustomWidgetData> m_customWidgetDataHash; 213 214 ButtonGroupHash m_buttonGroups; 215 216 bool m_layoutWidget = false; 217 QResourceBuilder *m_resourceBuilder = nullptr; 218 QTextBuilder *m_textBuilder = nullptr; 219 220 QPointer<QWidget> m_parentWidget; 221 bool m_parentWidgetIsSet = false; 222 }; 223 224 void uiLibWarning(const QString &message); 225 226 // Struct with static accessor that provides most strings used in the form builder. 227 struct QDESIGNER_UILIB_EXPORT QFormBuilderStrings { 228 QFormBuilderStrings(); 229 230 static const QFormBuilderStrings &instance(); 231 232 const QString buddyProperty; 233 const QString cursorProperty; 234 const QString objectNameProperty; 235 const QString trueValue; 236 const QString falseValue; 237 const QString horizontalPostFix; 238 const QString separator; 239 const QString defaultTitle; 240 const QString titleAttribute; 241 const QString labelAttribute; 242 const QString toolTipAttribute; 243 const QString whatsThisAttribute; 244 const QString flagsAttribute; 245 const QString iconAttribute; 246 const QString pixmapAttribute; 247 const QString textAttribute; 248 const QString currentIndexProperty; 249 const QString toolBarAreaAttribute; 250 const QString toolBarBreakAttribute; 251 const QString dockWidgetAreaAttribute; 252 const QString marginProperty; 253 const QString spacingProperty; 254 const QString leftMarginProperty; 255 const QString topMarginProperty; 256 const QString rightMarginProperty; 257 const QString bottomMarginProperty; 258 const QString horizontalSpacingProperty; 259 const QString verticalSpacingProperty; 260 const QString sizeHintProperty; 261 const QString sizeTypeProperty; 262 const QString orientationProperty; 263 const QString styleSheetProperty; 264 const QString qtHorizontal; 265 const QString qtVertical; 266 const QString currentRowProperty; 267 const QString tabSpacingProperty; 268 const QString qWidgetClass; 269 const QString lineClass; 270 const QString geometryProperty; 271 const QString scriptWidgetVariable; 272 const QString scriptChildWidgetsVariable; 273 274 using RoleNName = QPair<Qt::ItemDataRole, QString>; 275 QList<RoleNName> itemRoles; 276 QHash<QString, Qt::ItemDataRole> treeItemRoleHash; 277 278 // first.first is primary role, first.second is shadow role. 279 // Shadow is used for either the translation source or the designer 280 // representation of the string value. 281 using TextRoleNName = QPair<QPair<Qt::ItemDataRole, Qt::ItemDataRole>, QString>; 282 QList<TextRoleNName> itemTextRoles; 283 QHash<QString, QPair<Qt::ItemDataRole, Qt::ItemDataRole> > treeItemTextRoleHash; 284 }; 285 #ifdef QFORMINTERNAL_NAMESPACE 286 } 287 #endif 288 289 QT_END_NAMESPACE 290 291 #endif // ABSTRACTFORMBUILDERPRIVATE_H 292