okular/part/colormodemenu.cpp
2023-09-11 16:47:17 +02:00

140 lines
7.2 KiB
C++

/*
SPDX-FileCopyrightText: 2019-2021 David Hurka <david.hurka@mailbox.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "colormodemenu.h"
#include <QActionGroup>
#include <KActionCollection>
#include <KLocalizedString>
#include <kwidgetsaddons_version.h> // TODO KF6: Remove, this was needed for KActionMenu::setPopupMode().
#include "gui/guiutils.h"
#include "settings.h"
ColorModeMenu::ColorModeMenu(KActionCollection *ac, QObject *parent)
: ToggleActionMenu(QIcon::fromTheme(QStringLiteral("color-management")), i18nc("@title:menu", "&Color Mode"), parent)
, m_colorModeActionGroup(new QActionGroup(this))
, m_aChangeColors(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-management")), i18nc("@action Change Colors feature toggle action", "Change Colors"), this))
{
setPopupMode(QToolButton::MenuButtonPopup);
Q_ASSERT_X(ac->action(QStringLiteral("color_mode_menu")) == nullptr, "ColorModeMenu", "ColorModeMenu constructed twice; color_mode_menu already in action collection.");
ac->addAction(QStringLiteral("color_mode_menu"), this);
// Normal Colors action.
m_aNormal = new KToggleAction(i18nc("@item:inmenu color mode", "&Normal Colors"), this);
ac->addAction(QStringLiteral("color_mode_normal"), m_aNormal);
addAction(m_aNormal);
m_colorModeActionGroup->addAction(m_aNormal);
// Other color mode actions.
auto addColorMode = [=](KToggleAction *a, const QString &name, Okular::SettingsCore::EnumRenderMode::type id) {
a->setData(int(id));
addAction(a);
ac->addAction(name, a);
m_colorModeActionGroup->addAction(a);
};
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("invertimage")), i18nc("@item:inmenu color mode", "&Invert Colors"), this), QStringLiteral("color_mode_inverted"), Okular::SettingsCore::EnumRenderMode::Inverted);
m_aPaperColor = new KToggleAction(i18nc("@item:inmenu color mode", "Change &Paper Color"), this);
addColorMode(m_aPaperColor, QStringLiteral("color_mode_paper"), Okular::SettingsCore::EnumRenderMode::Paper);
m_aDarkLight = new KToggleAction(i18nc("@item:inmenu color mode", "Change &Dark && Light Colors"), this);
addColorMode(m_aDarkLight, QStringLiteral("color_mode_recolor"), Okular::SettingsCore::EnumRenderMode::Recolor);
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-black-white")), i18nc("@item:inmenu color mode", "Convert to &Black && White"), this),
QStringLiteral("color_mode_black_white"),
Okular::SettingsCore::EnumRenderMode::BlackWhite);
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-invert-text")), i18nc("@item:inmenu color mode", "Invert &Lightness"), this),
QStringLiteral("color_mode_invert_lightness"),
Okular::SettingsCore::EnumRenderMode::InvertLightness);
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-invert-image")), i18nc("@item:inmenu color mode", "Invert L&uma (sRGB Linear)"), this),
QStringLiteral("color_mode_invert_luma_srgb"),
Okular::SettingsCore::EnumRenderMode::InvertLuma);
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-invert-image")), i18nc("@item:inmenu color mode", "Invert Luma (&Symmetric)"), this),
QStringLiteral("color_mode_invert_luma_symmetric"),
Okular::SettingsCore::EnumRenderMode::InvertLumaSymmetric);
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-hue-shift-positive")), i18nc("@item:inmenu color mode", "Shift Hue P&ositive"), this),
QStringLiteral("color_mode_hue_shift_positive"),
Okular::SettingsCore::EnumRenderMode::HueShiftPositive);
addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-hue-shift-negative")), i18nc("@item:inmenu color mode", "Shift Hue N&egative"), this),
QStringLiteral("color_mode_hue_shift_negative"),
Okular::SettingsCore::EnumRenderMode::HueShiftNegative);
// Add Configure Color Modes action.
addSeparator();
QAction *aConfigure = ac->action(QStringLiteral("options_configure_color_modes"));
Q_ASSERT_X(aConfigure, "ColorModeMenu", "options_configure_color_modes is not in the action collection.");
addAction(aConfigure);
connect(m_colorModeActionGroup, &QActionGroup::triggered, this, &ColorModeMenu::slotColorModeActionTriggered);
connect(Okular::SettingsCore::self(), &Okular::SettingsCore::colorModesChanged, this, &ColorModeMenu::slotConfigChanged);
connect(Okular::Settings::self(), &Okular::Settings::colorModesChanged2, this, &ColorModeMenu::slotConfigChanged);
connect(this, &QAction::changed, this, &ColorModeMenu::slotChanged);
// Allow to configure a toggle shortcut.
connect(m_aChangeColors, &QAction::toggled, this, &ColorModeMenu::slotSetChangeColors);
ac->addAction(QStringLiteral("color_mode_change_colors"), m_aChangeColors);
slotConfigChanged();
}
void ColorModeMenu::slotColorModeActionTriggered(QAction *action)
{
const int newRenderMode = action->data().toInt();
// Color mode toggles to normal when the currently checked mode is triggered.
// Normal mode is special, triggering it always enables normal mode.
// Otherwise, the triggered color mode is activated.
if (action == m_aNormal) {
Okular::SettingsCore::setChangeColors(false);
} else if (Okular::SettingsCore::renderMode() == newRenderMode) {
Okular::SettingsCore::setChangeColors(!Okular::SettingsCore::changeColors());
} else {
Okular::SettingsCore::setRenderMode(newRenderMode);
Okular::SettingsCore::setChangeColors(true);
}
Okular::SettingsCore::self()->save();
}
void ColorModeMenu::slotSetChangeColors(bool on)
{
Okular::SettingsCore::setChangeColors(on);
Okular::SettingsCore::self()->save();
}
void ColorModeMenu::slotConfigChanged()
{
// Check the current color mode action, and update the toolbar button default action
const int rm = Okular::SettingsCore::renderMode();
const QList<QAction *> colorModeActions = m_colorModeActionGroup->actions();
for (QAction *a : colorModeActions) {
if (a != m_aNormal && a->data().toInt() == rm) {
a->setChecked(true);
setDefaultAction(a);
break;
}
}
// If Change Colors is disabled, check Normal Colors instead
if (!Okular::SettingsCore::changeColors()) {
m_aNormal->setChecked(true);
}
// Update color icons
m_aPaperColor->setIcon(GuiUtils::createColorIcon(QList<QColor>() << Okular::Settings::paperColor(), QIcon::fromTheme(QStringLiteral("paper-color"))));
m_aDarkLight->setIcon(GuiUtils::createColorIcon(QList<QColor>() << Okular::Settings::recolorForeground() << Okular::Settings::recolorBackground(), QIcon::fromTheme(QStringLiteral("color-mode-black-white"))));
// Update toggle action
m_aChangeColors->setChecked(Okular::SettingsCore::changeColors());
}
void ColorModeMenu::slotChanged()
{
const bool enabled = isEnabled();
const QList<QAction *> colorModeActions = m_colorModeActionGroup->actions();
for (QAction *a : colorModeActions) {
a->setEnabled(enabled);
}
}