From af1b895fe2105318e6a4aa84ae2feedc8cb5f3fa Mon Sep 17 00:00:00 2001 From: borgmanJeremy <46930769+borgmanJeremy@users.noreply.github.com> Date: Sat, 29 Jan 2022 12:06:34 -0600 Subject: [PATCH] Rewrote launcher to use a qt designer file. Removed some code related to (#2338) dragging the launcher corner as it didnt seem to do anything. Cleaned up clang format suggestions. --- src/widgets/CMakeLists.txt | 1 + src/widgets/capturelauncher.cpp | 133 ++++++++++---------------------- src/widgets/capturelauncher.h | 32 +++----- src/widgets/capturelauncher.ui | 113 +++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 113 deletions(-) create mode 100644 src/widgets/capturelauncher.ui diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt index 65ab8a38..f866dc21 100644 --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -6,6 +6,7 @@ target_sources( flameshot PRIVATE infowindow.ui + capturelauncher.ui capturelauncher.h draggablewidgetmaker.h diff --git a/src/widgets/capturelauncher.cpp b/src/widgets/capturelauncher.cpp index 3a90856a..311c40de 100644 --- a/src/widgets/capturelauncher.cpp +++ b/src/widgets/capturelauncher.cpp @@ -2,141 +2,83 @@ // SPDX-FileCopyrightText: 2017-2018 Alejandro Sirgo Rica & Contributors #include "capturelauncher.h" +#include "./ui_capturelauncher.h" #include "src/core/controller.h" #include "src/utils/globalvalues.h" #include "src/utils/screengrabber.h" #include "src/utils/screenshotsaver.h" #include "src/widgets/imagelabel.h" -#include -#include -#include -#include -#include #include -#include -#include // https://github.com/KDE/spectacle/blob/941c1a517be82bed25d1254ebd735c29b0d2951c/src/Gui/KSWidget.cpp // https://github.com/KDE/spectacle/blob/941c1a517be82bed25d1254ebd735c29b0d2951c/src/Gui/KSMainWindow.cpp CaptureLauncher::CaptureLauncher(QDialog* parent) : QDialog(parent) + , ui(new Ui::CaptureLauncher) { qApp->installEventFilter(this); // see eventFilter() + ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose); setWindowIcon(QIcon(GlobalValues::iconPath())); - m_imageLabel = new ImageLabel(this); bool ok; - m_imageLabel->setScreenshot(ScreenGrabber().grabEntireDesktop(ok)); - if (!ok) { - } - m_imageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - connect(m_imageLabel, - &ImageLabel::dragInitiated, - this, - &CaptureLauncher::startDrag); - QGridLayout* layout = new QGridLayout(this); - layout->addWidget(m_imageLabel, 0, 0); + ui->imagePreview->setScreenshot(ScreenGrabber().grabEntireDesktop(ok)); + ui->imagePreview->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); - m_CaptureModeLabel = new QLabel(tr("Capture Mode")); - - m_captureType = new QComboBox(); - m_captureType->setMinimumWidth(240); - // TODO remember number - m_captureType->insertItem( + ui->captureType->insertItem( 1, tr("Rectangular Region"), CaptureRequest::GRAPHICAL_MODE); #if defined(Q_OS_MACOS) // Following to MacOS philosophy (one application cannot be displayed on // more than one display) - m_captureType->insertItem( + ui->captureType->insertItem( 2, tr("Full Screen (Current Display)"), CaptureRequest::FULLSCREEN_MODE); #else - m_captureType->insertItem( + ui->captureType->insertItem( 2, tr("Full Screen (All Monitors)"), CaptureRequest::FULLSCREEN_MODE); #endif - // m_captureType->insertItem(3, tr("Single Screen"), - // CaptureRequest::SCREEN_MODE); - m_delaySpinBox = new QSpinBox(); - m_delaySpinBox->setSingleStep(1.0); - m_delaySpinBox->setMinimum(0.0); - m_delaySpinBox->setMaximum(999.0); - m_delaySpinBox->setSpecialValueText(tr("No Delay")); - m_delaySpinBox->setMinimumWidth(160); - // with QT 5.7 qOverload(&QSpinBox::valueChanged), - connect(m_delaySpinBox, + ui->delayTime->setSpecialValueText(tr("No Delay")); + ui->launchButton->setFocus(); + + // Function to add or remove plural to seconds + connect(ui->delayTime, static_cast(&QSpinBox::valueChanged), this, [this](int val) { - QString sufix = val == 1 ? tr(" second") : tr(" seconds"); - this->m_delaySpinBox->setSuffix(sufix); + QString suffix = val == 1 ? tr(" second") : tr(" seconds"); + this->ui->delayTime->setSuffix(suffix); }); - m_launchButton = new QPushButton(tr("Take new screenshot")); - m_launchButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - connect(m_launchButton, + connect(ui->launchButton, &QPushButton::clicked, this, &CaptureLauncher::startCapture); - m_launchButton->setFocus(); - QFormLayout* captureModeForm = new QFormLayout; - captureModeForm->addRow(tr("Area:"), m_captureType); - captureModeForm->addRow(tr("Delay:"), m_delaySpinBox); - captureModeForm->setContentsMargins(24, 0, 0, 0); - - m_mainLayout = new QVBoxLayout(); - m_mainLayout->addStretch(1); - m_mainLayout->addWidget(m_CaptureModeLabel); - m_mainLayout->addLayout(captureModeForm); - m_mainLayout->addStretch(10); - m_mainLayout->addWidget(m_launchButton, 1, Qt::AlignCenter); - m_mainLayout->setContentsMargins(10, 0, 0, 10); - layout->addLayout(m_mainLayout, 0, 1); - layout->setColumnMinimumWidth(0, 320); - layout->setColumnMinimumWidth(1, 320); + show(); } // HACK: // https://github.com/KDE/spectacle/blob/fa1e780b8bf3df3ac36c410b9ece4ace041f401b/src/Gui/KSMainWindow.cpp#L70 void CaptureLauncher::startCapture() { - m_launchButton->setEnabled(false); + ui->launchButton->setEnabled(false); hide(); + + auto const additionalDelayToHideUI = 600; + auto const secondsToMilliseconds = 1000; auto mode = static_cast( - m_captureType->currentData().toInt()); - CaptureRequest req(mode, 600 + m_delaySpinBox->value() * 1000); + ui->captureType->currentData().toInt()); + CaptureRequest req(mode, + additionalDelayToHideUI + + ui->delayTime->value() * secondsToMilliseconds); connectCaptureSlots(); Controller::getInstance()->requestCapture(req); } -void CaptureLauncher::startDrag() -{ - QDrag* dragHandler = new QDrag(this); - QMimeData* mimeData = new QMimeData; -#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) - mimeData->setImageData(m_imageLabel->pixmap(Qt::ReturnByValue)); -#else - mimeData->setImageData(m_imageLabel->pixmap()); -#endif - dragHandler->setMimeData(mimeData); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) - dragHandler->setPixmap( - m_imageLabel->pixmap(Qt::ReturnByValue) - .scaled( - 256, 256, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); - dragHandler->exec(); -#else - dragHandler->setPixmap(m_imageLabel->pixmap()->scaled( - 256, 256, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); - dragHandler->exec(); -#endif -} - -void CaptureLauncher::connectCaptureSlots() +void CaptureLauncher::connectCaptureSlots() const { connect(Controller::getInstance(), &Controller::captureTaken, @@ -148,12 +90,12 @@ void CaptureLauncher::connectCaptureSlots() &CaptureLauncher::captureFailed); } -void CaptureLauncher::disconnectCaptureSlots() +void CaptureLauncher::disconnectCaptureSlots() const { // Hack for MacOS // for some strange reasons MacOS sends multiple "captureTaken" signals // (random number, usually from 1 up to 20). - // So no it enables signal on "Capture new screenshot" button and disables + // So now it enables signal on "Capture new screenshot" button and disables // on first success of fail. disconnect(Controller::getInstance(), &Controller::captureTaken, @@ -165,21 +107,21 @@ void CaptureLauncher::disconnectCaptureSlots() &CaptureLauncher::captureFailed); } -void CaptureLauncher::captureTaken(QPixmap p, const QRect&) +void CaptureLauncher::captureTaken(QPixmap screenshot) { // MacOS specific, more details in the function disconnectCaptureSlots() disconnectCaptureSlots(); - m_imageLabel->setScreenshot(p); + ui->imagePreview->setScreenshot(screenshot); show(); auto mode = static_cast( - m_captureType->currentData().toInt()); + ui->captureType->currentData().toInt()); if (mode == CaptureRequest::FULLSCREEN_MODE) { - ScreenshotSaver().saveToFilesystemGUI(p); + ScreenshotSaver().saveToFilesystemGUI(screenshot); } - m_launchButton->setEnabled(true); + ui->launchButton->setEnabled(true); } void CaptureLauncher::captureFailed() @@ -187,5 +129,10 @@ void CaptureLauncher::captureFailed() // MacOS specific, more details in the function disconnectCaptureSlots() disconnectCaptureSlots(); show(); - m_launchButton->setEnabled(true); + ui->launchButton->setEnabled(true); } + +CaptureLauncher::~CaptureLauncher() +{ + delete ui; +} \ No newline at end of file diff --git a/src/widgets/capturelauncher.h b/src/widgets/capturelauncher.h index a1340678..315eef7a 100644 --- a/src/widgets/capturelauncher.h +++ b/src/widgets/capturelauncher.h @@ -5,35 +5,27 @@ #include -class QCheckBox; -class QPushButton; -class QVBoxLayout; -class QComboBox; -class QSpinBox; -class QLabel; -class ImageLabel; +QT_BEGIN_NAMESPACE +namespace Ui { +class CaptureLauncher; +} +QT_END_NAMESPACE class CaptureLauncher : public QDialog { Q_OBJECT + public: explicit CaptureLauncher(QDialog* parent = nullptr); + ~CaptureLauncher(); private: - void connectCaptureSlots(); - void disconnectCaptureSlots(); + Ui::CaptureLauncher* ui; + void connectCaptureSlots() const; + void disconnectCaptureSlots() const; private slots: void startCapture(); - void startDrag(); - void captureTaken(QPixmap p, const QRect& selection); + void captureTaken(QPixmap p); void captureFailed(); - -private: - QSpinBox* m_delaySpinBox; - QComboBox* m_captureType; - QVBoxLayout* m_mainLayout; - QPushButton* m_launchButton; - QLabel* m_CaptureModeLabel; - ImageLabel* m_imageLabel; -}; +}; \ No newline at end of file diff --git a/src/widgets/capturelauncher.ui b/src/widgets/capturelauncher.ui new file mode 100644 index 00000000..d228a6f7 --- /dev/null +++ b/src/widgets/capturelauncher.ui @@ -0,0 +1,113 @@ + + + CaptureLauncher + + + + 0 + 0 + 619 + 148 + + + + Capture Launcher + + + + + + + + TextLabel + + + + + + + + + + + + 75 + true + + + + Capture Mode + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + -1 + + + + + + + + + Area: + + + + + + + Delay: + + + + + + + + + + + + + + seconds + + + 0 + + + 999 + + + + + + + + + + 0 + 0 + + + + Take new screenshot + + + + + + + + + + ImageLabel + QLabel +
imagelabel.h
+
+
+ + +