1 /**************************************************************************
2 * Otter Browser: Web browser controlled by the user, not vice-versa.
3 * Copyright (C) 2013 - 2018 Michal Dutkiewicz aka Emdek <michal@emdek.pl>
4 * Copyright (C) 2014 - 2015 Piotr Wójcik <chocimier@tlen.pl>
5 * Copyright (C) 2015 Jan Bajer aka bajasoft <jbajer@gmail.com>
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 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 **************************************************************************/
21 
22 #ifndef OTTER_ACTIONSMANAGER_H
23 #define OTTER_ACTIONSMANAGER_H
24 
25 #include "AddonsManager.h"
26 
27 #include <QtCore/QVariantMap>
28 #include <QtGui/QIcon>
29 
30 namespace Otter
31 {
32 
33 class KeyboardProfile final : public Addon
34 {
35 public:
36 	enum LoadMode
37 	{
38 		StandardMode = 0,
39 		MetaDataOnlyMode,
40 		FullMode
41 	};
42 
43 	struct Action final
44 	{
45 		QVariantMap parameters;
46 		QVector<QKeySequence> shortcuts;
47 		int action = -1;
48 
49 		bool operator ==(const Action &other) const;
50 	};
51 
52 	explicit KeyboardProfile(const QString &identifier = {}, LoadMode mode = StandardMode);
53 
54 	void setTitle(const QString &title);
55 	void setDescription(const QString &description);
56 	void setAuthor(const QString &author);
57 	void setVersion(const QString &version);
58 	void setDefinitions(const QHash<int, QVector<Action> > &definitions);
59 	void setModified(bool isModified);
60 	QString getName() const override;
61 	QString getTitle() const override;
62 	QString getDescription() const override;
63 	QString getAuthor() const;
64 	QString getVersion() const override;
65 	QHash<int, QVector<Action> > getDefinitions() const;
66 	bool isModified() const;
67 	bool save();
68 
69 private:
70 	QString m_identifier;
71 	QString m_title;
72 	QString m_description;
73 	QString m_author;
74 	QString m_version;
75 	QHash<int, QVector<Action> > m_definitions;
76 	bool m_isModified;
77 };
78 
79 class ActionsManager final : public QObject
80 {
81 	Q_OBJECT
82 	Q_ENUMS(ActionIdentifier)
83 
84 public:
85 	enum ShortcutCheck
86 	{
87 		AllChecks = 0,
88 		DisallowSingleKeyShortcutCheck,
89 		DisallowStandardShortcutCheck
90 	};
91 
92 	enum GesturesContext
93 	{
94 		UnknownContext = 0,
95 		GenericContext
96 	};
97 
98 	enum TriggerType
99 	{
100 		UnknownTrigger = 0,
101 		KeyboardTrigger,
102 		MouseTrigger
103 	};
104 
105 	enum ActionIdentifier
106 	{
107 		RunMacroAction = 0,
108 		SetOptionAction,
109 		NewTabAction,
110 		NewTabPrivateAction,
111 		NewWindowAction,
112 		NewWindowPrivateAction,
113 		OpenAction,
114 		SaveAction,
115 		CloneTabAction,
116 		PeekTabAction,
117 		PinTabAction,
118 		DetachTabAction,
119 		MaximizeTabAction,
120 		MinimizeTabAction,
121 		RestoreTabAction,
122 		AlwaysOnTopTabAction,
123 		ClearTabHistoryAction,
124 		PurgeTabHistoryAction,
125 		MuteTabMediaAction,
126 		SuspendTabAction,
127 		CloseTabAction,
128 		CloseOtherTabsAction,
129 		ClosePrivateTabsAction,
130 		ClosePrivateTabsPanicAction,
131 		ReopenTabAction,
132 		MaximizeAllAction,
133 		MinimizeAllAction,
134 		RestoreAllAction,
135 		CascadeAllAction,
136 		TileAllAction,
137 		CloseWindowAction,
138 		ReopenWindowAction,
139 		SessionsAction,
140 		SaveSessionAction,
141 		OpenUrlAction,
142 		OpenLinkAction,
143 		OpenLinkInCurrentTabAction,
144 		OpenLinkInNewTabAction,
145 		OpenLinkInNewTabBackgroundAction,
146 		OpenLinkInNewWindowAction,
147 		OpenLinkInNewWindowBackgroundAction,
148 		OpenLinkInNewPrivateTabAction,
149 		OpenLinkInNewPrivateTabBackgroundAction,
150 		OpenLinkInNewPrivateWindowAction,
151 		OpenLinkInNewPrivateWindowBackgroundAction,
152 		CopyLinkToClipboardAction,
153 		BookmarkLinkAction,
154 		SaveLinkToDiskAction,
155 		SaveLinkToDownloadsAction,
156 		OpenSelectionAsLinkAction,
157 		OpenFrameAction,
158 		OpenFrameInCurrentTabAction,
159 		OpenFrameInNewTabAction,
160 		OpenFrameInNewTabBackgroundAction,
161 		CopyFrameLinkToClipboardAction,
162 		ReloadFrameAction,
163 		ViewFrameSourceAction,
164 		OpenImageAction,
165 		OpenImageInNewTabAction,
166 		OpenImageInNewTabBackgroundAction,
167 		SaveImageToDiskAction,
168 		CopyImageToClipboardAction,
169 		CopyImageUrlToClipboardAction,
170 		ReloadImageAction,
171 		ImagePropertiesAction,
172 		SaveMediaToDiskAction,
173 		CopyMediaUrlToClipboardAction,
174 		MediaControlsAction,
175 		MediaLoopAction,
176 		MediaPlayPauseAction,
177 		MediaMuteAction,
178 		MediaPlaybackRateAction,
179 		FillPasswordAction,
180 		GoAction,
181 		GoBackAction,
182 		GoForwardAction,
183 		GoToHistoryIndexAction,
184 		GoToPageAction,
185 		GoToHomePageAction,
186 		GoToParentDirectoryAction,
187 		RewindAction,
188 		FastForwardAction,
189 		RemoveHistoryIndexAction,
190 		StopAction,
191 		StopScheduledReloadAction,
192 		StopAllAction,
193 		ReloadAction,
194 		ReloadOrStopAction,
195 		ReloadAndBypassCacheAction,
196 		ReloadAllAction,
197 		ScheduleReloadAction,
198 		ContextMenuAction,
199 		UndoAction,
200 		RedoAction,
201 		CutAction,
202 		CopyAction,
203 		CopyPlainTextAction,
204 		CopyAddressAction,
205 		CopyToNoteAction,
206 		PasteAction,
207 		PasteAndGoAction,
208 		DeleteAction,
209 		SelectAllAction,
210 		UnselectAction,
211 		ClearAllAction,
212 		CheckSpellingAction,
213 		FindAction,
214 		FindNextAction,
215 		FindPreviousAction,
216 		QuickFindAction,
217 		SearchAction,
218 		CreateSearchAction,
219 		ZoomInAction,
220 		ZoomOutAction,
221 		ZoomOriginalAction,
222 		ScrollToStartAction,
223 		ScrollToEndAction,
224 		ScrollPageUpAction,
225 		ScrollPageDownAction,
226 		ScrollPageLeftAction,
227 		ScrollPageRightAction,
228 		StartDragScrollAction,
229 		StartMoveScrollAction,
230 		EndScrollAction,
231 		PrintAction,
232 		PrintPreviewAction,
233 		TakeScreenshotAction,
234 		ActivateAddressFieldAction,
235 		ActivateSearchFieldAction,
236 		ActivateContentAction,
237 		ActivatePreviouslyUsedTabAction,
238 		ActivateLeastRecentlyUsedTabAction,
239 		ActivateTabAction,
240 		ActivateTabOnLeftAction,
241 		ActivateTabOnRightAction,
242 		ActivateWindowAction,
243 		BookmarksAction,
244 		BookmarkPageAction,
245 		BookmarkAllOpenPagesAction,
246 		OpenBookmarkAction,
247 		QuickBookmarkAccessAction,
248 		CookiesAction,
249 		LoadPluginsAction,
250 		EnableJavaScriptAction,
251 		EnableReferrerAction,
252 		ViewSourceAction,
253 		InspectPageAction,
254 		InspectElementAction,
255 		WorkOfflineAction,
256 		FullScreenAction,
257 		ShowTabSwitcherAction,
258 		ShowToolBarAction,
259 		ShowMenuBarAction,
260 		ShowTabBarAction,
261 		ShowSidebarAction,
262 		ShowErrorConsoleAction,
263 		LockToolBarsAction,
264 		ResetToolBarsAction,
265 		ShowPanelAction,
266 		OpenPanelAction,
267 		ContentBlockingAction,
268 		HistoryAction,
269 		ClearHistoryAction,
270 		AddonsAction,
271 		NotesAction,
272 		PasswordsAction,
273 		TransfersAction,
274 		PreferencesAction,
275 		WebsitePreferencesAction,
276 		QuickPreferencesAction,
277 		ResetQuickPreferencesAction,
278 		WebsiteInformationAction,
279 		WebsiteCertificateInformationAction,
280 		SwitchApplicationLanguageAction,
281 		CheckForUpdatesAction,
282 		DiagnosticReportAction,
283 		AboutApplicationAction,
284 		AboutQtAction,
285 		ExitAction,
286 		OtherAction
287 	};
288 
289 	struct ActionDefinition final
290 	{
291 		enum ActionCategory
292 		{
293 			OtherCategory = 0,
294 			PageCategory,
295 			NavigationCategory,
296 			EditingCategory,
297 			LinkCategory,
298 			FrameCategory,
299 			ImageCategory,
300 			MediaCategory,
301 			BookmarkCategory,
302 			UserCategory
303 		};
304 
305 		enum ActionFlag
306 		{
307 			NoFlags = 0,
308 			IsEnabledFlag = 1,
309 			IsCheckableFlag = 2,
310 			IsDeprecatedFlag = 4,
311 			IsImmutableFlag = 8,
312 			RequiresParameters = 16
313 		};
314 
315 		Q_DECLARE_FLAGS(ActionFlags, ActionFlag)
316 
317 		enum ActionScope
318 		{
319 			OtherScope = 0,
320 			EditorScope,
321 			WindowScope,
322 			MainWindowScope,
323 			ApplicationScope
324 		};
325 
326 		struct Parameter final
327 		{
328 			QString name;
329 			QString title;
330 			bool isRequired;
331 		};
332 
333 		struct State final
334 		{
335 			QString text;
336 			QIcon icon;
337 			bool isEnabled = true;
338 			bool isChecked = false;
339 		};
340 
341 		QString description;
342 		State defaultState;
343 		QVector<Parameter> parameters;
344 		ActionFlags flags = IsEnabledFlag;
345 		ActionCategory category = OtherCategory;
346 		ActionScope scope = OtherScope;
347 		int identifier = -1;
348 
349 		QString getText(bool preferDescription = false) const
350 		{
351 			return QCoreApplication::translate("actions", ((preferDescription && !description.isEmpty()) ? description : defaultState.text).toUtf8().constData());
352 		}
353 
getDefaultStatefinal354 		State getDefaultState() const
355 		{
356 			State state(defaultState);
357 			state.text = getText(false);
358 
359 			return state;
360 		}
361 
isValidfinal362 		bool isValid() const
363 		{
364 			return (identifier >= 0);
365 		}
366 	};
367 
368 	static void createInstance();
369 	static void loadProfiles();
370 	static ActionsManager* getInstance();
371 	static QString createReport();
372 	static QString getActionName(int identifier);
373 	static QKeySequence getActionShortcut(int identifier, const QVariantMap &parameters = {});
374 	static QVector<ActionDefinition> getActionDefinitions();
375 	static QVector<KeyboardProfile::Action> getShortcutDefinitions();
376 	static ActionDefinition getActionDefinition(int identifier);
377 	static int getActionIdentifier(const QString &name);
378 	static bool isShortcutAllowed(const QKeySequence &shortcut, ShortcutCheck check = AllChecks, bool areSingleKeyShortcutsAllowed = true);
379 
380 protected:
381 	explicit ActionsManager(QObject *parent);
382 
383 	void timerEvent(QTimerEvent *event) override;
384 	static void registerAction(int identifier, const QString &text, const QString &description = {}, const QIcon &icon = {}, ActionDefinition::ActionScope scope = ActionDefinition::OtherScope, ActionDefinition::ActionFlags flags = ActionDefinition::IsEnabledFlag, ActionDefinition::ActionCategory category = ActionDefinition::OtherCategory);
385 
386 protected slots:
387 	void handleOptionChanged(int identifier);
388 
389 signals:
390 	void shortcutsChanged();
391 
392 private:
393 	int m_reloadTimer;
394 
395 	static ActionsManager *m_instance;
396 	static QMap<int, QVector<QKeySequence> > m_shortcuts;
397 	static QMultiMap<int, QPair<QVariantMap, QVector<QKeySequence> > > m_extraShortcuts;
398 	static QVector<QKeySequence> m_disallowedShortcuts;
399 	static QVector<ActionDefinition> m_definitions;
400 	static int m_actionIdentifierEnumerator;
401 };
402 
403 }
404 
405 Q_DECLARE_OPERATORS_FOR_FLAGS(Otter::ActionsManager::ActionDefinition::ActionFlags)
406 
407 #endif
408