Skip to content

Commit

Permalink
Hide Actiona when a screenshot is taken
Browse files Browse the repository at this point in the history
  • Loading branch information
Jmgr committed Jul 16, 2024
1 parent dceb4b9 commit 99b44c3
Show file tree
Hide file tree
Showing 4 changed files with 194 additions and 39 deletions.
27 changes: 26 additions & 1 deletion actiontools/include/actiontools/screenshooter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#include <QList>
#include <QPixmap>
#include <QObject>

#include <utility>

Expand All @@ -32,7 +33,7 @@ namespace ActionTools
class WindowHandle;

class ACTIONTOOLSSHARED_EXPORT ScreenShooter
{
{
public:
static QPixmap captureScreen(int screenIndex);
static QList<std::pair<QPixmap, QRect>> captureScreens();
Expand All @@ -43,5 +44,29 @@ namespace ActionTools

ScreenShooter() = delete;
};

class ACTIONTOOLSSHARED_EXPORT AsyncScreenShooter : public QObject
{
Q_OBJECT

const int CAPTURE_DELAY = 200;

public:
AsyncScreenShooter(QObject *parent = nullptr);

static QList<QWindow*> hideTopLevelWindows();
static void showTopLevelWindows(const QList<QWindow*> &windows);

void captureScreen(int screenIndex);
void captureScreens();
void captureWindows(const QList<WindowHandle> &windows);
void captureWindow(WindowHandle window);
void captureAllScreens();
void captureRect(const QRect &rect);

signals:
void finishedSingle(const QPixmap &result);
void finishedMultiple(const QList<std::pair<QPixmap, QRect>> &result);
};
}

3 changes: 0 additions & 3 deletions actiontools/include/actiontools/screenshotwizardpage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ namespace Ui
namespace ActionTools
{
class WindowHandle;
class TargetWindow;

class ACTIONTOOLSSHARED_EXPORT ScreenshotWizardPage : public QWizardPage
{
Expand All @@ -50,14 +49,12 @@ namespace ActionTools
void on_captureWholeScreenPushButton_clicked();
void on_captureScreenPartPushButton_clicked();
void onWindowSearchEnded(const ActionTools::WindowHandle &handle);
void onRectangleSelected(QRect rect);

private:
void setCapturePixmap(const QPixmap &capturePixmap);
QPixmap capturePixmap() const;

Ui::ScreenshotWizardPage *ui;
ActionTools::TargetWindow *mTargetWindow{nullptr};
bool mDisableEscape{false};
};
}
Expand Down
117 changes: 116 additions & 1 deletion actiontools/src/screenshooter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#include <QImage>
#include <QPainter>
#include <QScreen>
#include <QWindow>
#include <QTimer>

#include <limits>

Expand All @@ -44,7 +46,7 @@ namespace ActionTools

QList<std::pair<QPixmap, QRect>> ScreenShooter::captureScreens()
{
auto screens = QGuiApplication::screens();
auto screens = QGuiApplication::screens();
QList<std::pair<QPixmap, QRect>> result;

for(int screenIndex = 0; screenIndex < screens.size(); ++screenIndex)
Expand Down Expand Up @@ -143,4 +145,117 @@ namespace ActionTools

return screen->grabWindow(0, localX, localY, rect.width(), rect.height());
}

AsyncScreenShooter::AsyncScreenShooter(QObject *parent): QObject(parent)
{
}

QList<QWindow*> AsyncScreenShooter::hideTopLevelWindows()
{
QList<QWindow*> shownWindows;

for(auto window: QGuiApplication::topLevelWindows())
{
if(!window->isVisible())
continue;

shownWindows.append(window);
}

for(auto window: shownWindows)
{
window->hide();
window->setOpacity(0);
}

return shownWindows;
}

void AsyncScreenShooter::showTopLevelWindows(const QList<QWindow*> &windows)
{
for(auto window: windows)
{
window->show();
window->setOpacity(1);
window->requestActivate();
}
}

void AsyncScreenShooter::captureScreen(int screenIndex)
{
auto shownWindows = hideTopLevelWindows();

QTimer::singleShot(CAPTURE_DELAY, this, [this, screenIndex, shownWindows](){
auto result = ScreenShooter::captureScreen(screenIndex);

showTopLevelWindows(shownWindows);

emit finishedSingle(result);
});
}

void AsyncScreenShooter::captureScreens()
{
auto shownWindows = hideTopLevelWindows();

QTimer::singleShot(CAPTURE_DELAY, this, [this, shownWindows](){
auto result = ScreenShooter::captureScreens();

showTopLevelWindows(shownWindows);

emit finishedMultiple(result);
});
}

void AsyncScreenShooter::captureWindows(const QList<WindowHandle> &windows)
{
auto shownWindows = hideTopLevelWindows();

QTimer::singleShot(CAPTURE_DELAY, this, [this, windows, shownWindows](){
auto result = ScreenShooter::captureWindows(windows);

showTopLevelWindows(shownWindows);

emit finishedMultiple(result);
});
}

void AsyncScreenShooter::captureWindow(WindowHandle window)
{
auto shownWindows = hideTopLevelWindows();

QTimer::singleShot(CAPTURE_DELAY, this, [this, window, shownWindows](){
auto result = ScreenShooter::captureWindow(window);

showTopLevelWindows(shownWindows);

emit finishedSingle(result);
});
}

