Skip to content

Commit b3e47aa

Browse files
committed
select to import button added. only X11 supported yet
1 parent 8e21fc7 commit b3e47aa

File tree

10 files changed

+194
-2
lines changed

10 files changed

+194
-2
lines changed
Lines changed: 71 additions & 0 deletions
Loading

meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ src = [
1212
'src/widgets/FloatingSettings.cpp',
1313
'src/widgets/WhiteBoard.cpp',
1414
'src/widgets/Background.cpp',
15+
'src/widgets/ScreenshotWidget.cpp',
1516
'src/widgets/Button.cpp',
1617
'src/tools/update.cpp',
1718
'src/tools/icon.cpp',

src/SetupWidgets.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,11 @@ void setupWidgets(){
157157

158158
desktopWidget->num_of_rows = 1;
159159
desktopWidget->addWidget(toolButtons[UNMINIFY]);
160-
160+
#ifdef screenshot
161+
if(!is_wayland && !force_xwayland){ // X11 only feature (yet)
162+
desktopWidget->addWidget(toolButtons[SCREENSHOT_CROP]);
163+
}
164+
#endif
161165
/********** desktop menu done **********/
162166

163167

src/constants.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@
5353
#define CURSOR 74
5454
#define SHAPEMENU 75
5555
#define UNMINIFY 76
56+
#define SCREENSHOT_CROP 77

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
bool is_wayland;
1616
bool is_etap = false;
1717
extern void mainWindowInit();
18+
bool force_xwayland = false;
1819
int history;
1920

2021
static bool detect_etap(){
@@ -52,7 +53,6 @@ int main(int argc, char *argv[]) {
5253
is_wayland = (getenv("WAYLAND_DISPLAY") != NULL);
5354
// gnome wayland fullscreen compositor is buggy.
5455
// Force prefer Xwayland for fix this issue.
55-
bool force_xwayland = false;
5656
if(getenv("XDG_CURRENT_DESKTOP")){
5757
force_xwayland = strncmp(getenv("XDG_CURRENT_DESKTOP"), "gnome", 5) || \
5858
strncmp(getenv("XDG_CURRENT_DESKTOP"), "GNOME", 5);

src/tools.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
#include "widgets/DrawingWidget.h"
3+
#include "widgets/ScreenshotWidget.h"
34
#include "widgets/FloatingWidget.h"
45
#include "widgets/FloatingSettings.h"
56
#include "widgets/WhiteBoard.h"
@@ -65,6 +66,7 @@ extern QWidget *bgMenu;
6566
extern float scale;
6667
extern int history;
6768
extern bool is_wayland;
69+
extern bool force_xwayland;
6870
extern bool is_etap;
6971

7072
extern QSlider *scrollHSlider;

src/tools/icon.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ char* get_icon_by_id(int id){
7474
return (char*)":images/page/close.svg";
7575
case SCREENSHOT:
7676
return (char*)":images/page/screenshot.svg";
77+
case SCREENSHOT_CROP:
78+
return (char*)":images/page/screenshot-crop.svg";
7779
case CURSOR:
7880
return (char*)":images/cursor.svg";
7981
case MINIFY:

src/tools/screenshot.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
#include "../tools.h"
2+
23
#include <QTimer>
34

5+
#ifdef screenshot
6+
7+
static void setCropScreenShot(QPixmap pix){
8+
drawing->setOverlay(pix.toImage(), drawing->getPageNum());
9+
board->setType(WHITE);
10+
board->setOverlayType(CUSTOM);
11+
board->rotates[drawing->getPageNum()] = 0;
12+
board->ratios[drawing->getPageNum()] = pix.width() * 100 / board->geometry().width();
13+
board->updateTransform();
14+
setHideMainWindow(false);
15+
16+
printf("%s\n", "crop done");
17+
}
18+
#endif
19+
420
void setupScreenShot(){
521
#ifdef screenshot
622
QTimer *ssTimer = new QTimer();
@@ -17,5 +33,21 @@ void setupScreenShot(){
1733

1834
});
1935
set_shortcut(toolButtons[SCREENSHOT], Qt::Key_F2, 0);
36+
37+
ScreenshotWidget* widget = new ScreenshotWidget();
38+
widget->crop_signal = setCropScreenShot;
39+
QTimer *sscTimer = new QTimer();
40+
QObject::connect(sscTimer, &QTimer::timeout, [=](){
41+
sscTimer->stop();
42+
widget->showFullScreen();
43+
floatingWidget->show();
44+
45+
});
46+
toolButtons[SCREENSHOT_CROP] = create_button(SCREENSHOT_CROP, [=](){
47+
floatingWidget->hide();
48+
floatingSettings->setHide();
49+
sscTimer->start(500);
50+
});
51+
set_shortcut(toolButtons[SCREENSHOT_CROP], Qt::Key_F2, Qt::ControlModifier);
2052
#endif
2153
}

src/widgets/ScreenshotWidget.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <QApplication>
2+
#include <QScreen>
3+
#include <QPainter>
4+
#include <QDebug>
5+
#include <QRect>
6+
7+
#include "ScreenshotWidget.h"
8+
9+
10+
ScreenshotWidget::ScreenshotWidget(QWidget *parent)
11+
: QWidget(parent), selecting(false) {
12+
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
13+
setCursor(Qt::CrossCursor);
14+
hide();
15+
}
16+
17+
void ScreenshotWidget::mousePressEvent(QMouseEvent *event) {
18+
startPos = event->pos();
19+
}
20+
21+
void ScreenshotWidget::mouseMoveEvent(QMouseEvent *event) {
22+
endPos = event->pos();
23+
update();
24+
}
25+
26+
void ScreenshotWidget::mouseReleaseEvent(QMouseEvent *event) {
27+
endPos = event->pos();
28+
cropScreenshot();
29+
startPos = QPoint(-1, -1);
30+
endPos = QPoint(-1, -1);
31+
update();
32+
}
33+
34+
void ScreenshotWidget::paintEvent(QPaintEvent *) {
35+
QPainter painter(this);
36+
painter.setPen(Qt::blue);
37+
painter.setBrush(QColor(0, 0, 255, 50)); // Semi-transparent blue
38+
QRect rect(startPos, endPos);
39+
painter.drawRect(rect.normalized());
40+
}
41+
42+
void ScreenshotWidget::cropScreenshot() {
43+
QScreen *screen = QGuiApplication::primaryScreen();
44+
QPixmap originalPixmap = screen->grabWindow(0);
45+
46+
QRect cropRect(startPos, endPos);
47+
QPixmap croppedPixmap = originalPixmap.copy(cropRect.normalized());
48+
crop_signal(croppedPixmap);
49+
hide();
50+
}
51+

src/widgets/ScreenshotWidget.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef SCREENSHOTWIDGET_H
2+
#define SCREENSHOTWIDGET_H
3+
4+
#include <QWidget>
5+
#include <QPixmap>
6+
#include <QMouseEvent>
7+
8+
class ScreenshotWidget : public QWidget {
9+
10+
public:
11+
ScreenshotWidget(QWidget *parent = nullptr);
12+
void (*crop_signal)(QPixmap pixmap);
13+
14+
protected:
15+
void mousePressEvent(QMouseEvent *event) override;
16+
void mouseMoveEvent(QMouseEvent *event) override;
17+
void mouseReleaseEvent(QMouseEvent *event) override;
18+
void paintEvent(QPaintEvent *event) override;
19+
20+
private:
21+
void cropScreenshot();
22+
23+
QPoint startPos;
24+
QPoint endPos;
25+
bool selecting;
26+
};
27+
28+
#endif

0 commit comments

Comments
 (0)