diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/qmldebugger/canvasframerate.cpp | 45 | ||||
-rw-r--r-- | tools/qmldebugger/canvasframerate.h | 1 | ||||
-rw-r--r-- | tools/qmldebugger/canvasscene.cpp | 245 | ||||
-rw-r--r-- | tools/qmldebugger/canvasscene.h | 39 | ||||
-rw-r--r-- | tools/qmldebugger/main.cpp | 56 | ||||
-rw-r--r-- | tools/qmldebugger/qmldebugger.pro | 4 |
6 files changed, 354 insertions, 36 deletions
diff --git a/tools/qmldebugger/canvasframerate.cpp b/tools/qmldebugger/canvasframerate.cpp index b1f412e..022aed5 100644 --- a/tools/qmldebugger/canvasframerate.cpp +++ b/tools/qmldebugger/canvasframerate.cpp @@ -12,6 +12,7 @@ #include <QTabWidget> #include <QPushButton> #include <QLineEdit> +#include <QCheckBox> class QLineGraph : public QWidget { @@ -26,9 +27,7 @@ public slots: protected: virtual void paintEvent(QPaintEvent *); - virtual void mousePressEvent(QMouseEvent *); - virtual void resizeEvent(QResizeEvent *); - virtual void showEvent(QShowEvent *); + virtual QSize sizeHint() const; private slots: void scrollbarChanged(int); @@ -64,32 +63,20 @@ QLineGraph::QLineGraph(QWidget *parent) QObject::connect(&sb, SIGNAL(valueChanged(int)), this, SLOT(scrollbarChanged(int))); } -void QLineGraph::scrollbarChanged(int v) +QSize QLineGraph::sizeHint() const { - if(ignoreScroll) - return; - - position = v; - update(); + return QSize(800, 600); } -void QLineGraph::resizeEvent(QResizeEvent *e) -{ - QWidget::resizeEvent(e); -} - -void QLineGraph::showEvent(QShowEvent *e) +void QLineGraph::scrollbarChanged(int v) { - QWidget::showEvent(e); -} + if(ignoreScroll) + return; -void QLineGraph::mousePressEvent(QMouseEvent *) -{ - if(position == -1) { - position = qMax(0, _samples.count() - samplesPerWidth - 1); - } else { + if (v == sb.maximum()) position = -1; - } + else + position = v; update(); } @@ -276,6 +263,11 @@ CanvasFrameRate::CanvasFrameRate(QmlDebugClient *client, QWidget *parent) layout->addLayout(bottom); bottom->addStretch(2); + QCheckBox *check = new QCheckBox("Enable", this); + bottom->addWidget(check); + QObject::connect(check, SIGNAL(stateChanged(int)), + this, SLOT(stateChanged(int))); + QPushButton *pb = new QPushButton(tr("New Tab"), this); QObject::connect(pb, SIGNAL(clicked()), this, SLOT(newTab())); bottom->addWidget(pb); @@ -302,4 +294,11 @@ void CanvasFrameRate::newTab() m_tabs->setCurrentIndex(id); } +void CanvasFrameRate::stateChanged(int s) +{ + bool checked = s != 0; + + static_cast<QmlDebugClientPlugin *>(m_plugin)->setEnabled(checked); +} + #include "canvasframerate.moc" diff --git a/tools/qmldebugger/canvasframerate.h b/tools/qmldebugger/canvasframerate.h index c3e88ef..543f233 100644 --- a/tools/qmldebugger/canvasframerate.h +++ b/tools/qmldebugger/canvasframerate.h @@ -13,6 +13,7 @@ public: private slots: void newTab(); + void stateChanged(int); private: QTabWidget *m_tabs; diff --git a/tools/qmldebugger/canvasscene.cpp b/tools/qmldebugger/canvasscene.cpp new file mode 100644 index 0000000..2d5b764 --- /dev/null +++ b/tools/qmldebugger/canvasscene.cpp @@ -0,0 +1,245 @@ +#include "canvasscene.h" +#include <QtDeclarative/qmldebugclient.h> +#include <QDataStream> +#include <QVBoxLayout> +#include <QPushButton> +#include <QSpinBox> +#include <QSplitter> +#include <QtDeclarative/qfxrect.h> +#include <QtDeclarative/qfximage.h> + +class CanvasSceneClientPlugin : public QmlDebugClientPlugin +{ +public: + CanvasSceneClientPlugin(QmlDebugClient *, CanvasScene *s); + +protected: + void messageReceived(const QByteArray &); + +private: + void dump(QDataStream &, int indent); + CanvasScene *scene; +}; + +class QmlCanvasDebuggerItem : public QTreeWidgetItem +{ +public: + QmlCanvasDebuggerItem(QTreeWidget *tree) + : QTreeWidgetItem(tree), me(0), img(0) + { + } + + QmlCanvasDebuggerItem(QTreeWidgetItem *item) + : QTreeWidgetItem(item), me(0), img(0) + { + } + + QFxRect *me; + QFxImage *img; +}; + +CanvasSceneClientPlugin::CanvasSceneClientPlugin(QmlDebugClient *c, + CanvasScene *s) +: QmlDebugClientPlugin(QLatin1String("CanvasScene"), c), scene(s) +{ +} + +void CanvasSceneClientPlugin::messageReceived(const QByteArray &data) +{ + QByteArray d = data; + QDataStream ds(&d, QIODevice::ReadOnly); + + scene->message(ds); +} + +void CanvasScene::message(QDataStream &ds) +{ + QList<QSimpleCanvasItem *> children = m_canvasRoot->children(); + qDeleteAll(children); + m_tree->clear(); + m_selected = 0; + + QTreeWidgetItem *root = new QmlCanvasDebuggerItem(m_tree); + root->setText(0, tr("Root")); + root->setExpanded(true); + clone(root, m_canvasRoot, ds); +} + +void CanvasScene::clone(QTreeWidgetItem *item, QSimpleCanvasItem *me, + QDataStream &ds) +{ + int children; + ds >> children; + + for (int ii = 0; ii < children; ++ii) { + QString name; + qreal x, y, z, width, height, scale; + QTransform transform; + bool activeFocus; + int transformOrigin, flip, options; + QPixmap pix; + + ds >> name >> x >> y >> z >> width >> height >> transformOrigin >> scale + >> flip >> transform >> activeFocus >> options >> pix; + + QmlCanvasDebuggerItem *childItem = new QmlCanvasDebuggerItem(item); + childItem->setText(0, name); + childItem->setExpanded(true); + + QFxRect *rect = new QFxRect; + rect->setParent(me); + rect->setX(x); + rect->setY(y); + rect->setZ(z); + rect->setWidth(width); + rect->setHeight(height); + rect->setTransformOrigin((QSimpleCanvasItem::TransformOrigin)transformOrigin); + rect->setScale(scale); + rect->setFlip((QSimpleCanvasItem::Flip)flip); + rect->setTransform(transform); + + if (activeFocus) + rect->setColor(QColor(0, 0, 0, 10)); + else if(options & QSimpleCanvasItem::IsFocusPanel) + rect->setColor(QColor(0, 255, 0, 10)); + else if(options & QSimpleCanvasItem::IsFocusRealm) + rect->setColor(QColor(0, 0, 255, 10)); + else + rect->setColor(QColor(255, 0, 0, 10)); + + if (pix.width() > 0 || pix.height() > 0) { + QFxImage *img = new QFxImage; + img->setParent(rect); + img->setWidth(width); + img->setHeight(height); + img->setPixmap(pix); + img->setOpacity(0); + childItem->img = img; + } + + childItem->me = rect; + + clone(childItem, rect, ds); + } +} + +void CanvasSceneClientPlugin::dump(QDataStream &ds, int indent) +{ + QString name; + qreal x, y, z, width, height, scale; + QTransform transform; + bool activeFocus; + int transformOrigin, flip, options, count; + QPixmap pix; + + ds >> name >> x >> y >> z >> width >> height >> transformOrigin >> scale + >> flip >> transform >> activeFocus >> options >> pix >> count; + + QByteArray ba(indent * 4, ' '); + qWarning() << ba.constData() << name << x << y; + + for(int ii = 0; ii < count; ++ii) + dump(ds, indent + 1); +} + +CanvasScene::CanvasScene(QmlDebugClient *c, QWidget *parent) +: QWidget(parent) +{ + client = new CanvasSceneClientPlugin(c, this); + + QVBoxLayout *layout = new QVBoxLayout; + layout->setContentsMargins(0,0,0,0); + layout->setSpacing(0); + setLayout(layout); + QSplitter *splitter = new QSplitter(this); + + m_tree = new QTreeWidget(this); + m_tree->setHeaderHidden(true); + QObject::connect(m_tree, SIGNAL(itemExpanded(QTreeWidgetItem*)), + this, SLOT(itemExpanded(QTreeWidgetItem*))); + QObject::connect(m_tree, SIGNAL(itemCollapsed(QTreeWidgetItem*)), + this, SLOT(itemCollapsed(QTreeWidgetItem*))); + QObject::connect(m_tree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), + this, SLOT(itemClicked(QTreeWidgetItem*))); + m_canvas = new QSimpleCanvas(QSimpleCanvas::SimpleCanvas, this); + m_canvasRoot = new QSimpleCanvasItem; + m_canvasRoot->setParent(m_canvas->root()); + splitter->addWidget(m_tree); + splitter->addWidget(m_canvas); + splitter->setStretchFactor(1, 2); + layout->addWidget(splitter); + + QHBoxLayout *hlayout = new QHBoxLayout; + hlayout->setContentsMargins(0,0,0,0); + hlayout->addStretch(2); + hlayout->setSpacing(0); + layout->addLayout(hlayout); + QSpinBox *x = new QSpinBox(this); + x->setSingleStep(50); + x->setMaximum(10000); + x->setMinimum(-10000); + QObject::connect(x, SIGNAL(valueChanged(int)), this, SLOT(setX(int))); + QSpinBox *y = new QSpinBox(this); + y->setSingleStep(50); + y->setMaximum(10000); + y->setMinimum(-10000); + QObject::connect(y, SIGNAL(valueChanged(int)), this, SLOT(setY(int))); + hlayout->addWidget(x); + hlayout->addWidget(y); + QPushButton *pb = new QPushButton(tr("Refresh"), this); + QObject::connect(pb, SIGNAL(clicked()), this, SLOT(refresh())); + hlayout->addWidget(pb); +} + +void CanvasScene::refresh() +{ + client->sendMessage(QByteArray()); +} + +void CanvasScene::itemExpanded(QTreeWidgetItem *i) +{ + QmlCanvasDebuggerItem *item = static_cast<QmlCanvasDebuggerItem *>(i); + if(item->me) + item->me->setOpacity(1); +} + +void CanvasScene::setOpacityRecur(QTreeWidgetItem *i, qreal op) +{ + QmlCanvasDebuggerItem *item = static_cast<QmlCanvasDebuggerItem *>(i); + if(item->img) + item->img->setOpacity(op); + + for(int ii = 0; ii < item->childCount(); ++ii) + setOpacityRecur(item->child(ii), op); +} + +void CanvasScene::itemClicked(QTreeWidgetItem *i) +{ + QmlCanvasDebuggerItem *item = static_cast<QmlCanvasDebuggerItem *>(i); + + if(m_selected) { + setOpacityRecur(m_selected, 0); + m_selected = 0; + } + + m_selected = item; + setOpacityRecur(m_selected, 1); +} + +void CanvasScene::itemCollapsed(QTreeWidgetItem *i) +{ + QmlCanvasDebuggerItem *item = static_cast<QmlCanvasDebuggerItem *>(i); + if(item->me) + item->me->setOpacity(0); +} + +void CanvasScene::setX(int x) +{ + m_canvasRoot->setX(x); +} + +void CanvasScene::setY(int y) +{ + m_canvasRoot->setY(y); +} + diff --git a/tools/qmldebugger/canvasscene.h b/tools/qmldebugger/canvasscene.h new file mode 100644 index 0000000..d980241 --- /dev/null +++ b/tools/qmldebugger/canvasscene.h @@ -0,0 +1,39 @@ +#ifndef CANVASSCENE_H +#define CANVASSCENE_H + +#include <QWidget> +#include <QTreeWidget> +#include <QtDeclarative/qsimplecanvas.h> +#include <QtDeclarative/qsimplecanvasitem.h> + +class QmlDebugClient; +class CanvasSceneClient; +class QmlDebugClientPlugin; +class CanvasScene : public QWidget +{ +Q_OBJECT +public: + CanvasScene(QmlDebugClient *, QWidget *parent = 0); + + void message(QDataStream &); +private slots: + void refresh(); + void itemClicked(QTreeWidgetItem *); + void itemExpanded(QTreeWidgetItem *); + void itemCollapsed(QTreeWidgetItem *); + void setX(int); + void setY(int); + +private: + void setOpacityRecur(QTreeWidgetItem *, qreal); + void clone(QTreeWidgetItem *item, QSimpleCanvasItem *me, QDataStream &); + QmlDebugClientPlugin *client; + + QTreeWidget *m_tree; + QSimpleCanvas *m_canvas; + QSimpleCanvasItem *m_canvasRoot; + QTreeWidgetItem *m_selected; +}; + +#endif // CANVASSCENE_H + diff --git a/tools/qmldebugger/main.cpp b/tools/qmldebugger/main.cpp index 2c5be6c..5b94cbb 100644 --- a/tools/qmldebugger/main.cpp +++ b/tools/qmldebugger/main.cpp @@ -8,11 +8,13 @@ #include <QtCore/qstringlist.h> #include <QtCore/qdatastream.h> #include "canvasframerate.h" +#include "canvasscene.h" #include <QVBoxLayout> #include <QPushButton> #include <QLineEdit> #include <QTabWidget> #include <QSpinBox> +#include <QLabel> class Shell : public QWidget { @@ -23,10 +25,12 @@ public: private slots: void connectToHost(); void disconnectFromHost(); + void connectionStateChanged(); private: QmlDebugClient client; + QLabel *m_connectionState; QLineEdit *m_host; QSpinBox *m_port; QPushButton *m_connectButton; @@ -44,8 +48,10 @@ Shell::Shell(QWidget *parent) layout->addLayout(connectLayout); connectLayout->addStretch(2); + m_connectionState = new QLabel(this); + connectLayout->addWidget(m_connectionState); m_host = new QLineEdit(this); - m_host->setText("localhost"); + m_host->setText("127.0.0.1"); connectLayout->addWidget(m_host); m_port = new QSpinBox(this); m_port->setMinimum(1024); @@ -67,33 +73,61 @@ Shell::Shell(QWidget *parent) CanvasFrameRate *cfr = new CanvasFrameRate(&client, this); tabs->addTab(cfr, tr("Frame Rate")); + + CanvasScene *cs = new CanvasScene(&client, this); + tabs->addTab(cs, tr("Scene")); + + QObject::connect(&client, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(connectionStateChanged())); + connectionStateChanged(); +} + +void Shell::connectionStateChanged() +{ + switch (client.state()) { + default: + case QAbstractSocket::UnconnectedState: + m_connectionState->setText(tr("Disconnected")); + m_connectButton->setEnabled(true); + m_disconnectButton->setEnabled(false); + break; + case QAbstractSocket::HostLookupState: + m_connectionState->setText(tr("Resolving")); + m_connectButton->setEnabled(false); + m_disconnectButton->setEnabled(true); + break; + case QAbstractSocket::ConnectingState: + m_connectionState->setText(tr("Connecting")); + m_connectButton->setEnabled(false); + m_disconnectButton->setEnabled(true); + break; + case QAbstractSocket::ConnectedState: + m_connectionState->setText(tr("Connected")); + m_connectButton->setEnabled(false); + m_disconnectButton->setEnabled(true); + break; + case QAbstractSocket::ClosingState: + m_connectionState->setText(tr("Closing")); + m_connectButton->setEnabled(false); + m_disconnectButton->setEnabled(false); + break; + } } void Shell::connectToHost() { - m_connectButton->setEnabled(false); - m_disconnectButton->setEnabled(true); client.connectToHost(m_host->text(), m_port->value()); } void Shell::disconnectFromHost() { - m_connectButton->setEnabled(true); - m_disconnectButton->setEnabled(false); client.disconnectFromHost(); } int main(int argc, char ** argv) { - if(argc != 3) { - qWarning() << "Usage:" << argv[0] << "host port"; - return -1; - } - QApplication app(argc, argv); Shell shell; -// shell.setFixedSize(1024, 768); shell.show(); diff --git a/tools/qmldebugger/qmldebugger.pro b/tools/qmldebugger/qmldebugger.pro index 6af2909..757ba12 100644 --- a/tools/qmldebugger/qmldebugger.pro +++ b/tools/qmldebugger/qmldebugger.pro @@ -1,8 +1,8 @@ DESTDIR = ../../bin QT += network declarative # Input -HEADERS += canvasframerate.h -SOURCES += main.cpp canvasframerate.cpp +HEADERS += canvasframerate.h canvasscene.h +SOURCES += main.cpp canvasframerate.cpp canvasscene.cpp target.path=$$[QT_INSTALL_BINS] INSTALLS += target |