on xenial help sign in
Rotate the screenshots according to the actual orientation
f79facfLukáš Tinkl
plugins/ScreenGrabber/screengrabber.cpp+2−2
@@ -60,7 +60,7 @@ ScreenGrabber::ScreenGrabber(QObject *parent)
60 }
60 }
61}
61}
62
62
63−void ScreenGrabber::captureAndSave()
63+void ScreenGrabber::captureAndSave(int angle)
64{
64{
65 if (fileNamePrefix.isEmpty())
65 if (fileNamePrefix.isEmpty())
66 {
66 {
@@ -82,7 +82,7 @@ void ScreenGrabber::captureAndSave()
82 return;
82 return;
83 }
83 }
84
84
85− const QImage screenshot = main_window->grabWindow();
85+ const QImage screenshot = main_window->grabWindow().transformed(QTransform().rotate(angle));
86 const QString filename = makeFileName();
86 const QString filename = makeFileName();
87 qDebug() << "Saving screenshot to" << filename;
87 qDebug() << "Saving screenshot to" << filename;
88 auto saveOp = QtConcurrent::run(saveScreenshot, screenshot, filename, getFormat(), screenshotQuality);
88 auto saveOp = QtConcurrent::run(saveScreenshot, screenshot, filename, getFormat(), screenshotQuality);
plugins/ScreenGrabber/screengrabber.h+1−1
@@ -29,7 +29,7 @@ public:
29 ~ScreenGrabber() = default;
29 ~ScreenGrabber() = default;
30
30
31public Q_SLOTS:
31public Q_SLOTS:
32− void captureAndSave();
32+ void captureAndSave(int angle = 0);
33
33
34Q_SIGNALS:
34Q_SIGNALS:
35 void screenshotSaved(const QString &filename);
35 void screenshotSaved(const QString &filename);
qml/Components/ScreenGrabber.qml+4−1
@@ -26,6 +26,9 @@ Rectangle {
26 anchors.fill: parent
26 anchors.fill: parent
27 opacity: 0.0
27 opacity: 0.0
28
28
29+ // to be set from outside
30+ property int rotationAngle: 0
31+
29 ScreenGrabber {
32 ScreenGrabber {
30 id: screenGrabber
33 id: screenGrabber
31 objectName: "screenGrabber"
34 objectName: "screenGrabber"
@@ -67,7 +70,7 @@ Rectangle {
67 to: 0.0
70 to: 0.0
68 onStopped: {
71 onStopped: {
69 if (visible) {
72 if (visible) {
70− screenGrabber.captureAndSave();
73+ screenGrabber.captureAndSave(root.rotationAngle);
71 visible = false;
74 visible = false;
72 }
75 }
73 }
76 }
qml/Shell.qml+1−1
@@ -659,6 +659,7 @@ Item {
659
659
660 ScreenGrabber {
660 ScreenGrabber {
661 id: screenGrabber
661 id: screenGrabber
662+ rotationAngle: -shell.orientationAngle
662 z: dialogs.z + 10
663 z: dialogs.z + 10
663 }
664 }
664
665
@@ -687,5 +688,4 @@ Item {
687 }
688 }
688 }
689 }
689 }
690 }
690−
691}
691}
tests/plugins/ScreenGrabber/ScreenGrabberTest.cpp+11
@@ -55,6 +55,17 @@ private Q_SLOTS:
55 QVERIFY(!args.first().toString().isEmpty());
55 QVERIFY(!args.first().toString().isEmpty());
56 }
56 }
57
57
58+ void testRotatedScreenshot()
59+ {
60+ QSignalSpy grabberSpy(m_grabber, &ScreenGrabber::screenshotSaved);
61+ m_grabber->captureAndSave(90); // rotate by 90°
62+ const QVariantList args = grabberSpy.takeFirst();
63+ const QString filename = args.first().toString();
64+ QVERIFY(!filename.isEmpty());
65+ QImage img(filename);
66+ QVERIFY(img.height() > img.width()); // verify that the image got rotated by 90° (height > width)
67+ }
68+
58private:
69private:
59 QQuickView *m_view;
70 QQuickView *m_view;
60 ScreenGrabber *m_grabber = nullptr;
71 ScreenGrabber *m_grabber = nullptr;
tests/plugins/ScreenGrabber/grabber.qml+1−1
@@ -20,7 +20,7 @@ import ScreenGrabber 0.1
20Rectangle {
20Rectangle {
21 property var grabber: screenGrabber
21 property var grabber: screenGrabber
22
22
23− width: 100
23+ width: 101 // width intentionally bigger than height to test rotation
24 height: 100
24 height: 100
25 color: "green"
25 color: "green"
26
26