Fix the Creator widgets Designer plugin, add DetailsWidgets.

Polish the DetailsWidget for that purpose, add properties,
make it survive without widgets, add a container extension.
This commit is contained in:
Friedemann Kleint
2009-10-02 10:12:32 +02:00
parent 9bef75f8f9
commit 9dd0a108e3
6 changed files with 259 additions and 20 deletions

View File

@@ -3,21 +3,23 @@
#include <QtGui/QGridLayout> #include <QtGui/QGridLayout>
#include <QtCore/QStack> #include <QtCore/QStack>
#include <QtGui/QLabel>
#include <QtGui/QGridLayout>
#include <QtGui/QPainter> #include <QtGui/QPainter>
using namespace Utils; using namespace Utils;
DetailsWidget::DetailsWidget(QWidget *parent) DetailsWidget::DetailsWidget(QWidget *parent)
: QWidget(parent), : QWidget(parent),
m_summaryLabel(new QLabel(this)),
m_detailsButton(new DetailsButton(this)),
m_widget(0), m_widget(0),
m_toolWidget(0) m_toolWidget(0),
m_grid(new QGridLayout(this))
{ {
m_grid = new QGridLayout(this);
//m_grid->setMargin(0);
m_summaryLabel = new QLabel(this);
m_summaryLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); m_summaryLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
m_summaryLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_summaryLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_detailsButton = new DetailsButton(this);
m_grid->addWidget(m_summaryLabel, 0, 0, 2, 0); m_grid->addWidget(m_summaryLabel, 0, 0, 2, 0);
m_grid->addWidget(m_detailsButton, 1, 2); m_grid->addWidget(m_detailsButton, 1, 2);
@@ -45,8 +47,8 @@ void DetailsWidget::paintEvent(QPaintEvent *paintEvent)
if (!m_detailsButton->isToggled()) if (!m_detailsButton->isToggled())
return; return;
QRect detailsGeometry = m_detailsButton->geometry(); const QRect detailsGeometry = m_detailsButton->geometry();
QRect widgetGeometry = m_widget->geometry(); const QRect widgetGeometry = m_widget ? m_widget->geometry() : QRect(x(), y() + height(), width(), 0);
QPoint tl(detailsGeometry.topLeft()); QPoint tl(detailsGeometry.topLeft());
tl += QPoint(-3, -3); tl += QPoint(-3, -3);
@@ -85,29 +87,65 @@ void DetailsWidget::setSummaryText(const QString &text)
m_summaryLabel->setText(text); m_summaryLabel->setText(text);
} }
QString DetailsWidget::summaryText() const
{
return m_summaryLabel->text();
}
bool DetailsWidget::expanded() const
{
return m_detailsButton->isToggled();
}
void DetailsWidget::setExpanded(bool v)
{
if (expanded() != v)
m_detailsButton->animateClick();
}
QWidget *DetailsWidget::widget() const
{
return m_widget;
}
void DetailsWidget::setWidget(QWidget *widget) void DetailsWidget::setWidget(QWidget *widget)
{ {
if (m_widget == widget) if (m_widget == widget)
return; return;
if (m_widget) if (m_widget) {
m_grid->removeWidget(m_widget); m_grid->removeWidget(m_widget);
m_grid->addWidget(widget, 2, 0, 1, 3); m_widget = 0;
m_widget = widget; }
m_widget->setVisible(m_detailsButton->isToggled()); if (widget) {
m_grid->addWidget(widget, 2, 0, 1, 3);
m_widget = widget;
m_widget->setVisible(m_detailsButton->isToggled());
}
} }
void DetailsWidget::setToolWidget(QWidget *widget) void DetailsWidget::setToolWidget(QWidget *widget)
{ {
if (m_toolWidget == widget) if (m_toolWidget == widget)
return; return;
if (m_toolWidget) if (m_toolWidget) {
m_grid->removeWidget(m_toolWidget); m_grid->removeWidget(m_toolWidget);
m_grid->addWidget(widget, 1, 1); m_toolWidget = 0;
m_toolWidget = widget; }
if (widget) {
m_grid->addWidget(widget, 1, 1);
m_toolWidget = widget;
}
}
QWidget *DetailsWidget::toolWidget() const
{
return m_toolWidget;
} }
void DetailsWidget::fixUpLayout() void DetailsWidget::fixUpLayout()
{ {
if (!m_widget)
return;
QWidget *parent = m_widget; QWidget *parent = m_widget;
QStack<QWidget *> widgets; QStack<QWidget *> widgets;
while((parent = parent->parentWidget()) && parent && parent->layout()) { while((parent = parent->parentWidget()) && parent && parent->layout()) {

View File

@@ -4,8 +4,11 @@
#include "utils_global.h" #include "utils_global.h"
#include <QtGui/QWidget> #include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <QtGui/QGridLayout> QT_BEGIN_NAMESPACE
class QLabel;
class QGridLayout;
QT_END_NAMESPACE
namespace Utils { namespace Utils {
class DetailsButton; class DetailsButton;
@@ -13,16 +16,30 @@ class DetailsButton;
class QTCREATOR_UTILS_EXPORT DetailsWidget : public QWidget class QTCREATOR_UTILS_EXPORT DetailsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString summaryText READ summaryText WRITE setSummaryText DESIGNABLE true)
Q_PROPERTY(bool expanded READ expanded WRITE setExpanded DESIGNABLE true)
public: public:
DetailsWidget(QWidget *parent = 0); DetailsWidget(QWidget *parent = 0);
~DetailsWidget(); ~DetailsWidget();
void setSummaryText(const QString &text); void setSummaryText(const QString &text);
QString summaryText() const;
bool expanded() const;
void setExpanded(bool);
void setWidget(QWidget *widget); void setWidget(QWidget *widget);
QWidget *widget() const;
void setToolWidget(QWidget *widget); void setToolWidget(QWidget *widget);
QWidget *toolWidget() const;
protected:
void paintEvent(QPaintEvent *paintEvent); void paintEvent(QPaintEvent *paintEvent);
private slots: private slots:
void detailsButtonClicked(); void detailsButtonClicked();
private: private:
void fixUpLayout(); void fixUpLayout();
QLabel *m_summaryLabel; QLabel *m_summaryLabel;

View File

@@ -63,6 +63,9 @@ public:
QWidget *createWidget(QWidget *parent); QWidget *createWidget(QWidget *parent);
void initialize(QDesignerFormEditorInterface *core); void initialize(QDesignerFormEditorInterface *core);
protected:
bool initialized() const { return m_initialized; }
private: private:
QString displayName() const; QString displayName() const;
QString geometryProperty() const; QString geometryProperty() const;

View File

@@ -31,6 +31,8 @@
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtDesigner/QExtensionManager>
#include <QtDesigner/QDesignerFormEditorInterface>
static const char *groupC = "QtCreator"; static const char *groupC = "QtCreator";
@@ -165,11 +167,125 @@ PathListEditor_CW::PathListEditor_CW(QObject *parent) :
{ {
} }
DetailsButton_CW::DetailsButton_CW(QObject *parent) :
QObject(parent),
CustomWidget<Utils::DetailsButton>
(QLatin1String("<utils/detailsbutton.h>"),
false,
QLatin1String(groupC),
QIcon(),
QLatin1String("Expandable button for 'Details'"))
{
}
DetailsWidget_CW::DetailsWidget_CW(QObject *parent) :
QObject(parent),
CustomWidget<Utils::DetailsWidget>
(QLatin1String("<utils/detailswidget.h>"),
true,
QLatin1String(groupC),
QIcon(),
QLatin1String("Expandable widget for 'Details'. You might need an expandable spacer below."))
{
}
QString DetailsWidget_CW::domXml() const
{
// Expanded from start, else child visibility is wrong
const char *xmlC ="\
<ui language=\"c++\" displayname=\"DetailsWidget\">\
<widget class=\"Utils::DetailsWidget\" name=\"detailsWidget\">\
<property name=\"geometry\">\
<rect><x>0</x><y>0</y><width>160</width><height>80</height></rect>\
</property>\
<property name=\"summaryText\">\
<string>Summary</string>\
</property>\
<property name=\"expanded\">\
<bool>true</bool>\
</property>\
<widget class=\"QWidget\" name=\"detailsContainer\" />\
</widget>\
<customwidgets>\
<customwidget>\
<class>Utils::DetailsWidget</class>\
<addpagemethod>setWidget</addpagemethod>\
</customwidget>\
</customwidgets>\
</ui>";
return QLatin1String(xmlC);
}
void DetailsWidget_CW::initialize(QDesignerFormEditorInterface *core)
{
const bool firstTime = !initialized();
CustomWidget<Utils::DetailsWidget>::initialize(core);
if (firstTime)
if (QExtensionManager *manager = core->extensionManager())
manager->registerExtensions(new DetailsWidgetExtensionFactory(manager), Q_TYPEID(QDesignerContainerExtension));
}
DetailsWidgetContainerExtension::DetailsWidgetContainerExtension(Utils::DetailsWidget *widget, QObject *parent) :
QObject(parent),
m_detailsWidget(widget)
{
}
void DetailsWidgetContainerExtension::addWidget(QWidget *widget)
{
if (m_detailsWidget->widget()) {
qWarning("Cannot add 2nd child to DetailsWidget");
} else {
m_detailsWidget->setWidget(widget);
}
}
int DetailsWidgetContainerExtension::count() const
{
return m_detailsWidget->widget() ? 1 : 0;
}
int DetailsWidgetContainerExtension::currentIndex() const
{
return 0;
}
void DetailsWidgetContainerExtension::insertWidget(int /* index */, QWidget *widget)
{
addWidget(widget);
}
void DetailsWidgetContainerExtension::remove(int /* index */)
{
m_detailsWidget->setWidget(0);
}
void DetailsWidgetContainerExtension::setCurrentIndex(int /* index */)
{
}
QWidget *DetailsWidgetContainerExtension::widget(int /* index */) const
{
return m_detailsWidget->widget();
}
DetailsWidgetExtensionFactory::DetailsWidgetExtensionFactory(QExtensionManager *parent) :
QExtensionFactory(parent)
{
}
QObject *DetailsWidgetExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const
{
if (Utils::DetailsWidget *dw = qobject_cast<Utils::DetailsWidget*>(object))
if (iid == Q_TYPEID(QDesignerContainerExtension))
return new DetailsWidgetContainerExtension(dw, parent);
return 0;
}
// -------------- WidgetCollection // -------------- WidgetCollection
WidgetCollection::WidgetCollection(QObject *parent) : WidgetCollection::WidgetCollection(QObject *parent) :
QObject(parent) QObject(parent)
{ {
m_plugins.push_back(new NewClassCustomWidget(this)); m_plugins.push_back(new NewClassCustomWidget(this));
m_plugins.push_back(new ClassNameValidatingLineEdit_CW(this)); m_plugins.push_back(new ClassNameValidatingLineEdit_CW(this));
m_plugins.push_back(new FileNameValidatingLineEdit_CW(this)); m_plugins.push_back(new FileNameValidatingLineEdit_CW(this));
@@ -181,6 +297,8 @@ WidgetCollection::WidgetCollection(QObject *parent) :
m_plugins.push_back(new SubmitEditorWidget_CW(this)); m_plugins.push_back(new SubmitEditorWidget_CW(this));
m_plugins.push_back(new SubmitFieldWidget_CW(this)); m_plugins.push_back(new SubmitFieldWidget_CW(this));
m_plugins.push_back(new PathListEditor_CW(this)); m_plugins.push_back(new PathListEditor_CW(this));
m_plugins.push_back(new DetailsButton_CW(this));
m_plugins.push_back(new DetailsWidget_CW(this));
} }
QList<QDesignerCustomWidgetInterface*> WidgetCollection::customWidgets() const QList<QDesignerCustomWidgetInterface*> WidgetCollection::customWidgets() const

View File

@@ -43,12 +43,20 @@
#include <utils/submiteditorwidget.h> #include <utils/submiteditorwidget.h>
#include <utils/submitfieldwidget.h> #include <utils/submitfieldwidget.h>
#include <utils/pathlisteditor.h> #include <utils/pathlisteditor.h>
#include <utils/detailsbutton.h>
#include <utils/detailswidget.h>
#include <QtDesigner/QDesignerCustomWidgetCollectionInterface> #include <QtDesigner/QDesignerCustomWidgetCollectionInterface>
#include <QtDesigner/QDesignerContainerExtension>
#include <QtDesigner/QExtensionFactory>
#include <QtCore/qplugin.h> #include <QtCore/qplugin.h>
#include <QtCore/QList> #include <QtCore/QList>
QT_BEGIN_NAMESPACE
class QExtensionManager;
QT_END_NAMESPACE
// Custom Widgets // Custom Widgets
class NewClassCustomWidget : class NewClassCustomWidget :
@@ -163,7 +171,62 @@ public:
explicit PathListEditor_CW(QObject *parent = 0); explicit PathListEditor_CW(QObject *parent = 0);
}; };
// Collection class DetailsButton_CW :
public QObject,
public CustomWidget<Utils::DetailsButton>
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
explicit DetailsButton_CW(QObject *parent = 0);
};
// Details Widget: plugin + simple, hacky container extension that
// accepts only one page.
class DetailsWidget_CW :
public QObject,
public CustomWidget<Utils::DetailsWidget>
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
explicit DetailsWidget_CW(QObject *parent = 0);
QString domXml() const;
void initialize(QDesignerFormEditorInterface *core);
};
class DetailsWidgetContainerExtension: public QObject,
public QDesignerContainerExtension
{
Q_OBJECT
Q_INTERFACES(QDesignerContainerExtension)
public:
explicit DetailsWidgetContainerExtension(Utils::DetailsWidget *widget, QObject *parent);
void addWidget(QWidget *widget);
int count() const;
int currentIndex() const;
void insertWidget(int index, QWidget *widget);
void remove(int index);
void setCurrentIndex(int index);
QWidget *widget(int index) const;
private:
Utils::DetailsWidget *m_detailsWidget;
};
class DetailsWidgetExtensionFactory: public QExtensionFactory
{
Q_OBJECT
public:
explicit DetailsWidgetExtensionFactory(QExtensionManager *parent = 0);
protected:
QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const;
};
// ------------ Collection
class WidgetCollection : public QObject, public QDesignerCustomWidgetCollectionInterface class WidgetCollection : public QObject, public QDesignerCustomWidgetCollectionInterface
{ {
@@ -175,7 +238,7 @@ public:
virtual QList<QDesignerCustomWidgetInterface*> customWidgets() const; virtual QList<QDesignerCustomWidgetInterface*> customWidgets() const;
private: private:
QList<QDesignerCustomWidgetInterface*> m_plugins; QList<QDesignerCustomWidgetInterface*> m_plugins;
}; };
#endif // CUSTOMWIDGETS_H #endif // CUSTOMWIDGETS_H

View File

@@ -19,7 +19,6 @@ linux-* {
QTC_LIBS=$$dirname(QTC_LIBS) QTC_LIBS=$$dirname(QTC_LIBS)
QTC_LIBS=$$dirname(QTC_LIBS) QTC_LIBS=$$dirname(QTC_LIBS)
QTC_LIBS=$$QTC_LIBS/$$IDE_LIBRARY_BASENAME/qtcreator QTC_LIBS=$$QTC_LIBS/$$IDE_LIBRARY_BASENAME/qtcreator
QTC_LIBS=$$QTC_LIBS/$$IDE_LIBRARY_BASENAME/qtcreator
QMAKE_RPATHDIR *= $$QTC_LIBS QMAKE_RPATHDIR *= $$QTC_LIBS
} }
@@ -29,6 +28,7 @@ macx {
CONFIG(debug, debug|release):LIBS += -lUtils_debug CONFIG(debug, debug|release):LIBS += -lUtils_debug
else:LIBS += -lUtils else:LIBS += -lUtils
} else { } else {
message($$QTC_LIBS)
LIBS += -L$$QTC_LIBS -lUtils LIBS += -L$$QTC_LIBS -lUtils
} }