diff --git a/.env b/.env deleted file mode 100644 index 9319d2d..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -PYTHONPATH="E:\Documents - Repositories\roar\libcanvas;E:\Documents - Repositories\roar\libgui;E:\Documents - Repositories\roar\liboperators;E:\Documents - Repositories\roar\libroar;E:\Documents - Repositories\roar\librtl;E:\Documents - Repositories\roar\libtools" diff --git a/.gitignore b/.gitignore index c319fe3..95922b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,17 @@ +!.git_empty +*.exp +*.lib +*.o +*.obj *.sw[op] +.vs/ __pycache__/ -build/ -libgui/GuiCanvasWxBackendFast.exp -libgui/GuiCanvasWxBackendFast.lib -libgui/GuiCanvasWxBackendFast.obj -libgui/GuiCanvasWxBackendFast.pyd -librtl/ImgurApiKey.py -releases/ +libgui/.qmake.stash +libgui/debug/* +libgui/Makefile* +libgui/moc_*.cpp +libgui/release/* +roar-python/libgui/GuiCanvasWxBackendFast.pyd +roar-python/librtl/ImgurApiKey.py +roar-vs/x64/ +x64/ diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100755 index ed3dc79..0000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "configurations": [ - { - "name": "Win32", - "includePath": [ - "${workspaceFolder}/**", - "C:/Python37/include/**" - ], - "defines": [ - "_DEBUG", - "UNICODE", - "_UNICODE" - ], - "windowsSdkVersion": "10.0.18362.0", - "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.23.28105/bin/Hostx64/x64/cl.exe", - "cStandard": "c11", - "cppStandard": "c++17", - "intelliSenseMode": "msvc-x64", - "compilerArgs": [] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100755 index 2164a8c..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python: Current File (Integrated Terminal)", - "type": "python", - "request": "launch", - "program": "${file}", - "console": "integratedTerminal" - }, - { - "name": "Python: Remote Attach", - "type": "python", - "request": "attach", - "port": 5678, - "host": "localhost", - "pathMappings": [ - { - "localRoot": "${workspaceFolder}", - "remoteRoot": "." - } - ] - }, - { - "name": "Python: Module", - "type": "python", - "request": "launch", - "module": "enter-your-module-name-here", - "console": "integratedTerminal" - }, - { - "name": "Python: Django", - "type": "python", - "request": "launch", - "program": "${workspaceFolder}/manage.py", - "console": "integratedTerminal", - "args": [ - "runserver", - "--noreload", - "--nothreading" - ], - "django": true - }, - { - "name": "Python: Flask", - "type": "python", - "request": "launch", - "module": "flask", - "env": { - "FLASK_APP": "app.py" - }, - "args": [ - "run", - "--no-debugger", - "--no-reload" - ], - "jinja": true - }, - { - "name": "Python: Current File (External Terminal)", - "type": "python", - "request": "launch", - "program": "${file}", - "console": "externalTerminal" - } - ] -} \ No newline at end of file diff --git a/.vscode/roar.code-workspace b/.vscode/roar.code-workspace deleted file mode 100755 index df41b73..0000000 --- a/.vscode/roar.code-workspace +++ /dev/null @@ -1,8 +0,0 @@ -{ - "folders": [ - { - "path": "E:\\Documents - Repositories\\roar" - } - ], - "settings": {} -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100755 index b47f807..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "python.analysis.disabled": ["unresolved-import"], - "python.pythonPath": "C:\\Python37\\python.exe", - "python.linting.enabled": false -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100755 index 22e01f8..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "Build libgui/GuiCanvasWxBackendFast.pyd", - "type": "shell", - "command": "cd \"${workspaceFolder}/libgui\" && cmd /c cl /EHsc /LD /Ox /Wall /WX /IC:/Python37/include GuiCanvasWxBackendFast.cpp C:/Python37/libs/python37.lib /FeGuiCanvasWxBackendFast.pyd", - "problemMatcher": [ - "$msCompile" - ] - } - ] -} \ No newline at end of file diff --git a/assets/audio/roardaemon2.wav b/assets/audio/roardaemon2.wav new file mode 100644 index 0000000..8fdf0d1 Binary files /dev/null and b/assets/audio/roardaemon2.wav differ diff --git a/assets/audio/roardaemon3.wav b/assets/audio/roardaemon3.wav new file mode 100644 index 0000000..a0107ec Binary files /dev/null and b/assets/audio/roardaemon3.wav differ diff --git a/assets/audio/roarspoke16.wav b/assets/audio/roarspoke16.wav new file mode 100644 index 0000000..1639964 Binary files /dev/null and b/assets/audio/roarspoke16.wav differ diff --git a/assets/audio/roarspoke17.wav b/assets/audio/roarspoke17.wav new file mode 100644 index 0000000..73de8e5 Binary files /dev/null and b/assets/audio/roarspoke17.wav differ diff --git a/assets/audio/roarspoke18.wav b/assets/audio/roarspoke18.wav new file mode 100644 index 0000000..af68699 Binary files /dev/null and b/assets/audio/roarspoke18.wav differ diff --git a/assets/audio/roarspoke19.wav b/assets/audio/roarspoke19.wav new file mode 100644 index 0000000..1567a85 Binary files /dev/null and b/assets/audio/roarspoke19.wav differ diff --git a/assets/audio/roarspoke20.wav b/assets/audio/roarspoke20.wav new file mode 100644 index 0000000..8b55d01 Binary files /dev/null and b/assets/audio/roarspoke20.wav differ diff --git a/assets/audio/roarspoke21.wav b/assets/audio/roarspoke21.wav new file mode 100644 index 0000000..d93d230 Binary files /dev/null and b/assets/audio/roarspoke21.wav differ diff --git a/assets/fonts/DejaVuSansMono.ttf b/assets/fonts/DejaVuSansMono.ttf deleted file mode 100644 index f578602..0000000 Binary files a/assets/fonts/DejaVuSansMono.ttf and /dev/null differ diff --git a/assets/images/colour00.png b/assets/images/colour00.png new file mode 100644 index 0000000..ab17045 Binary files /dev/null and b/assets/images/colour00.png differ diff --git a/assets/images/colour01.png b/assets/images/colour01.png new file mode 100644 index 0000000..d5fe043 Binary files /dev/null and b/assets/images/colour01.png differ diff --git a/assets/images/colour02.png b/assets/images/colour02.png new file mode 100644 index 0000000..ac3e60f Binary files /dev/null and b/assets/images/colour02.png differ diff --git a/assets/images/colour03.png b/assets/images/colour03.png new file mode 100644 index 0000000..e8dd084 Binary files /dev/null and b/assets/images/colour03.png differ diff --git a/assets/images/colour04.png b/assets/images/colour04.png new file mode 100644 index 0000000..858ec8e Binary files /dev/null and b/assets/images/colour04.png differ diff --git a/assets/images/colour05.png b/assets/images/colour05.png new file mode 100644 index 0000000..a0f21d6 Binary files /dev/null and b/assets/images/colour05.png differ diff --git a/assets/images/colour06.png b/assets/images/colour06.png new file mode 100644 index 0000000..98a2baa Binary files /dev/null and b/assets/images/colour06.png differ diff --git a/assets/images/colour07.png b/assets/images/colour07.png new file mode 100644 index 0000000..f4f55d5 Binary files /dev/null and b/assets/images/colour07.png differ diff --git a/assets/images/colour08.png b/assets/images/colour08.png new file mode 100644 index 0000000..fffc962 Binary files /dev/null and b/assets/images/colour08.png differ diff --git a/assets/images/colour09.png b/assets/images/colour09.png new file mode 100644 index 0000000..dcb4fe2 Binary files /dev/null and b/assets/images/colour09.png differ diff --git a/assets/images/colour10.png b/assets/images/colour10.png new file mode 100644 index 0000000..68401df Binary files /dev/null and b/assets/images/colour10.png differ diff --git a/assets/images/colour11.png b/assets/images/colour11.png new file mode 100644 index 0000000..cea376c Binary files /dev/null and b/assets/images/colour11.png differ diff --git a/assets/images/colour12.png b/assets/images/colour12.png new file mode 100644 index 0000000..17e7895 Binary files /dev/null and b/assets/images/colour12.png differ diff --git a/assets/images/colour13.png b/assets/images/colour13.png new file mode 100644 index 0000000..bf008e0 Binary files /dev/null and b/assets/images/colour13.png differ diff --git a/assets/images/colour14.png b/assets/images/colour14.png new file mode 100644 index 0000000..fd51232 Binary files /dev/null and b/assets/images/colour14.png differ diff --git a/assets/images/colour15.png b/assets/images/colour15.png new file mode 100644 index 0000000..bcc80d6 Binary files /dev/null and b/assets/images/colour15.png differ diff --git a/assets/images/colourBg00.png b/assets/images/colourBg00.png new file mode 100644 index 0000000..e9419bb Binary files /dev/null and b/assets/images/colourBg00.png differ diff --git a/assets/images/colourBg01.png b/assets/images/colourBg01.png new file mode 100644 index 0000000..53993f0 Binary files /dev/null and b/assets/images/colourBg01.png differ diff --git a/assets/images/colourBg02.png b/assets/images/colourBg02.png new file mode 100644 index 0000000..c97650d Binary files /dev/null and b/assets/images/colourBg02.png differ diff --git a/assets/images/colourBg03.png b/assets/images/colourBg03.png new file mode 100644 index 0000000..e8be6bf Binary files /dev/null and b/assets/images/colourBg03.png differ diff --git a/assets/images/colourBg04.png b/assets/images/colourBg04.png new file mode 100644 index 0000000..f93750a Binary files /dev/null and b/assets/images/colourBg04.png differ diff --git a/assets/images/colourBg05.png b/assets/images/colourBg05.png new file mode 100644 index 0000000..f02464d Binary files /dev/null and b/assets/images/colourBg05.png differ diff --git a/assets/images/colourBg06.png b/assets/images/colourBg06.png new file mode 100644 index 0000000..23f0d5b Binary files /dev/null and b/assets/images/colourBg06.png differ diff --git a/assets/images/colourBg07.png b/assets/images/colourBg07.png new file mode 100644 index 0000000..a0d61c1 Binary files /dev/null and b/assets/images/colourBg07.png differ diff --git a/assets/images/colourBg08.png b/assets/images/colourBg08.png new file mode 100644 index 0000000..735a6da Binary files /dev/null and b/assets/images/colourBg08.png differ diff --git a/assets/images/colourBg09.png b/assets/images/colourBg09.png new file mode 100644 index 0000000..2c575ab Binary files /dev/null and b/assets/images/colourBg09.png differ diff --git a/assets/images/colourBg10.png b/assets/images/colourBg10.png new file mode 100644 index 0000000..b1c5453 Binary files /dev/null and b/assets/images/colourBg10.png differ diff --git a/assets/images/colourBg11.png b/assets/images/colourBg11.png new file mode 100644 index 0000000..cecd99e Binary files /dev/null and b/assets/images/colourBg11.png differ diff --git a/assets/images/colourBg12.png b/assets/images/colourBg12.png new file mode 100644 index 0000000..9f335d7 Binary files /dev/null and b/assets/images/colourBg12.png differ diff --git a/assets/images/colourBg13.png b/assets/images/colourBg13.png new file mode 100644 index 0000000..7252baf Binary files /dev/null and b/assets/images/colourBg13.png differ diff --git a/assets/images/colourBg14.png b/assets/images/colourBg14.png new file mode 100644 index 0000000..1139a6d Binary files /dev/null and b/assets/images/colourBg14.png differ diff --git a/assets/images/colourBg15.png b/assets/images/colourBg15.png new file mode 100644 index 0000000..c441671 Binary files /dev/null and b/assets/images/colourBg15.png differ diff --git a/assets/images/colourBg_transparent.png b/assets/images/colourBg_transparent.png new file mode 100644 index 0000000..d07b16b Binary files /dev/null and b/assets/images/colourBg_transparent.png differ diff --git a/assets/images/colour_transparent.png b/assets/images/colour_transparent.png new file mode 100644 index 0000000..d07b16b Binary files /dev/null and b/assets/images/colour_transparent.png differ diff --git a/assets/images/document-new.svg b/assets/images/document-new.svg new file mode 100644 index 0000000..a660948 --- /dev/null +++ b/assets/images/document-new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/document-open-data.svg b/assets/images/document-open-data.svg new file mode 100644 index 0000000..a752362 --- /dev/null +++ b/assets/images/document-open-data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/document-save-as.svg b/assets/images/document-save-as.svg new file mode 100644 index 0000000..202ae77 --- /dev/null +++ b/assets/images/document-save-as.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/document-save.svg b/assets/images/document-save.svg new file mode 100644 index 0000000..202ae77 --- /dev/null +++ b/assets/images/document-save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/edit-copy.svg b/assets/images/edit-copy.svg new file mode 100644 index 0000000..560d54f --- /dev/null +++ b/assets/images/edit-copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/edit-cut.svg b/assets/images/edit-cut.svg new file mode 100644 index 0000000..3381a1b --- /dev/null +++ b/assets/images/edit-cut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/edit-delete.svg b/assets/images/edit-delete.svg new file mode 100644 index 0000000..0307d35 --- /dev/null +++ b/assets/images/edit-delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/edit-paste.svg b/assets/images/edit-paste.svg new file mode 100644 index 0000000..c784841 --- /dev/null +++ b/assets/images/edit-paste.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/edit-redo.svg b/assets/images/edit-redo.svg new file mode 100644 index 0000000..c65ca4f --- /dev/null +++ b/assets/images/edit-redo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/edit-undo.svg b/assets/images/edit-undo.svg new file mode 100644 index 0000000..8d31273 --- /dev/null +++ b/assets/images/edit-undo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/text/ImgurApiKey.py.template b/assets/text/ImgurApiKey.py.template deleted file mode 100644 index 9547ca2..0000000 --- a/assets/text/ImgurApiKey.py.template +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python3 -# -# ImgurApiKey.py -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -class ImgurApiKey(object): - imgurApiKey = None - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/text/LICENCE b/assets/text/LICENCE index ec9ca90..f288702 100644 --- a/assets/text/LICENCE +++ b/assets/text/LICENCE @@ -1,21 +1,674 @@ -Copyright (c) 2018 Lucio Andrés Illanes Albornoz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -vim:ff=dos + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/assets/text/LICENCE.Antu-classic b/assets/text/LICENCE.Antu-classic new file mode 100644 index 0000000..6cf98cb --- /dev/null +++ b/assets/text/LICENCE.Antu-classic @@ -0,0 +1,517 @@ +------------------------ +Antü Classic icon theme +------------------------ + +Original parts, changes, mixes, re-mixes and re-designs by Fabián Alexis + +Some elementes (monochrome toolbar icons) of icon theme are part of Breeze icon Theme. + +All Antü Classic components are licensed under the LGPL 2.1 License (look at the licensing of external components) + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/assets/text/README.md b/assets/text/README.md index 20a9f60..43ff67c 100644 --- a/assets/text/README.md +++ b/assets/text/README.md @@ -1,11 +1,5 @@ -# roar.py -- mIRC art editor for Windows & Linux (WIP) -* Prerequisites on Windows: install Python v3.7.x[1] and script dependencies w/ the following elevated command prompt command line: - `pip install requests urllib3 wxPython` -* Prerequisites on Linux: python3 (v3.7.x) && python-wx{gtk2.8,tools} on Debian-family Linux distributions +# roar -- mIRC art editor for Windows & Linux (WIP) * Screenshot: ![Screenshot](https://github.com/lalbornoz/roar/raw/master/assets/images/roar.png "Screenshot") -References: -Fri, 05 Jan 2018 17:01:47 +0100 [1] Python Releases for Windows | Python.org - vim:ff=dos tw=0 diff --git a/assets/text/TODO b/assets/text/TODO index d233da0..c2068cd 100644 --- a/assets/text/TODO +++ b/assets/text/TODO @@ -9,12 +9,5 @@ 10) Integrate ENNTool code in the form of OpenGL-based animation window (see 13) and 14)) 11) Composition, parametrisation & keying of tools from higher-order operators (brushes, functions, filters, outlines, patterns & shaders) and unit tools 12) Sprites & scripted (Python?) animation on the basis of asset traits and {composable,parametrised} patterns (metric flow, particle system, rigging, ...) -13) GUI TODO list: - a) switch to Gtk - b) canvas preview in Open dialogue(s) - c) https://material.io/resources/icons/?style=baseline - d) replace logo w/ canvas panel in About dialogue, revisit melp? dialogue - e) replace resize buttons w/ {-,edit box,+} buttons & lock button re: ratio (ty lol3) - f) Settings window (e.g. autosave parameters, cursor opacity, default colours, hide cursor on leaving window, keyboard/mouse map, show cell position tooltip on mouse hover, ...) vim:ff=dos tw=0 diff --git a/assets/text/arab-spokelion.txt b/assets/text/arab-spokelion.txt deleted file mode 100644 index 416584e..0000000 --- a/assets/text/arab-spokelion.txt +++ /dev/null @@ -1,12 +0,0 @@ - 0,5  - 0,5  -5,8%. 7,5 7,8/\5,5 0 7,8/\0,5 -5,8`%%. 7,5 5 5,8 7"""5 1 1,5 - 5,8`%% 0,5 0,8 3o0 1_0 3o0 5,5 - 1,8// 1,8;7,5 5,8 7(__1Y7__)1 5,5 0 -1,8(( 1,8/7 0 0,5 7,8`\_/1,5 0  - 1,8\\ 1,8.' a0 5 5,5  - 1,8\\ 1,8/0 1r0 0,5  - 1,8\\/ a0 1\0 1|7 1| - 1,8\7 1b7 1)___|7 1| - 1,8(_____/__))))))) diff --git a/assets/text/arab-spokelioness.txt b/assets/text/arab-spokelioness.txt new file mode 100644 index 0000000..469cf6c --- /dev/null +++ b/assets/text/arab-spokelioness.txt @@ -0,0 +1,17 @@ + 3,6â–Ÿ6,3â–15 + 3,6â–Ÿ6,3▜▛3,6â–Ÿ6,3â–15 + 3,6â–Ÿ6,3â–â–œ3,6â–Ÿ6,3â–▜▛3,6â–Ÿ6,3â–15 + 3,6â–Ÿ6,3â–3,8/\3,6â–Ÿ6,3▜▛3,6â–Ÿ6,3â–3,8/\3,6â–Ÿ6,3â–15 + 9,1/\15 9,1/15 6,3â–▜▛3,6â–Ÿ6,3â–8,8 3,6â–Ÿ6,3â–▜▛3,6â–Ÿ6,3â–15 +6,1(0o9 6)15 6,1(15 6,3▜▛3,6â–Ÿ6,3â–8,8 3o _ o8 3,6â–Ÿ6,3â–▜▛3,6â–Ÿ + 9,1( \15 9,1)15 6,3â–▜▛▜8,8 6(_3Y6_)6,3â–›â–â–›3,6â–Ÿ6,3â–15 + 6,1|(__)/15 3,6â–Ÿ6,3â–▜▛8,8 6\_/6,3▜▛3,6â–Ÿ6,3â–15 + 1,3\\15 1,3.'0s3 6▜▛3,6â–Ÿ6,3â–15 + 1,6\\15 1,6/6 0p6 1\ \ 6,3▜▛15 + 1,3\\/3 0o3 1\3 1\ \6â–œ15 + 1,6\6 0k6 1/)___|_|6,3â–›15 + 1,3(_0e1__/__))) )))6â–›15 + 12,1╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲15 + 12,1╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱15 + 2,1╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱15 + 2,1╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲15 diff --git a/assets/text/melp.txt b/assets/text/melp.txt index b3158a3..16a2865 100644 --- a/assets/text/melp.txt +++ b/assets/text/melp.txt @@ -3,7 +3,7 @@ Keys or mouse actions separated by commas indicate separate commands. Global commands: -, +/ Decrease/increase brush height and width - Decrease/increase canvas height and width + Decrease/increase canvas height and width , Decrease/increase canvas height , Decrease/increase canvas width Decrease/increase cell size diff --git a/assets/text/requirements.txt b/assets/text/requirements.txt deleted file mode 100644 index 9c558e3..0000000 --- a/assets/text/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -. diff --git a/assets/text/roadmap.txt b/assets/text/roadmap.txt index a49c738..ec2cae7 100644 --- a/assets/text/roadmap.txt +++ b/assets/text/roadmap.txt @@ -1,15 +1,30 @@ -1) GUI: drag & drop file outside of canvas to open, into canvas as object w/ select tool -2) GUI: edit asset in new canvas, import from {canvas,object} -3) GUI: implement GuiCanvasWxBackendFast.c{,c} -4) GUI: select all -5) GUI: show line numbers w/ tooltip on accelerator -6) Operators: copy, cut, delete, insert from, paste -7) Operators: crop, scale, shift, slice operators -8) Tools: measure, triangle, unicode block elements tool -9) Tools: object tool: allow application of arbitrary tool to selection before setting -10) Tools: object tool: reimplement cloning correctly outside of object tool -11) Tools: reimplement in C++ -12) Tools: text tool: finish Arabic/RTL text implementation -13) Tools: text tool: implicitly draw (text) w/ bg -1, toggle drawing actual brushColours[1] mode w/ RMB +1) GUI: canvas preview in Open dialogue(s) +2) GUI: drag & drop file outside of canvas to open, into canvas as object w/ select tool +3) GUI: edit asset in new canvas, import from {canvas,object} +4) GUI: implement GuiCanvasWxBackendFast.c{,c} +5) GUI: replace logo w/ canvas window in About dialogue, revisit melp? dialogue +6) GUI: replace resize buttons w/ {-,edit box,+} buttons & lock button re: ratio (ty lol3) +7) GUI: select all +8) GUI: settings window (e.g. autosave parameters, cursor opacity, default colours, hide cursor on leaving window, keyboard/mouse map, show cell position tooltip on mouse hover, ...) +9) GUI: show line numbers w/ tooltip on accelerator +10) Operators: copy, cut, delete, insert from, paste +11) Operators: crop, scale, shift, slice operators +12) Tools: measure, triangle, unicode block elements tool +13) Tools: object tool: allow application of arbitrary tool to selection before setting +14) Tools: object tool: reimplement cloning correctly outside of object tool +15) Tools: text tool: finish Arabic/RTL text implementation +16) Tools: text tool: implicitly draw (text) w/ bg -1, toggle drawing actual brushColours[1] mode w/ RMB +17) Tools: unicode tool: half block line drawing + +1) help menu items +2) canvas keyboard input vs. mouse only +3) resizing canvas +4) import from/export to clipboard +5) MRU, snapshots +6) all remaining tools +7) operators +8) assets window +9) export to imgur, pastebin, as png +10) cleanup/optimise; use std::nothrow etc. pp. wherever required; use COW strings & UTF-8 instead of UTF-16 wrt. std::{,w}string<>: http://utfcpp.sourceforge.net/ http://web.archive.org/web/20150427215431/https://github.com/aseprite/aseprite/blob/master/src/base/string.h#L26 http://web.archive.org/web/20150427215431/https://github.com/aseprite/aseprite/blob/master/src/base/string.h#L26 vim:ff=dos tw=0 diff --git a/assets/text/spoke-arablion.txt b/assets/text/spoke-arablion.txt index 469cf6c..416584e 100644 --- a/assets/text/spoke-arablion.txt +++ b/assets/text/spoke-arablion.txt @@ -1,17 +1,12 @@ - 3,6â–Ÿ6,3â–15 - 3,6â–Ÿ6,3▜▛3,6â–Ÿ6,3â–15 - 3,6â–Ÿ6,3â–â–œ3,6â–Ÿ6,3â–▜▛3,6â–Ÿ6,3â–15 - 3,6â–Ÿ6,3â–3,8/\3,6â–Ÿ6,3▜▛3,6â–Ÿ6,3â–3,8/\3,6â–Ÿ6,3â–15 - 9,1/\15 9,1/15 6,3â–▜▛3,6â–Ÿ6,3â–8,8 3,6â–Ÿ6,3â–▜▛3,6â–Ÿ6,3â–15 -6,1(0o9 6)15 6,1(15 6,3▜▛3,6â–Ÿ6,3â–8,8 3o _ o8 3,6â–Ÿ6,3â–▜▛3,6â–Ÿ - 9,1( \15 9,1)15 6,3â–▜▛▜8,8 6(_3Y6_)6,3â–›â–â–›3,6â–Ÿ6,3â–15 - 6,1|(__)/15 3,6â–Ÿ6,3â–▜▛8,8 6\_/6,3▜▛3,6â–Ÿ6,3â–15 - 1,3\\15 1,3.'0s3 6▜▛3,6â–Ÿ6,3â–15 - 1,6\\15 1,6/6 0p6 1\ \ 6,3▜▛15 - 1,3\\/3 0o3 1\3 1\ \6â–œ15 - 1,6\6 0k6 1/)___|_|6,3â–›15 - 1,3(_0e1__/__))) )))6â–›15 - 12,1╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲15 - 12,1╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱15 - 2,1╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱15 - 2,1╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲╲15 + 0,5  + 0,5  +5,8%. 7,5 7,8/\5,5 0 7,8/\0,5 +5,8`%%. 7,5 5 5,8 7"""5 1 1,5 + 5,8`%% 0,5 0,8 3o0 1_0 3o0 5,5 + 1,8// 1,8;7,5 5,8 7(__1Y7__)1 5,5 0 +1,8(( 1,8/7 0 0,5 7,8`\_/1,5 0  + 1,8\\ 1,8.' a0 5 5,5  + 1,8\\ 1,8/0 1r0 0,5  + 1,8\\/ a0 1\0 1|7 1| + 1,8\7 1b7 1)___|7 1| + 1,8(_____/__))))))) diff --git a/assets/tools/AnsiToMiRCART.py b/assets/tools/AnsiToMiRCART.py deleted file mode 100755 index fe6d5a7..0000000 --- a/assets/tools/AnsiToMiRCART.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -# -# AnsiToMiRCART.py -- convert ANSI to mIRC art file (for spoke) -# Copyright (c) 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasExportStore import CanvasExportStore -from CanvasImportStore import CanvasImportStore - -# -# Entry point -def main(*argv): - if (len(sys.argv) - 1) != 2: - print("usage: {} ".format(sys.argv[0]), file=sys.stderr) - else: - canvasImportStore = CanvasImportStore() - rc, error = canvasImportStore.importAnsiFile(argv[1]) - if rc: - canvasExportStore = CanvasExportStore() - with open(argv[2], "w", encoding="utf-8") as outFile: - canvasExportStore.exportTextFile(canvasImportStore.outMap, canvasImportStore.inSize, outFile) - else: - print("error: {}".format(error), file=sys.stderr) -if __name__ == "__main__": - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/IrcMiRCARTBot.py b/assets/tools/IrcMiRCARTBot.py deleted file mode 100755 index 989e356..0000000 --- a/assets/tools/IrcMiRCARTBot.py +++ /dev/null @@ -1,272 +0,0 @@ -#!/usr/bin/env python3 -# -# IrcMiRCARTBot.py -- IRC<->MiRC2png bot (for EFnet #MiRCART) -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -import base64, json, requests, socket, time, urllib.request -from getopt import getopt, GetoptError -from CanvasImportStore import CanvasImportStore -from ImgurApiKey import ImgurApiKey -from IrcClient import IrcClient -from MiRCARTToPngFile import MiRCARTToPngFile - -class IrcMiRCARTBot(IrcClient): - """IRC<->MiRC2png bot""" - imgurApiKey = ImgurApiKey.imgurApiKey - - class ContentTooLargeException(Exception): - pass - - def _dispatch001(self, message): - self._log("Registered on {}:{} as {}, {}, {}.".format(self.serverHname, self.serverPort, self.clientNick, self.clientIdent, self.clientGecos)) - self._log("Attempting to join {} on {}:{}...".format(self.clientChannel, self.serverHname, self.serverPort)) - self.queue("JOIN", self.clientChannel) - - def _dispatch353(self, message): - if message[4].lower() == self.clientChannel.lower(): - for channelNickSpec in message[5].split(" "): - if len(channelNickSpec) \ - and channelNickSpec[0] == "@" \ - and len(channelNickSpec[1:]): - self.clientChannelOps.append(channelNickSpec[1:].lower()) - self._log("Authorising {} on {}".format(channelNickSpec[1:].lower(), message[4].lower())) - - def _dispatchJoin(self, message): - self._log("Joined {} on {}:{}.".format(message[2].lower(), self.serverHname, self.serverPort)) - self.clientNextTimeout = None; self.clientChannelRejoin = False; - - def _dispatchKick(self, message): - if message[2].lower() == self.clientChannel.lower() \ - and message[3].lower() == self.clientNick.lower(): - self._log("Kicked from {} by {}, rejoining in 15 seconds".format(message[2].lower(), message[0])) - self.clientNextTimeout = time.time() + 15; self.clientChannelRejoin = True; - - def _dispatchMode(self, message): - if message[2].lower() == self.clientChannel.lower(): - channelModeType = "+"; channelModeArg = 4; - channelAuthAdd = ""; channelAuthDel = ""; - for channelModeChar in message[3]: - if channelModeChar[0] == "-": - channelModeType = "-" - elif channelModeChar[0] == "+": - channelModeType = "+" - elif channelModeChar[0].isalpha(): - if channelModeChar[0] == "o": - if channelModeType == "+": - channelAuthAdd = message[channelModeArg]; channelAuthDel = ""; - elif channelModeType == "-": - channelAuthAdd = ""; channelAuthDel = message[channelModeArg]; - channelModeArg += 1 - if len(channelAuthAdd) \ - and channelAuthAdd not in self.clientChannelOps: - channelAuthAdd = channelAuthAdd.lower() - self._log("Authorising {} on {}".format(channelAuthAdd, message[2].lower())) - self.clientChannelOps.append(channelAuthAdd) - elif len(channelAuthDel) \ - and channelAuthDel in self.clientChannelOps: - channelAuthDel = channelAuthDel.lower() - self._log("Deauthorising {} on {}".format(channelAuthDel, message[2].lower())) - self.clientChannelOps.remove(channelAuthDel) - - def _dispatchNone(self): - self._log("Disconnected from {}:{}.".format(self.serverHname, self.serverPort)) - self.close() - - def _dispatchPing(self, message): - self.queue("PONG", message[2]) - - def _dispatchPrivmsg(self, message): - if message[2].lower() == self.clientChannel.lower() \ - and message[3].startswith("!pngbot "): - if (int(time.time()) - self.clientChannelLastMessage) < 5: - self._log("Ignoring request on {} from {} due to rate limit: {}".format(message[2].lower(), message[0], message[3])) - return - elif message[0].split("!")[0].lower() not in self.clientChannelOps: - self._log("Ignoring request on {} from {} due to lack of authorisation: {}".format(message[2].lower(), message[0], message[3])) - return - else: - self._log("Processing request on {} from {}: {}".format(message[2].lower(), message[0], message[3])) - asciiUrl = message[3].split(" ")[1] - asciiTmpFilePath = "tmp.txt"; imgTmpFilePath = "tmp.png"; - if os.path.isfile(asciiTmpFilePath): - os.remove(asciiTmpFilePath) - if os.path.isfile(imgTmpFilePath): - os.remove(imgTmpFilePath) - try: - urllib.request.urlretrieve(asciiUrl, asciiTmpFilePath, IrcMiRCARTBot._urlretrieveReportHook) - except IrcMiRCARTBot.ContentTooLargeException: - self._log("Download size exceeds quota of 1 MB!") - self.queue("PRIVMSG", message[2], "4/!\\ Download size exceeds quota of 1 MB!") - return - except urllib.error.HTTPError as err: - self._log("Download failed with HTTP status code {}".format(err.code)) - self.queue("PRIVMSG", message[2], "4/!\\ Download failed with HTTP status code {}!".format(err.code)) - return - except urllib.error.URLError as err: - self._log("Invalid URL specified!") - self.queue("PRIVMSG", message[2], "4/!\\ Invalid URL specified!") - return - except ValueError as err: - self._log("Unknown URL type specified!") - self.queue("PRIVMSG", message[2], "4/!\\ Unknown URL type specified!") - return - - canvasStore = CanvasImportStore(inFile=asciiTmpFilePath) - numRowCols = 0 - for numRow in range(len(canvasStore.outMap)): - numRowCols = max(numRowCols, len(canvasStore.outMap[numRow])) - for numRow in range(len(canvasStore.outMap)): - if len(canvasStore.outMap[numRow]) != numRowCols: - for numColOff in range(numRowCols - len(canvasStore.outMap[numRow])): - canvasStore.outMap[numRow].append([1, 1, 0, " "]) - canvasStore.outMap[numRow].insert(0, [1, 1, 0, " "]) - canvasStore.outMap[numRow].append([1, 1, 0, " "]) - canvasStore.outMap.insert(0, [[1, 1, 0, " "]] * len(canvasStore.outMap[0])) - canvasStore.outMap.append([[1, 1, 0, " "]] * len(canvasStore.outMap[0])) - MiRCARTToPngFile(canvasStore.outMap, os.path.join("..", "fonts", "DejaVuSansMono.ttf"), 11).export(imgTmpFilePath) - imgurResponse = self._uploadToImgur(imgTmpFilePath, "MiRCART image", "MiRCART image", self.imgurApiKey) - if imgurResponse[0] == None: - self._log("Upload failed with exception `{}'".format(imgurResponse[1])) - self.queue("PRIVMSG", message[2], "4/!\\ Upload failed with exception `{}'!".format(imgurResponse[1])) - elif imgurResponse[0] == 200: - self._log("Uploaded as: {}".format(imgurResponse[1])) - self.queue("PRIVMSG", message[2], "8/!\\ Uploaded as: {}".format(imgurResponse[1])) - self.clientChannelLastMessage = int(time.time()) - else: - self._log("Upload failed with HTTP status code {}".format(imgurResponse[0])) - self._log("Message from website: {}".format(imgurResponse[1])) - self.queue("PRIVMSG", message[2], "4/!\\ Upload failed with HTTP status code {}!".format(imgurResponse[0])) - self.queue("PRIVMSG", message[2], "4/!\\ Message from website: {}".format(imgurResponse[1])) - if os.path.isfile(asciiTmpFilePath): - os.remove(asciiTmpFilePath) - if os.path.isfile(imgTmpFilePath): - os.remove(imgTmpFilePath) - - def _dispatchTimer(self): - if self.clientChannelRejoin: - self._log("Attempting to join {} on {}:{}...".format(self.clientChannel, self.serverHname, self.serverPort)) - self.queue("JOIN", self.clientChannel) - self.clientNextTimeout = time.time() + 15; self.clientChannelRejoin = True; - - def _log(self, msg): - print(time.strftime("%Y/%m/%d %H:%M:%S") + " " + msg) - - def _uploadToImgur(self, imgFilePath, imgName, imgTitle, apiKey): - with open(imgFilePath, "rb") as requestImage: - requestImageData = requestImage.read() - requestData = { \ - "image": base64.b64encode(requestImageData), \ - "key": apiKey, \ - "name": imgName, \ - "title": imgTitle, \ - "type": "base64"} - requestHeaders = { \ - "Authorization": "Client-ID " + apiKey} - responseHttp = requests.post("https://api.imgur.com/3/upload.json", data=requestData, headers=requestHeaders) - try: - responseDict = json.loads(responseHttp.text) - except json.decoder.JSONDecodeError as err: - return [None, err] - if responseHttp.status_code == 200: - return [200, responseDict.get("data").get("link")] - else: - return [responseHttp.status_code, responseHttp.text] - - def _urlretrieveReportHook(count, blockSize, totalSize): - if (totalSize > pow(2,20)): - raise IrcMiRCARTBot.ContentTooLargeException - - def connect(self, localAddr=None, preferFamily=0, timeout=None): - self._log("Connecting to {}:{}...".format(self.serverHname, self.serverPort)) - if super().connect(localAddr=localAddr, preferFamily=preferFamily, timeout=timeout): - self._log("Connected to {}:{}.".format(self.serverHname, self.serverPort)) - self._log("Registering on {}:{} as {}, {}, {}...".format(self.serverHname, self.serverPort, self.clientNick, self.clientIdent, self.clientGecos)) - self.clientChannelLastMessage = 0; self.clientChannelOps = []; - self.clientChannelRejoin = False - self.clientHasPing = False - return True - else: - return False - - def dispatch(self): - while True: - if self.clientNextTimeout: - timeNow = time.time() - if self.clientNextTimeout <= timeNow: - self._dispatchTimer() - if self.unqueue() == False: - self._dispatchNone(); break; - else: - serverMessage = self.readline() - if serverMessage == None: - self._dispatchNone(); break; - elif serverMessage == "": - if self.clientHasPing: - self._dispatchNone(); break; - else: - self.clientHasPing = True - self.queue("PING", str(time.time())) - self._log("Ping...") - continue - if serverMessage[1] == "001": - self._dispatch001(serverMessage) - elif serverMessage[1] == "353": - self._dispatch353(serverMessage) - elif serverMessage[1] == "JOIN": - self._dispatchJoin(serverMessage) - elif serverMessage[1] == "KICK": - self._dispatchKick(serverMessage) - elif serverMessage[1] == "MODE": - self._dispatchMode(serverMessage) - elif serverMessage[1] == "PING": - self._dispatchPing(serverMessage) - elif serverMessage[1] == "PONG": - self._log("Pong.") - self.clientHasPing = False - elif serverMessage[1] == "PRIVMSG": - self._dispatchPrivmsg(serverMessage) - - def __init__(self, serverHname, serverPort="6667", clientNick="pngbot", clientIdent="pngbot", clientGecos="pngbot", clientChannel="#MiRCART"): - super().__init__(serverHname, serverPort, clientNick, clientIdent, clientGecos) - self.clientChannel = clientChannel - -# -# Entry point -def main(optdict, *argv): - _IrcMiRCARTBot = IrcMiRCARTBot(*argv) - while True: - if "-l" in optdict: - localAddr = optdict["-l"] - else: - localAddr = None - if "-4" in optdict: - preferFamily = socket.AF_INET - elif "-6" in optdict: - preferFamily = socket.AF_INET6 - else: - preferFamily = 0 - if _IrcMiRCARTBot.connect(localAddr=localAddr, preferFamily=preferFamily, timeout=15): - _IrcMiRCARTBot.dispatch() - _IrcMiRCARTBot.close() - time.sleep(15) - -if __name__ == "__main__": - optlist, argv = getopt(sys.argv[1:], "46l:") - optdict = dict(optlist) - if len(argv) < 1 or len(argv) > 6: - print("usage: {} [-4|-6] [-l ] " \ - " " \ - "[] " \ - "[] " \ - "[] " \ - "[] " \ - "[] ".format(sys.argv[0]), file=sys.stderr) - else: - main(optdict, *argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/MiRCARTCanonicalise.py b/assets/tools/MiRCARTCanonicalise.py deleted file mode 100755 index 1e417e2..0000000 --- a/assets/tools/MiRCARTCanonicalise.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 -# -# MiRCARTCanonicalise.py -- canonicalise mIRC art {from,to} file (for munki) -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasImportStore import CanvasImportStore - -def canonicalise(inPathName): - canvasStore = CanvasImportStore(inPathName) - inMap = canvasStore.outMap.copy(); del canvasStore; - with open(inPathName, "w+") as outFile: - for inCurRow in range(len(inMap)): - lastAttribs, lastColours = CanvasImportStore._CellState.CS_NONE, None - for inCurCol in range(len(inMap[inCurRow])): - inCurCell = inMap[inCurRow][inCurCol] - if lastAttribs != inCurCell[2]: - if inCurCell[2] & CanvasImportStore._CellState.CS_BOLD: - print("\u0002", end="", file=outFile) - if inCurCell[2] & CanvasImportStore._CellState.CS_UNDERLINE: - print("\u001f", end="", file=outFile) - lastAttribs = inCurCell[2] - if lastColours == None or lastColours != inCurCell[:2]: - print("\u0003{:02d},{:02d}{}".format(*inCurCell[:2], inCurCell[3]), end="", file=outFile) - lastColours = inCurCell[:2] - else: - print(inCurCell[3], end="", file=outFile) - print("\n", end="", file=outFile) - -# -# Entry point -def main(*argv): - canonicalise(argv[1]) -if __name__ == "__main__": - if (len(sys.argv) - 1) != 1: - print("usage: {} ".format(sys.argv[0]), file=sys.stderr) - else: - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/MiRCARTCheckLineLengths.sh b/assets/tools/MiRCARTCheckLineLengths.sh deleted file mode 100755 index 3baa135..0000000 --- a/assets/tools/MiRCARTCheckLineLengths.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -# -# MiRCARTCheckLineLengths.py -- check mIRC art line lengths -# Copyright (c) 2018 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -for FNAME in "${@}"; do - FNAME_LINES="$(wc -l "${FNAME}" | awk '{print $1}')"; - for FNAME_LINE in $(seq "${FNAME_LINES}"); do - printf "%-5d %-5d %s\n" \ - "$(sed -n "${FNAME_LINE}p" "${FNAME}" | wc -c)" \ - "${FNAME_LINE}" "${FNAME}"; - done; -done | sort -nk1; - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/MiRCARTReduce.py b/assets/tools/MiRCARTReduce.py deleted file mode 100755 index 8993bc5..0000000 --- a/assets/tools/MiRCARTReduce.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -# -# MiRCARTReduce.py -- efficiently encode mIRC art {from,to} file -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasImportStore import CanvasImportStore -from CanvasExportStore import CanvasExportStore -import sys - -def reduce(inPathName): - canvasStore = CanvasImportStore(inPathName); inMap = canvasStore.outMap.copy(); - with open(inPathName, "w+") as outFile: - for inCurRow in range(len(inMap)): - lastAttribs, lastColours = CanvasImportStore._CellState.CS_NONE, None - for inCurCol in range(len(inMap[inCurRow])): - inCurCell = inMap[inCurRow][inCurCol] - if lastAttribs != inCurCell[2]: - if inCurCell[2] & CanvasImportStore._CellState.CS_BOLD: - print("\u0002", end="", file=outFile) - if inCurCell[2] & CanvasImportStore._CellState.CS_UNDERLINE: - print("\u001f", end="", file=outFile) - lastAttribs = inCurCell[2] - if lastColours == None \ - or ((lastColours[0] != inCurCell[:2][0]) \ - and (lastColours[1] != inCurCell[:2][1])) \ - or ((lastColours[0] == inCurCell[:2][0]) \ - and (lastColours[1] != inCurCell[:2][1])): - if (inCurCell[3] in set("0123456789")) and (inCurCell[1] < 10): - print("\u0003{:d},{:02d}{}".format(*inCurCell[:2], inCurCell[3]), end="", file=outFile) - else: - print("\u0003{:d},{:d}{}".format(*inCurCell[:2], inCurCell[3]), end="", file=outFile) - lastColours = inCurCell[:2] - elif (lastColours[0] != inCurCell[:2][0]) \ - and (lastColours[1] == inCurCell[:2][1]): - if (inCurCell[3] in set("0123456789")) and (inCurCell[0] < 10): - print("\u0003{:02d}{}".format(inCurCell[0], inCurCell[3]), end="", file=outFile) - else: - print("\u0003{:d}{}".format(inCurCell[0], inCurCell[3]), end="", file=outFile) - lastColours[0] = inCurCell[0] - else: - print(inCurCell[3], end="", file=outFile) - print("\n", end="", file=outFile) - -# -# Entry point -def main(*argv): - reduce(argv[1]) -if __name__ == "__main__": - if (len(sys.argv) - 1) != 1: - print("usage: {} ".format(sys.argv[0]), file=sys.stderr) - else: - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/MiRCARTToAnsi.py b/assets/tools/MiRCARTToAnsi.py deleted file mode 100755 index fdf1c88..0000000 --- a/assets/tools/MiRCARTToAnsi.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python3 -# -# MiRCARTToAnsi.py -- ToAnsi mIRC art {from,to} file (for munki) -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasExportStore import CanvasExportStore -from CanvasImportStore import CanvasImportStore - -# -# Entry point -def main(*argv): - if (len(sys.argv) - 1) != 1: - print("usage: {} ".format(sys.argv[0]), file=sys.stderr) - else: - canvasImportStore = CanvasImportStore() - rc, error = canvasImportStore.importTextFile(argv[1]) - if rc: - canvasExportStore = CanvasExportStore() - canvasExportStore.exportAnsiFile(canvasImportStore.outMap, canvasImportStore.inSize, sys.stdout) - else: - print("error: {}".format(error), file=sys.stderr) -if __name__ == "__main__": - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/MiRCARTToPngFile.py b/assets/tools/MiRCARTToPngFile.py deleted file mode 100755 index 9ca686a..0000000 --- a/assets/tools/MiRCARTToPngFile.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 -# -# MiRCARTToPngFile.py -- convert ASCII w/ mIRC control codes to monospaced PNG (for EFnet #MiRCART) -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasExportStore import CanvasExportStore -from CanvasImportStore import CanvasImportStore -from getopt import getopt, GetoptError - -# -# Entry point -def main(*argv): - argv0 = argv[0]; optlist, argv = getopt(argv[1:], "f:hs:"); optdict = dict(optlist); - if len(argv) < 1: - print("""usage: {} [-f fname] [-h] [-s size] fname... - -h.........: show this screen - -f fname...: font file pathname (defaults to: ../fonts/DejaVuSansMono.ttf) - -s size....: font size (defaults to: 11)""".format(argv0), file=sys.stderr) - else: - if not "-f" in optdict: - optdict["-f"] = os.path.join("..", "fonts", "DejaVuSansMono.ttf") - optdict["-s"] = 11 if not "-s" in optdict else int(optdict["-s"]) - for inFile in argv: - canvasImportStore = CanvasImportStore() - rc, error = canvasImportStore.importTextFile(inFile) - if rc: - canvasExportStore = CanvasExportStore() - canvasExportStore.exportPngFile(canvasImportStore.outMap, optdict["-f"], optdict["-s"], os.path.splitext(inFile)[0] + ".png") - else: - print("error: {}".format(error), file=sys.stderr) -if __name__ == "__main__": - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/SAUCEToAnsi.py b/assets/tools/SAUCEToAnsi.py deleted file mode 100755 index 1be0b98..0000000 --- a/assets/tools/SAUCEToAnsi.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -# -# SAUCEToAnsi.py -- convert SAUCE-encoded ANSi to raw ANSI file (for spoke) -# Copyright (c) 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasExportStore import CanvasExportStore -from CanvasImportStore import CanvasImportStore - -# -# Entry point -def main(*argv): - if (len(sys.argv) - 1) != 2: - print("usage: {} ".format(sys.argv[0]), file=sys.stderr) - else: - canvasImportStore = CanvasImportStore() - rc, error = canvasImportStore.importSauceFile(argv[1]) - if rc: - canvasExportStore = CanvasExportStore() - with open(argv[2], "w", encoding="utf-8") as outFile: - canvasExportStore.exportAnsiFile(canvasImportStore.outMap, canvasImportStore.inSize, outFile) - else: - print("error: {}".format(error), file=sys.stderr) -if __name__ == "__main__": - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/SAUCEToMiRCART.py b/assets/tools/SAUCEToMiRCART.py deleted file mode 100755 index f9eea10..0000000 --- a/assets/tools/SAUCEToMiRCART.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -# -# SAUCEToMiRCART.py -- convert SAUCE-encoded ANSi to mIRC art file (for spoke) -# Copyright (c) 2019 Lucio Andrés Illanes Albornoz -# This project is licensed under the terms of the MIT licence. -# - -import os, sys -[sys.path.append(os.path.join(os.getcwd(), "..", "..", path)) for path in ["libcanvas", "librtl"]] - -from CanvasExportStore import CanvasExportStore -from CanvasImportStore import CanvasImportStore - -# -# Entry point -def main(*argv): - if (len(sys.argv) - 1) != 2: - print("usage: {} ".format(sys.argv[0]), file=sys.stderr) - else: - canvasImportStore = CanvasImportStore() - rc, error = canvasImportStore.importSauceFile(argv[1]) - if rc: - canvasExportStore = CanvasExportStore() - with open(argv[2], "w", encoding="utf-8") as outFile: - canvasExportStore.exportTextFile(canvasImportStore.outMap, canvasImportStore.inSize, outFile) - else: - print("error: {}".format(error), file=sys.stderr) -if __name__ == "__main__": - main(*sys.argv) - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120 diff --git a/assets/tools/deploy-python.sh b/assets/tools/deploy-python.sh deleted file mode 100755 index c161dc4..0000000 --- a/assets/tools/deploy-python.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/sh -# - -PACKAGE_NAME="roar-python"; -RELEASE_DEPS="cpio find rm sed zip"; -RELEASES_DNAME="releases"; - -msgf() { - local _fmt="${1}"; shift; - printf "%s >>> ${_fmt}\n" "$(date +"%d-%^b-%Y %H:%M:%S")" "${@}"; -}; - -deploy() { - local _rflag="${1}" _vflag="${2}" _release_fname="" _release_dname="" _release_version="" _release_version_long=""; - - if [ "${_rflag}" != "" ]; then - _release_version="v${_rflag}"; - _release_version_long="Release v${_rflag}"; - git tag "${PACKAGE_NAME}-${_release_version}"; - else - _release_version="$(git rev-parse --short HEAD)"; - _release_version_long="Prerelease (Git revision $(git rev-parse --short HEAD))"; - fi; - _release_dname="${RELEASES_DNAME}/${PACKAGE_NAME}-${_release_version}"; - _release_fname="${_release_dname}.zip"; - find -L . \ - -mindepth 1 \ - -not -path "./${RELEASES_DNAME}/*" \ - -not -path "./${RELEASES_DNAME}" \ - -not -path './.*/*' \ - -not -path './.*' \ - -not -path '*/__pycache__/*' \ - -not -path '*/__pycache__' \ - -not -path './librtl/ImgurApiKey.py' \ - -not -name '*.exp' \ - -not -name '*.lib' \ - -not -name '*.obj' \ - -not -name '*.sw*' \ - -not -name "${0##*/}" |\ - cpio --quiet -dLmp "${_release_dname}"; - sed -i"" "s/__ROAR_RELEASE_VERSION__/${_release_version_long}/" "${_release_dname}/libroar/RoarWindowAbout.py"; - cd "${RELEASES_DNAME}"; - if [ "${_vflag:-0}" -eq 0 ]; then - zip -9 -r "${_release_fname##${RELEASES_DNAME}/}" "${_release_dname##${RELEASES_DNAME}/}" >/dev/null; - else - zip -9 -r "${_release_fname##${RELEASES_DNAME}/}" "${_release_dname##${RELEASES_DNAME}/}"; - fi; - cd "${OLDPWD}"; rm -fr "${_release_dname}"; -}; - -usage() { - echo "usage: ${0} [-h] [-r version] [-v]" >&2; - echo " -h..........: show this screen" >&2; - echo " -r version..: create release w/ version" >&2; - echo " -v..........: be verbose" >&2; -}; - -main() { - local _cmd="" _opt="" _vflag=0; - while getopts hr:v _opt; do - case "${_opt}" in - h) usage; exit 0; ;; - r) _rflag="${OPTARG}"; ;; - v) _vflag=1; ;; - *) usage; exit 1; ;; - esac; done; - shift $((${OPTIND}-1)); - for _cmd in ${RELEASE_DEPS}; do - if ! which "${_cmd}" >/dev/null; then - echo "error: missing prerequisite command \`${_cmd}'"; - exit 1; - fi; - done; - msgf "Building release..."; - if [ "${_vflag:-0}" -eq 0 ]; then - deploy "${_rflag}" "${_vflag}" >/dev/null; - else - deploy "${_rflag}" "${_vflag}"; - fi; - msgf "Built release."; -}; - -set -o errexit -o noglob; -main "${@}"; - -# vim:foldmethod=marker sw=8 ts=8 tw=120 diff --git a/debug b/debug new file mode 120000 index 0000000..f1b59d2 --- /dev/null +++ b/debug @@ -0,0 +1 @@ +libgui/debug \ No newline at end of file diff --git a/libcanvas/Canvas.cpp b/libcanvas/Canvas.cpp new file mode 100644 index 0000000..0598dbc --- /dev/null +++ b/libcanvas/Canvas.cpp @@ -0,0 +1,138 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "../librtl/rtldef.hpp" +#include "Canvas.hpp" + +/* + * Public class functions + */ + +Canvas::Canvas( + SIZE size +) +: cells(size.h, CELL_LIST(size.w)), cellsUndo{UNDO_CELLS_EMPTY}, size(size) +{ +} + +bool +Canvas::commit( + const CELL_LIST& cells, + bool inhibitUndo +) +{ + Canvas::CELL * cellCanvas; + Canvas::CELL_LIST cellsRedo, cellsUndo; + bool rc = false; + + for (auto& cell : cells) { + if ((cell.p.x < this->size.w) && (cell.p.y < this->size.h)) { + rc = rc ? rc : true; + cellCanvas = &this->cells[cell.p.y][cell.p.x]; + if (!inhibitUndo) + cellsRedo.push_back(cell); cellsUndo.push_back(*cellCanvas); + *cellCanvas = cell; + } + } + if (!inhibitUndo && cellsRedo.size() && cellsUndo.size()) { + if (this->cellsUndo.index > 0) { + std::rotate(this->cellsUndo.redoList.begin(), this->cellsUndo.redoList.begin() + this->cellsUndo.index, this->cellsUndo.redoList.end()); + this->cellsUndo.redoList.resize((this->cellsUndo.redoList.size() - this->cellsUndo.index) + 1); + std::rotate(this->cellsUndo.undoList.begin(), this->cellsUndo.undoList.begin() + this->cellsUndo.index, this->cellsUndo.undoList.end()); + this->cellsUndo.undoList.resize((this->cellsUndo.undoList.size() - this->cellsUndo.index) + 1); + this->cellsUndo.size -= this->cellsUndo.index, this->cellsUndo.index = 0; + } + this->cellsUndo.redoList.insert(this->cellsUndo.redoList.begin(), cellsRedo); + this->cellsUndo.undoList.insert(this->cellsUndo.undoList.begin(), cellsUndo); + this->cellsUndo.size++; + } + return rc; +} + +bool +Canvas::export_( + Rtl::STATUS& pstatus, + std::wstring& buffer, + DATA_TYPE type +) +{ + switch (type) { + case DTYPE_ANSI: this->exportANSi(pstatus, buffer); break; + case DTYPE_MIRC: this->exportMiRC(pstatus, buffer); break; + case DTYPE_SAUCE: this->exportSAUCE(pstatus, buffer); break; + default: pstatus = Rtl::STATUS_POSIX(EINVAL); break; + } + return (bool)(pstatus); +} + +bool +Canvas::import( + Rtl::STATUS& pstatus, + Canvas::CELL_MAP& cells, + Canvas::SIZE size +) +{ + this->cells = cells, this->cellsUndo = Canvas::UNDO_CELLS{UNDO_CELLS_EMPTY}, this->size = size; + return (bool)(pstatus = Rtl::STATUS_NONE_SUCCESS); +} + +bool +Canvas::import( + Rtl::STATUS& pstatus, + const std::wstring& data, + const DATA_TYPE type +) +{ + switch (type) { + case DTYPE_ANSI: this->importANSi(pstatus, data); break; + case DTYPE_MIRC: this->importMiRC(pstatus, data); break; + case DTYPE_SAUCE: this->importSAUCE(pstatus, data); break; + default: pstatus = Rtl::STATUS_POSIX(EINVAL); break; + } + if (pstatus) + this->cellsUndo = Canvas::UNDO_CELLS{UNDO_CELLS_EMPTY}; + return (bool)(pstatus); +} + +const Canvas::CELL_LIST * +Canvas::redo( +) +{ + const Canvas::CELL_LIST * cells = nullptr; + + if (this->cellsUndo.size && (this->cellsUndo.index > 0)) { + this->cellsUndo.index--, cells = &this->cellsUndo.redoList[this->cellsUndo.index]; + this->commit(*cells, true); + } + return cells; +} + +const Canvas::CELL_LIST * +Canvas::undo( +) +{ + const Canvas::CELL_LIST * cells = nullptr; + + if (this->cellsUndo.size && (this->cellsUndo.index < this->cellsUndo.size)) { + cells = &this->cellsUndo.undoList[this->cellsUndo.index], this->cellsUndo.index++; + this->commit(*cells, true); + } + return cells; +} diff --git a/libcanvas/Canvas.hpp b/libcanvas/Canvas.hpp new file mode 100644 index 0000000..0519023 --- /dev/null +++ b/libcanvas/Canvas.hpp @@ -0,0 +1,143 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _CANVAS_HPP_ +#define _CANVAS_HPP_ + +#include +#include + +#include + +#include "../librtl/rtldef.hpp" + +/* + * Public types + */ + +class Canvas { +public: + typedef int32_t COLOUR; + #define COLOUR_ALPHA(colour)\ + (((colour) >> 24) & 0xff) + typedef struct colours_s { + COLOUR bg, fg; + } COLOURS; + typedef std::vector> + COLOUR_LIST; + + typedef uint64_t COORD; + typedef struct point_s { + COORD x, y; + } POINT; + #define POINT_EMPTY {0ULL, 0ULL} + + typedef enum cell_attrs_e : unsigned long { + CATTR_NONE = 0x00, + CATTR_BOLD = 0x01, + CATTR_ITALIC = 0x02, + CATTR_UNDERLINE = 0x04, + } CELL_ATTRS; + + typedef struct cell_s { + CELL_ATTRS attrs; + COLOUR bg, fg; + POINT p; + wchar_t txt[8]; + } CELL; + #define CELL_EMPTY {CATTR_NONE, 0UL, 0UL, POINT_EMPTY, {L'\0',}} + typedef std::vector + CELL_LIST; + typedef std::vector + CELL_MAP; + + typedef enum data_type_e { + DTYPE_ANSI = 1, + DTYPE_MIRC = 2, + DTYPE_SAUCE = 3, + } DATA_TYPE; + + typedef struct rect_s { + POINT p0, p1; + } RECT; + #define RECT_EMPTY {POINT_EMPTY, POINT_EMPTY} + #define RECT_HEIGHT(r) ((r).p1.y - (r).p0.y) + #define RECT_WIDTH(r) ((r).p1.x - (r).p0.x) + + typedef struct size_s { + uint64_t w, h; + } SIZE; + #define SIZE_EMPTY {0ULL, 0ULL} + + typedef struct brush_e { + COLOURS colours; + SIZE size; + } BRUSH; + + typedef struct undo_cells_e { + size_t index, size; + std::vector redoList; + std::vector undoList; + } UNDO_CELLS; + #define UNDO_CELLS_EMPTY\ + 0, 0, std::vector(), std::vector() + + Canvas(SIZE size); + bool commit(const CELL_LIST& cells, bool inhibitUndo); + bool export_(Rtl::STATUS& pstatus, std::wstring& buffer, DATA_TYPE type); + bool import(Rtl::STATUS& pstatus, CELL_MAP& cells, SIZE size); + bool import(Rtl::STATUS& pstatus, const std::wstring& data, DATA_TYPE type); + const CELL_LIST *redo(); + const CELL_LIST *undo(); + + /* subr_export.cpp */ + bool exportANSi(Rtl::STATUS& pstatus, std::wstring& buffer); + bool exportMiRC(Rtl::STATUS& pstatus, std::wstring& buffer); + bool exportSAUCE(Rtl::STATUS& pstatus, std::wstring& buffer); + + /* subr_import.cpp */ + bool importANSi(Rtl::STATUS& pstatus, const std::wstring& data); + bool importMiRC(Rtl::STATUS& pstatus, const std::wstring& data); + bool importSAUCE(Rtl::STATUS& pstatus, const std::wstring& data); + + CELL_MAP cells; + UNDO_CELLS cellsUndo; + SIZE size; +}; + +constexpr Canvas::CELL_ATTRS operator&=(Canvas::CELL_ATTRS& lhs, const Canvas::CELL_ATTRS& rhs) { + return lhs = static_cast(static_cast(lhs) & static_cast(rhs)); +}; + +constexpr Canvas::CELL_ATTRS operator&=(Canvas::CELL_ATTRS& lhs, const unsigned long& rhs) { + return lhs = static_cast(static_cast(lhs) & static_cast(rhs)); +}; + +constexpr Canvas::CELL_ATTRS operator|=(Canvas::CELL_ATTRS& lhs, const Canvas::CELL_ATTRS& rhs) { + return lhs = static_cast(static_cast(lhs) | static_cast(rhs)); +}; + +constexpr bool operator==(const Canvas::POINT& lhs, const Canvas::POINT& rhs) { + return (lhs.x == rhs.x) && (lhs.y == rhs.y); +}; + +constexpr bool operator!=(const Canvas::POINT& lhs, const Canvas::POINT& rhs) { + return (lhs.x != rhs.x) || (lhs.y != rhs.y); +}; + +#endif /* _CANVAS_HPP_ */ diff --git a/libcanvas/subr_export.cpp b/libcanvas/subr_export.cpp new file mode 100644 index 0000000..4310263 --- /dev/null +++ b/libcanvas/subr_export.cpp @@ -0,0 +1,139 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "../librtl/rtldef.hpp" +#include "Canvas.hpp" + +/* + * Private subroutines + */ + +static void encodeMiRCColours(std::wstring& buffer, const Canvas::CELL& cell, bool bgfl, bool fgfl); +static bool flipBit(const Canvas::CELL& cell, Canvas::CELL& state, Canvas::CELL_ATTRS bit); + +static void +encodeMiRCColours( + std::wstring& buffer, + const Canvas::CELL& cell, + bool bgfl, + bool fgfl +) +{ + bool paddingfl = iswdigit(cell.txt[0]); + + if ((bgfl && (cell.bg == -1)) && (fgfl && (cell.fg == -1))) + buffer += L"\u000f"; + else if (!bgfl && (fgfl && (cell.fg != -1))) { + if (!paddingfl || (cell.fg < 10)) + buffer += std::wstring(L"\u0003") + std::to_wstring((unsigned)cell.fg); + else + buffer += std::wstring(L"\u0003") + L"0" + std::to_wstring((unsigned)cell.fg); + } else if ((bgfl && (cell.bg == -1)) && (fgfl && (cell.fg != -1))) { + if (!paddingfl || (cell.fg < 10)) + buffer += std::wstring(L"\u0003\u0003") + std::to_wstring((unsigned)cell.fg); + else + buffer += std::wstring(L"\u0003\u0003") + L"0" + std::to_wstring((unsigned)cell.fg); + } else if ((bgfl && (cell.bg != -1)) && (cell.fg != -1)) { + if (!paddingfl || (cell.bg < 10)) + buffer += L"\u0003" + std::to_wstring((unsigned)cell.fg) + L"," + std::to_wstring((unsigned)cell.bg); + else + buffer += L"\u0003" + std::to_wstring((unsigned)cell.fg) + L",0" + std::to_wstring((unsigned)cell.bg); + } +} + +static bool +flipBit( + const Canvas::CELL& cell, + Canvas::CELL& state, + Canvas::CELL_ATTRS bit +) +{ + bool rc = false; + + if ((cell.attrs & bit) && !(state.attrs & bit)) + rc = true, state.attrs |= bit; + else if (!(cell.attrs & bit) && (state.attrs & bit)) + rc = true, state.attrs &= (Canvas::CELL_ATTRS)~bit; + return rc; +} + +/* + * Public class methods + */ + +bool +Canvas::exportANSi( + Rtl::STATUS& pstatus, + std::wstring& buffer +) +{ + Rtl::STATUS status = Rtl::STATUS_POSIX(ENOSYS); + + (void)buffer; + return (bool)(pstatus = status); +} + +bool +Canvas::exportMiRC( + Rtl::STATUS& pstatus, + std::wstring& buffer +) +{ + Canvas::CELL state; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + printf("%zu rows\n", this->size.h); + for (Canvas::COORD y = 0; y < this->size.h; y++) { + state = Canvas::CELL{Canvas::CATTR_NONE, -1, 15, {0, 0}, L" "}; + for (Canvas::COORD x = 0; x < this->size.w; x++) { + const auto& cell = this->cells[y][x]; + if (flipBit(cell, state, Canvas::CATTR_BOLD)) + buffer += L"\u0002"; + if (flipBit(cell, state, Canvas::CATTR_ITALIC)) + buffer += L"\u001d"; + if (flipBit(cell, state, Canvas::CATTR_UNDERLINE)) + buffer += L"\u001f"; + if ((cell.bg != state.bg) && (cell.fg != state.fg)) + encodeMiRCColours(buffer, cell, true, true), state.bg = cell.bg, state.fg = cell.fg; + else if ((cell.bg != state.bg) && (cell.fg == state.fg)) + encodeMiRCColours(buffer, cell, true, false), state.bg = cell.bg; + else if ((cell.bg == state.bg) && (cell.fg != state.fg)) + encodeMiRCColours(buffer, cell, false, true), state.fg = cell.fg; + buffer += cell.txt; + } + buffer += L"\n"; + } + if (buffer.length() == 0) + status = Rtl::STATUS_ROAR("empty canvas"); + return (bool)(pstatus = status); +} + +bool +Canvas::exportSAUCE( + Rtl::STATUS& pstatus, + std::wstring& buffer +) +{ + Rtl::STATUS status = Rtl::STATUS_POSIX(ENOSYS); + + (void)buffer; + return (bool)(pstatus = status); +} diff --git a/libcanvas/subr_import.cpp b/libcanvas/subr_import.cpp new file mode 100644 index 0000000..c0e84e9 --- /dev/null +++ b/libcanvas/subr_import.cpp @@ -0,0 +1,308 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "../librtl/rtldef.hpp" +#include "Canvas.hpp" + +/* + * Private variables + */ + +static std::map s_ANSi_bg_map = { + {107, 0}, // Bright White + {40, 1}, // Black + {44, 2}, // Blue + {42, 3}, // Green + {101, 4}, // Red + {41, 5}, // Light Red + {45, 6}, // Pink + {43, 7}, // Yellow + {103, 8}, // Light Yellow + {102, 9}, // Light Green + {46, 10}, // Cyan + {106, 11}, // Light Cyan + {104, 12}, // Light Blue + {105, 13}, // Light Pink + {100, 14}, // Grey + {47, 15}, // Light Grey +}; + +static std::map s_ANSi_fg_map = { + {97, 0}, // Bright White + {30, 1}, // Black + {34, 2}, // Blue + {32, 3}, // Green + {91, 4}, // Red + {31, 5}, // Light Red + {35, 6}, // Pink + {33, 7}, // Yellow + {93, 8}, // Light Yellow + {92, 9}, // Light Green + {36, 10}, // Cyan + {96, 11}, // Light Cyan + {94, 12}, // Light Blue + {95, 13}, // Light Pink + {90, 14}, // Grey + {37, 15}, // Light Grey +}; + +static std::map s_ANSi_fg_bold_map = { + {97, 0}, // Bright White + {30, 14}, // Grey + {94, 12}, // Light Blue + {32, 9}, // Light Green + {91, 4}, // Light Red + {31, 4}, // Light Red + {35, 13}, // Light Pink + {33, 8}, // Light Yellow + {93, 8}, // Light Yellow + {92, 9}, // Light Green + {36, 11}, // Light Cyan + {96, 11}, // Light Cyan + {94, 12}, // Light Blue + {95, 13}, // Light Pink + {90, 14}, // Grey + {37, 0}, // Bright White +}; + +static std::wregex s_colour_regex(L"\u0003((1[0-5]|0?[0-9])?(?:,(1[0-5]|0?[0-9]))?)", std::regex_constants::ECMAScript); +static std::wregex s_escape_regex(L"\x1b\\[((?:\\d{1,3};?)+m|\\d+[ABCDEFG])", std::regex_constants::ECMAScript); + +/* + * Private subroutines + */ + +static bool normaliseCanvasMap(Rtl::STATUS *pstatus, Canvas::CELL_MAP& cell_map, Canvas::SIZE& psize); + +static bool +normaliseCanvasMap( + Rtl::STATUS * pstatus, + Canvas::CELL_MAP& cell_map, + Canvas::SIZE& psize +) +{ + Canvas::SIZE size; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + size.h = cell_map.size(), size.w = 0; + std::for_each(cell_map.begin(), cell_map.end(), [&](auto col){size.w = std::max(size.w, col.size());}); + for (size_t y = 0; y < cell_map.size(); y++) { + if (cell_map[y].size() != size.w) { + for (size_t x = cell_map[y].size(); x < size.w; x++) + cell_map[y].push_back(Canvas::CELL{Canvas::CATTR_NONE, -1, 15, {x, y}, L" "}); + } + } + if ((size.h == 0) && (size.w == 0)) + status = Rtl::STATUS_ROAR("empty canvas"); + if (status) + psize = size; + return (bool)(*pstatus = status); +} + +/* + * Public class methods + */ + +bool +Canvas::importANSi( + Rtl::STATUS& pstatus, + const std::wstring& data +) +{ + unsigned long ansiCode; + std::wstring::size_type ansiCode_pos, ansiCode_pos_last = 0; + std::wstring ansiSequence; + Canvas::CELL_ATTRS cell_attrs; + bool cell_bold_ANSi; + COLOURS cell_colours, cell_colours_ANSi; + Canvas::CELL_MAP cell_map; + Canvas::CELL_LIST cell_row; + std::array escape_regex_matches; + std::match_results escape_regex_match_results; + std::wstring::size_type line_begin, line_end; + Canvas::POINT point = {0, 0}; + std::wstring::size_type pos, pos_last = 0; + Canvas::SIZE size; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + try { + do { + pos = data.find(L"\n", pos_last); + cell_attrs = Canvas::CATTR_NONE, cell_colours = {-1, 15}, cell_row = Canvas::CELL_LIST(), point.x = 0; + cell_bold_ANSi = false, cell_colours_ANSi = {30, 37}; + if (pos != std::wstring::npos) + line_end = ((pos > 0) && (data[pos - 1] == L'\r')) ? (pos - 1) : pos; + else + line_end = data.length(); + for (std::wstring::size_type nch = line_begin = ((pos_last != std::wstring::npos) ? pos_last : data.length()); nch < line_end; nch++) { + if (std::regex_search(&data[nch], escape_regex_match_results, s_escape_regex)) { + for (std::match_results::size_type nmatch = 0; nmatch < escape_regex_match_results.size(); nmatch++) + escape_regex_matches[nmatch] = escape_regex_match_results[nmatch].str(); + if (escape_regex_matches[1].back() == L'C') { + cell_row.push_back(Canvas::CELL{cell_attrs, cell_colours.bg, cell_colours.fg, point, L" "}), point.x++; + } else if (escape_regex_matches[1].back() == L'm') { + ansiSequence = escape_regex_matches[1].substr(0, escape_regex_matches[1].length() - 1); + do { + ansiCode_pos = ansiSequence.find(L";", ansiCode_pos_last); + switch ((ansiCode = std::stoul(ansiSequence.substr(ansiCode_pos, ansiCode_pos_last - ansiCode_pos)))) { + case 0: + cell_bold_ANSi = false, cell_colours = {-1, 15}, cell_colours_ANSi = {30, 37}; break; + case 1: + cell_bold_ANSi = true, cell_colours.fg = s_ANSi_fg_bold_map.find(ansiCode)->second; break; + case 2: + cell_bold_ANSi = true, cell_colours.fg = s_ANSi_fg_map.find(ansiCode)->second; break; + case 7: + std::swap(cell_colours.bg, cell_colours.fg); std::swap(cell_colours_ANSi.bg, cell_colours_ANSi.fg); break; + default: + if (!cell_bold_ANSi && (s_ANSi_fg_bold_map.find(ansiCode) != s_ANSi_bg_map.end())) { + cell_colours_ANSi.bg = ansiCode, cell_colours.bg = s_ANSi_bg_map.find(ansiCode)->second; + } else if (cell_bold_ANSi && (s_ANSi_fg_bold_map.find(ansiCode) != s_ANSi_fg_bold_map.end())) { + cell_colours_ANSi.fg = ansiCode, cell_colours.fg = s_ANSi_fg_bold_map.find(ansiCode)->second; + } else if (!cell_bold_ANSi && (s_ANSi_fg_map.find(ansiCode) != s_ANSi_fg_map.end())) { + cell_colours_ANSi.fg = ansiCode, cell_colours.fg = s_ANSi_fg_map.find(ansiCode)->second; + } else if (cell_bold_ANSi && (s_ANSi_fg_map.find(ansiCode) != s_ANSi_fg_map.end())) { + cell_colours_ANSi.fg = ansiCode, cell_colours.fg = s_ANSi_fg_bold_map.find(ansiCode)->second; + } + break; + } + } while (ansiCode_pos != std::wstring::npos); + } + nch += (escape_regex_match_results[0].length() - 1); + } else + cell_row.push_back(Canvas::CELL{cell_attrs, cell_colours.bg, cell_colours.fg, point, data[nch]}), point.x++; break; + } + cell_map.push_back(cell_row); point.y++; + if (pos != std::wstring::npos) + pos_last = pos + 1; + } while ((pos != std::wstring::npos) && (pos_last < data.length())); + } + catch (std::bad_alloc) { + status = Rtl::STATUS_POSIX(ENOMEM); /* XXX */ + } + catch (std::invalid_argument) { + status = Rtl::STATUS_POSIX(EINVAL); /* XXX */ + } + catch (std::out_of_range) { + status = Rtl::STATUS_POSIX(ERANGE); /* XXX */ + } + if (status && normaliseCanvasMap(&status, cell_map, size)) + this->import(status, cell_map, size); + return (bool)(pstatus = status); +} + +bool +Canvas::importMiRC( + Rtl::STATUS& pstatus, + const std::wstring& data +) +{ + Canvas::CELL_ATTRS cell_attrs; + COLOURS cell_colours; + Canvas::CELL_MAP cell_map; + Canvas::CELL_LIST cell_row; + std::array colour_regex_matches; + std::match_results colour_regex_match_results; + std::wstring::size_type line_begin, line_end; + Canvas::POINT point = {0, 0}; + std::wstring::size_type pos, pos_last = 0; + Canvas::SIZE size; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + try { + do { + pos = data.find(L"\n", pos_last); + cell_attrs = Canvas::CATTR_NONE, cell_colours = {-1, 15}, cell_row = Canvas::CELL_LIST(), point.x = 0; + if (pos != std::wstring::npos) + line_end = ((pos > 0) && (data[pos - 1] == L'\r')) ? (pos - 1) : pos; + else + line_end = data.length(); + for (std::wstring::size_type nch = line_begin = ((pos_last != std::wstring::npos) ? pos_last : data.length()); nch < line_end; nch++) { + switch (data[nch]) { + case '\x02': + cell_attrs = (Canvas::CELL_ATTRS)((cell_attrs & Canvas::CATTR_BOLD) ? (cell_attrs & ~Canvas::CATTR_BOLD) : (cell_attrs | Canvas::CATTR_BOLD)); break; + case '\x03': + if (std::regex_search(&data[nch], colour_regex_match_results, s_colour_regex)) { + for (std::match_results::size_type nmatch = 0; nmatch < colour_regex_match_results.size(); nmatch++) + colour_regex_matches[nmatch] = colour_regex_match_results[nmatch].str(); + if ((colour_regex_matches[2] != L"") && (colour_regex_matches[3] != L"")) { + cell_colours = {(COLOUR)std::stoull(colour_regex_matches[3]), (COLOUR)std::stoull(colour_regex_matches[2])}; + } else if ((colour_regex_matches[2] != L"") && (colour_regex_matches[3] == L"")) { + cell_colours.fg = (COLOUR)std::stoull(colour_regex_matches[2]); + } else if ((colour_regex_matches[2] == L"") && (colour_regex_matches[3] != L"")) { + cell_colours.bg = (COLOUR)std::stoull(colour_regex_matches[3]); + } else + cell_colours = {-1, 15}; + nch += colour_regex_match_results[1].length(); + } else + cell_colours = {-1, 15}; + break; + case '\x06': + cell_attrs = (Canvas::CELL_ATTRS)((cell_attrs & Canvas::CATTR_ITALIC) ? (cell_attrs & ~Canvas::CATTR_ITALIC) : (cell_attrs | Canvas::CATTR_ITALIC)); break; + case '\x0f': + cell_attrs = Canvas::CATTR_NONE, cell_colours = {-1, 15}; break; + case '\x16': + std::swap(cell_colours.bg, cell_colours.fg); break; + case '\x1f': + cell_attrs = (Canvas::CELL_ATTRS)((cell_attrs & Canvas::CATTR_UNDERLINE) ? (cell_attrs & ~Canvas::CATTR_UNDERLINE) : (cell_attrs | Canvas::CATTR_UNDERLINE)); break; + case '\t': + for (size_t ncell = 0; ncell < 8; ncell++, point.x++) + cell_row.push_back(Canvas::CELL{cell_attrs, cell_colours.bg, cell_colours.fg, point, L" "}); + break; + default: + cell_row.push_back(Canvas::CELL{cell_attrs, cell_colours.bg, cell_colours.fg, point, data[nch]}), point.x++; break; + } + } + cell_map.push_back(cell_row); point.y++, pos_last = pos + 1; + if (pos != std::wstring::npos) + pos_last = pos + 1; + } while ((pos != std::wstring::npos) && (pos_last < data.length())); + } + catch (std::bad_alloc) { + status = Rtl::STATUS_POSIX(ENOMEM); /* XXX */ + } + catch (std::invalid_argument) { + status = Rtl::STATUS_POSIX(EINVAL); /* XXX */ + } + catch (std::out_of_range) { + status = Rtl::STATUS_POSIX(ERANGE); /* XXX */ + } + if (status && normaliseCanvasMap(&status, cell_map, size)) + this->import(status, cell_map, size); + return (bool)(pstatus = status); +} + +bool +Canvas::importSAUCE( + Rtl::STATUS& pstatus, + const std::wstring& data +) +{ + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + (void)data; + return (bool)(pstatus = status); +} diff --git a/libgui/CanvasEditorWindow.cpp b/libgui/CanvasEditorWindow.cpp new file mode 100644 index 0000000..2629899 --- /dev/null +++ b/libgui/CanvasEditorWindow.cpp @@ -0,0 +1,1064 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#if defined(_WIN32) +#include +#elif defined(__linux__) +#include +#include +#include +#else +#error Unknown platform +#endif /* defined(_WIN32), defined(__linux__) */ + +#include +#include + +#include "../libtools/ToolCircle.hpp" +#include "../libtools/ToolCursor.hpp" +#include "../libtools/ToolErase.hpp" +#include "../libtools/ToolFill.hpp" +#include "../libtools/ToolLine.hpp" +#include "../libtools/ToolObject.hpp" +#include "../libtools/ToolPickColour.hpp" +#include "../libtools/ToolRect.hpp" +#include "../libtools/ToolText.hpp" +#include "CanvasEditorWindow.hpp" + +/* + * Private variables + */ + +std::map s_colour_names = { + {-1, L"Transparent colour"}, + { 0, L"Bright White"}, + { 1, L"Black"}, + { 2, L"Light Blue"}, + { 3, L"Green"}, + { 4, L"Red"}, + { 5, L"Light Red"}, + { 6, L"Pink"}, + { 7, L"Yellow"}, + { 8, L"Light Yellow"}, + { 9, L"Light Green"}, + {10, L"Cyan"}, + {11, L"Light Cyan"}, + {12, L"Blue"}, + {13, L"Light Pink"}, + {14, L"Grey"}, + {15, L"Light Grey"}, +}; + +/* + * Private subroutines + */ + +static Qt::MouseButton translateMouseButton(Tool::MOUSE_BUTTON button); +static Tool::MOUSE_BUTTON translateMouseButtonQt(Qt::MouseButton buttonQt); +static Tool::MOUSE_BUTTON translateMouseButtonsQt(Qt::MouseButtons buttonsQt); + +static Qt::MouseButton +translateMouseButton( + Tool::MOUSE_BUTTON button +) +{ + switch (button) { + case Tool::MBUTTON_LEFT: + return Qt::MouseButton::LeftButton; + case Tool::MBUTTON_MIDDLE: + return Qt::MouseButton::MiddleButton; + case Tool::MBUTTON_RIGHT: + return Qt::MouseButton::RightButton; + default: + return Qt::NoButton; + } +} + +static Tool::MOUSE_BUTTON +translateMouseButtonQt( + Qt::MouseButton buttonQt +) +{ + switch (buttonQt) { + case Qt::MouseButton::LeftButton: + return Tool::MBUTTON_LEFT; + case Qt::MouseButton::MiddleButton: + return Tool::MBUTTON_MIDDLE; + case Qt::MouseButton::RightButton: + return Tool::MBUTTON_RIGHT; + default: + return Tool::MBUTTON_NONE; + } +} + +static Tool::MOUSE_BUTTON +translateMouseButtonsQt( + Qt::MouseButtons buttonsQt +) +{ + switch (buttonsQt) { + case Qt::MouseButton::LeftButton: + return Tool::MBUTTON_LEFT; + case Qt::MouseButton::MiddleButton: + return Tool::MBUTTON_MIDDLE; + case Qt::MouseButton::RightButton: + return Tool::MBUTTON_RIGHT; + default: + return Tool::MBUTTON_NONE; + } +} + +/* + * Public class methods + */ + +CanvasEditorWindow::CanvasEditorWindow( + Canvas::BRUSH brush, + QWidget * parent +) +: QMainWindow(parent), + brush(brush), brushPos{0, 0}, + currentColourAction(nullptr), currentColourBgAction(nullptr), currentOperatorAction(nullptr), currentToolAction(nullptr), + currentTool(nullptr), cursorCells(), dirty(false), fileName(L""), lastEvent(CanvasWidget::ETYPE_NONE), mouseState{MOUSE_STATE_EMPTY}, + statusLabel(nullptr) +{ + QStringList arguments; + auto mainLayout = new QHBoxLayout(); + auto scrollArea = new QScrollArea(); + Rtl::STATUS status; + + this->canvasWidget = new CanvasWidget(); + this->canvasWidget->setEventDispatcher((CanvasWidget::EVENT_DISPATCHER)[&](QKeyEvent *k, QMouseEvent *m, QWheelEvent *w, CanvasWidget::EVENT_TYPE t) {return this->updateToolState(k, m, w, t); }); + this->canvasWidget->setFocusPolicy(Qt::FocusPolicy::ClickFocus); + this->canvasWidget->setFocus(Qt::FocusReason::ActiveWindowFocusReason); + this->canvasWidget->setMouseTracking(true); + scrollArea->setWidget(this->canvasWidget); + + ui.setupUi(this); + for (const auto& action : { + this->ui.actionDecreaseBrushHeight, this->ui.actionDecreaseBrushSize, this->ui.actionDecreaseBrushWidth, + this->ui.actionIncreaseBrushHeight, this->ui.actionIncreaseBrushSize, this->ui.actionIncreaseBrushWidth}) + (void)this->connect(action, &QAction::triggered, this, &CanvasEditorWindow::on_actionBrushSize_triggered); + for (const auto& action : { + this->ui.actionDecreaseCanvasHeight, this->ui.actionDecreaseCanvasSize, this->ui.actionDecreaseCanvasWidth, + this->ui.actionIncreaseCanvasHeight, this->ui.actionIncreaseCanvasSize, this->ui.actionIncreaseCanvasWidth}) + (void)this->connect(action, &QAction::triggered, this, &CanvasEditorWindow::on_actionCanvasSize_triggered); + for (const auto& action : { + this->ui.actionColour00, this->ui.actionColour01, this->ui.actionColour02, this->ui.actionColour03, this->ui.actionColour04, + this->ui.actionColour05, this->ui.actionColour06, this->ui.actionColour07, this->ui.actionColour08, this->ui.actionColour09, + this->ui.actionColour10, this->ui.actionColour11, this->ui.actionColour12, this->ui.actionColour13, this->ui.actionColour14, + this->ui.actionColour15, this->ui.actionColourTransparent}) + (void)this->connect(action, &QAction::triggered, this, &CanvasEditorWindow::on_actionColour_triggered); + for (const auto& action : { + this->ui.actionColourBg00, this->ui.actionColourBg01, this->ui.actionColourBg02, this->ui.actionColourBg03, this->ui.actionColourBg04, + this->ui.actionColourBg05, this->ui.actionColourBg06, this->ui.actionColourBg07, this->ui.actionColourBg08, this->ui.actionColourBg09, + this->ui.actionColourBg10, this->ui.actionColourBg11, this->ui.actionColourBg12, this->ui.actionColourBg13, this->ui.actionColourBg14, + this->ui.actionColourBg15, this->ui.actionColourBgTransparent}) + (void)this->connect(action, &QAction::triggered, this, &CanvasEditorWindow::on_actionColourBg_triggered); + (void)this->connect(this->ui.actionFlipColours, &QAction::triggered, this, &CanvasEditorWindow::on_actionFlipColours_triggered); + for (auto &action : { + this->ui.actionFlip, this->ui.actionFlipHorizontally, this->ui.actionInvertColours, this->ui.actionRotate, this->ui.actionTile}) + (void)this->connect(action, &QAction::triggered, this, &CanvasEditorWindow::on_actionOperator_triggered); + (void)this->connect(this->ui.actionRedo, &QAction::triggered, this, &CanvasEditorWindow::on_actionReUndo_triggered); + (void)this->connect(this->ui.actionUndo, &QAction::triggered, this, &CanvasEditorWindow::on_actionReUndo_triggered); + for (auto& action : { + this->ui.actionCursor, this->ui.actionRectangle, this->ui.actionCircle, this->ui.actionFill, + this->ui.actionLine, this->ui.actionText, this->ui.actionObject, this->ui.actionErase, this->ui.actionPickColour}) + (void)this->connect(action, &QAction::triggered, this, &CanvasEditorWindow::on_actionTool_triggered); + + mainLayout->addWidget(scrollArea); + this->setRandomAppIcon(status); + this->statusLabel = new QLabel(this); + this->ui.statusbar->addPermanentWidget(this->statusLabel, 1); + this->ui.centralwidget->setLayout(mainLayout); + arguments = QCoreApplication::arguments(); + if (arguments.size() > 1) + this->importMiRCfromFile(status, arguments[1].toStdWString(), true, true); + else + this->importNew(status, true, true); + emit this->ui.actionCursor->triggered(); + emit this->ui.actionColour03->triggered(); + emit this->ui.actionColourBgTransparent->triggered(); + this->updateStatusBar(); +} + +CanvasEditorWindow::~CanvasEditorWindow( +) +{ + /* XXX */ +} + +/* + * Private class methods + */ + +void +CanvasEditorWindow::applyLastTool( +) +{ + Tool::TOOL_CELLS rc(false, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + + if (this->currentTool) { + if (this->mouseState.dragState.status >= Tool::DSTATUS_BEGIN) + rc = this->currentTool->drag(this->brush, this->brushPos, this->canvasWidget->canvas, this->mouseState.dragState, this->brushPos); + else + rc = this->currentTool->cursor(this->brush, this->brushPos, this->canvasWidget->canvas, this->brushPos); + } + if (rc) { + (void)this->applyTool(rc); this->updateStatusBar(); + } +} + +Tool::TOOL_CELLS +CanvasEditorWindow::applyTool( + Tool::TOOL_CELLS rc +) +{ + bool commitfl = false; + Rtl::Either rc_(false, Canvas::RECT()); + + if (rc.right.first.size()) { + this->dirty = commitfl = this->canvasWidget->canvas.commit(rc.right.first, false); + if (commitfl && (this->canvasWidget->canvas.cellsUndo.size > 0)) + this->ui.actionUndo->setEnabled(true); + else + this->ui.actionUndo->setEnabled(false); + if ((rc_ = this->canvasWidget->renderCells(false, rc.right.first))) + this->canvasWidget->update(QRect(rc_.right.p0.x, rc_.right.p0.y, rc_.right.p1.x, rc_.right.p1.y)); + } + if (rc.right.second.size()) { + this->cursorHide(); this->cursorShow(rc.right.second); + } + return rc; +} + +void +CanvasEditorWindow::cursorHide( +) +{ + Canvas::CELL_LIST cells; + Rtl::Either rc(false, Canvas::RECT()); + + for (auto& cell : this->cursorCells) { + if ((cell.p.x < this->canvasWidget->canvas.size.w) + && (cell.p.y < this->canvasWidget->canvas.size.h)) + cells.push_back(this->canvasWidget->canvas.cells[cell.p.y][cell.p.x]); + } + if (cells.size() && (rc = this->canvasWidget->renderCells(false, cells))) + this->canvasWidget->update(QRect(rc.right.p0.x, rc.right.p0.y, rc.right.p1.x, rc.right.p1.y)); +} + +void +CanvasEditorWindow::cursorShow( + const Canvas::CELL_LIST& cells +) +{ + Rtl::Either rc(false, Canvas::RECT()); + + if ((rc = this->canvasWidget->renderCells(true, cells))) { + this->cursorCells = cells; + this->canvasWidget->update(QRect(rc.right.p0.x, rc.right.p0.y, rc.right.p1.x, rc.right.p1.y)); + } +} + +bool +CanvasEditorWindow::exportMiRCtoFile( + Rtl::STATUS& pstatus, + const std::wstring& fileName, + bool printError, + bool setTitle +) +{ + int fd = -1; + std::string fileData; + std::wstring fileDataW; +#if defined(__linux__) + std::string fileName_; +#endif /* defined(__linux__) */ +#if defined(_WIN32) + int nwritten = -2; +#elif defined(__linux__) + ssize_t nwritten = -2; +#endif /* defined(_WIN32), defined(__linux__) */ + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + try { +#if defined(_WIN32) + if (STATUS_BIND_LIBC(status, fd = _wopen(fileName.c_str(), _O_BINARY | _O_CREAT | _O_WRONLY, 0600)) +#elif defined(__linux__) + if (Rtl::convert_wstring(&status, fileName, fileName_) + && STATUS_BIND_LIBC(status, fd = ::open(fileName_.c_str(), O_CREAT | O_WRONLY, 0600)) +#endif /* defined(_WIN32), defined(__linux__) */ + && this->canvasWidget->canvas.export_(status, fileDataW, Canvas::DTYPE_MIRC) + && Rtl::convert_wstring(&status, fileDataW, fileData) +#if defined(_WIN32) + && STATUS_BIND_LIBC(status, nwritten = _write(fd, &fileData[0], (unsigned int)fileData.length())) +#elif defined(__linux__) + && STATUS_BIND_LIBC(status, nwritten = ::write(fd, &fileData[0], (size_t)fileData.length())) +#endif /* defined(_WIN32), defined(__linux__) */ + && STATUS_BIND_ROAR(status, "short write", ((size_t)nwritten == fileData.length()))) { + this->dirty = false, this->fileName = fileName; + if (setTitle) + this->setWindowTitle(QString("%1 - roar").arg(QString().fromUtf16((const ushort *)this->fileName.c_str()))); + } + } + catch (std::bad_alloc) { + status = Rtl::STATUS_POSIX(ENOMEM); + } + if (fd != -1) +#if defined(_WIN32) + _close(fd); +#elif defined(__linux__) + ::close(fd); +#endif /* defined(_WIN32), defined(__linux__) */ + printf("fileData.length()=%zu fileDataW.length()=%zu nwritten=%d\n", fileData.length(), fileDataW.length(), nwritten); + if (!status && printError) + QMessageBox::critical(this, "File error", + QString("Failed to open %1: %2").arg(QString().fromUtf16((const ushort *)fileName.c_str())).arg(QString().fromUtf16((const ushort *)Rtl::perror(status).c_str()))); + return (bool)(pstatus = status); +} + +bool +CanvasEditorWindow::importMiRCfromFile( + Rtl::STATUS& pstatus, + const std::wstring& fileName, + bool printError, + bool setTitle +) +{ + int fd = -1; + std::string fileData; + std::wstring fileDataW; +#if defined(__linux__) + std::string fileName_; +#endif /* defined(__linux__) */ + int64_t fileSize = 0; +#if defined(_WIN32) + int nread; +#elif defined(__linux__) + ssize_t nread; +#endif /* defined(_WIN32), defined(__linux__) */ + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + try { +#if defined(_WIN32) + if (STATUS_BIND_LIBC(status, fd = _wopen(fileName.c_str(), _O_BINARY | _O_RDONLY)) + && STATUS_BIND_LIBC(status, _lseeki64(fd, 0, SEEK_END)) + && STATUS_BIND_LIBC(status, fileSize = _telli64(fd)) +#elif defined(__linux__) + if (Rtl::convert_wstring(&status, fileName, fileName_) + && STATUS_BIND_LIBC(status, fd = ::open(fileName_.c_str(), O_RDONLY)) + && STATUS_BIND_LIBC(status, lseek(fd, 0, SEEK_END)) + && STATUS_BIND_LIBC(status, fileSize = lseek(fd, 0, SEEK_CUR)) +#endif /* defined(_WIN32), defined(__linux__) */ + && STATUS_BIND_TRUE(fileData.resize(fileSize)) +#if defined(_WIN32) + && STATUS_BIND_LIBC(status, _lseeki64(fd, 0, SEEK_SET)) + && STATUS_BIND_LIBC(status, nread = _read(fd, &fileData[0], fileSize)) +#elif defined(__linux__) + && STATUS_BIND_LIBC(status, lseek(fd, 0, SEEK_CUR)) + && STATUS_BIND_LIBC(status, nread = ::read(fd, &fileData[0], fileSize)) +#endif /* defined(_WIN32), defined(__linux__) */ + && STATUS_BIND_ROAR(status, "short read", (size_t)nread == (size_t)fileSize) + && Rtl::convert_cstring(&status, fileData, fileDataW) + && this->canvasWidget->import(status, fileDataW, Canvas::DTYPE_MIRC)) { + this->dirty = false, this->fileName = fileName; + this->ui.actionRedo->setEnabled(false), this->ui.actionUndo->setEnabled(false); + if (setTitle) + this->setWindowTitle(QString("%1 - roar").arg(QString().fromUtf16((const ushort *)this->fileName.c_str()))); + } + } + catch (std::bad_alloc) { + status = Rtl::STATUS_POSIX(ENOMEM); + } + if (fd != -1) +#if defined(_WIN32) + _close(fd); +#elif defined(__linux__) + ::close(fd); +#endif /* defined(_WIN32), defined(__linux__) */ + if (!status && printError) + QMessageBox::critical(this, "File error", + QString("Failed to open %1: %2").arg(QString().fromUtf16((const ushort *)fileName.c_str())).arg(QString().fromUtf16((const ushort *)Rtl::perror(status).c_str()))); + return (bool)(pstatus = status); +} + +bool +CanvasEditorWindow::importNew( + Rtl::STATUS& pstatus, + bool printError, + bool setTitle +) +{ + Canvas::CELL_MAP cell_map; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + try { + cell_map = Canvas::CELL_MAP(this->canvasWidget->sizeDefault.h, Canvas::CELL_LIST(this->canvasWidget->sizeDefault.w)); + for (uint64_t y = 0; y < cell_map.size(); y++) { + for (uint64_t x = 0; x < cell_map[y].size(); x++) + cell_map[y][x] = Canvas::CELL{Canvas::CATTR_NONE, this->brush.colours.bg, this->brush.colours.fg, {x, y}, L" "}; + } + if (this->canvasWidget->import(status, cell_map, this->canvasWidget->sizeDefault)) { + this->dirty = false, this->fileName = L""; + this->ui.actionRedo->setEnabled(false), this->ui.actionUndo->setEnabled(false); + if (setTitle) + this->setWindowTitle(QString("(Untitled) - roar")); + } + } + catch (std::bad_alloc) { + status = Rtl::STATUS_POSIX(ENOMEM); + } + if (!status && printError) + QMessageBox::critical(this, "Canvas error", QString("%1").arg(QString().fromUtf16((const ushort *)Rtl::perror(status).c_str()))); + return (bool)(pstatus = status); +} + +void +CanvasEditorWindow::on_actionBrushSize_triggered( + bool checked +) +{ + QAction * object = (QAction *)sender(); + bool updatefl = false; + + (void)checked; + if (object == this->ui.actionDecreaseBrushHeight) { + if (this->brush.size.h > 0) + this->brush.size.h--, updatefl = true; + } else if (object == this->ui.actionDecreaseBrushSize) { + if (this->brush.size.h > 0) + this->brush.size.h--, updatefl = true; + if (this->brush.size.w > 0) + this->brush.size.w--, updatefl = true; + } else if (object == this->ui.actionDecreaseBrushWidth) { + if (this->brush.size.w > 0) + this->brush.size.w--, updatefl = true; + } else if (object == this->ui.actionIncreaseBrushHeight) { + this->brush.size.h++, updatefl = true; + } else if (object == this->ui.actionIncreaseBrushSize) { + this->brush.size.h++, this->brush.size.w++, updatefl = true; + } else if (object == this->ui.actionIncreaseBrushWidth) { + this->brush.size.w++, updatefl = true; + } + if (updatefl) + this->applyLastTool(); +} + +void +CanvasEditorWindow::on_actionCanvasSize_triggered( + bool checked +) +{ + QAction * object = (QAction *)sender(); + + (void)checked; + if (object == this->ui.actionDecreaseCanvasHeight) { + } else if (object == this->ui.actionDecreaseCanvasSize) { + } else if (object == this->ui.actionDecreaseCanvasWidth) { + } else if (object == this->ui.actionIncreaseCanvasHeight) { + } else if (object == this->ui.actionIncreaseCanvasSize) { + } else if (object == this->ui.actionIncreaseCanvasWidth) { + } +} + +void +CanvasEditorWindow::on_actionColour_triggered( + bool checked +) +{ + QAction * object = (QAction *)sender(); + bool updatefl = false; + + (void)checked; + if (this->currentColourAction) + this->currentColourAction->setChecked(false); + this->currentColourAction = object; this->currentColourAction->setChecked(true); + if (object == this->ui.actionColour00) + this->brush.colours.fg = 0, updatefl = true; + else if (object == this->ui.actionColour01) + this->brush.colours.fg = 1, updatefl = true; + else if (object == this->ui.actionColour02) + this->brush.colours.fg = 2, updatefl = true; + else if (object == this->ui.actionColour03) + this->brush.colours.fg = 3, updatefl = true; + else if (object == this->ui.actionColour04) + this->brush.colours.fg = 4, updatefl = true; + else if (object == this->ui.actionColour05) + this->brush.colours.fg = 5, updatefl = true; + else if (object == this->ui.actionColour06) + this->brush.colours.fg = 6, updatefl = true; + else if (object == this->ui.actionColour07) + this->brush.colours.fg = 7, updatefl = true; + else if (object == this->ui.actionColour08) + this->brush.colours.fg = 8, updatefl = true; + else if (object == this->ui.actionColour09) + this->brush.colours.fg = 9, updatefl = true; + else if (object == this->ui.actionColour10) + this->brush.colours.fg = 10, updatefl = true; + else if (object == this->ui.actionColour11) + this->brush.colours.fg = 11, updatefl = true; + else if (object == this->ui.actionColour12) + this->brush.colours.fg = 12, updatefl = true; + else if (object == this->ui.actionColour13) + this->brush.colours.fg = 13, updatefl = true; + else if (object == this->ui.actionColour14) + this->brush.colours.fg = 14, updatefl = true; + else if (object == this->ui.actionColour15) + this->brush.colours.fg = 15, updatefl = true; + else if (object == this->ui.actionColourTransparent) + this->brush.colours.fg = -1, updatefl = true; + if (updatefl) + this->applyLastTool(); +} + +void +CanvasEditorWindow::on_actionColourBg_triggered( + bool checked +) +{ + QAction * object = (QAction *)sender(); + bool updatefl = false; + + (void)checked; + if (this->currentColourBgAction) + this->currentColourBgAction->setChecked(false); + this->currentColourBgAction = object; this->currentColourBgAction->setChecked(true); + if (object == this->ui.actionColourBg00) + this->brush.colours.bg = 0, updatefl = true; + else if (object == this->ui.actionColourBg01) + this->brush.colours.bg = 1, updatefl = true; + else if (object == this->ui.actionColourBg02) + this->brush.colours.bg = 2, updatefl = true; + else if (object == this->ui.actionColourBg03) + this->brush.colours.bg = 3, updatefl = true; + else if (object == this->ui.actionColourBg04) + this->brush.colours.bg = 4, updatefl = true; + else if (object == this->ui.actionColourBg05) + this->brush.colours.bg = 5, updatefl = true; + else if (object == this->ui.actionColourBg06) + this->brush.colours.bg = 6, updatefl = true; + else if (object == this->ui.actionColourBg07) + this->brush.colours.bg = 7, updatefl = true; + else if (object == this->ui.actionColourBg08) + this->brush.colours.bg = 8, updatefl = true; + else if (object == this->ui.actionColourBg09) + this->brush.colours.bg = 9, updatefl = true; + else if (object == this->ui.actionColourBg10) + this->brush.colours.bg = 10, updatefl = true; + else if (object == this->ui.actionColourBg11) + this->brush.colours.bg = 11, updatefl = true; + else if (object == this->ui.actionColourBg12) + this->brush.colours.bg = 12, updatefl = true; + else if (object == this->ui.actionColourBg13) + this->brush.colours.bg = 13, updatefl = true; + else if (object == this->ui.actionColourBg14) + this->brush.colours.bg = 14, updatefl = true; + else if (object == this->ui.actionColourBg15) + this->brush.colours.bg = 15, updatefl = true; + else if (object == this->ui.actionColourBgTransparent) + this->brush.colours.bg = -1, updatefl = true; + if (updatefl) + this->applyLastTool(); +} + +void +CanvasEditorWindow::on_actionFlipColours_triggered( + bool checked +) +{ + (void)checked; + std::swap(this->brush.colours.bg, this->brush.colours.fg); + this->applyLastTool(); +} + +void +CanvasEditorWindow::on_actionOperator_triggered( + bool checked +) +{ + QAction * object = (QAction *)sender(); + + (void)checked; + if (this->currentOperatorAction) + this->currentOperatorAction->setChecked(false); + this->currentOperatorAction = object; this->currentOperatorAction->setChecked(true); + if (object == this->ui.actionFlip) { + } else if (object == this->ui.actionFlipHorizontally) { + } else if (object == this->ui.actionInvertColours) { + } else if (object == this->ui.actionRotate) { + } else if (object == this->ui.actionTile) { + } +} + +void +CanvasEditorWindow::on_actionReUndo_triggered( + bool checked +) +{ + const Canvas::CELL_LIST * cells = nullptr; + QAction * object = (QAction *)sender(); + Rtl::Either rc(false, Canvas::RECT()); + + (void)checked; + if (object == this->ui.actionRedo) { + cells = this->canvasWidget->canvas.redo(); + } else if (object == this->ui.actionUndo) { + cells = this->canvasWidget->canvas.undo(); + } + if (this->canvasWidget->canvas.cellsUndo.index > 0) + this->ui.actionRedo->setEnabled(true); + else + this->ui.actionRedo->setEnabled(false); + if (this->canvasWidget->canvas.cellsUndo.index < this->canvasWidget->canvas.cellsUndo.size) + this->ui.actionUndo->setEnabled(true); + else + this->ui.actionUndo->setEnabled(false); + if (cells && (rc = this->canvasWidget->renderCells(false, *cells))) + this->canvasWidget->update(QRect(rc.right.p0.x, rc.right.p0.y, rc.right.p1.x, rc.right.p1.y)); +} + +void +CanvasEditorWindow::on_actionTool_triggered( + bool checked +) +{ + QAction * object = (QAction *)sender(); + + (void)checked; + if (this->currentToolAction) + this->currentToolAction->setChecked(false); + this->currentToolAction = object; this->currentToolAction->setChecked(true); + if (object == this->ui.actionCircle) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionCursor) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionObject) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionRectangle) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionLine) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionText) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionPickColour) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionErase) + this->currentTool = std::make_unique(); + else if (object == this->ui.actionFill) + this->currentTool = std::make_unique(); + this->updateStatusBar(); +} + +bool +CanvasEditorWindow::promptSaveChanges( +) +{ + std::wstring fileName; + bool rc; + + fileName = (this->fileName == L"") ? L"(Untitled)" : this->fileName; + switch (QMessageBox::question( + this, "roar", QString("Do you want to save changes to %1?").arg(QString().fromUtf16((const ushort *)fileName.c_str())), + QMessageBox::Cancel | QMessageBox::Discard | QMessageBox::Save, QMessageBox::Save)) { + case QMessageBox::Cancel: + rc = false; break; + case QMessageBox::Discard: + rc = true; break; + case QMessageBox::Save: + rc = this->saveAsMiRC("", true, false); break; + default: + rc = false; + } + return rc; +} + +bool +CanvasEditorWindow::saveAsMiRC( + const QString& fileName, + bool printError, + bool promptName +) +{ + QString fileName_; + std::wstring fileName_W; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + if (fileName == "") { + if (promptName || (this->fileName == L"")) { + if ((fileName_ = QFileDialog::getSaveFileName(this, tr("Save..."), QString(""), tr("mIRC art files (*.txt);;All Files (*.*)"))) != "") { + if (Rtl::convert_cstring(&status, fileName_.toStdString(), fileName_W)) + this->fileName = fileName_W; + } else + return false; + } + } else + Rtl::convert_cstring(&status, fileName.toStdString(), fileName_W); + if (status) + this->exportMiRCtoFile(status, this->fileName, true, true); + else if (printError) + QMessageBox::critical(this, "Save...", QString("%1").arg(QString().fromUtf16((const ushort *)Rtl::perror(status).c_str()))); + return (bool)status; +} + +bool +CanvasEditorWindow::setRandomAppIcon( + Rtl::STATUS& pstatus +) +{ + struct _wfinddata_t fileinfo; + intptr_t findHandle; + QIcon icon; + std::vector iconNames; + QPixmap pixmap; + QString pixmapFileName; + int rc; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + if (STATUS_BIND_LIBC(status, findHandle = _wfindfirst(L"assets\\images\\logo*.bmp", &fileinfo))) { + while (STATUS_BIND_LIBC(status, (rc = _wfindnext(findHandle, &fileinfo)))) + iconNames.push_back(L"assets\\images\\" + std::wstring(fileinfo.name)); + if (!status && (status.cond == ENOENT)) + status = Rtl::STATUS_NONE_SUCCESS; + _findclose(findHandle); + } + pixmapFileName = QString().fromUtf16((const ushort *)iconNames[rand() % iconNames.size()].c_str()); + pixmap = QPixmap(pixmapFileName); + icon = QIcon(pixmap); + this->setWindowIcon(icon); + return (bool)(pstatus = status); +} + +Canvas::POINT +CanvasEditorWindow::translateMousePointQt( + QPoint pointQt +) +{ + Canvas::POINT point = {0, 0}; + if (pointQt.x() > 0) + point.x = pointQt.x() / this->canvasWidget->cellSize.w; + if (pointQt.y() > 0) + point.y = pointQt.y() / this->canvasWidget->cellSize.h; + return point; +} + +void +CanvasEditorWindow::updateStatusBar( +) +{ + std::wstring statusText; + std::wstringstream statusText_stream; + + statusText_stream + << L"X: " << setfillw(L'0', 3) << this->brushPos.x << L" " + << L"Y: " << setfillw(L'0', 3) << this->brushPos.y + << L" | " + << L"W: " << setfillw(L'0', 3) << this->canvasWidget->canvas.size.w << L" " + << L"H: " << setfillw(L'0', 3) << this->canvasWidget->canvas.size.h + << L" | " + << L"B: " << setfillw(L'0', 2) << this->brush.size.w << L"x" << setfillw(L'0', 2) << this->brush.size.h + << L" | " + << L"FG " << setfillw(L'0', 2) << this->brush.colours.fg << L" (" << s_colour_names[this->brush.colours.fg] << L"), " + << L"BG " << setfillw(L'0', 2) << this->brush.colours.bg << L" (" << s_colour_names[this->brush.colours.bg]; + if (this->currentTool) + statusText_stream << L" | T: " << this->currentTool->name; + if (this->dirty) + statusText_stream << " | *"; + statusText = statusText_stream.str(); + this->statusLabel->setText(QString().fromUtf16((const ushort *)statusText.c_str())); +} + +bool +CanvasEditorWindow::updateToolState( + QKeyEvent * keyEvent, + QMouseEvent * mouseEvent, + QWheelEvent * wheelEvent, + CanvasWidget::EVENT_TYPE type +) +{ + QPoint angleDelta; + Tool::MOUSE_BUTTON button = Tool::MBUTTON_NONE; + Qt::MouseButtons buttonsQt; + Canvas::POINT canvasPos{0, 0}; + Qt::KeyboardModifiers modifiers; + Tool::TOOL_CELLS rc(false, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + bool updatefl = false; + + (void)keyEvent; + if (!this->currentTool) + return false; + switch (type) { + case CanvasWidget::ETYPE_KEYBOARD_PRESS: + case CanvasWidget::ETYPE_KEYBOARD_RELEASE: + break; + case CanvasWidget::ETYPE_MOUSE_MOVE: + case CanvasWidget::ETYPE_MOUSE_PRESS: + case CanvasWidget::ETYPE_MOUSE_RELEASE: + button = translateMouseButtonQt(mouseEvent->button()), canvasPos = translateMousePointQt(mouseEvent->localPos().toPoint()); + modifiers = mouseEvent->modifiers(); + break; + case CanvasWidget::ETYPE_MOUSE_WHEEL: + angleDelta = wheelEvent->angleDelta(), modifiers = wheelEvent->modifiers(); + break; + default: + break; + } + switch (type) { + case CanvasWidget::ETYPE_MOUSE_MOVE: + if (!this->canvasWidget->hasFocus()) + this->canvasWidget->setFocus(Qt::FocusReason::ActiveWindowFocusReason); + buttonsQt = mouseEvent->buttons(); + switch (this->mouseState.dragState.status) { + case Tool::DSTATUS_NONE: + if (this->mouseState.lastPos != canvasPos) { + if (buttonsQt == Qt::NoButton) { + rc = this->currentTool->cursor(this->brush, this->brushPos, this->canvasWidget->canvas, canvasPos); + this->mouseState.lastPos = canvasPos; + } else if ((button = translateMouseButtonsQt(buttonsQt)) != Tool::MBUTTON_NONE) { + rc = this->currentTool->click(this->brush, this->brushPos, button, this->canvasWidget->canvas, canvasPos); + this->mouseState.lastPos = canvasPos; + } + } + break; + case Tool::DSTATUS_BEGIN: + if (this->mouseState.dragState.begin != canvasPos) { + if (buttonsQt == translateMouseButton(this->mouseState.dragState.button)) { + this->mouseState.dragState.status = Tool::DSTATUS_MOVE; + rc = this->currentTool->drag(this->brush, this->brushPos, this->canvasWidget->canvas, this->mouseState.dragState, canvasPos); + this->mouseState.lastPos = canvasPos; + } + } + break; + case Tool::DSTATUS_MOVE: + if (this->mouseState.lastPos != canvasPos) { + rc = this->currentTool->drag(this->brush, this->brushPos, this->canvasWidget->canvas, this->mouseState.dragState, canvasPos); + this->mouseState.lastPos = canvasPos; + } + break; + default: + break; + } + mouseEvent->accept(); + break; + case CanvasWidget::ETYPE_MOUSE_PRESS: + switch (this->mouseState.dragState.status) { + case Tool::DSTATUS_NONE: + if (modifiers == Qt::ControlModifier) { + this->mouseState.dragState.begin = canvasPos; + this->mouseState.dragState.button = button; + this->mouseState.dragState.status = Tool::DSTATUS_BEGIN; + this->mouseState.lastPos = canvasPos; + } + break; + default: + break; + } + mouseEvent->accept(); + break; + case CanvasWidget::ETYPE_MOUSE_RELEASE: + switch (this->mouseState.dragState.status) { + case Tool::DSTATUS_BEGIN: + this->mouseState.dragState = Tool::DRAG_STATE{DRAG_STATE_EMPTY}; + case Tool::DSTATUS_NONE: + this->mouseState.lastPos = canvasPos; + rc = this->currentTool->click(this->brush, this->brushPos, button, this->canvasWidget->canvas, canvasPos); + break; + case Tool::DSTATUS_MOVE: + if (button == this->mouseState.dragState.button) { + this->mouseState.dragState.set = canvasPos; + this->mouseState.dragState.status = Tool::DSTATUS_SET; + rc = this->currentTool->drag(this->brush, this->brushPos, this->canvasWidget->canvas, this->mouseState.dragState, canvasPos); + this->mouseState.dragState = Tool::DRAG_STATE{DRAG_STATE_EMPTY}; + this->mouseState.lastPos = canvasPos; + } + break; + default: + break; + } + mouseEvent->accept(); + break; + case CanvasWidget::ETYPE_MOUSE_WHEEL: + if (modifiers == Qt::ControlModifier) { + if (angleDelta.y() > 0) + this->brush.size.h++, this->brush.size.w++, updatefl = true; + else { + if (this->brush.size.h > 0) + this->brush.size.h--, updatefl = true; + if (this->brush.size.w > 0) + this->brush.size.w--, updatefl = true; + } + if (updatefl) + this->applyLastTool(); + wheelEvent->accept(); + } else + wheelEvent->ignore(); + break; + default: + break; + } + if (rc) { + rc = this->applyTool(rc); this->updateStatusBar(); + } + return rc; +} + +/* + * Private Qt class slot functions + */ + +void +CanvasEditorWindow::on_actionAboutRoar_triggered( + bool checked +) +{ + QDialog * about = new QDialog(0, Qt::WindowCloseButtonHint | Qt::WindowTitleHint); + + (void)checked; + this->uiAbout.setupUi(about); + about->setFixedSize(about->size()); + about->show(); +} + +void +CanvasEditorWindow::on_actionExit_triggered( + bool checked +) +{ + (void)checked; + if (!this->dirty || (this->dirty && this->promptSaveChanges())) + this->close(); +} + +void +CanvasEditorWindow::on_actionExportAsANSI_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionExportAsPNG_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionExportToClipboard_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionExportToImgur_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionExportToPastebin_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionImportANSI_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionImportFromClipboard_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionImportSAUCE_triggered( + bool checked +) +{ + (void)checked; +} + +void +CanvasEditorWindow::on_actionNew_triggered( + bool checked +) +{ + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + (void)checked; + if (!this->dirty || (this->dirty && this->promptSaveChanges())) + this->importNew(status, true, true); +} + +void +CanvasEditorWindow::on_actionOpen_triggered( + bool checked +) +{ + QString fileName; + std::wstring fileNameW; + Rtl::STATUS status = Rtl::STATUS_NONE_SUCCESS; + + (void)checked; + if (((fileName = QFileDialog::getOpenFileName(this, tr("Open..."), QString(""), tr("mIRC art files (*.txt);;All Files (*.*)"))) != "") + && (!this->dirty || (this->dirty && this->promptSaveChanges()))) { + QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::processEvents(); + if (Rtl::convert_cstring(&status, fileName.toStdString(), fileNameW)) + this->importMiRCfromFile(status, fileNameW, true, true); + QApplication::restoreOverrideCursor(); QApplication::processEvents(); + } + if (!status) + QMessageBox::critical(this, "Open...", QString("Failed to open %1: %2").arg(fileName, QString().fromUtf16((const ushort *)Rtl::perror(status).c_str()))); +} + +void +CanvasEditorWindow::on_actionSave_triggered( + bool checked +) +{ + (void)checked; + this->saveAsMiRC("", true, false); +} + +void +CanvasEditorWindow::on_actionSaveAs_triggered( + bool checked +) +{ + Rtl::STATUS status; + + (void)checked; + this->saveAsMiRC("", true, true); +} diff --git a/libgui/CanvasEditorWindow.hpp b/libgui/CanvasEditorWindow.hpp new file mode 100644 index 0000000..37d2e89 --- /dev/null +++ b/libgui/CanvasEditorWindow.hpp @@ -0,0 +1,108 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _CANVASEDITORWINDOW_HPP_ +#define _CANVASEDITORWINDOW_HPP_ + +#include +#include + +#include +#include + +#include "../libcanvas/Canvas.hpp" +#include "../librtl/rtldef.hpp" +#include "../libtools/Tool.hpp" +#include "CanvasWidget.hpp" +#include "ui_roar.h" +#include "ui_roar_about.h" + +/* + * Public types + */ + +class CanvasEditorWindow : public QMainWindow { + Q_OBJECT + +public: + explicit CanvasEditorWindow(Canvas::BRUSH brush={{-1, 3}, {1, 1}}, QWidget *parent=nullptr); + ~CanvasEditorWindow(); + +private: + typedef struct mouse_state_e { + Tool::DRAG_STATE dragState; + Tool::MOUSE_BUTTON button; + Canvas::POINT lastPos; + } MOUSE_STATE; + #define MOUSE_STATE_EMPTY DRAG_STATE_EMPTY, Tool::MBUTTON_NONE, {0, 0} + + Canvas::BRUSH brush; + Canvas::POINT brushPos; + CanvasWidget * canvasWidget; + QAction * currentColourAction, *currentColourBgAction, *currentOperatorAction, *currentToolAction; + std::unique_ptr currentTool; + Canvas::CELL_LIST cursorCells; + bool dirty; + std::wstring fileName; + QIcon icon; + CanvasWidget::EVENT_TYPE lastEvent; + MOUSE_STATE mouseState; + QLabel * statusLabel; + Ui::canvas ui; + Ui::Dialog uiAbout; + + void applyLastTool(); + Tool::TOOL_CELLS applyTool(Tool::TOOL_CELLS rc); + void cursorHide(); + void cursorShow(const Canvas::CELL_LIST& cells); + bool exportMiRCtoFile(Rtl::STATUS& pstatus, const std::wstring& fileName, bool printError, bool setTitle); + bool importMiRCfromFile(Rtl::STATUS& pstatus, const std::wstring& fileName, bool printError, bool setTitle); + bool importNew(Rtl::STATUS& pstatus, bool printError, bool setTitle); + void on_actionBrushSize_triggered(bool checked); + void on_actionCanvasSize_triggered(bool checked); + void on_actionColour_triggered(bool checked); + void on_actionColourBg_triggered(bool checked); + void on_actionFlipColours_triggered(bool checked); + void on_actionOperator_triggered(bool checked); + void on_actionReUndo_triggered(bool checked); + void on_actionTool_triggered(bool checked); + bool promptSaveChanges(); + bool saveAsMiRC(const QString& fileName, bool printError, bool promptName); + bool setRandomAppIcon(Rtl::STATUS& pstatus); + Canvas::POINT translateMousePointQt(QPoint pointQt); + void updateStatusBar(); + bool updateToolState(QKeyEvent *, QMouseEvent *, QWheelEvent *, CanvasWidget::EVENT_TYPE); + +private slots: + void on_actionAboutRoar_triggered(bool checked); + void on_actionExit_triggered(bool checked); + void on_actionExportAsANSI_triggered(bool checked); + void on_actionExportAsPNG_triggered(bool checked); + void on_actionExportToClipboard_triggered(bool checked); + void on_actionExportToImgur_triggered(bool checked); + void on_actionExportToPastebin_triggered(bool checked); + void on_actionImportANSI_triggered(bool checked); + void on_actionImportFromClipboard_triggered(bool checked); + void on_actionImportSAUCE_triggered(bool checked); + void on_actionNew_triggered(bool checked); + void on_actionOpen_triggered(bool checked); + void on_actionSave_triggered(bool checked); + void on_actionSaveAs_triggered(bool checked); +}; + +#endif /* _CANVASEDITORWINDOW_HPP_ */ diff --git a/libgui/CanvasWidget.cpp b/libgui/CanvasWidget.cpp new file mode 100644 index 0000000..3dcd473 --- /dev/null +++ b/libgui/CanvasWidget.cpp @@ -0,0 +1,358 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include +#include +#include + +#include "CanvasWidget.hpp" + +/* + * Private constants and variables + */ + +#define BLEND_ALPHA_COEFFICIENT 0.8 + +static const Canvas::COLOUR_LIST s_colours = { + {255, 255, 255}, // Bright White + {0, 0, 0}, // Black + {0, 0, 187}, // Light Blue + {0, 187, 0}, // Green + {255, 85, 85}, // Red + {187, 0, 0}, // Light Red + {187, 0, 187}, // Pink + {187, 187, 0}, // Yellow + {255, 255, 85}, // Light Yellow + {85, 255, 85}, // Light Green + {0, 187, 187}, // Cyan + {85, 255, 255}, // Light Cyan + {85, 85, 255}, // Blue + {255, 85, 255}, // Light Pink + {85, 85, 85}, // Grey + {187, 187, 187}, // Light Grey +}; + +static const Canvas::COLOUR_LIST s_colours_bold = { + {255, 255, 255}, // Bright White + {85, 85, 85}, // Black + {85, 85, 255}, // Light Blue + {85, 255, 85}, // Green + {255, 85, 85}, // Red + {255, 85, 85}, // Light Red + {255, 85, 255}, // Pink + {255, 255, 85}, // Yellow + {255, 255, 85}, // Light Yellow + {85, 255, 85}, // Light Green + {85, 255, 255}, // Cyan + {85, 255, 255}, // Light Cyan + {85, 85, 255}, // Blue + {255, 85, 255}, // Light Pink + {85, 85, 85}, // Grey + {255, 255, 255}, // Light Grey +}; + +/* + * Public class functions + */ + +CanvasWidget::CanvasWidget( + QWidget * parent, + Canvas::SIZE cellSize, + Canvas::SIZE sizeDefault +) +: QOpenGLWidget(parent), canvas(sizeDefault), cellSize(cellSize), charMap(), eventDispatcher(), parent(parent), sizeDefault(sizeDefault) +{ + this->font = QFont("DejaVu Sans Mono", 8); // XXX + this->font.setStyleStrategy(QFont::PreferAntialias); + this->imageSize = QSize(this->canvas.size.w * this->cellSize.w, this->canvas.size.h * this->cellSize.h); + this->image = QImage(this->imageSize.width(), this->imageSize.height(), QImage::Format_RGB32); + this->setAutoFillBackground(false); +} + +Rtl::Either +CanvasWidget::renderCells( + bool isCursor, + const Canvas::CELL_LIST& cells +) +{ + Canvas::CELL cell_, cell_canvas; + Rtl::Either rc(true, Canvas::RECT()); + CanvasWidget::RECT_EITHER rectEither{Rtl::Either(false, Canvas::POINT()), Canvas::POINT()}; + +#ifdef TIMING + auto t0 = Rtl::timeBegin(); +#endif /* TIMING */ + for (auto& cell : cells) { + cell_ = this->cellFetch(cell, false); + if ((cell_.p.x >= this->canvas.size.w) || (cell_.p.y >= this->canvas.size.h)) + continue; + else if (isCursor) { + cell_canvas = this->cellFetch(cell, true); cell_.attrs = cell_canvas.attrs; + if (COLOUR_ALPHA(cell_.bg) != 0xff) { +// cell_.fg = this->blendColours(cell_canvas.fg, cell_.bg, BLEND_ALPHA_COEFFICIENT); +// cell_.bg = this->blendColours(cell_canvas.bg, cell_.bg, BLEND_ALPHA_COEFFICIENT); + if ((cell_canvas.txt[0] == L' ') && (COLOUR_ALPHA(cell_canvas.bg) == 0xff)) + cell_.txt[0] = L'\u2591', cell_.txt[1] = L'\0'; + else + memcpy(cell_.txt, cell_canvas.txt, sizeof(cell_.txt)); + } else if (COLOUR_ALPHA(cell_canvas.bg) == 0xff) { + cell_.fg = cell_canvas.fg, cell_.bg = cell_canvas.bg; + if (cell_canvas.txt[0] == L' ') + cell_.txt[0] = L'\u2591', cell_.txt[1] = L'\0'; + else + memcpy(cell_.txt, cell_canvas.txt, sizeof(cell_.txt)); + } else { + cell_.fg = cell_canvas.fg, cell_.bg = cell_canvas.bg; + memcpy(cell_.txt, cell_canvas.txt, sizeof(cell_.txt)); + } + } else if ((cell_.txt[0] == L' ') && (COLOUR_ALPHA(cell_.bg) == 0xff)) + cell_.bg = 0x00000000, cell_.txt[0] = L'\u2591', cell_.txt[1] = L'\0'; +#if 0 + if ((cell_.txt[0] != L' ') && (cell_.txt[0] != L'_')) + this->cellDrawText(cell_, rectEither); + else + this->cellDraw(cell_, rectEither); + if (cell.attrs & Canvas::CATTR_UNDERLINE) + this->cellDrawLine(cell_, rectEither); +#endif + } + if (rc) + rc.right.p0 = rectEither.p0.right, rc.right.p1 = rectEither.p1; + return rc; +} + +bool +CanvasWidget::focusNextPrevChild( + bool next +) +{ + (void)next; + return false; +} + +bool +CanvasWidget::import( + Rtl::STATUS& pstatus, + const std::wstring& data, + Canvas::DATA_TYPE type +) +{ + if (this->canvas.import(pstatus, data, type)) { + this->imageSize = QSize(this->canvas.size.w * this->cellSize.w, this->canvas.size.h * this->cellSize.h); + this->image = QImage(this->imageSize.width(), this->imageSize.height(), QImage::Format_RGB32); + this->resize(this->imageSize); + for (auto row : this->canvas.cells) + this->renderCells(false, row); + this->update(); + } + return (bool)pstatus; +} + +bool +CanvasWidget::import( + Rtl::STATUS& pstatus, + Canvas::CELL_MAP& cells, + Canvas::SIZE size +) +{ + if (this->canvas.import(pstatus, cells, size)) { + this->imageSize = QSize(this->canvas.size.w * this->cellSize.w, this->canvas.size.h * this->cellSize.h); + this->image = QImage(this->imageSize.width(), this->imageSize.height(), QImage::Format_RGB32); + this->resize(this->imageSize); + for (auto row : this->canvas.cells) + this->renderCells(false, row); + this->update(); + } + return (bool)pstatus; +} + +void +CanvasWidget::keyPressEvent( + QKeyEvent * event +) +{ + if (this->eventDispatcher) + this->eventDispatcher(event, nullptr, nullptr, CanvasWidget::ETYPE_KEYBOARD_PRESS); +} + +void +CanvasWidget::keyReleaseEvent( + QKeyEvent * event +) +{ + if (this->eventDispatcher) + this->eventDispatcher(event, nullptr, nullptr, CanvasWidget::ETYPE_KEYBOARD_RELEASE); +} + +QSize +CanvasWidget::minimumSizeHint( +) const +{ + return this->imageSize; +} + +void +CanvasWidget::mouseMoveEvent( + QMouseEvent * event +) +{ + if (this->eventDispatcher) + this->eventDispatcher(nullptr, event, nullptr, CanvasWidget::ETYPE_MOUSE_MOVE); +} + +void +CanvasWidget::mousePressEvent( + QMouseEvent * event +) +{ + if (this->eventDispatcher) + this->eventDispatcher(nullptr, event, nullptr, CanvasWidget::ETYPE_MOUSE_PRESS); +} + +void +CanvasWidget::mouseReleaseEvent( + QMouseEvent * event +) +{ + if (this->eventDispatcher) + this->eventDispatcher(nullptr, event, nullptr, CanvasWidget::ETYPE_MOUSE_RELEASE); +} + +void +CanvasWidget::setEventDispatcher( + EVENT_DISPATCHER eventDispatcher +) +{ + this->eventDispatcher = eventDispatcher; +} + +QSize +CanvasWidget::sizeHint( +) const +{ + return this->imageSize; +} + +void +CanvasWidget::wheelEvent( + QWheelEvent * event +) +{ + if (this->eventDispatcher) + this->eventDispatcher(nullptr, nullptr, event, CanvasWidget::ETYPE_MOUSE_WHEEL); +} + +/* + * Private class methods + */ + +Canvas::CELL +CanvasWidget::cellFetch( + const Canvas::CELL& cell, + bool fromCanvas +) +{ + Canvas::CELL cell_; + const Canvas::COLOUR_LIST * pcolours; + + if (!fromCanvas) + cell_ = Canvas::CELL(cell); + else + cell_ = this->canvas.cells[cell.p.y][cell.p.x]; + if (cell_.attrs & Canvas::CATTR_BOLD) + pcolours = &s_colours_bold; + else + pcolours = &s_colours; + if ((cell_.txt[0] == L'_') && (cell_.txt[1] == L'\0')) + cell_.attrs = (Canvas::CELL_ATTRS)(cell_.attrs | Canvas::CATTR_UNDERLINE); + cell_.bg = (cell_.bg == -1) ? 0xff000000 : (Canvas::COLOUR)(((s_colours[(uint8_t)cell_.bg][0] & 0xff) << 16) | ((s_colours[(uint8_t)cell_.bg][1] & 0xff) << 8) | ((s_colours[(uint8_t)cell_.bg][2] & 0xff))); + cell_.fg = (cell_.fg == -1) ? cell_.bg : (Canvas::COLOUR)((((*pcolours)[(uint8_t)cell_.fg][0] & 0xff) << 16) | (((*pcolours)[(uint8_t)cell_.fg][1] & 0xff) << 8) | (((*pcolours)[(uint8_t)cell_.fg][2] & 0xff))); + return cell_; +} + +/* + * Protected class methods + */ + +#if 0 +static const char *vertexShaderSource = + "attribute highp vec4 posAttr;\n" + "attribute lowp vec4 colAttr;\n" + "varying lowp vec4 col;\n" + "uniform highp mat4 matrix;\n" + "void main() {\n" + " col = colAttr;\n" + " gl_Position = matrix * posAttr;\n" + "}\n"; + +static const char *fragmentShaderSource = + "varying lowp vec4 col;\n" + "void main() {\n" + " gl_FragColor = col;\n" + "}\n"; +#endif + +void +CanvasWidget::initializeGL( +) +{ + this->initializeOpenGLFunctions(); +#if 0 + glClearColor(0, 0, 0, m_transparent ? 0 : 1); + + m_program = new QOpenGLShaderProgram; + m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, m_core ? vertexShaderSourceCore : vertexShaderSource); + m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, m_core ? fragmentShaderSourceCore : fragmentShaderSource); + m_program->bindAttributeLocation("vertex", 0); + m_program->bindAttributeLocation("normal", 1); + m_program->link(); + + m_program->bind(); + m_projMatrixLoc = m_program->uniformLocation("projMatrix"); + m_mvMatrixLoc = m_program->uniformLocation("mvMatrix"); + m_normalMatrixLoc = m_program->uniformLocation("normalMatrix"); + m_lightPosLoc = m_program->uniformLocation("lightPos"); + + // Create a vertex array object. In OpenGL ES 2.0 and OpenGL 2.x + // implementations this is optional and support may not be present + // at all. Nonetheless the below code works in all cases and makes + // sure there is a VAO when one is needed. + m_vao.create(); + QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao); + + // Setup our vertex buffer object. + m_logoVbo.create(); + m_logoVbo.bind(); + m_logoVbo.allocate(m_logo.constData(), m_logo.count() * sizeof(GLfloat)); + + // Store the vertex attribute bindings for the program. + setupVertexAttribs(); + + // Our camera never changes in this example. + m_camera.setToIdentity(); + m_camera.translate(0, 0, -1); + + // Light position is fixed. + m_program->setUniformValue(m_lightPosLoc, QVector3D(0, 0, 70)); + + m_program->release(); +#endif +} \ No newline at end of file diff --git a/libgui/CanvasWidget.hpp b/libgui/CanvasWidget.hpp new file mode 100644 index 0000000..dd6c1e9 --- /dev/null +++ b/libgui/CanvasWidget.hpp @@ -0,0 +1,95 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _CANVAS_WIDGET_HPP_ +#define _CANVAS_WIDGET_HPP_ + +#include + +#include +#include +#include + +#include +#include + +#include "../librtl/rtldef.hpp" +#include "../libcanvas/Canvas.hpp" + +/* + * Public types + */ + +class CanvasWidget : public QOpenGLWidget, protected QOpenGLFunctions { + Q_OBJECT + +public: + typedef std::vector> + CHAR_MAP_ITEM; + typedef std::map + CHAR_MAP; + typedef enum event_type_e { + ETYPE_NONE = 0, + ETYPE_KEYBOARD_PRESS = 1, + ETYPE_KEYBOARD_RELEASE = 2, + ETYPE_MOUSE_MOVE = 3, + ETYPE_MOUSE_PRESS = 4, + ETYPE_MOUSE_RELEASE = 5, + ETYPE_MOUSE_WHEEL = 6, + } EVENT_TYPE; + typedef std::function + EVENT_DISPATCHER; + typedef struct rect_either_s { + Rtl::Either + p0; + Canvas::POINT p1; + } RECT_EITHER; + + CanvasWidget(QWidget *parent=nullptr, Canvas::SIZE cellSize={7, 13}, Canvas::SIZE sizeDefault={100, 35}); + bool focusNextPrevChild(bool next); + bool import(Rtl::STATUS& pstatus, const std::wstring& data, Canvas::DATA_TYPE type); + bool import(Rtl::STATUS& pstatus, Canvas::CELL_MAP& cells, Canvas::SIZE size); + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *event); + QSize minimumSizeHint() const override; + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + Rtl::Either renderCells(bool isCursor, const Canvas::CELL_LIST& cells); + void setEventDispatcher(EVENT_DISPATCHER eventDispacher); + QSize sizeHint() const override; + void wheelEvent(QWheelEvent *event); + + Canvas canvas; + Canvas::SIZE cellSize; + CHAR_MAP charMap; + EVENT_DISPATCHER eventDispatcher; + QFont font; + QImage image; + QSize imageSize; + QWidget * parent; + Canvas::SIZE sizeDefault; + +private: + Canvas::CELL cellFetch(const Canvas::CELL& cell, bool fromCanvas); + +protected: + void initializeGL(); +}; + +#endif /* _CANVAS_WIDGET_HPP_ */ diff --git a/libgui/Makefile b/libgui/Makefile new file mode 100644 index 0000000..35cc4fa --- /dev/null +++ b/libgui/Makefile @@ -0,0 +1,473 @@ +############################################################################# +# Makefile for building: roar +# Generated by qmake (3.1) (Qt 5.12.5) +# Project: roar.pro +# Template: app +# Command: C:\Qt\5.12.5\msvc2017_64\bin\qmake.exe -o Makefile roar.pro +############################################################################# + +MAKEFILE = Makefile + +EQ = = + +first: release +install: release-install +uninstall: release-uninstall +QMAKE = C:\Qt\5.12.5\msvc2017_64\bin\qmake.exe +DEL_FILE = del +CHK_DIR_EXISTS= if not exist +MKDIR = mkdir +COPY = copy /y +COPY_FILE = copy /y +COPY_DIR = xcopy /s /q /y /i +INSTALL_FILE = copy /y +INSTALL_PROGRAM = copy /y +INSTALL_DIR = xcopy /s /q /y /i +QINSTALL = C:\Qt\5.12.5\msvc2017_64\bin\qmake.exe -install qinstall +QINSTALL_PROGRAM = C:\Qt\5.12.5\msvc2017_64\bin\qmake.exe -install qinstall -exe +DEL_FILE = del +SYMLINK = $(QMAKE) -install ln -f -s +DEL_DIR = rmdir +MOVE = move +SUBTARGETS = \ + release \ + debug + + +release: $(MAKEFILE) FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release +release-make_first: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release +release-all: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release all +release-clean: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release clean +release-distclean: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release distclean +release-install: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release install +release-uninstall: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release uninstall +debug: $(MAKEFILE) FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug +debug-make_first: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug +debug-all: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug all +debug-clean: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug clean +debug-distclean: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug distclean +debug-install: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug install +debug-uninstall: FORCE + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug uninstall + +Makefile: roar.pro C:\Qt\5.12.5\msvc2017_64\mkspecs\win32-msvc\qmake.conf C:\Qt\5.12.5\msvc2017_64\mkspecs\features\spec_pre.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\common\angle.conf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\windows_vulkan_sdk.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\common\windows-vulkan.conf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\common\msvc-desktop.conf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\qconfig.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3danimation.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3danimation_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dcore.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dcore_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dextras.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dextras_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dinput.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dinput_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dlogic.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dlogic_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquick.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquick_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickanimation.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickanimation_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickextras.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickextras_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickinput.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickinput_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickrender.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickrender_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickscene2d.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickscene2d_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3drender.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3drender_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_accessibility_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axbase.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axbase_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axcontainer.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axcontainer_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axserver.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axserver_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_bluetooth.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_bluetooth_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_bootstrap_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_charts.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_charts_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_concurrent.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_concurrent_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_core.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_core_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_datavisualization.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_datavisualization_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_dbus.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_dbus_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_designer.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_designer_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_designercomponents_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_devicediscovery_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_edid_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_egl_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_eventdispatcher_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_fb_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_fontdatabase_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gamepad.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gamepad_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gui.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gui_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_help.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_help_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_location.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_location_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimedia.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimedia_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimediawidgets.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimediawidgets_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_network.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_network_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_nfc.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_nfc_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_opengl.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_opengl_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_openglextensions.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_openglextensions_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_packetprotocol_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_platformcompositor_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioning.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioning_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioningquick.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioningquick_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_printsupport.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_printsupport_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qml.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qml_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmldebug_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmldevtools_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmltest.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmltest_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qtmultimediaquicktools_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quick.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quick_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickcontrols2.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickcontrols2_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickparticles_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickshapes_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quicktemplates2.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quicktemplates2_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickwidgets.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickwidgets_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_remoteobjects.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_remoteobjects_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_repparser.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_repparser_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_scxml.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_scxml_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sensors.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sensors_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialbus.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialbus_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialport.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialport_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sql.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sql_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_svg.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_svg_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_testlib.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_testlib_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_texttospeech.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_texttospeech_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_theme_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_uiplugin.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_uitools.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_uitools_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_virtualkeyboard.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_virtualkeyboard_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_vulkan_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webchannel.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webchannel_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_websockets.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_websockets_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webview.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webview_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_widgets.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_widgets_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_windowsuiautomation_support_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_winextras.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_winextras_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xml.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xml_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xmlpatterns.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xmlpatterns_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_zlib_private.pri \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qt_functions.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qt_config.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\win32-msvc\qmake.conf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\spec_post.prf \ + .qmake.stash \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\exclusive_builds.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\common\msvc-version.conf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\toolchain.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\default_pre.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\default_pre.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\resolve_config.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\exclusive_builds_post.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\default_post.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\precompile_header.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\warn_on.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qt.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\resources.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\moc.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\opengl.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\uic.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qmake_use.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\file_copies.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\windows.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\testcase_targets.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\exceptions.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\yacc.prf \ + C:\Qt\5.12.5\msvc2017_64\mkspecs\features\lex.prf \ + roar.pro \ + C:\Qt\5.12.5\msvc2017_64\lib\Qt5Widgets.prl \ + C:\Qt\5.12.5\msvc2017_64\lib\Qt5Gui.prl \ + C:\Qt\5.12.5\msvc2017_64\lib\Qt5Core.prl \ + C:\Qt\5.12.5\msvc2017_64\lib\qtmain.prl + $(QMAKE) -o Makefile roar.pro +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\spec_pre.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\common\angle.conf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\windows_vulkan_sdk.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\common\windows-vulkan.conf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\common\msvc-desktop.conf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\qconfig.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3danimation.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3danimation_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dcore.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dcore_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dextras.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dextras_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dinput.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dinput_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dlogic.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dlogic_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquick.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquick_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickanimation.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickanimation_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickextras.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickextras_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickinput.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickinput_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickrender.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickrender_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickscene2d.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3dquickscene2d_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3drender.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_3drender_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_accessibility_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axbase.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axbase_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axcontainer.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axcontainer_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axserver.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_axserver_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_bluetooth.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_bluetooth_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_bootstrap_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_charts.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_charts_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_concurrent.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_concurrent_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_core.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_core_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_datavisualization.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_datavisualization_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_dbus.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_dbus_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_designer.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_designer_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_designercomponents_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_devicediscovery_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_edid_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_egl_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_eventdispatcher_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_fb_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_fontdatabase_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gamepad.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gamepad_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gui.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_gui_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_help.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_help_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_location.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_location_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimedia.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimedia_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimediawidgets.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_multimediawidgets_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_network.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_network_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_nfc.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_nfc_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_opengl.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_opengl_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_openglextensions.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_openglextensions_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_packetprotocol_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_platformcompositor_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioning.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioning_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioningquick.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_positioningquick_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_printsupport.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_printsupport_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qml.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qml_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmldebug_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmldevtools_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmltest.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qmltest_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_qtmultimediaquicktools_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quick.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quick_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickcontrols2.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickcontrols2_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickparticles_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickshapes_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quicktemplates2.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quicktemplates2_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickwidgets.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_quickwidgets_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_remoteobjects.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_remoteobjects_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_repparser.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_repparser_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_scxml.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_scxml_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sensors.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sensors_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialbus.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialbus_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialport.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_serialport_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sql.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_sql_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_svg.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_svg_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_testlib.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_testlib_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_texttospeech.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_texttospeech_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_theme_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_uiplugin.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_uitools.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_uitools_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_virtualkeyboard.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_virtualkeyboard_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_vulkan_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webchannel.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webchannel_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_websockets.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_websockets_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webview.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_webview_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_widgets.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_widgets_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_windowsuiautomation_support_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_winextras.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_winextras_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xml.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xml_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xmlpatterns.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_xmlpatterns_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\modules\qt_lib_zlib_private.pri: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qt_functions.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qt_config.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\win32-msvc\qmake.conf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\spec_post.prf: +.qmake.stash: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\exclusive_builds.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\common\msvc-version.conf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\toolchain.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\default_pre.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\default_pre.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\resolve_config.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\exclusive_builds_post.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\default_post.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\precompile_header.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\warn_on.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qt.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\resources.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\moc.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\opengl.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\uic.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\qmake_use.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\file_copies.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\win32\windows.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\testcase_targets.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\exceptions.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\yacc.prf: +C:\Qt\5.12.5\msvc2017_64\mkspecs\features\lex.prf: +roar.pro: +C:\Qt\5.12.5\msvc2017_64\lib\Qt5Widgets.prl: +C:\Qt\5.12.5\msvc2017_64\lib\Qt5Gui.prl: +C:\Qt\5.12.5\msvc2017_64\lib\Qt5Core.prl: +C:\Qt\5.12.5\msvc2017_64\lib\qtmain.prl: +qmake: FORCE + @$(QMAKE) -o Makefile roar.pro + +qmake_all: FORCE + +make_first: release-make_first debug-make_first FORCE +all: release-all debug-all FORCE +clean: release-clean debug-clean FORCE +distclean: release-distclean debug-distclean FORCE + -$(DEL_FILE) Makefile + -$(DEL_FILE) .qmake.stash + +release-mocclean: + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release mocclean +debug-mocclean: + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug mocclean +mocclean: release-mocclean debug-mocclean + +release-mocables: + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Release mocables +debug-mocables: + @set MAKEFLAGS=$(MAKEFLAGS) + $(MAKE) -f $(MAKEFILE).Debug mocables +mocables: release-mocables debug-mocables + +check: first + +benchmark: first +FORCE: + +$(MAKEFILE).Release: Makefile +$(MAKEFILE).Debug: Makefile diff --git a/libgui/assets b/libgui/assets new file mode 120000 index 0000000..ec2e4be --- /dev/null +++ b/libgui/assets @@ -0,0 +1 @@ +../assets \ No newline at end of file diff --git a/libgui/debug/.git_empty b/libgui/debug/.git_empty new file mode 100644 index 0000000..e69de29 diff --git a/libgui/libcanvas b/libgui/libcanvas new file mode 120000 index 0000000..2fbb225 --- /dev/null +++ b/libgui/libcanvas @@ -0,0 +1 @@ +../libcanvas \ No newline at end of file diff --git a/libgui/libgui b/libgui/libgui new file mode 120000 index 0000000..55f3399 --- /dev/null +++ b/libgui/libgui @@ -0,0 +1 @@ +../libgui \ No newline at end of file diff --git a/libgui/librtl b/libgui/librtl new file mode 120000 index 0000000..54ca7f0 --- /dev/null +++ b/libgui/librtl @@ -0,0 +1 @@ +../librtl \ No newline at end of file diff --git a/libgui/libtools b/libgui/libtools new file mode 120000 index 0000000..ea9efeb --- /dev/null +++ b/libgui/libtools @@ -0,0 +1 @@ +../libtools \ No newline at end of file diff --git a/libgui/release/.git_empty b/libgui/release/.git_empty new file mode 100644 index 0000000..e69de29 diff --git a/libgui/roar.cpp b/libgui/roar.cpp new file mode 100644 index 0000000..d6c8b67 --- /dev/null +++ b/libgui/roar.cpp @@ -0,0 +1,93 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +#if defined(DEBUG) && defined(_WIN32) +#include +#endif /* defined(DEBUG) && defined(_WIN32) */ + +#include +#include + +#include "../librtl/rtldef.hpp" +#include "CanvasEditorWindow.hpp" + +/* + * Private subroutine prototypes + */ + +static void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg); + +/* + * Private subroutines + */ + +static void +messageOutput( + QtMsgType type, + const QMessageLogContext & context, + const QString & msg +) +{ + QByteArray localMsg = msg.toLocal8Bit(); + + switch (type) { + case QtCriticalMsg: + fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; + case QtDebugMsg: + fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; + case QtFatalMsg: + fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); abort(); + case QtInfoMsg: + fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; + case QtWarningMsg: + fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; + } +} + +/* + * Entry point + */ + +int +main( + int argc, + char ** argv +) +{ +#if defined(DEBUG) && defined(_WIN32) + if (AllocConsole()) { + AttachConsole(GetCurrentProcessId()); + (void)freopen("CON", "w", stderr); + (void)freopen("CON", "r", stdin); + (void)freopen("CON", "w", stdout); + } else + abort(); +#endif /* defined(DEBUG) && defined(_WIN32) */ + QApplication app(argc, argv); + CanvasEditorWindow canvasEditorWindow; + + srand(time(NULL)); + qInstallMessageHandler(messageOutput); + canvasEditorWindow.show(); + return app.exec(); +} diff --git a/libgui/roar.pro b/libgui/roar.pro new file mode 100644 index 0000000..de9ed1c --- /dev/null +++ b/libgui/roar.pro @@ -0,0 +1,23 @@ +debug { + DEFINES += DEBUG +} +FORMS = roar.ui roar_about.ui +HEADERS = CanvasWidget.hpp CanvasEditorWindow.hpp \ + ../libcanvas/Canvas.hpp \ + ../librtl/rtldef.hpp \ + ../libtools/ToolCircle.hpp ../libtools/ToolCursor.hpp ../libtools/ToolErase.hpp \ + ../libtools/ToolFill.hpp ../libtools/ToolLine.hpp ../libtools/ToolObject.hpp \ + ../libtools/ToolPickColour.hpp ../libtools/ToolRect.hpp ../libtools/ToolText.hpp +linux { + QMAKE_CXXFLAGS += -std=c++14 +} +win32 { + QMAKE_CXXFLAGS += /FC /MP /std:c++17 +} +QT += widgets +SOURCES = roar.cpp CanvasWidget.cpp CanvasEditorWindow.cpp \ + ../libcanvas/Canvas.cpp ../libcanvas/subr_export.cpp ../libcanvas/subr_import.cpp \ + ../librtl/subr_rtl.cpp \ + ../libtools/ToolCircle.cpp ../libtools/ToolCursor.cpp ../libtools/ToolErase.cpp \ + ../libtools/ToolFill.cpp ../libtools/ToolLine.cpp ../libtools/ToolObject.cpp \ + ../libtools/ToolPickColour.cpp ../libtools/ToolRect.cpp ../libtools/ToolText.cpp diff --git a/libgui/roar.ui b/libgui/roar.ui new file mode 100644 index 0000000..7fa72d7 --- /dev/null +++ b/libgui/roar.ui @@ -0,0 +1,1485 @@ + + + canvas + + + + 0 + 0 + 840 + 640 + + + + roar + + + + + + 0 + 0 + 771 + 531 + + + + + + + + + 0 + 0 + 840 + 21 + + + + + &File + + + + &Export... + + + + + + + + + + &Import... + + + + + + + + false + + + Open &Recent + + + + + + false + + + Res&tore Snapshot + + + + + + + + + + + + + + + + + + &Edit + + + + Brush size + + + + + + + + + + + + Canvas size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + &Tools + + + + + + + + + + + + + + &Operators + + + + + + + + + + &Help + + + + + + + + + + + + + + + + + + Commands + + + RightToolBarArea + + + false + + + + + + + + + + + + + + + + + + + Tools + + + RightToolBarArea + + + true + + + + + + + + + + + + + + Colours + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background colours + + + TopToolBarArea + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + assets/images/document-new.svgassets/images/document-new.svg + + + &New + + + Ctrl+N + + + + + + assets/images/document-open-data.svgassets/images/document-open-data.svg + + + &Open + + + Ctrl+O + + + + + + assets/images/document-save.svgassets/images/document-save.svg + + + &Save + + + Ctrl+S + + + + + + assets/images/document-save-as.svgassets/images/document-save-as.svg + + + Save &As... + + + + + E&xit + + + Ctrl+X + + + + + false + + + + assets/images/edit-undo.svgassets/images/edit-undo.svg + + + &Undo + + + Ctrl+Z + + + + + false + + + + assets/images/edit-redo.svgassets/images/edit-redo.svg + + + &Redo + + + Ctrl+Y + + + + + false + + + + assets/images/edit-cut.svgassets/images/edit-cut.svg + + + Cu&t + + + + + false + + + + assets/images/edit-copy.svgassets/images/edit-copy.svg + + + &Copy + + + + + false + + + + assets/images/edit-paste.svgassets/images/edit-paste.svg + + + &Paste + + + + + false + + + + assets/images/edit-delete.svgassets/images/edit-delete.svg + + + De&lete + + + + + true + + + true + + + Solid brush + + + + + false + + + + assets/images/toolHideAssetsWindow.pngassets/images/toolHideAssetsWindow.png + + + Hide assets window + + + + + false + + + + assets/images/toolShowAssetsWindow.pngassets/images/toolShowAssetsWindow.png + + + Show assets window + + + + + true + + + + assets/images/toolCursor.pngassets/images/toolCursor.png + + + C&ursor + + + F2 + + + + + true + + + + assets/images/toolRect.pngassets/images/toolRect.png + + + &Rectangle + + + F3 + + + + + true + + + + assets/images/toolCircle.pngassets/images/toolCircle.png + + + &Circle + + + F4 + + + + + true + + + + assets/images/toolFill.pngassets/images/toolFill.png + + + &Fill + + + F5 + + + + + true + + + + assets/images/toolLine.pngassets/images/toolLine.png + + + &Line + + + F6 + + + + + true + + + + assets/images/toolText.pngassets/images/toolText.png + + + &Text + + + F7 + + + + + true + + + + assets/images/toolObject.pngassets/images/toolObject.png + + + &Object + + + F8 + + + + + true + + + + assets/images/toolErase.pngassets/images/toolErase.png + + + &Erase + + + F9 + + + + + true + + + + assets/images/toolPickColour.pngassets/images/toolPickColour.png + + + &Pick colour + + + F10 + + + + + true + + + true + + + &Flip + + + + + true + + + Flip &horizontally + + + + + true + + + &Invert colours + + + + + true + + + &Rotate + + + + + true + + + &Tile + + + + + View &melp? + + + F1 + + + + + Open &issue on GitHub + + + + + Visit &GitHub website + + + + + &About roar + + + + + true + + + + assets/images/colour00.pngassets/images/colour00.png + + + Colour #00 + + + Colour #00 + + + Ctrl+0 + + + + + true + + + + assets/images/colour01.pngassets/images/colour01.png + + + Colour #01 + + + Colour #01 + + + Ctrl+1 + + + + + true + + + + assets/images/colour02.pngassets/images/colour02.png + + + Colour #02 + + + Colour #02 + + + Ctrl+2 + + + + + true + + + + assets/images/colour03.pngassets/images/colour03.png + + + Colour #03 + + + Colour #03 + + + Ctrl+3 + + + + + true + + + + assets/images/colour04.pngassets/images/colour04.png + + + Colour #04 + + + Colour #04 + + + Ctrl+4 + + + + + true + + + + assets/images/colour05.pngassets/images/colour05.png + + + Colour #05 + + + Colour #05 + + + Ctrl+5 + + + + + true + + + + assets/images/colour06.pngassets/images/colour06.png + + + Colour #06 + + + Colour #06 + + + Ctrl+6 + + + + + true + + + + assets/images/colour07.pngassets/images/colour07.png + + + Colour #07 + + + Colour #07 + + + Ctrl+7 + + + + + true + + + + assets/images/colour08.pngassets/images/colour08.png + + + Colour #08 + + + Colour #08 + + + Ctrl+8 + + + + + true + + + + assets/images/colour09.pngassets/images/colour09.png + + + Colour #09 + + + Colour #09 + + + Ctrl+9 + + + + + true + + + + assets/images/colour10.pngassets/images/colour10.png + + + Colour #10 + + + Colour #10 + + + Ctrl+Shift+0 + + + + + true + + + + assets/images/colour11.pngassets/images/colour11.png + + + Colour #11 + + + Colour #11 + + + Ctrl+Shift+1 + + + + + true + + + + assets/images/colour12.pngassets/images/colour12.png + + + Colour #12 + + + Colour #12 + + + Ctrl+Shift+2 + + + + + true + + + + assets/images/colour13.pngassets/images/colour13.png + + + Colour #13 + + + Colour #13 + + + Ctrl+Shift+3 + + + + + true + + + + assets/images/colour14.pngassets/images/colour14.png + + + Colour #14 + + + Colour #14 + + + Ctrl+Shift+4 + + + + + true + + + + assets/images/colour15.pngassets/images/colour15.png + + + Colour #15 + + + Colour #15 + + + Ctrl+Shift+5 + + + + + true + + + + assets/images/colour_transparent.pngassets/images/colour_transparent.png + + + Transparent colour + + + Transparent colour + + + Ctrl+Shift+6 + + + + + true + + + + assets/images/colourBg00.pngassets/images/colourBg00.png + + + Background colour #00 + + + Background colour #00 + + + Ctrl+Alt+0 + + + + + true + + + + assets/images/colourBg01.pngassets/images/colourBg01.png + + + Background colour #01 + + + Background colour #01 + + + Ctrl+Alt+1 + + + + + true + + + + assets/images/colourBg02.pngassets/images/colourBg02.png + + + Background colour #02 + + + Background colour #02 + + + Ctrl+Alt+2 + + + + + true + + + + assets/images/colourBg03.pngassets/images/colourBg03.png + + + Background colour #03 + + + Background colour #03 + + + Ctrl+Alt+3 + + + + + true + + + + assets/images/colourBg04.pngassets/images/colourBg04.png + + + Background colour #04 + + + Background colour #04 + + + Ctrl+Alt+4 + + + + + true + + + + assets/images/colourBg05.pngassets/images/colourBg05.png + + + Background colour #05 + + + Background colour #05 + + + Ctrl+Alt+5 + + + + + true + + + + assets/images/colourBg06.pngassets/images/colourBg06.png + + + Background colour #06 + + + Background colour #06 + + + Ctrl+Alt+6 + + + + + true + + + + assets/images/colourBg07.pngassets/images/colourBg07.png + + + Background colour #07 + + + Background colour #07 + + + Ctrl+Alt+7 + + + + + true + + + + assets/images/colourBg08.pngassets/images/colourBg08.png + + + Background colour #08 + + + Background colour #08 + + + Ctrl+Alt+8 + + + + + true + + + + assets/images/colourBg09.pngassets/images/colourBg09.png + + + Background colour #09 + + + Background colour #09 + + + Ctrl+Alt+9 + + + + + true + + + + assets/images/colourBg10.pngassets/images/colourBg10.png + + + Background colour #10 + + + Background colour #10 + + + Ctrl+Alt+Shift+0 + + + + + true + + + + assets/images/colourBg11.pngassets/images/colourBg11.png + + + Background colour #11 + + + Background colour #11 + + + Ctrl+Alt+Shift+1 + + + + + true + + + + assets/images/colourBg12.pngassets/images/colourBg12.png + + + Background colour #12 + + + Background colour #12 + + + Ctrl+Alt+Shift+2 + + + + + true + + + + assets/images/colourBg13.pngassets/images/colourBg13.png + + + Background colour #13 + + + Background colour #13 + + + Ctrl+Alt+Shift+3 + + + + + true + + + + assets/images/colourBg14.pngassets/images/colourBg14.png + + + Background colour #14 + + + Background colour #14 + + + Ctrl+Alt+Shift+4 + + + + + true + + + + assets/images/colourBg15.pngassets/images/colourBg15.png + + + Background colour #15 + + + Background colour #15 + + + Ctrl+Alt+Shift+5 + + + + + true + + + + assets/images/colourBg_transparent.pngassets/images/colourBg_transparent.png + + + Transparent background colour + + + Transparent background colour + + + Ctrl+Alt+Shift+6 + + + + + + assets/images/toolIncrBrushW.pngassets/images/toolIncrBrushW.png + + + Increase brush width + + + + + + assets/images/toolDecrBrushW.pngassets/images/toolDecrBrushW.png + + + Decrease brush width + + + + + + assets/images/toolIncrBrushH.pngassets/images/toolIncrBrushH.png + + + Increase brush height + + + + + + assets/images/toolDecrBrushH.pngassets/images/toolDecrBrushH.png + + + Decrease brush height + + + + + + assets/images/toolIncrBrushHW.pngassets/images/toolIncrBrushHW.png + + + Increase brush size + + + Ctrl++ + + + + + + assets/images/toolDecrBrushHW.pngassets/images/toolDecrBrushHW.png + + + Decrease brush size + + + Ctrl+- + + + + + + assets/images/toolIncrCanvasW.pngassets/images/toolIncrCanvasW.png + + + Increase canvas width + + + Ctrl+Right + + + + + + assets/images/toolDecrCanvasW.pngassets/images/toolDecrCanvasW.png + + + Decrease canvas width + + + Ctrl+Left + + + + + + assets/images/toolIncrCanvasH.pngassets/images/toolIncrCanvasH.png + + + Increase canvas height + + + Ctrl+Down + + + + + + assets/images/toolDecrCanvasH.pngassets/images/toolDecrCanvasH.png + + + Decrease canvas height + + + Ctrl+Up + + + + + + assets/images/toolIncrCanvasHW.pngassets/images/toolIncrCanvasHW.png + + + Increase canvas size + + + + + + assets/images/toolDecrCanvasHW.pngassets/images/toolDecrCanvasHW.png + + + Decrease canvas size + + + + + Decrease cell size + + + Decrease cell size + + + + + Increase cell size + + + Increase cell size + + + + + Export as &ANSI... + + + + + Export to &clipboard + + + + + Export to I&mgur... + + + + + Export to Pasteb&in... + + + + + Export as PN&G... + + + + + Import &ANSI... + + + + + Import from &clipboard + + + + + Import &SAUCE... + + + + + + assets/images/toolColoursFlip.pngassets/images/toolColoursFlip.png + + + Flip colours + + + Flip colours + + + Ctrl+I + + + + + &Clear list + + + + + Restore from &file + + + + + + diff --git a/libgui/roar_about.ui b/libgui/roar_about.ui new file mode 100644 index 0000000..3172de1 --- /dev/null +++ b/libgui/roar_about.ui @@ -0,0 +1,128 @@ + + + Dialog + + + Qt::ApplicationModal + + + + 0 + 0 + 546 + 141 + + + + Qt::DefaultContextMenu + + + About roar + + + color: rgb(0, 187, 0); +background-color: rgb(0, 0, 0); + + + true + + + + + 10 + 600 + 461 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 250 + 100 + 160 + 32 + + + + color: rgb(0, 0, 0); +background-color: rgb(233, 233, 233); + + + roar! + + + + + + 140 + 10 + 401 + 71 + + + + roar -- mIRC art editor for Windows & Linux +__ROAR_RELEASE_VERSION__ +https://www.github.com/lalbornoz/roar/ +Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de> +https://www.lucioillanes.de + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + 10 + 10 + 121 + 121 + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/libgui/ui_roar.h b/libgui/ui_roar.h new file mode 100644 index 0000000..408f559 --- /dev/null +++ b/libgui/ui_roar.h @@ -0,0 +1,1203 @@ +/******************************************************************************** +** Form generated from reading UI file 'roar.ui' +** +** Created by: Qt User Interface Compiler version 5.12.5 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_ROAR_H +#define UI_ROAR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_canvas +{ +public: + QAction *actionNew; + QAction *actionOpen; + QAction *actionSave; + QAction *actionSaveAs; + QAction *actionExit; + QAction *actionUndo; + QAction *actionRedo; + QAction *actionCut; + QAction *actionCopy; + QAction *actionPaste; + QAction *actionDelete; + QAction *actionSolidBrush; + QAction *actionHideAssetsWindow; + QAction *actionShowAssetsWindow; + QAction *actionCursor; + QAction *actionRectangle; + QAction *actionCircle; + QAction *actionFill; + QAction *actionLine; + QAction *actionText; + QAction *actionObject; + QAction *actionErase; + QAction *actionPickColour; + QAction *actionFlip; + QAction *actionFlipHorizontally; + QAction *actionInvertColours; + QAction *actionRotate; + QAction *actionTile; + QAction *actionViewMelp; + QAction *actionOpenIssueOnGitHub; + QAction *actionVisitGitHubWebsite; + QAction *actionAboutRoar; + QAction *actionColour00; + QAction *actionColour01; + QAction *actionColour02; + QAction *actionColour03; + QAction *actionColour04; + QAction *actionColour05; + QAction *actionColour06; + QAction *actionColour07; + QAction *actionColour08; + QAction *actionColour09; + QAction *actionColour10; + QAction *actionColour11; + QAction *actionColour12; + QAction *actionColour13; + QAction *actionColour14; + QAction *actionColour15; + QAction *actionColourTransparent; + QAction *actionColourBg00; + QAction *actionColourBg01; + QAction *actionColourBg02; + QAction *actionColourBg03; + QAction *actionColourBg04; + QAction *actionColourBg05; + QAction *actionColourBg06; + QAction *actionColourBg07; + QAction *actionColourBg08; + QAction *actionColourBg09; + QAction *actionColourBg10; + QAction *actionColourBg11; + QAction *actionColourBg12; + QAction *actionColourBg13; + QAction *actionColourBg14; + QAction *actionColourBg15; + QAction *actionColourBgTransparent; + QAction *actionIncreaseBrushWidth; + QAction *actionDecreaseBrushWidth; + QAction *actionIncreaseBrushHeight; + QAction *actionDecreaseBrushHeight; + QAction *actionIncreaseBrushSize; + QAction *actionDecreaseBrushSize; + QAction *actionIncreaseCanvasWidth; + QAction *actionDecreaseCanvasWidth; + QAction *actionIncreaseCanvasHeight; + QAction *actionDecreaseCanvasHeight; + QAction *actionIncreaseCanvasSize; + QAction *actionDecreaseCanvasSize; + QAction *actionDecreaseCellSize; + QAction *actionIncreaseCellSize; + QAction *actionExportAsANSI; + QAction *actionExportToClipboard; + QAction *actionExportToImgur; + QAction *actionExportToPastebin; + QAction *actionExportAsPNG; + QAction *actionImportANSI; + QAction *actionImportFromClipboard; + QAction *actionImportSAUCE; + QAction *actionFlipColours; + QAction *action_Clear_list; + QAction *actionRestore_from_file; + QWidget *centralwidget; + QWidget *verticalLayoutWidget; + QVBoxLayout *verticalLayout; + QMenuBar *menubar; + QMenu *menuFile; + QMenu *menu_Export; + QMenu *menu_Import; + QMenu *menuOpen_Recent; + QMenu *menuRes_tore_Snapshot; + QMenu *menuEdit; + QMenu *menuBrush_size; + QMenu *menuCanvas_size; + QMenu *menuTools; + QMenu *menuOperators; + QMenu *menuHelp; + QStatusBar *statusbar; + QToolBar *toolBarCommands; + QToolBar *toolBarTools; + QToolBar *toolBarColours; + QToolBar *toolBarColoursBackground; + + void setupUi(QMainWindow *canvas) + { + if (canvas->objectName().isEmpty()) + canvas->setObjectName(QString::fromUtf8("canvas")); + canvas->resize(840, 640); + actionNew = new QAction(canvas); + actionNew->setObjectName(QString::fromUtf8("actionNew")); + QIcon icon; + icon.addFile(QString::fromUtf8("assets/images/document-new.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionNew->setIcon(icon); + actionOpen = new QAction(canvas); + actionOpen->setObjectName(QString::fromUtf8("actionOpen")); + QIcon icon1; + icon1.addFile(QString::fromUtf8("assets/images/document-open-data.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionOpen->setIcon(icon1); + actionSave = new QAction(canvas); + actionSave->setObjectName(QString::fromUtf8("actionSave")); + QIcon icon2; + icon2.addFile(QString::fromUtf8("assets/images/document-save.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionSave->setIcon(icon2); + actionSaveAs = new QAction(canvas); + actionSaveAs->setObjectName(QString::fromUtf8("actionSaveAs")); + QIcon icon3; + icon3.addFile(QString::fromUtf8("assets/images/document-save-as.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionSaveAs->setIcon(icon3); + actionExit = new QAction(canvas); + actionExit->setObjectName(QString::fromUtf8("actionExit")); + actionUndo = new QAction(canvas); + actionUndo->setObjectName(QString::fromUtf8("actionUndo")); + actionUndo->setEnabled(false); + QIcon icon4; + icon4.addFile(QString::fromUtf8("assets/images/edit-undo.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionUndo->setIcon(icon4); + actionRedo = new QAction(canvas); + actionRedo->setObjectName(QString::fromUtf8("actionRedo")); + actionRedo->setEnabled(false); + QIcon icon5; + icon5.addFile(QString::fromUtf8("assets/images/edit-redo.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionRedo->setIcon(icon5); + actionCut = new QAction(canvas); + actionCut->setObjectName(QString::fromUtf8("actionCut")); + actionCut->setEnabled(false); + QIcon icon6; + icon6.addFile(QString::fromUtf8("assets/images/edit-cut.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionCut->setIcon(icon6); + actionCopy = new QAction(canvas); + actionCopy->setObjectName(QString::fromUtf8("actionCopy")); + actionCopy->setEnabled(false); + QIcon icon7; + icon7.addFile(QString::fromUtf8("assets/images/edit-copy.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionCopy->setIcon(icon7); + actionPaste = new QAction(canvas); + actionPaste->setObjectName(QString::fromUtf8("actionPaste")); + actionPaste->setEnabled(false); + QIcon icon8; + icon8.addFile(QString::fromUtf8("assets/images/edit-paste.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionPaste->setIcon(icon8); + actionDelete = new QAction(canvas); + actionDelete->setObjectName(QString::fromUtf8("actionDelete")); + actionDelete->setEnabled(false); + QIcon icon9; + icon9.addFile(QString::fromUtf8("assets/images/edit-delete.svg"), QSize(), QIcon::Normal, QIcon::Off); + actionDelete->setIcon(icon9); + actionSolidBrush = new QAction(canvas); + actionSolidBrush->setObjectName(QString::fromUtf8("actionSolidBrush")); + actionSolidBrush->setCheckable(true); + actionSolidBrush->setChecked(true); + actionHideAssetsWindow = new QAction(canvas); + actionHideAssetsWindow->setObjectName(QString::fromUtf8("actionHideAssetsWindow")); + actionHideAssetsWindow->setEnabled(false); + QIcon icon10; + icon10.addFile(QString::fromUtf8("assets/images/toolHideAssetsWindow.png"), QSize(), QIcon::Normal, QIcon::Off); + actionHideAssetsWindow->setIcon(icon10); + actionShowAssetsWindow = new QAction(canvas); + actionShowAssetsWindow->setObjectName(QString::fromUtf8("actionShowAssetsWindow")); + actionShowAssetsWindow->setEnabled(false); + QIcon icon11; + icon11.addFile(QString::fromUtf8("assets/images/toolShowAssetsWindow.png"), QSize(), QIcon::Normal, QIcon::Off); + actionShowAssetsWindow->setIcon(icon11); + actionCursor = new QAction(canvas); + actionCursor->setObjectName(QString::fromUtf8("actionCursor")); + actionCursor->setCheckable(true); + QIcon icon12; + icon12.addFile(QString::fromUtf8("assets/images/toolCursor.png"), QSize(), QIcon::Normal, QIcon::Off); + actionCursor->setIcon(icon12); + actionRectangle = new QAction(canvas); + actionRectangle->setObjectName(QString::fromUtf8("actionRectangle")); + actionRectangle->setCheckable(true); + QIcon icon13; + icon13.addFile(QString::fromUtf8("assets/images/toolRect.png"), QSize(), QIcon::Normal, QIcon::Off); + actionRectangle->setIcon(icon13); + actionCircle = new QAction(canvas); + actionCircle->setObjectName(QString::fromUtf8("actionCircle")); + actionCircle->setCheckable(true); + QIcon icon14; + icon14.addFile(QString::fromUtf8("assets/images/toolCircle.png"), QSize(), QIcon::Normal, QIcon::Off); + actionCircle->setIcon(icon14); + actionFill = new QAction(canvas); + actionFill->setObjectName(QString::fromUtf8("actionFill")); + actionFill->setCheckable(true); + QIcon icon15; + icon15.addFile(QString::fromUtf8("assets/images/toolFill.png"), QSize(), QIcon::Normal, QIcon::Off); + actionFill->setIcon(icon15); + actionLine = new QAction(canvas); + actionLine->setObjectName(QString::fromUtf8("actionLine")); + actionLine->setCheckable(true); + QIcon icon16; + icon16.addFile(QString::fromUtf8("assets/images/toolLine.png"), QSize(), QIcon::Normal, QIcon::Off); + actionLine->setIcon(icon16); + actionText = new QAction(canvas); + actionText->setObjectName(QString::fromUtf8("actionText")); + actionText->setCheckable(true); + QIcon icon17; + icon17.addFile(QString::fromUtf8("assets/images/toolText.png"), QSize(), QIcon::Normal, QIcon::Off); + actionText->setIcon(icon17); + actionObject = new QAction(canvas); + actionObject->setObjectName(QString::fromUtf8("actionObject")); + actionObject->setCheckable(true); + QIcon icon18; + icon18.addFile(QString::fromUtf8("assets/images/toolObject.png"), QSize(), QIcon::Normal, QIcon::Off); + actionObject->setIcon(icon18); + actionErase = new QAction(canvas); + actionErase->setObjectName(QString::fromUtf8("actionErase")); + actionErase->setCheckable(true); + QIcon icon19; + icon19.addFile(QString::fromUtf8("assets/images/toolErase.png"), QSize(), QIcon::Normal, QIcon::Off); + actionErase->setIcon(icon19); + actionPickColour = new QAction(canvas); + actionPickColour->setObjectName(QString::fromUtf8("actionPickColour")); + actionPickColour->setCheckable(true); + QIcon icon20; + icon20.addFile(QString::fromUtf8("assets/images/toolPickColour.png"), QSize(), QIcon::Normal, QIcon::Off); + actionPickColour->setIcon(icon20); + actionFlip = new QAction(canvas); + actionFlip->setObjectName(QString::fromUtf8("actionFlip")); + actionFlip->setCheckable(true); + actionFlip->setEnabled(true); + actionFlipHorizontally = new QAction(canvas); + actionFlipHorizontally->setObjectName(QString::fromUtf8("actionFlipHorizontally")); + actionFlipHorizontally->setCheckable(true); + actionInvertColours = new QAction(canvas); + actionInvertColours->setObjectName(QString::fromUtf8("actionInvertColours")); + actionInvertColours->setCheckable(true); + actionRotate = new QAction(canvas); + actionRotate->setObjectName(QString::fromUtf8("actionRotate")); + actionRotate->setCheckable(true); + actionTile = new QAction(canvas); + actionTile->setObjectName(QString::fromUtf8("actionTile")); + actionTile->setCheckable(true); + actionViewMelp = new QAction(canvas); + actionViewMelp->setObjectName(QString::fromUtf8("actionViewMelp")); + actionOpenIssueOnGitHub = new QAction(canvas); + actionOpenIssueOnGitHub->setObjectName(QString::fromUtf8("actionOpenIssueOnGitHub")); + actionVisitGitHubWebsite = new QAction(canvas); + actionVisitGitHubWebsite->setObjectName(QString::fromUtf8("actionVisitGitHubWebsite")); + actionAboutRoar = new QAction(canvas); + actionAboutRoar->setObjectName(QString::fromUtf8("actionAboutRoar")); + actionColour00 = new QAction(canvas); + actionColour00->setObjectName(QString::fromUtf8("actionColour00")); + actionColour00->setCheckable(true); + QIcon icon21; + icon21.addFile(QString::fromUtf8("assets/images/colour00.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour00->setIcon(icon21); + actionColour01 = new QAction(canvas); + actionColour01->setObjectName(QString::fromUtf8("actionColour01")); + actionColour01->setCheckable(true); + QIcon icon22; + icon22.addFile(QString::fromUtf8("assets/images/colour01.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour01->setIcon(icon22); + actionColour02 = new QAction(canvas); + actionColour02->setObjectName(QString::fromUtf8("actionColour02")); + actionColour02->setCheckable(true); + QIcon icon23; + icon23.addFile(QString::fromUtf8("assets/images/colour02.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour02->setIcon(icon23); + actionColour03 = new QAction(canvas); + actionColour03->setObjectName(QString::fromUtf8("actionColour03")); + actionColour03->setCheckable(true); + QIcon icon24; + icon24.addFile(QString::fromUtf8("assets/images/colour03.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour03->setIcon(icon24); + actionColour04 = new QAction(canvas); + actionColour04->setObjectName(QString::fromUtf8("actionColour04")); + actionColour04->setCheckable(true); + QIcon icon25; + icon25.addFile(QString::fromUtf8("assets/images/colour04.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour04->setIcon(icon25); + actionColour05 = new QAction(canvas); + actionColour05->setObjectName(QString::fromUtf8("actionColour05")); + actionColour05->setCheckable(true); + QIcon icon26; + icon26.addFile(QString::fromUtf8("assets/images/colour05.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour05->setIcon(icon26); + actionColour06 = new QAction(canvas); + actionColour06->setObjectName(QString::fromUtf8("actionColour06")); + actionColour06->setCheckable(true); + QIcon icon27; + icon27.addFile(QString::fromUtf8("assets/images/colour06.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour06->setIcon(icon27); + actionColour07 = new QAction(canvas); + actionColour07->setObjectName(QString::fromUtf8("actionColour07")); + actionColour07->setCheckable(true); + QIcon icon28; + icon28.addFile(QString::fromUtf8("assets/images/colour07.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour07->setIcon(icon28); + actionColour08 = new QAction(canvas); + actionColour08->setObjectName(QString::fromUtf8("actionColour08")); + actionColour08->setCheckable(true); + QIcon icon29; + icon29.addFile(QString::fromUtf8("assets/images/colour08.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour08->setIcon(icon29); + actionColour09 = new QAction(canvas); + actionColour09->setObjectName(QString::fromUtf8("actionColour09")); + actionColour09->setCheckable(true); + QIcon icon30; + icon30.addFile(QString::fromUtf8("assets/images/colour09.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour09->setIcon(icon30); + actionColour10 = new QAction(canvas); + actionColour10->setObjectName(QString::fromUtf8("actionColour10")); + actionColour10->setCheckable(true); + QIcon icon31; + icon31.addFile(QString::fromUtf8("assets/images/colour10.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour10->setIcon(icon31); + actionColour11 = new QAction(canvas); + actionColour11->setObjectName(QString::fromUtf8("actionColour11")); + actionColour11->setCheckable(true); + QIcon icon32; + icon32.addFile(QString::fromUtf8("assets/images/colour11.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour11->setIcon(icon32); + actionColour12 = new QAction(canvas); + actionColour12->setObjectName(QString::fromUtf8("actionColour12")); + actionColour12->setCheckable(true); + QIcon icon33; + icon33.addFile(QString::fromUtf8("assets/images/colour12.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour12->setIcon(icon33); + actionColour13 = new QAction(canvas); + actionColour13->setObjectName(QString::fromUtf8("actionColour13")); + actionColour13->setCheckable(true); + QIcon icon34; + icon34.addFile(QString::fromUtf8("assets/images/colour13.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour13->setIcon(icon34); + actionColour14 = new QAction(canvas); + actionColour14->setObjectName(QString::fromUtf8("actionColour14")); + actionColour14->setCheckable(true); + QIcon icon35; + icon35.addFile(QString::fromUtf8("assets/images/colour14.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour14->setIcon(icon35); + actionColour15 = new QAction(canvas); + actionColour15->setObjectName(QString::fromUtf8("actionColour15")); + actionColour15->setCheckable(true); + QIcon icon36; + icon36.addFile(QString::fromUtf8("assets/images/colour15.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColour15->setIcon(icon36); + actionColourTransparent = new QAction(canvas); + actionColourTransparent->setObjectName(QString::fromUtf8("actionColourTransparent")); + actionColourTransparent->setCheckable(true); + QIcon icon37; + icon37.addFile(QString::fromUtf8("assets/images/colour_transparent.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourTransparent->setIcon(icon37); + actionColourBg00 = new QAction(canvas); + actionColourBg00->setObjectName(QString::fromUtf8("actionColourBg00")); + actionColourBg00->setCheckable(true); + QIcon icon38; + icon38.addFile(QString::fromUtf8("assets/images/colourBg00.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg00->setIcon(icon38); + actionColourBg01 = new QAction(canvas); + actionColourBg01->setObjectName(QString::fromUtf8("actionColourBg01")); + actionColourBg01->setCheckable(true); + QIcon icon39; + icon39.addFile(QString::fromUtf8("assets/images/colourBg01.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg01->setIcon(icon39); + actionColourBg02 = new QAction(canvas); + actionColourBg02->setObjectName(QString::fromUtf8("actionColourBg02")); + actionColourBg02->setCheckable(true); + QIcon icon40; + icon40.addFile(QString::fromUtf8("assets/images/colourBg02.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg02->setIcon(icon40); + actionColourBg03 = new QAction(canvas); + actionColourBg03->setObjectName(QString::fromUtf8("actionColourBg03")); + actionColourBg03->setCheckable(true); + QIcon icon41; + icon41.addFile(QString::fromUtf8("assets/images/colourBg03.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg03->setIcon(icon41); + actionColourBg04 = new QAction(canvas); + actionColourBg04->setObjectName(QString::fromUtf8("actionColourBg04")); + actionColourBg04->setCheckable(true); + QIcon icon42; + icon42.addFile(QString::fromUtf8("assets/images/colourBg04.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg04->setIcon(icon42); + actionColourBg05 = new QAction(canvas); + actionColourBg05->setObjectName(QString::fromUtf8("actionColourBg05")); + actionColourBg05->setCheckable(true); + QIcon icon43; + icon43.addFile(QString::fromUtf8("assets/images/colourBg05.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg05->setIcon(icon43); + actionColourBg06 = new QAction(canvas); + actionColourBg06->setObjectName(QString::fromUtf8("actionColourBg06")); + actionColourBg06->setCheckable(true); + QIcon icon44; + icon44.addFile(QString::fromUtf8("assets/images/colourBg06.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg06->setIcon(icon44); + actionColourBg07 = new QAction(canvas); + actionColourBg07->setObjectName(QString::fromUtf8("actionColourBg07")); + actionColourBg07->setCheckable(true); + QIcon icon45; + icon45.addFile(QString::fromUtf8("assets/images/colourBg07.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg07->setIcon(icon45); + actionColourBg08 = new QAction(canvas); + actionColourBg08->setObjectName(QString::fromUtf8("actionColourBg08")); + actionColourBg08->setCheckable(true); + QIcon icon46; + icon46.addFile(QString::fromUtf8("assets/images/colourBg08.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg08->setIcon(icon46); + actionColourBg09 = new QAction(canvas); + actionColourBg09->setObjectName(QString::fromUtf8("actionColourBg09")); + actionColourBg09->setCheckable(true); + QIcon icon47; + icon47.addFile(QString::fromUtf8("assets/images/colourBg09.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg09->setIcon(icon47); + actionColourBg10 = new QAction(canvas); + actionColourBg10->setObjectName(QString::fromUtf8("actionColourBg10")); + actionColourBg10->setCheckable(true); + QIcon icon48; + icon48.addFile(QString::fromUtf8("assets/images/colourBg10.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg10->setIcon(icon48); + actionColourBg11 = new QAction(canvas); + actionColourBg11->setObjectName(QString::fromUtf8("actionColourBg11")); + actionColourBg11->setCheckable(true); + QIcon icon49; + icon49.addFile(QString::fromUtf8("assets/images/colourBg11.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg11->setIcon(icon49); + actionColourBg12 = new QAction(canvas); + actionColourBg12->setObjectName(QString::fromUtf8("actionColourBg12")); + actionColourBg12->setCheckable(true); + QIcon icon50; + icon50.addFile(QString::fromUtf8("assets/images/colourBg12.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg12->setIcon(icon50); + actionColourBg13 = new QAction(canvas); + actionColourBg13->setObjectName(QString::fromUtf8("actionColourBg13")); + actionColourBg13->setCheckable(true); + QIcon icon51; + icon51.addFile(QString::fromUtf8("assets/images/colourBg13.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg13->setIcon(icon51); + actionColourBg14 = new QAction(canvas); + actionColourBg14->setObjectName(QString::fromUtf8("actionColourBg14")); + actionColourBg14->setCheckable(true); + QIcon icon52; + icon52.addFile(QString::fromUtf8("assets/images/colourBg14.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg14->setIcon(icon52); + actionColourBg15 = new QAction(canvas); + actionColourBg15->setObjectName(QString::fromUtf8("actionColourBg15")); + actionColourBg15->setCheckable(true); + QIcon icon53; + icon53.addFile(QString::fromUtf8("assets/images/colourBg15.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBg15->setIcon(icon53); + actionColourBgTransparent = new QAction(canvas); + actionColourBgTransparent->setObjectName(QString::fromUtf8("actionColourBgTransparent")); + actionColourBgTransparent->setCheckable(true); + QIcon icon54; + icon54.addFile(QString::fromUtf8("assets/images/colourBg_transparent.png"), QSize(), QIcon::Normal, QIcon::Off); + actionColourBgTransparent->setIcon(icon54); + actionIncreaseBrushWidth = new QAction(canvas); + actionIncreaseBrushWidth->setObjectName(QString::fromUtf8("actionIncreaseBrushWidth")); + QIcon icon55; + icon55.addFile(QString::fromUtf8("assets/images/toolIncrBrushW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionIncreaseBrushWidth->setIcon(icon55); + actionDecreaseBrushWidth = new QAction(canvas); + actionDecreaseBrushWidth->setObjectName(QString::fromUtf8("actionDecreaseBrushWidth")); + QIcon icon56; + icon56.addFile(QString::fromUtf8("assets/images/toolDecrBrushW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionDecreaseBrushWidth->setIcon(icon56); + actionIncreaseBrushHeight = new QAction(canvas); + actionIncreaseBrushHeight->setObjectName(QString::fromUtf8("actionIncreaseBrushHeight")); + QIcon icon57; + icon57.addFile(QString::fromUtf8("assets/images/toolIncrBrushH.png"), QSize(), QIcon::Normal, QIcon::Off); + actionIncreaseBrushHeight->setIcon(icon57); + actionDecreaseBrushHeight = new QAction(canvas); + actionDecreaseBrushHeight->setObjectName(QString::fromUtf8("actionDecreaseBrushHeight")); + QIcon icon58; + icon58.addFile(QString::fromUtf8("assets/images/toolDecrBrushH.png"), QSize(), QIcon::Normal, QIcon::Off); + actionDecreaseBrushHeight->setIcon(icon58); + actionIncreaseBrushSize = new QAction(canvas); + actionIncreaseBrushSize->setObjectName(QString::fromUtf8("actionIncreaseBrushSize")); + QIcon icon59; + icon59.addFile(QString::fromUtf8("assets/images/toolIncrBrushHW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionIncreaseBrushSize->setIcon(icon59); + actionDecreaseBrushSize = new QAction(canvas); + actionDecreaseBrushSize->setObjectName(QString::fromUtf8("actionDecreaseBrushSize")); + QIcon icon60; + icon60.addFile(QString::fromUtf8("assets/images/toolDecrBrushHW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionDecreaseBrushSize->setIcon(icon60); + actionIncreaseCanvasWidth = new QAction(canvas); + actionIncreaseCanvasWidth->setObjectName(QString::fromUtf8("actionIncreaseCanvasWidth")); + QIcon icon61; + icon61.addFile(QString::fromUtf8("assets/images/toolIncrCanvasW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionIncreaseCanvasWidth->setIcon(icon61); + actionDecreaseCanvasWidth = new QAction(canvas); + actionDecreaseCanvasWidth->setObjectName(QString::fromUtf8("actionDecreaseCanvasWidth")); + QIcon icon62; + icon62.addFile(QString::fromUtf8("assets/images/toolDecrCanvasW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionDecreaseCanvasWidth->setIcon(icon62); + actionIncreaseCanvasHeight = new QAction(canvas); + actionIncreaseCanvasHeight->setObjectName(QString::fromUtf8("actionIncreaseCanvasHeight")); + QIcon icon63; + icon63.addFile(QString::fromUtf8("assets/images/toolIncrCanvasH.png"), QSize(), QIcon::Normal, QIcon::Off); + actionIncreaseCanvasHeight->setIcon(icon63); + actionDecreaseCanvasHeight = new QAction(canvas); + actionDecreaseCanvasHeight->setObjectName(QString::fromUtf8("actionDecreaseCanvasHeight")); + QIcon icon64; + icon64.addFile(QString::fromUtf8("assets/images/toolDecrCanvasH.png"), QSize(), QIcon::Normal, QIcon::Off); + actionDecreaseCanvasHeight->setIcon(icon64); + actionIncreaseCanvasSize = new QAction(canvas); + actionIncreaseCanvasSize->setObjectName(QString::fromUtf8("actionIncreaseCanvasSize")); + QIcon icon65; + icon65.addFile(QString::fromUtf8("assets/images/toolIncrCanvasHW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionIncreaseCanvasSize->setIcon(icon65); + actionDecreaseCanvasSize = new QAction(canvas); + actionDecreaseCanvasSize->setObjectName(QString::fromUtf8("actionDecreaseCanvasSize")); + QIcon icon66; + icon66.addFile(QString::fromUtf8("assets/images/toolDecrCanvasHW.png"), QSize(), QIcon::Normal, QIcon::Off); + actionDecreaseCanvasSize->setIcon(icon66); + actionDecreaseCellSize = new QAction(canvas); + actionDecreaseCellSize->setObjectName(QString::fromUtf8("actionDecreaseCellSize")); + actionIncreaseCellSize = new QAction(canvas); + actionIncreaseCellSize->setObjectName(QString::fromUtf8("actionIncreaseCellSize")); + actionExportAsANSI = new QAction(canvas); + actionExportAsANSI->setObjectName(QString::fromUtf8("actionExportAsANSI")); + actionExportToClipboard = new QAction(canvas); + actionExportToClipboard->setObjectName(QString::fromUtf8("actionExportToClipboard")); + actionExportToImgur = new QAction(canvas); + actionExportToImgur->setObjectName(QString::fromUtf8("actionExportToImgur")); + actionExportToPastebin = new QAction(canvas); + actionExportToPastebin->setObjectName(QString::fromUtf8("actionExportToPastebin")); + actionExportAsPNG = new QAction(canvas); + actionExportAsPNG->setObjectName(QString::fromUtf8("actionExportAsPNG")); + actionImportANSI = new QAction(canvas); + actionImportANSI->setObjectName(QString::fromUtf8("actionImportANSI")); + actionImportFromClipboard = new QAction(canvas); + actionImportFromClipboard->setObjectName(QString::fromUtf8("actionImportFromClipboard")); + actionImportSAUCE = new QAction(canvas); + actionImportSAUCE->setObjectName(QString::fromUtf8("actionImportSAUCE")); + actionFlipColours = new QAction(canvas); + actionFlipColours->setObjectName(QString::fromUtf8("actionFlipColours")); + QIcon icon67; + icon67.addFile(QString::fromUtf8("assets/images/toolColoursFlip.png"), QSize(), QIcon::Normal, QIcon::Off); + actionFlipColours->setIcon(icon67); + action_Clear_list = new QAction(canvas); + action_Clear_list->setObjectName(QString::fromUtf8("action_Clear_list")); + actionRestore_from_file = new QAction(canvas); + actionRestore_from_file->setObjectName(QString::fromUtf8("actionRestore_from_file")); + centralwidget = new QWidget(canvas); + centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + verticalLayoutWidget = new QWidget(centralwidget); + verticalLayoutWidget->setObjectName(QString::fromUtf8("verticalLayoutWidget")); + verticalLayoutWidget->setGeometry(QRect(0, 0, 771, 531)); + verticalLayout = new QVBoxLayout(verticalLayoutWidget); + verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); + verticalLayout->setContentsMargins(0, 0, 0, 0); + canvas->setCentralWidget(centralwidget); + menubar = new QMenuBar(canvas); + menubar->setObjectName(QString::fromUtf8("menubar")); + menubar->setGeometry(QRect(0, 0, 840, 21)); + menuFile = new QMenu(menubar); + menuFile->setObjectName(QString::fromUtf8("menuFile")); + menu_Export = new QMenu(menuFile); + menu_Export->setObjectName(QString::fromUtf8("menu_Export")); + menu_Import = new QMenu(menuFile); + menu_Import->setObjectName(QString::fromUtf8("menu_Import")); + menuOpen_Recent = new QMenu(menuFile); + menuOpen_Recent->setObjectName(QString::fromUtf8("menuOpen_Recent")); + menuOpen_Recent->setEnabled(false); + menuRes_tore_Snapshot = new QMenu(menuFile); + menuRes_tore_Snapshot->setObjectName(QString::fromUtf8("menuRes_tore_Snapshot")); + menuRes_tore_Snapshot->setEnabled(false); + menuEdit = new QMenu(menubar); + menuEdit->setObjectName(QString::fromUtf8("menuEdit")); + menuBrush_size = new QMenu(menuEdit); + menuBrush_size->setObjectName(QString::fromUtf8("menuBrush_size")); + menuCanvas_size = new QMenu(menuEdit); + menuCanvas_size->setObjectName(QString::fromUtf8("menuCanvas_size")); + menuTools = new QMenu(menubar); + menuTools->setObjectName(QString::fromUtf8("menuTools")); + menuOperators = new QMenu(menubar); + menuOperators->setObjectName(QString::fromUtf8("menuOperators")); + menuHelp = new QMenu(menubar); + menuHelp->setObjectName(QString::fromUtf8("menuHelp")); + canvas->setMenuBar(menubar); + statusbar = new QStatusBar(canvas); + statusbar->setObjectName(QString::fromUtf8("statusbar")); + canvas->setStatusBar(statusbar); + toolBarCommands = new QToolBar(canvas); + toolBarCommands->setObjectName(QString::fromUtf8("toolBarCommands")); + canvas->addToolBar(Qt::RightToolBarArea, toolBarCommands); + toolBarTools = new QToolBar(canvas); + toolBarTools->setObjectName(QString::fromUtf8("toolBarTools")); + canvas->addToolBar(Qt::RightToolBarArea, toolBarTools); + canvas->insertToolBarBreak(toolBarTools); + toolBarColours = new QToolBar(canvas); + toolBarColours->setObjectName(QString::fromUtf8("toolBarColours")); + canvas->addToolBar(Qt::TopToolBarArea, toolBarColours); + toolBarColoursBackground = new QToolBar(canvas); + toolBarColoursBackground->setObjectName(QString::fromUtf8("toolBarColoursBackground")); + canvas->addToolBar(Qt::TopToolBarArea, toolBarColoursBackground); + canvas->insertToolBarBreak(toolBarColoursBackground); + + menubar->addAction(menuFile->menuAction()); + menubar->addAction(menuEdit->menuAction()); + menubar->addAction(menuTools->menuAction()); + menubar->addAction(menuOperators->menuAction()); + menubar->addAction(menuHelp->menuAction()); + menuFile->addAction(actionNew); + menuFile->addAction(actionOpen); + menuFile->addAction(menuOpen_Recent->menuAction()); + menuFile->addAction(menuRes_tore_Snapshot->menuAction()); + menuFile->addAction(actionSave); + menuFile->addAction(actionSaveAs); + menuFile->addSeparator(); + menuFile->addAction(menu_Export->menuAction()); + menuFile->addAction(menu_Import->menuAction()); + menuFile->addSeparator(); + menuFile->addAction(actionExit); + menu_Export->addAction(actionExportAsANSI); + menu_Export->addAction(actionExportToClipboard); + menu_Export->addAction(actionExportToImgur); + menu_Export->addAction(actionExportToPastebin); + menu_Export->addAction(actionExportAsPNG); + menu_Import->addAction(actionImportANSI); + menu_Import->addAction(actionImportFromClipboard); + menu_Import->addAction(actionImportSAUCE); + menuOpen_Recent->addAction(action_Clear_list); + menuRes_tore_Snapshot->addAction(actionRestore_from_file); + menuEdit->addAction(actionUndo); + menuEdit->addAction(actionRedo); + menuEdit->addSeparator(); + menuEdit->addAction(actionCut); + menuEdit->addAction(actionCopy); + menuEdit->addAction(actionPaste); + menuEdit->addAction(actionDelete); + menuEdit->addSeparator(); + menuEdit->addAction(menuBrush_size->menuAction()); + menuEdit->addAction(menuCanvas_size->menuAction()); + menuEdit->addAction(actionFlipColours); + menuEdit->addSeparator(); + menuEdit->addAction(actionSolidBrush); + menuEdit->addSeparator(); + menuEdit->addAction(actionHideAssetsWindow); + menuEdit->addAction(actionShowAssetsWindow); + menuBrush_size->addAction(actionIncreaseBrushWidth); + menuBrush_size->addAction(actionDecreaseBrushWidth); + menuBrush_size->addAction(actionIncreaseBrushHeight); + menuBrush_size->addAction(actionDecreaseBrushHeight); + menuBrush_size->addSeparator(); + menuBrush_size->addAction(actionIncreaseBrushSize); + menuBrush_size->addAction(actionDecreaseBrushSize); + menuCanvas_size->addAction(actionIncreaseCanvasWidth); + menuCanvas_size->addAction(actionDecreaseCanvasWidth); + menuCanvas_size->addAction(actionIncreaseCanvasHeight); + menuCanvas_size->addAction(actionDecreaseCanvasHeight); + menuCanvas_size->addSeparator(); + menuCanvas_size->addAction(actionIncreaseCanvasSize); + menuCanvas_size->addAction(actionDecreaseCanvasSize); + menuTools->addAction(actionCursor); + menuTools->addAction(actionRectangle); + menuTools->addAction(actionCircle); + menuTools->addAction(actionFill); + menuTools->addAction(actionLine); + menuTools->addAction(actionText); + menuTools->addAction(actionObject); + menuTools->addAction(actionErase); + menuTools->addAction(actionPickColour); + menuOperators->addAction(actionFlip); + menuOperators->addAction(actionFlipHorizontally); + menuOperators->addAction(actionInvertColours); + menuOperators->addAction(actionRotate); + menuOperators->addAction(actionTile); + menuHelp->addAction(actionViewMelp); + menuHelp->addSeparator(); + menuHelp->addAction(actionOpenIssueOnGitHub); + menuHelp->addAction(actionVisitGitHubWebsite); + menuHelp->addSeparator(); + menuHelp->addAction(actionAboutRoar); + toolBarCommands->addAction(actionNew); + toolBarCommands->addAction(actionOpen); + toolBarCommands->addAction(actionSave); + toolBarCommands->addAction(actionSaveAs); + toolBarCommands->addSeparator(); + toolBarCommands->addAction(actionUndo); + toolBarCommands->addAction(actionRedo); + toolBarCommands->addAction(actionCut); + toolBarCommands->addAction(actionCopy); + toolBarCommands->addAction(actionPaste); + toolBarCommands->addAction(actionDelete); + toolBarCommands->addSeparator(); + toolBarCommands->addAction(actionHideAssetsWindow); + toolBarCommands->addAction(actionShowAssetsWindow); + toolBarTools->addAction(actionCursor); + toolBarTools->addAction(actionRectangle); + toolBarTools->addAction(actionCircle); + toolBarTools->addAction(actionFill); + toolBarTools->addAction(actionLine); + toolBarTools->addAction(actionText); + toolBarTools->addAction(actionObject); + toolBarTools->addAction(actionErase); + toolBarTools->addAction(actionPickColour); + toolBarColours->addAction(actionColour00); + toolBarColours->addAction(actionColour01); + toolBarColours->addAction(actionColour02); + toolBarColours->addAction(actionColour03); + toolBarColours->addAction(actionColour04); + toolBarColours->addAction(actionColour05); + toolBarColours->addAction(actionColour06); + toolBarColours->addAction(actionColour07); + toolBarColours->addAction(actionColour08); + toolBarColours->addAction(actionColour09); + toolBarColours->addAction(actionColour10); + toolBarColours->addAction(actionColour11); + toolBarColours->addAction(actionColour12); + toolBarColours->addAction(actionColour13); + toolBarColours->addAction(actionColour14); + toolBarColours->addAction(actionColour15); + toolBarColours->addAction(actionColourTransparent); + toolBarColours->addAction(actionFlipColours); + toolBarColours->addSeparator(); + toolBarColours->addAction(actionIncreaseCanvasWidth); + toolBarColours->addAction(actionDecreaseCanvasWidth); + toolBarColours->addAction(actionIncreaseCanvasHeight); + toolBarColours->addAction(actionDecreaseCanvasHeight); + toolBarColours->addSeparator(); + toolBarColours->addAction(actionIncreaseCanvasSize); + toolBarColours->addAction(actionDecreaseCanvasSize); + toolBarColoursBackground->addAction(actionColourBg00); + toolBarColoursBackground->addAction(actionColourBg01); + toolBarColoursBackground->addAction(actionColourBg02); + toolBarColoursBackground->addAction(actionColourBg03); + toolBarColoursBackground->addAction(actionColourBg04); + toolBarColoursBackground->addAction(actionColourBg05); + toolBarColoursBackground->addAction(actionColourBg06); + toolBarColoursBackground->addAction(actionColourBg07); + toolBarColoursBackground->addAction(actionColourBg08); + toolBarColoursBackground->addAction(actionColourBg09); + toolBarColoursBackground->addAction(actionColourBg10); + toolBarColoursBackground->addAction(actionColourBg11); + toolBarColoursBackground->addAction(actionColourBg12); + toolBarColoursBackground->addAction(actionColourBg13); + toolBarColoursBackground->addAction(actionColourBg14); + toolBarColoursBackground->addAction(actionColourBg15); + toolBarColoursBackground->addAction(actionColourBgTransparent); + toolBarColoursBackground->addAction(actionFlipColours); + toolBarColoursBackground->addSeparator(); + toolBarColoursBackground->addAction(actionIncreaseBrushHeight); + toolBarColoursBackground->addAction(actionDecreaseBrushHeight); + toolBarColoursBackground->addAction(actionIncreaseBrushWidth); + toolBarColoursBackground->addAction(actionDecreaseBrushWidth); + toolBarColoursBackground->addSeparator(); + toolBarColoursBackground->addAction(actionIncreaseBrushSize); + toolBarColoursBackground->addAction(actionDecreaseBrushSize); + + retranslateUi(canvas); + + QMetaObject::connectSlotsByName(canvas); + } // setupUi + + void retranslateUi(QMainWindow *canvas) + { + canvas->setWindowTitle(QApplication::translate("canvas", "roar", nullptr)); + actionNew->setText(QApplication::translate("canvas", "&New", nullptr)); +#ifndef QT_NO_SHORTCUT + actionNew->setShortcut(QApplication::translate("canvas", "Ctrl+N", nullptr)); +#endif // QT_NO_SHORTCUT + actionOpen->setText(QApplication::translate("canvas", "&Open", nullptr)); +#ifndef QT_NO_SHORTCUT + actionOpen->setShortcut(QApplication::translate("canvas", "Ctrl+O", nullptr)); +#endif // QT_NO_SHORTCUT + actionSave->setText(QApplication::translate("canvas", "&Save", nullptr)); +#ifndef QT_NO_SHORTCUT + actionSave->setShortcut(QApplication::translate("canvas", "Ctrl+S", nullptr)); +#endif // QT_NO_SHORTCUT + actionSaveAs->setText(QApplication::translate("canvas", "Save &As...", nullptr)); + actionExit->setText(QApplication::translate("canvas", "E&xit", nullptr)); +#ifndef QT_NO_SHORTCUT + actionExit->setShortcut(QApplication::translate("canvas", "Ctrl+X", nullptr)); +#endif // QT_NO_SHORTCUT + actionUndo->setText(QApplication::translate("canvas", "&Undo", nullptr)); +#ifndef QT_NO_SHORTCUT + actionUndo->setShortcut(QApplication::translate("canvas", "Ctrl+Z", nullptr)); +#endif // QT_NO_SHORTCUT + actionRedo->setText(QApplication::translate("canvas", "&Redo", nullptr)); +#ifndef QT_NO_SHORTCUT + actionRedo->setShortcut(QApplication::translate("canvas", "Ctrl+Y", nullptr)); +#endif // QT_NO_SHORTCUT + actionCut->setText(QApplication::translate("canvas", "Cu&t", nullptr)); + actionCopy->setText(QApplication::translate("canvas", "&Copy", nullptr)); + actionPaste->setText(QApplication::translate("canvas", "&Paste", nullptr)); + actionDelete->setText(QApplication::translate("canvas", "De&lete", nullptr)); + actionSolidBrush->setText(QApplication::translate("canvas", "Solid brush", nullptr)); + actionHideAssetsWindow->setText(QApplication::translate("canvas", "Hide assets window", nullptr)); + actionShowAssetsWindow->setText(QApplication::translate("canvas", "Show assets window", nullptr)); + actionCursor->setText(QApplication::translate("canvas", "C&ursor", nullptr)); +#ifndef QT_NO_SHORTCUT + actionCursor->setShortcut(QApplication::translate("canvas", "F2", nullptr)); +#endif // QT_NO_SHORTCUT + actionRectangle->setText(QApplication::translate("canvas", "&Rectangle", nullptr)); +#ifndef QT_NO_SHORTCUT + actionRectangle->setShortcut(QApplication::translate("canvas", "F3", nullptr)); +#endif // QT_NO_SHORTCUT + actionCircle->setText(QApplication::translate("canvas", "&Circle", nullptr)); +#ifndef QT_NO_SHORTCUT + actionCircle->setShortcut(QApplication::translate("canvas", "F4", nullptr)); +#endif // QT_NO_SHORTCUT + actionFill->setText(QApplication::translate("canvas", "&Fill", nullptr)); +#ifndef QT_NO_SHORTCUT + actionFill->setShortcut(QApplication::translate("canvas", "F5", nullptr)); +#endif // QT_NO_SHORTCUT + actionLine->setText(QApplication::translate("canvas", "&Line", nullptr)); +#ifndef QT_NO_SHORTCUT + actionLine->setShortcut(QApplication::translate("canvas", "F6", nullptr)); +#endif // QT_NO_SHORTCUT + actionText->setText(QApplication::translate("canvas", "&Text", nullptr)); +#ifndef QT_NO_SHORTCUT + actionText->setShortcut(QApplication::translate("canvas", "F7", nullptr)); +#endif // QT_NO_SHORTCUT + actionObject->setText(QApplication::translate("canvas", "&Object", nullptr)); +#ifndef QT_NO_SHORTCUT + actionObject->setShortcut(QApplication::translate("canvas", "F8", nullptr)); +#endif // QT_NO_SHORTCUT + actionErase->setText(QApplication::translate("canvas", "&Erase", nullptr)); +#ifndef QT_NO_SHORTCUT + actionErase->setShortcut(QApplication::translate("canvas", "F9", nullptr)); +#endif // QT_NO_SHORTCUT + actionPickColour->setText(QApplication::translate("canvas", "&Pick colour", nullptr)); +#ifndef QT_NO_SHORTCUT + actionPickColour->setShortcut(QApplication::translate("canvas", "F10", nullptr)); +#endif // QT_NO_SHORTCUT + actionFlip->setText(QApplication::translate("canvas", "&Flip", nullptr)); + actionFlipHorizontally->setText(QApplication::translate("canvas", "Flip &horizontally", nullptr)); + actionInvertColours->setText(QApplication::translate("canvas", "&Invert colours", nullptr)); + actionRotate->setText(QApplication::translate("canvas", "&Rotate", nullptr)); + actionTile->setText(QApplication::translate("canvas", "&Tile", nullptr)); + actionViewMelp->setText(QApplication::translate("canvas", "View &melp?", nullptr)); +#ifndef QT_NO_SHORTCUT + actionViewMelp->setShortcut(QApplication::translate("canvas", "F1", nullptr)); +#endif // QT_NO_SHORTCUT + actionOpenIssueOnGitHub->setText(QApplication::translate("canvas", "Open &issue on GitHub", nullptr)); + actionVisitGitHubWebsite->setText(QApplication::translate("canvas", "Visit &GitHub website", nullptr)); + actionAboutRoar->setText(QApplication::translate("canvas", "&About roar", nullptr)); + actionColour00->setText(QApplication::translate("canvas", "Colour #00", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour00->setToolTip(QApplication::translate("canvas", "Colour #00", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour00->setShortcut(QApplication::translate("canvas", "Ctrl+0", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour01->setText(QApplication::translate("canvas", "Colour #01", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour01->setToolTip(QApplication::translate("canvas", "Colour #01", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour01->setShortcut(QApplication::translate("canvas", "Ctrl+1", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour02->setText(QApplication::translate("canvas", "Colour #02", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour02->setToolTip(QApplication::translate("canvas", "Colour #02", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour02->setShortcut(QApplication::translate("canvas", "Ctrl+2", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour03->setText(QApplication::translate("canvas", "Colour #03", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour03->setToolTip(QApplication::translate("canvas", "Colour #03", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour03->setShortcut(QApplication::translate("canvas", "Ctrl+3", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour04->setText(QApplication::translate("canvas", "Colour #04", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour04->setToolTip(QApplication::translate("canvas", "Colour #04", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour04->setShortcut(QApplication::translate("canvas", "Ctrl+4", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour05->setText(QApplication::translate("canvas", "Colour #05", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour05->setToolTip(QApplication::translate("canvas", "Colour #05", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour05->setShortcut(QApplication::translate("canvas", "Ctrl+5", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour06->setText(QApplication::translate("canvas", "Colour #06", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour06->setToolTip(QApplication::translate("canvas", "Colour #06", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour06->setShortcut(QApplication::translate("canvas", "Ctrl+6", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour07->setText(QApplication::translate("canvas", "Colour #07", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour07->setToolTip(QApplication::translate("canvas", "Colour #07", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour07->setShortcut(QApplication::translate("canvas", "Ctrl+7", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour08->setText(QApplication::translate("canvas", "Colour #08", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour08->setToolTip(QApplication::translate("canvas", "Colour #08", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour08->setShortcut(QApplication::translate("canvas", "Ctrl+8", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour09->setText(QApplication::translate("canvas", "Colour #09", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour09->setToolTip(QApplication::translate("canvas", "Colour #09", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour09->setShortcut(QApplication::translate("canvas", "Ctrl+9", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour10->setText(QApplication::translate("canvas", "Colour #10", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour10->setToolTip(QApplication::translate("canvas", "Colour #10", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour10->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+0", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour11->setText(QApplication::translate("canvas", "Colour #11", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour11->setToolTip(QApplication::translate("canvas", "Colour #11", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour11->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+1", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour12->setText(QApplication::translate("canvas", "Colour #12", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour12->setToolTip(QApplication::translate("canvas", "Colour #12", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour12->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+2", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour13->setText(QApplication::translate("canvas", "Colour #13", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour13->setToolTip(QApplication::translate("canvas", "Colour #13", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour13->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+3", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour14->setText(QApplication::translate("canvas", "Colour #14", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour14->setToolTip(QApplication::translate("canvas", "Colour #14", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour14->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+4", nullptr)); +#endif // QT_NO_SHORTCUT + actionColour15->setText(QApplication::translate("canvas", "Colour #15", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColour15->setToolTip(QApplication::translate("canvas", "Colour #15", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColour15->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+5", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourTransparent->setText(QApplication::translate("canvas", "Transparent colour", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourTransparent->setToolTip(QApplication::translate("canvas", "Transparent colour", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourTransparent->setShortcut(QApplication::translate("canvas", "Ctrl+Shift+6", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg00->setText(QApplication::translate("canvas", "Background colour #00", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg00->setToolTip(QApplication::translate("canvas", "Background colour #00", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg00->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+0", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg01->setText(QApplication::translate("canvas", "Background colour #01", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg01->setToolTip(QApplication::translate("canvas", "Background colour #01", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg01->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+1", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg02->setText(QApplication::translate("canvas", "Background colour #02", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg02->setToolTip(QApplication::translate("canvas", "Background colour #02", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg02->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+2", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg03->setText(QApplication::translate("canvas", "Background colour #03", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg03->setToolTip(QApplication::translate("canvas", "Background colour #03", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg03->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+3", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg04->setText(QApplication::translate("canvas", "Background colour #04", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg04->setToolTip(QApplication::translate("canvas", "Background colour #04", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg04->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+4", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg05->setText(QApplication::translate("canvas", "Background colour #05", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg05->setToolTip(QApplication::translate("canvas", "Background colour #05", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg05->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+5", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg06->setText(QApplication::translate("canvas", "Background colour #06", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg06->setToolTip(QApplication::translate("canvas", "Background colour #06", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg06->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+6", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg07->setText(QApplication::translate("canvas", "Background colour #07", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg07->setToolTip(QApplication::translate("canvas", "Background colour #07", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg07->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+7", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg08->setText(QApplication::translate("canvas", "Background colour #08", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg08->setToolTip(QApplication::translate("canvas", "Background colour #08", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg08->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+8", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg09->setText(QApplication::translate("canvas", "Background colour #09", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg09->setToolTip(QApplication::translate("canvas", "Background colour #09", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg09->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+9", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg10->setText(QApplication::translate("canvas", "Background colour #10", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg10->setToolTip(QApplication::translate("canvas", "Background colour #10", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg10->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+0", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg11->setText(QApplication::translate("canvas", "Background colour #11", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg11->setToolTip(QApplication::translate("canvas", "Background colour #11", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg11->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+1", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg12->setText(QApplication::translate("canvas", "Background colour #12", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg12->setToolTip(QApplication::translate("canvas", "Background colour #12", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg12->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+2", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg13->setText(QApplication::translate("canvas", "Background colour #13", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg13->setToolTip(QApplication::translate("canvas", "Background colour #13", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg13->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+3", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg14->setText(QApplication::translate("canvas", "Background colour #14", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg14->setToolTip(QApplication::translate("canvas", "Background colour #14", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg14->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+4", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBg15->setText(QApplication::translate("canvas", "Background colour #15", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBg15->setToolTip(QApplication::translate("canvas", "Background colour #15", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBg15->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+5", nullptr)); +#endif // QT_NO_SHORTCUT + actionColourBgTransparent->setText(QApplication::translate("canvas", "Transparent background colour", nullptr)); +#ifndef QT_NO_TOOLTIP + actionColourBgTransparent->setToolTip(QApplication::translate("canvas", "Transparent background colour", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionColourBgTransparent->setShortcut(QApplication::translate("canvas", "Ctrl+Alt+Shift+6", nullptr)); +#endif // QT_NO_SHORTCUT + actionIncreaseBrushWidth->setText(QApplication::translate("canvas", "Increase brush width", nullptr)); + actionDecreaseBrushWidth->setText(QApplication::translate("canvas", "Decrease brush width", nullptr)); + actionIncreaseBrushHeight->setText(QApplication::translate("canvas", "Increase brush height", nullptr)); + actionDecreaseBrushHeight->setText(QApplication::translate("canvas", "Decrease brush height", nullptr)); + actionIncreaseBrushSize->setText(QApplication::translate("canvas", "Increase brush size", nullptr)); +#ifndef QT_NO_SHORTCUT + actionIncreaseBrushSize->setShortcut(QApplication::translate("canvas", "Ctrl++", nullptr)); +#endif // QT_NO_SHORTCUT + actionDecreaseBrushSize->setText(QApplication::translate("canvas", "Decrease brush size", nullptr)); +#ifndef QT_NO_SHORTCUT + actionDecreaseBrushSize->setShortcut(QApplication::translate("canvas", "Ctrl+-", nullptr)); +#endif // QT_NO_SHORTCUT + actionIncreaseCanvasWidth->setText(QApplication::translate("canvas", "Increase canvas width", nullptr)); +#ifndef QT_NO_SHORTCUT + actionIncreaseCanvasWidth->setShortcut(QApplication::translate("canvas", "Ctrl+Right", nullptr)); +#endif // QT_NO_SHORTCUT + actionDecreaseCanvasWidth->setText(QApplication::translate("canvas", "Decrease canvas width", nullptr)); +#ifndef QT_NO_SHORTCUT + actionDecreaseCanvasWidth->setShortcut(QApplication::translate("canvas", "Ctrl+Left", nullptr)); +#endif // QT_NO_SHORTCUT + actionIncreaseCanvasHeight->setText(QApplication::translate("canvas", "Increase canvas height", nullptr)); +#ifndef QT_NO_SHORTCUT + actionIncreaseCanvasHeight->setShortcut(QApplication::translate("canvas", "Ctrl+Down", nullptr)); +#endif // QT_NO_SHORTCUT + actionDecreaseCanvasHeight->setText(QApplication::translate("canvas", "Decrease canvas height", nullptr)); +#ifndef QT_NO_SHORTCUT + actionDecreaseCanvasHeight->setShortcut(QApplication::translate("canvas", "Ctrl+Up", nullptr)); +#endif // QT_NO_SHORTCUT + actionIncreaseCanvasSize->setText(QApplication::translate("canvas", "Increase canvas size", nullptr)); + actionDecreaseCanvasSize->setText(QApplication::translate("canvas", "Decrease canvas size", nullptr)); + actionDecreaseCellSize->setText(QApplication::translate("canvas", "Decrease cell size", nullptr)); +#ifndef QT_NO_TOOLTIP + actionDecreaseCellSize->setToolTip(QApplication::translate("canvas", "Decrease cell size", nullptr)); +#endif // QT_NO_TOOLTIP + actionIncreaseCellSize->setText(QApplication::translate("canvas", "Increase cell size", nullptr)); +#ifndef QT_NO_TOOLTIP + actionIncreaseCellSize->setToolTip(QApplication::translate("canvas", "Increase cell size", nullptr)); +#endif // QT_NO_TOOLTIP + actionExportAsANSI->setText(QApplication::translate("canvas", "Export as &ANSI...", nullptr)); + actionExportToClipboard->setText(QApplication::translate("canvas", "Export to &clipboard", nullptr)); + actionExportToImgur->setText(QApplication::translate("canvas", "Export to I&mgur...", nullptr)); + actionExportToPastebin->setText(QApplication::translate("canvas", "Export to Pasteb&in...", nullptr)); + actionExportAsPNG->setText(QApplication::translate("canvas", "Export as PN&G...", nullptr)); + actionImportANSI->setText(QApplication::translate("canvas", "Import &ANSI...", nullptr)); + actionImportFromClipboard->setText(QApplication::translate("canvas", "Import from &clipboard", nullptr)); + actionImportSAUCE->setText(QApplication::translate("canvas", "Import &SAUCE...", nullptr)); + actionFlipColours->setText(QApplication::translate("canvas", "Flip colours", nullptr)); +#ifndef QT_NO_TOOLTIP + actionFlipColours->setToolTip(QApplication::translate("canvas", "Flip colours", nullptr)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_SHORTCUT + actionFlipColours->setShortcut(QApplication::translate("canvas", "Ctrl+I", nullptr)); +#endif // QT_NO_SHORTCUT + action_Clear_list->setText(QApplication::translate("canvas", "&Clear list", nullptr)); + actionRestore_from_file->setText(QApplication::translate("canvas", "Restore from &file", nullptr)); + menuFile->setTitle(QApplication::translate("canvas", "&File", nullptr)); + menu_Export->setTitle(QApplication::translate("canvas", "&Export...", nullptr)); + menu_Import->setTitle(QApplication::translate("canvas", "&Import...", nullptr)); + menuOpen_Recent->setTitle(QApplication::translate("canvas", "Open &Recent", nullptr)); + menuRes_tore_Snapshot->setTitle(QApplication::translate("canvas", "Res&tore Snapshot", nullptr)); + menuEdit->setTitle(QApplication::translate("canvas", "&Edit", nullptr)); + menuBrush_size->setTitle(QApplication::translate("canvas", "Brush size", nullptr)); + menuCanvas_size->setTitle(QApplication::translate("canvas", "Canvas size", nullptr)); + menuTools->setTitle(QApplication::translate("canvas", "&Tools", nullptr)); + menuOperators->setTitle(QApplication::translate("canvas", "&Operators", nullptr)); + menuHelp->setTitle(QApplication::translate("canvas", "&Help", nullptr)); + toolBarCommands->setWindowTitle(QApplication::translate("canvas", "Commands", nullptr)); + toolBarTools->setWindowTitle(QApplication::translate("canvas", "Tools", nullptr)); + toolBarColours->setWindowTitle(QApplication::translate("canvas", "Colours", nullptr)); + toolBarColoursBackground->setWindowTitle(QApplication::translate("canvas", "Background colours", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class canvas: public Ui_canvas {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_ROAR_H diff --git a/libgui/ui_roar_about.h b/libgui/ui_roar_about.h new file mode 100755 index 0000000..bafabb0 --- /dev/null +++ b/libgui/ui_roar_about.h @@ -0,0 +1,84 @@ +/******************************************************************************** +** Form generated from reading UI file 'roar_about.ui' +** +** Created by: Qt User Interface Compiler version 5.12.5 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_ROAR_ABOUT_H +#define UI_ROAR_ABOUT_H + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_Dialog +{ +public: + QDialogButtonBox *buttonBox; + QPushButton *pushButton; + QLabel *label; + QGraphicsView *graphicsView; + + void setupUi(QDialog *Dialog) + { + if (Dialog->objectName().isEmpty()) + Dialog->setObjectName(QString::fromUtf8("Dialog")); + Dialog->setWindowModality(Qt::ApplicationModal); + Dialog->resize(546, 141); + Dialog->setContextMenuPolicy(Qt::DefaultContextMenu); + Dialog->setStyleSheet(QString::fromUtf8("color: rgb(0, 187, 0);\n" +"background-color: rgb(0, 0, 0);")); + Dialog->setModal(true); + buttonBox = new QDialogButtonBox(Dialog); + buttonBox->setObjectName(QString::fromUtf8("buttonBox")); + buttonBox->setGeometry(QRect(10, 600, 461, 32)); + buttonBox->setOrientation(Qt::Horizontal); + buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); + pushButton = new QPushButton(Dialog); + pushButton->setObjectName(QString::fromUtf8("pushButton")); + pushButton->setGeometry(QRect(250, 100, 160, 32)); + pushButton->setStyleSheet(QString::fromUtf8("color: rgb(0, 0, 0);\n" +"background-color: rgb(233, 233, 233);")); + label = new QLabel(Dialog); + label->setObjectName(QString::fromUtf8("label")); + label->setGeometry(QRect(140, 10, 401, 71)); + label->setAlignment(Qt::AlignHCenter|Qt::AlignTop); + graphicsView = new QGraphicsView(Dialog); + graphicsView->setObjectName(QString::fromUtf8("graphicsView")); + graphicsView->setGeometry(QRect(10, 10, 121, 121)); + + retranslateUi(Dialog); + QObject::connect(buttonBox, SIGNAL(accepted()), Dialog, SLOT(accept())); + QObject::connect(buttonBox, SIGNAL(rejected()), Dialog, SLOT(reject())); + + QMetaObject::connectSlotsByName(Dialog); + } // setupUi + + void retranslateUi(QDialog *Dialog) + { + Dialog->setWindowTitle(QApplication::translate("Dialog", "About roar", nullptr)); + pushButton->setText(QApplication::translate("Dialog", "roar!", nullptr)); + label->setText(QApplication::translate("Dialog", "roar -- mIRC art editor for Windows & Linux\n" +"__ROAR_RELEASE_VERSION__\n" +"https://www.github.com/lalbornoz/roar/\n" +"Copyright (c) 2018, 2019 Lucio Andr\303\251s Illanes Albornoz \n" +"https://www.lucioillanes.de", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class Dialog: public Ui_Dialog {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_ROAR_ABOUT_H diff --git a/librtl/rtldef.hpp b/librtl/rtldef.hpp new file mode 100644 index 0000000..08bb721 --- /dev/null +++ b/librtl/rtldef.hpp @@ -0,0 +1,150 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _RTLDEF_HPP_ +#define _RTLDEF_HPP_ + +#ifdef _MSC_VER +#pragma warning(disable : 26812) +#endif /* _MSC_VER_ */ + +#include +#include +#include + +namespace Rtl { + +/* + * Public Either definitions + */ + +template +struct Either { + T1 left; T2 right; + + Either(T1 left, T2 right) : left {left}, right {right} {}; + constexpr operator T1() const { return this->left; }; + constexpr operator T2() const { return this->right; }; +}; + +/* + * Public {STATUS,Status} definitions + */ + +typedef uint32_t STATUS_COND; + +typedef enum tagSTATUS_FACILITY { + SFACILITY_NONE = 0, + SFACILITY_POSIX = 1, +#ifdef _WIN32 + SFACILITY_WINDOWS = 2, +#endif /* _WIN32 */ + SFACILITY_ROAR = 3, +} STATUS_FACILITY; + +typedef enum tagSTATUS_SEVERITY : unsigned long { + SSEVERITY_WARNING = 0, + SSEVERITY_SUCCESS = 1, + SSEVERITY_ERROR = 2, + SSEVERITY_INFO = 3, + SSEVERITY_SEVERE = 4, +} STATUS_SEVERITY; + +constexpr STATUS_SEVERITY operator&(STATUS_SEVERITY lhs, STATUS_SEVERITY rhs) { + return static_cast(static_cast(lhs) & static_cast(rhs)); +}; + +typedef struct tagStatus { + STATUS_COND cond; + STATUS_FACILITY facility; + STATUS_SEVERITY severity; +#ifdef _WIN32 + std::wstring msg; +#elif defined(__linux__) + std::string msg; +#endif /* defined(_WIN32), defined(__linux__) */ + + tagStatus() : cond(0), facility(SFACILITY_NONE), severity(SSEVERITY_SUCCESS) {}; + tagStatus(STATUS_SEVERITY severity) : cond(0), facility(SFACILITY_NONE), severity(severity) {}; + tagStatus(STATUS_FACILITY facility, STATUS_SEVERITY severity); + tagStatus(STATUS_COND cond, STATUS_FACILITY facility, STATUS_SEVERITY severity) : cond(cond), facility(facility), severity(severity) {}; +#ifdef _WIN32 + tagStatus(STATUS_FACILITY facility, STATUS_SEVERITY severity, const std::wstring& msg) : cond(0), facility(facility), severity(severity), msg(msg) {}; +#elif defined(__linux__) + tagStatus(STATUS_FACILITY facility, STATUS_SEVERITY severity, const std::string& msg) : cond(0), facility(facility), severity(severity), msg(msg) {}; +#endif /* defined(_WIN32), defined(__linux__) */ +#ifndef __GNUC__ + constexpr explicit operator bool() const { return (this->severity & 1); }; +#else + explicit operator bool() const { return (this->severity & 1); }; +#endif /* __GNUC__ */ +} STATUS; + +#define STATUS_BIND_LIBC(status, expr)\ + [&]() { auto tmp = (expr); if (tmp < 0) { (status) = Rtl::STATUS_POSIX_ERRNO(); return false; } else { return true; }}() +#define STATUS_BIND_ROAR(status, error, expr)\ + [&]() { auto tmp = (expr); if (!tmp) { (status) = Rtl::STATUS_ROAR(error); return false; } else { return true; }}() +#define STATUS_BIND_TRUE(expr) [&]() { (expr); return true; }() +#define STATUS_NONE_SUCCESS STATUS(0, Rtl::SFACILITY_NONE, Rtl::SSEVERITY_SUCCESS) +#define STATUS_POSIX(cond_) STATUS(cond_, Rtl::SFACILITY_POSIX, Rtl::SSEVERITY_ERROR) +#define STATUS_POSIX_ERRNO() STATUS((unsigned long)errno, Rtl::SFACILITY_POSIX, Rtl::SSEVERITY_ERROR) +#ifdef _WIN32 +#define STATUS_ROAR(msg_) STATUS(Rtl::SFACILITY_ROAR, Rtl::SSEVERITY_ERROR, L ## msg_) +#elif defined(__linux__) +#define STATUS_ROAR(msg_) STATUS(Rtl::SFACILITY_ROAR, Rtl::SSEVERITY_ERROR, (msg_)) +#endif /* defined(_WIN32), defined(__linux__) */ +#ifdef _WIN32 +#define STATUS_WINDOWS(cond_) STATUS(cond_, Rtl::SFACILITY_WINDOWS, Rtl::SSEVERITY_ERROR) +#define STATUS_WINDOWS_GLE() STATUS(GetLastError(), Rtl::SFACILITY_WINDOWS, Rtl::SSEVERITY_ERROR) +#endif /* _WIN32 */ + +template +struct Status : public Either { + Status(STATUS& left, T right) : Either(left, right) {}; + constexpr explicit operator bool() const { return (bool)this->left; } + constexpr operator STATUS() const { return this->left; } + + template + constexpr Status& operator=(const Status& rhs) { + return this->left = rhs.left, this->right = rhs.right, *this; + } +}; + +template +constexpr Status tie(STATUS& left, T& right) { + return Status(left, right); +} + +/* + * Public macros and subroutine prototypes + */ + +bool convert_wstring(STATUS *pstatus, const std::wstring& ws, std::string& s); +bool convert_cstring(STATUS *pstatus, const std::string& s, std::wstring& ws); +#ifdef _WIN32 +const std::wstring perror(STATUS status); +#elif defined(__linux__) +const std::string perror(STATUS status); +#endif /* defined(_WIN32), defined(__linux__) */ +#define setfillw(c, n) std::setfill((c)) << std::setw(n) +std::chrono::high_resolution_clock::time_point timeBegin(); +void timeEnd(const char *pfx, std::chrono::high_resolution_clock::time_point t0); + +} + +#endif /* _RTLDEF_HPP_ */ diff --git a/librtl/subr_rtl.cpp b/librtl/subr_rtl.cpp new file mode 100644 index 0000000..0b6aa53 --- /dev/null +++ b/librtl/subr_rtl.cpp @@ -0,0 +1,176 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "rtldef.hpp" + +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + +namespace Rtl { + +/* + * Public class methods + */ + +tagStatus::tagStatus( + STATUS_FACILITY facility, + STATUS_SEVERITY severity +) +{ + if ((severity == SSEVERITY_ERROR) && (facility == SFACILITY_POSIX)) + this->cond = errno; +#ifdef _WIN32 + else if ((severity == SSEVERITY_ERROR) && (facility == SFACILITY_WINDOWS)) + this->cond = GetLastError(); +#endif /* _WIN32 */ + this->facility = facility, this->severity = severity; +} + +/* + * Public functions + */ + +bool +convert_wstring(STATUS *pstatus, const std::wstring& ws, std::string& s) +{ + int size_new; + STATUS status = STATUS_NONE_SUCCESS; + const wchar_t *ws_c_str; + size_t ws_len; + +#ifdef _WIN32 + if (!(size_new = WideCharToMultiByte(CP_UTF8, 0, (ws_c_str = ws.c_str()), (int)(ws_len = ws.length() + 1), NULL, 0, NULL, NULL))) + status = STATUS_WINDOWS_GLE(); +#elif defined(__linux__) + if (!(size_new = wcstombs(NULL, (ws_c_str = ws.c_str()), (ws_len = ws.length() + 1)))) + status = STATUS_POSIX_ERRNO(); +#endif /* defined(_WIN32), defined(__linux__) */ + else { + try { + s.resize(size_new); +#ifdef _WIN32 + if (!WideCharToMultiByte(CP_UTF8, 0, ws_c_str, (int)ws_len, &s[0], size_new, NULL, NULL)) + status = STATUS_WINDOWS_GLE(); +#elif defined(__linux__) + if (!wcstombs(&s[0], ws_c_str, ws_len)) + status = STATUS_POSIX_ERRNO(); +#endif /* defined(_WIN32), defined(__linux__) */ + else + s.resize(size_new - 1); + } + catch (std::bad_alloc) { + status = STATUS_POSIX(ENOMEM); + } + } + return (bool)(*pstatus = status); +} + +bool +convert_cstring(STATUS *pstatus, const std::string& s, std::wstring& ws) +{ + const char *s_c_str; + int size_new; + size_t s_len; + STATUS status = STATUS_NONE_SUCCESS; + +#ifdef _WIN32 + if (!(size_new = MultiByteToWideChar(CP_UTF8, 0, (s_c_str = s.c_str()), (int)(s_len = s.length() + 1), NULL, 0))) + status = STATUS_WINDOWS_GLE(); +#elif defined(__linux__) + if (!(size_new = mbstowcs(NULL, (s_c_str = s.c_str()), (s_len = s.length() + 1)))) + status = STATUS_POSIX_ERRNO(); +#endif /* defined(_WIN32), defined(__linux__) */ + else { + try { + ws.resize(size_new); +#ifdef _WIN32 + if (!MultiByteToWideChar(CP_UTF8, 0, s_c_str, (int)s_len, &ws[0], size_new)) + status = STATUS_WINDOWS_GLE(); +#elif defined(__linux__) + if (!mbstowcs(&ws[0], s_c_str, s_len)) + status = STATUS_POSIX_ERRNO(); +#endif /* defined(_WIN32), defined(__linux__) */ + else + ws.resize(size_new - 1); + } + catch (std::bad_alloc) { + status = STATUS_POSIX(ENOMEM); + } + } + return (bool)(*pstatus = status); +} + +#ifdef _WIN32 +const std::wstring +#elif defined(__linux__) +const std::string +#endif /* defined(_WIN32), defined(__linux__) */ +perror(STATUS status) +{ +#ifdef _WIN32 + const wchar_t *msg; +#endif /* _WIN32 */ + + if (status) +#ifdef _WIN32 + return L"success"; +#elif defined(__linux__) + return "success"; +#endif /* defined(_WIN32), defined(__linux__) */ + else switch (status.facility) { +#ifdef _WIN32 + case SFACILITY_POSIX: + return _wcserror(status.cond); + case SFACILITY_WINDOWS: + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, + status.cond, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&msg, 0, NULL); + return msg; +#elif defined(__linux__) + case SFACILITY_POSIX: + return strerror(status.cond); +#endif /* defined(_WIN32), defined(__linux__) */ + case SFACILITY_ROAR: + return status.msg; + default: +#ifdef _WIN32 + return L"(unknown facility)"; +#elif defined(__linux__) + return "(unknown facility)"; +#endif /* defined(_WIN32), defined(__linux__) */ + } +} + +std::chrono::high_resolution_clock::time_point +timeBegin( +) +{ + return std::chrono::high_resolution_clock::now(); +} + +void +timeEnd( + const char * pfx, + std::chrono::high_resolution_clock::time_point t0 +) +{ + printf(pfx); + printf(": %.2f ms\n", (float)std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - t0).count()); +} + +} diff --git a/libtools/Tool.hpp b/libtools/Tool.hpp new file mode 100644 index 0000000..30d26a4 --- /dev/null +++ b/libtools/Tool.hpp @@ -0,0 +1,65 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOL_HPP_ +#define _TOOL_HPP_ + +#include +#include + +#include "../libcanvas/Canvas.hpp" + +/* + * Public types + */ + +class Tool { +public: + typedef enum drag_status_e { + DSTATUS_NONE = 0, + DSTATUS_BEGIN = 1, + DSTATUS_MOVE = 2, + DSTATUS_SET = 3, + } DRAG_STATUS; + typedef enum mouse_button_e { + MBUTTON_NONE = 0, + MBUTTON_LEFT = 1, + MBUTTON_MIDDLE = 2, + MBUTTON_RIGHT = 3, + } MOUSE_BUTTON; + typedef struct drag_state_e { + MOUSE_BUTTON button; + Canvas::POINT begin, set; + DRAG_STATUS status; + } DRAG_STATE; + #define DRAG_STATE_EMPTY Tool::MBUTTON_NONE, {0, 0}, {0, 0}, Tool::DSTATUS_NONE + typedef std::pair + TOOL_CELLS_PAIR; + typedef Rtl::Either + TOOL_CELLS; + + Tool(const std::wstring& name) : name(name) {}; + virtual TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) = 0; + virtual TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) = 0; + virtual TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) = 0; + virtual TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos) = 0; + + const std::wstring name; +}; + +#endif /* _TOOL_HPP_ */ diff --git a/libtools/ToolCircle.cpp b/libtools/ToolCircle.cpp new file mode 100644 index 0000000..909258d --- /dev/null +++ b/libtools/ToolCircle.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolCircle.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolCircle::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsCircle; + + (void)canvas; + cellsCircle.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsCircle)); +} diff --git a/libtools/ToolCircle.hpp b/libtools/ToolCircle.hpp new file mode 100644 index 0000000..ff07ed4 --- /dev/null +++ b/libtools/ToolCircle.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLCIRCLE_HPP_ +#define _TOOLCIRCLE_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolCircle : public Tool { +public: + ToolCircle() : Tool(L"Circle") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLCIRCLE_HPP_ */ diff --git a/libtools/ToolCursor.cpp b/libtools/ToolCursor.cpp new file mode 100644 index 0000000..4694e85 --- /dev/null +++ b/libtools/ToolCursor.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolCursor.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolCursor::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsCursor; + + (void)canvas; + cellsCursor.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsCursor)); +} diff --git a/libtools/ToolCursor.hpp b/libtools/ToolCursor.hpp new file mode 100644 index 0000000..4a21927 --- /dev/null +++ b/libtools/ToolCursor.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLCURSOR_HPP_ +#define _TOOLCURSOR_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolCursor : public Tool { +public: + ToolCursor() : Tool(L"Cursor") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLCURSOR_HPP_ */ diff --git a/libtools/ToolErase.cpp b/libtools/ToolErase.cpp new file mode 100644 index 0000000..a7816cd --- /dev/null +++ b/libtools/ToolErase.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolErase.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolErase::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsErase; + + (void)canvas; + cellsErase.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsErase)); +} diff --git a/libtools/ToolErase.hpp b/libtools/ToolErase.hpp new file mode 100644 index 0000000..4deab7e --- /dev/null +++ b/libtools/ToolErase.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLERASE_HPP_ +#define _TOOLERASE_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolErase : public Tool { +public: + ToolErase() : Tool(L"Erase") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLERASE_HPP_ */ diff --git a/libtools/ToolFill.cpp b/libtools/ToolFill.cpp new file mode 100644 index 0000000..64a7a29 --- /dev/null +++ b/libtools/ToolFill.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolFill.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolFill::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsFill; + + (void)canvas; + cellsFill.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsFill)); +} diff --git a/libtools/ToolFill.hpp b/libtools/ToolFill.hpp new file mode 100644 index 0000000..596e1b3 --- /dev/null +++ b/libtools/ToolFill.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLFILL_HPP_ +#define _TOOLFILL_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolFill : public Tool { +public: + ToolFill() : Tool(L"Fill") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLFILL_HPP_ */ diff --git a/libtools/ToolLine.cpp b/libtools/ToolLine.cpp new file mode 100644 index 0000000..1290f72 --- /dev/null +++ b/libtools/ToolLine.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolLine.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolLine::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsLine; + + (void)canvas; + cellsLine.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsLine)); +} diff --git a/libtools/ToolLine.hpp b/libtools/ToolLine.hpp new file mode 100644 index 0000000..b6224dc --- /dev/null +++ b/libtools/ToolLine.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLLINE_HPP_ +#define _TOOLLINE_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolLine : public Tool { +public: + ToolLine() : Tool(L"Line") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLLINE_HPP_ */ diff --git a/libtools/ToolObject.cpp b/libtools/ToolObject.cpp new file mode 100644 index 0000000..3f9e16a --- /dev/null +++ b/libtools/ToolObject.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolObject.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolObject::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsObject; + + (void)canvas; + cellsObject.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsObject)); +} diff --git a/libtools/ToolObject.hpp b/libtools/ToolObject.hpp new file mode 100644 index 0000000..fde0ad0 --- /dev/null +++ b/libtools/ToolObject.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLOBJECT_HPP_ +#define _TOOLOBJECT_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolObject : public Tool { +public: + ToolObject() : Tool(L"Object") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLOBJECT_HPP_ */ diff --git a/libtools/ToolPickColour.cpp b/libtools/ToolPickColour.cpp new file mode 100644 index 0000000..cfb184b --- /dev/null +++ b/libtools/ToolPickColour.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolPickColour.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolPickColour::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsPickColour; + + (void)canvas; + cellsPickColour.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsPickColour)); +} diff --git a/libtools/ToolPickColour.hpp b/libtools/ToolPickColour.hpp new file mode 100644 index 0000000..5628d71 --- /dev/null +++ b/libtools/ToolPickColour.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLPICKCOLOUR_HPP_ +#define _TOOLPICKCOLOUR_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolPickColour : public Tool { +public: + ToolPickColour() : Tool(L"Pick colour") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLPICKCOLOUR_HPP_ */ diff --git a/libtools/ToolRect.cpp b/libtools/ToolRect.cpp new file mode 100644 index 0000000..1614791 --- /dev/null +++ b/libtools/ToolRect.cpp @@ -0,0 +1,119 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolRect.hpp" + +/* + * Private subroutine prototypes + */ + +static Canvas::CELL_LIST drawRect(Canvas::BRUSH brush, Canvas::RECT rect); + +/* + * Private subroutines + */ + +static Canvas::CELL_LIST +drawRect( + Canvas::BRUSH brush, + Canvas::RECT rect +) +{ + Canvas::CELL_LIST cells; + Canvas::COLOUR colour; + + for (Canvas::COORD y = rect.p0.y, y_limit = (rect.p1.y + 1); y < y_limit; y++) { + for (Canvas::COORD x = rect.p0.x, x_limit = (rect.p1.x + 1); x < x_limit; x++) { + if (((x == rect.p0.x) || ((x_limit > x) && (x == (x_limit - 1)))) + || ((y == rect.p0.y) || ((y_limit > y) && (y == (y_limit - 1))))) + colour = brush.colours.fg; + else + colour = brush.colours.bg; + cells.push_back(Canvas::CELL{Canvas::CATTR_NONE, colour, colour, {x, y}, L" "}); + } + } + return cells; +} + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolRect::click( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + Tool::MOUSE_BUTTON button, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cells; + Canvas::RECT rect{pos, {pos.x + brush.size.w, pos.y + brush.size.h}}; + + (void)canvas; + brushPos = pos; + if (button == Tool::MBUTTON_RIGHT) + std::swap(brush.colours.bg, brush.colours.fg); + cells = drawRect(brush, rect); + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(cells, cells)); +} + +Tool::TOOL_CELLS +ToolRect::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::RECT rect{pos, {pos.x + brush.size.w, pos.y + brush.size.h}}; + + (void)canvas; + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), drawRect(brush, rect))); +} + +Tool::TOOL_CELLS +ToolRect::drag( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + DRAG_STATE dragState, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cells, cellsCursor; + + (void)canvas; + switch (dragState.status) { + case Tool::DSTATUS_BEGIN: + case Tool::DSTATUS_MOVE: + if (dragState.button == Tool::MBUTTON_RIGHT) + std::swap(brush.colours.bg, brush.colours.fg); + cellsCursor = drawRect(brush, Canvas::RECT{dragState.begin, pos}); break; + case Tool::DSTATUS_SET: + if (dragState.button == Tool::MBUTTON_RIGHT) + std::swap(brush.colours.bg, brush.colours.fg); + cells = cellsCursor = drawRect(brush, Canvas::RECT{dragState.begin, dragState.set}); break; + default: + break; + } + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(cells, cellsCursor)); +} diff --git a/libtools/ToolRect.hpp b/libtools/ToolRect.hpp new file mode 100644 index 0000000..5e69bff --- /dev/null +++ b/libtools/ToolRect.hpp @@ -0,0 +1,41 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLRECT_HPP_ +#define _TOOLRECT_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolRect : public Tool { +public: + ToolRect() : Tool(L"Rectangle") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos); + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLRECT_HPP_ */ diff --git a/libtools/ToolText.cpp b/libtools/ToolText.cpp new file mode 100644 index 0000000..a94794d --- /dev/null +++ b/libtools/ToolText.cpp @@ -0,0 +1,39 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ToolText.hpp" + +/* + * Public class functions + */ + +Tool::TOOL_CELLS +ToolText::cursor( + Canvas::BRUSH brush, + Canvas::POINT& brushPos, + const Canvas& canvas, + Canvas::POINT pos +) +{ + Canvas::CELL_LIST cellsText; + + (void)canvas; + cellsText.push_back(Canvas::CELL{Canvas::CATTR_NONE, brush.colours.fg, brush.colours.fg, pos, L" "}); + brushPos = pos; + return Tool::TOOL_CELLS(true, Tool::TOOL_CELLS_PAIR(Canvas::CELL_LIST(), cellsText)); +} diff --git a/libtools/ToolText.hpp b/libtools/ToolText.hpp new file mode 100644 index 0000000..c0bce59 --- /dev/null +++ b/libtools/ToolText.hpp @@ -0,0 +1,47 @@ +/* + * roar -- mIRC art editor for Windows & Linux + * Copyright (C) 2018, 2019 Lucio Andrés Illanes Albornoz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TOOLTEXT_HPP_ +#define _TOOLTEXT_HPP_ + +#include "Tool.hpp" + +/* + * Public types + */ + +class ToolText : public Tool { +public: + ToolText() : Tool(L"Text") {}; + + TOOL_CELLS click(Canvas::BRUSH brush, Canvas::POINT& brushPos, Tool::MOUSE_BUTTON button, const Canvas& canvas, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)button, (void)canvas, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS cursor(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, Canvas::POINT pos); + TOOL_CELLS drag(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, DRAG_STATE dragState, Canvas::POINT pos) { + (void)brush, (void)brushPos, (void)canvas, (void)dragState, (void)pos; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; + TOOL_CELLS key(Canvas::BRUSH brush, Canvas::POINT& brushPos, const Canvas& canvas, wchar_t key, wchar_t modifiers) { + (void)brush, (void)brushPos, (void)canvas, (void)key, (void)modifiers; + return TOOL_CELLS(false, TOOL_CELLS_PAIR(Canvas::CELL_LIST(), Canvas::CELL_LIST())); + }; +}; + +#endif /* _TOOLTEXT_HPP_ */ diff --git a/release b/release new file mode 120000 index 0000000..72b4463 --- /dev/null +++ b/release @@ -0,0 +1 @@ +libgui/release \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 120000 index 06d6b82..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -assets/text/requirements.txt \ No newline at end of file diff --git a/roar-python/assets b/roar-python/assets new file mode 120000 index 0000000..ec2e4be --- /dev/null +++ b/roar-python/assets @@ -0,0 +1 @@ +../assets \ No newline at end of file diff --git a/libcanvas/Canvas.py b/roar-python/libcanvas/Canvas.py similarity index 100% rename from libcanvas/Canvas.py rename to roar-python/libcanvas/Canvas.py diff --git a/libcanvas/CanvasColours.py b/roar-python/libcanvas/CanvasColours.py similarity index 100% rename from libcanvas/CanvasColours.py rename to roar-python/libcanvas/CanvasColours.py diff --git a/libcanvas/CanvasExportStore.py b/roar-python/libcanvas/CanvasExportStore.py similarity index 100% rename from libcanvas/CanvasExportStore.py rename to roar-python/libcanvas/CanvasExportStore.py diff --git a/libcanvas/CanvasImportStore.py b/roar-python/libcanvas/CanvasImportStore.py similarity index 100% rename from libcanvas/CanvasImportStore.py rename to roar-python/libcanvas/CanvasImportStore.py diff --git a/libgui/GuiCanvasColours.py b/roar-python/libgui/GuiCanvasColours.py similarity index 100% rename from libgui/GuiCanvasColours.py rename to roar-python/libgui/GuiCanvasColours.py diff --git a/libgui/GuiCanvasWxBackend.py b/roar-python/libgui/GuiCanvasWxBackend.py similarity index 100% rename from libgui/GuiCanvasWxBackend.py rename to roar-python/libgui/GuiCanvasWxBackend.py diff --git a/libgui/GuiCanvasWxBackendFast.cpp b/roar-python/libgui/GuiCanvasWxBackendFast.cpp similarity index 100% rename from libgui/GuiCanvasWxBackendFast.cpp rename to roar-python/libgui/GuiCanvasWxBackendFast.cpp diff --git a/libgui/GuiFrame.py b/roar-python/libgui/GuiFrame.py similarity index 100% rename from libgui/GuiFrame.py rename to roar-python/libgui/GuiFrame.py diff --git a/libgui/GuiWindow.py b/roar-python/libgui/GuiWindow.py similarity index 100% rename from libgui/GuiWindow.py rename to roar-python/libgui/GuiWindow.py diff --git a/liboperators/Operator.py b/roar-python/liboperators/Operator.py similarity index 100% rename from liboperators/Operator.py rename to roar-python/liboperators/Operator.py diff --git a/liboperators/OperatorFlipHorizontal.py b/roar-python/liboperators/OperatorFlipHorizontal.py similarity index 100% rename from liboperators/OperatorFlipHorizontal.py rename to roar-python/liboperators/OperatorFlipHorizontal.py diff --git a/liboperators/OperatorFlipVertical.py b/roar-python/liboperators/OperatorFlipVertical.py similarity index 100% rename from liboperators/OperatorFlipVertical.py rename to roar-python/liboperators/OperatorFlipVertical.py diff --git a/liboperators/OperatorInvert.py b/roar-python/liboperators/OperatorInvert.py similarity index 100% rename from liboperators/OperatorInvert.py rename to roar-python/liboperators/OperatorInvert.py diff --git a/liboperators/OperatorRotate.py b/roar-python/liboperators/OperatorRotate.py similarity index 100% rename from liboperators/OperatorRotate.py rename to roar-python/liboperators/OperatorRotate.py diff --git a/liboperators/OperatorTile.py b/roar-python/liboperators/OperatorTile.py similarity index 100% rename from liboperators/OperatorTile.py rename to roar-python/liboperators/OperatorTile.py diff --git a/libroar/RoarAssetsWindow.py b/roar-python/libroar/RoarAssetsWindow.py similarity index 100% rename from libroar/RoarAssetsWindow.py rename to roar-python/libroar/RoarAssetsWindow.py diff --git a/libroar/RoarCanvasCommands.py b/roar-python/libroar/RoarCanvasCommands.py similarity index 100% rename from libroar/RoarCanvasCommands.py rename to roar-python/libroar/RoarCanvasCommands.py diff --git a/libroar/RoarCanvasCommandsEdit.py b/roar-python/libroar/RoarCanvasCommandsEdit.py similarity index 100% rename from libroar/RoarCanvasCommandsEdit.py rename to roar-python/libroar/RoarCanvasCommandsEdit.py diff --git a/libroar/RoarCanvasCommandsFile.py b/roar-python/libroar/RoarCanvasCommandsFile.py similarity index 100% rename from libroar/RoarCanvasCommandsFile.py rename to roar-python/libroar/RoarCanvasCommandsFile.py diff --git a/libroar/RoarCanvasCommandsHelp.py b/roar-python/libroar/RoarCanvasCommandsHelp.py similarity index 100% rename from libroar/RoarCanvasCommandsHelp.py rename to roar-python/libroar/RoarCanvasCommandsHelp.py diff --git a/libroar/RoarCanvasCommandsOperators.py b/roar-python/libroar/RoarCanvasCommandsOperators.py similarity index 100% rename from libroar/RoarCanvasCommandsOperators.py rename to roar-python/libroar/RoarCanvasCommandsOperators.py diff --git a/libroar/RoarCanvasCommandsTools.py b/roar-python/libroar/RoarCanvasCommandsTools.py similarity index 100% rename from libroar/RoarCanvasCommandsTools.py rename to roar-python/libroar/RoarCanvasCommandsTools.py diff --git a/libroar/RoarCanvasWindow.py b/roar-python/libroar/RoarCanvasWindow.py similarity index 100% rename from libroar/RoarCanvasWindow.py rename to roar-python/libroar/RoarCanvasWindow.py diff --git a/libroar/RoarClient.py b/roar-python/libroar/RoarClient.py similarity index 100% rename from libroar/RoarClient.py rename to roar-python/libroar/RoarClient.py diff --git a/libroar/RoarWindowAbout.py b/roar-python/libroar/RoarWindowAbout.py similarity index 100% rename from libroar/RoarWindowAbout.py rename to roar-python/libroar/RoarWindowAbout.py diff --git a/libroar/RoarWindowMelp.py b/roar-python/libroar/RoarWindowMelp.py similarity index 100% rename from libroar/RoarWindowMelp.py rename to roar-python/libroar/RoarWindowMelp.py diff --git a/librtl/IrcClient.py b/roar-python/librtl/IrcClient.py similarity index 100% rename from librtl/IrcClient.py rename to roar-python/librtl/IrcClient.py diff --git a/librtl/Rtl.py b/roar-python/librtl/Rtl.py similarity index 100% rename from librtl/Rtl.py rename to roar-python/librtl/Rtl.py diff --git a/librtl/RtlPlatform.py b/roar-python/librtl/RtlPlatform.py similarity index 100% rename from librtl/RtlPlatform.py rename to roar-python/librtl/RtlPlatform.py diff --git a/libtools/Tool.py b/roar-python/libtools/Tool.py similarity index 100% rename from libtools/Tool.py rename to roar-python/libtools/Tool.py diff --git a/libtools/ToolCircle.py b/roar-python/libtools/ToolCircle.py similarity index 100% rename from libtools/ToolCircle.py rename to roar-python/libtools/ToolCircle.py diff --git a/libtools/ToolErase.py b/roar-python/libtools/ToolErase.py similarity index 100% rename from libtools/ToolErase.py rename to roar-python/libtools/ToolErase.py diff --git a/libtools/ToolFill.py b/roar-python/libtools/ToolFill.py similarity index 100% rename from libtools/ToolFill.py rename to roar-python/libtools/ToolFill.py diff --git a/libtools/ToolLine.py b/roar-python/libtools/ToolLine.py similarity index 100% rename from libtools/ToolLine.py rename to roar-python/libtools/ToolLine.py diff --git a/libtools/ToolObject.py b/roar-python/libtools/ToolObject.py similarity index 100% rename from libtools/ToolObject.py rename to roar-python/libtools/ToolObject.py diff --git a/libtools/ToolPickColour.py b/roar-python/libtools/ToolPickColour.py similarity index 100% rename from libtools/ToolPickColour.py rename to roar-python/libtools/ToolPickColour.py diff --git a/libtools/ToolRect.py b/roar-python/libtools/ToolRect.py similarity index 100% rename from libtools/ToolRect.py rename to roar-python/libtools/ToolRect.py diff --git a/libtools/ToolText.py b/roar-python/libtools/ToolText.py similarity index 100% rename from libtools/ToolText.py rename to roar-python/libtools/ToolText.py diff --git a/roar.py b/roar-python/roar.py similarity index 98% rename from roar.py rename to roar-python/roar.py index 88b0782..65ea5d0 100755 --- a/roar.py +++ b/roar-python/roar.py @@ -17,7 +17,7 @@ import wx def main(*argv): localConfDirName = getLocalConfPathName() if not os.path.exists(localConfDirName): - os.makedirs(localConfirName) + os.makedirs(localConfDirName) wxApp, roarClient = wx.App(False), RoarClient(None) argv0, argv = argv[0], argv[1:] roarClient.canvasPanel.commands._recentDirLoad(); roarClient.canvasPanel.commands._recentLoad(); diff --git a/roar-vs.sln b/roar-vs.sln new file mode 100644 index 0000000..c4a51ca --- /dev/null +++ b/roar-vs.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29424.173 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "roar-vs", "roar-vs\roar.vcxproj", "{3674056B-692E-44B9-8A3A-F540FFB3AE18}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Debug|x64.ActiveCfg = Debug|x64 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Debug|x64.Build.0 = Debug|x64 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Debug|x86.ActiveCfg = Debug|Win32 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Debug|x86.Build.0 = Debug|Win32 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Release|x64.ActiveCfg = Release|x64 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Release|x64.Build.0 = Release|x64 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Release|x86.ActiveCfg = Release|Win32 + {3674056B-692E-44B9-8A3A-F540FFB3AE18}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1942FCCE-6CFD-44F1-95E0-B53D2E3B50C3} + EndGlobalSection +EndGlobal diff --git a/roar-vs/roar.vcxproj b/roar-vs/roar.vcxproj new file mode 100644 index 0000000..ca9f662 --- /dev/null +++ b/roar-vs/roar.vcxproj @@ -0,0 +1,194 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {3674056B-692E-44B9-8A3A-F540FFB3AE18} + Win32Proj + + + + Makefile + true + v142 + + + Makefile + false + v142 + + + Makefile + true + v142 + + + Makefile + false + v142 + + + + + + + + + + + + + + + + + + + + + cd libgui && nmake -f Makefile.Debug all + debug\roar.exe + cd libgui && nmake -f Makefile.Debug clean + cd libgui && nmake -f Makefile.Debug all clean + DEBUG;_DEBUG;UNICODE;WIN32;_DEBUG;$(NMakePreprocessorDefinitions) + C:\Qt\5.12.5\msvc2017_64\include;$(NMakeIncludeSearchPath) + + + cd ..\libgui && nmake -f Makefile.Debug all + debug\roar.exe + cd ..\libgui && nmake -f Makefile.Debug clean + cd ..\libgui && nmake -f Makefile.Debug all clean + DEBUG;_DEBUG;UNICODE;_DEBUG;$(NMakePreprocessorDefinitions) + C:\Qt\5.12.5\msvc2017_64\include;$(NMakeIncludeSearchPath) + $(VC_SourcePath);$(ProjectPath);$(ProjectPath)\libcanvas;$(ProjectPath)\libgui;$(ProjectPath)\librtl + + + cd libgui && nmake -f Makefile.Debug all + debug\roar.exe + cd libgui && nmake -f Makefile.Debug clean + cd libgui && nmake -f Makefile.Debug all clean + DEBUG;_DEBUG;UNICODE;WIN32;NDEBUG;$(NMakePreprocessorDefinitions) + C:\Qt\5.12.5\msvc2017_64\include;$(NMakeIncludeSearchPath) + + + cd ..\libgui && nmake -f Makefile.Release all + ..\release\roar.exe + cd ..\libgui && nmake -f Makefile.Release clean + cd ..\libgui && nmake -f Makefile.Release all clean + UNICODE;$(NMakePreprocessorDefinitions) + C:\Qt\5.12.5\msvc2017_64\include;$(NMakeIncludeSearchPath) + $(VC_SourcePath);$(ProjectPath);$(ProjectPath)\libcanvas;$(ProjectPath)\libgui;$(ProjectPath)\librtl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C:\Qt\5.12.5\msvc2017_64\include;$(IncludePath) + C:\Qt\5.12.5\msvc2017_64\include;$(CAExcludePath) + + + + \ No newline at end of file diff --git a/roar-vs/roar.vcxproj.filters b/roar-vs/roar.vcxproj.filters new file mode 100644 index 0000000..74742b9 --- /dev/null +++ b/roar-vs/roar.vcxproj.filters @@ -0,0 +1,268 @@ + + + + + {6e37976b-044e-4179-b019-74db52729a10} + + + {1e8dd17b-d6ed-4fd8-913b-34f993cc5920} + + + {d6b1ff75-b7aa-4b7c-bbce-20091145029d} + + + {cbe0335f-fac3-405f-aeaa-39d2564371bb} + + + {4add3d1d-9549-40df-9847-d1295fb5405c} + + + {75543269-0692-40a2-9378-60a82b70c1e5} + + + {3e36d6d9-4cf5-4b33-bd13-6034f56f75c7} + + + + + Python Files + + + libcanvas + + + libcanvas + + + libcanvas + + + libgui + + + libgui + + + libgui + + + librtl + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + + + Qt Files + + + Qt Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Python Files + + + Text Files + + + Text Files + + + Qt Files + + + + + libcanvas + + + libgui + + + libgui + + + libgui + + + librtl + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + libtools + + + + + Text Files + + + Text Files + + + \ No newline at end of file diff --git a/roar-vs/roar.vcxproj.user b/roar-vs/roar.vcxproj.user new file mode 100644 index 0000000..b7e775e --- /dev/null +++ b/roar-vs/roar.vcxproj.user @@ -0,0 +1,14 @@ + + + + $(ProjectDir)\.. + WindowsLocalDebugger + $(ProjectDir)\..\debug\roar.exe + assets\text\spoke-vxplion.txt + + + $(ProjectDir)\..\release\roar.exe + $(ProjectDir)\.. + WindowsLocalDebugger + + \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100755 index dc1591d..0000000 --- a/setup.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -# -# roar.py -- mIRC art editor for Windows & Linux -# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz -# - -from distutils.core import setup - -setup( - author_email="lucio@lucioillanes.de", - author="Lucio Andrés Illanes Albornoz", - description="mIRC art editor for Windows & Linux", - include_package_data=True, - install_requires=("requests==2.22.0", "urllib3==1.25.3", "wxPython==4.0.6"), - license="MIT", - name="roar", - package_data={"": ["assets/*/*", "LICENCE", "README.md"]}, - packages=(".", "assets", "libcanvas", "libgui", "libroar", "librtl", "libtools"), - url="https://github.com/lalbornoz/roar/", - version="3.1") - -# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120