aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/ImageEditor.cpp141
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/ImageEditor.h72
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/MainUI.cpp122
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/MainUI.h16
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/MainUI.ui457
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro6
6 files changed, 593 insertions, 221 deletions
diff --git a/src-qt5/desktop-utils/lumina-screenshot/ImageEditor.cpp b/src-qt5/desktop-utils/lumina-screenshot/ImageEditor.cpp
new file mode 100644
index 00000000..82b549c4
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-screenshot/ImageEditor.cpp
@@ -0,0 +1,141 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "ImageEditor.h"
+
+#include <QPainter>
+
+// === PUBLIC ===
+ImageEditor::ImageEditor(QWidget*parent) : QWidget(parent){
+ contextMenu = new QMenu(this);
+ contextMenu->addAction(tr("Zoom In"), this, SLOT(scaleUp()) );
+ contextMenu->addAction(tr("Zoom Out"), this, SLOT(scaleDown()) );
+ this->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu()) );
+}
+
+ImageEditor::~ImageEditor(){
+
+}
+
+void ImageEditor::LoadImage(QImage img){
+ fullIMG = img;
+ scaledIMG = fullIMG.scaled( defaultSize, Qt::KeepAspectRatio,Qt::SmoothTransformation);
+ this->update(); //trigger paint event
+ selRect = QRect();
+ emit selectionChanged(false);
+}
+
+void ImageEditor::setDefaultSize(QSize sz){
+ defaultSize = sz;
+ bool change = false;
+ if(scaledIMG.width() > scaledIMG.height()){
+ change = (sz.width() > scaledIMG.width() && sz.width() < fullIMG.width()); //new viewport is larger than the scaled image
+ }else{
+ change = (sz.height() > scaledIMG.height() && sz.height() < fullIMG.height()); //new viewport is larger than the scaled image
+ }
+ if(change){
+ scaledIMG = fullIMG.scaled( defaultSize, Qt::KeepAspectRatio,Qt::SmoothTransformation);
+ selRect = QRect();
+ emit selectionChanged(false);
+ this->update(); //trigger paint event
+ }
+}
+
+bool ImageEditor::hasSelection(){
+ return !selRect.isNull();
+}
+
+QImage ImageEditor::image(){
+ return fullIMG;
+}
+
+// === PRIVATE SLOTS ===
+void ImageEditor::showMenu(){
+ contextMenu->popup(QCursor::pos());
+}
+
+// === PUBLIC SLOTS ===
+void ImageEditor::scaleUp(int val){
+ qreal sf = getScaleFactor();
+ sf+= ((qreal) val)/100.0;
+ if(sf>2){ sf = 2.0; }
+ rescaleImage(sf);
+}
+
+void ImageEditor::scaleDown(int val){
+ qreal sf = getScaleFactor();
+ sf-= ((qreal) val)/100.0;
+ if(sf<0.1){ sf = 0.1; }
+ rescaleImage(sf);
+}
+
+void ImageEditor::cropImage(){
+ if(selRect.isNull()){ return; }
+ qreal sf = getScaleFactor();
+ QRect srect = QRect( qRound(selRect.x()/sf), qRound(selRect.y()/sf), qRound(selRect.width()/sf), qRound(selRect.height()/sf));
+ fullIMG = fullIMG.copy(srect);
+ scaledIMG = fullIMG.scaled( defaultSize, Qt::KeepAspectRatio,Qt::SmoothTransformation);
+ selRect = QRect();
+ emit selectionChanged(false);
+ this->update(); //trigger paint event
+}
+
+void ImageEditor::resizeImage(){
+ //TO-DO
+ selRect = QRect();
+ emit selectionChanged(false);
+}
+
+// === PROTECTED ===
+void ImageEditor::mousePressEvent(QMouseEvent *ev){
+ selRect = QRect(); //reset it
+ emit selectionChanged(false);
+ selPoint = ev->pos(); //widget-relative coords
+}
+
+void ImageEditor::mouseMoveEvent(QMouseEvent *ev){
+ if( !this->geometry().contains(ev->pos()) ){ selRect = QRect(); }
+ else if(selPoint.x() < ev->pos().x()){
+ if(selPoint.y() < ev->pos().y()){
+ //init point is upper-left corner
+ selRect = QRect(selPoint, ev->pos());
+ }else{
+ //init point is lower-left corner
+ selRect.setBottomLeft(selPoint);
+ selRect.setTopRight(ev->pos());
+ }
+ }else{
+ if(selPoint.y() < ev->pos().y()){
+ //init point is upper-right corner
+ selRect.setBottomLeft(ev->pos());
+ selRect.setTopRight(selPoint);
+ }else{
+ //init point is lower-right corner
+ selRect = QRect(ev->pos(), selPoint);
+ }
+ }
+ this->update();
+}
+
+void ImageEditor::mouseReleaseEvent(QMouseEvent*){
+ emit selectionChanged( !selRect.isNull() );
+ this->update();
+}
+
+void ImageEditor::paintEvent(QPaintEvent*){
+ //ensure the widget is large enough to show the whole scaled image
+ if(this->size()!=scaledIMG.size()){
+ this->setFixedSize(scaledIMG.size());
+ this->update();
+ return;
+ }
+ QPainter P(this);
+ //Draw the image
+ P.drawImage(QPoint(0,0), scaledIMG);
+ //Now draw the selection rectangle over the top
+ if(!selRect.isNull()){ P.fillRect(selRect, QBrush(Qt::CrossPattern)); }
+}
diff --git a/src-qt5/desktop-utils/lumina-screenshot/ImageEditor.h b/src-qt5/desktop-utils/lumina-screenshot/ImageEditor.h
new file mode 100644
index 00000000..58a16e56
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-screenshot/ImageEditor.h
@@ -0,0 +1,72 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is a simple widget for viewing a QImage and allowing the user to
+// highlight/select portions of the image with possible actions on the selection
+//===========================================
+#ifndef _LUMINA_SCREENSHOT_IMAGE_EDITOR_H
+#define _LUMINA_SCREENSHOT_IMAGE_EDITOR_H
+
+#include <QImage>
+#include <QWidget>
+#include <QRect>
+#include <QMouseEvent>
+#include <QPaintEvent>
+#include <QMenu>
+
+class ImageEditor : public QWidget{
+ Q_OBJECT
+public:
+ ImageEditor(QWidget*parent = 0);
+ ~ImageEditor();
+
+ void LoadImage(QImage img);
+ void setDefaultSize(QSize sz);
+ bool hasSelection();
+ QImage image();
+
+private:
+ QImage fullIMG, scaledIMG; //Note: the aspect ratio between the two images must be preserved!!
+ QSize defaultSize; //for loading new images
+ QRect selRect; //selection rectangle (scaledIMG coordinates)
+ QPoint selPoint; //initial selection point (used during click/drags)
+ QMenu *contextMenu;
+
+ //simplification functions
+ qreal getScaleFactor(){
+ //return the scale factor between the full/scaled images
+ return ( ( (qreal) scaledIMG.height()) / ( (qreal) fullIMG.height()) );
+ }
+
+ void rescaleImage(qreal scfactor){
+ if(fullIMG.isNull()){ return; }
+ scaledIMG = fullIMG.scaled( fullIMG.width()*scfactor, fullIMG.height()*scfactor, Qt::KeepAspectRatio,Qt::SmoothTransformation);
+ selRect = QRect();
+ emit selectionChanged(false);
+ this->update(); //trigger a repaint event
+ }
+
+private slots:
+ void showMenu();
+
+public slots:
+ void scaleUp(int val = 10); //10% change by default
+ void scaleDown(int val = 10); //10% change by default
+
+ void cropImage();
+ void resizeImage();
+
+protected:
+ void mousePressEvent(QMouseEvent *ev);
+ void mouseMoveEvent(QMouseEvent *ev);
+ void mouseReleaseEvent(QMouseEvent *);
+ void paintEvent(QPaintEvent*);
+
+signals:
+ void selectionChanged(bool); //true if there is a selection
+
+};
+#endif
diff --git a/src-qt5/desktop-utils/lumina-screenshot/MainUI.cpp b/src-qt5/desktop-utils/lumina-screenshot/MainUI.cpp
index c59b324f..f6b89a03 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/MainUI.cpp
+++ b/src-qt5/desktop-utils/lumina-screenshot/MainUI.cpp
@@ -11,13 +11,13 @@
MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
ui->setupUi(this); //load the designer file
+ mousegrabbed = false;
XCB = new LXCB();
- cpic = QApplication::screens().at(0)->grabWindow(QApplication::desktop()->winId()); //initial screenshot
+ IMG = new ImageEditor(this);
+ ui->scrollArea->setWidget(IMG);
+ ui->tabWidget->setCurrentWidget(ui->tab_view);
ppath = QDir::homePath();
- QWidget *spacer = new QWidget();
- spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- ui->toolBar->insertWidget(ui->actionQuit, spacer);
-
+
setupIcons();
ui->spin_monitor->setMaximum(QApplication::desktop()->screenCount());
if(ui->spin_monitor->maximum()<2){
@@ -26,93 +26,105 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
}
//Setup the connections
- connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(saveScreenshot()) );
- connect(ui->actionquicksave, SIGNAL(triggered()), this, SLOT(quicksave()) );
- connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(closeApplication()) );
- connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(startScreenshot()) );
- connect(ui->actionEdit, SIGNAL(triggered()), this, SLOT(editScreenshot()) );
+ connect(ui->tool_save, SIGNAL(clicked()), this, SLOT(saveScreenshot()) );
+ connect(ui->actionSave_As, SIGNAL(triggered()), this, SLOT(saveScreenshot()) );
+ connect(ui->tool_quicksave, SIGNAL(clicked()), this, SLOT(quicksave()) );
+ connect(ui->actionQuick_Save, SIGNAL(triggered()), this, SLOT(quicksave()) );
+ connect(ui->actionClose, SIGNAL(triggered()), this, SLOT(closeApplication()) );
+ connect(ui->push_snap, SIGNAL(clicked()), this, SLOT(startScreenshot()) );
+ connect(ui->actionTake_Screenshot, SIGNAL(triggered()), this, SLOT(startScreenshot()) );
+ connect(ui->tool_crop, SIGNAL(clicked()), IMG, SLOT(cropImage()) );
+ connect(IMG, SIGNAL(selectionChanged(bool)), this, SLOT(imgselchanged(bool)) );
- QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina");
+ //QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina");
settings = new QSettings("LuminaDE", "lumina-screenshot",this);
-
if(settings->value("screenshot-target", "window").toString() == "window") {
ui->radio_window->setChecked(true);
}else{
ui->radio_all->setChecked(true);
}
-
ui->spin_delay->setValue(settings->value("screenshot-delay", 0).toInt());
+ ui->tool_resize->setVisible(false); //not implemented yet
this->show();
- ui->label_screenshot->setPixmap( cpic.scaled(ui->label_screenshot->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) );
+ IMG->setDefaultSize(ui->scrollArea->maximumViewportSize());
+ IMG->LoadImage( QApplication::screens().at(0)->grabWindow(QApplication::desktop()->winId()).toImage() ); //initial screenshot
+ //ui->label_screenshot->setPixmap( cpic.scaled(ui->label_screenshot->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) );
}
MainUI::~MainUI(){}
void MainUI::setupIcons(){
//Setup the icons
- ui->actionSave->setIcon( LXDG::findIcon("document-save","") );
- ui->actionquicksave->setIcon( LXDG::findIcon("document-save","") );
- ui->actionQuit->setIcon( LXDG::findIcon("application-exit","") );
- ui->actionNew->setIcon( LXDG::findIcon("camera-web","") );
- ui->actionEdit->setIcon( LXDG::findIcon("applications-graphics","") );
+ ui->tabWidget->setTabIcon(0, LXDG::findIcon("camera-web","") );
+ ui->tabWidget->setTabIcon(1, LXDG::findIcon("view-preview","") );
+ ui->tool_save->setIcon( LXDG::findIcon("document-save","") );
+ ui->tool_quicksave->setIcon( LXDG::findIcon("document-edit","") );
+ ui->actionSave_As->setIcon( LXDG::findIcon("document-save-as","") );
+ ui->actionQuick_Save->setIcon( LXDG::findIcon("document-save","") );
+ ui->actionClose->setIcon( LXDG::findIcon("application-exit","") );
+ ui->push_snap->setIcon( LXDG::findIcon("camera-web","") );
+ ui->actionTake_Screenshot->setIcon( LXDG::findIcon("camera-web","") );
+ ui->tool_crop->setIcon( LXDG::findIcon("transform-crop","") );
+ ui->tool_resize->setIcon( LXDG::findIcon("transform-scale.png") );
+ //ui->actionEdit->setIcon( LXDG::findIcon("applications-graphics","") );
}
//==============
// PRIVATE SLOTS
//==============
void MainUI::saveScreenshot(){
+ if(mousegrabbed){ return; }
QString filepath = QFileDialog::getSaveFileName(this, tr("Save Screenshot"), ppath, tr("PNG Files (*.png);;AllFiles (*)") );
if(filepath.isEmpty()){ return; }
if(!filepath.endsWith(".png")){ filepath.append(".png"); }
- cpic.save(filepath, "png");
+ IMG->image().save(filepath, "png");
ppath = filepath;
}
void MainUI::quicksave(){
+ if(mousegrabbed){ return; }
QString savedir = QDir::homePath() + "/Pictures/";
QString path = savedir + QString( "Screenshot-%1.png" ).arg( QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss") );
- cpic.save(path, "png");
-}
-
-void MainUI::editScreenshot(){
- QString tmppath = QString("/tmp/screenshot.png");
- cpic.save(tmppath, "png");
- QProcess::startDetached("lumina-open /tmp/screenshot.png");
+ IMG->image().save(path, "png");
+ QProcess::startDetached("lumina-open \""+path+"\"");
}
void MainUI::startScreenshot(){
+ if(mousegrabbed){ return; }
+ lastgeom = this->geometry();
if( !getWindow() ){ return; }
this->hide();
QTimer::singleShot(50+ui->spin_delay->value()*1000, this, SLOT(getPixmap()));
}
+void MainUI::imgselchanged(bool hassel){
+ ui->tool_crop->setEnabled(hassel);
+ ui->tool_resize->setEnabled(hassel);
+}
+
bool MainUI::getWindow(){
//Use this function to set cwin
cwin = 0;
+ //Save all the current settings for later
+ settings->setValue("screenshot-delay", ui->spin_delay->value());
if(ui->radio_window->isChecked()){
settings->setValue("screenshot-target", "window");
- //Use xprop to get the desired window from the user
- QList<WId> wins = XCB->WindowList();
- wins.removeAll(this->winId()); //don't show this window
- QStringList names;
- for(int i=0; i<wins.length(); i++){
- names << XCB->WindowClass(wins[i])+" ("+XCB->WindowName(wins[i])+")";
- }
- bool ok = false;
- QString info = QInputDialog::getItem(this, tr("Select Window"), tr("Window:"), names, 0, false, &ok);
- if(!ok || names.indexOf(info)<0){ return false; } //cancelled
- cwin = wins[ names.indexOf(info) ];
+ this->grabMouse( QCursor(Qt::CrossCursor) );
+ mousegrabbed = true;
+ this->centralWidget()->setEnabled(false);
+ //this->hide();
+ return false; //wait for the next click to continue
}else if(ui->radio_monitor->isChecked()){
-
+ //will auto-grab the proper monitor later
}else{
settings->setValue("screenshot-target", "desktop");
}
- settings->setValue("screenshot-delay", ui->spin_delay->value());
return true;
}
void MainUI::getPixmap(){
QScreen *scrn = QApplication::screens().at(0);
+ QPixmap cpic;
if( (cwin==0 && ui->radio_window->isChecked() ) || ui->radio_all->isChecked() ){
//Grab the whole screen
cpic = scrn->grabWindow(QApplication::desktop()->winId());
@@ -129,6 +141,34 @@ void MainUI::getPixmap(){
}
}
this->show();
+ this->setGeometry(lastgeom);
+ ui->tabWidget->setCurrentWidget(ui->tab_view); //view it right now
//Now display the pixmap on the label as well
- ui->label_screenshot->setPixmap( cpic.scaled(ui->label_screenshot->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) );
+ IMG->LoadImage( cpic.toImage() );
+}
+
+void MainUI::mouseReleaseEvent(QMouseEvent *ev){
+ if(mousegrabbed){
+ mousegrabbed = false;
+ this->centralWidget()->setEnabled(true);
+ this->releaseMouse();
+ //In the middle of selecting a window to take a screenshot
+ // Get the window underneath the mouse click and take the screenshot
+ QList<WId> wins = XCB->WindowList();
+ cwin = 0;
+ //qDebug() << "Try to select window:" << ev->globalPos();
+ for(int i=0; i<wins.length() && cwin==0; i++){
+ if( XCB->WindowGeometry(wins[i], true).contains(ev->globalPos()) ){ cwin = wins[i]; }
+ }
+ qDebug() << " - Got window:" << cwin;
+ if(cwin==this->winId()){ return; } //cancelled
+ this->hide();
+ QTimer::singleShot(50+ui->spin_delay->value()*1000, this, SLOT(getPixmap()));
+ }else{
+ QMainWindow::mouseReleaseEvent(ev); //normal processing
+ }
+}
+
+void MainUI::resizeEvent(QResizeEvent*){
+ IMG->setDefaultSize( ui->scrollArea->maximumViewportSize() );
}
diff --git a/src-qt5/desktop-utils/lumina-screenshot/MainUI.h b/src-qt5/desktop-utils/lumina-screenshot/MainUI.h
index db0672da..853fb194 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/MainUI.h
+++ b/src-qt5/desktop-utils/lumina-screenshot/MainUI.h
@@ -23,6 +23,8 @@
#include <LuminaUtils.h>
#include <LuminaX11.h>
+#include "ImageEditor.h"
+
namespace Ui{
class MainUI;
};
@@ -38,12 +40,16 @@ public slots:
private:
Ui::MainUI *ui;
- QPixmap cpic; //current picture
+ bool mousegrabbed;
+ QRect lastgeom;
QString ppath; //previous file path
WId cwin; //current window to screenshot
QSettings *settings;
LXCB *XCB; //Library access to window subsystems
+ //Image Editor widget
+ ImageEditor *IMG;
+
private slots:
//Button Slots
void closeApplication(){
@@ -51,13 +57,17 @@ private slots:
}
void saveScreenshot();
void quicksave();
- void editScreenshot();
- void startScreenshot();
+ void startScreenshot();
+ void imgselchanged(bool hassel);
//Utility functions to perform a screenshot
bool getWindow(); //set the "cwin" variable as appropriate
void getPixmap(); //set the "cpic" variable to the new screenshot
+
+protected:
+ void mouseReleaseEvent(QMouseEvent *ev);
+ void resizeEvent(QResizeEvent *ev);
};
#endif
diff --git a/src-qt5/desktop-utils/lumina-screenshot/MainUI.ui b/src-qt5/desktop-utils/lumina-screenshot/MainUI.ui
index e8a19727..db1c0cee 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/MainUI.ui
+++ b/src-qt5/desktop-utils/lumina-screenshot/MainUI.ui
@@ -15,212 +15,319 @@
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
<item>
- <widget class="QLabel" name="label_screenshot">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>1</number>
</property>
- <property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="text">
- <string>No Screenshot Yet</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="group_new">
- <property name="title">
- <string>New Screenshot Settings</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <property name="topMargin">
- <number>2</number>
- </property>
- <property name="bottomMargin">
- <number>1</number>
- </property>
- <property name="spacing">
- <number>2</number>
- </property>
- <item row="3" column="1">
- <widget class="QCheckBox" name="check_frame">
- <property name="text">
- <string>Include Borders</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QSpinBox" name="spin_delay">
- <property name="suffix">
- <string> Seconds</string>
- </property>
- <property name="prefix">
- <string>Delay </string>
- </property>
- <property name="maximum">
- <number>20</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QRadioButton" name="radio_all">
- <property name="text">
- <string>Entire Session</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QRadioButton" name="radio_window">
- <property name="text">
- <string>Single Window</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QRadioButton" name="radio_monitor">
- <property name="text">
- <string>Single Screen</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QSpinBox" name="spin_monitor">
- <property name="prefix">
- <string notr="true"># </string>
+ <widget class="QWidget" name="tab_settings">
+ <attribute name="title">
+ <string>New Screenshot</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QGroupBox" name="group_settings">
+ <property name="title">
+ <string>Settings</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout_2">
+ <property name="horizontalSpacing">
+ <number>3</number>
</property>
- <property name="minimum">
- <number>1</number>
+ <property name="verticalSpacing">
+ <number>3</number>
</property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
+ <property name="rightMargin">
+ <number>0</number>
</property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="radio_all">
+ <property name="text">
+ <string>Entire Session</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="radio_monitor">
+ <property name="text">
+ <string>Single Screen</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="radio_window">
+ <property name="text">
+ <string>Single Window</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="spin_monitor">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="prefix">
+ <string notr="true"># </string>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="check_frame">
+ <property name="text">
+ <string>Include Borders</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QSpinBox" name="spin_delay">
+ <property name="suffix">
+ <string> Seconds</string>
+ </property>
+ <property name="prefix">
+ <string>Delay </string>
+ </property>
+ <property name="maximum">
+ <number>20</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="push_snap">
+ <property name="text">
+ <string>Take Screenshot</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_view">
+ <attribute name="title">
+ <string>View/Edit</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>341</width>
+ <height>171</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QToolButton" name="tool_save">
+ <property name="text">
+ <string>Save As</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_quicksave">
+ <property name="text">
+ <string>Launch Editor</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_crop">
+ <property name="text">
+ <string>Crop</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_resize">
+ <property name="text">
+ <string>Resize</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
- <widget class="QToolBar" name="toolBar">
- <property name="contextMenuPolicy">
- <enum>Qt::CustomContextMenu</enum>
- </property>
- <property name="windowTitle">
- <string>toolBar</string>
- </property>
- <property name="movable">
- <bool>false</bool>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>349</width>
+ <height>23</height>
+ </rect>
</property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionTake_Screenshot"/>
+ <addaction name="separator"/>
+ <addaction name="actionSave_As"/>
+ <addaction name="actionQuick_Save"/>
+ <addaction name="separator"/>
+ <addaction name="actionClose"/>
+ </widget>
+ <addaction name="menuFile"/>
+ </widget>
+ <action name="actionTake_Screenshot">
+ <property name="text">
+ <string>Take Screenshot</string>
</property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextUnderIcon</enum>
+ <property name="shortcut">
+ <string>Ctrl+N</string>
</property>
- <property name="floatable">
- <bool>false</bool>
+ <property name="shortcutContext">
+ <enum>Qt::ApplicationShortcut</enum>
</property>
- <attribute name="toolBarArea">
- <enum>TopToolBarArea</enum>
- </attribute>
- <attribute name="toolBarBreak">
- <bool>false</bool>
- </attribute>
- <addaction name="actionNew"/>
- <addaction name="actionSave"/>
- <addaction name="actionquicksave"/>
- <addaction name="actionEdit"/>
- <addaction name="actionQuit"/>
- </widget>
- <action name="actionSave">
+ </action>
+ <action name="actionSave_As">
<property name="text">
- <string>Save</string>
- </property>
- <property name="toolTip">
- <string>Save Screenshot</string>
- </property>
- <property name="statusTip">
- <string>Save Screenshot</string>
+ <string>Save As</string>
</property>
<property name="shortcut">
<string>Ctrl+S</string>
</property>
+ <property name="shortcutContext">
+ <enum>Qt::ApplicationShortcut</enum>
+ </property>
</action>
- <action name="actionquicksave">
+ <action name="actionQuick_Save">
<property name="text">
<string>Quick Save</string>
</property>
- <property name="toolTip">
- <string>Quick Save Screenshot</string>
- </property>
- <property name="statusTip">
- <string>Quick Save Screenshot</string>
- </property>
- <property name="shortcut">
- <string>Ctrl+Shift+S</string>
- </property>
</action>
- <action name="actionEdit">
+ <action name="actionClose">
<property name="text">
- <string>Edit</string>
- </property>
- <property name="toolTip">
- <string>Edit Screenshot</string>
- </property>
- <property name="statusTip">
- <string>Edit Screenshot</string>
+ <string>Close</string>
</property>
<property name="shortcut">
- <string>Ctrl+E</string>
+ <string>Esc</string>
</property>
- </action>
- <action name="actionQuit">
- <property name="text">
- <string>Quit</string>
- </property>
- <property name="statusTip">
- <string>Quit</string>
- </property>
- <property name="shortcut">
- <string>Ctrl+Q</string>
+ <property name="shortcutContext">
+ <enum>Qt::ApplicationShortcut</enum>
</property>
</action>
- <action name="actionNew">
- <property name="text">
- <string>Snap</string>
- </property>
- <property name="statusTip">
- <string>Take new Screenshot</string>
- </property>
-</action>
</widget>
<resources/>
<connections/>
diff --git a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro
index 716d2ece..eb33107c 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro
+++ b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro
@@ -10,9 +10,11 @@ target.path = $${L_BINDIR}
TEMPLATE = app
SOURCES += main.cpp \
- MainUI.cpp
+ MainUI.cpp \
+ ImageEditor.cpp
-HEADERS += MainUI.h
+HEADERS += MainUI.h \
+ ImageEditor.h
FORMS += MainUI.ui
bgstack15