forked from qt-creator/qt-creator
		
	Clang: add clang plugins checks to code model settings
Add UI controls to change settings and apply them together with warnings and command line options. Current settings are not very flexible but should be easy to test and use without reading tidy/clazy help. Change-Id: I1ca6b49a42a1169b34a703dd50de0bbc105df28f Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
		
							
								
								
									
										80
									
								
								src/plugins/cpptools/clazychecks.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/plugins/cpptools/clazychecks.ui
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>CppTools::ClazyChecks</class> | ||||
|  <widget class="QWidget" name="CppTools::ClazyChecks"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>503</width> | ||||
|     <height>40</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="sizePolicy"> | ||||
|    <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> | ||||
|     <horstretch>0</horstretch> | ||||
|     <verstretch>0</verstretch> | ||||
|    </sizepolicy> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <property name="spacing"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="leftMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="topMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="rightMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="bottomMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <item> | ||||
|     <widget class="QComboBox" name="clazyLevel"> | ||||
|      <property name="sizePolicy"> | ||||
|       <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> | ||||
|        <horstretch>0</horstretch> | ||||
|        <verstretch>0</verstretch> | ||||
|       </sizepolicy> | ||||
|      </property> | ||||
|      <property name="currentIndex"> | ||||
|       <number>0</number> | ||||
|      </property> | ||||
|      <item> | ||||
|       <property name="text"> | ||||
|        <string>Disable</string> | ||||
|       </property> | ||||
|      </item> | ||||
|      <item> | ||||
|       <property name="text"> | ||||
|        <string>level0</string> | ||||
|       </property> | ||||
|      </item> | ||||
|      <item> | ||||
|       <property name="text"> | ||||
|        <string>level1</string> | ||||
|       </property> | ||||
|      </item> | ||||
|      <item> | ||||
|       <property name="text"> | ||||
|        <string>level2</string> | ||||
|       </property> | ||||
|      </item> | ||||
|      <item> | ||||
|       <property name="text"> | ||||
|        <string>level3</string> | ||||
|       </property> | ||||
|      </item> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
| @@ -67,6 +67,12 @@ static QString skipIndexingBigFilesKey() | ||||
| static QString indexerFileSizeLimitKey() | ||||
| { return QLatin1String(Constants::CPPTOOLS_INDEXER_FILE_SIZE_LIMIT); } | ||||
|  | ||||
| static QString tidyChecksKey() | ||||
| { return QLatin1String(Constants::CPPTOOLS_TIDY_CHECKS); } | ||||
|  | ||||
| static QString clazyChecksKey() | ||||
| { return QLatin1String(Constants::CPPTOOLS_CLAZY_CHECKS); } | ||||
|  | ||||
| void CppCodeModelSettings::fromSettings(QSettings *s) | ||||
| { | ||||
|     s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); | ||||
| @@ -101,6 +107,12 @@ void CppCodeModelSettings::fromSettings(QSettings *s) | ||||
|     const QVariant indexerFileSizeLimit = s->value(indexerFileSizeLimitKey(), 5); | ||||
|     setIndexerFileSizeLimitInMb(indexerFileSizeLimit.toInt()); | ||||
|  | ||||
|     const QVariant tidyChecks = s->value(tidyChecksKey(), | ||||
|                                          QString("clang-diagnostic-*,llvm-*,misc-*")); | ||||
|     setTidyChecks(tidyChecks.toString()); | ||||
|     const QVariant clazyChecks = s->value(clazyChecksKey(), QString("level1")); | ||||
|     setClazyChecks(clazyChecks.toString()); | ||||
|  | ||||
|     s->endGroup(); | ||||
|  | ||||
|     emit changed(); | ||||
| @@ -127,6 +139,8 @@ void CppCodeModelSettings::toSettings(QSettings *s) | ||||
|     s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders()); | ||||
|     s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles()); | ||||
|     s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb()); | ||||
|     s->setValue(tidyChecksKey(), tidyChecks()); | ||||
|     s->setValue(clazyChecksKey(), clazyChecks()); | ||||
|  | ||||
|     s->endGroup(); | ||||
|  | ||||
| @@ -204,3 +218,23 @@ void CppCodeModelSettings::setIndexerFileSizeLimitInMb(int sizeInMB) | ||||
| { | ||||
|     m_indexerFileSizeLimitInMB = sizeInMB; | ||||
| } | ||||
|  | ||||
| QString CppCodeModelSettings::tidyChecks() const | ||||
| { | ||||
|     return m_tidyChecks; | ||||
| } | ||||
|  | ||||
| void CppCodeModelSettings::setTidyChecks(QString checks) | ||||
| { | ||||
|     m_tidyChecks = checks; | ||||
| } | ||||
|  | ||||
| QString CppCodeModelSettings::clazyChecks() const | ||||
| { | ||||
|     return m_clazyChecks; | ||||
| } | ||||
|  | ||||
| void CppCodeModelSettings::setClazyChecks(QString checks) | ||||
| { | ||||
|     m_clazyChecks = checks; | ||||
| } | ||||
|   | ||||
| @@ -72,6 +72,12 @@ public: | ||||
|     int indexerFileSizeLimitInMb() const; | ||||
|     void setIndexerFileSizeLimitInMb(int sizeInMB); | ||||
|  | ||||
|     QString tidyChecks() const; | ||||
|     void setTidyChecks(QString checks); | ||||
|  | ||||
|     QString clazyChecks() const; | ||||
|     void setClazyChecks(QString checks); | ||||
|  | ||||
| public: // for tests | ||||
|     void emitChanged(); | ||||
|  | ||||
| @@ -86,6 +92,9 @@ private: | ||||
|     int m_indexerFileSizeLimitInMB = 5; | ||||
|     ClangDiagnosticConfigs m_clangCustomDiagnosticConfigs; | ||||
|     Core::Id m_clangDiagnosticConfigId; | ||||
|  | ||||
|     QString m_tidyChecks; | ||||
|     QString m_clazyChecks; | ||||
| }; | ||||
|  | ||||
| } // namespace CppTools | ||||
|   | ||||
| @@ -29,6 +29,8 @@ | ||||
| #include "cppmodelmanager.h" | ||||
| #include "cpptoolsconstants.h" | ||||
| #include "ui_cppcodemodelsettingspage.h" | ||||
| #include "ui_clazychecks.h" | ||||
| #include "ui_tidychecks.h" | ||||
|  | ||||
| #include <coreplugin/icore.h> | ||||
| #include <utils/algorithm.h> | ||||
| @@ -84,6 +86,65 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() | ||||
|                                             diagnosticConfigsModel, | ||||
|                                             m_settings->clangDiagnosticConfigId()); | ||||
|     m_ui->clangSettingsGroupBox->layout()->addWidget(m_clangDiagnosticConfigsWidget); | ||||
|  | ||||
|     setupPluginsWidgets(); | ||||
| } | ||||
|  | ||||
| void CppCodeModelSettingsWidget::setupPluginsWidgets() | ||||
| { | ||||
|     m_clazyChecks.reset(new CppTools::Ui::ClazyChecks); | ||||
|     m_clazyChecksWidget = new QWidget(); | ||||
|     m_clazyChecks->setupUi(m_clazyChecksWidget); | ||||
|  | ||||
|     m_tidyChecks.reset(new CppTools::Ui::TidyChecks); | ||||
|     m_tidyChecksWidget = new QWidget(); | ||||
|     m_tidyChecks->setupUi(m_tidyChecksWidget); | ||||
|  | ||||
|     m_ui->pluginChecks->layout()->addWidget(m_tidyChecksWidget); | ||||
|     m_ui->pluginChecks->layout()->addWidget(m_clazyChecksWidget); | ||||
|     m_clazyChecksWidget->setVisible(false); | ||||
|     connect(m_ui->pluginSelection, | ||||
|             static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged), | ||||
|             [this](int index) { | ||||
|         (index ? m_clazyChecksWidget : m_tidyChecksWidget)->setVisible(true); | ||||
|         (!index ? m_clazyChecksWidget : m_tidyChecksWidget)->setVisible(false); | ||||
|     }); | ||||
|  | ||||
|     setupTidyChecks(); | ||||
|     setupClazyChecks(); | ||||
| } | ||||
|  | ||||
| void CppCodeModelSettingsWidget::setupTidyChecks() | ||||
| { | ||||
|     m_currentTidyChecks = m_settings->tidyChecks(); | ||||
|     for (QObject *child : m_tidyChecksWidget->children()) { | ||||
|         auto *check = qobject_cast<QCheckBox *>(child); | ||||
|         if (!check) | ||||
|             continue; | ||||
|         if (m_currentTidyChecks.indexOf(check->text()) != -1) | ||||
|             check->setChecked(true); | ||||
|         connect(check, &QCheckBox::clicked, [this, check](bool checked) { | ||||
|             const QString prefix = check->text(); | ||||
|             checked ? m_currentTidyChecks.append(',' + prefix) | ||||
|                     : m_currentTidyChecks.remove(',' + prefix); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void CppCodeModelSettingsWidget::setupClazyChecks() | ||||
| { | ||||
|     m_currentClazyChecks = m_settings->clazyChecks(); | ||||
|     if (!m_currentClazyChecks.isEmpty()) | ||||
|         m_clazyChecks->clazyLevel->setCurrentText(m_currentClazyChecks); | ||||
|     connect(m_clazyChecks->clazyLevel, | ||||
|             static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged), | ||||
|             [this](int index) { | ||||
|         if (index == 0) { | ||||
|             m_currentClazyChecks.clear(); | ||||
|             return; | ||||
|         } | ||||
|         m_currentClazyChecks = m_clazyChecks->clazyLevel->itemText(index); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| void CppCodeModelSettingsWidget::setupGeneralWidgets() | ||||
| @@ -117,6 +178,16 @@ bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const | ||||
|         settingsChanged = true; | ||||
|     } | ||||
|  | ||||
|     if (m_settings->tidyChecks() != m_currentTidyChecks) { | ||||
|         m_settings->setTidyChecks(m_currentTidyChecks); | ||||
|         settingsChanged = true; | ||||
|     } | ||||
|  | ||||
|     if (m_settings->clazyChecks() != m_currentClazyChecks) { | ||||
|         m_settings->setClazyChecks(m_currentClazyChecks); | ||||
|         settingsChanged = true; | ||||
|     } | ||||
|  | ||||
|     return settingsChanged; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -32,6 +32,8 @@ | ||||
| #include <QPointer> | ||||
| #include <QWidget> | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| QT_FORWARD_DECLARE_CLASS(QComboBox) | ||||
| QT_FORWARD_DECLARE_CLASS(QSettings) | ||||
|  | ||||
| @@ -39,6 +41,11 @@ namespace CppTools { | ||||
|  | ||||
| class ClangDiagnosticConfigsWidget; | ||||
|  | ||||
| namespace Ui { | ||||
| class ClazyChecks; | ||||
| class TidyChecks; | ||||
| } // namespace Ui | ||||
|  | ||||
| namespace Internal { | ||||
|  | ||||
| namespace Ui { class CppCodeModelSettingsPage; } | ||||
| @@ -57,6 +64,9 @@ public: | ||||
| private: | ||||
|     void setupGeneralWidgets(); | ||||
|     void setupClangCodeModelWidgets(); | ||||
|     void setupPluginsWidgets(); | ||||
|     void setupTidyChecks(); | ||||
|     void setupClazyChecks(); | ||||
|  | ||||
|     bool applyGeneralWidgetsToSettings() const; | ||||
|     bool applyClangCodeModelWidgetsToSettings() const; | ||||
| @@ -65,6 +75,14 @@ private: | ||||
|     Ui::CppCodeModelSettingsPage *m_ui; | ||||
|     QPointer<ClangDiagnosticConfigsWidget> m_clangDiagnosticConfigsWidget; | ||||
|     QSharedPointer<CppCodeModelSettings> m_settings; | ||||
|  | ||||
|     std::unique_ptr<CppTools::Ui::ClazyChecks> m_clazyChecks; | ||||
|     QWidget *m_clazyChecksWidget; | ||||
|     QString m_currentClazyChecks; | ||||
|  | ||||
|     std::unique_ptr<CppTools::Ui::TidyChecks> m_tidyChecks; | ||||
|     QWidget *m_tidyChecksWidget; | ||||
|     QString m_currentTidyChecks; | ||||
| }; | ||||
|  | ||||
| class CppCodeModelSettingsPage: public Core::IOptionsPage | ||||
|   | ||||
| @@ -108,6 +108,43 @@ | ||||
|      <layout class="QVBoxLayout" name="verticalLayout_3"/> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QGroupBox" name="clangPlugins"> | ||||
|      <property name="title"> | ||||
|       <string>Clang Plugins</string> | ||||
|      </property> | ||||
|      <layout class="QVBoxLayout" name="verticalLayout_6"> | ||||
|       <item> | ||||
|        <widget class="QComboBox" name="pluginSelection"> | ||||
|         <property name="sizePolicy"> | ||||
|          <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> | ||||
|           <horstretch>0</horstretch> | ||||
|           <verstretch>0</verstretch> | ||||
|          </sizepolicy> | ||||
|         </property> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>ClangTidy</string> | ||||
|          </property> | ||||
|         </item> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Clazy</string> | ||||
|          </property> | ||||
|         </item> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QGroupBox" name="pluginChecks"> | ||||
|         <property name="title"> | ||||
|          <string>Checks</string> | ||||
|         </property> | ||||
|         <layout class="QVBoxLayout" name="verticalLayout_5"/> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <spacer name="verticalSpacer"> | ||||
|      <property name="orientation"> | ||||
|   | ||||
| @@ -183,7 +183,9 @@ FORMS += \ | ||||
|     clangdiagnosticconfigswidget.ui \ | ||||
|     cppcodemodelsettingspage.ui \ | ||||
|     cppcodestylesettingspage.ui \ | ||||
|     cppfilesettingspage.ui | ||||
|     cppfilesettingspage.ui \ | ||||
|     clazychecks.ui \ | ||||
|     tidychecks.ui | ||||
|  | ||||
| equals(TEST, 1) { | ||||
|     HEADERS += \ | ||||
|   | ||||
| @@ -49,6 +49,7 @@ Project { | ||||
|             "clangdiagnosticconfigswidget.cpp", | ||||
|             "clangdiagnosticconfigswidget.h", | ||||
|             "clangdiagnosticconfigswidget.ui", | ||||
|             "clazychecks.ui", | ||||
|             "compileroptionsbuilder.cpp", | ||||
|             "compileroptionsbuilder.h", | ||||
|             "cppcanonicalsymbol.cpp", | ||||
| @@ -201,6 +202,7 @@ Project { | ||||
|             "symbolfinder.h", | ||||
|             "symbolsfindfilter.cpp", | ||||
|             "symbolsfindfilter.h", | ||||
|             "tidychecks.ui", | ||||
|             "typehierarchybuilder.cpp", | ||||
|             "typehierarchybuilder.h", | ||||
|             "usages.h" | ||||
|   | ||||
| @@ -56,6 +56,8 @@ const char CPPTOOLS_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS[] | ||||
|     = "InterpretAmbiguousHeadersAsCHeaders"; | ||||
| const char CPPTOOLS_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; | ||||
| const char CPPTOOLS_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; | ||||
| const char CPPTOOLS_TIDY_CHECKS[] = "TidyChecks"; | ||||
| const char CPPTOOLS_CLAZY_CHECKS[] = "ClazyChecks"; | ||||
|  | ||||
| const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[] | ||||
|     = "Builtin.EverythingWithExceptions"; | ||||
|   | ||||
							
								
								
									
										157
									
								
								src/plugins/cpptools/tidychecks.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								src/plugins/cpptools/tidychecks.ui
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>CppTools::TidyChecks</class> | ||||
|  <widget class="QWidget" name="CppTools::TidyChecks"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>682</width> | ||||
|     <height>300</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||
|    <property name="leftMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="topMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="rightMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="bottomMargin"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <item> | ||||
|     <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="androidCheck"> | ||||
|        <property name="text"> | ||||
|         <string>android-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="boostCheck"> | ||||
|        <property name="text"> | ||||
|         <string>boost-</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="bugproneCheck"> | ||||
|        <property name="text"> | ||||
|         <string>bugprone-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="certCheck"> | ||||
|        <property name="text"> | ||||
|         <string>cert-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="coreCheck"> | ||||
|        <property name="text"> | ||||
|         <string>cppcoreguidelines-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|    </item> | ||||
|    <item> | ||||
|     <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="analyzerCheck"> | ||||
|        <property name="text"> | ||||
|         <string>clang-analyzer-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="diagnosticCheck"> | ||||
|        <property name="text"> | ||||
|         <string>clang-diagnostic-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="googleCheck"> | ||||
|        <property name="text"> | ||||
|         <string>google-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="hicppCheck"> | ||||
|        <property name="text"> | ||||
|         <string>hicpp-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="llvmCheck"> | ||||
|        <property name="text"> | ||||
|         <string>llvm-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|    </item> | ||||
|    <item> | ||||
|     <layout class="QHBoxLayout" name="horizontalLayout_3"> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="miscCheck"> | ||||
|        <property name="text"> | ||||
|         <string>misc-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="modernizeCheck"> | ||||
|        <property name="text"> | ||||
|         <string>modernize-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="mpiCheck"> | ||||
|        <property name="text"> | ||||
|         <string>mpi-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="objcCheck"> | ||||
|        <property name="text"> | ||||
|         <string>objc-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="performanceCheck"> | ||||
|        <property name="text"> | ||||
|         <string>performance-*</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QCheckBox" name="readabilityCheck"> | ||||
|      <property name="text"> | ||||
|       <string>readability-*</string> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
		Reference in New Issue
	
	Block a user