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 }