diff options
| author | Alessandro Portale <alessandro.portale@nokia.com> | 2011-11-24 15:14:53 +0100 |
|---|---|---|
| committer | Alessandro Portale <alessandro.portale@nokia.com> | 2011-11-25 17:12:58 +0100 |
| commit | 6c36a2a9ad5e495d31c2e20e7e76e57a0ede684f (patch) | |
| tree | 99e1d8ce8543fa6982b37826f8dadb0ed1979cd9 /src/tools/screenshotcropper | |
| parent | 9e0cae5dac4d388caa948205a8e72cda199a213f (diff) | |
| download | qt-creator-6c36a2a9ad5e495d31c2e20e7e76e57a0ede684f.tar.gz | |
Cropping the examples screen shots to "Areas of interest".
The cropping coordinates are stored in a file
images_areasofinterest.xml. A tool to create/maintain the cropping
coordinates is included in this patch.
Then changes to Delegate.qml prevent QML from scaling the image.
If scaling is needed it is now the job of the Image provider.
dropshadow.png had to be adjusted because the border had different
widths and heights.
Change-Id: Ib25db896d40eeec0e0a373c971931dc5cabf3cbe
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Diffstat (limited to 'src/tools/screenshotcropper')
| -rw-r--r-- | src/tools/screenshotcropper/cropimageview.cpp | 59 | ||||
| -rw-r--r-- | src/tools/screenshotcropper/cropimageview.h | 30 | ||||
| -rw-r--r-- | src/tools/screenshotcropper/main.cpp | 36 | ||||
| -rw-r--r-- | src/tools/screenshotcropper/screenshotcropper.pro | 17 | ||||
| -rw-r--r-- | src/tools/screenshotcropper/screenshotcropperwindow.cpp | 53 | ||||
| -rw-r--r-- | src/tools/screenshotcropper/screenshotcropperwindow.h | 35 | ||||
| -rw-r--r-- | src/tools/screenshotcropper/screenshotcropperwindow.ui | 86 |
7 files changed, 316 insertions, 0 deletions
diff --git a/src/tools/screenshotcropper/cropimageview.cpp b/src/tools/screenshotcropper/cropimageview.cpp new file mode 100644 index 0000000000..9473825d53 --- /dev/null +++ b/src/tools/screenshotcropper/cropimageview.cpp @@ -0,0 +1,59 @@ +#include "cropimageview.h" +#include <QtGui/QPainter> +#include <QtGui/QMouseEvent> + +CropImageView::CropImageView(QWidget *parent) + : QWidget(parent) +{ +} + +void CropImageView::mousePressEvent(QMouseEvent *event) +{ + setArea(QRect(event->pos(), m_area.bottomRight())); + update(); +} + +void CropImageView::mouseMoveEvent(QMouseEvent *event) +{ + setArea(QRect(m_area.topLeft(), event->pos())); + update(); +} + +void CropImageView::mouseReleaseEvent(QMouseEvent *event) +{ + mouseMoveEvent(event); +} + +void CropImageView::setImage(const QImage &image) +{ + m_image = image; + setMinimumSize(image.size()); + update(); +} + +void CropImageView::setArea(const QRect &area) +{ + m_area = m_image.rect().intersected(area); + emit cropAreaChanged(m_area); + update(); +} + +void CropImageView::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + QPainter p(this); + + if (!m_image.isNull()) + p.drawImage(0, 0, m_image); + + if (!m_area.isNull()) { + p.setPen(Qt::white); + p.drawRect(m_area); + QPen redDashes; + redDashes.setColor(Qt::red); + redDashes.setStyle(Qt::DashLine); + p.setPen(redDashes); + p.drawRect(m_area); + } +} + diff --git a/src/tools/screenshotcropper/cropimageview.h b/src/tools/screenshotcropper/cropimageview.h new file mode 100644 index 0000000000..a9f3ee38d9 --- /dev/null +++ b/src/tools/screenshotcropper/cropimageview.h @@ -0,0 +1,30 @@ +#ifndef CROPIMAGEVIEW_H +#define CROPIMAGEVIEW_H + +#include <QWidget> + +class CropImageView : public QWidget +{ + Q_OBJECT + +public: + explicit CropImageView(QWidget *parent = 0); + + void paintEvent(QPaintEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + +public slots: + void setImage(const QImage &image); + void setArea(const QRect &area); + +signals: + void cropAreaChanged(const QRect &area); + +private: + QImage m_image; + QRect m_area; +}; + +#endif // CROPIMAGEVIEW_H diff --git a/src/tools/screenshotcropper/main.cpp b/src/tools/screenshotcropper/main.cpp new file mode 100644 index 0000000000..cf1a1dc743 --- /dev/null +++ b/src/tools/screenshotcropper/main.cpp @@ -0,0 +1,36 @@ +#include <QtGui> +#include "screenshotcropperwindow.h" + +using namespace QtSupport::Internal; + +const QString settingsKeyAreasXmlFile = QLatin1String("areasXmlFile"); +const QString settingsKeyImagesFolder = QLatin1String("imagesFolder"); + +static void promptPaths(QString &areasXmlFile, QString &imagesFolder) +{ + QSettings settings(QLatin1String("Nokia"), QLatin1String("Qt Creator Screenshot Cropper")); + + areasXmlFile = settings.value(settingsKeyAreasXmlFile).toString(); + areasXmlFile = QFileDialog::getOpenFileName(0, QLatin1String("Select the 'images_areaofinterest.xml' file in Qt Creator's sources"), areasXmlFile); + settings.setValue(settingsKeyAreasXmlFile, areasXmlFile); + + imagesFolder = settings.value(settingsKeyImagesFolder).toString(); + imagesFolder = QFileDialog::getExistingDirectory(0, QLatin1String("Select the 'doc/src/images' folder in Qt's sources"), imagesFolder); + settings.setValue(settingsKeyImagesFolder, imagesFolder); +} + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QString areasXmlFile; + QString imagesFolder; + promptPaths(areasXmlFile, imagesFolder); + + ScreenShotCropperWindow w; + w.show(); + w.loadData(areasXmlFile, imagesFolder); + w.selectImage(0); + + return a.exec(); +} diff --git a/src/tools/screenshotcropper/screenshotcropper.pro b/src/tools/screenshotcropper/screenshotcropper.pro new file mode 100644 index 0000000000..dcf1a32e6f --- /dev/null +++ b/src/tools/screenshotcropper/screenshotcropper.pro @@ -0,0 +1,17 @@ +SOURCES += \ + main.cpp\ + screenshotcropperwindow.cpp \ + cropimageview.cpp \ + ../../plugins/qtsupport/screenshotcropper.cpp + +HEADERS += \ + screenshotcropperwindow.h \ + cropimageview.h \ + ../../plugins/qtsupport/screenshotcropper.h + +INCLUDEPATH += \ + ../../plugins/qtsupport \ + ../../plugins + +FORMS += \ + screenshotcropperwindow.ui diff --git a/src/tools/screenshotcropper/screenshotcropperwindow.cpp b/src/tools/screenshotcropper/screenshotcropperwindow.cpp new file mode 100644 index 0000000000..524b5f00dc --- /dev/null +++ b/src/tools/screenshotcropper/screenshotcropperwindow.cpp @@ -0,0 +1,53 @@ +#include "screenshotcropperwindow.h" +#include "ui_screenshotcropperwindow.h" +#include <QtGui/QListWidget> +#include <QtCore/QDebug> + +using namespace QtSupport::Internal; + +ScreenShotCropperWindow::ScreenShotCropperWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::ScreenShotCropperWindow) +{ + ui->setupUi(this); + connect(ui->m_filenamesList, SIGNAL(currentRowChanged(int)), SLOT(selectImage(int))); + connect(ui->m_cropImageView, SIGNAL(cropAreaChanged(QRect)), SLOT(setArea(QRect))); + connect(ui->m_buttonBox, SIGNAL(accepted()), SLOT(saveData())); + connect(ui->m_buttonBox, SIGNAL(rejected()), SLOT(close())); +} + +ScreenShotCropperWindow::~ScreenShotCropperWindow() +{ + delete ui; +} + +void ScreenShotCropperWindow::loadData(const QString &areasXmlFile, const QString &imagesFolder) +{ + m_areasOfInterestFile = areasXmlFile; + m_areasOfInterest = ScreenshotCropper::loadAreasOfInterest(m_areasOfInterestFile); + m_imagesFolder = imagesFolder; + foreach (const QString &pngFile, m_areasOfInterest.keys()) + ui->m_filenamesList->addItem(pngFile); +} + +void ScreenShotCropperWindow::selectImage(int index) +{ + const QString fileName = ui->m_filenamesList->item(index)->text(); + ui->m_cropImageView->setImage(QImage(m_imagesFolder + QLatin1Char('/') + fileName)); + ui->m_cropImageView->setArea(m_areasOfInterest.value(fileName)); +} + +void ScreenShotCropperWindow::setArea(const QRect &area) +{ + const QListWidgetItem *item = ui->m_filenamesList->currentItem(); + if (!item) + return; + const QString currentFile = item->text(); + m_areasOfInterest.insert(currentFile, area); +} + +void ScreenShotCropperWindow::saveData() +{ + if (!ScreenshotCropper::saveAreasOfInterest(m_areasOfInterestFile, m_areasOfInterest)) + qFatal("Cannot write %s", qPrintable(m_areasOfInterestFile)); +} diff --git a/src/tools/screenshotcropper/screenshotcropperwindow.h b/src/tools/screenshotcropper/screenshotcropperwindow.h new file mode 100644 index 0000000000..5941545010 --- /dev/null +++ b/src/tools/screenshotcropper/screenshotcropperwindow.h @@ -0,0 +1,35 @@ +#ifndef SCREENSHOTCROPPERWINDOW_H +#define SCREENSHOTCROPPERWINDOW_H + +#include <QMainWindow> +#include "screenshotcropper.h" + +using namespace QtSupport::Internal; + +namespace Ui { +class ScreenShotCropperWindow; +} + +class ScreenShotCropperWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit ScreenShotCropperWindow(QWidget *parent = 0); + ~ScreenShotCropperWindow(); + + void loadData(const QString &areasXmlFile, const QString &imagesFolder); + +public slots: + void selectImage(int index); + void setArea(const QRect &area); + void saveData(); + +private: + AreasOfInterest m_areasOfInterest; + QString m_areasOfInterestFile; + QString m_imagesFolder; + Ui::ScreenShotCropperWindow *ui; +}; + +#endif // SCREENSHOTCROPPERWINDOW_H diff --git a/src/tools/screenshotcropper/screenshotcropperwindow.ui b/src/tools/screenshotcropper/screenshotcropperwindow.ui new file mode 100644 index 0000000000..9d50284c63 --- /dev/null +++ b/src/tools/screenshotcropper/screenshotcropperwindow.ui @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ScreenShotCropperWindow</class> + <widget class="QMainWindow" name="ScreenShotCropperWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>680</width> + <height>488</height> + </rect> + </property> + <property name="windowTitle"> + <string>ScreenShotCropperWindow</string> + </property> + <widget class="QWidget" name="centralWidget"> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QListWidget" name="m_filenamesList"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QScrollArea" name="scrollArea"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>398</width> + <height>435</height> + </rect> + </property> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="CropImageView" name="m_cropImageView" native="true"/> + </item> + </layout> + </widget> + </widget> + </widget> + </item> + <item row="1" column="0"> + <widget class="QDialogButtonBox" name="m_buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Close|QDialogButtonBox::Save</set> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + <layoutdefault spacing="6" margin="11"/> + <customwidgets> + <customwidget> + <class>CropImageView</class> + <extends>QWidget</extends> + <header>cropimageview.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> |
