Changeset View
Standalone View
ui/pageview.cpp
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Line(s) | |||||
58 | #include <krun.h> | 58 | #include <krun.h> | ||
59 | 59 | | |||
60 | // system includes | 60 | // system includes | ||
61 | #include <math.h> | 61 | #include <math.h> | ||
62 | #include <stdlib.h> | 62 | #include <stdlib.h> | ||
63 | 63 | | |||
64 | // local includes | 64 | // local includes | ||
65 | #include "debug_ui.h" | 65 | #include "debug_ui.h" | ||
66 | #include "part.h" | ||||
66 | #include "formwidgets.h" | 67 | #include "formwidgets.h" | ||
67 | #include "pageviewutils.h" | 68 | #include "pageviewutils.h" | ||
68 | #include "pagepainter.h" | 69 | #include "pagepainter.h" | ||
69 | #include "core/annotations.h" | 70 | #include "core/annotations.h" | ||
70 | #include "annotwindow.h" | 71 | #include "annotwindow.h" | ||
71 | #include "guiutils.h" | 72 | #include "guiutils.h" | ||
72 | #include "annotationpopup.h" | 73 | #include "annotationpopup.h" | ||
73 | #include "pageviewannotator.h" | 74 | #include "pageviewannotator.h" | ||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Line(s) | 111 | struct TableSelectionPart { | |||
115 | TableSelectionPart(PageViewItem * item_p, const Okular::NormalizedRect &rectInItem_p, const Okular::NormalizedRect &rectInSelection_p); | 116 | TableSelectionPart(PageViewItem * item_p, const Okular::NormalizedRect &rectInItem_p, const Okular::NormalizedRect &rectInSelection_p); | ||
116 | }; | 117 | }; | ||
117 | 118 | | |||
118 | TableSelectionPart::TableSelectionPart( PageViewItem * item_p, const Okular::NormalizedRect &rectInItem_p, const Okular::NormalizedRect &rectInSelection_p) | 119 | TableSelectionPart::TableSelectionPart( PageViewItem * item_p, const Okular::NormalizedRect &rectInItem_p, const Okular::NormalizedRect &rectInSelection_p) | ||
119 | : item ( item_p ), rectInItem (rectInItem_p), rectInSelection (rectInSelection_p) | 120 | : item ( item_p ), rectInItem (rectInItem_p), rectInSelection (rectInSelection_p) | ||
120 | { | 121 | { | ||
121 | } | 122 | } | ||
122 | 123 | | |||
124 | /** | ||||
125 | * @brief A KActionMenu, with puts a checkable QToolButton into the toolbar, without being checkable itself. | ||||
126 | * | ||||
127 | * By default, the toolbar button will have the popupMode @c MenuButtonPopup, so it can be used as a checkable menu button. | ||||
128 | * Clicking the middle of the button will trigger its default action. | ||||
129 | * When the default action becomes checked, the button will be painted pressed. | ||||
130 | * Clicking the arrow in the corner of the button, will open the menu. | ||||
131 | * | ||||
132 | * The purpose is the Color Mode menu, which shall have a checkable toolbar button, | ||||
133 | * without being checkable itself when plugged as submenu into the menubar. | ||||
134 | * | ||||
135 | * setDefaultAction() is reimplemented, so the default action is passed to the toolbar button, | ||||
136 | * whitout making this menu checkable. | ||||
137 | * Clicking the toolbar button will trigger the default action, | ||||
138 | * and setting the default action checked will just paint the toolbar button pressed. | ||||
139 | * Instead, clicking the toolbar button will trigger the default action. | ||||
140 | * | ||||
141 | * @note | ||||
142 | * Besides @c checkable and @c checked, any other parameters will also be disconnected. | ||||
143 | * This means, they are not synchonized with any default action. | ||||
144 | * Parameters, which are usually synchronized with the default action include: | ||||
145 | * - @c enabled | ||||
146 | * - @c font | ||||
147 | * - @c icon | ||||
148 | * - @c statusTip | ||||
149 | * - @c text | ||||
150 | * These parameters would have affected the toolbar button, so change the parameters of the default action instead: | ||||
151 | * - @c popupMode | ||||
152 | * - @c toolTip | ||||
153 | * - @c whatsThis | ||||
154 | * Because KActionMenu inherits QAction, all getters and setters for these parameters are still available. | ||||
155 | */ | ||||
156 | class CheckableActionMenu : public KActionMenu | ||||
157 | { | ||||
158 | public: | ||||
159 | explicit CheckableActionMenu( QWidget * parent ); | ||||
160 | CheckableActionMenu( const QString &text, QWidget * parent ); | ||||
161 | /** | ||||
162 | * These are the usual constructors for KActionMenu. | ||||
163 | * | ||||
164 | * @note | ||||
165 | * @p text and @p icon are used only if this menu is a submenu in another menu. | ||||
166 | * To set the text and icon of the toolbar button, modify the default action. | ||||
167 | * | ||||
168 | * @param text as visible inside other menus. | ||||
169 | * @param icon as visible inside other menus. | ||||
170 | */ | ||||
171 | CheckableActionMenu( const QIcon &icon, const QString &text, QWidget * parent ); | ||||
172 | | ||||
173 | QWidget * createWidget( QWidget * parent ) override; | ||||
174 | | ||||
175 | /** | ||||
176 | * Returns the default action of the toolbar button. | ||||
177 | * This menu does not have an own default action, the button handles that itself. | ||||
178 | */ | ||||
179 | QAction * defaultAction(); | ||||
180 | | ||||
181 | /** | ||||
182 | * Sets the default action of the toolbar button. | ||||
183 | * | ||||
184 | * @param action will be triggered when the button is clicked, without triggering this menu. | ||||
185 | * By purpose of this class, @p action should be checkable. | ||||
186 | */ | ||||
187 | void setDefaultAction( QAction * action ); | ||||
188 | | ||||
189 | private: | ||||
190 | QToolButton * m_button; | ||||
191 | QAction * m_defaultAction; | ||||
192 | }; | ||||
193 | | ||||
194 | CheckableActionMenu::CheckableActionMenu( QWidget * parent ) | ||||
195 | : KActionMenu( parent ), m_button( nullptr ), m_defaultAction( nullptr ) | ||||
196 | { | ||||
197 | } | ||||
198 | | ||||
199 | CheckableActionMenu::CheckableActionMenu( const QString &text, QWidget * parent ) | ||||
200 | : KActionMenu( text, parent ), m_button( nullptr ), m_defaultAction( nullptr ) | ||||
201 | { | ||||
202 | } | ||||
203 | | ||||
204 | CheckableActionMenu::CheckableActionMenu( const QIcon &icon, const QString &text, QWidget * parent ) | ||||
205 | : KActionMenu( icon, text, parent ), m_button( nullptr ), m_defaultAction( nullptr ) | ||||
206 | { | ||||
207 | } | ||||
208 | | ||||
209 | QWidget * CheckableActionMenu::createWidget( QWidget * parent ) | ||||
210 | { | ||||
211 | QToolButton * button = qobject_cast< QToolButton * >( KActionMenu::createWidget( parent ) ); | ||||
212 | if ( !button ) { | ||||
213 | // This function is used to add a button into the toolbar. | ||||
214 | // KActionMenu will plug itself as QToolButton. | ||||
215 | // So, if no QToolButton was returned, this was not called the intended way. | ||||
216 | return button; | ||||
217 | } | ||||
218 | | ||||
219 | m_button = button; | ||||
220 | | ||||
221 | m_button->setPopupMode( QToolButton::MenuButtonPopup ); | ||||
222 | | ||||
223 | if ( m_defaultAction ) { | ||||
224 | setDefaultAction( m_defaultAction ); | ||||
225 | } | ||||
226 | | ||||
227 | return button; | ||||
228 | } | ||||
229 | | ||||
230 | void CheckableActionMenu::setDefaultAction( QAction * action ) | ||||
231 | { | ||||
232 | if ( m_button ) { | ||||
233 | m_button->setDefaultAction( action ); | ||||
234 | | ||||
235 | // The button shall continue to use this menu as popup menu, even if the default action is changed. | ||||
236 | m_button->setMenu( menu() ); | ||||
237 | } | ||||
238 | | ||||
239 | m_defaultAction = action; | ||||
240 | | ||||
241 | // TODO The QToolButton will check whether the default action has a menu and will show that instead. | ||||
242 | // Probably. See qtoolbutton.cpp:725 | ||||
243 | } | ||||
244 | | ||||
245 | QAction * CheckableActionMenu::defaultAction() | ||||
246 | { | ||||
247 | return m_defaultAction; | ||||
248 | } | ||||
249 | | ||||
123 | // structure used internally by PageView for data storage | 250 | // structure used internally by PageView for data storage | ||
124 | class PageViewPrivate | 251 | class PageViewPrivate | ||
125 | { | 252 | { | ||
126 | public: | 253 | public: | ||
127 | PageViewPrivate( PageView *qq ); | 254 | PageViewPrivate( PageView *qq ); | ||
128 | 255 | | |||
129 | FormWidgetsController* formWidgetsController(); | 256 | FormWidgetsController* formWidgetsController(); | ||
130 | #ifdef HAVE_SPEECH | 257 | #ifdef HAVE_SPEECH | ||
▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Line(s) | 318 | #endif | |||
224 | QAction * aZoomIn; | 351 | QAction * aZoomIn; | ||
225 | QAction * aZoomOut; | 352 | QAction * aZoomOut; | ||
226 | QAction * aZoomActual; | 353 | QAction * aZoomActual; | ||
227 | KToggleAction * aZoomFitWidth; | 354 | KToggleAction * aZoomFitWidth; | ||
228 | KToggleAction * aZoomFitPage; | 355 | KToggleAction * aZoomFitPage; | ||
229 | KToggleAction * aZoomAutoFit; | 356 | KToggleAction * aZoomAutoFit; | ||
230 | KActionMenu * aViewMode; | 357 | KActionMenu * aViewMode; | ||
231 | KToggleAction * aViewContinuous; | 358 | KToggleAction * aViewContinuous; | ||
359 | CheckableActionMenu * aColorModeMenu; | ||||
360 | QAction * aEnableColorModes; | ||||
232 | QAction * aPrevAction; | 361 | QAction * aPrevAction; | ||
233 | QAction * aToggleForms; | 362 | QAction * aToggleForms; | ||
234 | QAction * aSpeakDoc; | 363 | QAction * aSpeakDoc; | ||
235 | QAction * aSpeakPage; | 364 | QAction * aSpeakPage; | ||
236 | QAction * aSpeakStop; | 365 | QAction * aSpeakStop; | ||
237 | KActionCollection * actionCollection; | 366 | KActionCollection * actionCollection; | ||
238 | QActionGroup * mouseModeActionGroup; | 367 | QActionGroup * mouseModeActionGroup; | ||
239 | QAction * aFitWindowToPage; | 368 | QAction * aFitWindowToPage; | ||
▲ Show 20 Lines • Show All 243 Lines • ▼ Show 20 Line(s) | 601 | { | |||
483 | d->aZoomIn = KStandardAction::zoomIn( this, SLOT(slotZoomIn()), ac ); | 612 | d->aZoomIn = KStandardAction::zoomIn( this, SLOT(slotZoomIn()), ac ); | ||
484 | 613 | | |||
485 | d->aZoomOut = KStandardAction::zoomOut( this, SLOT(slotZoomOut()), ac ); | 614 | d->aZoomOut = KStandardAction::zoomOut( this, SLOT(slotZoomOut()), ac ); | ||
486 | 615 | | |||
487 | d->aZoomActual = KStandardAction::actualSize( this, &PageView::slotZoomActual, ac ); | 616 | d->aZoomActual = KStandardAction::actualSize( this, &PageView::slotZoomActual, ac ); | ||
488 | d->aZoomActual->setText(i18n("Zoom to 100%")); | 617 | d->aZoomActual->setText(i18n("Zoom to 100%")); | ||
489 | } | 618 | } | ||
490 | 619 | | |||
491 | void PageView::setupViewerActions( KActionCollection * ac ) | 620 | void PageView::setupViewerActions( KActionCollection * ac, Okular::Part * part ) | ||
492 | { | 621 | { | ||
493 | d->actionCollection = ac; | 622 | d->actionCollection = ac; | ||
494 | 623 | | |||
495 | ac->setDefaultShortcut(d->aZoomIn, QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Plus)); | 624 | ac->setDefaultShortcut(d->aZoomIn, QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Plus)); | ||
496 | ac->setDefaultShortcut(d->aZoomOut, QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Minus)); | 625 | ac->setDefaultShortcut(d->aZoomOut, QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Minus)); | ||
497 | 626 | | |||
498 | // orientation menu actions | 627 | // orientation menu actions | ||
499 | d->aRotateClockwise = new QAction( QIcon::fromTheme( QStringLiteral("object-rotate-right") ), i18n( "Rotate &Right" ), this ); | 628 | d->aRotateClockwise = new QAction( QIcon::fromTheme( QStringLiteral("object-rotate-right") ), i18n( "Rotate &Right" ), this ); | ||
▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Line(s) | 713 | #undef ADD_VIEWMODE_ACTION | |||
604 | ac->addAction(QStringLiteral("mouse_zoom"), mz ); | 733 | ac->addAction(QStringLiteral("mouse_zoom"), mz ); | ||
605 | connect( mz, &QAction::triggered, this, &PageView::slotSetMouseZoom ); | 734 | connect( mz, &QAction::triggered, this, &PageView::slotSetMouseZoom ); | ||
606 | mz->setIconText( i18nc( "Zoom Tool", "Zoom" ) ); | 735 | mz->setIconText( i18nc( "Zoom Tool", "Zoom" ) ); | ||
607 | mz->setCheckable( true ); | 736 | mz->setCheckable( true ); | ||
608 | ac->setDefaultShortcut(mz, QKeySequence(Qt::CTRL + Qt::Key_2)); | 737 | ac->setDefaultShortcut(mz, QKeySequence(Qt::CTRL + Qt::Key_2)); | ||
609 | mz->setActionGroup( d->mouseModeActionGroup ); | 738 | mz->setActionGroup( d->mouseModeActionGroup ); | ||
610 | mz->setChecked( Okular::Settings::mouseMode() == Okular::Settings::EnumMouseMode::Zoom ); | 739 | mz->setChecked( Okular::Settings::mouseMode() == Okular::Settings::EnumMouseMode::Zoom ); | ||
611 | 740 | | |||
612 | QAction * aToggleChangeColors = new QAction(i18n("&Toggle Change Colors"), this); | 741 | // Change Colors action menu | ||
613 | ac->addAction(QStringLiteral("toggle_change_colors"), aToggleChangeColors ); | 742 | d->aColorModeMenu = new CheckableActionMenu( QIcon::fromTheme( QStringLiteral("color-management") ), i18n( "&Color Mode" ), this ); | ||
davidhurka: Which would be a good accelerator for “Change Colors”? | |||||
614 | connect( aToggleChangeColors, &QAction::triggered, this, &PageView::slotToggleChangeColors ); | 743 | connect( d->aColorModeMenu, &QAction::triggered, this, &PageView::slotSetChangeColors ); | ||
744 | // Add the menu to the action collection, so it can be plugged into the tool bar. | ||||
745 | // It will not confuse the Configure Shortcuts dialog, because KActionMenu does not accept a shortcut. | ||||
746 | ac->addAction( QStringLiteral( "color_mode_menu"), d->aColorModeMenu ); | ||||
747 | | ||||
748 | d->aEnableColorModes = new QAction( i18nc( "@item:inmenu color mode", "&Enable Color Changing" ), this ); | ||||
749 | d->aEnableColorModes->setCheckable( true ); | ||||
750 | d->aEnableColorModes->setChecked( Okular::SettingsCore::changeColors() ); | ||||
751 | ac->addAction( QStringLiteral( "enable_color_modes"), d->aEnableColorModes ); | ||||
752 | d->aColorModeMenu->addAction( d->aEnableColorModes ); | ||||
753 | d->aColorModeMenu->setDefaultAction( d->aEnableColorModes ); | ||||
754 | connect( d->aEnableColorModes, &QAction::triggered, [=] (bool checked) { qDebug() << "enable_color_modes triggered, now" << checked; } ); | ||||
755 | connect( d->aColorModeMenu, &QAction::triggered, [=] (bool checked) { qDebug() << "color_mode_menu triggered, now" << checked; } ); | ||||
756 | | ||||
757 | d->aColorModeMenu->addSeparator(); | ||||
758 | QActionGroup * cmGroup = new QActionGroup( this ); | ||||
759 | auto addColorMode = [=] ( QAction * a, QString name, Okular::SettingsCore::EnumRenderMode::type id ) { | ||||
760 | a->setCheckable( true ); | ||||
761 | a->setData( int( id ) ); | ||||
Can I use Okular::SettingsCore::EnumRenderMode::type somehow for the action data, without casting it to int? davidhurka: Can I use Okular::SettingsCore::EnumRenderMode::type somehow for the action data, without… | |||||
762 | d->aColorModeMenu->addAction( a ); | ||||
763 | ac->addAction( name, a ); | ||||
I want to avoid function-like macros. Can I just add a private method instead? davidhurka: I want to avoid function-like macros. Can I just add a private method instead? | |||||
davidre: You could use a lambda instead | |||||
That is, I assign a lambda function to a locale auto variable, and “call” the variable? (I’m new to lambda, so I will try that.) davidhurka: That is, I assign a lambda function to a locale `auto` variable, and “call” the variable? (I’m… | |||||
davidre: Exactly! | |||||
764 | cmGroup->addAction( a ); | ||||
765 | }; | ||||
766 | QAction * tmpAction = new QAction( i18nc( "@item:inmenu color mode", "&Invert Colors" ), this ); | ||||
767 | addColorMode( tmpAction, | ||||
768 | "color_mode_inverted", Okular::SettingsCore::EnumRenderMode::Inverted ); | ||||
769 | connect( tmpAction, &QAction::triggered, [=] (bool checked) { qDebug() << "color_mode_inverted triggered, now" << checked; } ); | ||||
770 | tmpAction = new QAction( i18nc( "@item:inmenu color mode", "Change &Paper Color" ), this ); | ||||
771 | addColorMode( tmpAction, | ||||
772 | "color_mode_paper", Okular::SettingsCore::EnumRenderMode::Paper ); | ||||
773 | connect( tmpAction, &QAction::triggered, [=] (bool checked) { qDebug() << "color_mode_paper triggered, now" << checked; } ); | ||||
774 | tmpAction = new QAction( i18nc( "@item:inmenu color mode", "Change &Dark && Light Colors" ), this ); | ||||
775 | addColorMode( tmpAction, | ||||
776 | "color_mode_recolor", Okular::SettingsCore::EnumRenderMode::Recolor ); | ||||
777 | connect( tmpAction, &QAction::triggered, [=] (bool checked) { qDebug() << "color_mode_recolor triggered, now" << checked; } ); | ||||
778 | tmpAction = new QAction( i18nc( "@item:inmenu color mode", "Convert to &Black && White" ), this ); | ||||
779 | addColorMode( tmpAction, | ||||
780 | "color_mode_black_white", Okular::SettingsCore::EnumRenderMode::BlackWhite ); | ||||
781 | connect( tmpAction, &QAction::triggered, [=] (bool checked) { qDebug() << "color_mode_black_white triggered, now" << checked; } ); | ||||
782 | | ||||
783 | const int rm = Okular::SettingsCore::renderMode(); | ||||
784 | for ( QAction * a : cmGroup->actions() ) | ||||
785 | { | ||||
786 | if ( a->data().toInt() == rm ) | ||||
787 | { | ||||
788 | a->setChecked( true ); | ||||
789 | break; | ||||
790 | } | ||||
791 | } | ||||
792 | | ||||
793 | connect( cmGroup, &QActionGroup::triggered, this, &PageView::slotSetChangeColorsMode ); | ||||
794 | | ||||
795 | d->aColorModeMenu->addSeparator(); | ||||
796 | QAction * aConfigure = new QAction( i18nc( "@item:inmenu color mode", "C&onfigure..." ), this ); | ||||
797 | d->aColorModeMenu->addAction( aConfigure ); | ||||
798 | connect( aConfigure, &QAction::triggered, part, &Okular::Part::slotAccessibilityPreferences ); | ||||
davidhurka: Unicode ellipsis … instead of periods ... ? | |||||
GB_2: No, we always use three dots.
This item should have the `configure` icon BTW. | |||||
davidhurka: Ok I’ll add that. | |||||
615 | } | 799 | } | ||
616 | 800 | | |||
617 | // WARNING: 'setupViewerActions' must have been called before this method | 801 | // WARNING: 'setupViewerActions' must have been called before this method | ||
618 | void PageView::setupActions( KActionCollection * ac ) | 802 | void PageView::setupActions( KActionCollection * ac ) | ||
619 | { | 803 | { | ||
620 | d->actionCollection = ac; | 804 | d->actionCollection = ac; | ||
621 | 805 | | |||
622 | ac->setDefaultShortcuts(d->aZoomIn, KStandardShortcut::zoomIn()); | 806 | ac->setDefaultShortcuts(d->aZoomIn, KStandardShortcut::zoomIn()); | ||
▲ Show 20 Lines • Show All 4879 Lines • ▼ Show 20 Line(s) | 5649 | { | |||
5502 | }; | 5686 | }; | ||
5503 | } | 5687 | } | ||
5504 | 5688 | | |||
5505 | void PageView::slotSetChangeColors(bool active) | 5689 | void PageView::slotSetChangeColors(bool active) | ||
5506 | { | 5690 | { | ||
5507 | Okular::SettingsCore::setChangeColors(active); | 5691 | Okular::SettingsCore::setChangeColors(active); | ||
5508 | Okular::Settings::self()->save(); | 5692 | Okular::Settings::self()->save(); | ||
5509 | viewport()->update(); | 5693 | viewport()->update(); | ||
5694 | d->aEnableColorModes->setChecked( active ); | ||||
5695 | d->aColorModeMenu->setChecked( active ); | ||||
5510 | } | 5696 | } | ||
5511 | 5697 | | |||
5512 | void PageView::slotToggleChangeColors() | 5698 | void PageView::slotToggleChangeColors() | ||
5513 | { | 5699 | { | ||
5514 | slotSetChangeColors( !Okular::SettingsCore::changeColors() ); | 5700 | slotSetChangeColors( !Okular::SettingsCore::changeColors() ); | ||
5515 | } | 5701 | } | ||
5516 | 5702 | | |||
5703 | void PageView::slotSetChangeColorsMode( QAction * action ) | ||||
Just discovered that the existing slots (slotToggleChangeColors(), slotSetChangeColors(bool)) are exposed to D-Bus through Okular::Part. Probably, there should be another slot slotSetChangeColorsMode(QString or similar) to set the color mode from D-Bus. Exposing this slot to D-Bus makes little sense, because of the QAction* parameter. davidhurka: Just discovered that the existing slots (slotToggleChangeColors(), slotSetChangeColors(bool))… | |||||
5704 | { | ||||
5705 | const int rm = action->data().toInt(); | ||||
5706 | if ( Okular::SettingsCore::renderMode() == rm ) | ||||
5707 | { | ||||
5708 | // Assigning a shortcut to a color mode only makes sense if it can toggle the feature on and off. | ||||
5709 | slotToggleChangeColors(); | ||||
This toggles Change Colors on and off, if the same shortcut e. g. for Invert Colors is triggered twice. But it also toggles if an already selected mode is clicked in the menu. Is that OK? davidhurka: This toggles Change Colors on and off, if the same shortcut e. g. for Invert Colors is… | |||||
5710 | } | ||||
5711 | else | ||||
5712 | { | ||||
5713 | Okular::SettingsCore::setRenderMode( rm ); | ||||
5714 | slotSetChangeColors( true ); | ||||
5715 | } | ||||
5716 | } | ||||
5717 | | ||||
5517 | void PageView::slotFitWindowToPage() | 5718 | void PageView::slotFitWindowToPage() | ||
5518 | { | 5719 | { | ||
5519 | const PageViewItem *currentPageItem = nullptr; | 5720 | const PageViewItem *currentPageItem = nullptr; | ||
5520 | QSize viewportSize = viewport()->size(); | 5721 | QSize viewportSize = viewport()->size(); | ||
5521 | foreach ( const PageViewItem * pageItem, d->items ) | 5722 | foreach ( const PageViewItem * pageItem, d->items ) | ||
5522 | { | 5723 | { | ||
5523 | if ( pageItem->isVisible() ) | 5724 | if ( pageItem->isVisible() ) | ||
5524 | { | 5725 | { | ||
▲ Show 20 Lines • Show All 56 Lines • Show Last 20 Lines |
Which would be a good accelerator for “Change Colors”?