From e3c97a1914aa0a521b55b53ab1b0d71732c5e466 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 17 Sep 2014 01:23:57 +0200 Subject: QtAutogen: Process all ui files in a source file (#14981). Use a vector to store a list of matched ui_ includes, instead of overwriting the previous match. --- Source/cmQtAutoGenerators.cxx | 41 ++++++++++++++++++--------------- Source/cmQtAutoGenerators.h | 24 ++++++++++---------- Tests/QtAutogen/CMakeLists.txt | 1 + Tests/QtAutogen/multiplewidgets.cpp | 19 ++++++++++++++++ Tests/QtAutogen/multiplewidgets.h | 33 +++++++++++++++++++++++++++ Tests/QtAutogen/widget1.ui | 45 +++++++++++++++++++++++++++++++++++++ Tests/QtAutogen/widget2.ui | 29 ++++++++++++++++++++++++ 7 files changed, 162 insertions(+), 30 deletions(-) create mode 100644 Tests/QtAutogen/multiplewidgets.cpp create mode 100644 Tests/QtAutogen/multiplewidgets.h create mode 100644 Tests/QtAutogen/widget1.ui create mode 100644 Tests/QtAutogen/widget2.ui diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 4b8f810..b9d3004 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -1296,8 +1296,8 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) const std::vector& headerExtensions = makefile->GetHeaderExtensions(); - std::map includedUis; - std::map skippedUis; + std::map > includedUis; + std::map > skippedUis; std::vector uicSkipped; cmSystemTools::ExpandListArgument(this->SkipUic, uicSkipped); @@ -1307,7 +1307,7 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) { const bool skipUic = std::find(uicSkipped.begin(), uicSkipped.end(), *it) != uicSkipped.end(); - std::map& uiFiles + std::map >& uiFiles = skipUic ? skippedUis : includedUis; const std::string &absFilename = *it; if (this->Verbose) @@ -1368,12 +1368,17 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) { this->GenerateMoc(it->first, it->second); } - for(std::map::const_iterator + for(std::map >::const_iterator it = includedUis.begin(); it != includedUis.end(); ++it) { - this->GenerateUi(it->first, it->second); + for (std::vector::const_iterator nit = it->second.begin(); + nit != it->second.end(); + ++nit) + { + this->GenerateUi(it->first, *nit); + } } if(!this->RccExecutable.empty()) @@ -1448,9 +1453,9 @@ bool cmQtAutoGenerators::RunAutogen(cmMakefile* makefile) void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map &includedUis) + const std::vector& headerExtensions, + std::map& includedMocs, + std::map > &includedUis) { cmsys::RegularExpression mocIncludeRegExp( "[\n][ \t]*#[ \t]*include[ \t]+" @@ -1636,9 +1641,9 @@ void cmQtAutoGenerators::ParseCppFile(const std::string& absFilename, void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map& includedUis) + const std::vector& headerExtensions, + std::map& includedMocs, + std::map >& includedUis) { cmsys::RegularExpression mocIncludeRegExp( "[\n][ \t]*#[ \t]*include[ \t]+" @@ -1756,7 +1761,7 @@ void cmQtAutoGenerators::StrictParseCppFile(const std::string& absFilename, void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, - std::map& includedUis) + std::map >& includedUis) { if (this->UicExecutable.empty()) { @@ -1774,8 +1779,8 @@ void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, - const std::string& contentsString, - std::map& includedUis) + const std::string& contentsString, + std::map >& includedUis) { if (this->UicExecutable.empty()) { @@ -1805,7 +1810,7 @@ void cmQtAutoGenerators::ParseForUic(const std::string& absFilename, // finding the correct header, so we need to remove the ui_ part basename = basename.substr(3); - includedUis[realName] = basename; + includedUis[realName].push_back(basename); matchOffset += uiIncludeRegExp.end(); } while(uiIncludeRegExp.find(contentsString.c_str() + matchOffset)); @@ -1851,9 +1856,9 @@ cmQtAutoGenerators::SearchHeadersForCppFile(const std::string& absFilename, void cmQtAutoGenerators::ParseHeaders(const std::set& absHeaders, - const std::map& includedMocs, - std::map& notIncludedMocs, - std::map& includedUis) + const std::map& includedMocs, + std::map& notIncludedMocs, + std::map >& includedUis) { for(std::set::const_iterator hIt=absHeaders.begin(); hIt!=absHeaders.end(); diff --git a/Source/cmQtAutoGenerators.h b/Source/cmQtAutoGenerators.h index 9ddf64f..5e4e082 100644 --- a/Source/cmQtAutoGenerators.h +++ b/Source/cmQtAutoGenerators.h @@ -51,28 +51,28 @@ private: bool GenerateUi(const std::string& realName, const std::string& uiFileName); bool GenerateQrc(); void ParseCppFile(const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map& includedUis); + const std::vector& headerExtensions, + std::map& includedMocs, + std::map >& includedUis); void StrictParseCppFile(const std::string& absFilename, - const std::vector& headerExtensions, - std::map& includedMocs, - std::map& includedUis); + const std::vector& headerExtensions, + std::map& includedMocs, + std::map >& includedUis); void SearchHeadersForCppFile(const std::string& absFilename, const std::vector& headerExtensions, std::set& absHeaders); void ParseHeaders(const std::set& absHeaders, - const std::map& includedMocs, - std::map& notIncludedMocs, - std::map& includedUis); + const std::map& includedMocs, + std::map& notIncludedMocs, + std::map >& includedUis); void ParseForUic(const std::string& fileName, - const std::string& contentsString, - std::map& includedUis); + const std::string& contentsString, + std::map >& includedUis); void ParseForUic(const std::string& fileName, - std::map& includedUis); + std::map >& includedUis); void Init(); diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index f9aa309..f1a272a 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/Tests/QtAutogen/CMakeLists.txt @@ -68,6 +68,7 @@ add_custom_command( ) add_executable(QtAutogen main.cpp calwidget.cpp second_widget.cpp foo.cpp blub.cpp bar.cpp abc.cpp + multiplewidgets.cpp xyz.cpp yaf.cpp gadget.cpp $ test.qrc second_resource.qrc resourcetester.cpp generated.cpp ) diff --git a/Tests/QtAutogen/multiplewidgets.cpp b/Tests/QtAutogen/multiplewidgets.cpp new file mode 100644 index 0000000..f143875 --- /dev/null +++ b/Tests/QtAutogen/multiplewidgets.cpp @@ -0,0 +1,19 @@ + +#include "multiplewidgets.h" + +#include "ui_widget1.h" +#include "ui_widget2.h" + +Widget1::Widget1(QWidget *parent) + : QWidget(parent), + ui(new Ui::Widget1) +{ + ui->setupUi(this); +} + +Widget2::Widget2(QWidget *parent) + : QWidget(parent), + ui(new Ui::Widget2) +{ + ui->setupUi(this); +} diff --git a/Tests/QtAutogen/multiplewidgets.h b/Tests/QtAutogen/multiplewidgets.h new file mode 100644 index 0000000..6ae6ad1 --- /dev/null +++ b/Tests/QtAutogen/multiplewidgets.h @@ -0,0 +1,33 @@ + +#ifndef MULTIPLEWIDGETS_H +#define MULTIPLEWIDGETS_H + +#include + +namespace Ui { +class Widget1; +} + +class Widget1 : public QWidget +{ + Q_OBJECT +public: + Widget1(QWidget *parent = 0); +private: + Ui::Widget1 *ui; +}; + +namespace Ui { +class Widget2; +} + +class Widget2 : public QWidget +{ + Q_OBJECT +public: + Widget2(QWidget *parent = 0); +private: + Ui::Widget2 *ui; +}; + +#endif diff --git a/Tests/QtAutogen/widget1.ui b/Tests/QtAutogen/widget1.ui new file mode 100644 index 0000000..8fce81a --- /dev/null +++ b/Tests/QtAutogen/widget1.ui @@ -0,0 +1,45 @@ + + + Widget1 + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + 140 + 80 + 80 + 23 + + + + PushButton + + + + + + 190 + 170 + 80 + 23 + + + + PushButton + + + + + + diff --git a/Tests/QtAutogen/widget2.ui b/Tests/QtAutogen/widget2.ui new file mode 100644 index 0000000..1f411b9 --- /dev/null +++ b/Tests/QtAutogen/widget2.ui @@ -0,0 +1,29 @@ + + + Widget2 + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + 20 + 20 + 256 + 192 + + + + + + + -- cgit v0.12