summaryrefslogtreecommitdiff
path: root/src/tools/screenshotcropper
diff options
context:
space:
mode:
authorAlessandro Portale <alessandro.portale@nokia.com>2011-11-24 15:14:53 +0100
committerAlessandro Portale <alessandro.portale@nokia.com>2011-11-25 17:12:58 +0100
commit6c36a2a9ad5e495d31c2e20e7e76e57a0ede684f (patch)
tree99e1d8ce8543fa6982b37826f8dadb0ed1979cd9 /src/tools/screenshotcropper
parent9e0cae5dac4d388caa948205a8e72cda199a213f (diff)
downloadqt-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.cpp59
-rw-r--r--src/tools/screenshotcropper/cropimageview.h30
-rw-r--r--src/tools/screenshotcropper/main.cpp36
-rw-r--r--src/tools/screenshotcropper/screenshotcropper.pro17
-rw-r--r--src/tools/screenshotcropper/screenshotcropperwindow.cpp53
-rw-r--r--src/tools/screenshotcropper/screenshotcropperwindow.h35
-rw-r--r--src/tools/screenshotcropper/screenshotcropperwindow.ui86
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>