Doc for shortcuts
This commit is contained in:
parent
899fb0112f
commit
4a18a7df0d
|
@ -118,5 +118,157 @@ And enabled.
|
||||||
`OpenFromCalc` is options for open documents in calc, disable or enabled menu entry and icon toolbar.
|
`OpenFromCalc` is options for open documents in calc, disable or enabled menu entry and icon toolbar.
|
||||||
|
|
||||||
|
|
||||||
|
LibreOffice configuration
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Get value
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
Some values are read only.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
node_name = '/org.openoffice.Office.Common/Help'
|
||||||
|
key = 'System'
|
||||||
|
value = app.get_app_config(node_name, key)
|
||||||
|
app.debug(value)
|
||||||
|
|
||||||
|
node_name = '/org.openoffice.Office.Common/Misc/'
|
||||||
|
key = 'FirstRun'
|
||||||
|
value = app.get_app_config(node_name, key)
|
||||||
|
app.debug(value)
|
||||||
|
|
||||||
|
key = 'UseSystemFileDialog'
|
||||||
|
value = app.get_app_config(node_name, key)
|
||||||
|
app.debug(value)
|
||||||
|
|
||||||
|
|
||||||
|
Set value
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
node_name = '/org.openoffice.Office.UI/ColorScheme'
|
||||||
|
key = 'CurrentColorScheme'
|
||||||
|
new_value = 'LibreOffice Dark'
|
||||||
|
result = app.set_app_config(node_name, key, new_value)
|
||||||
|
app.debug(result)
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
Caution with modify registry, not all nodes we can change.
|
||||||
|
|
||||||
|
|
||||||
|
Shortcuts
|
||||||
|
---------
|
||||||
|
|
||||||
|
Global
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
Iter in all shortcuts. Shortcuts for all applications.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
for shortcut, command in app.shortcuts:
|
||||||
|
app.debug(shortcut, command)
|
||||||
|
|
||||||
|
|
||||||
|
If you want all info.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
data = sc.get_all()
|
||||||
|
app.debug(data)
|
||||||
|
|
||||||
|
|
||||||
|
Verify if exists shortcut.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
shortcut = 'Shift+Ctrl+Alt+T'
|
||||||
|
app.debug(shortcut in sc)
|
||||||
|
|
||||||
|
|
||||||
|
Add new shortcut for execute uno command.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
shortcut = 'Shift+Ctrl+Alt+T'
|
||||||
|
command = 'MacroDialog'
|
||||||
|
sc.set(shortcut, command)
|
||||||
|
|
||||||
|
|
||||||
|
Add new shortcut for execute macro.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
shortcut = 'Shift+Ctrl+Alt+M'
|
||||||
|
macro = {'library': 'test', 'name': 'main'}
|
||||||
|
sc.set(shortcut, macro)
|
||||||
|
|
||||||
|
|
||||||
|
Get `command` by `shortcut`.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
shortcut = 'Shift+Ctrl+Alt+M'
|
||||||
|
command = sc.get_by_shortcut(shortcut)
|
||||||
|
app.debug(command)
|
||||||
|
|
||||||
|
|
||||||
|
Get `shortcut` by `command`. Could be more than one.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
command = 'MacroDialog'
|
||||||
|
shortcuts = sc.get_by_command(command)
|
||||||
|
app.debug(shortcuts)
|
||||||
|
|
||||||
|
|
||||||
|
Remove by shortcut.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
shortcut = 'Shift+Ctrl+Alt+M'
|
||||||
|
sc.remove_by_shortcut(shortcut)
|
||||||
|
|
||||||
|
|
||||||
|
Remove by command.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts
|
||||||
|
macro = {'library': 'test', 'name': 'main'}
|
||||||
|
sc.remove_by_command(macro)
|
||||||
|
|
||||||
|
|
||||||
|
Reset all editions.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
app.shortcuts.reset()
|
||||||
|
|
||||||
|
|
||||||
|
For applications
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Get shortcuts for application. For Calc.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
sc = app.shortcuts['calc']
|
||||||
|
|
||||||
|
All methods some the same.
|
||||||
|
|
||||||
|
For other applications: `writer`, `draw`, `impress`, `math`
|
||||||
|
|
||||||
|
|
||||||
.. _dispatch command: https://wiki.documentfoundation.org/Development/DispatchCommands
|
.. _dispatch command: https://wiki.documentfoundation.org/Development/DispatchCommands
|
||||||
.. _support filters: https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html
|
.. _support filters: https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html
|
||||||
|
|
|
@ -61,6 +61,7 @@ from email import encoders
|
||||||
|
|
||||||
import uno
|
import uno
|
||||||
import unohelper
|
import unohelper
|
||||||
|
from com.sun.star.awt import Key, KeyEvent, KeyModifier
|
||||||
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS
|
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS
|
||||||
from com.sun.star.awt.MessageBoxResults import YES
|
from com.sun.star.awt.MessageBoxResults import YES
|
||||||
from com.sun.star.beans import PropertyValue, NamedValue
|
from com.sun.star.beans import PropertyValue, NamedValue
|
||||||
|
@ -68,6 +69,7 @@ from com.sun.star.datatransfer import XTransferable, DataFlavor
|
||||||
from com.sun.star.io import IOException, XOutputStream
|
from com.sun.star.io import IOException, XOutputStream
|
||||||
from com.sun.star.ui.dialogs import TemplateDescription
|
from com.sun.star.ui.dialogs import TemplateDescription
|
||||||
|
|
||||||
|
from com.sun.star.container import NoSuchElementException
|
||||||
|
|
||||||
# Global variables
|
# Global variables
|
||||||
OS = platform.system()
|
OS = platform.system()
|
||||||
|
@ -662,7 +664,7 @@ class Macro(object):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _get_url_script(cls, args: dict):
|
def get_url_script(cls, args: dict):
|
||||||
library = args['library']
|
library = args['library']
|
||||||
name = args['name']
|
name = args['name']
|
||||||
language = args.get('language', 'Python')
|
language = args.get('language', 'Python')
|
||||||
|
@ -682,7 +684,7 @@ class Macro(object):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _call(cls, args: dict):
|
def _call(cls, args: dict):
|
||||||
url = cls._get_url_script(args)
|
url = cls.get_url_script(args)
|
||||||
args = args.get('args', ())
|
args = args.get('args', ())
|
||||||
|
|
||||||
service = 'com.sun.star.script.provider.MasterScriptProviderFactory'
|
service = 'com.sun.star.script.provider.MasterScriptProviderFactory'
|
||||||
|
@ -2003,10 +2005,219 @@ class IOStream(object):
|
||||||
return cls.OutputStream()
|
return cls.OutputStream()
|
||||||
|
|
||||||
|
|
||||||
|
class LOShortCuts(object):
|
||||||
|
"""Classe for manager shortcuts"""
|
||||||
|
KEYS = {getattr(Key, k): k for k in dir(Key)}
|
||||||
|
MODIFIERS = {
|
||||||
|
'shift': KeyModifier.SHIFT,
|
||||||
|
'ctrl': KeyModifier.MOD1,
|
||||||
|
'alt': KeyModifier.MOD2,
|
||||||
|
'ctrlmac': KeyModifier.MOD3,
|
||||||
|
}
|
||||||
|
COMBINATIONS = {
|
||||||
|
0: '',
|
||||||
|
1: 'shift',
|
||||||
|
2: 'ctrl',
|
||||||
|
4: 'alt',
|
||||||
|
8: 'ctrlmac',
|
||||||
|
3: 'shift+ctrl',
|
||||||
|
5: 'shift+alt',
|
||||||
|
9: 'shift+ctrlmac',
|
||||||
|
6: 'ctrl+alt',
|
||||||
|
10: 'ctrl+ctrlmac',
|
||||||
|
12: 'alt+ctrlmac',
|
||||||
|
7: 'shift+ctrl+alt',
|
||||||
|
11: 'shift+ctrl+ctrlmac',
|
||||||
|
13: 'shift+alt+ctrlmac',
|
||||||
|
14: 'ctrl+alt+ctrlmac',
|
||||||
|
15: 'shift+ctrl+alt+ctrlmac',
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, app: str=''):
|
||||||
|
self._app = app
|
||||||
|
service = 'com.sun.star.ui.GlobalAcceleratorConfiguration'
|
||||||
|
if app:
|
||||||
|
service = 'com.sun.star.ui.ModuleUIConfigurationManagerSupplier'
|
||||||
|
type_app = LODocuments.TYPES[app]
|
||||||
|
manager = create_instance(service, True)
|
||||||
|
uicm = manager.getUIConfigurationManager(type_app)
|
||||||
|
self._config = uicm.ShortCutManager
|
||||||
|
else:
|
||||||
|
self._config = create_instance(service)
|
||||||
|
|
||||||
|
def __getitem__(self, index):
|
||||||
|
return LOShortCuts(index)
|
||||||
|
|
||||||
|
def __contains__(self, item):
|
||||||
|
cmd = self.get_by_shortcut(item)
|
||||||
|
return bool(cmd)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
self._i = -1
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
self._i += 1
|
||||||
|
try:
|
||||||
|
event = self._config.AllKeyEvents[self._i]
|
||||||
|
event = self._get_info(event)
|
||||||
|
except IndexError:
|
||||||
|
raise StopIteration
|
||||||
|
|
||||||
|
return event
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def to_key_event(cls, shortcut: str):
|
||||||
|
"""Convert from string shortcut (Shift+Ctrl+Alt+LETTER) to KeyEvent"""
|
||||||
|
key_event = KeyEvent()
|
||||||
|
keys = shortcut.split('+')
|
||||||
|
try:
|
||||||
|
for m in keys[:-1]:
|
||||||
|
key_event.Modifiers += cls.MODIFIERS[m.lower()]
|
||||||
|
key_event.KeyCode = getattr(Key, keys[-1].upper())
|
||||||
|
except Exception as e:
|
||||||
|
error(e)
|
||||||
|
key_event = None
|
||||||
|
return key_event
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_url_script(cls, command: Union[str, dict]) -> str:
|
||||||
|
"""Get uno command or url for macro"""
|
||||||
|
url = command
|
||||||
|
if isinstance(url, str) and not url.startswith('.uno:'):
|
||||||
|
url = f'.uno:{command}'
|
||||||
|
elif isinstance(url, dict):
|
||||||
|
url = Macro.get_url_script(command)
|
||||||
|
return url
|
||||||
|
|
||||||
|
def _get_shortcut(self, k):
|
||||||
|
"""Get shortcut for key event"""
|
||||||
|
# ~ print(k.KeyCode, str(k.KeyChar), k.KeyFunc, k.Modifiers)
|
||||||
|
shortcut = f'{self.COMBINATIONS[k.Modifiers]}+{self.KEYS[k.KeyCode]}'
|
||||||
|
return shortcut
|
||||||
|
|
||||||
|
def _get_info(self, key):
|
||||||
|
"""Get shortcut and command"""
|
||||||
|
cmd = self._config.getCommandByKeyEvent(key)
|
||||||
|
shortcut = self._get_shortcut(key)
|
||||||
|
return shortcut, cmd
|
||||||
|
|
||||||
|
def get_all(self):
|
||||||
|
"""Get all events key"""
|
||||||
|
events = [(self._get_info(k)) for k in self._config.AllKeyEvents]
|
||||||
|
return events
|
||||||
|
|
||||||
|
def get_by_command(self, command: Union[str, dict]):
|
||||||
|
"""Get shortcuts by command"""
|
||||||
|
url = LOShortCuts.get_url_script(command)
|
||||||
|
key_events = self._config.getKeyEventsByCommand(url)
|
||||||
|
shortcuts = [self._get_shortcut(k) for k in key_events]
|
||||||
|
return shortcuts
|
||||||
|
|
||||||
|
def get_by_shortcut(self, shortcut: str):
|
||||||
|
"""Get command by shortcut"""
|
||||||
|
command = ''
|
||||||
|
key_event = LOShortCuts.to_key_event(shortcut)
|
||||||
|
if key_event:
|
||||||
|
command = self._config.getCommandByKeyEvent(key_event)
|
||||||
|
return command
|
||||||
|
|
||||||
|
def set(self, shortcut: str, command: Union[str, dict]) -> bool:
|
||||||
|
"""Set shortcut to command
|
||||||
|
|
||||||
|
:param shortcut: Shortcut like Shift+Ctrl+Alt+LETTER
|
||||||
|
:type shortcut: str
|
||||||
|
:param command: Command tu assign, 'UNOCOMMAND' or dict with macro info
|
||||||
|
:type command: str or dict
|
||||||
|
:return: True if set sucesfully
|
||||||
|
:rtype: bool
|
||||||
|
"""
|
||||||
|
result = True
|
||||||
|
url = LOShortCuts.get_url_script(command)
|
||||||
|
key_event = LOShortCuts.to_key_event(shortcut)
|
||||||
|
try:
|
||||||
|
self._config.setKeyEvent(key_event, url)
|
||||||
|
self._config.store()
|
||||||
|
except Exception as e:
|
||||||
|
error(e)
|
||||||
|
result = False
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def remove_by_shortcut(self, shortcut: str):
|
||||||
|
"""Remove by shortcut"""
|
||||||
|
key_event = LOShortCuts.to_key_event(shortcut)
|
||||||
|
try:
|
||||||
|
self._config.removeKeyEvent(key_event)
|
||||||
|
result = True
|
||||||
|
except NoSuchElementException:
|
||||||
|
debug(f'No exists: {shortcut}')
|
||||||
|
result = False
|
||||||
|
return result
|
||||||
|
|
||||||
|
def remove_by_command(self, command: Union[str, dict]):
|
||||||
|
"""Remove by shortcut"""
|
||||||
|
url = LOShortCuts.get_url_script(command)
|
||||||
|
self._config.removeCommandFromAllKeyEvents(url)
|
||||||
|
return
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
"""Reset configuration"""
|
||||||
|
self._config.reset()
|
||||||
|
self._config.store()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class LOMenu(object):
|
||||||
|
NODE = 'private:resource/menubar/menubar'
|
||||||
|
MENUS = {
|
||||||
|
'file': '.uno:PickList',
|
||||||
|
'tools': '.uno:ToolsMenu',
|
||||||
|
'help': '.uno:HelpMenu',
|
||||||
|
'windows': '.uno:WindowList',
|
||||||
|
'edit': '.uno:EditMenu',
|
||||||
|
'view': '.uno:ViewMenu',
|
||||||
|
'insert': '.uno:InsertMenu',
|
||||||
|
'format': '.uno:FormatMenu',
|
||||||
|
'styles': '.uno:FormatStylesMenu',
|
||||||
|
'sheet': '.uno:SheetMenu',
|
||||||
|
'data': '.uno:DataMenu',
|
||||||
|
'table': '.uno:TableMenu',
|
||||||
|
'form': '.uno:FormatFormMenu',
|
||||||
|
'page': '.uno:PageMenu',
|
||||||
|
'shape': '.uno:ShapeMenu',
|
||||||
|
'slide': '.uno:SlideMenu',
|
||||||
|
'show': '.uno:SlideShowMenu',
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, app):
|
||||||
|
self._app = app
|
||||||
|
self._config = self._get_config()
|
||||||
|
self._menus = self._config.getSettings(self.NODE, True)
|
||||||
|
|
||||||
|
def _get_config(self):
|
||||||
|
service = 'com.sun.star.ui.ModuleUIConfigurationManagerSupplier'
|
||||||
|
type_app = LODocuments.TYPES[self._app]
|
||||||
|
manager = create_instance(service, True)
|
||||||
|
config = manager.getUIConfigurationManager(type_app)
|
||||||
|
return config
|
||||||
|
|
||||||
|
def debug(self):
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class LOMenus(object):
|
||||||
|
"""Classe for manager menus"""
|
||||||
|
|
||||||
|
def __getitem__(self, index):
|
||||||
|
return LOMenu(index)
|
||||||
|
|
||||||
|
|
||||||
class LOMain():
|
class LOMain():
|
||||||
"""Classe for LibreOffice"""
|
"""Classe for LibreOffice"""
|
||||||
|
|
||||||
class _commands():
|
class commands():
|
||||||
"""Class for disable and enable commands
|
"""Class for disable and enable commands
|
||||||
|
|
||||||
`See DispatchCommands <https://wiki.documentfoundation.org/Development/DispatchCommands>`_
|
`See DispatchCommands <https://wiki.documentfoundation.org/Development/DispatchCommands>`_
|
||||||
|
@ -2070,7 +2281,7 @@ class LOMain():
|
||||||
@classproperty
|
@classproperty
|
||||||
def cmd(cls):
|
def cmd(cls):
|
||||||
"""Disable or enable commands"""
|
"""Disable or enable commands"""
|
||||||
return cls._commands
|
return cls.commands
|
||||||
|
|
||||||
@classproperty
|
@classproperty
|
||||||
def desktop(cls):
|
def desktop(cls):
|
||||||
|
@ -2404,6 +2615,7 @@ class LODocument():
|
||||||
|
|
||||||
|
|
||||||
class LODocMain():
|
class LODocMain():
|
||||||
|
"""Classe for start module"""
|
||||||
_type = 'main'
|
_type = 'main'
|
||||||
|
|
||||||
def __init__(self, obj):
|
def __init__(self, obj):
|
||||||
|
@ -2425,6 +2637,30 @@ class LODocCalc(LODocument):
|
||||||
super().__init__(obj)
|
super().__init__(obj)
|
||||||
|
|
||||||
|
|
||||||
|
class LOCalcSheet(object):
|
||||||
|
|
||||||
|
def __init__(self, obj):
|
||||||
|
self._obj = obj
|
||||||
|
|
||||||
|
def __getitem__(self, index):
|
||||||
|
return LOCalcRange(self.obj[index])
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'easymacro.LOCalcSheet: {self.name}'
|
||||||
|
|
||||||
|
|
||||||
|
class LOCalcRange(object):
|
||||||
|
|
||||||
|
def __init__(self, obj):
|
||||||
|
self._obj = obj
|
||||||
|
|
||||||
|
|
||||||
class LODocWriter(LODocument):
|
class LODocWriter(LODocument):
|
||||||
_type = 'writer'
|
_type = 'writer'
|
||||||
|
|
||||||
|
@ -2484,6 +2720,16 @@ class LODocIDE(LODocument):
|
||||||
class LODocuments():
|
class LODocuments():
|
||||||
"""Classe for documents
|
"""Classe for documents
|
||||||
"""
|
"""
|
||||||
|
TYPES = {
|
||||||
|
'calc': 'com.sun.star.sheet.SpreadsheetDocument',
|
||||||
|
'writerr': 'com.sun.star.text.TextDocument',
|
||||||
|
'draw': 'com.sun.star.drawing.DrawingDocument',
|
||||||
|
'impress': 'com.sun.star.presentation.PresentationDocument',
|
||||||
|
'math': 'com.sun.star.formula.FormulaProperties',
|
||||||
|
'ide': 'com.sun.star.script.BasicIDE',
|
||||||
|
'base': 'com.sun.star.sdb.OfficeDatabaseDocument',
|
||||||
|
'main': 'com.sun.star.frame.StartModule',
|
||||||
|
}
|
||||||
_classes = {
|
_classes = {
|
||||||
'com.sun.star.sheet.SpreadsheetDocument': LODocCalc,
|
'com.sun.star.sheet.SpreadsheetDocument': LODocCalc,
|
||||||
'com.sun.star.text.TextDocument': LODocWriter,
|
'com.sun.star.text.TextDocument': LODocWriter,
|
||||||
|
@ -2610,6 +2856,7 @@ def __getattr__(name):
|
||||||
'color': Color(),
|
'color': Color(),
|
||||||
'io': IOStream,
|
'io': IOStream,
|
||||||
'clipboard': ClipBoard,
|
'clipboard': ClipBoard,
|
||||||
|
'shortcuts': LOShortCuts(),
|
||||||
'lo': LOMain,
|
'lo': LOMain,
|
||||||
'command': LOMain.cmd,
|
'command': LOMain.cmd,
|
||||||
'docs': LODocuments(),
|
'docs': LODocuments(),
|
||||||
|
|
Loading…
Reference in New Issue