diff --git a/src/core/sessionconfig.cpp b/src/core/sessionconfig.cpp index 179797c8..d3eeb324 100644 --- a/src/core/sessionconfig.cpp +++ b/src/core/sessionconfig.cpp @@ -396,7 +396,21 @@ const QStringList &SessionConfig::getQuickAccessFiles() const void SessionConfig::setQuickAccessFiles(const QStringList &p_files) { - updateConfig(m_quickAccessFiles, p_files, this); + QStringList files; + for (const auto &file : p_files) { + auto fi = file.trimmed(); + if (!fi.isEmpty()) { + files << fi; + } + } + updateConfig(m_quickAccessFiles, files, this); +} + +void SessionConfig::removeQuickAccessFile(const QString &p_file) +{ + if (m_quickAccessFiles.removeOne(p_file)) { + update(); + } } void SessionConfig::loadExternalPrograms(const QJsonObject &p_session) diff --git a/src/core/sessionconfig.h b/src/core/sessionconfig.h index 33092b4d..97af711d 100644 --- a/src/core/sessionconfig.h +++ b/src/core/sessionconfig.h @@ -128,6 +128,8 @@ namespace vnotex const QStringList &getQuickAccessFiles() const; void setQuickAccessFiles(const QStringList &p_files); + void removeQuickAccessFile(const QString &p_file); + const QVector &getExternalPrograms() const; const QVector &getHistory() const; diff --git a/src/data/core/core.qrc b/src/data/core/core.qrc index 334c0a3a..d813cd9a 100644 --- a/src/data/core/core.qrc +++ b/src/data/core/core.qrc @@ -76,6 +76,7 @@ icons/maximize.svg icons/maximize_restore.svg icons/close.svg + icons/delete.svg icons/stay_on_top.svg icons/outline_editor.svg icons/find_replace_editor.svg diff --git a/src/data/core/icons/delete.svg b/src/data/core/icons/delete.svg new file mode 100644 index 00000000..d4a0aeba --- /dev/null +++ b/src/data/core/icons/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/data/extra/themes/moonlight/interface.qss b/src/data/extra/themes/moonlight/interface.qss index dfcf28e8..0dde0f51 100644 --- a/src/data/extra/themes/moonlight/interface.qss +++ b/src/data/extra/themes/moonlight/interface.qss @@ -329,6 +329,23 @@ QMenu::indicator:exclusive:unchecked { QMenu::indicator:exclusive:checked { image: url(menu_radiobutton.svg); } + +/* QWidgetAction item */ +vnotex--LabelWithButtonsWidget { + background-color: @widgets#qmenu#bg; +} + +vnotex--LabelWithButtonsWidget:hover { + background-color: @widgets#qmenu#item#selected#bg; +} + +vnotex--LabelWithButtonsWidget QLabel { + color: @widgets#qmenu#fg; +} + +vnotex--LabelWithButtonsWidget QLabel:hover { + color: @widgets#qmenu#item#selected#fg; +} /* End QMenu */ QDialog { diff --git a/src/data/extra/themes/pure/interface.qss b/src/data/extra/themes/pure/interface.qss index dfcf28e8..0dde0f51 100644 --- a/src/data/extra/themes/pure/interface.qss +++ b/src/data/extra/themes/pure/interface.qss @@ -329,6 +329,23 @@ QMenu::indicator:exclusive:unchecked { QMenu::indicator:exclusive:checked { image: url(menu_radiobutton.svg); } + +/* QWidgetAction item */ +vnotex--LabelWithButtonsWidget { + background-color: @widgets#qmenu#bg; +} + +vnotex--LabelWithButtonsWidget:hover { + background-color: @widgets#qmenu#item#selected#bg; +} + +vnotex--LabelWithButtonsWidget QLabel { + color: @widgets#qmenu#fg; +} + +vnotex--LabelWithButtonsWidget QLabel:hover { + color: @widgets#qmenu#item#selected#fg; +} /* End QMenu */ QDialog { diff --git a/src/widgets/labelwithbuttonswidget.cpp b/src/widgets/labelwithbuttonswidget.cpp new file mode 100644 index 00000000..8f23eff8 --- /dev/null +++ b/src/widgets/labelwithbuttonswidget.cpp @@ -0,0 +1,82 @@ +#include "labelwithbuttonswidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace vnotex; + +LabelWithButtonsWidget::LabelWithButtonsWidget(const QString &p_label, Buttons p_buttons, QWidget *p_parent) + : QWidget(p_parent) +{ + setupUI(p_buttons); + + setLabel(p_label); +} + +void LabelWithButtonsWidget::setupUI(Buttons p_buttons) +{ + auto mainLayout = new QHBoxLayout(this); + + m_label = new QLabel(this); + mainLayout->addWidget(m_label); + + if (p_buttons & Button::Delete) { + auto btn = createButton(Button::Delete, this); + mainLayout->addWidget(btn); + } +} + +void LabelWithButtonsWidget::setLabel(const QString &p_label) +{ + m_label->setText(p_label); +} + +void LabelWithButtonsWidget::paintEvent(QPaintEvent *p_event) +{ + Q_UNUSED(p_event); + + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +} + +QToolButton *LabelWithButtonsWidget::createButton(Button p_button, QWidget *p_parent) +{ + auto btn = new QToolButton(p_parent); + QAction *act = nullptr; + switch (p_button) { + case Button::Delete: + act = new QAction(generateIcon(QStringLiteral("delete.svg")), tr("Delete"), p_parent); + break; + + default: + Q_ASSERT(false); + break; + } + + if (act) { + act->setData(static_cast(p_button)); + btn->setDefaultAction(act); + connect(btn, &QToolButton::triggered, + this, [this](QAction *p_act) { + emit triggered(static_cast