File indexing completed on 2024-04-28 15:51:42

0001 /*
0002     SPDX-FileCopyrightText: 2019-2021 David Hurka <david.hurka@mailbox.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "colormodemenu.h"
0008 
0009 #include <QActionGroup>
0010 
0011 #include <KActionCollection>
0012 #include <KLocalizedString>
0013 #include <kwidgetsaddons_version.h> // TODO KF6: Remove, this was needed for KActionMenu::setPopupMode().
0014 
0015 #include "gui/guiutils.h"
0016 #include "settings.h"
0017 
0018 ColorModeMenu::ColorModeMenu(KActionCollection *ac, QObject *parent)
0019     : ToggleActionMenu(QIcon::fromTheme(QStringLiteral("color-management")), i18nc("@title:menu", "&Color Mode"), parent)
0020     , m_colorModeActionGroup(new QActionGroup(this))
0021     , m_aChangeColors(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-management")), i18nc("@action Change Colors feature toggle action", "Change Colors"), this))
0022 {
0023     setPopupMode(QToolButton::MenuButtonPopup);
0024 
0025     Q_ASSERT_X(ac->action(QStringLiteral("color_mode_menu")) == nullptr, "ColorModeMenu", "ColorModeMenu constructed twice; color_mode_menu already in action collection.");
0026     ac->addAction(QStringLiteral("color_mode_menu"), this);
0027 
0028     // Normal Colors action.
0029     m_aNormal = new KToggleAction(i18nc("@item:inmenu color mode", "&Normal Colors"), this);
0030     ac->addAction(QStringLiteral("color_mode_normal"), m_aNormal);
0031     addAction(m_aNormal);
0032     m_colorModeActionGroup->addAction(m_aNormal);
0033 
0034     // Other color mode actions.
0035     auto addColorMode = [=](KToggleAction *a, const QString &name, Okular::SettingsCore::EnumRenderMode::type id) {
0036         a->setData(int(id));
0037         addAction(a);
0038         ac->addAction(name, a);
0039         m_colorModeActionGroup->addAction(a);
0040     };
0041     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("invertimage")), i18nc("@item:inmenu color mode", "&Invert Colors"), this), QStringLiteral("color_mode_inverted"), Okular::SettingsCore::EnumRenderMode::Inverted);
0042     m_aPaperColor = new KToggleAction(i18nc("@item:inmenu color mode", "Change &Paper Color"), this);
0043     addColorMode(m_aPaperColor, QStringLiteral("color_mode_paper"), Okular::SettingsCore::EnumRenderMode::Paper);
0044     m_aDarkLight = new KToggleAction(i18nc("@item:inmenu color mode", "Change &Dark && Light Colors"), this);
0045     addColorMode(m_aDarkLight, QStringLiteral("color_mode_recolor"), Okular::SettingsCore::EnumRenderMode::Recolor);
0046     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-black-white")), i18nc("@item:inmenu color mode", "Convert to &Black && White"), this),
0047                  QStringLiteral("color_mode_black_white"),
0048                  Okular::SettingsCore::EnumRenderMode::BlackWhite);
0049     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-invert-text")), i18nc("@item:inmenu color mode", "Invert &Lightness"), this),
0050                  QStringLiteral("color_mode_invert_lightness"),
0051                  Okular::SettingsCore::EnumRenderMode::InvertLightness);
0052     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-invert-image")), i18nc("@item:inmenu color mode", "Invert L&uma (sRGB Linear)"), this),
0053                  QStringLiteral("color_mode_invert_luma_srgb"),
0054                  Okular::SettingsCore::EnumRenderMode::InvertLuma);
0055     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-invert-image")), i18nc("@item:inmenu color mode", "Invert Luma (&Symmetric)"), this),
0056                  QStringLiteral("color_mode_invert_luma_symmetric"),
0057                  Okular::SettingsCore::EnumRenderMode::InvertLumaSymmetric);
0058     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-hue-shift-positive")), i18nc("@item:inmenu color mode", "Shift Hue P&ositive"), this),
0059                  QStringLiteral("color_mode_hue_shift_positive"),
0060                  Okular::SettingsCore::EnumRenderMode::HueShiftPositive);
0061     addColorMode(new KToggleAction(QIcon::fromTheme(QStringLiteral("color-mode-hue-shift-negative")), i18nc("@item:inmenu color mode", "Shift Hue N&egative"), this),
0062                  QStringLiteral("color_mode_hue_shift_negative"),
0063                  Okular::SettingsCore::EnumRenderMode::HueShiftNegative);
0064 
0065     // Add Configure Color Modes action.
0066     addSeparator();
0067     QAction *aConfigure = ac->action(QStringLiteral("options_configure_color_modes"));
0068     Q_ASSERT_X(aConfigure, "ColorModeMenu", "options_configure_color_modes is not in the action collection.");
0069     addAction(aConfigure);
0070 
0071     connect(m_colorModeActionGroup, &QActionGroup::triggered, this, &ColorModeMenu::slotColorModeActionTriggered);
0072     connect(Okular::SettingsCore::self(), &Okular::SettingsCore::colorModesChanged, this, &ColorModeMenu::slotConfigChanged);
0073     connect(Okular::Settings::self(), &Okular::Settings::colorModesChanged2, this, &ColorModeMenu::slotConfigChanged);
0074     connect(this, &QAction::changed, this, &ColorModeMenu::slotChanged);
0075 
0076     // Allow to configure a toggle shortcut.
0077     connect(m_aChangeColors, &QAction::toggled, this, &ColorModeMenu::slotSetChangeColors);
0078     ac->addAction(QStringLiteral("color_mode_change_colors"), m_aChangeColors);
0079 
0080     slotConfigChanged();
0081 }
0082 
0083 void ColorModeMenu::slotColorModeActionTriggered(QAction *action)
0084 {
0085     const int newRenderMode = action->data().toInt();
0086     // Color mode toggles to normal when the currently checked mode is triggered.
0087     // Normal mode is special, triggering it always enables normal mode.
0088     // Otherwise, the triggered color mode is activated.
0089     if (action == m_aNormal) {
0090         Okular::SettingsCore::setChangeColors(false);
0091     } else if (Okular::SettingsCore::renderMode() == newRenderMode) {
0092         Okular::SettingsCore::setChangeColors(!Okular::SettingsCore::changeColors());
0093     } else {
0094         Okular::SettingsCore::setRenderMode(newRenderMode);
0095         Okular::SettingsCore::setChangeColors(true);
0096     }
0097     Okular::SettingsCore::self()->save();
0098 }
0099 
0100 void ColorModeMenu::slotSetChangeColors(bool on)
0101 {
0102     Okular::SettingsCore::setChangeColors(on);
0103     Okular::SettingsCore::self()->save();
0104 }
0105 
0106 void ColorModeMenu::slotConfigChanged()
0107 {
0108     // Check the current color mode action, and update the toolbar button default action
0109     const int rm = Okular::SettingsCore::renderMode();
0110     const QList<QAction *> colorModeActions = m_colorModeActionGroup->actions();
0111     for (QAction *a : colorModeActions) {
0112         if (a != m_aNormal && a->data().toInt() == rm) {
0113             a->setChecked(true);
0114             setDefaultAction(a);
0115             break;
0116         }
0117     }
0118 
0119     // If Change Colors is disabled, check Normal Colors instead
0120     if (!Okular::SettingsCore::changeColors()) {
0121         m_aNormal->setChecked(true);
0122     }
0123 
0124     // Update color icons
0125     m_aPaperColor->setIcon(GuiUtils::createColorIcon(QList<QColor>() << Okular::Settings::paperColor(), QIcon::fromTheme(QStringLiteral("paper-color"))));
0126     m_aDarkLight->setIcon(GuiUtils::createColorIcon(QList<QColor>() << Okular::Settings::recolorForeground() << Okular::Settings::recolorBackground(), QIcon::fromTheme(QStringLiteral("color-mode-black-white"))));
0127 
0128     // Update toggle action
0129     m_aChangeColors->setChecked(Okular::SettingsCore::changeColors());
0130 }
0131 
0132 void ColorModeMenu::slotChanged()
0133 {
0134     const bool enabled = isEnabled();
0135     const QList<QAction *> colorModeActions = m_colorModeActionGroup->actions();
0136     for (QAction *a : colorModeActions) {
0137         a->setEnabled(enabled);
0138     }
0139 }