Skip to content

Commit

Permalink
Add initial support for last rect area #150
Browse files Browse the repository at this point in the history
  • Loading branch information
DamirPorobic committed Sep 25, 2019
1 parent 8a61d15 commit 8378d18
Show file tree
Hide file tree
Showing 14 changed files with 80 additions and 14 deletions.
13 changes: 13 additions & 0 deletions src/backend/config/KsnipConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,19 @@ void KsnipConfig::setSnippingCursorColor(const QColor& color)
saveValue(KsnipConfigOptions::snippingCursorColorString(), color);
}

QRect KsnipConfig::lastRectArea() const
{
return loadValue(KsnipConfigOptions::lastRectAreaString(), QRect()).value<QRect>();
}

void KsnipConfig::setLastRectArea(const QRect &rectArea)
{
if (lastRectArea() == rectArea) {
return;
}
saveValue(KsnipConfigOptions::lastRectAreaString(), rectArea);
}

// Imgur Uploader

QString KsnipConfig::imgurUsername() const
Expand Down
3 changes: 3 additions & 0 deletions src/backend/config/KsnipConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ class KsnipConfig : public QObject
QColor snippingCursorColor() const;
void setSnippingCursorColor(const QColor &color);

QRect lastRectArea() const;
void setLastRectArea(const QRect &rectArea);

// Imgur Uploader

QString imgurUsername() const;
Expand Down
5 changes: 5 additions & 0 deletions src/backend/config/KsnipConfigOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ QString KsnipConfigOptions::snippingCursorColorString()
return imageGrabberSectionString() + QStringLiteral("SnippingCursorColor");
}

QString KsnipConfigOptions::lastRectAreaString()
{
return imageGrabberSectionString() + QStringLiteral("LastRectArea");
}

QString KsnipConfigOptions::imgurUsernameString()
{
return imgurSectionString() + QStringLiteral("Username");
Expand Down
1 change: 1 addition & 0 deletions src/backend/config/KsnipConfigOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class KsnipConfigOptions
static QString captureDelayString();
static QString snippingCursorSizeString();
static QString snippingCursorColorString();
static QString lastRectAreaString();
static QString imgurUsernameString();
static QString imgurClientIdString();
static QString imgurClientSecretString();
Expand Down
41 changes: 30 additions & 11 deletions src/backend/imageGrabber/AbstractImageGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
AbstractImageGrabber::AbstractImageGrabber(AbstractSnippingArea *snippingArea) : mSnippingArea(snippingArea)
{
Q_ASSERT(snippingArea != nullptr);
mConfig = KsnipConfig::instance();
connectSnippingAreaCancel();
}

Expand Down Expand Up @@ -69,6 +70,16 @@ QRect AbstractImageGrabber::currentScreenRect() const
return QApplication::desktop()->screenGeometry(screen);
}

QRect AbstractImageGrabber::lastRectArea() const
{
auto rectArea = mConfig->lastRectArea();
if(rectArea.isNull()) {
qWarning("ImageGrabber: No RectArea found, capturing full screen.");
return fullScreenRect();
}
return rectArea;
}

