Hotkeys and crop improvements
This commit is contained in:
parent
3877799895
commit
2ef75d7576
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "QHotkey"]
|
||||||
|
path = QHotkey
|
||||||
|
url = https://github.com/Skycoder42/QHotkey.git
|
10
KShare.pro
10
KShare.pro
@ -37,7 +37,9 @@ SOURCES += main.cpp\
|
|||||||
uploaders/default/clipboarduploader.cpp \
|
uploaders/default/clipboarduploader.cpp \
|
||||||
formatter.cpp \
|
formatter.cpp \
|
||||||
uploaders/customuploader.cpp \
|
uploaders/customuploader.cpp \
|
||||||
notifications.cpp
|
notifications.cpp \
|
||||||
|
hotkeying.cpp \
|
||||||
|
sequencedialog.cpp
|
||||||
|
|
||||||
HEADERS += mainwindow.hpp \
|
HEADERS += mainwindow.hpp \
|
||||||
cropeditor/cropeditor.hpp \
|
cropeditor/cropeditor.hpp \
|
||||||
@ -53,7 +55,9 @@ HEADERS += mainwindow.hpp \
|
|||||||
uploaders/default/clipboarduploader.hpp \
|
uploaders/default/clipboarduploader.hpp \
|
||||||
formatter.hpp \
|
formatter.hpp \
|
||||||
uploaders/customuploader.hpp \
|
uploaders/customuploader.hpp \
|
||||||
notifications.hpp
|
notifications.hpp \
|
||||||
|
hotkeying.hpp \
|
||||||
|
sequencedialog.hpp
|
||||||
|
|
||||||
FORMS += mainwindow.ui
|
FORMS += mainwindow.ui
|
||||||
|
|
||||||
@ -68,3 +72,5 @@ ICON = icons/favicon.ico
|
|||||||
|
|
||||||
# Enable debug symbols
|
# Enable debug symbols
|
||||||
QMAKE_CFLAGS_DEBUG += -g
|
QMAKE_CFLAGS_DEBUG += -g
|
||||||
|
|
||||||
|
include(QHotkey/qhotkey.pri)
|
||||||
|
1
QHotkey
Submodule
1
QHotkey
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 040cf5ec0cf2ed605c39d7bc4d0164ab7c54d6bf
|
17
README.md
17
README.md
@ -7,22 +7,27 @@ A [ShareX](https://github.com/ShareX/) clone written in Qt. Should be cross plat
|
|||||||
* Qt 5 Widgets
|
* Qt 5 Widgets
|
||||||
* Qt 5 GUI
|
* Qt 5 GUI
|
||||||
* Qt 5 Network
|
* Qt 5 Network
|
||||||
|
* (QHotkey)[https://github.com/Skycoder42/QHotkey]
|
||||||
|
|
||||||
Despite the name implying so, this project does not depend on the KDE API at all.
|
Despite the name implying so, this project does not depend on the KDE API at all.
|
||||||
|
|
||||||
## Goals
|
## Goals
|
||||||
* Same support for Windows, Linux and Mac (if I ever get testers)
|
* Same support for Windows, Linux and Mac (if I ever get testers)
|
||||||
* Screenshotting:
|
* Screenshotting:
|
||||||
* 1. Fullscreen,
|
* 1. Fullscreen, [target: 1.0] [done]
|
||||||
* 2. Area;
|
* 2. Area; [target: 1.0] [done]
|
||||||
* Screen recording, same options as above:
|
* Screen recording, same options as above:
|
||||||
* 1. WebM
|
* 1. WebM
|
||||||
* 2. GIF (nopls)
|
* 2. GIF (nopls)
|
||||||
* Custom uploader support
|
* Custom uploader support [target: 1.0] [done]
|
||||||
* Default uploaders, including:
|
* Default uploaders, including:
|
||||||
* 1. imgur
|
* 1. imgur [target: 1.0] [done]
|
||||||
* 2. Clipboard (not an uploader)
|
* 2. Clipboard (not an uploader) [target: 1.0] [done]
|
||||||
* 3. (S)FTP
|
* 3. (S)FTP
|
||||||
* Oh, and a good icon.
|
* Oh, and a good icon. [looks good to me, but to noone else]
|
||||||
|
|
||||||
|
## Wayland Support
|
||||||
|
|
||||||
|
If it's requested enough, I will make a pull request towards QHotkey to support Wayland. Or open an issue, depending on my mood. But Qt _should_ still work on Wayland.
|
||||||
|
|
||||||
###### Started on 19th of April 2017 to bring some attention and improvement to Linux screenshotting.
|
###### Started on 19th of April 2017 to bring some attention and improvement to Linux screenshotting.
|
||||||
|
@ -13,6 +13,7 @@ CropEditor::CropEditor(QPixmap *image, QObject *parent) : QObject(parent)
|
|||||||
view = new CropView(scene);
|
view = new CropView(scene);
|
||||||
|
|
||||||
pixmapItem = new QGraphicsPixmapItem(*pixmap);
|
pixmapItem = new QGraphicsPixmapItem(*pixmap);
|
||||||
|
pixmapItem->setZValue(-1);
|
||||||
scene->addItem(pixmapItem);
|
scene->addItem(pixmapItem);
|
||||||
scene->setSceneRect(pixmap->rect());
|
scene->setSceneRect(pixmap->rect());
|
||||||
|
|
||||||
|
@ -1,9 +1,22 @@
|
|||||||
#include "cropscene.hpp"
|
#include "cropscene.hpp"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QGraphicsPolygonItem>
|
||||||
#include <QGraphicsView>
|
#include <QGraphicsView>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
CropScene::CropScene(QObject *parent) : QGraphicsScene(parent), prevButtons(Qt::NoButton)
|
CropScene::CropScene(QObject *parent) : QGraphicsScene(parent), prevButtons(Qt::NoButton)
|
||||||
{
|
{
|
||||||
|
QTimer::singleShot(0, [&] {
|
||||||
|
QPolygonF poly;
|
||||||
|
poly.append(sceneRect().topLeft());
|
||||||
|
poly.append(sceneRect().topRight());
|
||||||
|
poly.append(sceneRect().bottomRight());
|
||||||
|
poly.append(sceneRect().bottomLeft());
|
||||||
|
polyItem = new QGraphicsPolygonItem(poly);
|
||||||
|
polyItem->setBrush(QBrush(QColor(0, 0, 0, 191)));
|
||||||
|
polyItem->setPen(QPen(Qt::NoPen));
|
||||||
|
addItem(polyItem);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
CropScene::~CropScene()
|
CropScene::~CropScene()
|
||||||
@ -35,10 +48,26 @@ void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rect->setRect(QRect(qMin(initPos.x(), p.x()), qMin(initPos.y(), p.y()),
|
rect->setRect(QRect(qMin(initPos.x(), p.x()), qMin(initPos.y(), p.y()), qAbs(initPos.x() - p.x()),
|
||||||
qAbs(initPos.x() - p.x()), qAbs(initPos.y() - p.y())));
|
qAbs(initPos.y() - p.y())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
QPolygonF poly;
|
||||||
|
QPointF theMagicWikipediaPoint(rect->rect().right(), sceneRect().bottom());
|
||||||
|
poly << sceneRect().topLeft();
|
||||||
|
poly << sceneRect().topRight();
|
||||||
|
poly << sceneRect().bottomRight();
|
||||||
|
poly << theMagicWikipediaPoint;
|
||||||
|
poly << rect->rect().bottomRight();
|
||||||
|
poly << rect->rect().topRight();
|
||||||
|
poly << rect->rect().topLeft();
|
||||||
|
poly << rect->rect().bottomLeft();
|
||||||
|
poly << rect->rect().bottomRight();
|
||||||
|
poly << theMagicWikipediaPoint;
|
||||||
|
poly << sceneRect().bottomLeft();
|
||||||
|
poly << sceneRect().topLeft();
|
||||||
|
|
||||||
|
this->polyItem->setPolygon(poly);
|
||||||
e->accept();
|
e->accept();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -27,6 +27,7 @@ class CropScene : public QGraphicsScene
|
|||||||
QFlags<Qt::MouseButton> prevButtons;
|
QFlags<Qt::MouseButton> prevButtons;
|
||||||
QGraphicsRectItem *rect = nullptr;
|
QGraphicsRectItem *rect = nullptr;
|
||||||
QPointF initPos;
|
QPointF initPos;
|
||||||
|
QGraphicsPolygonItem *polyItem = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CROPSCENE_HPP
|
#endif // CROPSCENE_HPP
|
||||||
|
43
hotkeying.cpp
Normal file
43
hotkeying.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "hotkeying.hpp"
|
||||||
|
|
||||||
|
#include <QHotkey>
|
||||||
|
#include <QMap>
|
||||||
|
#include <settings.hpp>
|
||||||
|
|
||||||
|
QMap<QString, QHotkey *> hotkeys;
|
||||||
|
|
||||||
|
// func gets bound only on first set, or load
|
||||||
|
void hotkeying::hotkey(QString seqName, QKeySequence seq, std::function<void()> func)
|
||||||
|
{
|
||||||
|
if (hotkeys.contains(seqName))
|
||||||
|
hotkeys.value(seqName)->setShortcut(seq, true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QHotkey *hotkey = new QHotkey(seq, true);
|
||||||
|
QObject::connect(hotkey, &QHotkey::activated, func);
|
||||||
|
hotkeys.insert(seqName, hotkey);
|
||||||
|
}
|
||||||
|
settings::settings().setValue(seqName.prepend("hotkey_"), seq.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// forces the hotkey from settings
|
||||||
|
void hotkeying::load(QString seqName, std::function<void()> func)
|
||||||
|
{
|
||||||
|
QHotkey *h;
|
||||||
|
if (settings::settings().contains(seqName.prepend("hotkey_")))
|
||||||
|
h = new QHotkey(QKeySequence(settings::settings().value(seqName.prepend("hotkey_")).toString()), true);
|
||||||
|
else
|
||||||
|
h = new QHotkey;
|
||||||
|
QObject::connect(h, &QHotkey::activated, func);
|
||||||
|
hotkeys.insert(seqName, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hotkeying::valid(QString seq)
|
||||||
|
{
|
||||||
|
return !QKeySequence(seq).toString().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString hotkeying::sequence(QString seqName)
|
||||||
|
{
|
||||||
|
return hotkeys.contains(seqName) ? hotkeys.value(seqName)->shortcut().toString() : "";
|
||||||
|
}
|
16
hotkeying.hpp
Normal file
16
hotkeying.hpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef HOTKEYING_HPP
|
||||||
|
#define HOTKEYING_HPP
|
||||||
|
|
||||||
|
#include <QKeySequence>
|
||||||
|
#include <QString>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace hotkeying
|
||||||
|
{
|
||||||
|
void hotkey(QString seqName, QKeySequence seq, std::function<void()> func);
|
||||||
|
bool valid(QString seq);
|
||||||
|
void load(QString seqName, std::function<void()> func);
|
||||||
|
QString sequence(QString seqName);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HOTKEYING_HPP
|
2
main.cpp
2
main.cpp
@ -1,4 +1,5 @@
|
|||||||
#include "mainwindow.hpp"
|
#include "mainwindow.hpp"
|
||||||
|
#include "sequencedialog.hpp"
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
@ -7,6 +8,7 @@ int main(int argc, char *argv[])
|
|||||||
a.setApplicationName("KShare");
|
a.setApplicationName("KShare");
|
||||||
a.setOrganizationName("ArsenArsen");
|
a.setOrganizationName("ArsenArsen");
|
||||||
a.setApplicationVersion("1.0");
|
a.setApplicationVersion("1.0");
|
||||||
|
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
w.show();
|
w.show();
|
||||||
return a.exec();
|
return a.exec();
|
||||||
|
@ -11,11 +11,23 @@
|
|||||||
#include <QStatusBar>
|
#include <QStatusBar>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <functional>
|
||||||
|
#include <hotkeying.hpp>
|
||||||
|
#include <sequencedialog.hpp>
|
||||||
#include <settings.hpp>
|
#include <settings.hpp>
|
||||||
#include <uploaders/uploadersingleton.hpp>
|
#include <uploaders/uploadersingleton.hpp>
|
||||||
|
|
||||||
MainWindow *MainWindow::instance;
|
MainWindow *MainWindow::instance;
|
||||||
|
|
||||||
|
void addHotkeyItem(QString text, QString name, std::function<void()> *func)
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = new QListWidgetItem(text, MainWindow::inst()->ui->hotkeys);
|
||||||
|
item->setData(Qt::UserRole + 1, name);
|
||||||
|
MainWindow::inst()->fncs.insert(name, func);
|
||||||
|
hotkeying::load(name, *func);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
|
||||||
{
|
{
|
||||||
instance = this;
|
instance = this;
|
||||||
@ -62,6 +74,15 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
|
|||||||
ui->delay->setValue(settings::settings().value("delay").toDouble());
|
ui->delay->setValue(settings::settings().value("delay").toDouble());
|
||||||
else
|
else
|
||||||
ui->delay->setValue(0.25);
|
ui->delay->setValue(0.25);
|
||||||
|
|
||||||
|
// keys are hot, wait what
|
||||||
|
hotkeying::load("fullscreen", [this] { on_actionFullscreen_triggered(); });
|
||||||
|
hotkeying::load("area", [this] { on_actionArea_triggered(); });
|
||||||
|
|
||||||
|
ui->hotkeys->setSelectionMode(QListWidget::SingleSelection);
|
||||||
|
|
||||||
|
addHotkeyItem("Fullscreen image", "fullscreen", new std::function<void()>([&] { on_actionFullscreen_triggered(); }));
|
||||||
|
addHotkeyItem("Area image", "area", new std::function<void()>([&] { on_actionArea_triggered(); }));
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@ -141,3 +162,15 @@ void MainWindow::on_delay_valueChanged(double arg1)
|
|||||||
{
|
{
|
||||||
settings::settings().setValue("delay", arg1);
|
settings::settings().setValue("delay", arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_hotkeys_doubleClicked(const QModelIndex &)
|
||||||
|
{
|
||||||
|
if (ui->hotkeys->selectedItems().length() == 1)
|
||||||
|
{
|
||||||
|
QListWidgetItem *i = ui->hotkeys->selectedItems().at(0);
|
||||||
|
QString str = i->data(Qt::UserRole + 1).toString();
|
||||||
|
QString seq = QInputDialog::getText(ui->centralWidget, "Hotkey Input", "Insert hotkey:", QLineEdit::Normal,
|
||||||
|
hotkeying::sequence(str));
|
||||||
|
if (hotkeying::valid(seq)) hotkeying::hotkey(str, QKeySequence(seq), *fncs.value(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
#include <QDoubleSpinBox>
|
#include <QDoubleSpinBox>
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
#include <QMap>
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
#include <uploaders/uploader.hpp>
|
#include <uploaders/uploader.hpp>
|
||||||
|
|
||||||
@ -28,18 +30,21 @@ class MainWindow : public QMainWindow
|
|||||||
|
|
||||||
void on_delay_valueChanged(double arg1);
|
void on_delay_valueChanged(double arg1);
|
||||||
|
|
||||||
|
void on_hotkeys_doubleClicked(const QModelIndex &index);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MainWindow(QWidget *parent = 0);
|
explicit MainWindow(QWidget *parent = 0);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
QSystemTrayIcon *tray;
|
QSystemTrayIcon *tray;
|
||||||
void setScheme(QString scheme);
|
void setScheme(QString scheme);
|
||||||
QDoubleSpinBox *delay();
|
QDoubleSpinBox *delay();
|
||||||
|
|
||||||
static MainWindow *inst();
|
static MainWindow *inst();
|
||||||
|
QMap<QString, std::function<void()> *> fncs;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
|
||||||
static MainWindow *instance;
|
static MainWindow *instance;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>471</width>
|
<width>512</width>
|
||||||
<height>315</height>
|
<height>353</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -56,13 +56,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QLabel" name="label_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>s</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QListWidget" name="uploaderList"/>
|
<widget class="QListWidget" name="uploaderList"/>
|
||||||
</item>
|
</item>
|
||||||
@ -76,6 +69,36 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<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>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>s</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Hotkeys</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2" rowspan="5">
|
||||||
|
<widget class="QListWidget" name="hotkeys"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenuBar" name="menuBar">
|
<widget class="QMenuBar" name="menuBar">
|
||||||
@ -83,7 +106,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>471</width>
|
<width>512</width>
|
||||||
<height>24</height>
|
<height>24</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
Loading…
Reference in New Issue
Block a user