Changeset View
Changeset View
Standalone View
Standalone View
ui/toggleactionmenu.cpp
- This file was added.
1 | /*************************************************************************** | ||||
---|---|---|---|---|---|
2 | * Copyright (C) 2019 by David Hurka <david.hurka@mailbox.org> * | ||||
3 | * * | ||||
4 | * Inspired by and replacing toolaction.h by: * | ||||
5 | * Copyright (C) 2004-2006 by Albert Astals Cid <aacid@kde.org> * | ||||
6 | * * | ||||
7 | * This program is free software; you can redistribute it and/or modify * | ||||
8 | * it under the terms of the GNU General Public License as published by * | ||||
9 | * the Free Software Foundation; either version 2 of the License, or * | ||||
10 | * (at your option) any later version. * | ||||
11 | ***************************************************************************/ | ||||
12 | | ||||
13 | #include "toggleactionmenu.h" | ||||
14 | | ||||
15 | #include <QPointer> | ||||
16 | #include <QMenu> | ||||
17 | | ||||
18 | ToggleActionMenu::ToggleActionMenu( QObject * parent ) | ||||
19 | : ToggleActionMenu( QIcon(), QString(), parent ) | ||||
20 | { | ||||
21 | } | ||||
22 | | ||||
23 | ToggleActionMenu::ToggleActionMenu( const QString &text, QObject * parent ) | ||||
24 | : ToggleActionMenu( QIcon(), text, parent ) | ||||
25 | { | ||||
26 | } | ||||
27 | | ||||
28 | ToggleActionMenu::ToggleActionMenu( const QIcon &icon, | ||||
29 | const QString &text, | ||||
30 | QObject * parent, | ||||
31 | QToolButton::ToolButtonPopupMode popupMode, | ||||
32 | MenuLogic logic ) | ||||
33 | : KActionMenu( icon, text, parent ), | ||||
34 | m_defaultAction( nullptr ), | ||||
35 | m_suggestedDefaultAction( nullptr ), | ||||
36 | m_menuLogic( logic ) | ||||
37 | { | ||||
38 | connect( this, &QAction::changed, this, &ToggleActionMenu::updateButtons ); | ||||
39 | | ||||
40 | if ( popupMode == QToolButton::DelayedPopup ) | ||||
41 | { | ||||
42 | setDelayed( true ); | ||||
43 | } | ||||
44 | else if ( popupMode == QToolButton::InstantPopup ) | ||||
45 | { | ||||
46 | setDelayed( false ); | ||||
47 | setStickyMenu( true ); | ||||
48 | } | ||||
49 | else | ||||
50 | { | ||||
51 | setDelayed( false ); | ||||
52 | setStickyMenu( false ); | ||||
53 | } | ||||
54 | | ||||
55 | if ( logic & ImplicitDefaultAction ) | ||||
56 | { | ||||
57 | connect( menu(), &QMenu::triggered, this, &ToggleActionMenu::setDefaultAction ); | ||||
58 | } | ||||
59 | } | ||||
60 | | ||||
61 | QWidget * ToggleActionMenu::createWidget( QWidget * parent ) | ||||
62 | { | ||||
63 | QToolButton * button = qobject_cast< QToolButton * >( KActionMenu::createWidget( parent ) ); | ||||
64 | if ( !button ) { | ||||
65 | // This function is used to add a button into the toolbar. | ||||
66 | // KActionMenu will plug itself as QToolButton. | ||||
67 | // So, if no QToolButton was returned, this was not called the intended way. | ||||
68 | return button; | ||||
69 | } | ||||
70 | | ||||
71 | // Remove this menu action from the button, | ||||
72 | // so it doesn't compose a menu of this menu action and its own menu. | ||||
73 | button->removeAction( this ); | ||||
74 | // The button has lost the menu now, let it use the correct menu. | ||||
75 | button->setMenu( menu() ); | ||||
76 | | ||||
77 | m_buttons.append( QPointer< QToolButton >( button ) ); | ||||
78 | | ||||
79 | // Apply other properties to the button. | ||||
80 | updateButtons(); | ||||
81 | | ||||
82 | return button; | ||||
83 | } | ||||
84 | | ||||
85 | void ToggleActionMenu::setDefaultAction( QAction *action ) | ||||
86 | { | ||||
87 | m_defaultAction = action; | ||||
88 | updateButtons(); | ||||
89 | } | ||||
90 | | ||||
91 | void ToggleActionMenu::suggestDefaultAction( QAction *action ) | ||||
92 | { | ||||
93 | m_suggestedDefaultAction = action; | ||||
94 | } | ||||
95 | | ||||
96 | QAction * ToggleActionMenu::checkedAction() const | ||||
97 | { | ||||
98 | for ( QAction * a : menu()->actions() ) | ||||
99 | { | ||||
100 | if ( a->isChecked() ) | ||||
101 | { | ||||
102 | return a; | ||||
103 | } | ||||
104 | } | ||||
105 | return nullptr; | ||||
106 | } | ||||
107 | | ||||
108 | void ToggleActionMenu::updateButtons() | ||||
109 | { | ||||
110 | for ( QPointer< QToolButton > button : qAsConst( m_buttons ) ) | ||||
111 | { | ||||
112 | if ( button ) | ||||
113 | { | ||||
114 | button->setDefaultAction( defaultAction() ); | ||||
115 | | ||||
116 | // Override some properties of the default action, | ||||
117 | // where the property of this menu makes more sense. | ||||
118 | button->setEnabled( isEnabled() ); | ||||
119 | | ||||
120 | if (delayed()) | ||||
121 | { | ||||
122 | button->setPopupMode(QToolButton::DelayedPopup); | ||||
123 | } | ||||
124 | else if (stickyMenu()) | ||||
125 | { | ||||
126 | button->setPopupMode(QToolButton::InstantPopup); | ||||
127 | } | ||||
128 | else | ||||
129 | { | ||||
130 | button->setPopupMode(QToolButton::MenuButtonPopup); | ||||
131 | } | ||||
132 | } | ||||
133 | } | ||||
134 | } | ||||
135 | | ||||
136 | QAction * ToggleActionMenu::defaultAction() | ||||
137 | { | ||||
138 | if ( ( m_menuLogic & ImplicitDefaultAction ) && !m_defaultAction ) | ||||
139 | { | ||||
140 | m_defaultAction = checkedAction(); | ||||
141 | } | ||||
142 | if ( !m_defaultAction ) | ||||
143 | { | ||||
144 | m_defaultAction = m_suggestedDefaultAction; | ||||
145 | } | ||||
146 | return m_defaultAction; | ||||
147 | } |