From 3a73f7dfc9d84ef6cdf549dbf02935d7bbbd1b2b Mon Sep 17 00:00:00 2001 From: Jarek Kobus <jkobus@trolltech.com> Date: Wed, 10 Nov 2010 12:50:02 +0100 Subject: [PATCH] Support pkg-config in AddLibraryWizard Reviewed-by: dt <qtc-committer@nokia.com> Task-number: QTCREATORBUG-2378 --- .../qt4projectmanager/addlibrarywizard.cpp | 81 +++++++++++------ .../qt4projectmanager/addlibrarywizard.h | 10 ++- .../librarydetailscontroller.cpp | 86 +++++++++++++++++++ .../librarydetailscontroller.h | 17 ++++ .../qt4projectmanager/librarydetailswidget.ui | 18 +++- 5 files changed, 176 insertions(+), 36 deletions(-) diff --git a/src/plugins/qt4projectmanager/addlibrarywizard.cpp b/src/plugins/qt4projectmanager/addlibrarywizard.cpp index 74476153f09..6048ea2d02c 100644 --- a/src/plugins/qt4projectmanager/addlibrarywizard.cpp +++ b/src/plugins/qt4projectmanager/addlibrarywizard.cpp @@ -112,18 +112,17 @@ LibraryTypePage::LibraryTypePage(AddLibraryWizard *parent) QVBoxLayout *layout = new QVBoxLayout(this); - m_systemRadio = new QRadioButton(tr("System library"), this); - m_systemRadio->setChecked(true); - layout->addWidget(m_systemRadio); + m_internalRadio = new QRadioButton(tr("Internal library"), this); + layout->addWidget(m_internalRadio); - QLabel *systemLabel = new QLabel(tr("Links to a system library." - "\nNeither the path to the " - "library nor the path to its " - "includes is added to the .pro file.")); + QLabel *internalLabel = new QLabel(tr("Links to a library " + "that is located in your build " + "tree.\nAdds the library and " + "include paths to the .pro file.")); - systemLabel->setWordWrap(true); - systemLabel->setAttribute(Qt::WA_MacSmallSize, true); - layout->addWidget(systemLabel); + internalLabel->setWordWrap(true); + internalLabel->setAttribute(Qt::WA_MacSmallSize, true); + layout->addWidget(internalLabel); m_externalRadio = new QRadioButton(tr("External library"), this); layout->addWidget(m_externalRadio); @@ -137,26 +136,45 @@ LibraryTypePage::LibraryTypePage(AddLibraryWizard *parent) externalLabel->setAttribute(Qt::WA_MacSmallSize, true); layout->addWidget(externalLabel); - m_internalRadio = new QRadioButton(tr("Internal library"), this); - layout->addWidget(m_internalRadio); + m_systemRadio = new QRadioButton(tr("System library"), this); + layout->addWidget(m_systemRadio); - QLabel *internalLabel = new QLabel(tr("Links to a library " - "that is located in your build " - "tree.\nAdds the library and " - "include paths to the .pro file.")); + QLabel *systemLabel = new QLabel(tr("Links to a system library." + "\nNeither the path to the " + "library nor the path to its " + "includes is added to the .pro file.")); - internalLabel->setWordWrap(true); - internalLabel->setAttribute(Qt::WA_MacSmallSize, true); - layout->addWidget(internalLabel); + systemLabel->setWordWrap(true); + systemLabel->setAttribute(Qt::WA_MacSmallSize, true); + layout->addWidget(systemLabel); + + m_packageRadio = new QRadioButton(tr("System package"), this); + layout->addWidget(m_packageRadio); + + QLabel *packageLabel = new QLabel(tr("Links to a system library using pkg-config.")); + + packageLabel->setWordWrap(true); + packageLabel->setAttribute(Qt::WA_MacSmallSize, true); + layout->addWidget(packageLabel); + +#ifdef Q_OS_WIN + m_packageRadio->setVisible(false); + packageLabel->setVisible(false); +#endif + + // select the default + m_internalRadio->setChecked(true); } AddLibraryWizard::LibraryKind LibraryTypePage::libraryKind() const { if (m_internalRadio->isChecked()) return AddLibraryWizard::InternalLibrary; + if (m_externalRadio->isChecked()) + return AddLibraryWizard::ExternalLibrary; if (m_systemRadio->isChecked()) return AddLibraryWizard::SystemLibrary; - return AddLibraryWizard::ExternalLibrary; + return AddLibraryWizard::PackageLibrary; } int LibraryTypePage::nextId() const @@ -201,10 +219,10 @@ void DetailsPage::initializePage() QString title; QString subTitle; switch (m_libraryWizard->libraryKind()) { - case AddLibraryWizard::SystemLibrary: - title = tr("System Library"); - subTitle = tr("Specify the library to link to"); - m_libraryDetailsController = new SystemLibraryDetailsController( + case AddLibraryWizard::InternalLibrary: + title = tr("Internal Library"); + subTitle = tr("Choose the project file of the library to link to"); + m_libraryDetailsController = new InternalLibraryDetailsController( m_libraryDetailsWidget, m_libraryWizard->proFile(), this); break; case AddLibraryWizard::ExternalLibrary: @@ -213,10 +231,16 @@ void DetailsPage::initializePage() m_libraryDetailsController = new ExternalLibraryDetailsController( m_libraryDetailsWidget, m_libraryWizard->proFile(), this); break; - case AddLibraryWizard::InternalLibrary: - title = tr("Internal Library"); - subTitle = tr("Choose the project file of the library to link to"); - m_libraryDetailsController = new InternalLibraryDetailsController( + case AddLibraryWizard::SystemLibrary: + title = tr("System Library"); + subTitle = tr("Specify the library to link to"); + m_libraryDetailsController = new SystemLibraryDetailsController( + m_libraryDetailsWidget, m_libraryWizard->proFile(), this); + break; + case AddLibraryWizard::PackageLibrary: + title = tr("System Package"); + subTitle = tr("Specify the package to link to"); + m_libraryDetailsController = new PackageLibraryDetailsController( m_libraryDetailsWidget, m_libraryWizard->proFile(), this); break; default: @@ -261,6 +285,7 @@ void SummaryPage::initializePage() str << "<code>"; QString text = m_snippet; text.replace(QLatin1Char('\n'), QLatin1String("<br>")); + text.replace(QLatin1Char(' '), QLatin1String(" ")); str << text; str << "</code>"; } diff --git a/src/plugins/qt4projectmanager/addlibrarywizard.h b/src/plugins/qt4projectmanager/addlibrarywizard.h index acddb49c770..dbb0f416fb6 100644 --- a/src/plugins/qt4projectmanager/addlibrarywizard.h +++ b/src/plugins/qt4projectmanager/addlibrarywizard.h @@ -34,9 +34,10 @@ public: }; enum LibraryKind { - SystemLibrary, + InternalLibrary, ExternalLibrary, - InternalLibrary + SystemLibrary, + PackageLibrary }; enum LinkageType { @@ -87,9 +88,10 @@ public: virtual int nextId() const; private: - QRadioButton *m_systemRadio; - QRadioButton *m_externalRadio; QRadioButton *m_internalRadio; + QRadioButton *m_externalRadio; + QRadioButton *m_systemRadio; + QRadioButton *m_packageRadio; }; class DetailsPage : public QWizardPage diff --git a/src/plugins/qt4projectmanager/librarydetailscontroller.cpp b/src/plugins/qt4projectmanager/librarydetailscontroller.cpp index 26811c29bbd..96d6f2206e0 100644 --- a/src/plugins/qt4projectmanager/librarydetailscontroller.cpp +++ b/src/plugins/qt4projectmanager/librarydetailscontroller.cpp @@ -57,6 +57,11 @@ LibraryDetailsController::LibraryDetailsController( m_creatorPlatform = CreatorLinux; #endif + setPlatformsVisible(true); + setLinkageGroupVisible(true); + setMacLibraryGroupVisible(true); + setPackageLineEditVisible(false); + if (creatorPlatform() == CreatorMac) setMacLibraryRadiosVisible(false); @@ -230,6 +235,11 @@ void LibraryDetailsController::showMacLibraryType( libraryDetailsWidget()->macGroupBox->setTitle(libraryTypeTitle); } +void LibraryDetailsController::setPlatformsVisible(bool ena) +{ + libraryDetailsWidget()->platformGroupBox->setVisible(ena); +} + void LibraryDetailsController::setLinkageRadiosVisible(bool ena) { m_linkageRadiosVisible = ena; @@ -237,6 +247,12 @@ void LibraryDetailsController::setLinkageRadiosVisible(bool ena) libraryDetailsWidget()->dynamicRadio->setVisible(ena); } +void LibraryDetailsController::setLinkageGroupVisible(bool ena) +{ + setLinkageRadiosVisible(ena); + libraryDetailsWidget()->linkageGroupBox->setVisible(ena); +} + void LibraryDetailsController::setMacLibraryRadiosVisible(bool ena) { m_macLibraryRadiosVisible = ena; @@ -244,6 +260,12 @@ void LibraryDetailsController::setMacLibraryRadiosVisible(bool ena) libraryDetailsWidget()->libraryRadio->setVisible(ena); } +void LibraryDetailsController::setMacLibraryGroupVisible(bool ena) +{ + setMacLibraryRadiosVisible(ena); + libraryDetailsWidget()->macGroupBox->setVisible(ena); +} + void LibraryDetailsController::setLibraryPathChooserVisible(bool ena) { libraryDetailsWidget()->libraryPathChooser->setVisible(ena); @@ -256,6 +278,12 @@ void LibraryDetailsController::setLibraryComboBoxVisible(bool ena) libraryDetailsWidget()->libraryLabel->setVisible(ena); } +void LibraryDetailsController::setPackageLineEditVisible(bool ena) +{ + libraryDetailsWidget()->packageLineEdit->setVisible(ena); + libraryDetailsWidget()->packageLabel->setVisible(ena); +} + void LibraryDetailsController::setIncludePathVisible(bool ena) { m_includePathVisible = ena; @@ -737,6 +765,64 @@ QString NonInternalLibraryDetailsController::snippet() const ///////////// +PackageLibraryDetailsController::PackageLibraryDetailsController( + Ui::LibraryDetailsWidget *libraryDetails, + const QString &proFile, QObject *parent) + : NonInternalLibraryDetailsController(libraryDetails, proFile, parent) +{ + setPlatformsVisible(false); + setIncludePathVisible(false); + setWindowsGroupVisible(false); + setLinkageGroupVisible(false); + setMacLibraryGroupVisible(false); + setLibraryPathChooserVisible(false); + setPackageLineEditVisible(true); + + connect(libraryDetailsWidget()->packageLineEdit, SIGNAL(textChanged(QString)), + this, SIGNAL(completeChanged())); + + updateGui(); +} + +bool PackageLibraryDetailsController::isComplete() const +{ + return !libraryDetailsWidget()->packageLineEdit->text().isEmpty(); +} + +QString PackageLibraryDetailsController::snippet() const +{ + QString snippetMessage; + QTextStream str(&snippetMessage); + str << "\n"; + if (!isLinkPackageGenerated()) + str << "unix: CONFIG += link_pkgconfig\n"; + str << "unix: PKGCONFIG += " << libraryDetailsWidget()->packageLineEdit->text() << "\n"; + return snippetMessage; +} + +bool PackageLibraryDetailsController::isLinkPackageGenerated() const +{ + const ProjectExplorer::Project *project = + ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForFile(proFile()); + if (!project) + return false; + + const Qt4ProFileNode *rootProject = qobject_cast<const Qt4ProFileNode *>(project->rootProjectNode()); + if (!rootProject) + return false; + + const Qt4ProFileNode *currentProject = rootProject->findProFileFor(proFile()); + if (!currentProject) + return false; + + const QStringList configVar = currentProject->variableValue(ConfigVar); + if (configVar.contains(QLatin1String("link_pkgconfig"))) + return true; + return false; +} + +///////////// + SystemLibraryDetailsController::SystemLibraryDetailsController( Ui::LibraryDetailsWidget *libraryDetails, const QString &proFile, QObject *parent) diff --git a/src/plugins/qt4projectmanager/librarydetailscontroller.h b/src/plugins/qt4projectmanager/librarydetailscontroller.h index e0afd57091f..ec4d235bfdc 100644 --- a/src/plugins/qt4projectmanager/librarydetailscontroller.h +++ b/src/plugins/qt4projectmanager/librarydetailscontroller.h @@ -51,10 +51,14 @@ protected: void setIgnoreGuiSignals(bool ignore); + void setPlatformsVisible(bool ena); void setLinkageRadiosVisible(bool ena); + void setLinkageGroupVisible(bool ena); void setMacLibraryRadiosVisible(bool ena); + void setMacLibraryGroupVisible(bool ena); void setLibraryPathChooserVisible(bool ena); void setLibraryComboBoxVisible(bool ena); + void setPackageLineEditVisible(bool ena); void setIncludePathVisible(bool ena); void setWindowsGroupVisible(bool ena); void setRemoveSuffixVisible(bool ena); @@ -113,6 +117,19 @@ private slots: void slotLibraryPathChanged(); }; +class PackageLibraryDetailsController : public NonInternalLibraryDetailsController +{ + Q_OBJECT +public: + explicit PackageLibraryDetailsController(Ui::LibraryDetailsWidget *libraryDetails, + const QString &proFile, + QObject *parent = 0); + virtual bool isComplete() const; + virtual QString snippet() const; +private: + bool isLinkPackageGenerated() const; +}; + class SystemLibraryDetailsController : public NonInternalLibraryDetailsController { Q_OBJECT diff --git a/src/plugins/qt4projectmanager/librarydetailswidget.ui b/src/plugins/qt4projectmanager/librarydetailswidget.ui index af3be9bc3af..bd581d35d39 100644 --- a/src/plugins/qt4projectmanager/librarydetailswidget.ui +++ b/src/plugins/qt4projectmanager/librarydetailswidget.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>368</width> - <height>306</height> + <width>455</width> + <height>370</height> </rect> </property> <layout class="QGridLayout" name="gridLayout_2"> @@ -33,16 +33,26 @@ <item row="1" column="1"> <widget class="Qt4ProjectManager::Internal::LibraryPathChooser" name="libraryPathChooser" native="true"/> </item> - <item row="2" column="0"> + <item row="3" column="0"> <widget class="QLabel" name="includeLabel"> <property name="text"> <string>Include path:</string> </property> </widget> </item> - <item row="2" column="1"> + <item row="3" column="1"> <widget class="Utils::PathChooser" name="includePathChooser" native="true"/> </item> + <item row="2" column="0"> + <widget class="QLabel" name="packageLabel"> + <property name="text"> + <string>Package:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="packageLineEdit"/> + </item> </layout> </item> <item row="1" column="0"> -- GitLab