diff --git a/capture/button.cpp b/capture/button.cpp index 6b169f13..f361d4bd 100644 --- a/capture/button.cpp +++ b/capture/button.cpp @@ -153,6 +153,23 @@ size_t Button::getButtonBaseSize() { return BUTTON_SIZE; } +Button::Type Button::getTypeByName(QString s) { + // posible use of bimap??? + Button::Type res; + for (auto it = typeName.begin(); it != typeName.end(); ++it ) + if (it->second == s) + res = it->first; + return res; +} + +QString Button::getTypeName(Button::Type t) { + return typeName[t]; +} + +QString Button::getTypeTooltip(Button::Type t) { + return typeTooltip[t]; +} + Button::typeData Button::typeTooltip = { {Button::Type::selectionIndicator, "Shows the dimensions of the selection (X Y)"}, {Button::Type::mouseVisibility, "Sets the visibility of the mouse pointer"}, diff --git a/capture/button.h b/capture/button.h index 521572a7..680c8026 100644 --- a/capture/button.h +++ b/capture/button.h @@ -49,14 +49,14 @@ public: last }; - typedef std::map typeData; - static typeData typeTooltip; - static typeData typeName; explicit Button(Type, QWidget *parent = 0); static QIcon getIcon(const Type); static size_t getButtonBaseSize(); + static Button::Type getTypeByName(QString); + static QString getTypeName(Button::Type); + static QString getTypeTooltip(Button::Type); Type getButtonType() const; @@ -73,6 +73,10 @@ private: QPropertyAnimation *emergeAnimation; + typedef std::map typeData; + static typeData typeTooltip; + static typeData typeName; + signals: void hovered(); void mouseExited(); diff --git a/capture/capturewidget.cpp b/capture/capturewidget.cpp index 53b2217a..a92c9ef7 100644 --- a/capture/capturewidget.cpp +++ b/capture/capturewidget.cpp @@ -70,12 +70,8 @@ CaptureWidget::CaptureWidget(QWidget *parent) : setCursor(Qt::CrossCursor); initShortcuts(); - QVector tempVector; - for (int i =0; i < (int)Button::Type::last; ++i) { - tempVector.append((Button::Type)i); - } m_buttonHandler = new ButtonHandler(); - redefineButtons(tempVector); + redefineButtons(); createCapture(); resize(m_screenshot.size()); @@ -89,9 +85,12 @@ CaptureWidget::~CaptureWidget() { delete(m_buttonHandler); } -void CaptureWidget::redefineButtons(QVector vector) { +void CaptureWidget::redefineButtons() { + QSettings settings; + auto buttonsInt = settings.value("buttons").value >(); QVector vectorButtons; - for (auto t: vector) { + for (auto i: buttonsInt) { + auto t = static_cast(i); Button *b = new Button(t, this); if (t == Button::Type::selectionIndicator) { m_sizeIndButton = b; diff --git a/capture/capturewidget.h b/capture/capturewidget.h index 39a06a76..8a11b027 100644 --- a/capture/capturewidget.h +++ b/capture/capturewidget.h @@ -40,7 +40,7 @@ public: explicit CaptureWidget(QWidget *parent = 0); ~CaptureWidget(); - void redefineButtons(QVector); + void redefineButtons(); private slots: void saveScreenshot(); diff --git a/capture/screenshot.cpp b/capture/screenshot.cpp index 73410bcd..45ef4e70 100644 --- a/capture/screenshot.cpp +++ b/capture/screenshot.cpp @@ -41,10 +41,7 @@ void Screenshot::setScreenshot(const QPixmap &p) { QPixmap Screenshot::getScreenshot() const { return m_screenshot; } -/* -https://github.com/KDE/spectacle/tree/118bcd8a9a4c6c89445a589fa990d15ec9223099/src/PlatformBackends -https://github.com/ckaiser/Lightscreen/blob/354574e5d4a15af60004c86cb747dc3bb72a33e8/tools/screenshot.cpp#L416 -*/ + QString Screenshot::graphicalSave(const QRect &selection) const { const QString format = "png"; @@ -118,6 +115,9 @@ QPixmap Screenshot::paintModifications(const QVector v) { switch (modification.getType()) { case Button::Type::arrow: painter.drawLine(points[0], points[1]); + // https://forum.qt.io/topic/27284/solved-trouble-creating-an-arrow-between-two-qgraphicsitems + // http://doc.qt.io/qt-5/qtwidgets-graphicsview-diagramscene-example.html + // https://forum.qt.io/topic/38928/code-to-create-a-arrow-graphics-item-in-qt break; case Button::Type::circle: painter.drawEllipse(QRect(points[0], points[1])); diff --git a/configwindow.cpp b/configwindow.cpp index 0c9801cd..477f33af 100644 --- a/configwindow.cpp +++ b/configwindow.cpp @@ -36,32 +36,47 @@ ConfigWindow::ConfigWindow(QWidget *parent) : QWidget(parent){ QLabel *buttonSelectLabel = new QLabel("Choose the buttons to enable", this); baseLayout->addWidget(buttonSelectLabel); - QListWidget *buttonList = new QListWidget(this); - baseLayout->addWidget(buttonList); - - buttonList->setFlow(QListWidget::TopToBottom); - buttonList->setMouseTracking(true); - //buttonList->setSelectionMode(QAbstractItemView::NoSelection); - // http://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview - - for (int i = 0; i != static_cast(Button::Type::last); ++i) { - auto t = static_cast(i); - QListWidgetItem *buttonItem = new QListWidgetItem(buttonList); - buttonItem->setIcon(Button::getIcon(t)); - buttonItem->setText(Button::typeName[t]); - buttonItem->setToolTip(Button::typeTooltip[t]); - buttonItem->setCheckState(Qt::Unchecked); - } + m_buttonListView = new QListWidget(this); + m_buttonListView->setFlow(QListWidget::TopToBottom); + m_buttonListView->setMouseTracking(true); QSettings settings; - // http://www.qtcentre.org/threads/52957-QColor-vector-in-QSettings + m_listButtons = settings.value("buttons").value >(); + initButtonList(); - // black white icons - // color interface + connect(m_buttonListView, &QListWidget::itemChanged, this, + &ConfigWindow::updateActiveButtons); - // buttons available - - // path save - // color paint tools + baseLayout->addWidget(m_buttonListView); show(); } + +void ConfigWindow::initButtonList() { + for (int i = 0; i != static_cast(Button::Type::last); ++i) { + auto t = static_cast(i); + // Blocked items + if (t ==Button::Type::mouseVisibility || t ==Button::Type::text || + t ==Button::Type::imageUploader || t ==Button::Type::arrow) { + continue; + } + QListWidgetItem *buttonItem = new QListWidgetItem(m_buttonListView); + buttonItem->setIcon(Button::getIcon(t)); + buttonItem->setText(Button::getTypeName(t)); + buttonItem->setToolTip(Button::getTypeTooltip(t)); + if (m_listButtons.contains(i)) { + buttonItem->setCheckState(Qt::Checked); + } else { + buttonItem->setCheckState(Qt::Unchecked); + } + } +} + +void ConfigWindow::updateActiveButtons(QListWidgetItem *item) { + int buttonIndex = static_cast(Button::getTypeByName(item->text())); + if (item->checkState() == Qt::Checked) { + m_listButtons.append(buttonIndex); + } else { + m_listButtons.removeOne(buttonIndex); + } + QSettings().setValue("buttons", QVariant::fromValue(m_listButtons)); +} diff --git a/configwindow.h b/configwindow.h index 0eb090cf..c5803bcb 100644 --- a/configwindow.h +++ b/configwindow.h @@ -19,6 +19,9 @@ #define CONFIGURATION_H #include +class QListWidgetItem; + +class QListWidget; class ConfigWindow : public QWidget { Q_OBJECT @@ -26,9 +29,16 @@ public: explicit ConfigWindow(QWidget *parent = 0); +private: + void initButtonList(); + + QList m_listButtons; + QListWidget *m_buttonListView; + signals: -public slots: +private slots: + void updateActiveButtons(QListWidgetItem *); }; #endif // CONFIGURATION_H diff --git a/controller.cpp b/controller.cpp index 5441d484..5f8ae265 100644 --- a/controller.cpp +++ b/controller.cpp @@ -32,6 +32,9 @@ Controller::Controller(QObject *parent) : QObject(parent) { createTrayIcon(); m_trayIcon->show(); + // required for the button serialization + qRegisterMetaTypeStreamOperators >("QList"); + m_nativeEventFilter = new NativeEventFilter(this); qApp->installNativeEventFilter(m_nativeEventFilter); connect(m_nativeEventFilter, &NativeEventFilter::activated, this, &Controller::slotPrintHotkey);