summaryrefslogtreecommitdiff
path: root/src/libs/qmleditorwidgets/contextpanewidgetimage.cpp
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@nokia.com>2010-08-12 15:43:13 +0200
committerThomas Hartmann <Thomas.Hartmann@nokia.com>2010-08-12 15:50:17 +0200
commit12916161abf29fd5f703c5a950bb3e6fd7b9ba10 (patch)
tree36bf64ef4fb085cd70990a86e3df1a2e41a66de5 /src/libs/qmleditorwidgets/contextpanewidgetimage.cpp
parent2effcaeb2ef9369d01b874e6098bcb709fce7f72 (diff)
downloadqt-creator-12916161abf29fd5f703c5a950bb3e6fd7b9ba10.tar.gz
Creating lib: qmleditorwidgets
The library qmleditorwidgets contains widgets and image resources what are shared between QuickToolBar and QmlDesigner This library is created to make QuickToolBar independent from QmlDesigner plugin. All the widgets I moved to qmleditorwidgets are removed from QmlDesigner in this patch
Diffstat (limited to 'src/libs/qmleditorwidgets/contextpanewidgetimage.cpp')
-rw-r--r--src/libs/qmleditorwidgets/contextpanewidgetimage.cpp898
1 files changed, 898 insertions, 0 deletions
diff --git a/src/libs/qmleditorwidgets/contextpanewidgetimage.cpp b/src/libs/qmleditorwidgets/contextpanewidgetimage.cpp
new file mode 100644
index 0000000000..d5469a8b31
--- /dev/null
+++ b/src/libs/qmleditorwidgets/contextpanewidgetimage.cpp
@@ -0,0 +1,898 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "contextpanewidgetimage.h"
+#include "ui_contextpanewidgetimage.h"
+#include "ui_contextpanewidgetborderimage.h"
+#include <qmljs/qmljspropertyreader.h>
+#include <QFile>
+#include <QPixmap>
+#include <QPainter>
+#include <QGraphicsEffect>
+#include <QMouseEvent>
+#include <QScrollArea>
+#include <QSlider>
+#include <QDebug>
+
+namespace QmlEditorWidgets {
+
+bool LabelFilter::eventFilter(QObject *obj, 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 QObject::eventFilter(obj, event);
+}
+
+bool WheelFilter::eventFilter(QObject *obj, QEvent *event)
+{
+ if (event->type() == QEvent::Wheel) {
+ if (obj
+ && obj->isWidgetType()
+ && obj != m_target) {
+ QApplication::sendEvent(m_target, event);
+ return true;
+ }
+ }
+ return QObject::eventFilter(obj, event);
+}
+
+ContextPaneWidgetImage::ContextPaneWidgetImage(QWidget *parent, bool borderImage) :
+ QWidget(parent),
+ ui(0), uiBorderImage(0), previewWasVisible(false)
+{
+ LabelFilter *labelFilter = new LabelFilter(this);
+
+ m_borderImage = borderImage;
+
+ if (m_borderImage) {
+ uiBorderImage = new Ui::ContextPaneWidgetBorderImage;
+ uiBorderImage->setupUi(this);
+ m_fileWidget = uiBorderImage->fileWidget;
+ m_sizeLabel = uiBorderImage->sizeLabel;
+ uiBorderImage->label->setToolTip(tr("double click for preview"));
+ uiBorderImage->label->installEventFilter(labelFilter);
+
+
+ connect(uiBorderImage->verticalTileRadioButton, SIGNAL(toggled(bool)), this, SLOT(onVerticalStretchChanged()));
+ connect(uiBorderImage->verticalStretchRadioButton, SIGNAL(toggled(bool)), this, SLOT(onVerticalStretchChanged()));
+ connect(uiBorderImage->verticalTileRadioButtonNoCrop, SIGNAL(toggled(bool)), this, SLOT(onVerticalStretchChanged()));
+
+ connect(uiBorderImage->horizontalTileRadioButton, SIGNAL(toggled(bool)), this, SLOT(onHorizontalStretchChanged()));
+ connect(uiBorderImage->horizontalStretchRadioButton, SIGNAL(toggled(bool)), this, SLOT(onHorizontalStretchChanged()));
+ connect(uiBorderImage->horizontalTileRadioButtonNoCrop, SIGNAL(toggled(bool)), this, SLOT(onHorizontalStretchChanged()));
+ connect(previewDialog()->previewLabel(), SIGNAL(leftMarginChanged()), this, SLOT(onLeftMarginsChanged()));
+ connect(previewDialog()->previewLabel(), SIGNAL(rightMarginChanged()), this, SLOT(onRightMarginsChanged()));
+ connect(previewDialog()->previewLabel(), SIGNAL(topMarginChanged()), this, SLOT(onTopMarginsChanged()));
+ connect(previewDialog()->previewLabel(), SIGNAL(bottomMarginChanged()), this, SLOT(onBottomMarginsChanged()));
+
+ } else {
+ ui = new Ui::ContextPaneWidgetImage;
+ ui->setupUi(this);
+ ui->label->setToolTip(tr("double click for preview"));
+ ui->label->installEventFilter(labelFilter);
+ m_fileWidget = ui->fileWidget;
+ m_sizeLabel = ui->sizeLabel;
+
+ connect(ui->stretchRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged()));
+ connect(ui->tileRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged()));
+ connect(ui->horizontalStretchRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged()));
+ connect(ui->verticalStretchRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged()));
+ connect(ui->preserveAspectFitRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged()));
+ connect(ui->cropAspectFitRadioButton, SIGNAL(toggled(bool)), this, SLOT(onStretchChanged()));
+ }
+ previewDialog();
+ m_fileWidget->setShowComboBox(true);
+ m_fileWidget->setFilter("*.png *.gif *.jpg");
+
+ connect(m_fileWidget, SIGNAL(fileNameChanged(QUrl)), this, SLOT(onFileNameChanged()));
+ connect(labelFilter, SIGNAL(doubleClicked()), this, SLOT(onPixmapDoubleClicked()));
+
+}
+
+ContextPaneWidgetImage::~ContextPaneWidgetImage()
+{
+ if (ui)
+ delete ui;
+ if (uiBorderImage)
+ delete uiBorderImage;
+}
+
+void ContextPaneWidgetImage::setProperties(QmlJS::PropertyReader *propertyReader)
+{
+ if (m_borderImage) {
+ if (propertyReader->hasProperty(QLatin1String("horizontalTileMode"))) {
+ QString fillMode = propertyReader->readProperty(QLatin1String("horizontalTileMode")).toString();
+ if (fillMode.contains("BorderImage."))
+ fillMode.remove("BorderImage.");
+
+ uiBorderImage->horizontalStretchRadioButton->setChecked(true);
+
+ if (fillMode == "Stretch")
+ uiBorderImage->horizontalStretchRadioButton->setChecked(true);
+ if (fillMode == "Repeat")
+ uiBorderImage->horizontalTileRadioButton->setChecked(true);
+ if (fillMode == "Round")
+ uiBorderImage->horizontalTileRadioButtonNoCrop->setChecked(true);
+ } else {
+ //uiBorderImage
+ uiBorderImage->horizontalStretchRadioButton->setChecked(true);
+ }
+ if (propertyReader->hasProperty(QLatin1String("verticalTileMode"))) {
+ QString fillMode = propertyReader->readProperty(QLatin1String("verticalTileMode")).toString();
+ if (fillMode.contains("BorderImage."))
+ fillMode.remove("BorderImage.");
+
+ uiBorderImage->verticalStretchRadioButton->setChecked(true);
+
+ if (fillMode == "Stretch")
+ uiBorderImage->verticalStretchRadioButton->setChecked(true);
+ if (fillMode == "Repeat")
+ uiBorderImage->verticalTileRadioButton->setChecked(true);
+ if (fillMode == "Round")
+ uiBorderImage->verticalTileRadioButtonNoCrop->setChecked(true);
+ } else {
+ //uiBorderImage
+ uiBorderImage->verticalStretchRadioButton->setChecked(true);
+ }
+ } else {
+ if (propertyReader->hasProperty(QLatin1String("fillMode"))) {
+ QString fillMode = propertyReader->readProperty(QLatin1String("fillMode")).toString();
+ if (fillMode.contains("Image."))
+ fillMode.remove("Image.");
+
+ ui->stretchRadioButton->setChecked(true);
+
+ if (fillMode == "Image.Tile" || fillMode == "Tile")
+ ui->tileRadioButton->setChecked(true);
+ if (fillMode == "Image.TileVertically" || fillMode == "TileVertically")
+ ui->horizontalStretchRadioButton->setChecked(true);
+ if (fillMode == "Image.TileHorizontally" || fillMode == "TileHorizontally")
+ ui->verticalStretchRadioButton->setChecked(true);
+ if (fillMode == "Image.PreserveAspectFit" || fillMode == "PreserveAspectFit")
+ ui->preserveAspectFitRadioButton->setChecked(true);
+ if (fillMode == "Image.PreserveAspectCrop" || fillMode == "PreserveAspectCrop")
+ ui->cropAspectFitRadioButton->setChecked(true);
+ } else {
+ ui->stretchRadioButton->setChecked(true);
+ }
+ }
+ if (propertyReader->hasProperty(QLatin1String("source"))) {
+ QString source = propertyReader->readProperty(QLatin1String("source")).toString();
+ m_fileWidget->setFileName(source);
+ if (QFile::exists(m_path + '/' + source))
+ setPixmap(m_path + '/' + source);
+ else
+ setPixmap(source);
+ } else {
+ m_sizeLabel->setText("");
+ }
+}
+
+void ContextPaneWidgetImage::setPath(const QString& path)
+{
+ m_path = path;
+ m_fileWidget->setPath(QUrl::fromLocalFile(m_path));
+}
+
+void PreviewDialog::setZoom(int z)
+{
+ m_zoom = z;
+ m_label->setZoom(z);
+ switch (m_zoom) {
+ case 1:
+ m_zoomLabel->setText("100%");
+ m_slider->setValue(1);
+ break;
+ case 2:
+ m_zoomLabel->setText("200%");
+ m_slider->setValue(2);
+ break;
+ case 4:
+ m_zoomLabel->setText("400%");
+ m_slider->setValue(3);
+ break;
+ case 6:
+ m_zoomLabel->setText("600%");
+ m_slider->setValue(4);
+ break;
+ case 8:
+ m_zoomLabel->setText("800%");
+ m_slider->setValue(5);
+ break;
+ case 10:
+ m_zoomLabel->setText("1000%");
+ m_slider->setValue(6);
+ break;
+ default: break;
+ }
+ setPixmap(m_pixmap, m_zoom);
+}
+
+void PreviewDialog::setIsBorderImage(bool b)
+{
+ m_borderImage = b;
+ m_label->setIsBorderImage(b);
+}
+
+PreviewLabel *PreviewDialog::previewLabel() const
+{
+ return m_label;
+}
+
+void ContextPaneWidgetImage::onStretchChanged()
+{
+ QString stretch;
+ if (ui->stretchRadioButton->isChecked())
+ stretch = QLatin1String("Image.Stretch");
+ else if (ui->tileRadioButton->isChecked())
+ stretch = QLatin1String("Image.Tile");
+ else if (ui->horizontalStretchRadioButton->isChecked())
+ stretch = QLatin1String("Image.TileVertically");
+ else if (ui->verticalStretchRadioButton->isChecked())
+ stretch = QLatin1String("Image.TileHorizontally");
+ else if (ui->preserveAspectFitRadioButton->isChecked())
+ stretch = QLatin1String("Image.PreserveAspectFit");
+ else if (ui->cropAspectFitRadioButton->isChecked())
+ stretch = QLatin1String("Image.PreserveAspectCrop");
+
+ if (stretch == QLatin1String("Image.Stretch"))
+ emit removeProperty(QLatin1String("fillMode"));
+ else
+ emit propertyChanged(QLatin1String("fillMode"), stretch);
+}
+
+void ContextPaneWidgetImage::onHorizontalStretchChanged()
+{
+ QString stretch;
+ if (uiBorderImage->horizontalStretchRadioButton->isChecked())
+ stretch = QLatin1String("BorderImage.Stretch");
+ if (uiBorderImage->horizontalTileRadioButton->isChecked())
+ stretch = QLatin1String("BorderImage.Repeat");
+ if (uiBorderImage->horizontalTileRadioButtonNoCrop->isChecked())
+ stretch = QLatin1String("BorderImage.Round");
+
+ if (stretch == QLatin1String("BorderImage.Stretch"))
+ emit removeProperty(QLatin1String("horizontalTileMode"));
+ else
+ emit propertyChanged(QLatin1String("horizontalTileMode"), stretch);
+}
+
+void ContextPaneWidgetImage::onVerticalStretchChanged()
+{
+ QString stretch;
+ if (uiBorderImage->verticalStretchRadioButton->isChecked())
+ stretch = QLatin1String("BorderImage.Stretch");
+ if (uiBorderImage->verticalTileRadioButton->isChecked())
+ stretch = QLatin1String("BorderImage.Repeat");
+ if (uiBorderImage->verticalTileRadioButtonNoCrop->isChecked())
+ stretch = QLatin1String("BorderImage.Round");
+
+ if (stretch == QLatin1String("BorderImage.Stretch"))
+ emit removeProperty(QLatin1String("verticalTileMode"));
+ else
+ emit propertyChanged(QLatin1String("verticalTileMode"), stretch);
+
+}
+
+void ContextPaneWidgetImage::onFileNameChanged()
+{
+ if (m_fileWidget->fileName().isNull())
+ emit removeProperty(QLatin1String("source"));
+ else
+ emit propertyChanged(QLatin1String("source"), QString(QLatin1Char('\"') + m_fileWidget->fileName() + QLatin1Char('\"')));
+}
+
+void ContextPaneWidgetImage::onPixmapDoubleClicked()
+{
+ previewDialog()->setParent(parentWidget()->parentWidget());
+ previewDialog()->setMaximumSize(previewDialog()->parentWidget()->size() - QSize(150, 100));
+ if (m_borderImage)
+ previewDialog()->setZoom(4);
+ previewDialog()->setIsBorderImage(m_borderImage);
+
+ QPoint p = parentWidget()->pos();
+ p = p + QPoint(-2, -2);
+ previewDialog()->show();
+ previewDialog()->update();
+ previewDialog()->move(p);
+ //previewDialog()->adjustSize();
+ if ((previewDialog()->pos().x() + previewDialog()->width()) > previewDialog()->parentWidget()->width())
+ previewDialog()->move(previewDialog()->parentWidget()->width() - (previewDialog()->width()) - 40, p.y());
+
+ if ((previewDialog()->pos().y() + previewDialog()->height()) > previewDialog()->parentWidget()->height())
+ previewDialog()->move(previewDialog()->pos().x(), previewDialog()->parentWidget()->height() - (previewDialog()->height()) - 40);
+
+ if (previewDialog()->pos().x() < 0)
+ previewDialog()->move(0, previewDialog()->pos().y());
+ if (previewDialog()->pos().y() < 0)
+ previewDialog()->move(previewDialog()->pos().x(), 0);
+
+ previewDialog()->raise();
+}
+
+void ContextPaneWidgetImage::onLeftMarginsChanged()
+{
+ if (previewDialog()->previewLabel()->leftMarging())
+ propertyChanged(QLatin1String("border.left"), previewDialog()->previewLabel()->leftMarging());
+ else
+ emit removeProperty(QLatin1String("border.left"));
+}
+
+void ContextPaneWidgetImage::onRightMarginsChanged()
+{
+ if (previewDialog()->previewLabel()->rightMarging())
+ propertyChanged(QLatin1String("border.right"), previewDialog()->previewLabel()->rightMarging());
+ else
+ emit removeProperty(QLatin1String("border.right"));
+
+
+}
+
+void ContextPaneWidgetImage::onTopMarginsChanged()
+{
+ if (previewDialog()->previewLabel()->topMarging())
+ propertyChanged(QLatin1String("border.top"), previewDialog()->previewLabel()->topMarging());
+ else
+ emit removeProperty(QLatin1String("border.top"));
+}
+
+void ContextPaneWidgetImage::onBottomMarginsChanged()
+{
+ if (previewDialog()->previewLabel()->bottomMarging())
+ propertyChanged(QLatin1String("border.bottom"), previewDialog()->previewLabel()->bottomMarging());
+ else
+ emit removeProperty(QLatin1String("border.bottom"));
+
+}
+
+
+void ContextPaneWidgetImage::setPixmap(const QString &fileName)
+{
+ QPixmap pix(76,76);
+ pix.fill(Qt::black);
+
+ if (m_borderImage) {
+ if (QFile(fileName).exists()) {
+ QPixmap source(fileName);
+ if (source.isNull())
+ source = pix;
+ previewDialog()->setPixmap(source, previewDialog()->zoom());
+ uiBorderImage->sizeLabel->setText(QString::number(source.width()) + 'x' + QString::number(source.height()));
+ QPainter p(&pix);
+ Qt::TileRule horizontalTileMode = Qt::StretchTile;
+ Qt::TileRule verticalTileMode = Qt::StretchTile;
+ if (uiBorderImage->horizontalTileRadioButton->isChecked())
+ horizontalTileMode =Qt::RepeatTile;
+ if (uiBorderImage->horizontalTileRadioButtonNoCrop->isChecked())
+ horizontalTileMode =Qt::RoundTile;
+ if (uiBorderImage->verticalTileRadioButton->isChecked())
+ verticalTileMode =Qt::RepeatTile;
+ if (uiBorderImage->verticalTileRadioButtonNoCrop->isChecked())
+ verticalTileMode =Qt::RoundTile;
+ QTileRules rules(horizontalTileMode, verticalTileMode);
+ QMargins margins(previewDialog()->previewLabel()->leftMarging() ,previewDialog()->previewLabel()->topMarging() ,previewDialog()->previewLabel()->rightMarging(), previewDialog()->previewLabel()->bottomMarging());
+ qDrawBorderPixmap(&p, QRect(0, 0, 76, 76), margins, source, source.rect(), margins, rules);
+ //p.drawPixmap(0,0,76,76, source);
+ } else {
+ uiBorderImage->sizeLabel->setText("");
+ }
+ uiBorderImage->label->setPixmap(pix);
+ } else {
+ if (QFile(fileName).exists()) {
+ QPixmap source(fileName);
+ previewDialog()->setPixmap(source, 1);
+ ui->sizeLabel->setText(QString::number(source.width()) + 'x' + QString::number(source.height()));
+ QPainter p(&pix);
+ if (ui->stretchRadioButton->isChecked()) {
+ p.drawPixmap(0,0,76,76, source);
+ } else if (ui->tileRadioButton->isChecked()) {
+ QPixmap small = source.scaled(38,38);
+ p.drawTiledPixmap(0,0,76,76, small);
+ } else if (ui->horizontalStretchRadioButton->isChecked()) {
+ QPixmap small = source.scaled(38,38);
+ QPixmap half = pix.scaled(38, 76);
+ QPainter p2(&half);
+ p2.drawTiledPixmap(0,0,38,76, small);
+ p.drawPixmap(0,0,76,76, half);
+ } else if (ui->verticalStretchRadioButton->isChecked()) {
+ QPixmap small = source.scaled(38,38);
+ QPixmap half = pix.scaled(76, 38);
+ QPainter p2(&half);
+ p2.drawTiledPixmap(0,0,76,38, small);
+ p.drawPixmap(0,0,76,76, half);
+ } else if (ui->preserveAspectFitRadioButton->isChecked()) {
+ QPixmap preserved = source.scaledToWidth(76);
+ int offset = (76 - preserved.height()) / 2;
+ p.drawPixmap(0, offset, 76, preserved.height(), source);
+ } else if (ui->cropAspectFitRadioButton->isChecked()) {
+ QPixmap cropped = source.scaledToHeight(76);
+ int offset = (76 - cropped.width()) / 2;
+ p.drawPixmap(offset, 0, cropped.width(), 76, source);
+ }
+ } else {
+ ui->sizeLabel->setText("");
+ }
+
+ ui->label->setPixmap(pix);
+
+ }
+}
+
+PreviewDialog* ContextPaneWidgetImage::previewDialog()
+{
+ if (!m_previewDialog) {
+ m_previewDialog = new PreviewDialog(this);
+ m_previewDialog->hide();
+ }
+
+ return m_previewDialog.data();
+}
+
+void ContextPaneWidgetImage::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ if (ui)
+ ui->retranslateUi(this);
+ if (uiBorderImage)
+ uiBorderImage->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+
+void ContextPaneWidgetImage::hideEvent(QHideEvent * event)
+{
+ previewWasVisible = previewDialog()->isVisible();
+ previewDialog()->hide();
+ QWidget::hideEvent(event);
+}
+
+void ContextPaneWidgetImage::showEvent(QShowEvent* event)
+{
+ if (previewWasVisible)
+ previewDialog()->show();
+ QWidget::showEvent(event);
+}
+
+PreviewLabel::PreviewLabel(QWidget *parent)
+ : QLabel(parent),
+ m_dragging_left(false), m_dragging_right(false),
+ m_dragging_top(false), m_dragging_bottom(false)
+
+{
+ m_zoom = 1;
+ m_showBorders = false;
+ m_left = 2;
+ m_right = 2;
+ m_top = 2;
+ m_bottom = 2;
+ setMouseTracking(true);
+ setCursor(QCursor(Qt::ArrowCursor));
+ m_hooverInfo = new QLabel(parentWidget());
+ m_hooverInfo->hide();
+
+ m_hooverInfo->setFrameShape(QFrame::StyledPanel);
+ m_hooverInfo->setFrameShadow(QFrame::Sunken);
+
+ QGraphicsDropShadowEffect *dropShadowEffect = new QGraphicsDropShadowEffect;
+ dropShadowEffect->setBlurRadius(4);
+ dropShadowEffect->setOffset(2, 2);
+ m_hooverInfo->setGraphicsEffect(dropShadowEffect);
+ m_hooverInfo->setAutoFillBackground(true);
+ m_hooverInfo->raise();
+}
+
+void PreviewLabel::setZoom(int z)
+{
+ m_zoom = z;
+}
+
+void PreviewLabel::setIsBorderImage(bool b)
+{
+ m_borderImage = b;
+}
+
+void PreviewLabel::setMargins(int left, int top, int right, int bottom)
+{
+ m_left = left;
+ m_top = top;
+ m_right = right;
+ m_bottom = bottom;
+}
+
+void PreviewLabel::paintEvent(QPaintEvent *event)
+{
+ QLabel::paintEvent(event);
+ if (m_borderImage) {
+
+ QPainter p(this);
+
+ p.setOpacity(0.5);
+
+ p.setBackgroundMode(Qt::TransparentMode);
+ {
+ QPen pen(Qt::SolidLine);
+ pen.setColor("#F0F0F0");
+ p.setPen(pen);
+
+ if (m_left >= 0)
+ p.drawLine(m_left * m_zoom, 4, m_left * m_zoom, height() - 4);
+ if (m_right >= 0)
+ p.drawLine(width() - m_right * m_zoom, 4, width() - m_right * m_zoom, height() - 4);
+ if (m_top >= 0)
+ p.drawLine(4, m_top * m_zoom, width() - 4, m_top * m_zoom);
+ if (m_bottom >= 0)
+ p.drawLine(4, height() - m_bottom * m_zoom, width() - 4, height() - m_bottom * m_zoom);
+ }
+
+ {
+ QBrush brush(Qt::Dense4Pattern);
+ brush.setColor("#101010");
+ QPen pen(brush, 1, Qt::DotLine);
+ pen.setColor("#101010");
+ p.setPen(pen);
+
+ if (m_left >= 0)
+ p.drawLine(m_left * m_zoom, 4, m_left * m_zoom, height() - 4);
+ if (m_right >= 0)
+ p.drawLine(width() - m_right * m_zoom, 4, width() - m_right * m_zoom, height() - 4);
+ if (m_top >= 0)
+ p.drawLine(4, m_top * m_zoom, width() - 4, m_top * m_zoom);
+ if (m_bottom >= 0)
+ p.drawLine(4, height() - m_bottom * m_zoom, width() - 4, height() - m_bottom * m_zoom);
+ }
+ }
+}
+
+static inline bool rangeCheck(int target, int pos)
+{
+ return (target - 10 < pos) && (target + 10 > pos);
+}
+
+void PreviewLabel::mousePressEvent(QMouseEvent * event)
+{
+ if (!m_borderImage)
+ return QLabel::mouseMoveEvent(event);
+
+ if (event->button() == Qt::LeftButton) {
+ if (QApplication::overrideCursor())
+ QApplication::restoreOverrideCursor();
+ if (rangeCheck(m_left * m_zoom, event->pos().x())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeHorCursor));
+ m_dragging_left = true;
+ event->accept();
+ m_hooverInfo->setText("Left " + QString::number(m_left));
+ m_hooverInfo->show();
+ } else if (rangeCheck(m_top * m_zoom, event->pos().y())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeVerCursor));
+ m_dragging_top = true;
+ event->accept();
+ m_hooverInfo->setText("Top " + QString::number(m_top));
+ m_hooverInfo->show();
+ } else if (rangeCheck(m_right * m_zoom, width() - event->pos().x())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeHorCursor));
+ m_dragging_right = true;
+ event->accept();
+ m_hooverInfo->setText("Right " + QString::number(m_right));
+ m_hooverInfo->show();
+ } else if (rangeCheck(m_bottom * m_zoom, height() - event->pos().y())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeVerCursor));
+ m_dragging_bottom = true;
+ event->accept();
+ m_hooverInfo->setText("Bottom " + QString::number(m_bottom));
+ m_hooverInfo->show();
+ } else {
+ QLabel::mousePressEvent(event);
+ }
+ m_startPos = event->pos();
+ m_hooverInfo->move(mapToParent(event->pos()) + QPoint(0, 40));
+ m_hooverInfo->resize(m_hooverInfo->sizeHint());
+ m_hooverInfo->raise();
+ }
+}
+
+void PreviewLabel::mouseReleaseEvent(QMouseEvent * event)
+{
+ if (!m_borderImage)
+ return QLabel::mouseMoveEvent(event);
+
+ if (m_dragging_left || m_dragging_top || m_dragging_right|| m_dragging_bottom) {
+ m_hooverInfo->hide();
+ if (m_dragging_left)
+ emit leftMarginChanged();
+
+ if (m_dragging_top)
+ emit topMarginChanged();
+
+ if (m_dragging_bottom)
+ emit bottomMarginChanged();
+
+ if (m_dragging_right)
+ emit rightMarginChanged();
+
+ m_dragging_left = false;
+ m_dragging_top = false;
+ m_dragging_right = false;
+ m_dragging_bottom = false;
+ QApplication::restoreOverrideCursor();
+ event->accept();
+
+ } else {
+ QLabel::mouseReleaseEvent(event);
+ }
+}
+
+
+static inline int limitPositive(int i)
+{
+ if (i >= 0)
+ return i;
+ return 0;
+}
+
+static inline int limit(int i, int zoom)
+{
+ static bool flag1 = 1;
+ static bool flag2 = 1;
+ if (zoom == 1)
+ return i;
+ if (i < 0) {
+ int v = i / zoom;
+ if (v)
+ return v;
+ if (zoom == 2) {
+ flag1 =!flag1;
+ return flag1 ? -1 : 0;
+ }
+ flag1 =!flag1;
+ if (flag1)
+ flag2 =!flag2;
+
+ return flag1 && flag2 ? -1 : 0;
+ }
+ if (i > 0) {
+ int v = i / zoom;
+ if (v)
+ return v;
+ if (zoom == 2) {
+ flag1 =!flag1;
+ return flag1 ? 1 : 0;
+ }
+ flag1 =!flag1;
+ if (flag1)
+ flag2 =!flag2;
+
+ return flag1 && flag2 ? 1 : 0;
+ }
+ return 0;
+}
+
+void PreviewLabel::mouseMoveEvent(QMouseEvent * event)
+{
+ if (!m_borderImage)
+ return QLabel::mouseMoveEvent(event);
+
+ QPoint p = event->pos();
+ if (m_dragging_left) {
+ m_left += limit(p.x() - m_startPos.x(), m_zoom);
+ m_left = limitPositive(m_left);
+ event->accept();
+ m_hooverInfo->setText("Left " + QString::number(m_left));
+ update();
+ } else if (m_dragging_top) {
+ m_top += limit(p.y() - m_startPos.y(), m_zoom);
+ m_top = limitPositive(m_top);
+ event->accept();
+ m_hooverInfo->setText("Top " + QString::number(m_top));
+ update();
+ } else if (m_dragging_right) {
+ m_right += limit(m_startPos.x() - p.x(), m_zoom);
+ m_right = limitPositive(m_right);
+ event->accept();
+ m_hooverInfo->setText("Right " + QString::number(m_right));
+ update();
+ } else if (m_dragging_bottom) {
+ m_bottom += limit(m_startPos.y() - p.y(), m_zoom);
+ m_bottom = limitPositive(m_bottom);
+ event->accept();
+ m_hooverInfo->setText("Bottom " + QString::number(m_bottom));
+ update();
+ } else if (rangeCheck(m_left * m_zoom, p.x())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeHorCursor));
+ event->accept();
+ m_hooverInfo->setText("Left " + QString::number(m_left));
+ m_hooverInfo->show();
+ } else if (rangeCheck(m_top * m_zoom, p.y())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeVerCursor));
+ event->accept();
+ m_hooverInfo->setText("Top " + QString::number(m_top));
+ m_hooverInfo->show();
+ } else if (rangeCheck(m_right * m_zoom, width() - p.x())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeHorCursor));
+ event->accept();
+ m_hooverInfo->setText("Right " + QString::number(m_right));
+ m_hooverInfo->show();
+ } else if (rangeCheck(m_bottom * m_zoom, height() - p.y())) {
+ QApplication::setOverrideCursor(QCursor(Qt::SizeVerCursor));
+ event->accept();
+ m_hooverInfo->setText("Bottom " + QString::number(m_bottom));
+ m_hooverInfo->show();
+ } else {
+ if (QApplication::overrideCursor())
+ QApplication::restoreOverrideCursor();
+ QLabel::mouseMoveEvent(event);
+ m_hooverInfo->hide();
+ }
+ m_startPos = p;
+ m_hooverInfo->move(mapToParent(p) + QPoint(0, 40));
+ m_hooverInfo->resize(m_hooverInfo->sizeHint());
+ m_hooverInfo->raise();
+}
+
+void PreviewLabel::leaveEvent(QEvent* event )
+{
+ while (QApplication::overrideCursor())
+ QApplication::restoreOverrideCursor();
+ m_hooverInfo->hide();
+ QLabel::leaveEvent(event);
+}
+
+PreviewDialog::PreviewDialog(QWidget *parent) : DragWidget(parent)
+{
+ m_borderImage = false;
+ setAutoFillBackground(true);
+
+ m_label = new PreviewLabel(this);
+ m_slider = new QSlider(this);
+
+ m_zoomLabel = new QLabel(this);
+
+ setZoom(1);
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ QHBoxLayout *horizontalLayout = new QHBoxLayout();
+ QHBoxLayout *horizontalLayout2 = new QHBoxLayout();
+ layout->setMargin(0);
+ layout->setContentsMargins(2, 2, 2, 6);
+ layout->setSpacing(4);
+ 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()));
+
+ QScrollArea *scrollArea = new QScrollArea(this);
+ WheelFilter *wheelFilter = new WheelFilter(scrollArea);
+ scrollArea->setWidget(m_label);
+ scrollArea->setFrameStyle(QFrame::NoFrame);
+ m_slider->setOrientation(Qt::Horizontal);
+ m_slider->setRange(1, 6);
+ m_slider->setFixedWidth(80);
+ m_zoomLabel->setFixedWidth(50);
+
+ horizontalLayout->addWidget(toolButton);
+ horizontalLayout->addSpacing(6);
+ horizontalLayout->addWidget(m_slider);
+ horizontalLayout->addSpacing(6);
+ horizontalLayout->addWidget(m_zoomLabel);
+ horizontalLayout->addStretch(1);
+
+ layout->addLayout(horizontalLayout);
+ horizontalLayout2->addSpacing(24);
+ horizontalLayout2->addWidget(scrollArea);
+ layout->addLayout(horizontalLayout2);
+
+ wheelFilter->setTarget(this);
+
+ connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderMoved(int)));
+
+ foreach (QWidget *childWidget, findChildren<QWidget*>()) {
+ childWidget->installEventFilter(wheelFilter);
+ }
+}
+
+void PreviewDialog::setPixmap(const QPixmap &p, int zoom)
+{
+ m_pixmap = p;
+ if (!p.isNull())
+ m_label->setPixmap(p.scaled(p.width() * zoom, p.height() * zoom));
+ else
+ m_label->setPixmap(QPixmap());
+ m_label->adjustSize();
+ m_zoom = zoom;
+ m_label->setZoom(m_zoom);
+ QSize size = m_label->pixmap()->size() + QSize(54, 44);
+ if (size.width() < 180)
+ size.setWidth(180);
+ resize(size);
+}
+
+void PreviewDialog::wheelEvent(QWheelEvent* event)
+{
+ int delta = event->delta();
+ event->accept();
+ if (delta > 0) {
+ if (m_zoom == 1)
+ setZoom(2);
+ else if (m_zoom == 2)
+ setZoom(4);
+ else if (m_zoom == 4)
+ setZoom(6);
+ else if (m_zoom == 6)
+ setZoom(8);
+ else if (m_zoom == 8)
+ setZoom(10);
+ } else {
+ if (m_zoom == 10)
+ setZoom(8);
+ else if (m_zoom == 8)
+ setZoom(6);
+ else if (m_zoom == 6)
+ setZoom(4);
+ else if (m_zoom == 4)
+ setZoom(2);
+ else if (m_zoom == 2)
+ setZoom(1);
+ }
+ setPixmap(m_pixmap, m_zoom);
+}
+
+void PreviewDialog::onTogglePane()
+{
+ hide();
+}
+
+void PreviewDialog::onSliderMoved(int value)
+{
+ switch (value) {
+ case 1: setZoom(1); break;
+ case 2: setZoom(2); break;
+ case 3: setZoom(4); break;
+ case 4: setZoom(6); break;
+ case 5: setZoom(8); break;
+ case 6: setZoom(10); break;
+ default: break;
+ }
+}
+
+} //QmlDesigner