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 ¶meters = {}); 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