Refactory
This commit is contained in:
parent
cf05ff1cf1
commit
4812a8d14f
|
@ -0,0 +1,10 @@
|
||||||
|
+++
|
||||||
|
title = "LibreOffice"
|
||||||
|
weight = 4
|
||||||
|
+++
|
||||||
|
|
||||||
|
### create_instance
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
```
|
|
@ -0,0 +1,12 @@
|
||||||
|
+++
|
||||||
|
title = "Calc"
|
||||||
|
weight = 5
|
||||||
|
+++
|
||||||
|
|
||||||
|
#### Trabajar con Calc
|
||||||
|
|
||||||
|
### active
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
```
|
|
@ -0,0 +1,76 @@
|
||||||
|
+++
|
||||||
|
title = "Cuadros de diálogo"
|
||||||
|
weight = 6
|
||||||
|
+++
|
||||||
|
|
||||||
|
#### Trabajar con cuadros de diálogo
|
||||||
|
|
||||||
|
### create
|
||||||
|
|
||||||
|
##### Desde archivo
|
||||||
|
|
||||||
|
Crear un cuadro de diálogo desde un archivo `xdl` previamente creado desde el editor de cuadros de diálogo dentro de LibreOffice y exportado a un archivo.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def crear_cuadro_de_dialogo():
|
||||||
|
path = '/home/mau/Desktop/Dialog1.xdl'
|
||||||
|
propiedades = {'Path': path}
|
||||||
|
|
||||||
|
dialog = app.dialog.create(propiedades)
|
||||||
|
dialog.open()
|
||||||
|
return
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
##### Desde mis macros
|
||||||
|
|
||||||
|
Si el cuadro de diálogo esta en la librería `Standard`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def crear_cuadro_de_dialogo():
|
||||||
|
propiedades = {
|
||||||
|
'Location': 'user',
|
||||||
|
'Name': 'Dialog1',
|
||||||
|
}
|
||||||
|
dialog = app.dialog.create(propiedades)
|
||||||
|
dialog.open()
|
||||||
|
return
|
||||||
|
```
|
||||||
|
|
||||||
|
Si el cuadro de diálogo esta en otra librería.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def crear_cuadro_de_dialogo():
|
||||||
|
propiedades = {
|
||||||
|
'Location': 'user',
|
||||||
|
'Library': 'MiAplicacion',
|
||||||
|
'Name': 'Dialog2',
|
||||||
|
}
|
||||||
|
dialog = app.dialog.create(propiedades)
|
||||||
|
dialog.open()
|
||||||
|
return
|
||||||
|
```
|
||||||
|
|
||||||
|
Si el cuadro de diálogo esta en el documento activo en la librería `Standard`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def crear_cuadro_de_dialogo():
|
||||||
|
propiedades = {
|
||||||
|
'Location': 'document',
|
||||||
|
'Name': 'miApp',
|
||||||
|
}
|
||||||
|
dialog = app.dialog.create(propiedades)
|
||||||
|
dialog.open()
|
||||||
|
return
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Crear dinámicamente
|
||||||
|
|
||||||
|
Crear un cuadro de diálogo vacío.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def crear_cuadro_de_dialogo():
|
||||||
|
dialog = app.dialog.create()
|
||||||
|
dialog.open()
|
||||||
|
return
|
||||||
|
```
|
|
@ -0,0 +1,105 @@
|
||||||
|
+++
|
||||||
|
title = "Herramientas"
|
||||||
|
weight = 3
|
||||||
|
+++
|
||||||
|
|
||||||
|
Recuerda, es necesario importar la librería.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import easymacro as app
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Información sobre la PC
|
||||||
|
|
||||||
|
### OS
|
||||||
|
|
||||||
|
Obtener el sistema operativo.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.OS)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### DESKTOP
|
||||||
|
|
||||||
|
Obtener el tipo de escritorio, solo en GNU/Linux.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.DESKTOP)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### PC
|
||||||
|
|
||||||
|
Obtener el nombre de la computadora.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.PC)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### USER
|
||||||
|
|
||||||
|
Obtener el nombre de usuario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.USER)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### IS_WIN
|
||||||
|
|
||||||
|
Saber si estamos en Windows.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.IS_WIN)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### IS_MAC
|
||||||
|
|
||||||
|
Saber si estamos en OSX.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.IS_MAC)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Información sobre LibreOffice
|
||||||
|
|
||||||
|
### NAME
|
||||||
|
|
||||||
|
Nombre de la aplicación.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.NAME)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### VERSION
|
||||||
|
|
||||||
|
Versión de la aplicación.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.VERSION)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### LANG
|
||||||
|
|
||||||
|
Lenguaje de la aplicación.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.LANG)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### LANGUAGE
|
||||||
|
|
||||||
|
Lenguaje con variante.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.msgbox(app.LANGUAGE)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
[1]: https://git.cuates.net/elmau/easymacro/issues
|
|
@ -0,0 +1,153 @@
|
||||||
|
+++
|
||||||
|
title = "Fechas y tiempo"
|
||||||
|
weight = 2
|
||||||
|
+++
|
||||||
|
|
||||||
|
|
||||||
|
{{% notice tip %}}
|
||||||
|
La fecha inicial en Calc y en Python es diferente.
|
||||||
|
{{% /notice %}}
|
||||||
|
|
||||||
|
|
||||||
|
### today
|
||||||
|
|
||||||
|
Obtener la fecha de hoy.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
app.msgbox(d.today)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### now
|
||||||
|
|
||||||
|
Obtener la fecha y hora actuales.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
app.msgbox(d.now)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### time
|
||||||
|
|
||||||
|
Obtener la hora actual.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
app.msgbox(d.now.time())
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### epoch
|
||||||
|
|
||||||
|
Obtener el [tiempo Unix][1]
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
app.msgbox(d.epoch)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### date
|
||||||
|
|
||||||
|
Devolver una fecha
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
date = d.date(1974, 1, 15)
|
||||||
|
app.msgbox(date)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### time
|
||||||
|
|
||||||
|
Devolver un tiempo
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
time = d.time(10, 20, 15)
|
||||||
|
app.msgbox(time)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### datetime
|
||||||
|
|
||||||
|
Devolver fecha y hora
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
dt = d.datetime(1974, 1, 15, 10, 11, 12)
|
||||||
|
app.msgbox(dt)
|
||||||
|
```
|
||||||
|
|
||||||
|
### str_to_date
|
||||||
|
|
||||||
|
Convertir una cadena en fecha. Mira este [excelente recurso][2]
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
cadena = '1974-01-15'
|
||||||
|
plantilla = '%Y-%m-%d'
|
||||||
|
fecha = d.str_to_date(cadena, plantilla)
|
||||||
|
app.msgbox(fecha)
|
||||||
|
app.msgbox(type(fecha))
|
||||||
|
```
|
||||||
|
|
||||||
|
Para obtener un valor válido para establecer en una celda de Calc.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
cadena = '1974-01-15'
|
||||||
|
plantilla = '%Y-%m-%d'
|
||||||
|
fecha = d.str_to_date(cadena, plantilla, True)
|
||||||
|
app.msgbox(fecha)
|
||||||
|
app.msgbox(type(fecha))
|
||||||
|
```
|
||||||
|
|
||||||
|
### calc_to_date
|
||||||
|
|
||||||
|
Convierte el valor de una celda en una fecha Python, por ejemplo, la fecha inicial configurada en Calc.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
value_from_cell = 1
|
||||||
|
fecha = d.calc_to_date(value_from_cell)
|
||||||
|
app.msgbox(fecha)
|
||||||
|
app.msgbox(type(fecha))
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### start y end
|
||||||
|
|
||||||
|
Medir tiempo en segundos.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
d.start()
|
||||||
|
app.sleep(5)
|
||||||
|
seconds = d.end()
|
||||||
|
app.msgbox(seconds)
|
||||||
|
```
|
||||||
|
|
||||||
|
Regresar timedelta en vez de segundos.
|
||||||
|
|
||||||
|
```python
|
||||||
|
d = app.dates
|
||||||
|
|
||||||
|
d.start()
|
||||||
|
app.sleep(5)
|
||||||
|
td = d.end(False)
|
||||||
|
app.msgbox(td)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
[1]: https://en.wikipedia.org/wiki/Unix_time
|
||||||
|
[2]: https://strftime.org
|
|
@ -0,0 +1,18 @@
|
||||||
|
+++
|
||||||
|
title = "Correo electrónico"
|
||||||
|
weight = 3
|
||||||
|
+++
|
||||||
|
|
||||||
|
#### Enviar correo electrónico.
|
||||||
|
|
||||||
|
{{% notice tip %}}
|
||||||
|
Siempre guarda las contraseñas de la forma más segura posible.
|
||||||
|
{{% /notice %}}
|
||||||
|
|
||||||
|
### send
|
||||||
|
|
||||||
|
Enviar un correo electrónico.
|
||||||
|
|
||||||
|
```python
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,69 @@
|
||||||
|
+++
|
||||||
|
title = "Mensajes"
|
||||||
|
weight = 1
|
||||||
|
+++
|
||||||
|
|
||||||
|
#### Cuadros de mensaje
|
||||||
|
|
||||||
|
### msgbox
|
||||||
|
|
||||||
|
Mostrar mensaje estandar.
|
||||||
|
|
||||||
|
```python
|
||||||
|
mensaje = 'Maldito Mundo'
|
||||||
|
titulo = 'Mi Macro'
|
||||||
|
app.msgbox(mensaje, titulo)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### warning
|
||||||
|
|
||||||
|
Mostrar mensaje con icono de advertencia.
|
||||||
|
|
||||||
|
```python
|
||||||
|
mensaje = 'Cuidado, esta acción es peligrosa'
|
||||||
|
titulo = 'Mi Macro'
|
||||||
|
app.warning(mensaje, titulo)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### errorbox
|
||||||
|
|
||||||
|
Mostrar mensaje con icono de error.
|
||||||
|
|
||||||
|
```python
|
||||||
|
mensaje = 'ERROR: contacte a soporte'
|
||||||
|
titulo = 'Mi Macro'
|
||||||
|
app.errorbox(mensaje, titulo)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### question
|
||||||
|
|
||||||
|
Hacer una pregunta mostrando el icono de interrogación y mostrando los botones de comando `Si` y `No`. La respuesta siempre es verdadera (`True`) si el usuario selecciona `si` y falsa (`False`) en caso contrario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
mensaje = '¿Es fácil Python?'
|
||||||
|
titulo = 'Mi Macro'
|
||||||
|
resultado = app.question(mensaje, titulo)
|
||||||
|
app.msgbox(resultado)
|
||||||
|
```
|
||||||
|
|
||||||
|
### inputbox
|
||||||
|
|
||||||
|
Muestra un mensaje al usuario, permitiendo capturar una respuesta.
|
||||||
|
|
||||||
|
```python
|
||||||
|
mensaje = 'Escribe tu nombre'
|
||||||
|
nombre = app.inputbox(mensaje)
|
||||||
|
app.msgbox(nombre)
|
||||||
|
```
|
||||||
|
|
||||||
|
Para ocultar solo en pantalla lo que captura el usuario, como contraseñas.
|
||||||
|
|
||||||
|
```python
|
||||||
|
mensaje = 'Captura la contraseña'
|
||||||
|
echochar = '*'
|
||||||
|
contraseña = app.inputbox(mensaje, echochar=echochar)
|
||||||
|
app.msgbox(contraseña)
|
||||||
|
```
|
|
@ -0,0 +1,569 @@
|
||||||
|
+++
|
||||||
|
title = "Rutas y archivos"
|
||||||
|
weight = 2
|
||||||
|
+++
|
||||||
|
|
||||||
|
#### Trabajar con rutas y archivos.
|
||||||
|
|
||||||
|
### path
|
||||||
|
|
||||||
|
Obtener información de una ruta.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta_archivo = '/home/mau/mi_archivo.ods'
|
||||||
|
p = app.paths(ruta_archivo)
|
||||||
|
|
||||||
|
app.debug(p.path)
|
||||||
|
app.debug(p.file_name)
|
||||||
|
app.debug(p.name)
|
||||||
|
app.debug(p.ext)
|
||||||
|
app.debug(p.size)
|
||||||
|
app.debug(p.url)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
15/08/2022 14:40:08 - DEBUG - /home/mau
|
||||||
|
15/08/2022 14:40:08 - DEBUG - mi_archivo.ods
|
||||||
|
15/08/2022 14:40:08 - DEBUG - mi_archivo
|
||||||
|
15/08/2022 14:40:08 - DEBUG - ods
|
||||||
|
15/08/2022 14:40:08 - DEBUG - 7011
|
||||||
|
15/08/2022 14:40:08 - DEBUG - file:///home/mau/mi_archivo.ods
|
||||||
|
```
|
||||||
|
|
||||||
|
Obtener la misma información como un tupla.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta_archivo = '/home/mau/mi_archivo.ods'
|
||||||
|
p = app.paths(ruta_archivo)
|
||||||
|
app.debug(p.info)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
15/08/2022 14:43:01 - DEBUG - ('/home/mau', 'mi_archivo.ods', 'mi_archivo', 'ods', 7011, 'file:///home/mau/mi_archivo.ods')
|
||||||
|
```
|
||||||
|
|
||||||
|
O como diccionario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta_archivo = '/home/mau/mi_archivo.ods'
|
||||||
|
p = app.paths(ruta_archivo)
|
||||||
|
app.debug(p.dict)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
15/08/2022 14:43:01 - DEBUG - {'path': '/home/mau', 'file_name': 'mi_archivo.ods', 'name': 'mi_archivo', 'ext': 'ods', 'size': 7011, 'url': 'file:///home/mau/mi_archivo.ods'}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### home
|
||||||
|
|
||||||
|
Obtener la carpeta de inicio del usuario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
app.debug(p.home)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### documents
|
||||||
|
|
||||||
|
Obtener la carpeta Documentos del usuario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
app.debug(p.documents)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### user_profile
|
||||||
|
|
||||||
|
Obtener la ruta del perfil de usuario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
app.debug(p.user_profile)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### user_config
|
||||||
|
|
||||||
|
Obtener la ruta de la carpeta `config` en el perfil de usuario.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
app.debug(p.user_config)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### python
|
||||||
|
|
||||||
|
Obtener la ruta del ejecutable `python`
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
app.debug(p.python)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### to_system
|
||||||
|
|
||||||
|
Pasar una ruta en formato URL al formato del sistema de archivos del SO.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta_url = 'file:///home/mau/mi_archivo.ods'
|
||||||
|
ruta = p.to_system(ruta_url)
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### to_url
|
||||||
|
|
||||||
|
Pasar una ruta del sistema de archivos del SO al formato URL.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = '/home/mau/mi_archivo.ods'
|
||||||
|
ruta_url = p.to_url(ruta)
|
||||||
|
app.debug(ruta_url)
|
||||||
|
```
|
||||||
|
|
||||||
|
### config
|
||||||
|
|
||||||
|
Obtener rutas de la configuración de LibreOffice. Por default obtiene la ruta de `Documentos`, para otras ruta mire [Api XPathSettings][1]
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = p.config()
|
||||||
|
app.debug(ruta)
|
||||||
|
|
||||||
|
ruta = p.config('UserConfig')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
{{% notice tip %}}
|
||||||
|
Algunas rutas pueden ser más de una, separados por `;`, en este caso, el resultado es una lista con las rutas.
|
||||||
|
{{% /notice %}}
|
||||||
|
|
||||||
|
|
||||||
|
### join
|
||||||
|
|
||||||
|
Concatenar rutas.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = p.join('/home/mau', 'pruebas', 'archivo.ods')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### exists
|
||||||
|
|
||||||
|
Verificar si una ruta existe.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
resultado = p.exists('/home/mau/test/archivo.ods')
|
||||||
|
app.debug(resultado)
|
||||||
|
```
|
||||||
|
|
||||||
|
### exists_app
|
||||||
|
|
||||||
|
Verificar si una aplicación existe.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
resultado = p.exists_app('noexiste')
|
||||||
|
app.debug(resultado)
|
||||||
|
|
||||||
|
resultado = p.exists_app('soffice')
|
||||||
|
app.debug(resultado)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### is_dir
|
||||||
|
|
||||||
|
Verificar si la ruta es un directorio.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
resultado = p.is_dir('/home/mau')
|
||||||
|
app.debug(resultado)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### is_file
|
||||||
|
|
||||||
|
Verificar si la ruta es un archivo.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
resultado = p.is_file('/home/mau/mi_archivo.ods')
|
||||||
|
app.debug(resultado)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### temp_file
|
||||||
|
|
||||||
|
Crear un archivo temporal, es borrado automáticamente al cerrarse.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
f = p.temp_file()
|
||||||
|
f.write(app.INFO_DEBUG)
|
||||||
|
f.close()
|
||||||
|
```
|
||||||
|
|
||||||
|
Usado en `contexto`, se cierra automáticamente.
|
||||||
|
|
||||||
|
```python
|
||||||
|
with p.temp_file() as f:
|
||||||
|
app.debug(f.name)
|
||||||
|
f.write('test')
|
||||||
|
```
|
||||||
|
|
||||||
|
### temp_dir
|
||||||
|
|
||||||
|
Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
with p.temp_dir() as d:
|
||||||
|
app.debug(p.exists(d))
|
||||||
|
app.debug(d)
|
||||||
|
|
||||||
|
app.debug(p.exists(d))
|
||||||
|
```
|
||||||
|
|
||||||
|
### get
|
||||||
|
|
||||||
|
Permitir al usuario seleccionar archivos, devuelve solo la ruta. De forma predeterminada abre en la carpeta `Documentos`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = p.get()
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Establecer que abra en otro directorio.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get('/tmp')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Agregar un filtro.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get(filters='ods')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Agregar multiples filtros.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get(filters='xml,txt')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Permitir selecciones multiples.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get(filters='xml,txt', multiple=True)
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### get_dir
|
||||||
|
|
||||||
|
Permitir al usuario seleccionar un directorio, devuelve solo la ruta. De forma predeterminada abre en la carpeta `Documentos`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = p.get_dir()
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Establecer que abra en otro directorio.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get_dir('/tmp')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
### get_for_save
|
||||||
|
|
||||||
|
Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = p.get_for_save()
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Establecer que inicie en otro directorio.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get_for_save('/tmp')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Si se establece un filtro, automáticamente se agrega la extensión.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = p.get_for_save(filters='txt')
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### files
|
||||||
|
|
||||||
|
Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta = '/home/mau'
|
||||||
|
|
||||||
|
p = app.paths
|
||||||
|
archivos = p.files(ruta)
|
||||||
|
for a in archivos:
|
||||||
|
app.debug(a)
|
||||||
|
```
|
||||||
|
|
||||||
|
Filtrar por tipo de archivo.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
archivos = p.files(ruta, '*.pdf')
|
||||||
|
```
|
||||||
|
|
||||||
|
Obtener archivos de forma recursiva.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
archivos = p.files(ruta, '**/*.xml')
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### walk
|
||||||
|
|
||||||
|
Obtener archivos de forma recursiva.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = '/home/mau/Documents'
|
||||||
|
archivos = p.walk(ruta)
|
||||||
|
for a in archivos:
|
||||||
|
app.debug(a)
|
||||||
|
```
|
||||||
|
|
||||||
|
Con filtro.
|
||||||
|
|
||||||
|
```python
|
||||||
|
archivos = p.walk(ruta, 'ods')
|
||||||
|
```
|
||||||
|
|
||||||
|
Con filtros.
|
||||||
|
|
||||||
|
```python
|
||||||
|
archivos = p.walk(ruta, 'ods|odt')
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### dirs
|
||||||
|
|
||||||
|
Obtener los directorios de una ruta, no recursivamente.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = '/home/mau/Documents'
|
||||||
|
folders = p.dirs(ruta)
|
||||||
|
for f in folders:
|
||||||
|
app.debug(f)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### walk_dirs
|
||||||
|
|
||||||
|
Obtener los directorios de una ruta, no recursivamente.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = '/home/mau/Documents'
|
||||||
|
folders = p.walk_dirs(ruta)
|
||||||
|
for f in folders:
|
||||||
|
app.debug(f)
|
||||||
|
```
|
||||||
|
|
||||||
|
Obtener información en una lista de tuplas: (ID_FOLDER, ID_PADRE, NOMBRE)
|
||||||
|
|
||||||
|
```python
|
||||||
|
folders = p.walk_dirs(ruta, True)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### extension
|
||||||
|
|
||||||
|
Obtener la ruta de instalación de una extensión a partir de su ID.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
id_ext = 'net.elmau.zaz.talk'
|
||||||
|
ruta = p.extension(id_ext)
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
### replace_ext
|
||||||
|
|
||||||
|
Reemplazar extensión de un archivo.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = '/home/mau/mi_archivo.ods'
|
||||||
|
ruta_nueva = p.replace_ext(ruta, 'pdf')
|
||||||
|
app.debug(ruta_nueva)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### open
|
||||||
|
|
||||||
|
Abrir cualquier archivo con el programas predeterminado del SO.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
ruta = '/home/mau/archivo.pdf'
|
||||||
|
p.open(ruta)
|
||||||
|
|
||||||
|
ruta = '/home/mau/index.html'
|
||||||
|
p.open(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
### save y read
|
||||||
|
|
||||||
|
Guardar y leer datos, el encoding predeterminado es UTF8.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
datos = """¿Quieres saber quién eres? No preguntes. Actúa.
|
||||||
|
La acción te delineará y definirá.
|
||||||
|
|
||||||
|
Thomas Jefferson
|
||||||
|
"""
|
||||||
|
|
||||||
|
ruta = '/home/mau/temp.txt'
|
||||||
|
p.save(ruta, datos)
|
||||||
|
|
||||||
|
datos = p.read(ruta)
|
||||||
|
app.msgbox(datos)
|
||||||
|
```
|
||||||
|
|
||||||
|
Cambiar el encoding.
|
||||||
|
|
||||||
|
```python
|
||||||
|
app.paths.save(ruta, datos, 'iso-8859-1')
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### save_bin y read_bin
|
||||||
|
|
||||||
|
Guardar y leer datos binarios.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
datos = b'Datos binarios'
|
||||||
|
|
||||||
|
ruta = '/home/mau/temp.bin'
|
||||||
|
p.save_bin(ruta, datos)
|
||||||
|
|
||||||
|
datos = p.read_bin(ruta)
|
||||||
|
app.msgbox(datos)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### save_json y read_json
|
||||||
|
|
||||||
|
Guardar y leer en formato json.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
ruta = '/home/mau/datos.json'
|
||||||
|
datos = {
|
||||||
|
'tipo': 'calc',
|
||||||
|
'nombre': 'miarchivo.ods',
|
||||||
|
}
|
||||||
|
p.save_json(ruta, datos)
|
||||||
|
|
||||||
|
datos = p.read_json(ruta)
|
||||||
|
app.msgbox(datos)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### save_csv y read_csv
|
||||||
|
|
||||||
|
Exportar e importar datos en formato CSV. Vea la documentación [CSV][2] para los argumentos que puede usar.
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
ruta = '/home/mau/datos.csv'
|
||||||
|
ahora = app.dates.now
|
||||||
|
datos = (
|
||||||
|
(1, 'uno', ahora),
|
||||||
|
(2, 'dos', ahora),
|
||||||
|
(3, 'tres', ahora),
|
||||||
|
)
|
||||||
|
p.save_csv(ruta, datos)
|
||||||
|
|
||||||
|
datos = p.read_csv(ruta)
|
||||||
|
app.msgbox(datos)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### kill
|
||||||
|
|
||||||
|
Borra archivos o directorios con todo su contenido. Devuelve verdadero (True) en caso de exito y falso (Falso) en cualquier otro caso.
|
||||||
|
|
||||||
|
{{% notice warning %}}
|
||||||
|
Este proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.
|
||||||
|
{{% /notice %}}
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
ruta = '/home/mau/temp.bin'
|
||||||
|
resultado = p.kill(ruta)
|
||||||
|
app.msgbox(resultado)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### copy
|
||||||
|
|
||||||
|
Copiar archivos. Devuelve la ruta completa final destino.
|
||||||
|
|
||||||
|
De un origen a una carpeta destino
|
||||||
|
|
||||||
|
```python
|
||||||
|
p = app.paths
|
||||||
|
|
||||||
|
ruta_origen = '/home/mau/temp.txt'
|
||||||
|
ruta_destino = '/home/mau/Desktop'
|
||||||
|
ruta = p.copy(ruta_origen, ruta_destino)
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
Cambiar el nombre destino.
|
||||||
|
|
||||||
|
```python
|
||||||
|
ruta_origen = '/home/mau/temp.txt'
|
||||||
|
ruta_destino = '/home/mau/Desktop'
|
||||||
|
nuevo_nombre = 'datos.csv'
|
||||||
|
ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre)
|
||||||
|
app.debug(ruta)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
[1]: http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1util_1_1XPathSettings.html
|
||||||
|
[2]: https://docs.python.org/3.7/library/csv.html
|
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
4671
source/easymacro.bk2
4671
source/easymacro.bk2
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from .easymain import *
|
from .easymain import *
|
||||||
|
from .easydialog import *
|
||||||
from .easytools import *
|
from .easytools import *
|
||||||
from .easydocs import LODocuments
|
from .easydocs import LODocuments
|
||||||
|
|
||||||
|
@ -8,7 +9,11 @@ from .easydocs import LODocuments
|
||||||
def __getattr__(name):
|
def __getattr__(name):
|
||||||
classes = {
|
classes = {
|
||||||
'active': LODocuments().active,
|
'active': LODocuments().active,
|
||||||
'inspect': LOInspect
|
'dates': Dates,
|
||||||
|
'dialog': LODialog,
|
||||||
|
'email': Email,
|
||||||
|
'inspect': LOInspect,
|
||||||
|
'paths': Paths,
|
||||||
}
|
}
|
||||||
|
|
||||||
if name in classes:
|
if name in classes:
|
||||||
|
|
|
@ -0,0 +1,741 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from com.sun.star.view.SelectionType import SINGLE, MULTI, RANGE
|
||||||
|
|
||||||
|
from .easyevents import *
|
||||||
|
from .easydocs import LODocuments
|
||||||
|
from .easymain import log, TITLE, create_instance, BaseObject
|
||||||
|
from .easytools import Paths, Services, LOInspect
|
||||||
|
from .easytools import _, set_properties
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'LODialog',
|
||||||
|
'inputbox',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
SEPARATION = 5
|
||||||
|
MODELS = {
|
||||||
|
'button': 'com.sun.star.awt.UnoControlButtonModel',
|
||||||
|
'label': 'com.sun.star.awt.UnoControlFixedTextModel',
|
||||||
|
'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel',
|
||||||
|
'radio': 'com.sun.star.awt.UnoControlRadioButtonModel',
|
||||||
|
'checkbox': 'com.sun.star.awt.UnoControlCheckBoxModel',
|
||||||
|
'text': 'com.sun.star.awt.UnoControlEditModel',
|
||||||
|
'image': 'com.sun.star.awt.UnoControlImageControlModel',
|
||||||
|
'listbox': 'com.sun.star.awt.UnoControlListBoxModel',
|
||||||
|
'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel',
|
||||||
|
'tree': 'com.sun.star.awt.tree.TreeControlModel',
|
||||||
|
'grid': 'com.sun.star.awt.grid.UnoControlGridModel',
|
||||||
|
'pages': 'com.sun.star.awt.UnoMultiPageModel',
|
||||||
|
'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel',
|
||||||
|
'combobox': 'com.sun.star.awt.UnoControlComboBoxModel',
|
||||||
|
'spinbutton': 'com.sun.star.awt.UnoControlSpinButtonModel',
|
||||||
|
'numeric': 'com.sun.star.awt.UnoControlNumericFieldModel',
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPE_CONTROL = {
|
||||||
|
'stardiv.Toolkit.UnoFixedTextControl': 'label',
|
||||||
|
'stardiv.Toolkit.UnoEditControl': 'text',
|
||||||
|
'stardiv.Toolkit.UnoButtonControl': 'button',
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENTATIONS = {
|
||||||
|
'grid': 'stardiv.Toolkit.GridControl',
|
||||||
|
'link': 'stardiv.Toolkit.UnoFixedHyperlinkControl',
|
||||||
|
'roadmap': 'stardiv.Toolkit.UnoRoadmapControl',
|
||||||
|
'pages': 'stardiv.Toolkit.UnoMultiPageControl',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def add_listeners(events, control):
|
||||||
|
name = control.Model.Name
|
||||||
|
listeners = {
|
||||||
|
'addActionListener': EventsButton,
|
||||||
|
# ~ 'addMouseListener': EventsMouse,
|
||||||
|
# ~ 'addFocusListener': EventsFocus,
|
||||||
|
# ~ 'addItemListener': EventsItem,
|
||||||
|
# ~ 'addKeyListener': EventsKey,
|
||||||
|
# ~ 'addTabListener': EventsTab,
|
||||||
|
# ~ 'addSpinListener': EventsSpin,
|
||||||
|
}
|
||||||
|
if hasattr(control, 'obj'):
|
||||||
|
control = control.obj
|
||||||
|
# ~ log.debug(control.ImplementationName)
|
||||||
|
is_grid = control.ImplementationName == IMPLEMENTATIONS['grid']
|
||||||
|
is_link = control.ImplementationName == IMPLEMENTATIONS['link']
|
||||||
|
is_roadmap = control.ImplementationName == IMPLEMENTATIONS['roadmap']
|
||||||
|
is_pages = control.ImplementationName == IMPLEMENTATIONS['pages']
|
||||||
|
|
||||||
|
for key, value in listeners.items():
|
||||||
|
if hasattr(control, key):
|
||||||
|
if is_grid and key == 'addMouseListener':
|
||||||
|
control.addMouseListener(EventsMouseGrid(events, name))
|
||||||
|
continue
|
||||||
|
if is_link and key == 'addMouseListener':
|
||||||
|
control.addMouseListener(EventsMouseLink(events, name))
|
||||||
|
continue
|
||||||
|
if is_roadmap and key == 'addItemListener':
|
||||||
|
control.addItemListener(EventsItemRoadmap(events, name))
|
||||||
|
continue
|
||||||
|
|
||||||
|
getattr(control, key)(listeners[key](events, name))
|
||||||
|
|
||||||
|
if is_grid:
|
||||||
|
controllers = EventsGrid(events, name)
|
||||||
|
control.addSelectionListener(controllers)
|
||||||
|
control.Model.GridDataModel.addGridDataListener(controllers)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class UnoBaseObject(object):
|
||||||
|
|
||||||
|
def __init__(self, obj: Any):
|
||||||
|
self._obj = obj
|
||||||
|
self._model = obj.Model
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@property
|
||||||
|
def obj(self):
|
||||||
|
return self._obj
|
||||||
|
|
||||||
|
@property
|
||||||
|
def model(self):
|
||||||
|
return self._model
|
||||||
|
@property
|
||||||
|
def m(self):
|
||||||
|
return self._model
|
||||||
|
|
||||||
|
@property
|
||||||
|
def properties(self):
|
||||||
|
data = LOInspect(self.obj).properties
|
||||||
|
return data
|
||||||
|
@properties.setter
|
||||||
|
def properties(self, properties: dict):
|
||||||
|
set_properties(self.model, properties)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
return self.model.Name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def parent(self):
|
||||||
|
return self.obj.Context
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tag(self):
|
||||||
|
return self.model.Tag
|
||||||
|
@tag.setter
|
||||||
|
def tag(self, value):
|
||||||
|
self.model.Tag = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def visible(self):
|
||||||
|
return self.obj.Visible
|
||||||
|
@visible.setter
|
||||||
|
def visible(self, value):
|
||||||
|
self.obj.setVisible(value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def enabled(self):
|
||||||
|
return self.model.Enabled
|
||||||
|
@enabled.setter
|
||||||
|
def enabled(self, value):
|
||||||
|
self.model.Enabled = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def step(self):
|
||||||
|
return self.model.Step
|
||||||
|
@step.setter
|
||||||
|
def step(self, value):
|
||||||
|
self.model.Step = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def align(self):
|
||||||
|
return self.model.Align
|
||||||
|
@align.setter
|
||||||
|
def align(self, value):
|
||||||
|
self.model.Align = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def valign(self):
|
||||||
|
return self.model.VerticalAlign
|
||||||
|
@valign.setter
|
||||||
|
def valign(self, value):
|
||||||
|
self.model.VerticalAlign = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def font_weight(self):
|
||||||
|
return self.model.FontWeight
|
||||||
|
@font_weight.setter
|
||||||
|
def font_weight(self, value):
|
||||||
|
self.model.FontWeight = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def font_height(self):
|
||||||
|
return self.model.FontHeight
|
||||||
|
@font_height.setter
|
||||||
|
def font_height(self, value):
|
||||||
|
self.model.FontHeight = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def font_name(self):
|
||||||
|
return self.model.FontName
|
||||||
|
@font_name.setter
|
||||||
|
def font_name(self, value):
|
||||||
|
self.model.FontName = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def font_underline(self):
|
||||||
|
return self.model.FontUnderline
|
||||||
|
@font_underline.setter
|
||||||
|
def font_underline(self, value):
|
||||||
|
self.model.FontUnderline = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def text_color(self):
|
||||||
|
return self.model.TextColor
|
||||||
|
@text_color.setter
|
||||||
|
def text_color(self, value):
|
||||||
|
self.model.TextColor = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def back_color(self):
|
||||||
|
return self.model.BackgroundColor
|
||||||
|
@back_color.setter
|
||||||
|
def back_color(self, value):
|
||||||
|
self.model.BackgroundColor = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def multi_line(self):
|
||||||
|
return self.model.MultiLine
|
||||||
|
@multi_line.setter
|
||||||
|
def multi_line(self, value):
|
||||||
|
self.model.MultiLine = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def help_text(self):
|
||||||
|
return self.model.HelpText
|
||||||
|
@help_text.setter
|
||||||
|
def help_text(self, value):
|
||||||
|
self.model.HelpText = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def border(self):
|
||||||
|
return self.model.Border
|
||||||
|
@border.setter
|
||||||
|
def border(self, value):
|
||||||
|
# ~ Bug for report
|
||||||
|
self.model.Border = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def width(self):
|
||||||
|
return self._model.Width
|
||||||
|
@width.setter
|
||||||
|
def width(self, value):
|
||||||
|
self.model.Width = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def height(self):
|
||||||
|
return self.model.Height
|
||||||
|
@height.setter
|
||||||
|
def height(self, value):
|
||||||
|
self.model.Height = value
|
||||||
|
|
||||||
|
def _get_possize(self, name):
|
||||||
|
ps = self.obj.getPosSize()
|
||||||
|
return getattr(ps, name)
|
||||||
|
|
||||||
|
def _set_possize(self, name, value):
|
||||||
|
ps = self.obj.getPosSize()
|
||||||
|
setattr(ps, name, value)
|
||||||
|
self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, POSSIZE)
|
||||||
|
return
|
||||||
|
|
||||||
|
@property
|
||||||
|
def x(self):
|
||||||
|
if hasattr(self.model, 'PositionX'):
|
||||||
|
return self.model.PositionX
|
||||||
|
return self._get_possize('X')
|
||||||
|
@x.setter
|
||||||
|
def x(self, value):
|
||||||
|
if hasattr(self.model, 'PositionX'):
|
||||||
|
self.model.PositionX = value
|
||||||
|
else:
|
||||||
|
self._set_possize('X', value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def y(self):
|
||||||
|
if hasattr(self.model, 'PositionY'):
|
||||||
|
return self.model.PositionY
|
||||||
|
return self._get_possize('Y')
|
||||||
|
@y.setter
|
||||||
|
def y(self, value):
|
||||||
|
if hasattr(self.model, 'PositionY'):
|
||||||
|
self.model.PositionY = value
|
||||||
|
else:
|
||||||
|
self._set_possize('Y', value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tab_index(self):
|
||||||
|
return self._model.TabIndex
|
||||||
|
@tab_index.setter
|
||||||
|
def tab_index(self, value):
|
||||||
|
self.model.TabIndex = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tab_stop(self):
|
||||||
|
return self._model.Tabstop
|
||||||
|
@tab_stop.setter
|
||||||
|
def tab_stop(self, value):
|
||||||
|
self.model.Tabstop = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ps(self):
|
||||||
|
ps = self.obj.getPosSize()
|
||||||
|
return ps
|
||||||
|
@ps.setter
|
||||||
|
def ps(self, ps):
|
||||||
|
self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, POSSIZE)
|
||||||
|
|
||||||
|
def set_focus(self):
|
||||||
|
self.obj.setFocus()
|
||||||
|
return
|
||||||
|
|
||||||
|
def ps_from(self, source):
|
||||||
|
self.ps = source.ps
|
||||||
|
return
|
||||||
|
|
||||||
|
def center(self, horizontal=True, vertical=False):
|
||||||
|
p = self.parent.Model
|
||||||
|
w = p.Width
|
||||||
|
h = p.Height
|
||||||
|
if horizontal:
|
||||||
|
x = w / 2 - self.width / 2
|
||||||
|
self.x = x
|
||||||
|
if vertical:
|
||||||
|
y = h / 2 - self.height / 2
|
||||||
|
self.y = y
|
||||||
|
return
|
||||||
|
|
||||||
|
def move(self, origin, x=0, y=5, center=False):
|
||||||
|
if x:
|
||||||
|
self.x = origin.x + origin.width + x
|
||||||
|
else:
|
||||||
|
self.x = origin.x
|
||||||
|
if y:
|
||||||
|
h = origin.height
|
||||||
|
if y < 0:
|
||||||
|
h = 0
|
||||||
|
self.y = origin.y + h + y
|
||||||
|
else:
|
||||||
|
self.y = origin.y
|
||||||
|
|
||||||
|
if center:
|
||||||
|
self.center()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class UnoLabel(UnoBaseObject):
|
||||||
|
|
||||||
|
def __init__(self, obj):
|
||||||
|
super().__init__(obj)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def type(self):
|
||||||
|
return 'label'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def value(self):
|
||||||
|
return self.model.Label
|
||||||
|
@value.setter
|
||||||
|
def value(self, value):
|
||||||
|
self.model.Label = value
|
||||||
|
|
||||||
|
|
||||||
|
# ~ https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1awt_1_1UnoControlEditModel.html
|
||||||
|
class UnoText(UnoBaseObject):
|
||||||
|
|
||||||
|
def __init__(self, obj):
|
||||||
|
super().__init__(obj)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def type(self):
|
||||||
|
return 'text'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def value(self):
|
||||||
|
return self.model.Text
|
||||||
|
@value.setter
|
||||||
|
def value(self, value):
|
||||||
|
self.model.Text = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def echochar(self):
|
||||||
|
return chr(self.model.EchoChar)
|
||||||
|
@echochar.setter
|
||||||
|
def echochar(self, value):
|
||||||
|
if value:
|
||||||
|
self.model.EchoChar = ord(value[0])
|
||||||
|
else:
|
||||||
|
self.model.EchoChar = 0
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class UnoButton(UnoBaseObject):
|
||||||
|
|
||||||
|
def __init__(self, obj):
|
||||||
|
super().__init__(obj)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def type(self):
|
||||||
|
return 'button'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def value(self):
|
||||||
|
return self.model.Label
|
||||||
|
@value.setter
|
||||||
|
def value(self, value):
|
||||||
|
self.model.Label = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def image(self):
|
||||||
|
return self.model.ImageURL
|
||||||
|
@image.setter
|
||||||
|
def image(self, value):
|
||||||
|
self.model.ImageURL = Paths.to_url(value)
|
||||||
|
|
||||||
|
|
||||||
|
UNO_CLASSES = {
|
||||||
|
'label': UnoLabel,
|
||||||
|
'text': UnoText,
|
||||||
|
'button': UnoButton,
|
||||||
|
# ~ 'link': UnoLabelLink,
|
||||||
|
# ~ 'radio': UnoRadio,
|
||||||
|
# ~ 'checkbox': UnoCheckBox,
|
||||||
|
# ~ 'image': UnoImage,
|
||||||
|
# ~ 'listbox': UnoListBox,
|
||||||
|
# ~ 'roadmap': UnoRoadmap,
|
||||||
|
# ~ 'tree': UnoTree,
|
||||||
|
# ~ 'grid': UnoGrid,
|
||||||
|
# ~ 'pages': UnoPages,
|
||||||
|
# ~ 'spinbutton': UnoSpinButton,
|
||||||
|
# ~ 'numeric': UnoNumericField,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DialogBox(BaseObject):
|
||||||
|
SERVICE = 'com.sun.star.awt.DialogProvider'
|
||||||
|
SERVICE_DIALOG = 'com.sun.star.awt.UnoControlDialog'
|
||||||
|
|
||||||
|
def __init__(self, properties: dict={}):
|
||||||
|
self._controls = {}
|
||||||
|
obj = self._create(properties)
|
||||||
|
super().__init__(obj)
|
||||||
|
self._init_controls()
|
||||||
|
|
||||||
|
def _create_from_path(self, path: str):
|
||||||
|
dp = create_instance(self.SERVICE, True)
|
||||||
|
dialog = dp.createDialog(Paths.to_url(path))
|
||||||
|
return dialog
|
||||||
|
|
||||||
|
def _create_from_location(self, properties: dict):
|
||||||
|
# ~ uid = docs.active.uid
|
||||||
|
# ~ url = f'vnd.sun.star.tdoc:/{uid}/Dialogs/{library}/{name}.xml'
|
||||||
|
|
||||||
|
name = properties['Name']
|
||||||
|
library = properties.get('Library', 'Standard')
|
||||||
|
location = properties.get('Location', 'application').lower()
|
||||||
|
if location == 'user':
|
||||||
|
location = 'application'
|
||||||
|
|
||||||
|
url = f'vnd.sun.star.script:{library}.{name}?location={location}'
|
||||||
|
|
||||||
|
if location == 'document':
|
||||||
|
doc = LODocuments().active.obj
|
||||||
|
dp = create_instance(self.SERVICE, arguments=doc)
|
||||||
|
else:
|
||||||
|
dp = create_instance(self.SERVICE, True)
|
||||||
|
|
||||||
|
dialog = dp.createDialog(url)
|
||||||
|
return dialog
|
||||||
|
|
||||||
|
def _create_from_properties(self, properties: dict):
|
||||||
|
dialog = create_instance(self.SERVICE_DIALOG, True)
|
||||||
|
model = create_instance(f'{self.SERVICE_DIALOG}Model', True)
|
||||||
|
|
||||||
|
properties['Width'] = properties.get('Width', 200)
|
||||||
|
properties['Height'] = properties.get('Height', 150)
|
||||||
|
|
||||||
|
set_properties(model, properties)
|
||||||
|
dialog.setModel(model)
|
||||||
|
dialog.setVisible(False)
|
||||||
|
dialog.createPeer(Services.toolkit, None)
|
||||||
|
return dialog
|
||||||
|
|
||||||
|
def _create(self, properties: dict):
|
||||||
|
path = properties.pop('Path', '')
|
||||||
|
if path:
|
||||||
|
dialog = self._create_from_path(path)
|
||||||
|
elif 'Location' in properties:
|
||||||
|
dialog = self._create_from_location(properties)
|
||||||
|
else:
|
||||||
|
dialog = self._create_from_properties(properties)
|
||||||
|
return dialog
|
||||||
|
|
||||||
|
def _init_controls(self):
|
||||||
|
for control in self.obj.Controls:
|
||||||
|
tipo = control.ImplementationName
|
||||||
|
name = control.Model.Name
|
||||||
|
if not tipo in TYPE_CONTROL:
|
||||||
|
log.debug(f'Type control: {tipo}')
|
||||||
|
raise AttributeError(f"Has no class '{tipo}'")
|
||||||
|
control = UNO_CLASSES[TYPE_CONTROL[tipo]](control)
|
||||||
|
setattr(self, name, control)
|
||||||
|
self._controls[name] = control
|
||||||
|
return
|
||||||
|
|
||||||
|
def execute(self):
|
||||||
|
return self.obj.execute()
|
||||||
|
|
||||||
|
def open(self):
|
||||||
|
return self.execute()
|
||||||
|
|
||||||
|
def close(self, value=0):
|
||||||
|
value = self.obj.endDialog(value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
# ~ def close(self, value=0):
|
||||||
|
# ~ if self._modal:
|
||||||
|
# ~ value = self.obj.endDialog(value)
|
||||||
|
# ~ else:
|
||||||
|
# ~ self.visible = False
|
||||||
|
# ~ self.obj.dispose()
|
||||||
|
# ~ return value
|
||||||
|
|
||||||
|
# ~ def show(self, modal=True):
|
||||||
|
# ~ self._modal = modal
|
||||||
|
# ~ if modal:
|
||||||
|
# ~ return self.obj.execute()
|
||||||
|
# ~ else:
|
||||||
|
# ~ self.visible = True
|
||||||
|
# ~ return
|
||||||
|
|
||||||
|
@property
|
||||||
|
def model(self):
|
||||||
|
return self.obj.Model
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
return self.model.Name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def height(self):
|
||||||
|
return self.model.Height
|
||||||
|
@height.setter
|
||||||
|
def height(self, value):
|
||||||
|
self.model.Height = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def width(self):
|
||||||
|
return self.model.Width
|
||||||
|
@width.setter
|
||||||
|
def width(self, value):
|
||||||
|
self.model.Width = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def visible(self):
|
||||||
|
return self.obj.Visible
|
||||||
|
@visible.setter
|
||||||
|
def visible(self, value):
|
||||||
|
self.obj.Visible = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def step(self):
|
||||||
|
return self.model.Step
|
||||||
|
@step.setter
|
||||||
|
def step(self, value):
|
||||||
|
self.model.Step = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def color_on_focus(self):
|
||||||
|
return self._color_on_focus
|
||||||
|
@color_on_focus.setter
|
||||||
|
def color_on_focus(self, value):
|
||||||
|
self._color_on_focus = get_color(value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def events(self):
|
||||||
|
return self._events
|
||||||
|
@events.setter
|
||||||
|
def events(self, controllers):
|
||||||
|
self._events = controllers(self)
|
||||||
|
self._connect_listeners()
|
||||||
|
|
||||||
|
def _connect_listeners(self):
|
||||||
|
for control in self.obj.Controls:
|
||||||
|
add_listeners(self.events, control)
|
||||||
|
return
|
||||||
|
|
||||||
|
def _set_image_url(self, image: str):
|
||||||
|
if Paths.exists(image):
|
||||||
|
return Paths.to_url(image)
|
||||||
|
|
||||||
|
path = Paths.join(self._path, DIR['images'], image)
|
||||||
|
return Paths.to_url(path)
|
||||||
|
|
||||||
|
def _special_properties(self, tipo, properties):
|
||||||
|
if tipo == 'link' and not 'Label' in properties:
|
||||||
|
properties['Label'] = properties['URL']
|
||||||
|
return properties
|
||||||
|
|
||||||
|
if tipo == 'button':
|
||||||
|
if 'ImageURL' in properties:
|
||||||
|
properties['ImageURL'] = self._set_image_url(properties['ImageURL'])
|
||||||
|
properties['FocusOnClick'] = properties.get('FocusOnClick', False)
|
||||||
|
return properties
|
||||||
|
|
||||||
|
if tipo == 'roadmap':
|
||||||
|
properties['Height'] = properties.get('Height', self.height)
|
||||||
|
if 'Title' in properties:
|
||||||
|
properties['Text'] = properties.pop('Title')
|
||||||
|
return properties
|
||||||
|
|
||||||
|
if tipo == 'tree':
|
||||||
|
properties['SelectionType'] = properties.get('SelectionType', SINGLE)
|
||||||
|
return properties
|
||||||
|
|
||||||
|
if tipo == 'grid':
|
||||||
|
properties['X'] = properties.get('X', SEPARATION)
|
||||||
|
properties['Y'] = properties.get('Y', SEPARATION)
|
||||||
|
properties['Width'] = properties.get('Width', self.width - SEPARATION * 2)
|
||||||
|
properties['Height'] = properties.get('Height', self.height - SEPARATION * 2)
|
||||||
|
properties['ShowRowHeader'] = properties.get('ShowRowHeader', True)
|
||||||
|
return properties
|
||||||
|
|
||||||
|
if tipo == 'pages':
|
||||||
|
properties['Width'] = properties.get('Width', self.width)
|
||||||
|
properties['Height'] = properties.get('Height', self.height)
|
||||||
|
|
||||||
|
return properties
|
||||||
|
|
||||||
|
def add_control(self, properties):
|
||||||
|
tipo = properties.pop('Type').lower()
|
||||||
|
root = properties.pop('Root', '')
|
||||||
|
sheets = properties.pop('Sheets', ())
|
||||||
|
columns = properties.pop('Columns', ())
|
||||||
|
|
||||||
|
properties = self._special_properties(tipo, properties)
|
||||||
|
model = self.model.createInstance(MODELS[tipo])
|
||||||
|
|
||||||
|
set_properties(model, properties)
|
||||||
|
name = properties['Name']
|
||||||
|
self.model.insertByName(name, model)
|
||||||
|
control = self.obj.getControl(name)
|
||||||
|
add_listeners(self.events, control)
|
||||||
|
control = UNO_CLASSES[tipo](control)
|
||||||
|
|
||||||
|
if tipo in ('listbox',):
|
||||||
|
control.path = self.path
|
||||||
|
|
||||||
|
if tipo == 'tree' and root:
|
||||||
|
control.root = root
|
||||||
|
elif tipo == 'grid' and columns:
|
||||||
|
control.columns = columns
|
||||||
|
elif tipo == 'pages' and sheets:
|
||||||
|
control.sheets = sheets
|
||||||
|
control.events = self.events
|
||||||
|
|
||||||
|
setattr(self, name, control)
|
||||||
|
self._controls[name] = control
|
||||||
|
return control
|
||||||
|
|
||||||
|
|
||||||
|
class LODialog():
|
||||||
|
@classmethod
|
||||||
|
def create(cls, properties: dict={}):
|
||||||
|
return DialogBox(properties)
|
||||||
|
|
||||||
|
|
||||||
|
def inputbox(message, default='', title=TITLE, echochar=''):
|
||||||
|
|
||||||
|
class ControllersInput(object):
|
||||||
|
|
||||||
|
def __init__(self, dialog):
|
||||||
|
self.d = dialog
|
||||||
|
|
||||||
|
def cmd_ok_action(self, event):
|
||||||
|
self.d.close(1)
|
||||||
|
return
|
||||||
|
|
||||||
|
properties = {
|
||||||
|
'Title': title,
|
||||||
|
'Width': 200,
|
||||||
|
'Height': 80,
|
||||||
|
}
|
||||||
|
dlg = DialogBox(properties)
|
||||||
|
dlg.events = ControllersInput
|
||||||
|
|
||||||
|
properties = {
|
||||||
|
'Type': 'Label',
|
||||||
|
'Name': 'lbl_msg',
|
||||||
|
'Label': message,
|
||||||
|
'Width': 140,
|
||||||
|
'Height': 50,
|
||||||
|
'X': 5,
|
||||||
|
'Y': 5,
|
||||||
|
'MultiLine': True,
|
||||||
|
'Border': 1,
|
||||||
|
}
|
||||||
|
dlg.add_control(properties)
|
||||||
|
|
||||||
|
properties = {
|
||||||
|
'Type': 'Text',
|
||||||
|
'Name': 'txt_value',
|
||||||
|
'Text': default,
|
||||||
|
'Width': 190,
|
||||||
|
'Height': 15,
|
||||||
|
}
|
||||||
|
if echochar:
|
||||||
|
properties['EchoChar'] = ord(echochar[0])
|
||||||
|
dlg.add_control(properties)
|
||||||
|
dlg.txt_value.move(dlg.lbl_msg)
|
||||||
|
|
||||||
|
properties = {
|
||||||
|
'Type': 'button',
|
||||||
|
'Name': 'cmd_ok',
|
||||||
|
'Label': _('OK'),
|
||||||
|
'Width': 40,
|
||||||
|
'Height': 15,
|
||||||
|
'DefaultButton': True,
|
||||||
|
'PushButtonType': 1,
|
||||||
|
}
|
||||||
|
dlg.add_control(properties)
|
||||||
|
dlg.cmd_ok.move(dlg.lbl_msg, 10, 0)
|
||||||
|
|
||||||
|
properties = {
|
||||||
|
'Type': 'button',
|
||||||
|
'Name': 'cmd_cancel',
|
||||||
|
'Label': _('Cancel'),
|
||||||
|
'Width': 40,
|
||||||
|
'Height': 15,
|
||||||
|
'PushButtonType': 2,
|
||||||
|
}
|
||||||
|
dlg.add_control(properties)
|
||||||
|
dlg.cmd_cancel.move(dlg.cmd_ok)
|
||||||
|
|
||||||
|
value = ''
|
||||||
|
if dlg.open():
|
||||||
|
value = dlg.txt_value.value
|
||||||
|
|
||||||
|
return value
|
|
@ -0,0 +1,40 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import unohelper
|
||||||
|
|
||||||
|
from com.sun.star.awt import XActionListener
|
||||||
|
from com.sun.star.lang import XEventListener
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'EventsButton',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class EventsListenerBase(unohelper.Base, XEventListener):
|
||||||
|
|
||||||
|
def __init__(self, controller, name, window=None):
|
||||||
|
self._controller = controller
|
||||||
|
self._name = name
|
||||||
|
self._window = window
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
def disposing(self, event):
|
||||||
|
self._controller = None
|
||||||
|
if not self._window is None:
|
||||||
|
self._window.setMenuBar(None)
|
||||||
|
|
||||||
|
|
||||||
|
class EventsButton(EventsListenerBase, XActionListener):
|
||||||
|
|
||||||
|
def __init__(self, controller, name):
|
||||||
|
super().__init__(controller, name)
|
||||||
|
|
||||||
|
def actionPerformed(self, event):
|
||||||
|
event_name = f'{self.name}_action'
|
||||||
|
if hasattr(self._controller, event_name):
|
||||||
|
getattr(self._controller, event_name)(event)
|
||||||
|
return
|
|
@ -57,7 +57,7 @@ logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=LOG_DATE)
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def create_instance(name: str, with_context: bool=False, argument: Any=None) -> Any:
|
def create_instance(name: str, with_context: bool=False, arguments: Any=None) -> Any:
|
||||||
"""Create a service instance
|
"""Create a service instance
|
||||||
|
|
||||||
:param name: Name of service
|
:param name: Name of service
|
||||||
|
@ -72,8 +72,8 @@ def create_instance(name: str, with_context: bool=False, argument: Any=None) ->
|
||||||
|
|
||||||
if with_context:
|
if with_context:
|
||||||
instance = SM.createInstanceWithContext(name, CTX)
|
instance = SM.createInstanceWithContext(name, CTX)
|
||||||
elif argument:
|
elif arguments:
|
||||||
instance = SM.createInstanceWithArguments(name, (argument,))
|
instance = SM.createInstanceWithArguments(name, (arguments,))
|
||||||
else:
|
else:
|
||||||
instance = SM.createInstance(name)
|
instance = SM.createInstance(name)
|
||||||
|
|
||||||
|
@ -155,3 +155,4 @@ class BaseObject():
|
||||||
def obj(self):
|
def obj(self):
|
||||||
"""Return original pyUno object"""
|
"""Return original pyUno object"""
|
||||||
return self._obj
|
return self._obj
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
MESSAGES = {
|
||||||
|
'es': {
|
||||||
|
'OK': 'Aceptar',
|
||||||
|
'Cancel': 'Cancelar',
|
||||||
|
'Select path': 'Seleccionar ruta',
|
||||||
|
'Select directory': 'Seleccionar directorio',
|
||||||
|
'Select file': 'Seleccionar archivo',
|
||||||
|
'Incorrect user or password': 'Nombre de usuario o contraseña inválidos',
|
||||||
|
'Allow less secure apps in GMail': 'Activa: Permitir aplicaciones menos segura en GMail',
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue