diff --git a/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.cpp b/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.cpp index 6e598f68fc8da9428f319fc85b964569eb980fe8..fa743a8a3f098c8162d4195dac7ee78eb94f74bf 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.cpp @@ -4,16 +4,39 @@ #include <QFile> #include <QPixmap> #include <QPainter> +#include <QGraphicsEffect> namespace QmlDesigner { +bool LabelFilter::eventFilter(QObject *, QEvent *event) +{ + if (event->type() == QEvent::MouseButtonPress) { + return true; + } + if (event->type() == QEvent::MouseButtonRelease) { + return true; + } + if (event->type() == QEvent::MouseButtonDblClick) { + emit doubleClicked(); + event->accept(); + return true; + } + return false; +} + ContextPaneWidgetImage::ContextPaneWidgetImage(QWidget *parent) : QWidget(parent), ui(new Ui::ContextPaneWidgetImage) { + LabelFilter *labelFilter = new LabelFilter(this); + ui->setupUi(this); ui->fileWidget->setShowComboBox(true); ui->fileWidget->setFilter("*.png *.gif *.jpg"); + ui->label->setToolTip(tr("double click for preview")); + ui->label->installEventFilter(labelFilter); + m_previewDialog = new PreviewDialog(this); + m_previewDialog->hide(); connect(ui->stretchRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged())); connect(ui->tileRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged())); @@ -23,6 +46,7 @@ ContextPaneWidgetImage::ContextPaneWidgetImage(QWidget *parent) : connect(ui->cropAspectFitRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged())); connect(ui->fileWidget, SIGNAL(fileNameChanged(QUrl)), this, SLOT(onFileNameChanged())); + connect(labelFilter, SIGNAL(doubleClicked()), this, SLOT(onPixmapDoubleClicked())); } ContextPaneWidgetImage::~ContextPaneWidgetImage() @@ -102,6 +126,29 @@ void ContextPaneWidgetImage::onFileNameChanged() emit propertyChanged(QLatin1String("source"), QString(QLatin1Char('\"') + ui->fileWidget->fileName() + QLatin1Char('\"'))); } +void ContextPaneWidgetImage::onPixmapDoubleClicked() +{ + m_previewDialog->setParent(parentWidget()->parentWidget()); + QPoint p = parentWidget()->pos(); + p = p + QPoint(-20, -20); + m_previewDialog->show(); + m_previewDialog->update(); + m_previewDialog->move(p); + m_previewDialog->resize(m_previewDialog->sizeHint()); + if ((m_previewDialog->pos().x() + m_previewDialog->width()) > m_previewDialog->parentWidget()->width()) + m_previewDialog->move(m_previewDialog->parentWidget()->width() - (m_previewDialog->width()) - 40, p.y()); + + if ((m_previewDialog->pos().y() + m_previewDialog->height()) > m_previewDialog->parentWidget()->height()) + m_previewDialog->move(m_previewDialog->pos().x(), m_previewDialog->parentWidget()->height() - (m_previewDialog->height()) - 40); + + if (m_previewDialog->pos().x() < 0) + m_previewDialog->move(0, m_previewDialog->pos().y()); + if (m_previewDialog->pos().y() < 0) + m_previewDialog->move(m_previewDialog->pos().x(), 0); + + m_previewDialog->raise(); +} + void ContextPaneWidgetImage::setPixmap(const QString &fileName) { QPixmap pix(76,76); @@ -109,6 +156,7 @@ void ContextPaneWidgetImage::setPixmap(const QString &fileName) if (QFile(fileName).exists()) { QPixmap source(fileName); + m_previewDialog->setPixmap(source); ui->sizeLabel->setText(QString::number(source.width()) + 'x' + QString::number(source.height())); QPainter p(&pix); if (ui->stretchRadioButton->isChecked()) { @@ -156,4 +204,34 @@ void ContextPaneWidgetImage::changeEvent(QEvent *e) } } +PreviewDialog::PreviewDialog(QWidget *parent) : DragWidget(parent) +{ + setAutoFillBackground(true); + + m_label = new QLabel(this); + + QGridLayout *layout = new QGridLayout(this); + layout->setMargin(0); + layout->setContentsMargins(1, 1, 1, 1); + layout->setSpacing(0); + QToolButton *toolButton = new QToolButton(this); + QIcon icon(style()->standardIcon(QStyle::SP_DockWidgetCloseButton)); + toolButton->setIcon(icon); + toolButton->setToolButtonStyle(Qt::ToolButtonIconOnly); + toolButton->setFixedSize(icon.availableSizes().value(0) + QSize(4, 4)); + connect(toolButton, SIGNAL(clicked()), this, SLOT(onTogglePane())); + layout->addWidget(toolButton, 0, 0, 1, 1); + layout->addWidget(m_label, 0, 1, 2, 2); +} + +void PreviewDialog::setPixmap(const QPixmap &p) +{ + m_label->setPixmap(p); +} + +void PreviewDialog::onTogglePane() +{ + hide(); +} + } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.h b/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.h index ed16f5a97a82eba2a8e766f64ba9f953d31f20da..4ac9ed915e03f787e7972e551284d6857ada3912 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.h +++ b/src/plugins/qmldesigner/components/propertyeditor/contextpanewidgetimage.h @@ -2,11 +2,14 @@ #define CONTEXTPANEWIDGETIMAGE_H #include <QWidget> +#include <QFrame> +#include <contextpanewidget.h> QT_BEGIN_NAMESPACE namespace Ui { class ContextPaneWidgetImage; } +class QLabel; QT_END_NAMESPACE namespace QmlJS { @@ -15,6 +18,20 @@ namespace QmlJS { namespace QmlDesigner { +class PreviewDialog : public DragWidget +{ + Q_OBJECT + +public: + PreviewDialog(QWidget *parent = 0); + void setPixmap(const QPixmap &p); +public slots: + void onTogglePane(); + +private: + QLabel * m_label; +}; + class ContextPaneWidgetImage : public QWidget { Q_OBJECT @@ -33,6 +50,7 @@ signals: public slots: void onStretchChanged(); void onFileNameChanged(); + void onPixmapDoubleClicked(); void setPixmap(const QString &fileName); protected: @@ -41,8 +59,23 @@ protected: private: Ui::ContextPaneWidgetImage *ui; QString m_path; + PreviewDialog *m_previewDialog; }; +class LabelFilter: public QObject { + + Q_OBJECT +public: + LabelFilter(QObject* parent =0) : QObject(parent) {} +signals: + void doubleClicked(); +protected: + bool eventFilter(QObject *obj, QEvent *event); +}; + + + + } //QmlDesigner #endif // CONTEXTPANEWIDGETIMAGE_H