void AsyncScreenShooter::captureAllScreens()
{
auto shownWindows = hideTopLevelWindows();

QTimer::singleShot(CAPTURE_DELAY, this, [this, shownWindows](){
auto result = ScreenShooter::captureAllScreens();

showTopLevelWindows(shownWindows);

emit finishedSingle(result);
});
}

void AsyncScreenShooter::captureRect(const QRect &rect)
{
auto shownWindows = hideTopLevelWindows();

QTimer::singleShot(CAPTURE_DELAY, this, [this, rect, shownWindows](){
auto result = ScreenShooter::captureRect(rect);

showTopLevelWindows(shownWindows);

emit finishedSingle(result);
});
}
}
86 changes: 52 additions & 34 deletions actiontools/src/screenshotwizardpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ namespace ActionTools
ScreenshotWizardPage::ScreenshotWizardPage(QWidget *parent)
: QWizardPage(parent),
ui(new Ui::ScreenshotWizardPage)

{
ui->setupUi(this);

Expand All @@ -47,7 +47,6 @@ namespace ActionTools

ScreenshotWizardPage::~ScreenshotWizardPage()
{
delete mTargetWindow;
delete ui;
}

Expand All @@ -67,54 +66,73 @@ namespace ActionTools
void ScreenshotWizardPage::on_captureWholeScreenPushButton_clicked()
{
if(ui->screenComboBox->currentIndex() == 0)//All screens
setCapturePixmap(ActionTools::ScreenShooter::captureAllScreens());
{
auto screenShooter = new ActionTools::AsyncScreenShooter(this);
connect(screenShooter, &ActionTools::AsyncScreenShooter::finishedSingle, this, [this](const QPixmap &result){
setCapturePixmap(result);
ui->captureImageLabel->setPixmap(result);
ui->captureImageLabel->updateGeometry();
emit completeChanged();
sender()->deleteLater();
});
screenShooter->captureAllScreens();
}
else
{
int screenIndex = ui->screenComboBox->currentIndex() - 1;

setCapturePixmap(ActionTools::ScreenShooter::captureScreen(screenIndex));
auto screenShooter = new ActionTools::AsyncScreenShooter(this);
connect(screenShooter, &ActionTools::AsyncScreenShooter::finishedSingle, this, [this](const QPixmap &result){
setCapturePixmap(result);
ui->captureImageLabel->setPixmap(result);
ui->captureImageLabel->updateGeometry();
emit completeChanged();
sender()->deleteLater();
});
screenShooter->captureScreen(screenIndex);
}

ui->captureImageLabel->setPixmap(capturePixmap());

emit completeChanged();
}

void ScreenshotWizardPage::on_captureScreenPartPushButton_clicked()
{
mDisableEscape = true;
if(mTargetWindow)
delete mTargetWindow;
mTargetWindow = new ActionTools::TargetWindow;
connect(mTargetWindow, &ActionTools::TargetWindow::rectangleSelected, this, &ScreenshotWizardPage::onRectangleSelected);
mTargetWindow->show();

emit completeChanged();
auto shownWindows = ActionTools::AsyncScreenShooter::hideTopLevelWindows();
auto targetWindow = new ActionTools::TargetWindow;

connect(targetWindow, &ActionTools::TargetWindow::rectangleSelected, this, [this, shownWindows](const QRect &rect){
ActionTools::AsyncScreenShooter::showTopLevelWindows(shownWindows);

if(rect != QRect())
{
auto screenShooter = new ActionTools::AsyncScreenShooter(this);
connect(screenShooter, &ActionTools::AsyncScreenShooter::finishedSingle, this, [this](const QPixmap &result){
setCapturePixmap(result);
ui->captureImageLabel->setPixmap(result);
ui->captureImageLabel->updateGeometry();
emit completeChanged();
sender()->deleteLater();
});
screenShooter->captureRect(rect);
}

sender()->deleteLater();
});

targetWindow->show();
}

void ScreenshotWizardPage::onWindowSearchEnded(const ActionTools::WindowHandle &handle)
{
setCapturePixmap(ActionTools::ScreenShooter::captureWindow(handle));

ui->captureImageLabel->setPixmap(capturePixmap());

emit completeChanged();
}

void ScreenshotWizardPage::onRectangleSelected(QRect rect)
{
mDisableEscape = false;
mTargetWindow->deleteLater();
mTargetWindow = nullptr;

if(rect != QRect())
{
setCapturePixmap(ActionTools::ScreenShooter::captureRect(rect));

ui->captureImageLabel->setPixmap(capturePixmap());

auto screenShooter = new ActionTools::AsyncScreenShooter(this);
connect(screenShooter, &ActionTools::AsyncScreenShooter::finishedSingle, this, [this](const QPixmap &result){
setCapturePixmap(result);
ui->captureImageLabel->setPixmap(result);
ui->captureImageLabel->updateGeometry();
emit completeChanged();
}
sender()->deleteLater();
});
screenShooter->captureWindow(handle);
}

void ScreenshotWizardPage::setCapturePixmap(const QPixmap &capturePixmap)
Expand Down

0 comments on commit 99b44c3

Please sign in to comment.