void AbstractImageGrabber::addSupportedCaptureMode(CaptureModes captureMode)
{
mSupportedCaptureModes.append(captureMode);
Expand Down Expand Up @@ -115,18 +126,26 @@ QPixmap AbstractImageGrabber::getScreenshot() const

void AbstractImageGrabber::setCaptureRectFromCorrectSource()
{
if (mCaptureMode == CaptureModes::RectArea) {
mCaptureRect = selectedSnippingAreaRect();
} else if (mCaptureMode == CaptureModes::FullScreen) {
mCaptureRect = fullScreenRect();
} else if (mCaptureMode == CaptureModes::CurrentScreen) {
mCaptureRect = currentScreenRect();
} else if (mCaptureMode == CaptureModes::ActiveWindow) {
mCaptureRect = activeWindowRect();
if (mCaptureRect.isNull()) {
qWarning("ImageGrabber::getActiveWindow: Found no window with focus.");
switch (mCaptureMode) {
case CaptureModes::RectArea:
mCaptureRect = selectedSnippingAreaRect();
break;
case CaptureModes::LastRectArea:
mCaptureRect = lastRectArea();
break;
case CaptureModes::FullScreen:
mCaptureRect = fullScreenRect();
break;
case CaptureModes::CurrentScreen:
mCaptureRect = currentScreenRect();
}
break;
case CaptureModes::ActiveWindow:
mCaptureRect = activeWindowRect();
if (mCaptureRect.isNull()) {
qWarning("ImageGrabber::getActiveWindow: Found no window with focus.");
mCaptureRect = currentScreenRect();
}
break;
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/backend/imageGrabber/AbstractImageGrabber.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
#include "CaptureDto.h"
#include "src/common/enum/CaptureModes.h"
#include "src/common/handler/DelayHandler.h"
#include "gui/snippingArea/AbstractSnippingArea.h"
#include "src/gui/snippingArea/AbstractSnippingArea.h"
#include "src/backend/config/KsnipConfig.h"

class AbstractImageGrabber : public QObject
{
Expand All @@ -42,6 +43,7 @@ class AbstractImageGrabber : public QObject
virtual QRect currentScreenRect() const;
virtual QRect fullScreenRect() const = 0;
virtual QRect activeWindowRect() const = 0;
virtual QRect lastRectArea() const;

signals:
void finished(const CaptureDto &capture) const;
Expand Down Expand Up @@ -74,6 +76,7 @@ protected slots:
AbstractSnippingArea *mSnippingArea;
bool mFreezeImageWhileSnipping;
QList<CaptureModes> mSupportedCaptureModes;
KsnipConfig *mConfig;

void openSnippingArea();
void connectSnippingAreaCancel();
Expand Down
1 change: 1 addition & 0 deletions src/backend/imageGrabber/GnomeWaylandImageGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
GnomeWaylandImageGrabber::GnomeWaylandImageGrabber() : AbstractImageGrabber(new LinuxSnippingArea)
{
addSupportedCaptureMode(CaptureModes::RectArea);
addSupportedCaptureMode(CaptureModes::LastRectArea);
addSupportedCaptureMode(CaptureModes::ActiveWindow);
addSupportedCaptureMode(CaptureModes::FullScreen);
addSupportedCaptureMode(CaptureModes::CurrentScreen);
Expand Down
1 change: 1 addition & 0 deletions src/backend/imageGrabber/MacImageGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ MacImageGrabber::MacImageGrabber() : AbstractImageGrabber(new MacSnippingArea),
mMacWrapper(new MacWrapper)
{
addSupportedCaptureMode(CaptureModes::RectArea);
addSupportedCaptureMode(CaptureModes::LastRectArea);
addSupportedCaptureMode(CaptureModes::FullScreen);
addSupportedCaptureMode(CaptureModes::CurrentScreen);
}
Expand Down
1 change: 1 addition & 0 deletions src/backend/imageGrabber/WinImageGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ WinImageGrabber::WinImageGrabber() : AbstractImageGrabber(new WinSnippingArea),
mWinWrapper(new WinWrapper)
{
addSupportedCaptureMode(CaptureModes::RectArea);
addSupportedCaptureMode(CaptureModes::LastRectArea);
addSupportedCaptureMode(CaptureModes::FullScreen);
addSupportedCaptureMode(CaptureModes::ActiveWindow);
addSupportedCaptureMode(CaptureModes::CurrentScreen);
Expand Down
1 change: 1 addition & 0 deletions src/backend/imageGrabber/X11ImageGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
X11ImageGrabber::X11ImageGrabber() : AbstractImageGrabber(new LinuxSnippingArea), mX11Wrapper(new X11Wrapper)
{
addSupportedCaptureMode(CaptureModes::RectArea);
addSupportedCaptureMode(CaptureModes::LastRectArea);
addSupportedCaptureMode(CaptureModes::FullScreen);
addSupportedCaptureMode(CaptureModes::CurrentScreen);
addSupportedCaptureMode(CaptureModes::ActiveWindow);
Expand Down
1 change: 1 addition & 0 deletions src/common/enum/CaptureModes.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
enum class CaptureModes
{
RectArea,
LastRectArea,
FullScreen,
CurrentScreen,
ActiveWindow,
Expand Down
10 changes: 8 additions & 2 deletions src/gui/snippingArea/AbstractSnippingArea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,7 @@ void AbstractSnippingArea::mouseReleaseEvent(QMouseEvent *event)
}

setMouseIsDown(false);
emit finished();
closeSnippingArea();
finishSelection();
}

QPixmap AbstractSnippingArea::background() const
Expand Down Expand Up @@ -191,3 +190,10 @@ void AbstractSnippingArea::updateAdorner()
auto currentMousePosition = getMousePosition();
mAdorner.update(currentMousePosition, snippingAreaGeometry, mCaptureArea);
}

void AbstractSnippingArea::finishSelection()
{
emit finished();
mConfig->setLastRectArea(selectedRectArea());
closeSnippingArea();
}
1 change: 1 addition & 0 deletions src/gui/snippingArea/AbstractSnippingArea.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class AbstractSnippingArea : public QWidget
virtual void showSnippingArea();
void setMouseIsDown(bool isDown);
void updateAdorner();
void finishSelection();
};

#endif // KSNIP_ABSTRACTSNIPPINGAREA_H
10 changes: 10 additions & 0 deletions src/widgets/CaptureModePicker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,16 @@ void CaptureModePicker::init(const QList<CaptureModes> &captureModes)
menu->addAction(action);
}

if (isCaptureModeSupported(captureModes, CaptureModes::LastRectArea)) {
auto action = createAction(
tr("Last Rectangular Area"),
tr("Capture a screenshot of the last selected rectangular area"),
QStringLiteral("drawRect.svg"),
CaptureModes::LastRectArea,
QKeySequence(Qt::SHIFT + Qt::Key_L));
menu->addAction(action);
}

if (isCaptureModeSupported(captureModes, CaptureModes::FullScreen)) {
auto action = createAction(
tr("Full Screen (All Monitors)"),
Expand Down

0 comments on commit 8378d18

Please sign in to comment.