Attached property for TabWidget to specify tab label/icon
authorKevin Krammer <kevin.krammer@kdab.com>
Tue, 16 Oct 2012 17:54:58 +0000 (19:54 +0200)
committerKevin Krammer <kevin.krammer@kdab.com>
Tue, 16 Oct 2012 17:54:58 +0000 (19:54 +0200)
declarativeobjects.cpp
declarativeobjects_p.h
declarativewidgetdocument.cpp
test.qml

index 834fb2d..aefa4b1 100644 (file)
@@ -190,6 +190,48 @@ DeclarativeLabel::DeclarativeLabel(QObject *parent) : DeclarativeWidgetProxy<QLa
 CUSTOM_METAOBJECT(DeclarativeLabel, QLabel, m_proxiedObject)
 
 // DeclarativeTabWidget
+class TabWidgetTabHeader::Private
+{
+  public:
+    QString label;
+    QIcon icon;
+};
+
+TabWidgetTabHeader::TabWidgetTabHeader(QObject *parent)
+  : QObject(parent), d(new TabWidgetTabHeader::Private)
+{
+}
+
+TabWidgetTabHeader::~TabWidgetTabHeader()
+{
+  delete d;
+}
+
+void TabWidgetTabHeader::setLabel(const QString &label)
+{
+  if (label == d->label)
+    return;
+
+  d->label = label;
+  emit labelChanged(label);
+}
+
+QString TabWidgetTabHeader::label() const
+{
+  return d->label;
+}
+
+void TabWidgetTabHeader::setIcon(const QIcon &icon)
+{
+  d->icon = icon;
+  emit iconChanged(icon);
+}
+
+QIcon TabWidgetTabHeader::icon() const
+{
+  return d->icon;
+}
+
 DeclarativeTabWidget::DeclarativeTabWidget(QObject *parent) : DeclarativeWidgetProxy<QTabWidget>(parent)
 {
   connectAllSignals(m_proxiedObject, this);
@@ -198,8 +240,19 @@ DeclarativeTabWidget::DeclarativeTabWidget(QObject *parent) : DeclarativeWidgetP
 void DeclarativeTabWidget::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject)
 {
   // TODO: error when layout is set
+
   m_children.append(declarativeObject);
-  m_proxiedObject->addTab(widget, "MyTab");
+
+  QString label;
+  QIcon icon;
+
+  TabWidgetTabHeader *tabHeader = declarativeObject->findChild<TabWidgetTabHeader*>();
+  if (tabHeader) {
+    label = tabHeader->label();
+    icon = tabHeader->icon();
+  }
+
+  m_proxiedObject->addTab(widget, icon, label);
 }
 
 void DeclarativeTabWidget::setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject)
@@ -209,6 +262,11 @@ void DeclarativeTabWidget::setLayout(QLayout *layout, AbstractDeclarativeObject
   qmlInfo(this) << "Can not add QLayout to QTabWidget";
 }
 
+TabWidgetTabHeader *DeclarativeTabWidget::qmlAttachedProperties(QObject *object)
+{
+  return new TabWidgetTabHeader(object);
+}
+
 CUSTOM_METAOBJECT(DeclarativeTabWidget, QTabWidget, m_proxiedObject)
 
 // DeclarativePushButton
index 5036476..e8144b7 100644 (file)
@@ -12,6 +12,7 @@
 #include <QtGui/QVBoxLayout>
 #include <QtDeclarative/QDeclarativeListProperty>
 #include <QtDeclarative/qdeclarativeinfo.h>
+#include <qdeclarative.h>
 
 #define DECLARATIVE_OBJECT \
   public: \
@@ -198,6 +199,34 @@ class DeclarativeLabel : public DeclarativeWidgetProxy<QLabel>
     DeclarativeLabel(QObject *parent = 0);
 };
 
+
+// attached property for DeclarativeTabWidget
+class TabWidgetTabHeader : public QObject
+{
+  Q_OBJECT
+
+  Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged)
+  Q_PROPERTY(QIcon icon READ icon WRITE setIcon NOTIFY iconChanged)
+
+  public:
+    TabWidgetTabHeader(QObject *parent = 0);
+    ~TabWidgetTabHeader();
+
+    void setLabel(const QString &label);
+    QString label() const;
+
+    void setIcon(const QIcon &icon);
+    QIcon icon() const;
+
+  Q_SIGNALS:
+    void labelChanged(const QString &label);
+    void iconChanged(const QIcon &icon);
+
+  private:
+    class Private;
+    Private *const d;
+};
+
 class DeclarativeTabWidget : public DeclarativeWidgetProxy<QTabWidget>
 {
   DECLARATIVE_OBJECT
@@ -205,10 +234,15 @@ class DeclarativeTabWidget : public DeclarativeWidgetProxy<QTabWidget>
   public:
     DeclarativeTabWidget(QObject *parent = 0);
 
+    static TabWidgetTabHeader *qmlAttachedProperties(QObject *object);
+
   protected:
     virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject);
     virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject);
 };
+
+QML_DECLARE_TYPEINFO(DeclarativeTabWidget, QML_HAS_ATTACHED_PROPERTIES)
+
 /*
 class DeclarativeTab : public DeclarativeWidget
 {
index 0b7e218..1377bf8 100644 (file)
@@ -33,6 +33,7 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p
   qmlRegisterType<DeclarativeLabel>("QtGui", 1, 0, "Label");
   qmlRegisterType<DeclarativeHBoxLayout>("QtGui", 1, 0, "HBoxLayout");
   qmlRegisterType<DeclarativeVBoxLayout>("QtGui", 1, 0, "VBoxLayout");
+  qmlRegisterType<TabWidgetTabHeader>();
   qmlRegisterType<DeclarativeTabWidget>("QtGui", 1, 0, "TabWidget");
   qmlRegisterType<DeclarativePushButton>("QtGui", 1, 0, "PushButton");
   qmlRegisterType<DeclarativeCheckBox>("QtGui", 1, 0, "CheckBox");
index 96c080b..a3d1191 100644 (file)
--- a/test.qml
+++ b/test.qml
@@ -49,12 +49,16 @@ Widget {
     }
     TabWidget {
       Label {
+        TabWidget.label: "Title 1"
+
         text: "Page 1"
       }
       Label {
         text: "Page 2"
       }
       Label {
+        TabWidget.label: "Title 3"
+
         text: "Page 3"
       }
     }