From d0c5f3a8ed35bff72a3c012b73a444789ec2522a Mon Sep 17 00:00:00 2001 From: El Mau Date: Thu, 7 Dec 2023 19:08:49 -0600 Subject: [PATCH] Add actions to controls --- CHANGELOG.md | 9 +- README.md | 6 +- VERSION | 2 +- docs/en/docs/debug.md | 198 +++++++++++++++++++++++ {doc => docs/en}/docs/img/favicon.ico | Bin {doc => docs/en}/docs/img/install_01.png | Bin {doc => docs/en}/docs/img/logo.png | Bin docs/en/docs/index.md | 29 ++++ docs/en/docs/install.md | 47 ++++++ docs/en/mkdocs.yml | 40 +++++ {doc => docs/es}/docs/app/index.md | 0 {doc => docs/es}/docs/app/menus.md | 0 {doc => docs/es}/docs/app/shortcuts.md | 0 {doc => docs/es}/docs/calc/cells.md | 0 {doc => docs/es}/docs/calc/index.md | 0 {doc => docs/es}/docs/calc/ranges.md | 0 {doc => docs/es}/docs/calc/sheets.md | 0 {doc => docs/es}/docs/debug.md | 0 {doc => docs/es}/docs/dialogs/cmd.md | 0 {doc => docs/es}/docs/dialogs/image.md | 0 {doc => docs/es}/docs/dialogs/index.md | 0 {doc => docs/es}/docs/dialogs/label.md | 0 {doc => docs/es}/docs/dialogs/link.md | 0 {doc => docs/es}/docs/dialogs/md.md | 0 {doc => docs/es}/docs/dialogs/text.md | 0 {doc => docs/es}/docs/docs/index.md | 0 {doc => docs/es}/docs/docs/methods.md | 0 {doc => docs/es}/docs/docs/properties.md | 0 {doc => docs/es}/docs/dp/drawpage.md | 0 {doc => docs/es}/docs/dp/shapes.md | 0 {doc => docs/es}/docs/examples/index.md | 0 docs/es/docs/img/favicon.ico | Bin 0 -> 1238 bytes docs/es/docs/img/install_01.png | Bin 0 -> 53522 bytes docs/es/docs/img/logo.png | Bin 0 -> 380 bytes {doc => docs/es}/docs/index.md | 0 {doc => docs/es}/docs/install.md | 0 {doc => docs/es}/docs/tools/datetime.md | 0 {doc => docs/es}/docs/tools/email.md | 0 {doc => docs/es}/docs/tools/index.md | 0 {doc => docs/es}/docs/tools/macros.md | 0 {doc => docs/es}/docs/tools/messages.md | 0 {doc => docs/es}/docs/tools/paths.md | 0 {doc => docs/es}/docs/tools/request.md | 0 {doc => docs/es}/docs/tools/threads.md | 0 {doc => docs/es}/docs/tools/timer.md | 0 {doc => docs/es}/docs/tools/utils.md | 0 {doc => docs/es}/mkdocs.yml | 18 +-- source/easymacro/__init__.py | 21 +++ source/easymacro/easycalc.py | 16 +- source/easymacro/easydialog.py | 40 ++++- source/easymacro/easydoc.py | 20 ++- source/easymacro/easymain.py | 20 ++- source/easymacro/easyshape.py | 1 + 53 files changed, 439 insertions(+), 28 deletions(-) create mode 100644 docs/en/docs/debug.md rename {doc => docs/en}/docs/img/favicon.ico (100%) rename {doc => docs/en}/docs/img/install_01.png (100%) rename {doc => docs/en}/docs/img/logo.png (100%) create mode 100644 docs/en/docs/index.md create mode 100644 docs/en/docs/install.md create mode 100644 docs/en/mkdocs.yml rename {doc => docs/es}/docs/app/index.md (100%) rename {doc => docs/es}/docs/app/menus.md (100%) rename {doc => docs/es}/docs/app/shortcuts.md (100%) rename {doc => docs/es}/docs/calc/cells.md (100%) rename {doc => docs/es}/docs/calc/index.md (100%) rename {doc => docs/es}/docs/calc/ranges.md (100%) rename {doc => docs/es}/docs/calc/sheets.md (100%) rename {doc => docs/es}/docs/debug.md (100%) rename {doc => docs/es}/docs/dialogs/cmd.md (100%) rename {doc => docs/es}/docs/dialogs/image.md (100%) rename {doc => docs/es}/docs/dialogs/index.md (100%) rename {doc => docs/es}/docs/dialogs/label.md (100%) rename {doc => docs/es}/docs/dialogs/link.md (100%) rename {doc => docs/es}/docs/dialogs/md.md (100%) rename {doc => docs/es}/docs/dialogs/text.md (100%) rename {doc => docs/es}/docs/docs/index.md (100%) rename {doc => docs/es}/docs/docs/methods.md (100%) rename {doc => docs/es}/docs/docs/properties.md (100%) rename {doc => docs/es}/docs/dp/drawpage.md (100%) rename {doc => docs/es}/docs/dp/shapes.md (100%) rename {doc => docs/es}/docs/examples/index.md (100%) create mode 100644 docs/es/docs/img/favicon.ico create mode 100644 docs/es/docs/img/install_01.png create mode 100644 docs/es/docs/img/logo.png rename {doc => docs/es}/docs/index.md (100%) rename {doc => docs/es}/docs/install.md (100%) rename {doc => docs/es}/docs/tools/datetime.md (100%) rename {doc => docs/es}/docs/tools/email.md (100%) rename {doc => docs/es}/docs/tools/index.md (100%) rename {doc => docs/es}/docs/tools/macros.md (100%) rename {doc => docs/es}/docs/tools/messages.md (100%) rename {doc => docs/es}/docs/tools/paths.md (100%) rename {doc => docs/es}/docs/tools/request.md (100%) rename {doc => docs/es}/docs/tools/threads.md (100%) rename {doc => docs/es}/docs/tools/timer.md (100%) rename {doc => docs/es}/docs/tools/utils.md (100%) rename {doc => docs/es}/mkdocs.yml (92%) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfbf32e..12a9c7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,15 @@ +v 0.5.0 [07-Dec-2023] +--------------------- + - Add acctions to controls. + - Refactorize documetation. + v 0.4.0 [20-Sep-2023] --------------------- - - Add control layout manager + - Add control layout manager. v 0.3.0 [23-Apr-2023] --------------------- - - Add method post + - Add method post. v 0.2.0 [23-Sep-2022] --------------------- diff --git a/README.md b/README.md index f43dd6e..bfa411b 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ This library have a cost of maintenance of 1 euro every year. In order of preferred. +* G1: `A5DdXxCKPw3QKWVdDVs7CzkNugNUW1sHu5zDJFWxCU2h` + Mauricio Baeza ``` Euros IBAN: BE60 9671 0556 5870 SWIFT / BIC: TRWIBEB1XXX -``` - -* G1: `A5DdXxCKPw3QKWVdDVs7CzkNugNUW1sHu5zDJFWxCU2h` +``` \ No newline at end of file diff --git a/VERSION b/VERSION index 1d0ba9e..8f0916f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.0 +0.5.0 diff --git a/docs/en/docs/debug.md b/docs/en/docs/debug.md new file mode 100644 index 0000000..d4f34d7 --- /dev/null +++ b/docs/en/docs/debug.md @@ -0,0 +1,198 @@ +## Tools for debug + +
+ +### **INFO_DEBUG** + +Show debugging information in a message box. + +If you have any problems in your code during the development of your macros, you can [open a ticket][1] support in the system ticket of this project. Always copy the debugging information shown in your issue. + +```py +import easymacro as app + +def info(): + app.msgbox(app.INFO_DEBUG) + return +``` + +![Info debug](img/install_01.png) + + +### **debug** + +Show information at the terminal. +```py +import easymacro as app + +def test_debug(): + msg = 'Verify this information...' + app.debug(msg) + return +``` + +To view this message, you need to start LibreOffice from the command line: +``` +soffice --calc +``` + +After executing the previous macro, you should see: +``` +21/04/2023 17:04:49 - DEBUG - Verify this information... +``` + +
+ +### **info** + +Show information messages at the terminal. +```py +import easymacro as app + +def test_info(): + msg = 'Starting process...' + app.info(msg) + return +``` + +``` +11/08/2022 18:23:53 - INFO - Starting process... +``` + +
+ +### **error** + +Show error messages at the terminal. +```py +import easymacro as app + +def test_error(): + msg = 'Error 505' + app.error(msg) + return +``` + +``` +11/08/2022 18:27:34 - ERROR - Error 505 +``` + +
+ +### **save_log** + +Save log in file, automatically add date and time. +```py +import easymacro as app + +def test_save_log(): + + app.save_log('/home/mau/log.txt', 'PyUNO') + app.save_log('/home/mau/log.txt', 'World Damn') + + return +``` + +``` +cat ~/log.txt +2022-08-11 18:30:11 - 'PyUNO' +2022-08-11 18:30:11 - 'World Damn' +``` + +
+ +### **msgbox** + +Show any information in a message box. +```python +import easymacro as app + +def message(): + + msg = 'Please, consume less.' + app.msgbox(msg) + + msg = ('one', 2, 'three') + app.msgbox(msg) + + msg = {'name': 'Teresa'} + app.msgbox(msg) + + app.msgbox(app) + + return +``` + +
+ +### **catch_exception** + +Capture any error that occurs when running a macro. + +!!! warning inline end "Caution" + + Use this method only in development time. **Do not use it in production**. + +```py +import easymacro as app + +@app.catch_exception +def test_capture_error(): + r = 1 / 0 + return +``` + +``` +11/08/2022 18:44:36 - ERROR - test_capture_error +Traceback (most recent call last): + File "/home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro/easytools.py", line 115, in func + return f(*args, **kwargs) + File "/home/mau/.config/libreoffice/4/user/Scripts/python/test.py", line 18, in test_capturar_error + r = 1 / 0 +ZeroDivisionError: division by zero +``` + +
+ +### **mri** + +[MRI][2] is the best extension to inspect any UNO LibreOffice object. You need to install it first so you can use it. + +```py +import easymacro as app + +def inspect_object(): + obj = app.active + app.mri(obj) + return +``` + +
+ +### **inspect** + +Inspect an object. +```py +import easymacro as app + +def inspect_object(): + doc = app.active + data = app.inspect(doc) + for p in data.properties: + app.debug(p) + for m in data.methods: + app.debug(m) + return +``` + +Send information of the object to worksheet. +```python +def inspect_object(): + doc = app.active + app.inspect(doc, True) + return +``` + + +[1]: https://git.cuates.net/elmau/easymacro/issues +[2]: https://github.com/hanya/MRI diff --git a/doc/docs/img/favicon.ico b/docs/en/docs/img/favicon.ico similarity index 100% rename from doc/docs/img/favicon.ico rename to docs/en/docs/img/favicon.ico diff --git a/doc/docs/img/install_01.png b/docs/en/docs/img/install_01.png similarity index 100% rename from doc/docs/img/install_01.png rename to docs/en/docs/img/install_01.png diff --git a/doc/docs/img/logo.png b/docs/en/docs/img/logo.png similarity index 100% rename from doc/docs/img/logo.png rename to docs/en/docs/img/logo.png diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md new file mode 100644 index 0000000..bef252f --- /dev/null +++ b/docs/en/docs/index.md @@ -0,0 +1,29 @@ +# Welcome to EasyMacro's documentation + +**Free Software, not gratis software** + +
+ +**easymacro** is a library to develop more easily macros in LibreOffice with Python. It is an abstraction layer between the extensive and complex UNO LibreOffice API and your code. + +You will probably be happier if you use it :) + +You can use **easymacro** with any extension or directly on your macros. + +
+ +- Symily or related projects in Python: + * [python-ooo-dev-tools](https://python-ooo-dev-tools.readthedocs.io) + * [oooscript](https://oooscript.readthedocs.io) + * [python-ooouno-ex](https://github.com/Amourspirit/python-ooouno-ex) +- Symily or related projects in other languages: + * [Java LibreOffice Programming](https://flywire.github.io/lo-p/) + +
+ +Contributions: + +- Moneda Libre Ğ1 (Junas):
+`A5DdXxCKPw3QKWVdDVs7CzkNugNUW1sHu5zDJFWxCU2h` + +
\ No newline at end of file diff --git a/docs/en/docs/install.md b/docs/en/docs/install.md new file mode 100644 index 0000000..e1f57c4 --- /dev/null +++ b/docs/en/docs/install.md @@ -0,0 +1,47 @@ +## Clone repository + +Clone the repository in your favorite project directory. +``` +git clone https://git.cuates.net/elmau/easymacro +``` + +Move into the directory +``` +cd easymacro/source +``` + +copy the `easymacro` folder into the **pythonpath** folder in the Python macro folder within your user profile. Replace **USER** by your real user. +``` +/home/USER/.config/libreoffice/4/user/Scripts/python/pythonpath +``` + +or use a symbolic link (recommended). Replace **PATH** by the absolute route where **easymacro** is located in your file system and **USER** by your username. +``` +ln -s PATH/easymacro/source/easymacro /home/USER/.config/libreoffice/4/user/Scripts/python/pythonpath/ +``` + + +## Test + +In your favorite macros file, for example **mymacros.py**. Use your favorite plain text editor or IDE. Remember, replace **USER** by your real user. +``` +geany /home/USER/.config/libreoffice/4/user/Scripts/python/mymacros.py +``` + +Copy the following code: +```py +import easymacro as app + +def main(): + app.msgbox(app.INFO_DEBUG) + return +``` + +Run the **main** macro in LibreOffice, if you see a message box with information similar to the following! + +![Test install](img/install_01.png) + +It is all ready to start developing macros with **easymacro**. + + +Happy programming! diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml new file mode 100644 index 0000000..00d4ccf --- /dev/null +++ b/docs/en/mkdocs.yml @@ -0,0 +1,40 @@ +site_name: EasyMacro for LibreOffice +site_url: https://doc.cuates.net/easymacro/ +repo_url: https://git.cuates.net/elmau/easymacro/ +nav: + - Home: index.md + - Install: install.md + - Debug: debug.md +theme: + name: material + locale: en + font: false + highlightjs: true + palette: + primary: green + features: + - navigation.path + - content.code.copy + - content.code.select +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.tabbed: + alternate_style: true + - tables + - pymdownx.keys +extra: + alternate: + - name: English + link: / + lang: en + - name: Español + link: /langs/es + lang: es diff --git a/doc/docs/app/index.md b/docs/es/docs/app/index.md similarity index 100% rename from doc/docs/app/index.md rename to docs/es/docs/app/index.md diff --git a/doc/docs/app/menus.md b/docs/es/docs/app/menus.md similarity index 100% rename from doc/docs/app/menus.md rename to docs/es/docs/app/menus.md diff --git a/doc/docs/app/shortcuts.md b/docs/es/docs/app/shortcuts.md similarity index 100% rename from doc/docs/app/shortcuts.md rename to docs/es/docs/app/shortcuts.md diff --git a/doc/docs/calc/cells.md b/docs/es/docs/calc/cells.md similarity index 100% rename from doc/docs/calc/cells.md rename to docs/es/docs/calc/cells.md diff --git a/doc/docs/calc/index.md b/docs/es/docs/calc/index.md similarity index 100% rename from doc/docs/calc/index.md rename to docs/es/docs/calc/index.md diff --git a/doc/docs/calc/ranges.md b/docs/es/docs/calc/ranges.md similarity index 100% rename from doc/docs/calc/ranges.md rename to docs/es/docs/calc/ranges.md diff --git a/doc/docs/calc/sheets.md b/docs/es/docs/calc/sheets.md similarity index 100% rename from doc/docs/calc/sheets.md rename to docs/es/docs/calc/sheets.md diff --git a/doc/docs/debug.md b/docs/es/docs/debug.md similarity index 100% rename from doc/docs/debug.md rename to docs/es/docs/debug.md diff --git a/doc/docs/dialogs/cmd.md b/docs/es/docs/dialogs/cmd.md similarity index 100% rename from doc/docs/dialogs/cmd.md rename to docs/es/docs/dialogs/cmd.md diff --git a/doc/docs/dialogs/image.md b/docs/es/docs/dialogs/image.md similarity index 100% rename from doc/docs/dialogs/image.md rename to docs/es/docs/dialogs/image.md diff --git a/doc/docs/dialogs/index.md b/docs/es/docs/dialogs/index.md similarity index 100% rename from doc/docs/dialogs/index.md rename to docs/es/docs/dialogs/index.md diff --git a/doc/docs/dialogs/label.md b/docs/es/docs/dialogs/label.md similarity index 100% rename from doc/docs/dialogs/label.md rename to docs/es/docs/dialogs/label.md diff --git a/doc/docs/dialogs/link.md b/docs/es/docs/dialogs/link.md similarity index 100% rename from doc/docs/dialogs/link.md rename to docs/es/docs/dialogs/link.md diff --git a/doc/docs/dialogs/md.md b/docs/es/docs/dialogs/md.md similarity index 100% rename from doc/docs/dialogs/md.md rename to docs/es/docs/dialogs/md.md diff --git a/doc/docs/dialogs/text.md b/docs/es/docs/dialogs/text.md similarity index 100% rename from doc/docs/dialogs/text.md rename to docs/es/docs/dialogs/text.md diff --git a/doc/docs/docs/index.md b/docs/es/docs/docs/index.md similarity index 100% rename from doc/docs/docs/index.md rename to docs/es/docs/docs/index.md diff --git a/doc/docs/docs/methods.md b/docs/es/docs/docs/methods.md similarity index 100% rename from doc/docs/docs/methods.md rename to docs/es/docs/docs/methods.md diff --git a/doc/docs/docs/properties.md b/docs/es/docs/docs/properties.md similarity index 100% rename from doc/docs/docs/properties.md rename to docs/es/docs/docs/properties.md diff --git a/doc/docs/dp/drawpage.md b/docs/es/docs/dp/drawpage.md similarity index 100% rename from doc/docs/dp/drawpage.md rename to docs/es/docs/dp/drawpage.md diff --git a/doc/docs/dp/shapes.md b/docs/es/docs/dp/shapes.md similarity index 100% rename from doc/docs/dp/shapes.md rename to docs/es/docs/dp/shapes.md diff --git a/doc/docs/examples/index.md b/docs/es/docs/examples/index.md similarity index 100% rename from doc/docs/examples/index.md rename to docs/es/docs/examples/index.md diff --git a/docs/es/docs/img/favicon.ico b/docs/es/docs/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..563a62674383ef55021d8173f6418eeec013b2e2 GIT binary patch literal 1238 zcmb`HyGjE=6o!vC(kV!=QnXB^k01)ZgjHZ~u&||CC8RQGt!*rQ0@6h;l?c16B0r96ZbE{`- zt(yPqq1}g3#hO)lb!_9ndRkk^`aOf?+yDgbU@GeJv```v(=?P0*$eI zUZwXK$MJS~hJ8I+Ex0q9AI!`BoiIKtilX7uuy*2?pa**HwAOb}y(ieS@pb2X&p!Fj mp#R`9ilWuJxxP4bR^WVk&$P?i#@{cDL>d#3P1loMH! literal 0 HcmV?d00001 diff --git a/docs/es/docs/img/install_01.png b/docs/es/docs/img/install_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3783237a66be62b2093f2b39f5efe5b1e06a6052 GIT binary patch literal 53522 zcmb@uby${PzbA@HNTYO%NSAa-NJw`#(%s!6-AXso-Q6hN-QC^Yv+%dy{qET_=gf7k zGyb9S-0`gYUh)0ZB2ZdV2oVkk4gvxKQAAik76RfWEd<1i{nyaolZ)@958xk2TRsu_ z*Wi!aYrO#QGq&9qWji@b13O1;8+`~v3rll-8e3f(eSHgCBTKuZS1sJ&B%0@w_-*vH z?Tjrg-pL!A>q7|I7{6nnf5&TO^N!&o1LM1oOdQM%93NTUNlU!rmy`b@fLa0p@eV>n zfLGorX@9}q4RwpK^+ZZ83n}Y6hNGjS{|kP9Ml-Y4Z`iu6Slo6Wzv?1PmC?_`qt(!V z6%PJno+s<2nsEO}jwq2>DbjS`d^AN>lIa+(d6;0C;(GX!?=_JR%76cB-Hdc*;T!ek z)1($S`b0Pmekx4wK7{^zG8Scn(7W;mkLL@q=;j2S%BifbJqwh;!EW&xbYVT`ruYZm zl*v=Z0*$w|;8Q0;eMN|$lQxVrzj{KDZFKwkd%yB+p8q|PS6)i1>m7lBsKdZu^f9wA zYEL+pQ`-eFYNS;r5ou;KKBqwf1 zE!O)X`T|=R#xoXbl{cjpTzYEo$0 zF(n5Lr!^)*|LiAF{p)EbT?5Am%Me|9xhZSy^~WSrj@_?_s4_1x z(Hv`8IB{9m?cS1t`}2s_FRzK(@5qU{iRIu`&!K2<32u9(a2m1D`}Nub#Q3r(plE{R zA6Y&Gh^T6*3NQcjP?Nz@vTz>}U=` w!wv{nX(QJHe%bYIdRZ9}p$cTvFuVbj~Nz z_AL2(6uy9AuqcF$UYqHlN^V@L6QPH_jieJ1R-NfQ-Z2dEuId*_*0(R(t)?0;5JWU_ z$28sb+W%=(lM*@!mqaF&mCTNlH5aa3FOwKx})2;<|3S<5q5SYCv9nbzHkas$>-`(WZ_k|>xokWLSNos<_Hu? zUJ2+vcc9*npsBOJN!*-nm}+o(9$szd3iq*=5F_ONZ7uuHsv`WD7{w9$Jyxv4 zgM$a;BSFn`sE>h!Dmb;7EU>J`tvZ*Nb$q{``k2e;M`%YzWT54#Kyw0;`bS6M7~$bP z4KZuNUs$fbLMO?Cp`%zRrR``Xsp`qk(+Dy%LW#5-tFJmx$Y+C9eZJ^Qz|IcMB)V7s zA%Xe8tFiHJe#-vBYBbpLE#vhhSzc&urd@*YRAUV2zd%Bg6du=dL2OhF^5|P|@#~*` z%F3$TRLaxtSjRuE-^8|uw`b7aZZ>@L%AhsADSEHL8X&gQOq2bsDG!#m_k3yRd7`4Q zhpHY3-XBPaJ3GSK{UJWt`Q;NwbTS0-8RJ3mClPCk7*=4JJY}@O+nVRIj|dgildw;& z^u(_BrSKX*H1le#3MHh!bXQ z?}jw$K&GNmvm$k2LR=^Hypo)FxZGi<&ic$F+)$*3ToAOD6$6VHh)K6E(f2LxmN{E@g z#2jSvGlZZIYVTZh$1zHRX-1H&qS;2ZdWH7rO49FRS3@B zUv&HyGmy9~9vj`YWJ^fsp?XP$Ou#jw>hX|`Ic4dx;=D_p>dBInA5CdI`9-L!^r#dD z;=%PQ)3(b2(%KcI!NS3=bbS%K(H{w4x3_~__ANoCRJbo$bTk@!32)0dub%Y6K4?!63BSEN z&AYrZoNwJh;|?L+t&Tw)j|bY-)fM8;`}c8IW3m=53kFk@7sfQRKR#`ca>?nQdnGQ) zv5DaRxV9I46N9qKRq6UflyZ0dOPV~6`Qj5twW-9+^mX@j#iAPC_?4KDiJu*aawBbyQ(TqeZo?&Nt~J#2#UY4MO4`Qy7Y zbMeYVu^^pdYkcMmg2`Ap{O#dk&#ZcR+^3=hmX&}lSlS0ybcLiKEv1sSwzEu9i5d^W zSHoozR607k7sa^TP7tY5aqVMUl1e>$D6IRc^Jk50hBo&qRO!?nhz{2if4{1-=QF!ðW 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 literal 0 HcmV?d00001 diff --git a/docs/es/docs/img/logo.png b/docs/es/docs/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..88c98f126b52fe5fc824bf5a7b56bff18020285a GIT binary patch literal 380 zcmV-?0fYXDP)z=a9lTYXU^P=k|epQ>w2#!if4YIG)?D$ivZXS!|)+Z)6H37&bck% z5f~~-k`EvR47iNr_#n^oYRXh|z#(u11i)L+@dfNxRdw&2Tb=^81dM>=F$_T6gk6=u z2@nJ8z~cDelbMYqmB1-5nAm%dz6me@&c5icNZRR39`ug4ZN% z{19?$W_JLREHE?m3^$Utz4!9o3mEp1%}kM`S4nN7oR|sB>^jS`)w-@1fU8M}q*BsL aTYmz1tWpvjsf#uM0000. + + from .easymain import * from .easydialog import * from .easytools import * @@ -8,6 +25,10 @@ from .easydocs import LODocuments from .easydrawpage import LOGalleries +__version__ = '0.5.0' +__author__ = 'Mauricio Baeza (elMau)' + + def __getattr__(name): classes = { 'active': LODocuments().active, diff --git a/source/easymacro/easycalc.py b/source/easymacro/easycalc.py index d01452d..4dab252 100644 --- a/source/easymacro/easycalc.py +++ b/source/easymacro/easycalc.py @@ -8,7 +8,7 @@ from com.sun.star.sheet import CellFlags from com.sun.star.table.CellContentType import EMPTY, VALUE, TEXT, FORMULA from .easymain import (log, DATE_OFFSET, - BaseObject, Color, + BaseObject, Color, LOMain, dict_to_property, run_in_thread, set_properties ) from .easydoc import LODocument @@ -624,6 +624,20 @@ class LOCalcRange(): cols = ra.EndColumn - ra.StartColumn + 1 return rows, cols + def select(self): + """ """ + self.doc.select(self.obj) + return + + def to_image(self): + """ """ + self.select() + self.doc.copy() + args = {'SelectedFormat': 141} + url = 'ClipboardFormatItems' + LOMain.dispatch(self.doc.frame, url, args) + return self.sheet.shapes[-1] + class LOCalcSheet(BaseObject): diff --git a/source/easymacro/easydialog.py b/source/easymacro/easydialog.py index fb79e13..1ecb037 100644 --- a/source/easymacro/easydialog.py +++ b/source/easymacro/easydialog.py @@ -101,6 +101,37 @@ def add_listeners(events, control): return +# ~ getAccessibleActionKeyBinding +class UnoActions(): + ACTIONS = { + 'press': 0, + 'activate': 0, + } + + def __init__(self, obj: Any): + self._obj = obj + self._ac = obj.AccessibleContext + self._actions = hasattr(self._ac, 'AccessibleActionCount') + + def __str__(self): + return ', '.join(self.get()) + + def get(self): + actions = () + if self._actions: + actions = [self._ac.getAccessibleActionDescription(i) for i in + range(self._ac.AccessibleActionCount)] + return actions + + def press(self): + result = self._ac.doAccessibleAction(self.ACTIONS['press']) + return result + + def activate(self): + result = self._ac.doAccessibleAction(self.ACTIONS['activate']) + return result + + class UnoBaseObject(object): def __init__(self, obj: Any): @@ -317,6 +348,10 @@ class UnoBaseObject(object): def ps(self, ps): self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, POSSIZE) + @property + def actions(self): + return UnoActions(self.obj) + def set_focus(self): self.obj.setFocus() return @@ -469,7 +504,7 @@ class UnoImage(UnoBaseObject): @property def type(self): - return 'button' + return 'image' @property def value(self): @@ -547,6 +582,7 @@ class DialogBox(BaseObject): obj = self._create(properties) super().__init__(obj) self._init_controls() + self._events = None self._modal = False def _create_from_path(self, path: str): @@ -705,7 +741,7 @@ class DialogBox(BaseObject): return Paths.to_url(path) def _special_properties(self, tipo, properties): - if tipo == 'link' and not 'Label' in properties: + if tipo == 'link' and 'URL' in properties and not 'Label' in properties: properties['Label'] = properties['URL'] return properties diff --git a/source/easymacro/easydoc.py b/source/easymacro/easydoc.py index 69e1004..d2fdebf 100644 --- a/source/easymacro/easydoc.py +++ b/source/easymacro/easydoc.py @@ -46,6 +46,9 @@ class LOLayoutManager(BaseObject): self.obj.hideElement(name) return + # ~ def create(self, name): + # ~ return self.obj.createElement(name) + class LODocument(BaseObject): @@ -238,6 +241,8 @@ class LODocument(BaseObject): :type args: dict :return: None if path or stream in memory :rtype: bytes or None + + https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html """ FILTERS = { 'xlsx': 'Calc MS Excel 2007 XML', @@ -249,8 +254,11 @@ class LODocument(BaseObject): stream = None path_target = 'private:stream' + if filter_name == 'svg': + filter_name = f'{self.type}_svg_Export' + else: + filter_name = FILTERS.get(filter_name, filter_name) - filter_name = FILTERS.get(filter_name, filter_name) filter_data = dict_to_property(args, True) filters = { 'FilterName': filter_name, @@ -266,7 +274,7 @@ class LODocument(BaseObject): try: self.obj.storeToURL(path_target, opt) except Exception as e: - error(e) + log.error(e) if not stream is None: stream = stream.buffer @@ -284,6 +292,11 @@ class LODocument(BaseObject): LOMain.dispatch(self.frame, 'Copy') return + def cut(self): + """Copy current selection""" + LOMain.dispatch(self.frame, 'Cut') + return + def paste(self): """Paste current content in clipboard""" sc = create_instance('com.sun.star.datatransfer.clipboard.SystemClipboard') @@ -314,6 +327,9 @@ class LODocument(BaseObject): self.obj.getUndoManager().clear() return + def replace_ext(self, new_ext): + return Paths.with_suffix(self.path, new_ext) + class LODrawImpress(LODocument): diff --git a/source/easymacro/easymain.py b/source/easymacro/easymain.py index ac401b0..6765153 100644 --- a/source/easymacro/easymain.py +++ b/source/easymacro/easymain.py @@ -537,7 +537,7 @@ class LOMain(): return cls._set_app_command(command, True) @classmethod - def enabled(cls, command) -> bool: + def enabled(cls, command: str) -> bool: """Enabled UNO command :param command: UNO command to enabled @@ -599,13 +599,14 @@ class LOMain(): class ClipBoard(object): SERVICE = 'com.sun.star.datatransfer.clipboard.SystemClipboard' - CLIPBOARD_FORMAT_TEXT = 'text/plain;charset=utf-16' + TEXT = 'text/plain;charset=utf-16' + IMAGE = 'application/x-openoffice-bitmap;windows_formatname="Bitmap"' class TextTransferable(unohelper.Base, XTransferable): def __init__(self, text): df = DataFlavor() - df.MimeType = ClipBoard.CLIPBOARD_FORMAT_TEXT + df.MimeType = ClipBoard.TEXT df.HumanPresentableName = 'encoded text utf-16' self.flavors = (df,) self._data = text @@ -631,7 +632,7 @@ class ClipBoard(object): transferable = sc.getContents() data = transferable.getTransferDataFlavors() for df in data: - if df.MimeType == cls.CLIPBOARD_FORMAT_TEXT: + if df.MimeType == cls.TEXT: break if df: text = transferable.getTransferData(df) @@ -1045,10 +1046,13 @@ class Paths(object): :return: Path with new extension :rtype: str """ - p = Paths(path) - name = f'{p.name}.{new_ext}' - path = cls.join(p.path, name) - return path + if not new_ext.startswith('.'): + new_ext = f'.{new_ext}' + return Path(path).with_suffix(new_ext) + + @classmethod + def with_suffix(cls, path: str, new_ext: str): + return cls.replace_ext(path, new_ext) @classmethod def open(cls, path: str): diff --git a/source/easymacro/easyshape.py b/source/easymacro/easyshape.py index f346a1a..5d4da91 100644 --- a/source/easymacro/easyshape.py +++ b/source/easymacro/easyshape.py @@ -245,6 +245,7 @@ class LOShape(BaseObject): def save(self, path: str='', name: str=''): """Save image""" + if not path: path = Paths(self.doc.URL).path if not name: