From e38231f2b19151299aadd615107d058ee990d4de Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Sun, 23 Apr 2017 15:05:48 +0200 Subject: [PATCH] Initial --- .gitignore | 48 ++++++++++++ KShare.pro | 64 ++++++++++++++++ LICENSE | 7 ++ README.md | 21 +++++ cropeditor/cropeditor.cpp | 38 ++++++++++ cropeditor/cropeditor.hpp | 28 +++++++ cropeditor/cropeditor.ui | 19 +++++ cropeditor/cropscene.cpp | 70 +++++++++++++++++ cropeditor/cropscene.hpp | 32 ++++++++ cropeditor/cropview.cpp | 20 +++++ cropeditor/cropview.hpp | 16 ++++ icon.qrc | 5 ++ icons/icon.jpg | Bin 0 -> 14418 bytes io/ioutils.cpp | 41 ++++++++++ io/ioutils.hpp | 23 ++++++ main.cpp | 14 ++++ mainwindow.cpp | 93 +++++++++++++++++++++++ mainwindow.hpp | 36 +++++++++ mainwindow.ui | 97 ++++++++++++++++++++++++ rendererwindow.cpp | 53 +++++++++++++ rendererwindow.hpp | 23 ++++++ screenshotter.cpp | 15 ++++ screenshotter.hpp | 10 +++ screenshotutil.cpp | 25 ++++++ screenshotutil.hpp | 13 ++++ settings.cpp | 15 ++++ settings.hpp | 12 +++ uploaders/default/clipboarduploader.cpp | 9 +++ uploaders/default/clipboarduploader.hpp | 21 +++++ uploaders/default/imguruploader.cpp | 22 ++++++ uploaders/default/imguruploader.hpp | 20 +++++ uploaders/uploader.hpp | 15 ++++ uploaders/uploadersingleton.cpp | 63 +++++++++++++++ uploaders/uploadersingleton.hpp | 27 +++++++ 34 files changed, 1015 insertions(+) create mode 100644 .gitignore create mode 100644 KShare.pro create mode 100644 LICENSE create mode 100644 README.md create mode 100644 cropeditor/cropeditor.cpp create mode 100644 cropeditor/cropeditor.hpp create mode 100644 cropeditor/cropeditor.ui create mode 100644 cropeditor/cropscene.cpp create mode 100644 cropeditor/cropscene.hpp create mode 100644 cropeditor/cropview.cpp create mode 100644 cropeditor/cropview.hpp create mode 100644 icon.qrc create mode 100644 icons/icon.jpg create mode 100644 io/ioutils.cpp create mode 100644 io/ioutils.hpp create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.hpp create mode 100644 mainwindow.ui create mode 100644 rendererwindow.cpp create mode 100644 rendererwindow.hpp create mode 100644 screenshotter.cpp create mode 100644 screenshotter.hpp create mode 100644 screenshotutil.cpp create mode 100644 screenshotutil.hpp create mode 100644 settings.cpp create mode 100644 settings.hpp create mode 100644 uploaders/default/clipboarduploader.cpp create mode 100644 uploaders/default/clipboarduploader.hpp create mode 100644 uploaders/default/imguruploader.cpp create mode 100644 uploaders/default/imguruploader.hpp create mode 100644 uploaders/uploader.hpp create mode 100644 uploaders/uploadersingleton.cpp create mode 100644 uploaders/uploadersingleton.hpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d6839f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +# C++ objects and libs + +*.slo +*.lo +*.o +*.a +*.la +*.lai +*.so +*.dll +*.dylib + +# Qt-es + +/.qmake.cache +/.qmake.stash +*.pro.user +*.pro.user.* +*.qbs.user +*.qbs.user.* +*.moc +moc_*.cpp +qrc_*.cpp +ui_*.h +Makefile* +*build-* + +# QtCreator + +*.autosave + +# QtCtreator Qml +*.qmlproject.user +*.qmlproject.user.* + +# QtCtreator CMake +CMakeLists.txt.user +Makefile + +# Executable +KShare + +# Other +*.out + +*.Debug + +*.Release diff --git a/KShare.pro b/KShare.pro new file mode 100644 index 0000000..61733fc --- /dev/null +++ b/KShare.pro @@ -0,0 +1,64 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2017-04-19T15:47:09 +# +#------------------------------------------------- + +QT += core gui network + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = KShare +TEMPLATE = app + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + + +SOURCES += main.cpp\ + mainwindow.cpp \ + cropeditor/cropeditor.cpp \ + cropeditor/cropview.cpp \ + cropeditor/cropscene.cpp \ + uploaders/uploadersingleton.cpp \ + screenshotter.cpp \ + screenshotutil.cpp \ + uploaders/default/imguruploader.cpp \ + io/ioutils.cpp \ + settings.cpp \ + uploaders/default/clipboarduploader.cpp + +HEADERS += mainwindow.hpp \ + cropeditor/cropeditor.hpp \ + cropeditor/cropview.hpp \ + cropeditor/cropscene.hpp \ + uploaders/uploader.hpp \ + uploaders/uploadersingleton.hpp \ + screenshotter.hpp \ + screenshotutil.hpp \ + uploaders/default/imguruploader.hpp \ + io/ioutils.hpp \ + settings.hpp \ + uploaders/default/clipboarduploader.hpp + +FORMS += mainwindow.ui + +DISTFILES += \ + README.md \ + LICENSE + +RESOURCES += \ + icon.qrc + +ICON = icons/favicon.ico + +# Enable debug symbols +QMAKE_CFLAGS_DEBUG += -g diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e8d61c9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2017 ArsenArsen + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..416d3e3 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# KShare +A [ShareX](https://github.com/ShareX/) clone written in Qt. Should be cross platform + +**Note:** Windows users, stick to ShareX. + +## Goals +* Same support for Windows, Linux and Mac (if I ever get testers) +* Screenshotting: +* 1. Fullscreen, +* 2. Area; +* Screen recording, same options as above: +* 1. WebM +* 2. GIF (nopls) +* Custom uploader support +* Default uploaders, including: +* 1. imgur +* 2. Clipboard (not an uploader) +* 3. (S)FTP +* Oh, and a good icon. + +###### Started on 19th of April 2017 to bring some attention and improvement to Linux screenshotting. diff --git a/cropeditor/cropeditor.cpp b/cropeditor/cropeditor.cpp new file mode 100644 index 0000000..2b12978 --- /dev/null +++ b/cropeditor/cropeditor.cpp @@ -0,0 +1,38 @@ +#include "cropeditor.hpp" + +#include "cropview.hpp" +#include +#include +#include +#include + +CropEditor::CropEditor(QPixmap *image, QObject *parent) : QObject(parent) +{ + pixmap = image; + scene = new CropScene(parent); + view = new CropView(scene); + + pixmapItem = new QGraphicsPixmapItem(*pixmap); + scene->addItem(pixmapItem); + scene->setSceneRect(pixmap->rect()); + + QTimer::singleShot(0, [&] { view->showFullScreen(); }); + + connect(scene, &CropScene::closedWithRect, this, &CropEditor::crop); +} + +CropEditor::~CropEditor() +{ + delete scene; + delete view; + delete pixmap; + delete pixmapItem; +} + +void CropEditor::crop(QRect rect) +{ + QPixmap crop = pixmap->copy(rect); + QPixmap *cropp = new QPixmap; + crop.swap(*cropp); + emit cropped(cropp); +} diff --git a/cropeditor/cropeditor.hpp b/cropeditor/cropeditor.hpp new file mode 100644 index 0000000..cd50e22 --- /dev/null +++ b/cropeditor/cropeditor.hpp @@ -0,0 +1,28 @@ +#ifndef CROPEDITOR_HPP +#define CROPEDITOR_HPP + +#include "cropscene.hpp" +#include "cropview.hpp" +#include +#include +#include +#include + +class CropEditor : public QObject +{ + Q_OBJECT + public: + CropEditor(QPixmap *image, QObject *parent = 0); + ~CropEditor(); + signals: + QPixmap *cropped(QPixmap *pixmap); + + private: + void crop(QRect rect); + QPixmap *pixmap = nullptr; + CropScene *scene = nullptr; + CropView *view = nullptr; + QGraphicsPixmapItem *pixmapItem = nullptr; +}; + +#endif // CROPEDITOR_HPP diff --git a/cropeditor/cropeditor.ui b/cropeditor/cropeditor.ui new file mode 100644 index 0000000..757b834 --- /dev/null +++ b/cropeditor/cropeditor.ui @@ -0,0 +1,19 @@ + + + CropEditor + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + diff --git a/cropeditor/cropscene.cpp b/cropeditor/cropscene.cpp new file mode 100644 index 0000000..17c0125 --- /dev/null +++ b/cropeditor/cropscene.cpp @@ -0,0 +1,70 @@ +#include "cropscene.hpp" +#include +#include + +CropScene::CropScene(QObject *parent) : QGraphicsScene(parent), prevButtons(Qt::NoButton) +{ +} + +CropScene::~CropScene() +{ + delete rect; +} + +void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) +{ + auto buttons = e->buttons(); + if (buttons == Qt::LeftButton || prevButtons == Qt::NoButton) + { + QPointF p = e->scenePos(); + if (rect == nullptr) + { + rect = new QGraphicsRectItem(p.x(), p.y(), 1, 1); + initPos = p; + QPen pen(Qt::NoBrush, 1); + pen.setColor(Qt::cyan); + rect->setPen(pen); + addItem(rect); + } + else + { + if (prevButtons == Qt::NoButton) + { + initPos = p; + rect->setRect(p.x(), p.y(), 1, 1); + } + else + { + rect->setRect(QRect(qMin(initPos.x(), p.x()), qMin(initPos.y(), p.y()), + qAbs(initPos.x() - p.x()), qAbs(initPos.y() - p.y()))); + } + } + e->accept(); + } + else + QGraphicsScene::mouseMoveEvent(e); + prevButtons = buttons; +} + +void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) +{ + prevButtons = Qt::NoButton; + QGraphicsScene::mouseReleaseEvent(e); +} + +void CropScene::keyReleaseEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) done(); +} + +void CropScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e) +{ + done(); + QGraphicsScene::mouseDoubleClickEvent(e); +} + +void CropScene::done() +{ + for (QGraphicsView *v : views()) v->close(); + emit closedWithRect(rect != nullptr ? rect->rect().toRect() : QRect()); +} diff --git a/cropeditor/cropscene.hpp b/cropeditor/cropscene.hpp new file mode 100644 index 0000000..cbd4723 --- /dev/null +++ b/cropeditor/cropscene.hpp @@ -0,0 +1,32 @@ +#ifndef CROPSCENE_HPP +#define CROPSCENE_HPP + +#include +#include +#include +#include + +class CropScene : public QGraphicsScene +{ + Q_OBJECT + public: + CropScene(QObject *parent); + virtual ~CropScene(); + signals: + void closedWithRect(QRect rect); + + protected: + void mouseMoveEvent(QGraphicsSceneMouseEvent *e) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) override; + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e) override; + + void keyReleaseEvent(QKeyEvent *e) override; + + private: + void done(); + QFlags prevButtons; + QGraphicsRectItem *rect = nullptr; + QPointF initPos; +}; + +#endif // CROPSCENE_HPP diff --git a/cropeditor/cropview.cpp b/cropeditor/cropview.cpp new file mode 100644 index 0000000..5f383bd --- /dev/null +++ b/cropeditor/cropview.cpp @@ -0,0 +1,20 @@ +#include "cropview.hpp" + +CropView::CropView(QGraphicsScene *scene) : QGraphicsView(scene) +{ + setFrameShape(QFrame::NoFrame); // Time taken to solve: A george99g and 38 minutes. + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint); +} + +void CropView::keyPressEvent(QKeyEvent *e) +{ + if (e->key() == Qt::Key_Escape) + { + close(); + e->accept(); + return; + } + QGraphicsView::keyPressEvent(e); +} diff --git a/cropeditor/cropview.hpp b/cropeditor/cropview.hpp new file mode 100644 index 0000000..15eeaaa --- /dev/null +++ b/cropeditor/cropview.hpp @@ -0,0 +1,16 @@ +#ifndef CROPVIEW_HPP +#define CROPVIEW_HPP + +#include +#include + +class CropView : public QGraphicsView +{ + public: + CropView(QGraphicsScene *scene); + + protected: + void keyPressEvent(QKeyEvent *e) override; +}; + +#endif // CROPVIEW_HPP diff --git a/icon.qrc b/icon.qrc new file mode 100644 index 0000000..0b15495 --- /dev/null +++ b/icon.qrc @@ -0,0 +1,5 @@ + + + icons/icon.jpg + + diff --git a/icons/icon.jpg b/icons/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..223ebdbeec821ff3b651dcf447dcd884bc82a74c GIT binary patch literal 14418 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 XKWfguN&K(;ZwCH113xkV&E5GwVxmV| literal 0 HcmV?d00001 diff --git a/io/ioutils.cpp b/io/ioutils.cpp new file mode 100644 index 0000000..d0dae2b --- /dev/null +++ b/io/ioutils.cpp @@ -0,0 +1,41 @@ +#include "ioutils.hpp" +#include +#include +#include +#include + +namespace ioutils +{ +QNetworkAccessManager networkManager; +} + +void ioutils::getJson(QUrl target, QList> headers, std::function callback) +{ + QNetworkRequest req(target); + for (auto header : headers) + { + req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); + } + QNetworkReply *reply = networkManager.get(req); + QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + callback(QJsonDocument::fromJson(reply->readAll())); + reply->deleteLater(); + }); +} + +void ioutils::postJson(QUrl target, + QList> headers, + QByteArray body, + std::function callback) +{ + QNetworkRequest req(target); + for (auto header : headers) + { + req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); + } + QNetworkReply *reply = networkManager.post(req, body); + QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + callback(QJsonDocument::fromJson(reply->readAll())); + reply->deleteLater(); + }); +} diff --git a/io/ioutils.hpp b/io/ioutils.hpp new file mode 100644 index 0000000..bd4c3fc --- /dev/null +++ b/io/ioutils.hpp @@ -0,0 +1,23 @@ +#ifndef IOUTILS_HPP +#define IOUTILS_HPP + +#include +#include +#include +#include +#include + +namespace ioutils +{ +extern QNetworkAccessManager networkManager; +void getJson(QUrl target, QList> headers, std::function callback); +void postJson(QUrl target, + QList> headers, + QByteArray body, + std::function callback); +// If I need more I will add +// Maybe when people start with plugins and custom uploaders +// Wait, that's a secret +} + +#endif // IOUTILS_HPP diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..6589c23 --- /dev/null +++ b/main.cpp @@ -0,0 +1,14 @@ +#include "mainwindow.hpp" +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..db959cc --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,93 @@ +#include "mainwindow.hpp" +#include "screenshotter.hpp" +#include "screenshotutil.hpp" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) +{ + ui->setupUi(this); + setWindowIcon(QIcon(":/icons/icon.jpg")); + tray = new QSystemTrayIcon(windowIcon(), this); + tray->setToolTip("KShare"); + tray->setVisible(true); + QMenu *menu = new QMenu(this); + QAction *quit = new QAction("Quit", this); + QAction *shtoggle = new QAction("Show/Hide", this); + QAction *fullscreen = new QAction("Take fullscreen shot", this); + QAction *area = new QAction("Take area shot", this); + menu->addActions({ quit, shtoggle }); + menu->addSeparator(); + menu->addActions({ fullscreen, area }); + connect(quit, &QAction::triggered, this, &MainWindow::quit); + connect(shtoggle, &QAction::triggered, this, &MainWindow::toggleVisible); + connect(fullscreen, &QAction::triggered, this, &MainWindow::on_actionFullscreen_triggered); + connect(area, &QAction::triggered, this, &MainWindow::on_actionArea_triggered); + tray->setContextMenu(menu); + + ui->uploaderList->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->uploaderList->setSelectionMode(QAbstractItemView::SingleSelection); + + // Add items to uploader selection + for (Uploader *u : UploaderSingleton::inst().uploaderList()) + { + QListWidgetItem *item = new QListWidgetItem(u->name()); + item->setToolTip(u->description()); + // ui->uploaderList->setCurrentIndex(ui->uploaderList->model()->index(++i, 0)) + ui->uploaderList->addItem(item); + if (u->name() == UploaderSingleton::inst().selectedUploader()) item->setSelected(true); + } +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::closeEvent(QCloseEvent *event) +{ + event->ignore(); + QTimer::singleShot(0, this, &MainWindow::hide); +} + +void MainWindow::quit() +{ + QCoreApplication::quit(); +} + +void MainWindow::toggleVisible() +{ + this->setVisible(!this->isVisible()); +} + +void MainWindow::on_actionQuit_triggered() +{ + quit(); +} + +void MainWindow::on_actionFullscreen_triggered() +{ + QTimer::singleShot(0, &screenshotter::fullscreen); +} + +void MainWindow::on_actionArea_triggered() +{ + QTimer::singleShot(0, &screenshotter::area); +} + +void MainWindow::on_uploaderList_clicked(const QModelIndex &) +{ + QList index = ui->uploaderList->selectedItems(); + if (index.size() == 1) + { + UploaderSingleton::inst().set(index.at(0)->text()); + } +} diff --git a/mainwindow.hpp b/mainwindow.hpp new file mode 100644 index 0000000..3a72857 --- /dev/null +++ b/mainwindow.hpp @@ -0,0 +1,36 @@ +#ifndef MAINWINDOW_HPP +#define MAINWINDOW_HPP + +#include +#include + +namespace Ui +{ +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + private slots: + void quit(); + void toggleVisible(); + + void on_actionQuit_triggered(); + void on_actionFullscreen_triggered(); + void on_actionArea_triggered(); + void on_uploaderList_clicked(const QModelIndex &); + + public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + + private: + Ui::MainWindow *ui; + QSystemTrayIcon *tray; + + protected: + void closeEvent(QCloseEvent *event); +}; + +#endif // MAINWINDOW_HPP diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..9693bc1 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,97 @@ + + + MainWindow + + + + 0 + 0 + 262 + 239 + + + + KShare + + + + :/icons/icon.jpg:/icons/icon.jpg + + + + + 0 + 0 + + + + + + 0 + 0 + 241 + 19 + + + + Uploader selection: + + + + + + 0 + 20 + 256 + 192 + + + + + + + + 0 + 0 + 262 + 24 + + + + + Fi&le + + + + + + Scree&nshot + + + + + + + + + + &Quit + + + + + &Fullscreen + + + + + &Area + + + + + + + + + diff --git a/rendererwindow.cpp b/rendererwindow.cpp new file mode 100644 index 0000000..4706451 --- /dev/null +++ b/rendererwindow.cpp @@ -0,0 +1,53 @@ +#include "rendererwindow.hpp" + +RendererWindow::RendererWindow(QRect &size, QWindow *parent) : + QWindow(*parent) +{ + create(); + backingStore = new QBackingStore(this); + setGeometry(size); +} + +bool RasterWindow::event(QEvent *event) +{ + if (event->type() == QEvent::UpdateRequest) { + renderNow(); + return true; + } + return QWindow::event(event); +} + +void RendererWindow::renderLater() { + requestUpdate(); +} + +void RasterWindow::resizeEvent(QResizeEvent *resizeEvent) +{ + m_backingStore->resize(resizeEvent->size()); + if (isExposed()) + renderNow(); +} + +void RasterWindow::exposeEvent(QExposeEvent *) +{ + if (isExposed()) + renderNow(); +} + +void RasterWindow::renderNow() +{ + if (!isExposed()) + return; + + QRect rect(0, 0, width(), height()); + m_backingStore->beginPaint(rect); + + QPaintDevice *device = m_backingStore->paintDevice(); + QPainter painter(device); + + painter.fillRect(0, 0, width(), height(), Qt::white); + render(&painter); + + m_backingStore->endPaint(); + m_backingStore->flush(rect); +} diff --git a/rendererwindow.hpp b/rendererwindow.hpp new file mode 100644 index 0000000..2f59ccd --- /dev/null +++ b/rendererwindow.hpp @@ -0,0 +1,23 @@ +#ifndef RENDERERWINDOW_HPP +#define RENDERERWINDOW_HPP + +#include + +class RendererWindow : public QWindow +{ + Q_OBJECT +public: + RendererWindow(QRect &size, QWindow *parent = 0); + virtual void render(QPainter *painter); +public slots: + void renderLater(); + void renderNow(); +protected: + bool event(QEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + void exposeEvent(QExposeEvent *event) override; +private: + QBackingStore *backingStore; +}; + +#endif // RENDERERWINDOW_HPP diff --git a/screenshotter.cpp b/screenshotter.cpp new file mode 100644 index 0000000..c6b5810 --- /dev/null +++ b/screenshotter.cpp @@ -0,0 +1,15 @@ +#include "screenshotter.hpp" +#include "cropeditor/cropeditor.hpp" +#include "screenshotutil.hpp" +#include "uploaders/uploadersingleton.hpp" + +void screenshotter::area() +{ + CropEditor *editor = new CropEditor(screenshotutil::fullscreen()); + QObject::connect(editor, &CropEditor::cropped, [&](QPixmap *pixmap) { UploaderSingleton::inst().upload(pixmap); }); +} + +void screenshotter::fullscreen() +{ + UploaderSingleton::inst().upload(screenshotutil::fullscreen()); +} diff --git a/screenshotter.hpp b/screenshotter.hpp new file mode 100644 index 0000000..00ec27c --- /dev/null +++ b/screenshotter.hpp @@ -0,0 +1,10 @@ +#ifndef SCREENSHOTTER_HPP +#define SCREENSHOTTER_HPP + +namespace screenshotter +{ +void fullscreen(); +void area(); +} + +#endif // SCREENSHOTTER_HPP diff --git a/screenshotutil.cpp b/screenshotutil.cpp new file mode 100644 index 0000000..cd477b0 --- /dev/null +++ b/screenshotutil.cpp @@ -0,0 +1,25 @@ +#include "screenshotutil.hpp" + +#include +#include +#include +#include + +QPixmap *screenshotutil::fullscreen() +{ + return window(0); +} + +QPixmap *screenshotutil::window(long wid) +{ + QScreen *w = QApplication::primaryScreen(); + QPixmap screen = w->grabWindow(wid); + QPixmap *pm = new QPixmap(screen.size()); + screen.swap(*pm); + return pm; +} + +void screenshotutil::toClipboard(QString value) +{ + QApplication::clipboard()->setText(value); +} diff --git a/screenshotutil.hpp b/screenshotutil.hpp new file mode 100644 index 0000000..1dc9970 --- /dev/null +++ b/screenshotutil.hpp @@ -0,0 +1,13 @@ +#ifndef SCREENSHOTUTIL_HPP +#define SCREENSHOTUTIL_HPP + +#include + +namespace screenshotutil +{ +QPixmap fullscreen(); +QPixmap window(long wid); +void toClipboard(QString value); +} + +#endif // SCREENSHOTUTIL_HPP diff --git a/settings.cpp b/settings.cpp new file mode 100644 index 0000000..2ceddcd --- /dev/null +++ b/settings.cpp @@ -0,0 +1,15 @@ +#include "settings.hpp" + +#include + +QSettings &settings::settings() +{ + static QDir configDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); + if (configDir.path() == QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)) + { + configDir.mkdir("KShare"); + configDir.cd("KShare"); + } + static QSettings settings(configDir.absoluteFilePath("settings.ini"), QSettings::IniFormat); + return settings; +} diff --git a/settings.hpp b/settings.hpp new file mode 100644 index 0000000..6e43223 --- /dev/null +++ b/settings.hpp @@ -0,0 +1,12 @@ +#ifndef SETTINGS_HPP +#define SETTINGS_HPP + +#include +#include + +namespace settings +{ +QSettings &settings(); +} + +#endif // SETTINGS_HPP diff --git a/uploaders/default/clipboarduploader.cpp b/uploaders/default/clipboarduploader.cpp new file mode 100644 index 0000000..d188f95 --- /dev/null +++ b/uploaders/default/clipboarduploader.cpp @@ -0,0 +1,9 @@ +#include "clipboarduploader.hpp" + +#include +#include + +void ClipboardUploader::doUpload(QPixmap *pixmap) +{ + QApplication::clipboard()->setImage(pixmap->toImage()); +} diff --git a/uploaders/default/clipboarduploader.hpp b/uploaders/default/clipboarduploader.hpp new file mode 100644 index 0000000..5616b75 --- /dev/null +++ b/uploaders/default/clipboarduploader.hpp @@ -0,0 +1,21 @@ +#ifndef CLIPBOARDUPLOADER_HPP +#define CLIPBOARDUPLOADER_HPP + +#include +#include + +class ClipboardUploader : public Uploader +{ + public: + QString name() + { + return "clipboard"; + } + QString description() + { + return "Copies the image to clipboard"; + } + void doUpload(QPixmap *pixmap); +}; + +#endif // CLIPBOARDUPLOADER_HPP diff --git a/uploaders/default/imguruploader.cpp b/uploaders/default/imguruploader.cpp new file mode 100644 index 0000000..34131ba --- /dev/null +++ b/uploaders/default/imguruploader.cpp @@ -0,0 +1,22 @@ +#include "imguruploader.hpp" + +#include +#include +#include +#include +#include + +void ImgurUploader::doUpload(QPixmap *pixmap) +{ + QByteArray byteArray; + QBuffer buffer(&byteArray); + pixmap->save(&buffer, "PNG"); + ioutils::postJson(QUrl("https://api.imgur.com/3/image"), + QList>() + << QPair("Content-Type", + "application/x-www-form-urlencoded") + << QPair("Authorization", "Client-ID 8a98f183fc895da"), + byteArray, [](QJsonDocument res) { + screenshotutil::toClipboard(res.object()["data"].toObject()["link"].toString()); + }); +} diff --git a/uploaders/default/imguruploader.hpp b/uploaders/default/imguruploader.hpp new file mode 100644 index 0000000..b76acb5 --- /dev/null +++ b/uploaders/default/imguruploader.hpp @@ -0,0 +1,20 @@ +#ifndef IMGURUPLOADER_HPP +#define IMGURUPLOADER_HPP + +#include "../uploader.hpp" + +class ImgurUploader : public Uploader +{ + public: + QString name() + { + return "imgur"; + } + QString description() + { + return "imgur.com uploader"; + } + void doUpload(QPixmap *pixmap); +}; + +#endif // IMGURUPLOADER_HPP diff --git a/uploaders/uploader.hpp b/uploaders/uploader.hpp new file mode 100644 index 0000000..3da10b3 --- /dev/null +++ b/uploaders/uploader.hpp @@ -0,0 +1,15 @@ +#ifndef UPLOADER_HPP +#define UPLOADER_HPP + +#include +#include + +class Uploader +{ + public: + virtual void doUpload(QPixmap *pixmap) = 0; + virtual QString name() = 0; + virtual QString description() = 0; +}; + +#endif // UPLOADER_HPP diff --git a/uploaders/uploadersingleton.cpp b/uploaders/uploadersingleton.cpp new file mode 100644 index 0000000..9f48716 --- /dev/null +++ b/uploaders/uploadersingleton.cpp @@ -0,0 +1,63 @@ +#include "uploadersingleton.hpp" +#include "default/clipboarduploader.hpp" +#include "default/imguruploader.hpp" +#include +#include +#include + +UploaderSingleton::UploaderSingleton() +{ + // QDir + // configDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); + // configDir.mkpath("KShare/uploaders"); + // configDir.cd("KShare/uploaders"); + // configDir.setNameFilters({"*.uploader"}); + // for (QString file : configDir.entryList()) { + // registerUploader(new CustomUploader(file)); + // } + // TODO + + // UPLOADERS + registerUploader(new ImgurUploader); + registerUploader(new ClipboardUploader); + // --------- + + if (settings::settings().contains("uploader")) + uploader = settings::settings().value("uploader").toString(); + else + settings::settings().setValue("uploader", uploader); + if (!uploaders.contains(uploader)) + { + settings::settings().setValue("uploader", uploader); + uploader = "imgur"; + } +} + +void UploaderSingleton::registerUploader(Uploader *uploader) +{ + uploaders.insert(uploader->name(), uploader); +} + +void UploaderSingleton::upload(QPixmap *pixmap) +{ + uploaders.value(uploader)->doUpload(pixmap); +} + +QList UploaderSingleton::uploaderList() +{ + return uploaders.values(); +} + +void UploaderSingleton::set(QString uploader) +{ + if (uploaders.contains(uploader)) + { + this->uploader = uploader; + settings::settings().setValue("uploader", uploader); + } +} + +QString UploaderSingleton::selectedUploader() +{ + return uploader; +} diff --git a/uploaders/uploadersingleton.hpp b/uploaders/uploadersingleton.hpp new file mode 100644 index 0000000..0fb3d13 --- /dev/null +++ b/uploaders/uploadersingleton.hpp @@ -0,0 +1,27 @@ +#ifndef UPLOADERSINGLETON_HPP +#define UPLOADERSINGLETON_HPP + +#include "uploader.hpp" +#include + +class UploaderSingleton +{ + public: + static UploaderSingleton &inst() + { + static UploaderSingleton inst; + return inst; + } + void registerUploader(Uploader *uploader); + void upload(QPixmap *pixmap); + QList uploaderList(); + void set(QString uploader); + QString selectedUploader(); + + private: + UploaderSingleton(); + QMap uploaders; + QString uploader = "imgur"; +}; + +#endif // UPLOADERSINGLETON_HPP