From 70a5bc234a195122ef6ecd62849bcfe766c16ef5 Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Sat, 19 May 2018 00:37:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BB=D0=B8?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=B8=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BA=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=8F=D0=BC=20#1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Applications.cfg | 1091 ----- Applications/3DPrint/3DPrint.lua | 28 +- Applications/3DTest/3DTest.lua | 8 +- Applications/AppMarket/Main.lua | 172 +- Applications/Braille/Main.lua | 30 +- Applications/Camera/Main.lua | 14 +- Applications/Chat.lua | 251 - Applications/Control/Main.lua | 2 +- Applications/Control/Modules/1.lua | 8 +- Applications/Control/Modules/2.lua | 10 +- Applications/Control/Modules/3.lua | 30 +- Applications/Control/Modules/4.lua | 6 +- Applications/Finder/Main.lua | 36 +- Applications/FlappyBird/FlappyBird.lua | 22 +- Applications/GeoScan2/Main.lua | 14 +- Applications/Graph2/Main.lua | 18 +- Applications/HEX/Main.lua | 54 +- Applications/HoloClock/HoloClock.lua | 10 +- Applications/MineCodeIDE/Main.lua | 164 +- Applications/Palette/Palette.lua | 6 +- Applications/PictureEdit/Main.lua | 54 +- Applications/PictureEdit/Tools/1.lua | 20 +- Applications/PictureEdit/Tools/3.lua | 2 +- Applications/PictureEdit/Tools/7.lua | 2 +- Applications/Png.lua | 132 - Applications/PrintImage/Main.lua | 22 +- Applications/RayWalk/Main.lua | 30 +- Applications/Stargate/Main.lua | 34 +- Applications/Symbols/Main.lua | 18 +- Applications/Translate/Main.lua | 7 +- Applications/Update.paste | 1 - Applications/Weather/Weather.lua | 16 +- Applications/convertImage.lua | 27 - Applications/palette.lua | 9 - Applications/scale.lua | 17 - Documentation/Russian/GUI.md | 1987 ++++++++ Documentation/Russian/MineOSInterface.md | 171 + Documentation/Russian/advancedLua.md | 407 ++ Documentation/Russian/archive.md | 20 + Documentation/Russian/color.md | 103 + Documentation/Russian/doubleBuffering.md | 387 ++ Files.cfg | 178 +- .../.idea/artifacts/ImageConverter_jar.xml | 8 - .../.idea/codeStyles/codeStyleConfig.xml | 5 - ImageConverter/.idea/compiler.xml | 23 - ImageConverter/.idea/description.html | 2 - ImageConverter/.idea/encodings.xml | 5 - ImageConverter/.idea/gradle.xml | 7 - ImageConverter/.idea/kotlinc.xml | 7 - ImageConverter/.idea/misc.xml | 12 - ImageConverter/.idea/modules.xml | 8 - ImageConverter/.idea/uiDesigner.xml | 125 - ImageConverter/.idea/vcs.xml | 7 - ImageConverter/.idea/workspace.xml | 967 ---- ImageConverter/ImageConverter.iml | 12 - ImageConverter/README.md | 5 - .../ImageConverter_jar/ImageConverter.jar | Bin 3314863 -> 0 bytes .../ImageConverter/META-INF/MANIFEST.MF | 3 - .../ImageConverter/sample/Color.class | Bin 1529 -> 0 bytes .../ImageConverter/sample/Image.class | Bin 9429 -> 0 bytes .../ImageConverter/sample/ImageConverter.fxml | 221 - .../ImageConverter/sample/Main$1.class | Bin 1316 -> 0 bytes .../ImageConverter/sample/Main$2$1.class | Bin 1107 -> 0 bytes .../ImageConverter/sample/Main$2.class | Bin 1234 -> 0 bytes .../ImageConverter/sample/Main.class | Bin 14427 -> 0 bytes .../ImageConverter/sample/OCIF.class | Bin 6079 -> 0 bytes .../ImageConverter/sample/Palette.class | Bin 4120 -> 0 bytes .../ImageConverter/sample/Pixel.class | Bin 545 -> 0 bytes .../sample/Resources/Background.png | Bin 3088253 -> 0 bytes .../ImageConverter/sample/Resources/Cells.png | Bin 15846 -> 0 bytes .../ImageConverter/sample/Resources/Files.png | Bin 30800 -> 0 bytes .../ImageConverter/sample/Resources/Files.psd | Bin 1180111 -> 0 bytes .../sample/Resources/StringResult.png | Bin 20635 -> 0 bytes .../sample/Resources/StringResult.psd | Bin 71392 -> 0 bytes .../sample/Resources/StringResultButton.psd | Bin 2126007 -> 0 bytes .../sample/Resources/StringResultDefault.png | Bin 17649 -> 0 bytes .../sample/Resources/StringResultPressed.png | Bin 17675 -> 0 bytes .../ImageConverter/sample/Styles/Cells.css | 7 - .../sample/Styles/OCIFStringButton.css | 21 - .../sample/Styles/OCIFStringTextField.css | 15 - .../ImageConverter/sample/Styles/button.css | 25 - .../ImageConverter/sample/Styles/checkBox.css | 62 - .../ImageConverter/sample/Styles/comboBox.css | 69 - .../sample/Styles/pogressBar.css | 14 - .../ImageConverter/sample/Styles/slider.css | 58 - .../ImageConverter/sample/Styles/text.css | 9 - .../sample/Styles/textField.css | 21 - ImageConverter/src/META-INF/MANIFEST.MF | 3 - ImageConverter/src/sample/Color.java | 72 - ImageConverter/src/sample/Image.java | 289 -- ImageConverter/src/sample/ImageConverter.fxml | 221 - ImageConverter/src/sample/Main.java | 347 -- ImageConverter/src/sample/OCIF.java | 172 - ImageConverter/src/sample/Palette.java | 43 - ImageConverter/src/sample/Pixel.java | 16 - .../src/sample/Resources/Background.png | Bin 3088253 -> 0 bytes ImageConverter/src/sample/Resources/Cells.png | Bin 15846 -> 0 bytes ImageConverter/src/sample/Resources/Files.png | Bin 30800 -> 0 bytes ImageConverter/src/sample/Resources/Files.psd | Bin 1180111 -> 0 bytes .../src/sample/Resources/StringResult.png | Bin 20635 -> 0 bytes .../src/sample/Resources/StringResult.psd | Bin 71392 -> 0 bytes .../sample/Resources/StringResultButton.psd | Bin 2126007 -> 0 bytes .../sample/Resources/StringResultDefault.png | Bin 17649 -> 0 bytes .../sample/Resources/StringResultPressed.png | Bin 17675 -> 0 bytes ImageConverter/src/sample/Styles/Cells.css | 7 - .../src/sample/Styles/OCIFStringButton.css | 21 - .../src/sample/Styles/OCIFStringTextField.css | 15 - ImageConverter/src/sample/Styles/button.css | 25 - ImageConverter/src/sample/Styles/checkBox.css | 62 - ImageConverter/src/sample/Styles/comboBox.css | 69 - .../src/sample/Styles/pogressBar.css | 14 - ImageConverter/src/sample/Styles/slider.css | 58 - ImageConverter/src/sample/Styles/text.css | 9 - .../src/sample/Styles/textField.css | 21 - Installer.lua | 4 +- LICENSE | 21 + License/English.lang | 9 - License/French.lang | 9 - License/Russian.lang | 9 - OS.lua | 113 +- lib/GUI.lua | 4246 ----------------- lib/MineOSInterface.lua | 203 +- lib/advancedLua.lua | 581 --- lib/color.lua | 233 - lib/doubleBuffering.lua | 745 --- lib/image.lua | 445 -- lib/rayEngine.lua | 56 +- lib/syntax.lua | 46 - 128 files changed, 3728 insertions(+), 11792 deletions(-) delete mode 100644 Applications.cfg delete mode 100644 Applications/Chat.lua delete mode 100644 Applications/Png.lua delete mode 100644 Applications/Update.paste delete mode 100644 Applications/convertImage.lua delete mode 100644 Applications/palette.lua delete mode 100755 Applications/scale.lua create mode 100644 Documentation/Russian/GUI.md create mode 100644 Documentation/Russian/MineOSInterface.md create mode 100644 Documentation/Russian/advancedLua.md create mode 100644 Documentation/Russian/archive.md create mode 100644 Documentation/Russian/color.md create mode 100644 Documentation/Russian/doubleBuffering.md delete mode 100644 ImageConverter/.idea/artifacts/ImageConverter_jar.xml delete mode 100644 ImageConverter/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 ImageConverter/.idea/compiler.xml delete mode 100644 ImageConverter/.idea/description.html delete mode 100644 ImageConverter/.idea/encodings.xml delete mode 100644 ImageConverter/.idea/gradle.xml delete mode 100644 ImageConverter/.idea/kotlinc.xml delete mode 100644 ImageConverter/.idea/misc.xml delete mode 100644 ImageConverter/.idea/modules.xml delete mode 100644 ImageConverter/.idea/uiDesigner.xml delete mode 100644 ImageConverter/.idea/vcs.xml delete mode 100644 ImageConverter/.idea/workspace.xml delete mode 100644 ImageConverter/ImageConverter.iml delete mode 100644 ImageConverter/README.md delete mode 100644 ImageConverter/out/artifacts/ImageConverter_jar/ImageConverter.jar delete mode 100644 ImageConverter/out/production/ImageConverter/META-INF/MANIFEST.MF delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Color.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Image.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/ImageConverter.fxml delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Main$1.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Main$2$1.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Main$2.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Main.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/OCIF.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Palette.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Pixel.class delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/Background.png delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/Cells.png delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/Files.png delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/Files.psd delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/StringResult.png delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/StringResult.psd delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/StringResultButton.psd delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/StringResultDefault.png delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Resources/StringResultPressed.png delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/Cells.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/OCIFStringButton.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/OCIFStringTextField.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/button.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/checkBox.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/comboBox.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/pogressBar.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/slider.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/text.css delete mode 100644 ImageConverter/out/production/ImageConverter/sample/Styles/textField.css delete mode 100644 ImageConverter/src/META-INF/MANIFEST.MF delete mode 100644 ImageConverter/src/sample/Color.java delete mode 100644 ImageConverter/src/sample/Image.java delete mode 100644 ImageConverter/src/sample/ImageConverter.fxml delete mode 100644 ImageConverter/src/sample/Main.java delete mode 100644 ImageConverter/src/sample/OCIF.java delete mode 100644 ImageConverter/src/sample/Palette.java delete mode 100644 ImageConverter/src/sample/Pixel.java delete mode 100644 ImageConverter/src/sample/Resources/Background.png delete mode 100644 ImageConverter/src/sample/Resources/Cells.png delete mode 100644 ImageConverter/src/sample/Resources/Files.png delete mode 100644 ImageConverter/src/sample/Resources/Files.psd delete mode 100644 ImageConverter/src/sample/Resources/StringResult.png delete mode 100644 ImageConverter/src/sample/Resources/StringResult.psd delete mode 100644 ImageConverter/src/sample/Resources/StringResultButton.psd delete mode 100644 ImageConverter/src/sample/Resources/StringResultDefault.png delete mode 100644 ImageConverter/src/sample/Resources/StringResultPressed.png delete mode 100644 ImageConverter/src/sample/Styles/Cells.css delete mode 100644 ImageConverter/src/sample/Styles/OCIFStringButton.css delete mode 100644 ImageConverter/src/sample/Styles/OCIFStringTextField.css delete mode 100644 ImageConverter/src/sample/Styles/button.css delete mode 100644 ImageConverter/src/sample/Styles/checkBox.css delete mode 100644 ImageConverter/src/sample/Styles/comboBox.css delete mode 100644 ImageConverter/src/sample/Styles/pogressBar.css delete mode 100644 ImageConverter/src/sample/Styles/slider.css delete mode 100644 ImageConverter/src/sample/Styles/text.css delete mode 100644 ImageConverter/src/sample/Styles/textField.css create mode 100644 LICENSE delete mode 100644 License/English.lang delete mode 100644 License/French.lang delete mode 100644 License/Russian.lang delete mode 100755 lib/GUI.lua delete mode 100755 lib/advancedLua.lua delete mode 100755 lib/color.lua delete mode 100755 lib/doubleBuffering.lua delete mode 100755 lib/image.lua delete mode 100755 lib/syntax.lua diff --git a/Applications.cfg b/Applications.cfg deleted file mode 100644 index f4124163..00000000 --- a/Applications.cfg +++ /dev/null @@ -1,1091 +0,0 @@ -{ - { - path="/OS.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/OS.lua", - type="Script", - forceDownload=true, - version=4.16, - }, - { - path="/MineOS/Pictures/MoonTouch.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/MoonTouch.pic", - type="Wallpaper", - version=1.01, - }, - { - path="/MineOS/Pictures/Raspberry.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Raspberry.pic", - type="Wallpaper", - version=1.01, - }, - { - path="/MineOS/Pictures/Catniss.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Catniss.pic", - type="Wallpaper", - version=1.01, - }, - { - path="/MineOS/Pictures/Ciri.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Ciri.pic", - type="Wallpaper", - version=1.01, - }, - { - path="/MineOS/Pictures/Girl.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Girl.pic", - type="Wallpaper", - version=1.01, - }, - { - path="/MineOS/Pictures/Space.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Space.pic", - type="Wallpaper", - version=1.0, - }, - { - path="/MineOS/Pictures/Block.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Block.pic", - type="Wallpaper", - version=1.0, - }, - { - path="/MineOS/Pictures/Road.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Road.pic", - type="Wallpaper", - version=1.0, - }, - { - path="/MineOS/Pictures/TyanSunset.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/TyanSunset.pic", - type="Wallpaper", - version=1.01, - }, - { - path="/MineOS/System/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Localization/Russian.lang", - type="Script", - forceDownload=true, - version=1.39, - }, - { - path="/MineOS/System/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Localization/English.lang", - type="Script", - forceDownload=true, - version=1.39, - }, - ----------------------------------------------------- Ассоциация говна -------------------------------------------------------------------------- - { - path="/MineOS/System/Extensions/Lua/ContextMenu.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Lua/ContextMenu.lua", - type="Script", - forceDownload=true, - version=1.04, - }, - { - path="/MineOS/System/Extensions/Lua/Launcher.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Lua/Launcher.lua", - type="Script", - forceDownload=true, - version=1.04, - }, - { - path="/MineOS/System/Extensions/Pic/ContextMenu.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Pic/ContextMenu.lua", - type="Script", - forceDownload=true, - version=1.04, - }, - { - path="/MineOS/System/Extensions/Arc/Launcher.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Arc/Launcher.lua", - type="Script", - forceDownload=true, - version=1.04, - }, - - ----------------------------------------------------- Системные иконки -------------------------------------------------------------------------- - { - path="/MineOS/System/Icons/Application.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Application.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/3DModel.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/3DModel.pic", - type="Icon", - version=1.01, - }, - { - path="/MineOS/System/Icons/Computer.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Computer.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Robot.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Robot.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Tablet.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Tablet.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Pastebin.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Pastebin.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/HDD.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/HDD.pic", - type="Icon", - version=1.01, - }, - { - path="/MineOS/System/Icons/Floppy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Floppy.pic", - type="Icon", - version=1.01, - }, - { - path="/MineOS/System/Icons/Steve.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Steve.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Folder.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Folder.pic", - type="Icon", - version=1.02, - }, - { - path="/MineOS/System/Icons/FileNotExists.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/FileNotExists.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Script.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Script.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Text.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Text.pic", - type="Icon", - version=1.02, - }, - { - path="/MineOS/System/Icons/Config.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Config.pic", - type="Icon", - version=1.01, - }, - { - path="/MineOS/System/Icons/Image.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Image.pic", - type="Icon", - version=1.03, - }, - { - path="/MineOS/System/Icons/Lua.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Lua.pic", - type="Icon", - version=1.02, - }, - { - path="/MineOS/System/Icons/SampleIcon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/SampleIcon.pic", - type="Icon", - version=1.0, - }, - { - path="/MineOS/System/Icons/Archive.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Archive.pic", - type="Icon", - version=1.02, - }, - { - path="/MineOS/System/Icons/Trash.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Trash.pic", - type="Icon", - version=1.01, - }, - - ----------------------------------------------------- Библиотеки -------------------------------------------------------------------------- - - { - path="/lib/MineOSCore.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua", - type="Library", - preloadFile=true, - version=2.06, - }, - { - path="/lib/MineOSNetwork.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSNetwork.lua", - type="Library", - version=1.06, - }, - { - path="/lib/scale.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/scale.lua", - type="Library", - version=1.08, - }, - { - path="/lib/MineOSInterface.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSInterface.lua", - type="Library", - version=1.34, - }, - { - path="/lib/MineOSPaths.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSPaths.lua", - type="Library", - preloadFile=true, - version=1.02, - }, - { - path="/lib/advancedLua.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/advancedLua.lua", - type="Library", - preloadFile=true, - version=1.37, - }, - { - path="/lib/web.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/web.lua", - type="Library", - preloadFile=true, - version=1.12, - }, - { - path="/lib/event.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/event.lua", - type="Library", - version=1.10, - }, - { - path="/lib/ECSAPI.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/ECSAPI.lua", - type="Library", - version=1.16, - }, - { - path="/lib/color.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/color.lua", - type="Library", - preloadFile=true, - version=1.16, - }, - { - path="/lib/FormatModules/OCIF.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/FormatModules/OCIF.lua", - type="Library", - preloadFile=true, - version=1.04, - }, - { - path="/lib/FormatModules/OCAF.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/FormatModules/OCAF.lua", - type="Library", - version=1.01, - }, - { - path="/lib/archive.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/archive.lua", - type="Library", - version=1.00, - }, - { - path="/lib/image.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/image.lua", - type="Library", - preloadFile=true, - version=1.30, - }, - { - path="/lib/serialization.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/serialization.lua", - type="Library", - version=1.07, - }, - { - path="/lib/GUI.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/GUI.lua", - type="Library", - preloadFile=true, - version=2.18, - }, - { - path="/lib/rayEngine.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/rayEngine.lua", - type="Library", - version=1.44, - }, - { - path="/lib/json.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/json.lua", - type="Library", - version=1.0, - }, - { - path="/lib/bigLetters.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/bigLetters.lua", - type="Library", - version=1.0, - }, - { - path="/lib/context.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/context.lua", - type="Library", - version=1.0, - }, - { - path="/lib/syntax.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/syntax.lua", - type="Library", - version=1.18, - }, - { - path="/lib/doubleBuffering.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/doubleBuffering.lua", - type="Library", - preloadFile=true, - version=1.39, - }, - { - path="/lib/xmlParser.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/xmlParser.lua", - type="Library", - version=1.0, - }, - { - path="/lib/SHA2.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/SHA2.lua", - type="Library", - version=1.01, - }, - { - path="/lib/vector.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/vector.lua", - type="Library", - version=1.10, - }, - { - path="/lib/OpenComputersGL/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Main.lua", - type="Library", - version=1.13, - }, - { - path="/lib/OpenComputersGL/Materials.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Materials.lua", - type="Library", - version=1.13, - }, - { - path="/lib/OpenComputersGL/Renderer.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Renderer.lua", - type="Library", - version=1.13, - }, - { - path="/lib/MeowEngine/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MeowEngine/Main.lua", - type="Library", - version=1.13, - }, - - ----------------------------------------------------- Скрипты и дополнения к ним -------------------------------------------------------------------------- - - { - path="/bin/clear.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/clear.lua", - type="Script", - forceDownload=true, - version=1.01, - }, - { - path="/bin/scale.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/scale.lua", - type="Script", - forceDownload=true, - version=1.01, - }, - ----------------------------------------------------- Screensavers -------------------------------------------------------------------------- - { - path="/MineOS/System/Screensavers/Matrix.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Matrix.lua", - type="Script", - forceDownload=true, - version=1.02, - }, - { - path="/MineOS/System/Screensavers/Mandala.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Mandala.lua", - type="Script", - forceDownload=true, - version=1.00, - }, - { - path="/MineOS/System/Screensavers/Clock.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Clock.lua", - type="Script", - forceDownload=true, - version=1.00, - }, - { - path="/MineOS/System/Screensavers/Lines.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Lines.lua", - type="Script", - forceDownload=true, - version=1.01, - }, - { - path="/MineOS/System/Screensavers/XCOM.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/XCOM.lua", - type="Script", - forceDownload=true, - version=1.01, - }, - { - path="/MineOS/System/Screensavers/NyanCat.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/NyanCat.lua", - type="Script", - forceDownload=true, - version=1.00, - }, - ----------------------------------------------------- Приложения -------------------------------------------------------------------------- - { - path="/MineOS/Applications/MineCode IDE", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Icon.pic", - forceDownload=true, - version=1.88, - resources={ - { - path="/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Localization/Russian.lang" - }, - { - path="/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Localization/English.lang" - }, - } - }, - { - path="/MineOS/Applications/Camera", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Camera/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Camera/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Camera/Icon.pic", - createShortcut=true, - version=1.07, - }, - { - path="/MineOS/Applications/3DTest", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DTest/3DTest.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DTest/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DTest/Icon.pic", - createShortcut=true, - forceDownload=true, - version=1.26, - }, - { - path="/MineOS/Applications/HEX", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HEX/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HEX/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HEX/Icon.pic", - createShortcut=true, - version=1.11, - }, - { - path="/MineOS/Applications/Spinner", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/Icon.pic", - createShortcut=true, - version=1.03, - resources={ - { - path="/1.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/1.pic" - }, - { - path="/2.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/2.pic" - }, - { - path="/3.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/3.pic" - }, - { - path="/4.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/4.pic" - }, - { - path="/5.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/5.pic" - }, - { - path="/6.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/6.pic" - }, - { - path="/7.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/7.pic" - }, - { - path="/8.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Spinner/8.pic" - }, - } - }, - { - path="/MineOS/Applications/Translate", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Translate/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Translate/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Translate/Icon.pic", - createShortcut=true, - version=1.06, - resources={ - { - path="/Logo.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Translate/Logo.pic" - }, - } - }, - { - path="/MineOS/Applications/Braille", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Braille/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Braille/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Braille/Icon.pic", - createShortcut=true, - version=1.09, - }, - { - path="/MineOS/Applications/GeoScan2", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GeoScan2/Main.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GeoScan2/Icon.pic", - createShortcut=true, - version=1.12, - resources={ - { - path="/Earth.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GeoScan2/Earth.pic", - } - }, - }, - { - path="/MineOS/Applications/Finder", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Finder/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Finder/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Finder/Icon.pic", - forceDownload=true, - version=1.39, - }, - { - path="/MineOS/Applications/Weather", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Weather.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Icon.pic", - createShortcut=true, - version=1.20, - resources={ - { - path="/Cloudy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Cloudy.pic", - }, - { - path="/Cloudy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Cloudy.pic", - }, - { - path="/Rainy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Rainy.pic", - }, - { - path="/Snowy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Snowy.pic", - }, - { - path="/Stormy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Stormy.pic", - }, - { - path="/Sunny.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Sunny.pic", - }, - { - path="/Foggy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Weather/Foggy.pic", - }, - }, - }, - { - path="/MineOS/Applications/3DPrint", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DPrint/3DPrint.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DPrint/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/3DPrint/Icon.pic", - createShortcut=true, - version=1.16, - }, - { - path="/MineOS/Applications/FlappyBird", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FlappyBird/FlappyBird.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FlappyBird/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FlappyBird/Icon.pic", - createShortcut=true, - version=1.17, - resources={ - { - path="/Flappy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FlappyBird/Flappy.pic", - }, - }, - }, - { - path="/MineOS/Applications/RayWalk", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Icon.pic", - createShortcut=true, - version=1.70, - resources={ - { - path="/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Localization/Russian.lang" - }, - { - path="/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Localization/English.lang" - }, ------------- - { - path="/RayEngine.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/RayEngine.cfg", - }, ------------- - { - path="/Weapons/Weapons.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/Weapons.cfg", - }, ------------- - { - path="/Weapons/CrosshairTextures/Angled.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/CrosshairTextures/Angled.pic", - }, - { - path="/Weapons/CrosshairTextures/Default.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/CrosshairTextures/Default.pic", - }, - { - path="/Weapons/CrosshairTextures/Half.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/CrosshairTextures/Half.pic", - }, - { - path="/Weapons/CrosshairTextures/Dotted.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/CrosshairTextures/Dotted.pic", - }, ------------- - { - path="/Weapons/FireTextures/PowderFire.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/FireTextures/PowderFire.pic", - }, - { - path="/Weapons/FireTextures/Plasma.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/FireTextures/Plasma.pic", - }, ------------- - { - path="/Weapons/WeaponTextures/Pistol.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/WeaponTextures/Pistol.pic", - }, - { - path="/Weapons/WeaponTextures/Sniper.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/WeaponTextures/Sniper.pic", - }, - { - path="/Weapons/WeaponTextures/Rifle.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/WeaponTextures/Rifle.pic", - }, - { - path="/Weapons/WeaponTextures/Plasmer.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Weapons/WeaponTextures/Plasmer.pic", - }, ------------- - { - path="/Worlds/ExampleWorld/Map.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/ExampleWorld/Map.cfg", - }, - { - path="/Worlds/ExampleWorld/Player.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/ExampleWorld/Player.cfg", - }, - { - path="/Worlds/ExampleWorld/World.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/ExampleWorld/World.cfg", - }, - { - path="/Worlds/ExampleWorld/Blocks.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/ExampleWorld/Blocks.cfg", - }, ------------- - { - path="/Worlds/SundownBeams/Map.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/SundownBeams/Map.cfg", - }, - { - path="/Worlds/SundownBeams/Player.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/SundownBeams/Player.cfg", - }, - { - path="/Worlds/SundownBeams/World.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/SundownBeams/World.cfg", - }, - { - path="/Worlds/SundownBeams/Blocks.cfg", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RayWalk/Worlds/SundownBeams/Blocks.cfg", - }, - }, - }, - { - path="/MineOS/Applications/GuessWord", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GuessWord/GuessWord.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GuessWord/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/GuessWord/Icon.pic", - createShortcut=true, - version=1.0, - }, - { - path="/MineOS/Applications/Calendar", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Calendar/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Calendar/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Calendar/Icon.pic", - createShortcut=true, - version=1.01, - }, - { - path="/MineOS/Applications/PrintImage", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PrintImage/Main.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PrintImage/Icon.pic", - createShortcut=true, - version=1.17, - }, - { - path="/MineOS/Applications/Palette", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Palette/Palette.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Palette/Icon.pic", - createShortcut=true, - version=1.07, - }, - { - path="/MineOS/Applications/Stargate", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/Main.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/Icon.pic", - createShortcut=true, - version=1.15, - resources={ - { - path="/Ch1.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/Ch1.pic", - }, - { - path="/Ch2.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/Ch2.pic", - }, - { - path="/OnOn.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/OnOn.pic", - }, - { - path="/OnOff.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/OnOff.pic", - }, - { - path="/OffOn.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/OffOn.pic", - }, - { - path="/OffOff.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Stargate/OffOff.pic", - }, - }, - }, - { - path="/MineOS/Applications/RunningString", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RunningString/RunningString.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RunningString/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/RunningString/Icon.pic", - createShortcut=true, - version=1.03, - }, - { - path="/MineOS/Applications/Graph2", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Graph2/Main.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Graph2/Icon.pic", - createShortcut=true, - version=1.04, - }, - { - path="/MineOS/Applications/Battleship", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Battleship/Battleship.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Battleship/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Battleship/Icon.pic", - createShortcut=true, - version=1.0, - }, - { - path="/MineOS/Applications/Radio", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Radio/Radio.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Radio/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Radio/Icon.pic", - createShortcut=true, - version=1.04, - }, - { - path="/MineOS/Applications/FuckTheRain", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FuckTheRain/FuckTheRain.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FuckTheRain/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/FuckTheRain/Icon.pic", - createShortcut=true, - version=1.0, - }, - { - path="/MineOS/Applications/ForceAdmin", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/ForceAdmin/ForceAdmin.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/ForceAdmin/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/ForceAdmin/Icon.pic", - createShortcut=true, - version=1.0, - }, - { - path="/MineOS/Applications/QuantumCube", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/QuantumCube/QuantumCube.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/QuantumCube/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/QuantumCube/Icon.pic", - createShortcut=true, - version=1.0, - }, - { - path="/MineOS/Applications/Control", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Main.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Icon.pic", - forceDownload=true, - version=5.12, - resources={ - { - path="/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/Russian.lang" - }, - { - path="/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/English.lang" - }, - { - path="/Modules/1.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/1.lua" - }, - { - path="/Modules/2.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/2.lua" - }, - { - path="/Modules/3.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/3.lua" - }, - { - path="/Modules/4.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/4.lua" - }, - } - }, - { - path="/MineOS/Applications/Photoshop", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/Photoshop.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/Icon.pic", - forceDownload=true, - version=1.13, - resources={ - { - path="/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/Localization/Russian.lang" - }, - { - path="/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Photoshop/Localization/English.lang" - }, - } - }, - { - path="/MineOS/Applications/Shooting", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Shooting/Shooting.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Shooting/Icon.pic", - createShortcut=true, - version=1.04, - }, - { - path="/MineOS/Applications/HoloClock", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HoloClock/HoloClock.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HoloClock/Icon.pic", - createShortcut=true, - version=1.07, - }, - { - path="/MineOS/Applications/AppMarket", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Main.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Icon.pic", - forceDownload=true, - version=1.79, - resources={ - { - path="/Update.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Update.pic", - }, - { - path="/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Localization/Russian.lang", - }, - { - path="/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Localization/English.lang", - }, - }, - }, - { - path="/MineOS/Applications/CodeDoor", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/CodeDoor/CodeDoor.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/CodeDoor/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/CodeDoor/Icon.pic", - createShortcut=true, - version=1.0, - }, - { - path="/MineOS/Applications/ChristmasTree", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/ChristmasTree/ChristmasTree.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/ChristmasTree/About/", - type="Application", - createShortcut=true, - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/ChristmasTree/Icon.pic", - version=1.0, - }, - -- Приложение InfoPanel - { - path="/MineOS/Applications/InfoPanel", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/InfoPanel.lua", - type="Application", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/About/", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Icon.pic", - createShortcut=true, - version=1.01, - resources = { - { - path="/Pages/Rules.txt", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Rules.txt", - }, - { - path="/Pages/Main.txt", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Main.txt", - }, - { - path="/Pages/SSPI.txt", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/SSPI.txt", - }, - { - path="/Pages/Claims.txt", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Claims.txt", - }, - } - }, - { - path="/MineOS/Applications/TurretControl", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/TurretControl/TurretControl.lua", - type="Application", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/TurretControl/About/", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/TurretControl/Icon.pic", - createShortcut=true, - version=1.06, - resources={ - { - path="/Turret.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/TurretControl/Turret.pic", - }, - }, - }, - { - path="/MineOS/Applications/HoloEdit", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HoloEdit/HoloEdit.lua", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HoloEdit/Icon.pic", - createShortcut=true, - version=1.02, - resources={ - { - path="/Localization/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HoloEdit/Localization/Russian.lang", - }, - { - path="/Localization/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/HoloEdit/Localization/English.lang", - }, - }, - }, - { - path="/MineOS/Applications/BufferDemo", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/BufferDemo/BufferDemo.lua", - about="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/BufferDemo/About/", - type="Application", - icon="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/BufferDemo/Icon.pic", - createShortcut=true, - version=1.03, - resources={ - { - path="/Wallpaper.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/BufferDemo/Wallpaper.pic", - }, - }, - }, -} \ No newline at end of file diff --git a/Applications/3DPrint/3DPrint.lua b/Applications/3DPrint/3DPrint.lua index f0607a7f..ab5299c1 100755 --- a/Applications/3DPrint/3DPrint.lua +++ b/Applications/3DPrint/3DPrint.lua @@ -174,13 +174,13 @@ local function drawShapeNumbers(x, y) end local function toolBarInfoLine(y, text) - buffer.square(xToolbar, y, widthOfToolbar, 1, colors.toolbarInfoBackground, 0xFFFFFF, " ") - buffer.text(xToolbar + 1, y, colors.toolbarInfoText, text) + buffer.drawRectangle(xToolbar, y, widthOfToolbar, 1, colors.toolbarInfoBackground, 0xFFFFFF, " ") + buffer.drawText(xToolbar + 1, y, colors.toolbarInfoText, text) end local function centerText(y, color, text) local x = math.floor(xToolbar + widthOfToolbar / 2 - unicode.len(text) / 2) - buffer.text(x, y, color, text) + buffer.drawText(x, y, color, text) end local function addButton(y, back, fore, text) @@ -192,8 +192,8 @@ local function printKeyValue(x, y, keyColor, valueColor, key, value, limit) if totalLength > limit then value = unicode.sub(value, 1, limit - unicode.len(key .. ": ") - 1) .. "…" end - buffer.text(x, y, keyColor, key .. ":") - buffer.text(x + unicode.len(key) + 2, y, valueColor, value) + buffer.drawText(x, y, keyColor, key .. ":") + buffer.drawText(x + unicode.len(key) + 2, y, valueColor, value) end local function getShapeCoords() @@ -210,7 +210,7 @@ local function fixNumber(number) end local function drawToolbar() - buffer.square(xToolbar, 1, widthOfToolbar, ySize, colors.toolbarBackground, 0xFFFFFF, " ") + buffer.drawRectangle(xToolbar, 1, widthOfToolbar, ySize, colors.toolbarBackground, 0xFFFFFF, " ") local x = xToolbar + 8 local y = 3 @@ -328,7 +328,7 @@ local function printModel(count) end local function drawPixel(x, y, width, height, color, trasparency) - buffer.square(xDrawingZone + x * pixelWidth - pixelWidth, yDrawingZone + y * pixelHeight - pixelHeight, width * pixelWidth, height * pixelHeight, color, 0xFFFFFF, " ", trasparency) + buffer.drawRectangle(xDrawingZone + x * pixelWidth - pixelWidth, yDrawingZone + y * pixelHeight - pixelHeight, width * pixelWidth, height * pixelHeight, color, 0xFFFFFF, " ", trasparency) end local function setka() @@ -396,10 +396,10 @@ local function drawDrawingZone() end local function drawAll() - buffer.square(1, 2, xSize, ySize, colors.drawingZoneCYKA, 0xFFFFFF, " ") + buffer.drawRectangle(1, 2, xSize, ySize, colors.drawingZoneCYKA, 0xFFFFFF, " ") drawDrawingZone() drawToolbar() - buffer.draw() + buffer.drawChanges() drawTopMenu(0) end @@ -457,11 +457,11 @@ while true do startPointSelected = true model.shapes[currentShape] = nil - -- buffer.square(xDrawingZone, yDrawingZone, drawingZoneWidth, drawingZoneHeight, colors.drawingZoneBackground, 0xFFFFFF, " ") + -- buffer.drawRectangle(xDrawingZone, yDrawingZone, drawingZoneWidth, drawingZoneHeight, colors.drawingZoneBackground, 0xFFFFFF, " ") drawPixel(xShapeStart, yShapeStart, 1, 1, colors.drawingZoneStartPoint) - buffer.draw() + buffer.drawChanges() else xShapeEnd = math.ceil((e[3] - xDrawingZone + 1) / pixelWidth) yShapeEnd = math.ceil((e[4] - yDrawingZone + 1) / pixelHeight) @@ -506,7 +506,7 @@ while true do for key in pairs(obj.ToolbarButtons) do if ecs.clickedAtArea(e[3], e[4], obj.ToolbarButtons[key][1], obj.ToolbarButtons[key][2], obj.ToolbarButtons[key][3], obj.ToolbarButtons[key][4]) then buffer.button(obj.ToolbarButtons[key][1], obj.ToolbarButtons[key][2], widthOfToolbar - 4, 3, ecs.colors.blue, 0xFFFFFF, key) - buffer.draw() + buffer.drawChanges() os.sleep(0.2) if key == "Напечатать" then @@ -596,7 +596,7 @@ while true do if ecs.clickedAtArea(e[3], e[4], obj.TopMenu[key][1], obj.TopMenu[key][2], obj.TopMenu[key][3], obj.TopMenu[key][4]) then drawTopMenu(obj.TopMenu[key][5]) -- buffer.button(obj.TopMenu[key][1] - 1, obj.TopMenu[key][2], unicode.len(key) + 2, 1, ecs.colors.blue, 0xFFFFFF, key) - -- buffer.draw() + -- buffer.drawChanges() local action if key == "Файл" then @@ -659,7 +659,7 @@ while true do elseif action == "Выход" then gpu.setResolution(xOld, yOld) buffer.flush() - buffer.draw(true) + buffer.drawChanges(true) if hologramAvailable then component.hologram.clear() end return elseif action == "Масштаб" then diff --git a/Applications/3DTest/3DTest.lua b/Applications/3DTest/3DTest.lua index 0ab199a6..86ab8cee 100755 --- a/Applications/3DTest/3DTest.lua +++ b/Applications/3DTest/3DTest.lua @@ -381,14 +381,14 @@ local lines = { "Timofeef Igor (vk.com/id7799889), Trifonov Gleb (vk.com/id88323331), Verevkin Yakov (vk.com/id60991376), Bogushevich Victoria (vk.com/id171497518)", "All rights reserved", } -mainContainer:addChild(GUI.textBox(1, mainContainer.height - #lines + 1, mainContainer.width, #lines, nil, 0x3C3C3C, lines, 1)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +mainContainer:addChild(GUI.textBox(1, mainContainer.height - #lines + 1, mainContainer.width, #lines, nil, 0x3C3C3C, lines, 1)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) local elementY = 2 mainContainer.toolbar = mainContainer:addChild(GUI.container(mainContainer.width - 31, 1, 32, mainContainer.height)) local elementWidth = mainContainer.toolbar.width - 2 mainContainer.toolbar:addChild(GUI.panel(1, 1, mainContainer.toolbar.width, mainContainer.toolbar.height, 0x0, 0.5)) -mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "Render mode")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); elementY = elementY + 2 +mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "Render mode")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); elementY = elementY + 2 mainContainer.toolbar.renderModeComboBox = mainContainer.toolbar:addChild(GUI.comboBox(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0x888888)); elementY = elementY + mainContainer.toolbar.renderModeComboBox.height + 1 mainContainer.toolbar.renderModeComboBox:addItem("disabled") mainContainer.toolbar.renderModeComboBox:addItem("constantShading") @@ -427,7 +427,7 @@ local function calculateLightComboBox() mainContainer.toolbar.lightEmissionSlider.value = scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].emissionDistance end -mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "Light control")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); elementY = elementY + 2 +mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "Light control")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); elementY = elementY + 2 mainContainer.toolbar.lightSelectComboBox = mainContainer.toolbar:addChild(GUI.comboBox(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0x888888)); elementY = elementY + mainContainer.toolbar.lightSelectComboBox.height + 1 mainContainer.toolbar.addLightButton = mainContainer.toolbar:addChild(GUI.button(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0xAAAAAA, "Add light")); elementY = elementY + 2 @@ -460,7 +460,7 @@ mainContainer.toolbar.backgroundColorSelector.onTouch = function() scene.backgroundColor = mainContainer.toolbar.backgroundColorSelector.color end -mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "RAM monitoring")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); elementY = elementY + 2 +mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "RAM monitoring")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); elementY = elementY + 2 mainContainer.toolbar.RAMChart = mainContainer.toolbar:addChild(GUI.chart(2, elementY, elementWidth, mainContainer.toolbar.height - elementY - 3, 0xEEEEEE, 0xAAAAAA, 0x555555, 0x66DB80, 0.35, 0.25, "s", "%", true, {})); elementY = elementY + mainContainer.toolbar.RAMChart.height + 1 mainContainer.toolbar.RAMChart.roundValues = true -- mainContainer.toolbar.RAMChart.showXAxisValues = false diff --git a/Applications/AppMarket/Main.lua b/Applications/AppMarket/Main.lua index e1580acc..7a137600 100644 --- a/Applications/AppMarket/Main.lua +++ b/Applications/AppMarket/Main.lua @@ -87,7 +87,7 @@ local config, fileVersions, user -------------------------------------------------------------------------------- -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.tabbedWindow(1, 1, 110, 29)) +local mainContainer, window = MineOSInterface.addWindow(GUI.tabbedWindow(1, 1, 110, 29)) local contentContainer = window:addChild(GUI.container(1, 4, 1, 1)) @@ -97,17 +97,17 @@ activityWidget.position = 0 activityWidget.color1 = 0x99FF80 activityWidget.color2 = 0x00B640 activityWidget.draw = function(activityWidget) - buffer.text(activityWidget.x + 1, activityWidget.y, activityWidget.position == 1 and activityWidget.color1 or activityWidget.color2, "⢀") - buffer.text(activityWidget.x + 2, activityWidget.y, activityWidget.position == 1 and activityWidget.color1 or activityWidget.color2, "⡀") + buffer.drawText(activityWidget.x + 1, activityWidget.y, activityWidget.position == 1 and activityWidget.color1 or activityWidget.color2, "⢀") + buffer.drawText(activityWidget.x + 2, activityWidget.y, activityWidget.position == 1 and activityWidget.color1 or activityWidget.color2, "⡀") - buffer.text(activityWidget.x + 3, activityWidget.y + 1, activityWidget.position == 2 and activityWidget.color1 or activityWidget.color2, "⠆") - buffer.text(activityWidget.x + 2, activityWidget.y + 1, activityWidget.position == 2 and activityWidget.color1 or activityWidget.color2, "⢈") + buffer.drawText(activityWidget.x + 3, activityWidget.y + 1, activityWidget.position == 2 and activityWidget.color1 or activityWidget.color2, "⠆") + buffer.drawText(activityWidget.x + 2, activityWidget.y + 1, activityWidget.position == 2 and activityWidget.color1 or activityWidget.color2, "⢈") - buffer.text(activityWidget.x + 1, activityWidget.y + 2, activityWidget.position == 3 and activityWidget.color1 or activityWidget.color2, "⠈") - buffer.text(activityWidget.x + 2, activityWidget.y + 2, activityWidget.position == 3 and activityWidget.color1 or activityWidget.color2, "⠁") + buffer.drawText(activityWidget.x + 1, activityWidget.y + 2, activityWidget.position == 3 and activityWidget.color1 or activityWidget.color2, "⠈") + buffer.drawText(activityWidget.x + 2, activityWidget.y + 2, activityWidget.position == 3 and activityWidget.color1 or activityWidget.color2, "⠁") - buffer.text(activityWidget.x, activityWidget.y + 1, activityWidget.position == 4 and activityWidget.color1 or activityWidget.color2, "⠰") - buffer.text(activityWidget.x + 1, activityWidget.y + 1, activityWidget.position == 4 and activityWidget.color1 or activityWidget.color2, "⡁") + buffer.drawText(activityWidget.x, activityWidget.y + 1, activityWidget.position == 4 and activityWidget.color1 or activityWidget.color2, "⠰") + buffer.drawText(activityWidget.x + 1, activityWidget.y + 1, activityWidget.position == 4 and activityWidget.color1 or activityWidget.color2, "⡁") end local overrideWindowDraw = window.draw @@ -203,10 +203,10 @@ local function fieldAPIRequest(fieldToReturn, script, data) if success[fieldToReturn] then return success[fieldToReturn] else - GUI.error("Request was successful, but field " .. tostring(fieldToReturn) .. " doesn't exists") + GUI.alert("Request was successful, but field " .. tostring(fieldToReturn) .. " doesn't exists") end else - GUI.error(reason) + GUI.alert(reason) end end @@ -281,7 +281,7 @@ end local function tryToDownload(...) local success, reason = web.download(...) if not success then - GUI.error(reason) + GUI.alert(reason) end return success @@ -295,14 +295,14 @@ local function callLastMethod() end local function showLabelAsContent(container, text) - container:deleteChildren() - container:addChild(GUI.label(1, 1, container.width, container.height, 0x2D2D2D, text)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center) + container:removeChildren() + container:addChild(GUI.label(1, 1, container.width, container.height, 0x2D2D2D, text)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_CENTER) end local function newButtonsLayout(x, y, width, spacing) local buttonsLayout = GUI.layout(x, y, width, 1, 1, 1) - buttonsLayout:setCellDirection(1, 1, GUI.directions.horizontal) - buttonsLayout:setCellSpacing(1, 1, spacing) + buttonsLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) + buttonsLayout:setSpacing(1, 1, spacing) return buttonsLayout end @@ -326,7 +326,7 @@ end local function ratingWidgetDraw(object) local x = 0 for i = 1, 5 do - buffer.text(object.x + x, object.y, object.rating >= i and object.colors.first or object.colors.second, "*") + buffer.drawText(object.x + x, object.y, object.rating >= i and object.colors.first or object.colors.second, "*") x = x + object.spacing end @@ -358,15 +358,15 @@ local function deletePublication(publication) }) if success then - container:delete() + container:remove() updateFileList(publication.category_id) else - GUI.error(reason) + GUI.alert(reason) end end buttonsLayout:addChild(GUI.adaptiveRoundedButton(1, 1, 2, 0, 0xA5A5A5, 0x2D2D2D, 0x0, 0xE1E1E1, localization.no)).onTouch = function() - container:delete() + container:remove() MineOSInterface.mainContainer:drawOnScreen() end end @@ -408,7 +408,7 @@ local function download(publication) if publication then local container = MineOSInterface.addUniversalContainer(MineOSInterface.mainContainer, localization.choosePath) - container.layout:setCellFitting(2, 1, false, false) + container.layout:setFitting(2, 1, false, false) local filesystemChooserPath = fileVersions[publication.file_id] and getApplicationPathFromVersions(fileVersions[publication.file_id].path) if not filesystemChooserPath then @@ -420,7 +420,7 @@ local function download(publication) end local filesystemChooser = container.layout:addChild(GUI.filesystemChooser(1, 1, 44, 3, 0xE1E1E1, 0x2D2D2D, 0x4B4B4B, 0x969696, filesystemChooserPath, localization.save, localization.cancel, localization.fileName, "/")) - filesystemChooser:setMode(GUI.filesystemModes.save, GUI.filesystemModes.file) + filesystemChooser:setMode(GUI.IO_MODE_SAVE, GUI.IO_MODE_FILE) container.layout:addChild(GUI.text(1, 1, 0xE1E1E1, localization.tree)) local tree = container.layout:addChild(GUI.tree(1, 1, 44, 10, 0xE1E1E1, 0xA5A5A5, 0x3C3C3C, 0xA5A5A5, 0x3C3C3C, 0xE1E1E1, 0xB4B4B4, 0xA5A5A5, 0xC3C3C3, 0x444444)) @@ -485,7 +485,7 @@ local function download(publication) shortcutSwitchAndLabel.hidden = publication.category_id == 2 container.layout:addChild(GUI.button(1, 1, 44, 3, 0x696969, 0xFFFFFF, 0x0, 0xFFFFFF, localization.download)).onTouch = function() - container.layout:deleteChildren(2) + container.layout:removeChildren(2) local progressBar = container.layout:addChild(GUI.progressBar(1, 1, 40, 0x66DB80, 0x0, 0xE1E1E1, 0, true, true, "", "%")) local countOfShit = 1 + (publication.all_dependencies and #publication.all_dependencies or 0) @@ -524,7 +524,7 @@ local function download(publication) end end - container:delete() + container:remove() callLastMethod() if not shortcutSwitchAndLabel.hidden and shortcutSwitchAndLabel.switch.state then @@ -666,7 +666,7 @@ mainMenu = function(menuID, messageToUser) window.tabBar:select(1) lastMethod, lastArguments = mainMenu, {menuID, messageToUser} - contentContainer:deleteChildren() + contentContainer:removeChildren() local menuList = contentContainer:addChild(GUI.list(1, 1, 23, contentContainer.height, 3, 0, 0xE1E1E1, 0x4B4B4B, 0xD2D2D2, 0x4B4B4B, 0x4B4B4B, 0xE1E1E1)) local menuContentContainer = contentContainer:addChild(GUI.container(menuList.width + 1, 1, contentContainer.width - menuList.width, contentContainer.height)) @@ -687,7 +687,7 @@ mainMenu = function(menuID, messageToUser) }) if publications then - menuContentContainer:deleteChildren() + menuContentContainer:removeChildren() local iconsContainer = menuContentContainer:addChild(GUI.container(1, 1, menuContentContainer.width, menuContentContainer.height)) @@ -700,7 +700,7 @@ mainMenu = function(menuID, messageToUser) statisticsLayout:addChild(GUI.image(1, 1, image.load(currentScriptDirectory .. "Icon.pic"))).height = 5 local textLayout = statisticsLayout:addChild(GUI.layout(1, 1, container.width - 4, 1, 1, 1)) - textLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.left, GUI.alignment.vertical.top) + textLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) textLayout:addChild(GUI.keyAndValue(1, 1, 0x4B4B4B, 0xA5A5A5, localization.statisticsUsersCount, ": " .. statistics.users_count)) textLayout:addChild(GUI.keyAndValue(1, 1, 0x4B4B4B, 0xA5A5A5, localization.statisticsNewUser, ": " .. statistics.last_registered_user)) @@ -711,7 +711,7 @@ mainMenu = function(menuID, messageToUser) local applicationPreview = statisticsLayout:addChild(newApplicationPreview(1, 1, publications[1])) applicationPreview.panel.colors.background = 0xF0F0F0 - statisticsLayout:addChild(GUI.label(1, 1, statisticsLayout.width, 1, 0xA5A5A5, localization.statisticsPopularPublication)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center) + statisticsLayout:addChild(GUI.label(1, 1, statisticsLayout.width, 1, 0xA5A5A5, localization.statisticsPopularPublication)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_CENTER) MineOSInterface.mainContainer:drawOnScreen() @@ -834,7 +834,7 @@ mainMenu = function(menuID, messageToUser) end messages = messages or {} - menuContentContainer:deleteChildren() + menuContentContainer:removeChildren() local button = menuContentContainer:addChild(GUI.adaptiveButton(1, menuContentContainer.height - 2, 2, 1, 0x4B4B4B, 0xE1E1E1, 0x2D2D2D, 0xE1E1E1, localization.send)) button.localX = menuContentContainer.width - button.width + 1 @@ -862,7 +862,7 @@ mainMenu = function(menuID, messageToUser) if success then dialogGUI(to_user_name) else - GUI.error(reason) + GUI.alert(reason) end activity(false) @@ -883,27 +883,27 @@ mainMenu = function(menuID, messageToUser) else local keyAndValue = menuContentContainer:addChild(GUI.keyAndValue(1, 2, 0x878787, 0x0, localization.dialogWith, to_user_name)) keyAndValue.localX = math.floor(menuContentContainer.width / 2 - (keyAndValue.keyLength + keyAndValue.valueLength) / 2) - -- menuContentContainer:addChild(GUI.label(1, 2, menuContentContainer.width, 1, 0x2D2D2D, to_user_name)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center) + -- menuContentContainer:addChild(GUI.label(1, 2, menuContentContainer.width, 1, 0x2D2D2D, to_user_name)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_CENTER) end local function cloudDraw(object) local backgroundColor, textColor = object.me and 0x6692FF or 0xFFFFFF, object.me and 0xFFFFFF or 0x4B4B4B - buffer.square(object.x, object.y, object.width, object.height, backgroundColor, textColor, " ") - buffer.text(object.x, object.y - 1, backgroundColor, "⢀" .. string.rep("⣀", object.width - 2) .. "⡀") - buffer.text(object.x, object.y + object.height, backgroundColor, "⠈" .. string.rep("⠉", object.width - 2) .. "⠁") + buffer.drawRectangle(object.x, object.y, object.width, object.height, backgroundColor, textColor, " ") + buffer.drawText(object.x, object.y - 1, backgroundColor, "⢀" .. string.rep("⣀", object.width - 2) .. "⡀") + buffer.drawText(object.x, object.y + object.height, backgroundColor, "⠈" .. string.rep("⠉", object.width - 2) .. "⠁") local date = os.date("%d.%m.%Y, %H:%M", object.timestamp) if object.me then - buffer.text(object.x - #date - 1, object.y, 0xC3C3C3, date) - buffer.text(object.x + object.width, object.y + object.height - 1, backgroundColor, "◤") + buffer.drawText(object.x - #date - 1, object.y, 0xC3C3C3, date) + buffer.drawText(object.x + object.width, object.y + object.height - 1, backgroundColor, "◤") else - buffer.text(object.x + object.width + 1, object.y, 0xC3C3C3, date) - buffer.text(object.x - 1, object.y + object.height - 1, backgroundColor, "◥") + buffer.drawText(object.x + object.width + 1, object.y, 0xC3C3C3, date) + buffer.drawText(object.x - 1, object.y + object.height - 1, backgroundColor, "◥") end for i = 1, #object.lines do - buffer.text(object.x + 1, object.y + i - 1, textColor, object.lines[i]) + buffer.drawText(object.x + 1, object.y + i - 1, textColor, object.lines[i]) end end @@ -939,7 +939,7 @@ mainMenu = function(menuID, messageToUser) }) if dialogs then - menuContentContainer:deleteChildren() + menuContentContainer:removeChildren() local dialogsContainer = menuContentContainer:addChild(GUI.container(1, 1, menuContentContainer.width, menuContentContainer.height)) dialogsContainer.eventHandler = containerScrollEventHandler @@ -975,7 +975,7 @@ mainMenu = function(menuID, messageToUser) y = y + dialogContainer.height + 1 end else - dialogsContainer:addChild(GUI.label(1, sendMessageButton.localY - 2, dialogsContainer.width, 1, 0xA5A5A5, localization.hereBeYourDialogs)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center) + dialogsContainer:addChild(GUI.label(1, sendMessageButton.localY - 2, dialogsContainer.width, 1, 0xA5A5A5, localization.hereBeYourDialogs)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_CENTER) end end @@ -983,7 +983,7 @@ mainMenu = function(menuID, messageToUser) end local function settings() - menuContentContainer:deleteChildren() + menuContentContainer:removeChildren() local layout = menuContentContainer:addChild(GUI.layout(1, 1, menuContentContainer.width, menuContentContainer.height, 1, 1)) layout:addChild(GUI.text(1, 1, 0x2D2D2D, localization.language)) @@ -1017,10 +1017,10 @@ mainMenu = function(menuID, messageToUser) end local function addAccountShit(login, register, recover) - menuContentContainer:deleteChildren() + menuContentContainer:removeChildren() local layout = menuContentContainer:addChild(GUI.layout(1, 1, menuContentContainer.width, menuContentContainer.height, 1, 1)) - layout:addChild(GUI.label(1, 1, 36, 1, 0x0, login and localization.login or register and localization.createAccount or recover and localization.changePassword)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + layout:addChild(GUI.label(1, 1, 36, 1, 0x0, login and localization.login or register and localization.createAccount or recover and localization.changePassword)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) local nameInput = layout:addChild(GUI.input(1, 1, 36, 3, 0xFFFFFF, 0x696969, 0xB4B4B4, 0xFFFFFF, 0x2D2D2D, "", localization.nickname)) local emailInput = layout:addChild(GUI.input(1, 1, 36, 3, 0xFFFFFF, 0x696969, 0xB4B4B4, 0xFFFFFF, 0x2D2D2D, "", login and localization.nicknameOrEmail or "E-mail")) local currentPasswordInput = layout:addChild(GUI.input(1, 1, 36, 3, 0xFFFFFF, 0x696969, 0xB4B4B4, 0xFFFFFF, 0x2D2D2D, "", localization.currentPassword, false, "*")) @@ -1074,7 +1074,7 @@ mainMenu = function(menuID, messageToUser) if success then logout() else - GUI.error(reason) + GUI.alert(reason) end end @@ -1083,7 +1083,7 @@ mainMenu = function(menuID, messageToUser) if login then local registerLayout = layout:addChild(GUI.layout(1, 1, layout.width, 1, 1, 1)) - registerLayout:setCellDirection(1, 1, GUI.directions.horizontal) + registerLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) registerLayout:addChild(GUI.text(1, 1, 0xA5A5A5, localization.notRegistered)) registerLayout:addChild(GUI.adaptiveButton(1, 1, 0, 0, nil, 0x696969, nil, 0x0, localization.createAccount)).onTouch = function() addAccountShit(false, true, false) @@ -1106,13 +1106,13 @@ mainMenu = function(menuID, messageToUser) }) if result then - menuContentContainer:deleteChildren() + menuContentContainer:removeChildren() local layout = menuContentContainer:addChild(GUI.layout(1, 1, menuContentContainer.width, menuContentContainer.height, 1, 1)) layout:addChild(GUI.text(1, 1, 0x2D2D2D, localization.profile)) local textLayout = layout:addChild(GUI.layout(1, 1, 36, 5, 1, 1)) - textLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.left, GUI.alignment.vertical.top) + textLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) textLayout:addChild(GUI.keyAndValue(1, 1, 0x696969, 0x969696, localization.nickname, ": " .. user.name)) textLayout:addChild(GUI.keyAndValue(1, 1, 0x696969, 0x969696, "E-Mail", ": " .. user.email)) @@ -1222,14 +1222,14 @@ newPublicationInfo = function(file_id) }) if reviews then - contentContainer:deleteChildren() + contentContainer:removeChildren() local infoContainer = contentContainer:addChild(GUI.container(1, 1, contentContainer.width, contentContainer.height)) infoContainer.eventHandler = containerScrollEventHandler -- Жирный йоба-лейаут для отображения ВАЩЕ всего - и инфы, и отзыввов local layout = infoContainer:addChild(GUI.layout(3, 2, infoContainer.width - 4, infoContainer.height, 1, 1)) - layout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + layout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) -- А вот эт уже контейнер чисто инфы крч local detailsContainer = layout:addChild(GUI.container(3, 2, layout.width, 6)) @@ -1299,7 +1299,7 @@ newPublicationInfo = function(file_id) buttonsLayout:addChild(GUI.adaptiveRoundedButton(1, 1, 1, 0, 0xA5A5A5, 0xFFFFFF, 0x2D2D2D, 0xFFFFFF, existingReviewText and localization.changeReview or localization.writeReview)).onTouch = function() local container = MineOSInterface.addUniversalContainer(window, existingReviewText and localization.changeReview or localization.writeReview) - container.layout:setCellFitting(2, 1, false, false) + container.layout:setFitting(2, 1, false, false) local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xFFFFFF, 0x696969, 0xB4B4B4, 0xFFFFFF, 0x2D2D2D, existingReviewText or "", localization.writeReviewHere)) @@ -1329,13 +1329,13 @@ newPublicationInfo = function(file_id) comment = input.text, }) - container:delete() + container:remove() MineOSInterface.mainContainer:drawOnScreen() if success then newPublicationInfo(publication.file_id) else - GUI.error(reason) + GUI.alert(reason) end activity() @@ -1348,7 +1348,7 @@ newPublicationInfo = function(file_id) else govno.disabled = true if textLength > to then - GUI.error("Too big review length (" .. textLength .. "). Maximum is " .. to) + GUI.alert("Too big review length (" .. textLength .. "). Maximum is " .. to) end end @@ -1382,7 +1382,7 @@ newPublicationInfo = function(file_id) end if publicationDependencyExists then - textDetailsContainer:addChild(GUI.label(1, y, textDetailsContainer.width, 1, 0x696969, localization.dependencies)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + textDetailsContainer:addChild(GUI.label(1, y, textDetailsContainer.width, 1, 0x696969, localization.dependencies)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) y = y + 2 for i = 1, #publication.all_dependencies do @@ -1449,8 +1449,8 @@ newPublicationInfo = function(file_id) local wasHelpText = reviewContainer:addChild(GUI.text(3, y, 0xC3C3C3, localization.wasReviewHelpful)) local layout = reviewContainer:addChild(GUI.layout(wasHelpText.localX + wasHelpText.width + 1, y, reviewContainer.width - wasHelpText.localX - wasHelpText.width - 1, 1, 1, 1)) - layout:setCellDirection(1, 1, GUI.directions.horizontal) - layout:setCellAlignment(1, 1, GUI.alignment.horizontal.left, GUI.alignment.vertical.top) + layout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) + layout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) local function go(rating) activity(true) @@ -1464,7 +1464,7 @@ newPublicationInfo = function(file_id) if success then wasHelpText.text = localization.thanksForVote wasHelpText.color = 0x696969 - layout:delete() + layout:remove() end activity() @@ -1502,14 +1502,14 @@ end local function newPlusMinusCyka(width, disableLimit) local layout = GUI.layout(1, 1, width, 1, 2, 1) - layout:setColumnWidth(1, GUI.sizePolicies.percentage, 1.0) - layout:setColumnWidth(2, GUI.sizePolicies.absolute, 8) - layout:setCellFitting(1, 1, true, false) - layout:setCellMargin(2, 1, 1, 0) - layout:setCellAlignment(1, 1, GUI.alignment.horizontal.left, GUI.alignment.vertical.top) - layout:setCellAlignment(2, 1, GUI.alignment.horizontal.left, GUI.alignment.vertical.top) - layout:setCellDirection(1, 1, GUI.directions.horizontal) - layout:setCellDirection(2, 1, GUI.directions.horizontal) + layout:setColumnWidth(1, GUI.SIZE_POLICY_RELATIVE, 1.0) + layout:setColumnWidth(2, GUI.SIZE_POLICY_ABSOLUTE, 8) + layout:setFitting(1, 1, true, false) + layout:setMargin(2, 1, 1, 0) + layout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) + layout:setAlignment(2, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) + layout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) + layout:setDirection(2, 1, GUI.DIRECTION_HORIZONTAL) layout.comboBox = layout:addChild(GUI.comboBox(1, 1, width - 7, 1, 0xFFFFFF, 0x696969, 0x969696, 0xE1E1E1)) layout.defaultColumn = 2 @@ -1532,16 +1532,16 @@ end editPublication = function(initialPublication, initialCategoryID) lastMethod, lastArguments = editPublication, {initialPublication} - contentContainer:deleteChildren() + contentContainer:removeChildren() local layout = contentContainer:addChild(GUI.layout(1, 1, contentContainer.width, contentContainer.height, 3, 1)) - layout:setColumnWidth(1, GUI.sizePolicies.percentage, 0.5) - layout:setColumnWidth(2, GUI.sizePolicies.absolute, 36) - layout:setColumnWidth(3, GUI.sizePolicies.percentage, 0.5) - layout:setCellAlignment(1, 1, GUI.alignment.horizontal.right, GUI.alignment.vertical.center) - layout:setCellAlignment(2, 1, GUI.alignment.horizontal.left, GUI.alignment.vertical.center) - layout:setCellFitting(2, 1, true, false) - layout:setCellMargin(1, 1, 1, 0) + layout:setColumnWidth(1, GUI.SIZE_POLICY_RELATIVE, 0.5) + layout:setColumnWidth(2, GUI.SIZE_POLICY_ABSOLUTE, 36) + layout:setColumnWidth(3, GUI.SIZE_POLICY_RELATIVE, 0.5) + layout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_CENTER) + layout:setAlignment(2, 1, GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_CENTER) + layout:setFitting(2, 1, true, false) + layout:setMargin(1, 1, 1, 0) layout:addChild(GUI.text(1, 1, 0x2D2D2D, localization.category .. ":")) layout:addChild(GUI.text(1, 1, 0x2D2D2D, localization.license .. ":")) @@ -1554,7 +1554,7 @@ editPublication = function(initialPublication, initialCategoryID) layout.defaultColumn = 2 - layout:addChild(GUI.label(1, 1, 36, 1, 0x0, initialPublication and localization.edit or localization.publish)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + layout:addChild(GUI.label(1, 1, 36, 1, 0x0, initialPublication and localization.edit or localization.publish)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) local categoryComboBox = layout:addChild(GUI.comboBox(1, 1, 36, 1, 0xFFFFFF, 0x696969, 0x969696, 0xE1E1E1)) for i = 1, #categories do @@ -1610,7 +1610,7 @@ editPublication = function(initialPublication, initialCategoryID) dependenciesLayout.addButton.onTouch = function() local container = MineOSInterface.addUniversalContainer(MineOSInterface.mainContainer, localization.addDependency) - container.layout:setCellFitting(2, 1, false, false) + container.layout:setFitting(2, 1, false, false) local dependencyTypeComboBox = container.layout:addChild(GUI.comboBox(1, 1, 36, 3, 0xFFFFFF, 0x696969, 0x969696, 0xE1E1E1)) dependencyTypeComboBox:addItem(localization.fileByURL) @@ -1630,7 +1630,7 @@ editPublication = function(initialPublication, initialCategoryID) source_url = lastDependencyType == 1 and urlInput.text or nil, }) - container:delete() + container:remove() MineOSInterface.mainContainer:drawOnScreen() end @@ -1727,7 +1727,7 @@ editPublication = function(initialPublication, initialCategoryID) updateFileList(categoryComboBox.selectedItem) end else - GUI.error(reason) + GUI.alert(reason) end activity() @@ -1761,7 +1761,7 @@ updateFileList = function(category_id, updates) }) if result then - contentContainer:deleteChildren() + contentContainer:removeChildren() if updates then local i = 1 @@ -1776,15 +1776,15 @@ updateFileList = function(category_id, updates) local y = 2 local layout = contentContainer:addChild(GUI.layout(1, y, contentContainer.width, 1, 1, 1)) - layout:setCellDirection(1, 1, GUI.directions.horizontal) - layout:setCellSpacing(1, 1, 2) + layout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) + layout:setSpacing(1, 1, 2) if not updates or updates and #result > 0 then if updates then if #result > 0 then layout:addChild(GUI.adaptiveRoundedButton(1, 1, 2, 0, 0x696969, 0xFFFFFF, 0x2D2D2D, 0xFFFFFF, localization.updateAll)).onTouch = function() local container = MineOSInterface.addUniversalContainer(MineOSInterface.mainContainer, "") - container.layout:setCellFitting(2, 1, false, false) + container.layout:setFitting(2, 1, false, false) local progressBar = container.layout:addChild(GUI.progressBar(1, 1, 40, 0x66DB80, 0x0, 0xE1E1E1, 0, true, true, "", "%")) @@ -1827,7 +1827,7 @@ updateFileList = function(category_id, updates) end end - container:delete() + container:remove() saveFileVersions() computer.shutdown(true) end @@ -1876,8 +1876,8 @@ updateFileList = function(category_id, updates) y = y + layout.height + 1 local navigationLayout = contentContainer:addChild(GUI.layout(1, contentContainer.height - 1, contentContainer.width, 1, 1, 1)) - navigationLayout:setCellDirection(1, 1, GUI.directions.horizontal) - navigationLayout:setCellSpacing(1, 1, 2) + navigationLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) + navigationLayout:setSpacing(1, 1, 2) local function switchPage(forward) currentPage = currentPage + (forward and 1 or -1) @@ -1959,7 +1959,7 @@ window.onResize = function(width, height) appsPerPage = appsPerWidth * appsPerHeight currentPage = 0 - contentContainer:deleteChildren() + contentContainer:removeChildren() callLastMethod() end diff --git a/Applications/Braille/Main.lua b/Applications/Braille/Main.lua index 30f52b0b..7369f244 100644 --- a/Applications/Braille/Main.lua +++ b/Applications/Braille/Main.lua @@ -10,10 +10,10 @@ local MineOSInterface = require("MineOSInterface") --------------------------------------------------------------------------------------------------------- -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 32, 19, 0x2D2D2D)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 32, 19, 0x2D2D2D)) local layout = window:addChild(GUI.layout(1, 2, 1, 1, 1, 1)) -layout:setCellDirection(1, 1, GUI.directions.horizontal) +layout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) local newButton = layout:addChild(GUI.button(1, 1, 3, 1, 0x444444, 0xE1E1E1, 0xE1E1E1, 0x444444, "N")) local saveButton = layout:addChild(GUI.button(1, 1, 3, 1, 0x444444, 0xE1E1E1, 0xE1E1E1, 0x444444, "S")) @@ -37,9 +37,9 @@ local function newCell(x, y, shaded) for y = 1, 4 do for x = 1, 2 do if object.pixels[y][x] then - buffer.square(object.x + x * 2 - 2, object.y + y - 1, 2, 1, object.pixels[y][x] == 1 and object.foreground or object.background, 0x0, " ") + buffer.drawRectangle(object.x + x * 2 - 2, object.y + y - 1, 2, 1, object.pixels[y][x] == 1 and object.foreground or object.background, 0x0, " ") else - buffer.square(object.x + x * 2 - 2, object.y + y - 1, 2, 1, 0xFFFFFF, object.shaded and (step and 0xC3C3C3 or 0xB4B4B4) or (step and 0xE1E1E1 or 0xD2D2D2), "▒") + buffer.drawRectangle(object.x + x * 2 - 2, object.y + y - 1, 2, 1, 0xFFFFFF, object.shaded and (step and 0xC3C3C3 or 0xB4B4B4) or (step and 0xE1E1E1 or 0xD2D2D2), "▒") end step = not step end @@ -77,7 +77,7 @@ end local drawingArea = window:addChild(GUI.container(1, 4, 1, 1)) local overrideDraw = drawingArea.draw drawingArea.draw = function(...) - GUI.windowShadow(drawingArea.x, drawingArea.y, drawingArea.width, drawingArea.height, GUI.colors.contextMenu.transparency.shadow, true) + GUI.drawShadow(drawingArea.x, drawingArea.y, drawingArea.width, drawingArea.height, GUI.colors.contextMenu.transparency.shadow, true) overrideDraw(...) end @@ -99,7 +99,7 @@ local function newNoGUI(width, height) layout.width = window.backgroundPanel.width - drawingArea:deleteChildren() + drawingArea:removeChildren() local x, y, step = 1, 1, false for j = 1, height do @@ -126,7 +126,7 @@ local function new() container.panel.eventHandler = function(mainContainer, object, e1) if e1 == "touch" then - container:delete() + container:remove() newNoGUI(tonumber(widthTextBox.text), tonumber(heightTextBox.text)) @@ -163,9 +163,9 @@ newButton.onTouch = function() end saveButton.onTouch = function() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "OK", "Cancel", "Path", "/") + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, true, 50, math.floor(mainContainer.height * 0.8), "OK", "Cancel", "Path", "/") - filesystemDialog:setMode(GUI.filesystemModes.save, GUI.filesystemModes.file) + filesystemDialog:setMode(GUI.IO_MODE_SAVE, GUI.IO_MODE_FILE) filesystemDialog:addExtensionFilter(".pic") filesystemDialog:addExtensionFilter(".braiile") @@ -180,7 +180,7 @@ saveButton.onTouch = function() local brailleArray, transparencyCyka, backgroundCyka, foregroundCyka = fillBrailleArray(drawingArea.children[childIndex].pixels) if transparencyCyka then if backgroundCyka and foregroundCyka then - GUI.error("Пиксель " .. x .. "x" .. y .. " имеет два цвета и прозрачность. Убирай любой из цветов и наслаждайся") + GUI.alert("Пиксель " .. x .. "x" .. y .. " имеет два цвета и прозрачность. Убирай любой из цветов и наслаждайся") return else background = 0x0 @@ -226,14 +226,14 @@ saveButton.onTouch = function() end openButton.onTouch = function() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "OK", "Cancel", "Path", "/") + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, true, 50, math.floor(mainContainer.height * 0.8), "OK", "Cancel", "Path", "/") - filesystemDialog:setMode(GUI.filesystemModes.open, GUI.filesystemModes.file) + filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE) filesystemDialog:addExtensionFilter(".braiile") filesystemDialog.onSubmit = function(path) local pizda = table.fromFile(path) - drawingArea:deleteChildren() + drawingArea:removeChildren() newNoGUI(pizda.width, pizda.height) @@ -249,8 +249,8 @@ openButton.onTouch = function() filesystemDialog:show() end -window.actionButtons.minimize:delete() -window.actionButtons.maximize:delete() +window.actionButtons.minimize:remove() +window.actionButtons.maximize:remove() --------------------------------------------------------------------------------------------------------- diff --git a/Applications/Camera/Main.lua b/Applications/Camera/Main.lua index 4db512c2..a01ca4cd 100644 --- a/Applications/Camera/Main.lua +++ b/Applications/Camera/Main.lua @@ -8,7 +8,7 @@ local image = require("image") local fs = require("filesystem") if not component.isAvailable("camera") then - GUI.error("This program reqiures camera from computronix mod") + GUI.alert("This program reqiures camera from computronix mod") return end @@ -58,17 +58,17 @@ local thermal = { } local palette = grayscale -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 100, 25, 0x2D2D2D)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 100, 25, 0x2D2D2D)) window.backgroundPanel.width = 22 window.backgroundPanel.height = window.height window.backgroundPanel.colors.transparency = nil local layout = window:addChild(GUI.layout(1, 4, window.backgroundPanel.width, window.backgroundPanel.height - 3, 1, 1)) -layout:setCellFitting(1, 1, true, false, 2, 0) -layout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +layout:setFitting(1, 1, true, false, 2, 0) +layout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) -layout:addChild(GUI.label(1, 1, 1, 1, 0xC3C3C3, "Select camera"):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) +layout:addChild(GUI.label(1, 1, 1, 1, 0xC3C3C3, "Select camera"):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) local comboBox = layout:addChild(GUI.comboBox(1, 1, 36, 1, 0xF0F0F0, 0x2D2D2D, 0x444444, 0x999999)) local paletteSwitch = layout:addChild(GUI.switchAndLabel(1, 1, 16, 6, 0x66DB80, 0x0, 0xF0F0F0, 0xC3C3C3, "Thermal:", false)).switch local semiPixelSwitch = layout:addChild(GUI.switchAndLabel(1, 1, 16, 6, 0x66DB80, 0x0, 0xF0F0F0, 0xC3C3C3, "Semipixels:", true)).switch @@ -108,7 +108,7 @@ local buttonImage = image.load(fs.path(getCurrentScript()) .. "Icon.pic") local buttonImagePressed = image.blend(buttonImage, 0x0, 0.6) local shootButton = window:addChild(GUI.object(1, 1, 8, 4)) shootButton.draw = function() - buffer.image(shootButton.x, shootButton.y, shootButton.pressed and buttonImagePressed or buttonImage) + buffer.drawImage(shootButton.x, shootButton.y, shootButton.pressed and buttonImagePressed or buttonImage) end shootButton.eventHandler = function(mainContainer, object, e1) @@ -124,7 +124,7 @@ shootButton.eventHandler = function(mainContainer, object, e1) end cameraView.draw = function(cameraView) - buffer.square(cameraView.x, cameraView.y, cameraView.width, cameraView.height, 0xF0F0F0, 0x878787, " ") + buffer.drawRectangle(cameraView.x, cameraView.y, cameraView.width, cameraView.height, 0xF0F0F0, 0x878787, " ") local x, y = 0, 0 for y = 1, #cameraView.pixels do for x = 1, #cameraView.pixels[y] do diff --git a/Applications/Chat.lua b/Applications/Chat.lua deleted file mode 100644 index 4e9b30ab..00000000 --- a/Applications/Chat.lua +++ /dev/null @@ -1,251 +0,0 @@ - ----------------------------------------------------------------------------------------------------------------------------------- - -local components = require("component") -local event = require("event") -local unicode = require("unicode") -local sides = require("sides") -local sha = require("SHA2") -local ecs = require("ECSAPI") -local commandBlock = components.command_block -local gpu = components.gpu -local chat = components.chat_box -local redstone = component.redstone - -local administrators = {"IT", "Pornogion"} - -local votes = { - mute = { - }, -} -local voteTime = 5 -local votesToDoSomething = 1 - ----------------------------------------------------------------------------------------------------------------------------------- - -local function execute(command) - commandBlock.setCommand(command) - commandBlock.executeCommand() -end - -local function tellraw(toPlayer, text) - execute("/tellraw " .. toPlayer .. " [\"\",{\"text\":\" Сервер\",\"color\":\"gold\"},{\"text\":\": " .. text .. "\",\"color\":\"none\"}]") -end - -local function parseEventData(eventData) - local nickname = eventData[3] - - local words = {} - - for word in string.gmatch(eventData[4], "[^%s]*") do - if word ~= " " and word ~= "" then - table.insert(words, word) - end - end - - return nickname, words -end - -local function getCount(massiv) - local count = 0 - for key in pairs(massiv) do - count = count + 1 - end - return count -end - -local function analyzeMutes() - for nameToMute in pairs(votes.mute) do - if getCount(votes.mute[nameToMute]) >= votesToDoSomething then - tellraw("@a","По решению большинства игроку " .. nameToMute .. " дан мут.") - execute("/mute " .. nameToMute) - votes.mute[nameToMute] = nil - else - tellraw("@a", "Голосование за кик игрока " .. nameToMute .. " отменяется, недостаточно голосов.") - votes.mute[nameToMute] = nil - end - end -end - -local function synonym(baseWord, ...) - local synonyms = {...} - for i = 1, #synonyms do - if baseWord == synonyms[i] then return true end - end - return false -end - -local function checkNicknameForAdminRights(nickname) - local success = false - for i = 1, #administrators do - if nickname == administrators[i] then success = true; break end - end - - if not success then - tellraw("@a[name=" .. nickname .. "]", "Только админстраторы сервера имеют доступ к данной команде.") - end - - return success -end - ----------------------------------------------------------------------------------------------------------------------------------- - -ecs.setScale(0.8) -ecs.prepareToExit() -tellraw("@a","Система поддержки чата инициализирована.") -print(" "); print(" Ожидаю команд игроков..."); print(" ") - - -while true do - local eventData = {event.pull()} - if eventData[1] == "chat_message" then - - local nickname, words = parseEventData(eventData) - print(eventData[3] .. ": " .. eventData[4]) - -- print("Команды: " .. table.concat(words, ",")) - - if words[1] == "сервер" or words[1] == "Сервер" or words[1] == "серв" or words[1] == "Серв" then - - if words[2] == "замуть" then - votes.mute[words[3]] = votes.mute[words[3]] or {} - votes.mute[words[3]][nickname] = true - event.timer(voteTime, analyzeMutes) - tellraw("@a","Начинается голосование за мут игрока " .. words[3] .. ", количество голосов: " .. getCount(votes.mute[words[3]]) .. " из " .. votesToDoSomething .. ".") - - elseif words[2] == "телепортни" or words[2] == "тпни" or words[2] == "тп" or words[2] == "телепортируй" then - - if words[3] == "на" and words[4] == "спавн" then - execute("/spawn " .. nickname) - else - tellraw("@a[name=" .. nickname .. "]", "Неизвестная локация для телепортации.") - end - - elseif words[2] == "вылечи" or words[2] == "похиль" or words[2] == "хильни" then - execute("/heal " .. nickname) - tellraw("@a[name=" .. nickname .. "]", "Держи хилку!") - - elseif (words[2] == "накорми") or (words[2] == "дай" and (words[3] == "пожрать" or words[3] == "похавать")) then - execute("/feed " .. nickname) - tellraw("@a[name=" .. nickname .. "]", "Держи хавку!") - - elseif words[2] == "дай" then - if words[3] == "ресов" then - tellraw("@a[name=" .. nickname .. "]", "Ну на.") - execute("/give @a[name=" .. nickname .. "] minecraft:dirt " .. math.random(1, 100)) - - else - tellraw("@a[name=" .. nickname .. "]", "Чего тебе дать?") - end - - elseif words[2] == "как" and words[3] == "дела" then - - local dela = { - "Лови молнию в ебло, заебал с допросами.", - "Хуево пиздец. Сейчас такую катку всрал - играл за Инвокера, вышел с мида со счетом 7 0, а в итоге всосали гейм за 20 минут.", - "Ну, более-менее. Даже несмотря на то, что какие-то пидоры все время отвлекают от мирного афк в чате.", - "Нормально. Сам как?", - "Дела заебок, сегодня вытащил матч за войда с тремя ДЦП в тиме. А у тебя как успехи?", - "Отлично! Накодил вон потный скрипт, сейчас буду тестировать. error[320] in cyka.lua: attempt to index countOfFatMothers (a nil value) Бля.", - "Старая шлюха родила! Иди на хуй со своими расспросами.", - } - - local number = math.random(1, #dela) - if number == 1 then execute("/shock " .. nickname) end - tellraw("@a", dela[number]) - - elseif words[2] == "скажи" and (words[3] == "админу" or words[3] == "админам") then - local message = {} - for i = 4, #words do - table.insert(message, words[i]) - end - for i = 1, #administrators do - tellraw("@a[name=" .. administrators[i] .. "]", "Вам отправили личное сообщение как администратору. Прочтите через /mail read.") - execute("/mail send " .. administrators[i] .. " <От " .. nickname .. "> " .. table.concat(message, " ")) - end - - elseif words[2] == "очисти" and words[3] == "чат" then - tellraw("@a[name=" .. nickname .. "]", string.rep(" ", 3000)) - tellraw("@a[name=" .. nickname .. "]", "Чат очищен.") - - elseif synonym(words[2], "вруби", "включи") and synonym(words[3], "электричество", "свет") then - if checkNicknameForAdminRights(nickname) then - tellraw("@a", "Серверное освещение включено по приказу " .. nickname) - redstone.setOutput(sides.bottom, 15) - end - - elseif synonym(words[2], "выруби", "выключи", "отключи") and synonym(words[3], "электричество", "свет") then - if checkNicknameForAdminRights(nickname) then - tellraw("@a", "Серверное освещение отключено по приказу " .. nickname) - redstone.setOutput(sides.bottom, 0) - end - - elseif synonym(words[2], "хеш", "зашифруй", "хешируй") then - if words[3] then - tellraw("@a[name=" .. nickname .. "]", "SHA2-256 HASH: " .. sha.hash(words[3])) - else - tellraw("@a[name=" .. nickname .. "]", "Что тебе захешировать?") - end - - elseif synonym(words[2], "сделай", "вруби") and synonym(words[3], "день") then - if checkNicknameForAdminRights(nickname) then - tellraw("@a", "Установлено дневное время по приказу " .. nickname) - execute("/time set 0") - end - - elseif synonym(words[2], "сделай", "вруби") and synonym(words[3], "ночь") then - if checkNicknameForAdminRights(nickname) then - tellraw("@a", "Установлено ночное время по приказу " .. nickname) - execute("/time set 18000") - end - - elseif synonym(words[2], "выруби", "отключи") and synonym(words[3], "дождь") then - if checkNicknameForAdminRights(nickname) then - tellraw("@a", "Дождь отключен по приказу " .. nickname) - execute("/minecraft:weather clear") - end - - elseif synonym(words[2], "отпизди", "ебни", "убей", "отхуесось", "уничтожь") then - if checkNicknameForAdminRights(nickname) then - if words[3] then - tellraw("@a", "Как прикажешь, мой повелитель. " .. words[3] .. " был убит во имя Высшей Цели.") - execute("/kill " .. words[3]) - else - tellraw("@a[name=" .. nickname .. "]", "Скажи только имя - и я уничтожу его.") - end - end - - elseif synonym(words[2], "шанс", "вероятность") then - if words[3] then - local strings = { - "Вероятность ", - "Вероятность примерно ", - "Приблизительно ", - "Около ", - "Вероятность почти ", - } - - tellraw("@a", strings[math.random(1, #strings)] .. math.random(0, 100) .. "%") - else - tellraw("@a[name=" .. nickname .. "]", "Не указана цель поиска вероятности.") - end - - elseif words[2] then - tellraw("@a[name=" .. nickname .. "]", "Команда '" .. (words[2]) .. "' не распознана.") - else - tellraw("@a[name=" .. nickname .. "]", "Чего надо?") - end - - end - - end -end - - - - - - - - - - diff --git a/Applications/Control/Main.lua b/Applications/Control/Main.lua index 6be24ae7..190c6c73 100644 --- a/Applications/Control/Main.lua +++ b/Applications/Control/Main.lua @@ -17,7 +17,7 @@ local resourcesPath = MineOSCore.getCurrentScriptDirectory() local modulesPath = resourcesPath .. "Modules/" local localization = MineOSCore.getLocalization(resourcesPath .. "Localizations/") -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.tabbedWindow(1, 1, 80, 25)) +local mainContainer, window = MineOSInterface.addWindow(GUI.tabbedWindow(1, 1, 80, 25)) ---------------------------------------------------------------------------------------------------------------- diff --git a/Applications/Control/Modules/1.lua b/Applications/Control/Modules/1.lua index db4dc63d..4eaec940 100644 --- a/Applications/Control/Modules/1.lua +++ b/Applications/Control/Modules/1.lua @@ -20,7 +20,7 @@ module.name = localization.moduleLua ---------------------------------------------------------------------------------------------------------------- module.onTouch = function() - window.contentContainer:deleteChildren() + window.contentContainer:removeChildren() _G.component = require("component") _G.computer = require("computer") @@ -33,9 +33,9 @@ module.onTouch = function() input.textDrawMethod = function(x, y, color, text) if text == placeholder then - buffer.text(x, y, color, text) + buffer.drawText(x, y, color, text) else - GUI.highlightString(x, y, 1, input.width - 2, 2, GUI.colors.syntaxHighlighting, GUI.luaSyntaxPatterns, text) + GUI.highlightString(x, y, input.width - 2, 1, 2, GUI.LUA_SYNTAX_PATTERNS, GUI.LUA_SYNTAX_COLOR_SCHEME, text) end end @@ -62,7 +62,7 @@ module.onTouch = function() input.autoComplete.scrollBar.colors.background = 0x666666 input.autoComplete.scrollBar.colors.foreground = 0xAAAAAA - input.autoCompleteVerticalAlignment = GUI.alignment.vertical.top + input.autoCompleteVerticalAlignment = GUI.ALIGNMENT_VERTICAL_TOP input.autoCompleteEnabled = true input.autoCompleteMatchMethod = function() local inputTextLength = unicode.len(input.text) diff --git a/Applications/Control/Modules/2.lua b/Applications/Control/Modules/2.lua index 7750f199..705775fd 100644 --- a/Applications/Control/Modules/2.lua +++ b/Applications/Control/Modules/2.lua @@ -22,7 +22,7 @@ local floppyImage = image.load(MineOSPaths.icons .. "Floppy.pic") ---------------------------------------------------------------------------------------------------------------- module.onTouch = function() - window.contentContainer:deleteChildren() + window.contentContainer:removeChildren() local container = window.contentContainer:addChild(GUI.container(1, 1, window.contentContainer.width, window.contentContainer.height)) local y = 2 @@ -41,7 +41,7 @@ module.onTouch = function() if inputField.text and inputField.text:len() > 0 then proxy.setLabel(inputField.text) - container:delete() + container:remove() module.onTouch() end end @@ -53,7 +53,7 @@ module.onTouch = function() proxy.remove(list[i]) end - container:delete() + container:remove() module.onTouch() end formatButton.disabled = isReadOnly @@ -63,7 +63,7 @@ module.onTouch = function() if switch.state then computer.setBootAddress(proxy.address) - container:delete() + container:remove() module.onTouch() end end @@ -80,7 +80,7 @@ module.onTouch = function() diskContainer:addChild(GUI.image(3, 1, isReadOnly and floppyImage or HDDImage)) diskContainer:addChild(GUI.label(x, 1, width, 1, 0x2D2D2D, (proxy.getLabel() or "Unknown") .. " (" .. (isBoot and (localization.bootable .. ", ") or "") .. proxy.address .. ")")) diskContainer:addChild(GUI.progressBar(x, 3, width, 0x66DB80, 0xD2D2D2, 0xD2D2D2, spaceUsed / spaceTotal * 100, true)) - diskContainer:addChild(GUI.label(x, 4, width, 1, 0xBBBBBB, localization.free .. " " .. math.roundToDecimalPlaces((spaceTotal - spaceUsed) / 1024 / 1024, 2) .. " MB " .. localization.of .. " " .. math.roundToDecimalPlaces(spaceTotal / 1024 / 1024, 2) .. " MB")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + diskContainer:addChild(GUI.label(x, 4, width, 1, 0xBBBBBB, localization.free .. " " .. math.roundToDecimalPlaces((spaceTotal - spaceUsed) / 1024 / 1024, 2) .. " MB " .. localization.of .. " " .. math.roundToDecimalPlaces(spaceTotal / 1024 / 1024, 2) .. " MB")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) y = y + diskContainer.height + 1 end diff --git a/Applications/Control/Modules/3.lua b/Applications/Control/Modules/3.lua index 0c33ed62..4449836f 100644 --- a/Applications/Control/Modules/3.lua +++ b/Applications/Control/Modules/3.lua @@ -20,28 +20,28 @@ module.name = localization.moduleRAM ---------------------------------------------------------------------------------------------------------------- module.onTouch = function() - window.contentContainer:deleteChildren() + window.contentContainer:removeChildren() local cykaPanel = window.contentContainer:addChild(GUI.panel(1, 1, 1, 1, 0xE1E1E1)) local mainLayout = window.contentContainer:addChild(GUI.layout(1, 1, window.contentContainer.width, window.contentContainer.height, 2, 1)) - mainLayout:setColumnWidth(1, GUI.sizePolicies.percentage, 0.3) - mainLayout:setColumnWidth(2, GUI.sizePolicies.percentage, 0.7) - mainLayout:setCellFitting(1, 1, true, true) - mainLayout:setCellFitting(2, 1, true, true) + mainLayout:setColumnWidth(1, GUI.SIZE_POLICY_RELATIVE, 0.3) + mainLayout:setColumnWidth(2, GUI.SIZE_POLICY_RELATIVE, 0.7) + mainLayout:setFitting(1, 1, true, true) + mainLayout:setFitting(2, 1, true, true) - local tree = mainLayout:setCellPosition(1, 1, mainLayout:addChild(GUI.tree(1, 1, 1, 1, 0xE1E1E1, 0x3C3C3C, 0x3C3C3C, 0xAAAAAA, 0x3C3C3C, 0xFFFFFF, 0xBBBBBB, 0xAAAAAA, 0xC3C3C3, 0x444444, GUI.filesystemModes.both, GUI.filesystemModes.file))) + local tree = mainLayout:setPosition(1, 1, mainLayout:addChild(GUI.tree(1, 1, 1, 1, 0xE1E1E1, 0x3C3C3C, 0x3C3C3C, 0xAAAAAA, 0x3C3C3C, 0xFFFFFF, 0xBBBBBB, 0xAAAAAA, 0xC3C3C3, 0x444444, GUI.IO_MODE_BOTH, GUI.IO_MODE_FILE))) - local itemsLayout = mainLayout:setCellPosition(2, 1, mainLayout:addChild(GUI.layout(1, 1, 1, 1, 1, 2))) - itemsLayout:setRowHeight(1, GUI.sizePolicies.percentage, 0.6) - itemsLayout:setRowHeight(2, GUI.sizePolicies.percentage, 0.4) - itemsLayout:setCellFitting(1, 1, true, false, 4, 0) - itemsLayout:setCellFitting(1, 2, true, true) + local itemsLayout = mainLayout:setPosition(2, 1, mainLayout:addChild(GUI.layout(1, 1, 1, 1, 1, 2))) + itemsLayout:setRowHeight(1, GUI.SIZE_POLICY_RELATIVE, 0.6) + itemsLayout:setRowHeight(2, GUI.SIZE_POLICY_RELATIVE, 0.4) + itemsLayout:setFitting(1, 1, true, false, 4, 0) + itemsLayout:setFitting(1, 2, true, true) - local infoLabel = itemsLayout:setCellPosition(1, 1, itemsLayout:addChild(GUI.label(1, 1, 1, 1, 0x3C3C3C, "nil")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) - local argumentsInputField = itemsLayout:setCellPosition(1, 1, itemsLayout:addChild(GUI.input(1, 1, 1, 3, 0xFFFFFF, 0x666666, 0x888888, 0xFFFFFF, 0x262626, nil, localization.arguments))) - local executeButton = itemsLayout:setCellPosition(1, 1, itemsLayout:addChild(GUI.button(1, 1, 1, 3, 0x3C3C3C, 0xFFFFFF, 0x0, 0xFFFFFF, localization.execute))) - local outputTextBox = itemsLayout:setCellPosition(1, 2, itemsLayout:addChild(GUI.textBox(1, 1, 1, 1, 0xFFFFFF, 0x888888, {"nil"}, 1, 1, 0))) + local infoLabel = itemsLayout:setPosition(1, 1, itemsLayout:addChild(GUI.label(1, 1, 1, 1, 0x3C3C3C, "nil")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) + local argumentsInputField = itemsLayout:setPosition(1, 1, itemsLayout:addChild(GUI.input(1, 1, 1, 3, 0xFFFFFF, 0x666666, 0x888888, 0xFFFFFF, 0x262626, nil, localization.arguments))) + local executeButton = itemsLayout:setPosition(1, 1, itemsLayout:addChild(GUI.button(1, 1, 1, 3, 0x3C3C3C, 0xFFFFFF, 0x0, 0xFFFFFF, localization.execute))) + local outputTextBox = itemsLayout:setPosition(1, 2, itemsLayout:addChild(GUI.textBox(1, 1, 1, 1, 0xFFFFFF, 0x888888, {"nil"}, 1, 1, 0))) local function updateList(tree, t, definitionName, offset) local list = {} diff --git a/Applications/Control/Modules/4.lua b/Applications/Control/Modules/4.lua index 232d794a..f39635f8 100644 --- a/Applications/Control/Modules/4.lua +++ b/Applications/Control/Modules/4.lua @@ -19,13 +19,13 @@ module.name = localization.moduleEvent ---------------------------------------------------------------------------------------------------------------- module.onTouch = function() - window.contentContainer:deleteChildren() + window.contentContainer:removeChildren() local container = window.contentContainer:addChild(GUI.container(1, 1, window.contentContainer.width, window.contentContainer.height)) local layout = container:addChild(GUI.layout(1, 1, container.width, window.contentContainer.height, 1, 1)) - layout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) - layout:setCellMargin(1, 1, 0, 1) + layout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) + layout:setMargin(1, 1, 0, 1) local textBox = layout:addChild(GUI.textBox(1, 1, container.width - 4, container.height - 4, nil, 0x888888, {localization.waitingEvents .. "..."}, 1, 0, 0)) local switch = layout:addChild(GUI.switchAndLabel(1, 1, 27, 6, 0x66DB80, 0x1E1E1E, 0xFFFFFF, 0x2D2D2D, localization.processingEnabled .. ": ", true)).switch diff --git a/Applications/Finder/Main.lua b/Applications/Finder/Main.lua index 9000e9f8..d228e428 100644 --- a/Applications/Finder/Main.lua +++ b/Applications/Finder/Main.lua @@ -34,7 +34,7 @@ local workpathHistoryCurrent = 0 ------------------------------------------------------------------------------------------------------ -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 88, 26, 0xF0F0F0)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 88, 26, 0xF0F0F0)) local titlePanel = window:addChild(GUI.panel(1, 1, 1, 3, 0xE1E1E1)) @@ -55,9 +55,6 @@ sidebarContainer.itemsContainer = sidebarContainer:addChild(GUI.container(1, 1, local searchInput = window:addChild(GUI.input(1, 2, 36, 1, 0xFFFFFF, 0x4B4B4B, 0xA5A5A5, 0xFFFFFF, 0x2D2D2D, nil, MineOSCore.localization.search, true)) -local updatingListLabel = window:addChild(GUI.label(1, 4, 1, 1, 0x696969, MineOSCore.localization.updatingFileList):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.center)) -updatingListLabel.hidden = true - local iconField = window:addChild(MineOSInterface.iconField(1, 4, 1, 1, 2, 2, 0x3C3C3C, 0x3C3C3C, MineOSPaths.desktop)) local scrollBar = window:addChild(GUI.scrollBar(1, 4, 1, 1, 0xC3C3C3, 0x4B4B4B, iconFieldYOffset, 1, 1, 1, 1, true)) @@ -66,8 +63,8 @@ scrollBar.eventHandler = nil local statusBar = window:addChild(GUI.object(1, 1, 1, 1)) statusBar.draw = function(object) - buffer.square(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x3C3C3C, " ") - buffer.text(object.x + 1, object.y, 0x3C3C3C, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", " ► "), object.width - 2, "left")) + buffer.drawRectangle(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x3C3C3C, " ") + buffer.drawText(object.x + 1, object.y, 0x3C3C3C, string.limit(("root/" .. iconField.workpath):gsub("/+$", ""):gsub("%/+", " ► "), object.width - 2, "left")) end local sidebarResizer = window:addChild(GUI.resizer(1, 4, 3, 5, 0xFFFFFF, 0x0)) @@ -128,11 +125,11 @@ local function newSidebarItem(y, textColor, text, path) local currentTextColor = textColor if path == iconField.workpath then - buffer.square(object.x, object.y, object.width, 1, 0x3366CC, 0xFFFFFF, " ") + buffer.drawRectangle(object.x, object.y, object.width, 1, 0x3366CC, 0xFFFFFF, " ") currentTextColor = 0xFFFFFF end - buffer.text(object.x + 1, object.y, currentTextColor, string.limit(text, object.width - 2, "center")) + buffer.drawText(object.x + 1, object.y, currentTextColor, string.limit(text, object.width - 2, "center")) end object.eventHandler = function(mainContainer, object, e1, ...) @@ -172,7 +169,7 @@ end updateSidebar = function() local y = sidebarFromY - sidebarContainer.itemsContainer:deleteChildren() + sidebarContainer.itemsContainer:removeChildren() newSidebarItem(y, 0x3C3C3C, MineOSCore.localization.favourite) y = y + 1 @@ -181,7 +178,7 @@ updateSidebar = function() object.onTouch = function(e1, e2, e3, e4, e5) if e5 == 1 then - local menu = GUI.contextMenu(e3, e4) + local menu = GUI.addContextMenu(mainContainer, e3, e4) menu:addItem(MineOSCore.localization.removeFromFavourites).onTouch = function() table.remove(favourites, i) @@ -190,7 +187,7 @@ updateSidebar = function() MineOSInterface.mainContainer:drawOnScreen() end - menu:show() + mainContainer:drawOnScreen() else onFavouriteTouch(favourites[i].path) end @@ -229,7 +226,7 @@ updateSidebar = function() newSidebarItem(y, 0x555555, " " .. name, mountPath).onTouch = function(e1, e2, e3, e4, e5) if e5 == 1 then - local menu = GUI.contextMenu(e3, e4) + local menu = GUI.addContextMenu(mainContainer, e3, e4) menu:addItem(MineOSCore.localization.delete).onTouch = function() table.remove(MineOSCore.properties.FTPConnections, i) @@ -238,7 +235,7 @@ updateSidebar = function() MineOSInterface.mainContainer:drawOnScreen() end - menu:show() + mainContainer:drawOnScreen() else openFTP(connection.address, connection.port, connection.user, connection.password) end @@ -323,7 +320,7 @@ FTPButton.onTouch = function() local userInput = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xE1E1E1, 0x696969, 0x696969, 0xE1E1E1, 0x2D2D2D, us, MineOSCore.localization.networkFTPUser, true)) local passwordInput = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xE1E1E1, 0x696969, 0x696969, 0xE1E1E1, 0x2D2D2D, pa, MineOSCore.localization.networkFTPPassword, true, "*")) container.layout:addChild(GUI.button(1, 1, 36, 3, 0xA5A5A5, 0xFFFFFF, 0x2D2D2D, 0xE1E1E1, "OK")).onTouch = function() - container:delete() + container:remove() local port = tonumber(portInput.text) if port then @@ -428,12 +425,7 @@ end local overrideUpdateFileList = iconField.updateFileList iconField.updateFileList = function(...) - iconField.hidden, updatingListLabel.hidden = true, false - MineOSInterface.mainContainer:drawOnScreen() - overrideUpdateFileList(...) - iconField.hidden, updatingListLabel.hidden = false, true - updateScrollBar() end @@ -454,10 +446,6 @@ local function calculateSizes(width, height) window.backgroundPanel.localX = sidebarContainer.width + 1 window.backgroundPanel.localY = 4 - updatingListLabel.localX = window.backgroundPanel.localX - updatingListLabel.width = window.backgroundPanel.width - updatingListLabel.height = window.backgroundPanel.height - statusBar.localX = sidebarContainer.width + 1 statusBar.localY = height statusBar.width = window.backgroundPanel.width @@ -483,7 +471,7 @@ window.onResize = function(width, height) updateFileListAndDraw() end -sidebarResizer.onResize = function(mainContainer, object, dragWidth, dragHeight) +sidebarResizer.onResize = function(dragWidth, dragHeight) sidebarContainer.width = sidebarContainer.width + dragWidth sidebarContainer.width = sidebarContainer.width >= 5 and sidebarContainer.width or 5 calculateSizes(window.width, window.height) diff --git a/Applications/FlappyBird/FlappyBird.lua b/Applications/FlappyBird/FlappyBird.lua index d25de212..1812f4ae 100644 --- a/Applications/FlappyBird/FlappyBird.lua +++ b/Applications/FlappyBird/FlappyBird.lua @@ -51,13 +51,13 @@ local xScore, yScore = math.floor(bufferWidth / 2 - 6), math.floor(bufferHeight local function drawColumn(x, upperCornerStartPosition) local y = 1 - buffer.square(x + 1, y, config.columnWidth, upperCornerStartPosition - config.columnPipeHeight, colors.columnMain, 0x0, " ") - buffer.square(x, upperCornerStartPosition - config.columnPipeHeight, config.columnPipeWidth, config.columnPipeHeight, colors.columnAlternative, 0x0, " ") + buffer.drawRectangle(x + 1, y, config.columnWidth, upperCornerStartPosition - config.columnPipeHeight, colors.columnMain, 0x0, " ") + buffer.drawRectangle(x, upperCornerStartPosition - config.columnPipeHeight, config.columnPipeWidth, config.columnPipeHeight, colors.columnAlternative, 0x0, " ") y = upperCornerStartPosition + config.columnFreeSpace - buffer.square(x, y, config.columnPipeWidth, config.columnPipeHeight, colors.columnAlternative, 0x0, " ") + buffer.drawRectangle(x, y, config.columnPipeWidth, config.columnPipeHeight, colors.columnAlternative, 0x0, " ") y = y + config.columnPipeHeight - buffer.square(x + 1, y, config.columnWidth, bufferHeight - y + 1, colors.columnMain, 0x0, " ") + buffer.drawRectangle(x + 1, y, config.columnWidth, bufferHeight - y + 1, colors.columnMain, 0x0, " ") end local function dieBirdDie() @@ -109,14 +109,14 @@ local function drawBackground() end local function drawBird() - buffer.image(xBird, yBird, bird) + buffer.drawImage(xBird, yBird, bird) end local function drawBigCenterText(y, textColor, usePseudoShadow, text) local width = bigLetters.getTextSize(text) local x = math.floor(bufferWidth / 2 - width / 2) - if usePseudoShadow then buffer.square(x - 2, y - 1, width + 4, 7, colors.scoreTextBackground, 0x0, " ") end + if usePseudoShadow then buffer.drawRectangle(x - 2, y - 1, width + 4, 7, colors.scoreTextBackground, 0x0, " ") end bigLetters.drawText(x, y, textColor, text) end @@ -126,7 +126,7 @@ local function drawAll(force) drawBird() drawBigCenterText(yScore, colors.scoreText, true,tostring(currentScore)) - buffer.draw(force) + buffer.drawChanges(force) end local function saveHighScores() @@ -203,7 +203,7 @@ local function finalGUI() drawAll() - buffer.square(x, y, widthOfBoard, heightOfBoard, colors.board, 0xFFFFFF, " ", 0.3) + buffer.drawRectangle(x, y, widthOfBoard, heightOfBoard, colors.board, 0xFFFFFF, " ", 0.3) y = y + 2 drawBigCenterText(y, colors.boardText, false, "score") @@ -219,7 +219,7 @@ local function finalGUI() -- obj.records = { buffer.button(x, y, widthOfBoard, 3, 0xFF9900, colors.buttonText, "Таблица рекордов") }; y = y + 3 obj.exit = { buffer.button(x, y, widthOfBoard, 3, 0x262626, colors.buttonText, "Выход") }; y = y + 3 - buffer.draw() + buffer.drawChanges() end draw() @@ -228,7 +228,7 @@ local function finalGUI() local e = {event.pull("touch")} if clicked(e[3], e[4], obj.retry) then buffer.button(obj.retry[1], obj.retry[2], widthOfBoard, 3, 0xFFFFFF, 0x000000, "Заново") - buffer.draw() + buffer.drawChanges() os.sleep(0.2) currentScore = 0 birdIsAlive = true @@ -242,7 +242,7 @@ local function finalGUI() elseif clicked(e[3], e[4], obj.exit) then buffer.button(obj.exit[1], obj.exit[2], widthOfBoard, 3, 0xFFFFFF, 0x000000, "Выход") - buffer.draw() + buffer.drawChanges() os.sleep(0.2) buffer.clear(0x262626) ecs.prepareToExit() diff --git a/Applications/GeoScan2/Main.lua b/Applications/GeoScan2/Main.lua index 0df53a44..b54f6c96 100755 --- a/Applications/GeoScan2/Main.lua +++ b/Applications/GeoScan2/Main.lua @@ -9,11 +9,11 @@ local MineOSCore = require("MineOSCore") -------------------------------------------------------------------------------------------------------------------- if not component.isAvailable("geolyzer") then - GUI.error("This program requires a geolyzer to work!"); return + GUI.alert("This program requires a geolyzer to work!"); return end if not component.isAvailable("hologram") then - GUI.error("This program requires a hologram projector to work!"); return + GUI.alert("This program requires a hologram projector to work!"); return end component.gpu.setResolution(component.gpu.maxResolution()) @@ -72,7 +72,7 @@ local function progressReport(value, text) local width = 40 local x, y = math.floor(bufferWidth / 2 - width / 2), math.floor(bufferHeight / 2) GUI.progressBar(x, y, width, 0x00B6FF, 0xFFFFFF, 0xEEEEEE, value, true, true, text, "%"):draw() - buffer.draw() + buffer.drawChanges() end local function updateData(onScreen, onProjector, onGlasses) @@ -122,7 +122,7 @@ mainContainer:addChild(GUI.panel(panelX, 1, panelWidth, bufferHeight, 0x444444)) mainContainer.planetImage = mainContainer:addChild(GUI.image(buttonX, objectY, earthImage)) objectY = objectY + mainContainer.planetImage.image[2] + 1 -mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xFFFFFF, "GeoScan v2.0")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xFFFFFF, "GeoScan v2.0")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) objectY = objectY + 2 mainContainer.horizontalScanRangeSlider = mainContainer:addChild(GUI.slider(buttonX, objectY, buttonWidth, 0xFFDB80, 0x000000, 0xFFDB40, 0xBBBBBB, 4, 24, 16, false, "Horizontal scan range: ")) @@ -132,13 +132,13 @@ mainContainer.verticalScanRangeSlider = mainContainer:addChild(GUI.slider(button mainContainer.verticalScanRangeSlider.roundValues = true objectY = objectY + 4 -mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xFFFFFF, "Rendering properties")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xFFFFFF, "Rendering properties")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) objectY = objectY + 2 mainContainer.minimumHardnessTextBox = mainContainer:addChild(GUI.input(buttonX, objectY, 12, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(2.7), nil, true)) mainContainer.maximumHardnessTextBox = mainContainer:addChild(GUI.input(buttonX + 14, objectY, 12, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(10), nil, true)) objectY = objectY + 3 -mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xBBBBBB, "Hardness min Hardness max")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +mainContainer:addChild(GUI.label(buttonX, objectY, buttonWidth, 1, 0xBBBBBB, "Hardness min Hardness max")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) objectY = objectY + 2 @@ -201,7 +201,7 @@ mainContainer.scanButton.onTouch = function() scanResult[x][z] = component.geolyzer.scan(x, z) current = current + 1 progressReport(math.ceil(current / total * 100), "Scan progress: ") - buffer.draw() + buffer.drawChanges() end end diff --git a/Applications/Graph2/Main.lua b/Applications/Graph2/Main.lua index 946959d3..80e7f7af 100644 --- a/Applications/Graph2/Main.lua +++ b/Applications/Graph2/Main.lua @@ -8,7 +8,7 @@ local MineOSInterface = require("MineOSInterface") --------------------------------------------------------------------------------------------------------- -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 110, 25, 0xF0F0F0)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 110, 25, 0xF0F0F0)) local yDependencyString = "math.sin(x)" local xOffset, yOffset, xDrag, yDrag, points = 0, 0, 1, 1 @@ -17,8 +17,8 @@ local xOffset, yOffset, xDrag, yDrag, points = 0, 0, 1, 1 window.backgroundPanel.localY, window.backgroundPanel.height = 4, window.backgroundPanel.height - 3 local titlePanel = window:addChild(GUI.panel(1, 1, window.width, 3, 0x2D2D2D)) local layout = window:addChild(GUI.layout(1, 1, window.width, 3, 1, 1)) -layout:setCellDirection(1, 1, GUI.directions.horizontal) -layout:setCellSpacing(1, 1, 3) +layout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) +layout:setSpacing(1, 1, 3) local switchAndLabel = layout:addChild(GUI.switchAndLabel(1, 1, 16, 6, 0x66DB80, 0x1E1E1E, 0xF0F0F0, 0xBBBBBB, "Quants:", false)) local scaleSlider = layout:addChild(GUI.slider(1, 1, 12, 0x66DB80, 0x0, 0xFFFFFF, 0xBBBBBB, 1, 1000, 400, false, "Scale: ", "%")) @@ -35,12 +35,12 @@ graph.draw = function(graph) local xCenter, yCenter = graph.x + xOffset + graph.width / 2 - 1, graph.y + yOffset + graph.height / 2 - 1 - buffer.semiPixelLine(math.floor(graph.x), math.floor(yCenter * 2), math.floor(graph.x + graph.width - 1), math.floor(yCenter * 2), 0xD2D2D2) - buffer.semiPixelLine(math.floor(xCenter), math.floor(graph.y * 2 - 1), math.floor(xCenter), math.floor(graph.y + graph.height - 1) * 2, 0xD2D2D2) + buffer.drawSemiPixelLine(math.floor(graph.x), math.floor(yCenter * 2), math.floor(graph.x + graph.width - 1), math.floor(yCenter * 2), 0xD2D2D2) + buffer.drawSemiPixelLine(math.floor(xCenter), math.floor(graph.y * 2 - 1), math.floor(xCenter), math.floor(graph.y + graph.height - 1) * 2, 0xD2D2D2) for i = 1, #points - 1 do local x1, x2, y1, y2 = math.floor(xCenter + points[i].x), math.floor(yCenter - points[i].y + 1) * 2, math.floor(xCenter + points[i + 1].x), math.floor(yCenter - points[i + 1].y + 1) * 2 - buffer.semiPixelLine(x1, x2, y1, y2, 0x0) + buffer.drawSemiPixelLine(x1, x2, y1, y2, 0x0) if switchAndLabel.switch.state then buffer.semiPixelSet(x1, x2, 0x66DB80) end @@ -71,7 +71,7 @@ local function update() }) end else - GUI.error("Invalid input function") + GUI.alert("Invalid input function") return end end @@ -85,7 +85,7 @@ functionButton.onTouch = function() yDependencyString = inputField.text update() - container:delete() + container:remove() mainContainer:drawOnScreen() end end @@ -109,7 +109,7 @@ window.onResize = function(width, height) update() end -graph.eventHandler = function(mainContainer, graph, e1, e2, e3, e4) +graph.eventHandler = function(mainContainer, graph, e1, e2, e3, e4, e5) if e1 == "touch" then xDrag, yDrag = e3, e4 elseif e1 == "drag" then diff --git a/Applications/HEX/Main.lua b/Applications/HEX/Main.lua index a96b0bc5..64def355 100755 --- a/Applications/HEX/Main.lua +++ b/Applications/HEX/Main.lua @@ -38,7 +38,7 @@ local scrollBar, titleTextBox ------------------------------------------------------------------------------------------------------------------ -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 98, 25, colors.background)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 98, 25, colors.background)) window.backgroundPanel.localX, window.backgroundPanel.localY = 11, 5 window.backgroundPanel.width, window.backgroundPanel.height = window.width - 10, window.height - 4 @@ -58,14 +58,14 @@ local function byteFieldDraw(object) if bytes[index] then local textColor = colors.backgroundText if index == selection.from or index == selection.to then - buffer.square(x - object.offset, y, object.elementWidth, 1, index == selection.from and colors.selectionFrom or colors.selectionTo, colors.selectionText, " ") + buffer.drawRectangle(x - object.offset, y, object.elementWidth, 1, index == selection.from and colors.selectionFrom or colors.selectionTo, colors.selectionText, " ") textColor = colors.selectionText elseif index > selection.from and index < selection.to then - buffer.square(x - object.offset, y, object.elementWidth, 1, colors.selectionBetween, colors.selectionText, " ") + buffer.drawRectangle(x - object.offset, y, object.elementWidth, 1, colors.selectionBetween, colors.selectionText, " ") textColor = colors.selectionBetweenText end - buffer.text(x, y, textColor, object.asChar and string.char(bytes[index]) or string.format("%02X", bytes[index])) + buffer.drawText(x, y, textColor, object.asChar and string.char(bytes[index]) or string.format("%02X", bytes[index])) else return object end @@ -75,7 +75,7 @@ local function byteFieldDraw(object) local lastLineIndex = index - 1 if lastLineIndex >= selection.from and lastLineIndex < selection.to then - buffer.square(object.x - object.offset, y + 1, object.width, 1, colors.selectionBetween, colors.selectionText, " ") + buffer.drawRectangle(object.x - object.offset, y + 1, object.width, 1, colors.selectionBetween, colors.selectionText, " ") end x, y = object.x, y + object.elementHeight @@ -87,7 +87,7 @@ end local function byteFieldEventHandler(mainContainer, object, e1, e2, e3, e4, e5) if e1 == "touch" or e1 == "drag" then if e5 == 1 then - local menu = GUI.contextMenu(e3, e4) + local menu = GUI.addContextMenu(mainContainer, e3, e4) menu:addItem("Select all").onTouch = function() selection.from = 1 @@ -95,7 +95,9 @@ local function byteFieldEventHandler(mainContainer, object, e1, e2, e3, e4, e5) mainContainer:drawOnScreen() end + menu:addSeparator() + menu:addItem("Edit").onTouch = function() local container = MineOSInterface.addUniversalContainer(mainContainer, "Fill byte range [" .. selection.from .. "; " .. selection.to .. "]") @@ -107,13 +109,14 @@ local function byteFieldEventHandler(mainContainer, object, e1, e2, e3, e4, e5) bytes[i] = number end - container:delete() + container:remove() mainContainer:drawOnScreen() end end mainContainer:drawOnScreen() end + menu:addItem("Insert").onTouch = function() local container = MineOSInterface.addUniversalContainer(mainContainer, "Insert bytes at position " .. selection.from .. "") @@ -134,14 +137,16 @@ local function byteFieldEventHandler(mainContainer, object, e1, e2, e3, e4, e5) selection.from, selection.to = insertionPosition, insertionPosition + count - 1 end - container:delete() + container:remove() mainContainer:drawOnScreen() end end mainContainer:drawOnScreen() end + menu:addSeparator() + menu:addItem("Delete").onTouch = function() for i = selection.from, selection.to do table.remove(bytes, selection.from) @@ -152,7 +157,8 @@ local function byteFieldEventHandler(mainContainer, object, e1, e2, e3, e4, e5) selection.to = selection.from end end - menu:show() + + mainContainer:drawOnScreen() else local index = (math.ceil((e4 - object.y + 1) / 2) - 1) * 16 + math.ceil((e3 - object.x + 1 + object.offset) / object.elementWidth) + offset @@ -212,7 +218,7 @@ local charField = window:addChild(newByteField(byteField.localX + byteField.widt local separator = window:addChild(GUI.object(byteField.localX + byteField.width, 5, 1, 21)) separator.draw = function(object) for i = object.y, object.y + object.height - 1 do - buffer.text(object.x, i, colors.separator, "│") + buffer.drawText(object.x, i, colors.separator, "│") end end @@ -222,23 +228,23 @@ window:addChild(GUI.panel(11, 4, window.width - 10, 1, colors.panel)) -- Vertical local verticalCounter = window:addChild(GUI.object(1, 4, 10, window.height - 3)) verticalCounter.draw = function(object) - buffer.square(object.x, object.y, object.width, object.height, colors.panel, colors.panelText, " ") + buffer.drawRectangle(object.x, object.y, object.width, object.height, colors.panel, colors.panelText, " ") local index = offset for y = 2, object.height - 1, 2 do local textColor = colors.panelText if index > selection.from and index < selection.to then - buffer.square(object.x, object.y + y - 1, object.width, 2, colors.panelSeleciton, colors.panelSelecitonText, " ") + buffer.drawRectangle(object.x, object.y + y - 1, object.width, 2, colors.panelSeleciton, colors.panelSelecitonText, " ") textColor = colors.panelSelecitonText end if selection.from >= index and selection.from <= index + 15 or selection.to >= index and selection.to <= index + 15 then - buffer.square(object.x, object.y + y, object.width, 1, colors.selectionFrom, colors.selectionText, " ") + buffer.drawRectangle(object.x, object.y + y, object.width, 1, colors.selectionFrom, colors.selectionText, " ") textColor = colors.selectionText end - buffer.text(object.x + 1, object.y + y, textColor, string.format("%08X", index)) + buffer.drawText(object.x + 1, object.y + y, textColor, string.format("%08X", index)) index = index + 16 end @@ -251,14 +257,14 @@ window:addChild(GUI.object(13, 4, 62, 1)).draw = function(object) for x = 1, object.width, 4 do local textColor = colors.panelText if counter + 1 > restFrom and counter + 1 < restTo then - buffer.square(object.x + x - 2, object.y, 4, 1, colors.panelSeleciton, colors.selectionText, " ") + buffer.drawRectangle(object.x + x - 2, object.y, 4, 1, colors.panelSeleciton, colors.selectionText, " ") textColor = colors.panelSelecitonText elseif restFrom == counter + 1 or restTo == counter + 1 then - buffer.square(object.x + x - 2, object.y, 4, 1, colors.selectionFrom, colors.selectionText, " ") + buffer.drawRectangle(object.x + x - 2, object.y, 4, 1, colors.selectionFrom, colors.selectionText, " ") textColor = colors.selectionText end - buffer.text(object.x + x - 1, object.y, textColor, string.format("%02X", counter)) + buffer.drawText(object.x + x - 1, object.y, textColor, string.format("%02X", counter)) counter = counter + 1 end end @@ -280,7 +286,7 @@ titleTextBox = window:addChild( ) ) titleTextBox.localX = math.floor(window.width / 2 - titleTextBox.width / 2) -titleTextBox:setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +titleTextBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) titleTextBox.eventHandler = nil local saveFileButton = window:addChild(GUI.adaptiveRoundedButton(titleTextBox.localX - 11, 2, 2, 0, colors.panel, colors.panelSelecitonText, colors.panelSelecitonText, colors.panel, "Save")) @@ -309,13 +315,13 @@ local function load(path) scrollBar.value, scrollBar.maximumValue = 0, #bytes status() else - GUI.error("Failed to open file for reading: " .. tostring(reason)) + GUI.alert("Failed to open file for reading: " .. tostring(reason)) end end openFileButton.onTouch = function() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Open", "Cancel", "File name", "/") - filesystemDialog:setMode(GUI.filesystemModes.open, GUI.filesystemModes.file) + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, true, 50, math.floor(mainContainer.height * 0.8), "Open", "Cancel", "File name", "/") + filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE) filesystemDialog:show() filesystemDialog.onSubmit = function(path) load(path) @@ -324,8 +330,8 @@ openFileButton.onTouch = function() end saveFileButton.onTouch = function() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Save", "Cancel", "File name", "/") - filesystemDialog:setMode(GUI.filesystemModes.save, GUI.filesystemModes.file) + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, true, 50, math.floor(mainContainer.height * 0.8), "Save", "Cancel", "File name", "/") + filesystemDialog:setMode(GUI.IO_MODE_SAVE, GUI.IO_MODE_FILE) filesystemDialog:show() filesystemDialog.onSubmit = function(path) local file = io.open(path, "wb") @@ -335,7 +341,7 @@ saveFileButton.onTouch = function() end file:close() else - GUI.error("Failed to open file for writing: " .. tostring(reason)) + GUI.alert("Failed to open file for writing: " .. tostring(reason)) end end end diff --git a/Applications/HoloClock/HoloClock.lua b/Applications/HoloClock/HoloClock.lua index 61ca2d5e..255444fc 100755 --- a/Applications/HoloClock/HoloClock.lua +++ b/Applications/HoloClock/HoloClock.lua @@ -11,7 +11,7 @@ local GUI = require("GUI") -------------------------------------------------------------------------------------------- if not component.isAvailable("hologram") then - GUI.error("This program needs a Tier 2 holo-projector to work") + GUI.alert("This program needs a Tier 2 holo-projector to work") return end @@ -149,7 +149,7 @@ local function drawSymbolOnScreen(x, y, symbol, color) for j = 1, #symbols[symbol] do for i = 1, #symbols[symbol][j] do if symbols[symbol][j][i] == 1 then - buffer.square(xPos, y, 2, 1, color, 0x000000, " ") + buffer.drawRectangle(xPos, y, 2, 1, color, 0x000000, " ") end xPos = xPos + 2 end @@ -204,11 +204,11 @@ local function drawOnScreen() drawText(x, y, date, config.dateColor) y = y + 9 - GUI.label(1, y, buffer.getWidth(), 1, config.dateColor, "Press R to randomize clock color, scroll to change projection scale,"):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top):draw(); y = y + 1 - GUI.label(1, y, buffer.getWidth(), 1, config.dateColor, "or press Enter to save and quit"):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top):draw() + GUI.label(1, y, buffer.getWidth(), 1, config.dateColor, "Press R to randomize clock color, scroll to change projection scale,"):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP):draw(); y = y + 1 + GUI.label(1, y, buffer.getWidth(), 1, config.dateColor, "or press Enter to save and quit"):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP):draw() -- GUI.label(1, y, buffer.getWidth(), 1, 0xFFFFFF, ""):draw() - buffer.draw() + buffer.drawChanges() end -------------------------------------------------------------------------------------------- diff --git a/Applications/MineCodeIDE/Main.lua b/Applications/MineCodeIDE/Main.lua index 860f5590..28fed5c7 100755 --- a/Applications/MineCodeIDE/Main.lua +++ b/Applications/MineCodeIDE/Main.lua @@ -10,27 +10,25 @@ local event = require("event") local unicode = require("unicode") local keyboard = require("keyboard") local GUI = require("GUI") -local MineOSPaths = require("MineOSPaths") local MineOSCore = require("MineOSCore") +local MineOSPaths = require("MineOSPaths") local MineOSInterface = require("MineOSInterface") ------------------------------------------------------------ local config = { leftTreeViewWidth = 27, - syntaxColorScheme = GUI.colors.syntaxHighlighting, + syntaxColorScheme = GUI.LUA_SYNTAX_COLOR_SCHEME, scrollSpeed = 8, cursorColor = 0x00A8FF, cursorSymbol = "┃", cursorBlinkDelay = 0.5, doubleClickDelay = 0.4, - screenResolution = {}, enableAutoBrackets = true, highlightLuaSyntax = true, enableAutocompletion = true, linesToShowOpenProgress = 150, } -config.screenResolution.width, config.screenResolution.height = component.gpu.getResolution() local openBrackets = { ["{"] = "}", @@ -55,7 +53,7 @@ local cursorBlinkState = false local scriptCoroutine local resourcesPath = MineOSCore.getCurrentScriptDirectory() -local configPath = MineOSPaths.applicationData .. "MineCode IDE/Config8.cfg" +local configPath = MineOSPaths.applicationData .. "MineCode IDE/Config9.cfg" local localization = MineOSCore.getCurrentScriptLocalization() local findStartFrom local clipboard @@ -69,12 +67,12 @@ local continue, showBreakpointMessage, showErrorContainer if fs.exists(configPath) then config = table.fromFile(configPath) - GUI.colors.syntaxHighlighting = config.syntaxColorScheme + GUI.LUA_SYNTAX_COLOR_SCHEME = config.syntaxColorScheme end local mainContainer = GUI.fullScreenContainer() -local codeView = mainContainer:addChild(GUI.codeView(1, 1, 1, 1, lines, 1, 1, 1, {}, {}, config.highlightLuaSyntax, 2)) +local codeView = mainContainer:addChild(GUI.codeView(1, 1, 1, 1, 1, 1, 1, {}, {}, GUI.LUA_SYNTAX_PATTERNS, config.syntaxColorScheme, config.syntaxHighlight, lines)) local function convertTextPositionToScreenCoordinates(symbol, line) return @@ -100,7 +98,7 @@ codeView.draw = function(...) x <= codeView.codeAreaPosition + codeView.codeAreaWidth - 2 and y <= codeView.y + codeView.height - 2 then - buffer.text(x, y, config.cursorColor, config.cursorSymbol) + buffer.drawText(x, y, config.cursorColor, config.cursorSymbol) end end end @@ -117,9 +115,9 @@ local topToolBarPanel = topToolBar:addChild(GUI.panel(1, 1, 1, 3, 0xE1E1E1)) local RAMProgressBar = topToolBar:addChild(GUI.progressBar(1, 2, 20, 0x787878, 0xC3C3C3, 0xB4B4B4, 50, true, true, "RAM: ", "%")) local topLayout = topToolBar:addChild(GUI.layout(1, 1, 1, 3, 1, 1)) -topLayout:setCellDirection(1, 1, GUI.directions.horizontal) -topLayout:setCellSpacing(1, 1, 2) -topLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +topLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) +topLayout:setSpacing(1, 1, 2) +topLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) local autocomplete = mainContainer:addChild(GUI.autoComplete(1, 1, 36, 7, 0xE1E1E1, 0xA5A5A5, 0x3C3C3C, 0x3C3C3C, 0xA5A5A5, 0xE1E1E1, 0xC3C3C3, 0x4B4B4B)) @@ -127,25 +125,25 @@ local addBreakpointButton = topLayout:addChild(GUI.adaptiveButton(1, 1, 3, 1, 0x local syntaxHighlightingButton = topLayout:addChild(GUI.adaptiveButton(1, 1, 3, 1, 0xD2D2D2, 0x4B4B4B, 0x696969, 0xE1E1E1, "◌")) syntaxHighlightingButton.switchMode = true -syntaxHighlightingButton.pressed = codeView.highlightLuaSyntax +syntaxHighlightingButton.pressed = codeView.syntaxHighlight local runButton = topLayout:addChild(GUI.adaptiveButton(1, 1, 3, 1, 0x4B4B4B, 0xE1E1E1, 0xD2D2D2, 0x4B4B4B, "▷")) -local title = topLayout:addChild(GUI.textBox(1, 1, 1, 3, 0x0, 0x0, {}, 1):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) +local title = topLayout:addChild(GUI.textBox(1, 1, 1, 3, 0x0, 0x0, {}, 1):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) local titleLines = {} local titleDebugMode = false title.draw = function() local sides = titleDebugMode and 0xCC4940 or 0x5A5A5A - buffer.square(title.x, 2, 1, title.height, sides, 0x0, " ") - buffer.square(title.x + title.width - 1, 2, 1, title.height, sides, 0x0, " ") - buffer.square(title.x + 1, 2, title.width - 2, 3, titleDebugMode and 0x880000 or 0x3C3C3C, 0xE1E1E1, " ") + buffer.drawRectangle(title.x, 2, 1, title.height, sides, 0x0, " ") + buffer.drawRectangle(title.x + title.width - 1, 2, 1, title.height, sides, 0x0, " ") + buffer.drawRectangle(title.x + 1, 2, title.width - 2, 3, titleDebugMode and 0x880000 or 0x3C3C3C, 0xE1E1E1, " ") if titleDebugMode then local text = lastErrorLine and localization.runtimeError or localization.debugging .. (_G.MineCodeIDEDebugInfo and _G.MineCodeIDEDebugInfo.line or "N/A") - buffer.text(math.floor(title.x + title.width / 2 - unicode.len(text) / 2), 3, 0xE1E1E1, text) + buffer.drawText(math.floor(title.x + title.width / 2 - unicode.len(text) / 2), 3, 0xE1E1E1, text) else for i = 1, #titleLines do - buffer.text(math.floor(title.x + title.width / 2 - unicode.len(titleLines[i]) / 2), i + 1, 0xE1E1E1, titleLines[i]) + buffer.drawText(math.floor(title.x + title.width / 2 - unicode.len(titleLines[i]) / 2), i + 1, 0xE1E1E1, titleLines[i]) end end end @@ -169,7 +167,7 @@ local searchInput = bottomToolBar:addChild(GUI.input(7, 1, 10, 3, 0xE1E1E1, 0x96 local searchButton = bottomToolBar:addChild(GUI.adaptiveButton(1, 1, 3, 1, 0x3C3C3C, 0xE1E1E1, 0xB4B4B4, 0x2D2D2D, localization.find)) -local leftTreeView = mainContainer:addChild(GUI.filesystemTree(1, 1, config.leftTreeViewWidth, 1, 0xD2D2D2, 0x3C3C3C, 0x3C3C3C, 0x969696, 0x3C3C3C, 0xE1E1E1, 0xB4B4B4, 0xA5A5A5, 0xB4B4B4, 0x4B4B4B, GUI.filesystemModes.both, GUI.filesystemModes.file)) +local leftTreeView = mainContainer:addChild(GUI.filesystemTree(1, 1, config.leftTreeViewWidth, 1, 0xD2D2D2, 0x3C3C3C, 0x3C3C3C, 0x969696, 0x3C3C3C, 0xE1E1E1, 0xB4B4B4, 0xA5A5A5, 0xB4B4B4, 0x4B4B4B, GUI.IO_MODE_BOTH, GUI.IO_MODE_FILE)) local leftTreeViewResizer = mainContainer:addChild(GUI.resizer(1, 1, 3, 5, 0x696969, 0x0)) @@ -498,52 +496,17 @@ local function removeWindowsLineEndings(text) return result end -local function changeResolution(width, height) - buffer.setResolution(width, height) - calculateSizes() - config.screenResolution.width, config.screenResolution.height = width, height -end - -local function addFadeContainer(title) - return GUI.addFadeContainer(mainContainer, true, true, title) +local function addBackgroundContainer(title) + return GUI.addBackgroundContainer(mainContainer, true, true, title) end local function addInputFadeContainer(title, placeholder) - local container = addFadeContainer(title) + local container = addBackgroundContainer(title) container.input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xC3C3C3, 0x787878, 0x787878, 0xC3C3C3, 0x2D2D2D, "", placeholder)) return container end - -local function changeResolutionWindow() - local container = addFadeContainer(localization.changeResolution) - local inputFieldWidth = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xC3C3C3, 0x787878, 0x787878, 0xC3C3C3, 0x2D2D2D, tostring(config.screenResolution.width))) - local inputFieldHeight = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xC3C3C3, 0x787878, 0x787878, 0xC3C3C3, 0x2D2D2D, tostring(config.screenResolution.height))) - - local maxResolutionWidth, maxResolutionHeight = component.gpu.maxResolution() - inputFieldWidth.validator = function(text) - local number = tonumber(text) - if number and number >= 1 and number <= maxResolutionWidth then return true end - end - inputFieldHeight.validator = function(text) - local number = tonumber(text) - if number and number >= 1 and number <= maxResolutionHeight then return true end - end - - container.panel.eventHandler = function(mainContainer, object, e1) - if e1 == "touch" then - config.screenResolution.width, config.screenResolution.height = tonumber(inputFieldWidth.text), tonumber(inputFieldHeight.text) - saveConfig() - container:delete() - changeResolution(config.screenResolution.width, config.screenResolution.height) - mainContainer:drawOnScreen() - end - end - - mainContainer:drawOnScreen() -end - local function newFile() autocompleteDatabase = {} lines = {""} @@ -565,7 +528,7 @@ local function loadFile(path) local container = mainContainer:addChild(GUI.container(codeView.localX, codeView.localY, codeView.width, codeView.height)) container:addChild(GUI.panel(1, 1, container.width, container.height, 0x1E1E1E)) local layout = container:addChild(GUI.layout(1, 1, container.width, container.height, 1, 1)) - layout:addChild(GUI.label(1, 1, layout.width, 1, 0xD2D2D2, localization.openingFile .. " " .. path):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) + layout:addChild(GUI.label(1, 1, layout.width, 1, 0xD2D2D2, localization.openingFile .. " " .. path):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) local progressBar = layout:addChild(GUI.progressBar(1, 1, 36, 0x969696, 0x2D2D2D, 0x787878, 0, true, true, "", "%")) local counter, currentSize, totalSize = 1, 0, fs.size(path) @@ -592,13 +555,13 @@ local function loadFile(path) end codeView.hidden = false - container:delete() + container:remove() updateAutocompleteDatabaseFromFile() updateTitle() file:close() else - GUI.error(reason) + GUI.alert(reason) end end @@ -611,7 +574,7 @@ local function saveFile(path) end file:close() else - GUI.error("Failed to open file for writing: " .. tostring(reason)) + GUI.alert("Failed to open file for writing: " .. tostring(reason)) end end @@ -621,7 +584,7 @@ local function gotoLineWindow() container.input.onInputFinished = function() if container.input.text:match("%d+") then gotoLine(tonumber(container.input.text)) - container:delete() + container:remove() mainContainer:drawOnScreen() end end @@ -630,8 +593,8 @@ local function gotoLineWindow() end local function openFileWindow() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Open", "Cancel", "File name", "/") - filesystemDialog:setMode(GUI.filesystemModes.open, GUI.filesystemModes.file) + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Open", "Cancel", "File name", "/") + filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE) filesystemDialog.onSubmit = function(path) loadFile(path) mainContainer:drawOnScreen() @@ -640,8 +603,8 @@ local function openFileWindow() end local function saveFileAsWindow() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Save", "Cancel", "File name", "/") - filesystemDialog:setMode(GUI.filesystemModes.save, GUI.filesystemModes.file) + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Save", "Cancel", "File name", "/") + filesystemDialog:setMode(GUI.IO_MODE_SAVE, GUI.IO_MODE_FILE) filesystemDialog.onSubmit = function(path) saveFile(path) leftTreeView:updateFileList() @@ -681,10 +644,10 @@ local function downloadFileFromWeb() newFile() lines, codeView.maximumLineLength = splitStringIntoLines(result) else - GUI.error("Failed to connect to URL: " .. tostring(reason)) + GUI.alert("Failed to connect to URL: " .. tostring(reason)) end - container:delete() + container:remove() mainContainer:drawOnScreen() end end @@ -820,7 +783,7 @@ local function pizda(lines, debug) titleDebugMode = false updateHighlights() - container:delete() + container:remove() mainContainer:drawOnScreen() end @@ -844,7 +807,7 @@ local function pizda(lines, debug) continue() end - textBox:setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + textBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) end backgroundObject.eventHandler = function(mainContainer, object, e1) @@ -913,7 +876,7 @@ local function launchWithArgumentsWindow() table.insert(arguments, argument) end - container:delete() + container:remove() mainContainer:drawOnScreen() run(table.unpack(arguments)) @@ -1016,10 +979,12 @@ local function selectAndPasteColor() startColor = tonumber(unicode.sub(lines[codeView.selections[1].from.line], codeView.selections[1].from.symbol, codeView.selections[1].to.symbol)) or startColor end - local palette = GUI.addPaletteWindowToContainer(mainContainer, startColor) - palette.onSubmit = function() - palette:delete() + local palette = mainContainer:addChild(GUI.addPalette(1, 1, startColor)) + palette.localX, palette.localY = math.floor(mainContainer.width / 2 - palette.width / 2), math.floor(mainContainer.height / 2 - palette.height / 2) + + palette.submitButton.onTouch = function() paste(string.format("0x%06X", palette.color.integer), true) + mainContainer:drawOnScreen() end end @@ -1249,7 +1214,7 @@ local function find() return end else - GUI.error("Wrong searching regex") + GUI.alert("Wrong searching regex") end end @@ -1280,7 +1245,7 @@ local function toggleTopToolBar() end local function createEditOrRightClickMenu(x, y) - local menu = GUI.contextMenu(x, y) + local menu = GUI.addContextMenu(mainContainer, x, y) menu:addItem(localization.cut, not codeView.selections[1], "^X").onTouch = function() cut() @@ -1347,7 +1312,7 @@ local function createEditOrRightClickMenu(x, y) clearBreakpoints() end - menu:show() + mainContainer:drawOnScreen() end codeView.eventHandler = function(mainContainer, object, e1, e2, e3, e4, e5) @@ -1450,9 +1415,6 @@ codeView.eventHandler = function(mainContainer, object, e1, e2, e3, e4, e5) -- Delete elseif e4 == 211 then deleteLine(cursorPositionLine) - -- R - elseif e4 == 19 then - changeResolutionWindow() -- F5 elseif e4 == 63 then launchWithArgumentsWindow() @@ -1571,10 +1533,10 @@ end local topMenuMineCode = topMenu:addItem("MineCode", 0x0) topMenuMineCode.onTouch = function() - local menu = GUI.contextMenu(topMenuMineCode.x, topMenuMineCode.y + 1) + local menu = GUI.addContextMenu(mainContainer, topMenuMineCode.x, topMenuMineCode.y + 1) menu:addItem(localization.about).onTouch = function() - local container = addFadeContainer(localization.about) + local container = addBackgroundContainer(localization.about) local about = { "MineCode IDE", @@ -1596,7 +1558,7 @@ topMenuMineCode.onTouch = function() } local textBox = container.layout:addChild(GUI.textBox(1, 1, 36, #about, nil, 0xB4B4B4, about, 1, 0, 0, true, false)) - textBox:setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + textBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) textBox.eventHandler = nil mainContainer:drawOnScreen() @@ -1606,12 +1568,12 @@ topMenuMineCode.onTouch = function() mainContainer:stopEventHandling() end - menu:show() + mainContainer:drawOnScreen() end local topMenuFile = topMenu:addItem(localization.file) topMenuFile.onTouch = function() - local menu = GUI.contextMenu(topMenuFile.x, topMenuFile.y + 1) + local menu = GUI.addContextMenu(mainContainer, topMenuFile.x, topMenuFile.y + 1) menu:addItem(localization.new, false, "^N").onTouch = function() newFile() @@ -1642,7 +1604,7 @@ topMenuFile.onTouch = function() launchWithArgumentsWindow() end - menu:show() + mainContainer:drawOnScreen() end local topMenuEdit = topMenu:addItem(localization.edit) @@ -1652,7 +1614,7 @@ end local topMenuGoto = topMenu:addItem(localization.gotoCyka) topMenuGoto.onTouch = function() - local menu = GUI.contextMenu(topMenuGoto.x, topMenuGoto.y + 1) + local menu = GUI.addContextMenu(mainContainer, topMenuGoto.x, topMenuGoto.y + 1) menu:addItem(localization.pageUp, false, "PgUp").onTouch = function() pageUp() @@ -1676,22 +1638,22 @@ topMenuGoto.onTouch = function() gotoLineWindow() end - menu:show() + mainContainer:drawOnScreen() end local topMenuProperties = topMenu:addItem(localization.properties) topMenuProperties.onTouch = function() - local menu = GUI.contextMenu(topMenuProperties.x, topMenuProperties.y + 1) + local menu = GUI.addContextMenu(mainContainer, topMenuProperties.x, topMenuProperties.y + 1) menu:addItem(localization.colorScheme).onTouch = function() - local container = GUI.addFadeContainer(mainContainer, true, false, localization.colorScheme) + local container = GUI.addBackgroundContainer(mainContainer, true, false, localization.colorScheme) local colorSelectorsCount, colorSelectorCountX = 0, 4; for key in pairs(config.syntaxColorScheme) do colorSelectorsCount = colorSelectorsCount + 1 end local colorSelectorCountY = math.ceil(colorSelectorsCount / colorSelectorCountX) local colorSelectorWidth, colorSelectorHeight, colorSelectorSpaceX, colorSelectorSpaceY = math.floor(container.width / colorSelectorCountX * 0.8), 3, 2, 1 local startX, y = math.floor(container.width / 2 - (colorSelectorCountX * (colorSelectorWidth + colorSelectorSpaceX) - colorSelectorSpaceX) / 2), math.floor(container.height / 2 - (colorSelectorCountY * (colorSelectorHeight + colorSelectorSpaceY) - colorSelectorSpaceY + 3) / 2) - container:addChild(GUI.label(1, y, container.width, 1, 0xFFFFFF, localization.colorScheme)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 + container:addChild(GUI.label(1, y, container.width, 1, 0xFFFFFF, localization.colorScheme)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 3 local x, counter = startX, 1 local colors = {} @@ -1705,7 +1667,7 @@ topMenuProperties.onTouch = function() local colorSelector = container:addChild(GUI.colorSelector(x, y, colorSelectorWidth, colorSelectorHeight, config.syntaxColorScheme[colors[i][1]], colors[i][1])) colorSelector.onTouch = function() config.syntaxColorScheme[colors[i][1]] = colorSelector.color - GUI.colors.syntaxHighlighting = config.syntaxColorScheme + GUI.LUA_SYNTAX_COLOR_SCHEME = config.syntaxColorScheme saveConfig() end @@ -1719,7 +1681,7 @@ topMenuProperties.onTouch = function() end menu:addItem(localization.cursorProperties).onTouch = function() - local container = addFadeContainer(localization.cursorProperties) + local container = addBackgroundContainer(localization.cursorProperties) local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xC3C3C3, 0x787878, 0x787878, 0xC3C3C3, 0x2D2D2D, config.cursorSymbol, localization.cursorSymbol)) input.onInputFinished = function() @@ -1761,16 +1723,10 @@ topMenuProperties.onTouch = function() toggleEnableAutocompleteDatabase() end - menu:addSeparator() - - menu:addItem(localization.changeResolution, false, "^R").onTouch = function() - changeResolutionWindow() - end - - menu:show() + mainContainer:drawOnScreen() end -leftTreeViewResizer.onResize = function(mainContainer, object, dragWidth, dragHeight) +leftTreeViewResizer.onResize = function(dragWidth, dragHeight) leftTreeView.width = leftTreeView.width + dragWidth calculateSizes() end @@ -1786,8 +1742,8 @@ addBreakpointButton.onTouch = function() end syntaxHighlightingButton.onTouch = function() - codeView.highlightLuaSyntax = not codeView.highlightLuaSyntax - config.highlightLuaSyntax = codeView.highlightLuaSyntax + codeView.syntaxHighlight = not codeView.syntaxHighlight + config.syntaxHighlight = codeView.syntaxHighlight saveConfig() mainContainer:drawOnScreen() end @@ -1847,7 +1803,7 @@ searchButton.onTouch = find autocomplete:moveToFront() leftTreeView:updateFileList() -changeResolution(config.screenResolution.width, config.screenResolution.height) +calculateSizes() updateTitle() updateRAMProgressBar() mainContainer:drawOnScreen() diff --git a/Applications/Palette/Palette.lua b/Applications/Palette/Palette.lua index c2bc3d2e..f2e15c0e 100755 --- a/Applications/Palette/Palette.lua +++ b/Applications/Palette/Palette.lua @@ -2,10 +2,10 @@ local GUI = require("GUI") local MineOSInterface = require("MineOSInterface") -local mainContainer, window = MineOSInterface.addWindow(GUI.windowFromContainer(GUI.palette(1, 1, 0x9900FF))) -window.onSubmit = function() +local mainContainer, window = MineOSInterface.addWindow(GUI.palette(1, 1, 0x9900FF)) +window.submitButton.onTouch = function() window:close() mainContainer:drawOnScreen() end -window.onCancel = window.onSubmit \ No newline at end of file +window.cancelButton.onTouch = window.submitButton.onTouch \ No newline at end of file diff --git a/Applications/PictureEdit/Main.lua b/Applications/PictureEdit/Main.lua index 36b273ea..793acaf0 100644 --- a/Applications/PictureEdit/Main.lua +++ b/Applications/PictureEdit/Main.lua @@ -88,7 +88,7 @@ end local pizdaWidth = 28 mainContainer.sidebarPanel = mainContainer:addChild(GUI.panel(mainContainer.width - pizdaWidth + 1, 2, pizdaWidth, mainContainer.height - 1, 0x3C3C3C)) mainContainer.sidebarLayout = mainContainer:addChild(GUI.layout(mainContainer.sidebarPanel.localX, 2, mainContainer.sidebarPanel.width, mainContainer.sidebarPanel.height, 1, 1)) -mainContainer.sidebarLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +mainContainer.sidebarLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) addTitle(mainContainer.sidebarLayout, "Recent colors") @@ -110,8 +110,8 @@ end local currentToolTitle = addTitle(mainContainer.sidebarLayout, "Tool properties") mainContainer.currentToolLayout = mainContainer.sidebarLayout:addChild(GUI.layout(1, 1, mainContainer.sidebarLayout.width, 1, 1, 1)) -mainContainer.currentToolLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) -mainContainer.currentToolLayout:setCellFitting(1, 1, true, false, 2, 0) +mainContainer.currentToolLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) +mainContainer.currentToolLayout:setFitting(1, 1, true, false, 2, 0) local aboutToolTitle = addTitle(mainContainer.sidebarLayout, "About tool") local aboutToolTextBox = mainContainer.sidebarLayout:addChild(GUI.textBox(1, 1, mainContainer.sidebarLayout.width - 2, 1, nil, 0x787878, {}, 1, 0, 0)) @@ -125,8 +125,8 @@ local function onToolTouch(index) tool = mainContainer.toolsList.itemsLayout.children[index].tool mainContainer.toolsList:select(index) - mainContainer.currentToolOverlay:deleteChildren() - mainContainer.currentToolLayout:deleteChildren() + mainContainer.currentToolOverlay:removeChildren() + mainContainer.currentToolLayout:removeChildren() currentToolTitle.hidden = not tool.onSelection mainContainer.currentToolLayout.hidden = currentToolTitle.hidden @@ -140,7 +140,7 @@ local function onToolTouch(index) mainContainer.currentToolLayout.height = lastChild.localY + lastChild.height - 1 end else - GUI.error(reason) + GUI.alert(reason) end end @@ -175,14 +175,14 @@ for i = 1, #modules do end mainContainer.image.draw = function(object) - GUI.windowShadow(object.x, object.y, object.width, object.height, nil, true) + GUI.drawShadow(object.x, object.y, object.width, object.height, nil, true) local y, text = object.y + object.height + 1, "Size: " .. object.width .. "x" .. object.height - buffer.text(math.floor(object.x + object.width / 2 - unicode.len(text) / 2), y, 0x5A5A5A, text) + buffer.drawText(math.floor(object.x + object.width / 2 - unicode.len(text) / 2), y, 0x5A5A5A, text) if savePath then text = "Path: " .. savePath - buffer.text(math.floor(object.x + object.width / 2 - unicode.len(text) / 2), y + 1, 0x5A5A5A, text) + buffer.drawText(math.floor(object.x + object.width / 2 - unicode.len(text) / 2), y + 1, 0x5A5A5A, text) end local x, y, step, notStep, background, foreground, symbol = object.x, object.y, false, mainContainer.image.width % 2 @@ -234,10 +234,10 @@ local function swapColors() end local function colorSelectorDraw(object) - buffer.square(object.x + 1, object.y, object.width - 2, object.height, object.color, 0x0, " ") + buffer.drawRectangle(object.x + 1, object.y, object.width - 2, object.height, object.color, 0x0, " ") for y = object.y, object.y + object.height - 1 do - buffer.text(object.x, y, object.color, "⢸") - buffer.text(object.x + object.width - 1, y, object.color, "⡇") + buffer.drawText(object.x, y, object.color, "⢸") + buffer.drawText(object.x + object.width - 1, y, object.color, "⡇") end end @@ -268,7 +268,7 @@ mainContainer.image.eventHandler = function(mainContainer, object, e1, e2, e3, e local result, reason = pcall(tool.eventHandler, mainContainer, object, e1, e2, e3, e4, ...) if not result then - GUI.error("Tool eventHandler() failed: " .. reason) + GUI.alert("Tool eventHandler() failed: " .. reason) end end @@ -309,7 +309,7 @@ local function new() container.panel.eventHandler = function(mainContainer, object, e1) if e1 == "touch" then newNoGUI(tonumber(widthInput.text), tonumber(heightInput.text)) - container:delete() + container:remove() mainContainer:drawOnScreen() end end @@ -325,7 +325,7 @@ local function loadImage(path) mainContainer.image.data = result mainContainer.image.reposition() else - GUI.error(reason) + GUI.alert(reason) end end @@ -335,7 +335,7 @@ local function saveImage(path) savePath = path addRecentFile(path) else - GUI.error(reason) + GUI.alert(reason) end end @@ -343,15 +343,15 @@ mainContainer.menu:addItem("PE", 0x00B6FF) local fileItem = mainContainer.menu:addItem("File") fileItem.onTouch = function() - local menu = GUI.contextMenu(fileItem.x, fileItem.y + 1) + local menu = GUI.addContextMenu(mainContainer, fileItem.x, fileItem.y + 1) menu:addItem("New").onTouch = new menu:addSeparator() menu:addItem("Open").onTouch = function() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Open", "Cancel", "File name", "/") - filesystemDialog:setMode(GUI.filesystemModes.open, GUI.filesystemModes.file) + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, true, 50, math.floor(mainContainer.height * 0.8), "Open", "Cancel", "File name", "/") + filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE) filesystemDialog:addExtensionFilter(".pic") filesystemDialog:expandPath(MineOSPaths.desktop) filesystemDialog:show() @@ -376,21 +376,21 @@ fileItem.onTouch = function() local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xE1E1E1, 0x696969, 0x969696, 0xE1E1E1, 0x2D2D2D, "", "http://example.com/test.pic")) input.onInputFinished = function() if #input.text > 0 then - input:delete() - container.layout:addChild(GUI.label(1, 1, container.width, 1, 0x969696, "Downloading file..."):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) + input:remove() + container.layout:addChild(GUI.label(1, 1, container.width, 1, 0x969696, "Downloading file..."):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) mainContainer:drawOnScreen() local temporaryPath = MineOSCore.getTemporaryPath() .. ".pic" local result, reason = web.download(input.text, temporaryPath) - container:delete() + container:remove() if result then loadImage(temporaryPath) fs.remove(temporaryPath) savePath = nil else - GUI.error(reason) + GUI.alert(reason) end mainContainer:drawOnScreen() @@ -407,8 +407,8 @@ fileItem.onTouch = function() end menu:addItem("Save as").onTouch = function() - local filesystemDialog = GUI.addFilesystemDialogToContainer(mainContainer, 50, math.floor(mainContainer.height * 0.8), true, "Save", "Cancel", "File name", "/") - filesystemDialog:setMode(GUI.filesystemModes.save, GUI.filesystemModes.file) + local filesystemDialog = GUI.addFilesystemDialog(mainContainer, true, 50, math.floor(mainContainer.height * 0.8), "Save", "Cancel", "File name", "/") + filesystemDialog:setMode(GUI.IO_MODE_SAVE, GUI.IO_MODE_FILE) filesystemDialog:addExtensionFilter(".pic") filesystemDialog:expandPath(MineOSPaths.desktop) filesystemDialog.filesystemTree.selectedItem = MineOSPaths.desktop @@ -425,7 +425,7 @@ fileItem.onTouch = function() mainContainer:stopEventHandling() end - menu:show() + mainContainer:drawOnScreen() end mainContainer.menu:addItem("View").onTouch = function() @@ -438,7 +438,7 @@ mainContainer.menu:addItem("View").onTouch = function() if e1 == "touch" then config.transparencyBackground, config.transparencyForeground = colorSelector1.color, colorSelector2.color - container:delete() + container:remove() mainContainer:drawOnScreen() saveConfig() end diff --git a/Applications/PictureEdit/Tools/1.lua b/Applications/PictureEdit/Tools/1.lua index fa26cd92..a3e6d0df 100644 --- a/Applications/PictureEdit/Tools/1.lua +++ b/Applications/PictureEdit/Tools/1.lua @@ -133,26 +133,26 @@ selector.eventHandler = tool.eventHandler selector.draw = function() local step = true for x = selector.x + 1, selector.x + selector.width - 2 do - buffer.text(x, selector.y, step and 0xFFFFFF or 0x0, "━") - buffer.text(x, selector.y + selector.height - 1, step and 0xFFFFFF or 0x0, "━") + buffer.drawText(x, selector.y, step and 0xFFFFFF or 0x0, "━") + buffer.drawText(x, selector.y + selector.height - 1, step and 0xFFFFFF or 0x0, "━") step = not step end step = true for y = selector.y + 1, selector.y + selector.height - 2 do - buffer.text(selector.x, y, step and 0xFFFFFF or 0x0, "┃") - buffer.text(selector.x + selector.width - 1, y, step and 0xFFFFFF or 0x0, "┃") + buffer.drawText(selector.x, y, step and 0xFFFFFF or 0x0, "┃") + buffer.drawText(selector.x + selector.width - 1, y, step and 0xFFFFFF or 0x0, "┃") step = not step end - buffer.text(selector.x, selector.y, 0x0, "┏") - buffer.text(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x0, "┛") + buffer.drawText(selector.x, selector.y, 0x0, "┏") + buffer.drawText(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x0, "┛") - buffer.text(selector.x + selector.width - 1, selector.y, 0x0, "┓") - buffer.text(selector.x, selector.y + selector.height - 1, 0x0, "┗") + buffer.drawText(selector.x + selector.width - 1, selector.y, 0x0, "┓") + buffer.drawText(selector.x, selector.y + selector.height - 1, 0x0, "┗") - buffer.text(touchX, touchY, 0x66FF80, "⬤") - buffer.text(dragX, dragY, 0x66FF80, "⬤") + buffer.drawText(touchX, touchY, 0x66FF80, "⬤") + buffer.drawText(dragX, dragY, 0x66FF80, "⬤") end ------------------------------------------------------ diff --git a/Applications/PictureEdit/Tools/3.lua b/Applications/PictureEdit/Tools/3.lua index 5bc77f24..d738f5e1 100644 --- a/Applications/PictureEdit/Tools/3.lua +++ b/Applications/PictureEdit/Tools/3.lua @@ -13,7 +13,7 @@ local x, y, stepX, stepY, buttonWidth, buttonHeight, buttonCount, buttons, curre local buttonsContainer = GUI.container(1, 1, (buttonWidth + stepX) * buttonCount - stepX, (buttonHeight + stepY) * buttonCount - stepY) local buttonsLayout = GUI.layout(1, 1, buttonsContainer.width, buttonsContainer.height, 1, 1) -buttonsLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +buttonsLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) buttonsLayout:addChild(buttonsContainer) local widthInput = GUI.input(1, 1, 1, 1, 0x2D2D2D, 0xC3C3C3, 0x5A5A5A, 0x2D2D2D, 0xD2D2D2, "", "Width") diff --git a/Applications/PictureEdit/Tools/7.lua b/Applications/PictureEdit/Tools/7.lua index 3ee6430b..b8a50bd0 100644 --- a/Applications/PictureEdit/Tools/7.lua +++ b/Applications/PictureEdit/Tools/7.lua @@ -39,7 +39,7 @@ tool.eventHandler = function(mainContainer, object, e1, e2, e3, e4) end end - input:delete() + input:remove() mainContainer:drawOnScreen() end diff --git a/Applications/Png.lua b/Applications/Png.lua deleted file mode 100644 index 5512794f..00000000 --- a/Applications/Png.lua +++ /dev/null @@ -1,132 +0,0 @@ ---[[ - PNGView - by TehSomeLuigi, 2014 - - Intended for use with OpenComputers. - - Feel free to use however you wish. - This header must however be preserved should this be redistributed, even - if in a modified form. - - This software comes with no warranties whatsoever. -]]-- - -local args = {...} - ---package.loaded.libPNGimage = nil ---package.loaded.deflatelua = nil - -local term = require("term") -local fs = require("filesystem") -local shell = require("shell") -local component = require("component") -local bit = require("bit32") -local PNGImage = require("libPNGimage") - - -local out = io.stdout -local err = io.stderr - -if not args[1] then - print("Enter filename of PNG Image:") - io.stdout:write(": ") - args[1] = io.read() -elseif args[1] == "-h" or args[1] == "--help" or args[1] == "-?" then - print(" * PNGView Help *") - print("Usage: pngview") - print(" (asks for filename)") - print("Usage: pngview ") - print("Use Ctrl+C to exit once started.") -end - -args[1] = shell.resolve(args[1]) - -if not fs.exists(args[1]) then - io.stderr:write(" * PNGView Error *\n") - io.stderr:write("The file '" .. tostring(args[1]) .. "' does not exist on the filesystem.\n") - return -end - -if not component.isAvailable("gpu") then - io.stderr:write(" * PNGView Error *\n") - io.stderr:write("Component API says there is no primary GPU.\n") - return -end - -local gpu = component.getPrimary("gpu") - --- now attempt to load the PNG image --- run in protected call to handle potential errors - -local success, pngiOrError = pcall(PNGImage.newFromFile, args[1]) - -if not success then - io.stderr:write(" * PNGView: PNG Loading Error *\n") - io.stderr:write("While attempting to load '" .. tostring(args[1]) .. "' as PNG, libPNGImage erred:\n") - io.stderr:write(pngiOrError) - return -end - -local pngi = pngiOrError - -local imgW, imgH = pngi:getSize() -local maxresW, maxresH = gpu.maxResolution() - -if imgW > maxresW then - -- in future, we will attempt some scaling or scrolling - io.stderr:write(" * PNGView: PNG Display Error *\n") - io.stderr:write("Resolution not satisfactory: A width resolution of at least " .. imgW .. " is required, only " .. maxresW .. " available:\n") - io.stderr:write(pngiOrError) - return -end - -if imgH > maxresH then - -- in future, we will attempt some scaling or scrolling - io.stderr:write(" * PNGView: PNG Display Error *\n") - io.stderr:write("Resolution not satisfactory: A height resolution of at least " .. imgH .. " is required, only " .. maxresH .. " available:\n") - io.stderr:write(pngiOrError) - return -end - -local oldResW, oldResH = gpu.getResolution() -- store for later -local oldBackN, oldBackB = gpu.getBackground() -local oldForeN, oldForeB = gpu.getForeground() - - -local block = string.char(226, 150, 136) -local trans = string.char(226, 150, 145) - - -gpu.setResolution(maxresW, maxresH) -gpu.setBackground(0x000000, false) - -local function drawPngImage(x, y) - for j = 0, imgW-1 do - for i = 0, imgH-1 do - local r, g, b, a = pngi:getPixel(i, j) - - if a > 0 then - gpu.setForeground(bit.bor(bit.lshift(r, 16), bit.bor(bit.lshift(g, 8), b)), false) - --gpu.set(x+1, y+1, block) - gpu.fill(x + i * 2, y + j, 2, 1, block) - --print(x, y, r, g, b, a, bit.bor(bit.lshift(r, 16), bit.bor(bit.lshift(g, 8), b))) - --[[else - gpu.setForeground(0x888888, false) - gpu.set(x+1, y+1, trans) - --print(x, y, r, g, b, a, 'tr') - ]] - end - --print(x, y, r, g, b, a) - end - end -end - -ecs.prepareToExit() - -drawPngImage(2, 2) - -ecs.waitForTouchOrClick() - -gpu.setResolution(oldResW, oldResH) -gpu.setForeground(oldForeN, oldForeB) -gpu.setBackground(oldBackN, oldBackB) diff --git a/Applications/PrintImage/Main.lua b/Applications/PrintImage/Main.lua index b6e40561..41745d89 100755 --- a/Applications/PrintImage/Main.lua +++ b/Applications/PrintImage/Main.lua @@ -15,7 +15,7 @@ local MineOSCore = require("MineOSCore") ----------------------------------------- cyka ----------------------------------------- -if not component.isAvailable("printer3d") then GUI.error("This program requires at least one 3D-printer"); return end +if not component.isAvailable("printer3d") then GUI.alert("This program requires at least one 3D-printer"); return end local args, options = require("shell").parse(...) local startImagePath = args[1] == "open" and args[2] or "/MineOS/System/Icons/Steve.pic" local configPath = MineOSPaths.applicationData .. "PrintImage/Config.cfg" @@ -105,7 +105,7 @@ local function beginPrint() end GUI.progressBar(math.floor(buffer.getWidth() / 2 - 25), math.floor(buffer.getHeight() / 2), 50, 0x3366CC, 0xFFFFFF, 0xFFFFFF, math.ceil(counter * 100 / (xShapeCount * yShapeCount)), true, true, "Progress: ", "%"):draw() - buffer.draw() + buffer.drawChanges() -- else -- error("Printing out of mainImage range") end @@ -141,7 +141,7 @@ local function beginPrint() buffer.clear() mainContainer:draw() - buffer.draw(true) + buffer.drawChanges(true) end ----------------------------------------- Window-zaluped parasha ----------------------------------------- @@ -174,12 +174,12 @@ local function drawMainImageObject(object) if mainImage then local xImage = image.getWidth(mainImage) < buffer.getWidth() and math.floor(buffer.getWidth() / 2 - image.getWidth(mainImage) / 2) or 1 local yImage = image.getHeight(mainImage) < buffer.getHeight() and math.floor(buffer.getHeight() / 2 - image.getHeight(mainImage) / 2) or 1 - buffer.image(xImage, yImage, mainImage) - GUI.windowShadow(xImage, yImage, image.getWidth(mainImage), image.getHeight(mainImage), 50, true) + buffer.drawImage(xImage, yImage, mainImage) + GUI.drawShadow(xImage, yImage, image.getWidth(mainImage), image.getHeight(mainImage), 50, true) if config.showGrid then for x = xImage, xImage + image.getWidth(mainImage) - 1, shapeResolutionLimit do verticalLine(x, yImage, image.getHeight(mainImage), 0.627) end for y = yImage, yImage + image.getHeight(mainImage) - 1, shapeResolutionLimit / 2 do horizontalLine(xImage, y, image.getWidth(mainImage), 0.627) end - buffer.text(1, 1, 0xBBBBBB, "хуй") + buffer.drawText(1, 1, 0xBBBBBB, "хуй") end end end @@ -194,7 +194,7 @@ local function createWindow() mainContainer.shadeContainer:addChild(GUI.panel(1, 1, mainContainer.shadeContainer.width, mainContainer.shadeContainer.height, 0x0000000, 0.4)) local y = 2 - mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Main properties")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Main properties")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) y = y + 2 mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Image path:")) @@ -240,7 +240,7 @@ local function createWindow() end y = y + 4 - mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Frame properties")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Frame properties")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) y = y + 2 mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Enabled:")) local frameSwitch = mainContainer.shadeContainer:addChild(GUI.switch(mainContainer.shadeContainer.width - 9, y, 8, 0xFFDB40, 0xAAAAAA, 0xFFFFFF, config.frame.enabled)) @@ -265,7 +265,7 @@ local function createWindow() frameWidthSlider.roundValues = true y = y + 5 - mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Light emission")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Light emission")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) y = y + 2 mainContainer.shadeContainer:addChild(GUI.label(3, y, mainContainer.shadeContainer.width, 1, 0xCCCCCC, "Enabled:")) local lightSwitch = mainContainer.shadeContainer:addChild(GUI.switch(mainContainer.shadeContainer.width - 9, y, 8, 0xFFDB40, 0xAAAAAA, 0xFFFFFF, config.lightEmission.enabled)) @@ -283,9 +283,9 @@ local function createWindow() end y = y + 5 - mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Summary information:")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top) + mainContainer.shadeContainer:addChild(GUI.label(1, y, mainContainer.shadeContainer.width, 1, 0xFFFFFF, "Summary information:")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) y = y + 2 - mainContainer.shadeContainer.statusTextBox = mainContainer.shadeContainer:addChild(GUI.textBox(3, y, mainContainer.shadeContainer.width - 4, 5, nil, 0xCCCCCC, {}, 1)):setAlignment(GUI.alignment.horizontal.left, GUI.alignment.vertical.top) + mainContainer.shadeContainer.statusTextBox = mainContainer.shadeContainer:addChild(GUI.textBox(3, y, mainContainer.shadeContainer.width - 4, 5, nil, 0xCCCCCC, {}, 1)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) mainContainer.shadeContainer:addChild(GUI.button(1, mainContainer.shadeContainer.height - 5, mainContainer.shadeContainer.width, 3, 0x363636, 0xFFFFFF, 0xFFFFFF, 0x262626, "Exit")).onTouch = function() mainContainer:stopEventHandling() diff --git a/Applications/RayWalk/Main.lua b/Applications/RayWalk/Main.lua index 772fbbac..aad93baf 100755 --- a/Applications/RayWalk/Main.lua +++ b/Applications/RayWalk/Main.lua @@ -35,12 +35,12 @@ local function settings() local sliderWidth, textBoxWidth = 43, 19 local x, y = math.floor(window.width / 2 - sliderWidth / 2), math.floor(window.height / 2 - 19) - window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, localization.rayEngineProperties)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 + window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, localization.rayEngineProperties)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 3 local resolutionTextBoxWidth = window:addChild(GUI.input(x, y, textBoxWidth, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(buffer.getWidth()), nil, true)) window:addChild(GUI.label(x + textBoxWidth + 2, y + 1, 1, 1, 0xFFFFFF, "X")) local resolutionTextBoxHeight = window:addChild(GUI.input(x + textBoxWidth + 5, y, textBoxWidth, 3, 0x262626, 0xBBBBBB, 0xBBBBBB, 0x262626, 0xFFFFFF, tostring(buffer.getHeight()), nil, true)); y = y + 4 - window:addChild(GUI.label(1, y, window.width, 1, 0xDDDDDD, localization.screenResolution)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 + window:addChild(GUI.label(1, y, window.width, 1, 0xDDDDDD, localization.screenResolution)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 3 resolutionTextBoxWidth.validator = function(text) local num = tonumber(text); if num and num >= 40 and num <= 160 then return true end end resolutionTextBoxHeight.validator = function(text) local num = tonumber(text); if num and num >= 12 and num <= 50 then return true end end local function onAnyResolutionTextBoxInputFinished() @@ -55,28 +55,28 @@ local function settings() drawDistanceSlider.onValueChanged = function() rayEngine.properties.drawDistance = drawDistanceSlider.value window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 4 local shadingDistanceSlider = window:addChild(GUI.slider(x, y, sliderWidth, 0xFFDB80, 0x000000, 0xFFDB40, 0xDDDDDD, 100, 3000, rayEngine.properties.shadingDistance, true, localization.shadingDistance)) shadingDistanceSlider.onValueChanged = function() rayEngine.properties.shadingDistance = shadingDistanceSlider.value window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 4 local shadingCascadesSlider = window:addChild(GUI.slider(x, y, sliderWidth, 0xFFDB80, 0x000000, 0xFFDB40, 0xDDDDDD, 2, 48, rayEngine.properties.shadingCascades, true, localization.shadingCascades)) shadingCascadesSlider.onValueChanged = function() rayEngine.properties.shadingCascades = shadingCascadesSlider.value window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 4 local raycastQualitySlider = window:addChild(GUI.slider(x, y, sliderWidth, 0xFFDB80, 0x000000, 0xFFDB40, 0xDDDDDD, 0.5, 32, rayEngine.properties.raycastQuality, true, localization.raycastQuality)) raycastQualitySlider.onValueChanged = function() rayEngine.properties.raycastQuality = raycastQualitySlider.value window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 4 local currentTimeSlider = window:addChild(GUI.slider(x, y, sliderWidth, rayEngine.world.colors.sky.current, 0x000000, rayEngine.world.colors.sky.current, 0xDDDDDD, 0, rayEngine.world.dayNightCycle.length, rayEngine.world.dayNightCycle.currentTime, true, localization.dayNightCycle, localization.seconds)) @@ -86,7 +86,7 @@ local function settings() currentTimeSlider.colors.active = rayEngine.world.colors.sky.current currentTimeSlider.colors.pipe = rayEngine.world.colors.sky.current window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 4 window:addChild(GUI.label(x, y, sliderWidth, 1, 0xDDDDDD, localization.enableSemipixelRenderer)) @@ -95,7 +95,7 @@ local function settings() graphonSwitch.onStateChanged = function() rayEngine.properties.useSimpleRenderer = not graphonSwitch.state window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 3 window:addChild(GUI.label(x, y, sliderWidth, 1, 0xDDDDDD, localization.enableDayNightCycle)) @@ -104,12 +104,12 @@ local function settings() lockTimeSwitch.onStateChanged = function() rayEngine.world.dayNightCycle.enabled = lockTimeSwitch.state window:draw() - buffer.draw() + buffer.drawChanges() end; y = y + 3 window:addChild(GUI.button(x, y, sliderWidth, 3, 0xEEEEEE, 0x262626, 0xBBBBBB, 0x262626, localization.continue)).onTouch = function() window:stopEventHandling(); table.toFile(applicationResourcesDirectory .. "RayEngine.cfg", rayEngine.properties, true) end - window:draw(); buffer.draw(); window:startEventHandling() + window:draw(); buffer.drawChanges(); window:startEventHandling() end local function menu() @@ -125,11 +125,11 @@ local function menu() for file in fs.list(worldsPath) do table.insert(worlds, unicode.sub(file, 1, -2)) end local x, y = math.floor(window.width / 2 - buttonWidth / 2), math.floor(window.height / 2 - #worlds * (buttonHeight + 1) / 2 - 11) - window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, rayWalkVersion)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 + window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, rayWalkVersion)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 3 window:addChild(GUI.button(x, y, buttonWidth, buttonHeight, 0xEEEEEE, 0x262626, 0xBBBBBB, 0x262626, localization.continue)).onTouch = function() window:stopEventHandling() end; y = y + buttonHeight + 1 window:addChild(GUI.button(x, y, buttonWidth, buttonHeight, 0xEEEEEE, 0x262626, 0xBBBBBB, 0x262626, localization.settings)).onTouch = function() window:stopEventHandling(); settings() end; y = y + buttonHeight + 1 - window:addChild(GUI.button(x, y, buttonWidth, buttonHeight, 0xEEEEEE, 0x262626, 0x999999, 0x262626, localization.exit)).onTouch = function() buffer.clear(0x000000); buffer.draw(); os.exit() end; y = y + buttonHeight + 1 - window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, localization.loadWorld)):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 2 + window:addChild(GUI.button(x, y, buttonWidth, buttonHeight, 0xEEEEEE, 0x262626, 0x999999, 0x262626, localization.exit)).onTouch = function() buffer.clear(0x000000); buffer.drawChanges(); os.exit() end; y = y + buttonHeight + 1 + window:addChild(GUI.label(1, y, window.width, 1, 0xFFFFFF, localization.loadWorld)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 2 for i = 1, #worlds do window:addChild(GUI.button(x, y, buttonWidth, buttonHeight, 0xEEEEEE, 0x262626, 0xBBBBBB, 0x262626, worlds[i])).onTouch = function() rayEngine.loadWorld(worldsPath .. worlds[i]); window:stopEventHandling() end @@ -139,9 +139,9 @@ local function menu() local lines = {}; for i = 1, #localization.controlsHelp do table.insert(lines, localization.controlsHelp[i]) end table.insert(lines, 1, " ") table.insert(lines, 1, {text = localization.controls, color = 0xFFFFFF}) - window:addChild(GUI.textBox(1, y, window.width, #lines, nil, 0xCCCCCC, lines, 1):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)); y = y + #lines + 1 + window:addChild(GUI.textBox(1, y, window.width, #lines, nil, 0xCCCCCC, lines, 1):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)); y = y + #lines + 1 - window:draw(); buffer.draw(); window:startEventHandling() + window:draw(); buffer.drawChanges(); window:startEventHandling() end diff --git a/Applications/Stargate/Main.lua b/Applications/Stargate/Main.lua index 8cdf3721..1e033d8d 100755 --- a/Applications/Stargate/Main.lua +++ b/Applications/Stargate/Main.lua @@ -9,7 +9,7 @@ local MineOSPaths = require("MineOSPaths") local MineOSCore = require("MineOSCore") local MineOSInterface = require("MineOSInterface") if not component.isAvailable("stargate") then - GUI.error("This program requires stargate from mod \"SGCraft\"") + GUI.alert("This program requires stargate from mod \"SGCraft\"") return end local stargate = component.stargate @@ -38,10 +38,10 @@ end local function chevronDraw(object) local inactiveColor, activeColor, fadeColor = 0x332400, 0xFFDB00, 0xCC6D00 - -- buffer.square(object.x, object.y, object.width, object.height, object.isActivated and fadeColor or inactiveColor) - -- buffer.square(object.x + 1, object.y, 3, object.height, object.isActivated and activeColor or inactiveColor) - -- buffer.text(object.x + 2, object.y + 1, object.isActivated and 0x0 or 0xFFFFFF, object.text) - buffer.image(object.x, object.y, object.isActivated and Ch1Image or Ch2Image) + -- buffer.drawRectangle(object.x, object.y, object.width, object.height, object.isActivated and fadeColor or inactiveColor) + -- buffer.drawRectangle(object.x + 1, object.y, 3, object.height, object.isActivated and activeColor or inactiveColor) + -- buffer.drawText(object.x + 2, object.y + 1, object.isActivated and 0x0 or 0xFFFFFF, object.text) + buffer.drawImage(object.x, object.y, object.isActivated and Ch1Image or Ch2Image) return object end @@ -118,12 +118,12 @@ local function newThing(x, y, width, height) object.draw = function(object) local x, y = object.x + object.width - 1, math.floor(object.y + object.height / 2) for i = object.y, object.y + object.height - 1 do - buffer.text(x, i, 0xEEEEEE, "│") + buffer.drawText(x, i, 0xEEEEEE, "│") end for i = object.x, object.x + width - 1 do - buffer.text(i, y, 0xEEEEEE, "─") + buffer.drawText(i, y, 0xEEEEEE, "─") end - buffer.text(x, y, 0xEEEEEE, "┤") + buffer.drawText(x, y, 0xEEEEEE, "┤") end return object @@ -159,8 +159,8 @@ addChevron(79, 30) mainContainer:addChild(newThing(mainContainer.SGImage.localX + mainContainer.SGImage.width, y, mainContainer.width - mainContainer.SGImage.localX - mainContainer.SGImage.width - width - 7, height)) -mainContainer:addChild(GUI.label(x, y, width, 1, 0xEEEEEE, "Stargate " .. stargate.localAddress())):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 1 -mainContainer.connectedToLabel = mainContainer:addChild(GUI.label(x, y, width, 1, 0x555555, "(Not connected)")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 2 +mainContainer:addChild(GUI.label(x, y, width, 1, 0xEEEEEE, "Stargate " .. stargate.localAddress())):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 1 +mainContainer.connectedToLabel = mainContainer:addChild(GUI.label(x, y, width, 1, 0x555555, "(Not connected)")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 2 mainContainer.connectionButton = mainContainer:addChild(GUI.framedButton(x, y, width, 3, 0xEEEEEE, 0xEEEEEE, 0xBBBBBB, 0xBBBBBB, "Connect")); y = y + 3 -- mainContainer.connectionButton.animated = false mainContainer.connectionButton.onTouch = function() @@ -172,7 +172,7 @@ mainContainer.connectionButton.onTouch = function() dial(input.text) contacts.last = input.text saveContacts() - container:delete() + container:remove() mainContainer:drawOnScreen() end @@ -205,7 +205,7 @@ mainContainer.messageContactButton.onTouch = function() local input = container.layout:addChild(GUI.input(1, 1, 36, 3, 0xEEEEEE, 0x666666, 0x666666, 0xEEEEEE, 0x262626, nil, "Type message text here")) input.onInputFinished = function() if input.text then - container:delete() + container:remove() stargate.sendMessage(input.text) mainContainer:drawOnScreen() @@ -221,7 +221,7 @@ mainContainer.messageContactButton.onTouch = function() mainContainer:drawOnScreen() end -mainContainer:addChild(GUI.label(x, y, width, 1, 0xEEEEEE, "Contacts")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 2 +mainContainer:addChild(GUI.label(x, y, width, 1, 0xEEEEEE, "Contacts")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 2 mainContainer.contactsComboBox = mainContainer:addChild(GUI.comboBox(x, y, width, 3, 0x3C3C3C, 0xBBBBBB, 0x555555, 0x888888)); y = y + 4 mainContainer.connectContactButton = mainContainer:addChild(GUI.framedButton(x, y, width, 3, 0xEEEEEE, 0xEEEEEE, 0xBBBBBB, 0xBBBBBB, "Connect")); y = y + 3 @@ -252,7 +252,7 @@ mainContainer.addContactButton.onTouch = function() updateButtons() end - container:delete() + container:remove() mainContainer:drawOnScreen() end end @@ -273,7 +273,7 @@ mainContainer.removeContactButton.onTouch = function() end end -mainContainer:addChild(GUI.label(x, y, width, 1, 0xEEEEEE, "Energy to dial")):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 2 +mainContainer:addChild(GUI.label(x, y, width, 1, 0xEEEEEE, "Energy to dial")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); y = y + 2 mainContainer.fuelProgressBar = mainContainer:addChild(GUI.progressBar(x, y, width, 0xBBBBBB, 0x0, 0xEEEEEE, 100, true, true, "", "%")); y = y + 3 mainContainer.exitButton = mainContainer:addChild(GUI.framedButton(x, y, width, 3, 0xEEEEEE, 0xEEEEEE, 0xBBBBBB, 0xBBBBBB, "Exit")); y = y + 4 mainContainer.exitButton.onTouch = function() @@ -297,7 +297,7 @@ mainContainer.eventHandler = function(mainContainer, object, e1, e2, e3, e4) mainContainer:drawOnScreen() end elseif e1 == "sgMessageReceived" then - GUI.error(e3) + GUI.alert(e3) end end @@ -307,5 +307,5 @@ update() updateChevrons(stargate.stargateState() == "Connected") mainContainer:draw() -buffer.draw(true) +buffer.drawChanges(true) mainContainer:startEventHandling() \ No newline at end of file diff --git a/Applications/Symbols/Main.lua b/Applications/Symbols/Main.lua index b84ce20a..91e8d8cf 100644 --- a/Applications/Symbols/Main.lua +++ b/Applications/Symbols/Main.lua @@ -21,7 +21,7 @@ local recent = { -------------------------------------------------------------------- -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 90, 23, 0xE1E1E1)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 90, 23, 0xE1E1E1)) local sidePanel = window:addChild(GUI.panel(1, 1, 17, 1, 0x2D2D2D)) local buttonsContainer = window:addChild(GUI.container(3, 2, 1, 1)) @@ -29,8 +29,8 @@ local horizontalResizer = window:addChild(GUI.resizer(1, 1, 10, 3, 0x969696, 0x0 local verticalResizer = window:addChild(GUI.resizer(1, 1, 3, 5, 0x969696, 0x0)) local sideLayout = window:addChild(GUI.layout(1, 4, sidePanel.width, 1, 1, 1)) -sideLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) -sideLayout:setCellFitting(1, 1, true, false, 2, 0) +sideLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) +sideLayout:setFitting(1, 1, true, false, 2, 0) local texts = {} for i = 1, 5 do @@ -60,9 +60,9 @@ local function updateChars() end local recentLayout = sideLayout:addChild(GUI.layout(1, 1, 1, 1, 1, 1)) -recentLayout:setCellDirection(1, 1, GUI.directions.horizontal) -recentLayout:setCellSpacing(1, 1, 0) -recentLayout:setCellAlignment(1, 1, GUI.alignment.horizontal.center, GUI.alignment.vertical.top) +recentLayout:setDirection(1, 1, GUI.DIRECTION_HORIZONTAL) +recentLayout:setSpacing(1, 1, 0) +recentLayout:setAlignment(1, 1, GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) local function onRecentButtonTouch(mainContainer, object) fromChar = object.code @@ -110,7 +110,7 @@ window.onResize = function(width, height) nextButton.localY = height - 2 prevButton.localY = height - 5 - buttonsContainer:deleteChildren() + buttonsContainer:removeChildren() local horizontalCount = math.floor((buttonsContainer.width + horizontalSpacing) / (buttonWidth + horizontalSpacing)) local verticalCount = math.floor((buttonsContainer.height + verticalSpacing) / (buttonHeight + verticalSpacing)) @@ -184,11 +184,11 @@ gotoInput.onInputFinished = function() end end -horizontalResizer.onResize = function(mainContainer, object, dragX, dragY) +horizontalResizer.onResize = function(dragX, dragY) window:resize(window.width, window.height + dragY) end -verticalResizer.onResize = function(mainContainer, object, dragX, dragY) +verticalResizer.onResize = function(dragX, dragY) window:resize(window.width + dragX, window.height) end diff --git a/Applications/Translate/Main.lua b/Applications/Translate/Main.lua index 4cf03edf..6d419264 100644 --- a/Applications/Translate/Main.lua +++ b/Applications/Translate/Main.lua @@ -49,10 +49,10 @@ local switchButton = layout:addChild(GUI.adaptiveRoundedButton(1, 1, 3, 1, 0x2D2 local toComboBox = layout:addChild(GUI.comboBox(1, 1, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x444444, 0x888888)) local toInputField = layout:addChild(GUI.input(1, 1, elementWidth, 5, 0x2D2D2D, 0x666666, 0x444444, 0x3C3C3C, 0xBBBBBB, nil, nil)) -layout:addChild(GUI.label(1, 1, elementWidth, 1, 0xAAAAAA, "API Key:"):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) +layout:addChild(GUI.label(1, 1, elementWidth, 1, 0xAAAAAA, "API Key:"):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) local APIKeyInputField = layout:addChild(GUI.input(1, 1, elementWidth, 1, 0x1E1E1E, 0x666666, 0x444444, 0x1E1E1E, 0xBBBBBB, config.APIKey, "Введите API Key", true)) -local infoLabel = layout:addChild(GUI.label(1, 1, elementWidth, 1, 0xFF6D40, " "):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top)) +local infoLabel = layout:addChild(GUI.label(1, 1, elementWidth, 1, 0xFF6D40, " "):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)) ------------------------------------------------------------------------------------------------------------------ @@ -184,7 +184,8 @@ checkLanguages() fromComboBox.selectedItem = getLanguageIndex(config.fromLanguage, false) toComboBox.selectedItem = getLanguageIndex(config.toLanguage, false) -mainContainer:drawOnScreen() +mainContainer:draw() +buffer.drawChanges(true) mainContainer:startEventHandling() diff --git a/Applications/Update.paste b/Applications/Update.paste deleted file mode 100644 index 7b790b17..00000000 --- a/Applications/Update.paste +++ /dev/null @@ -1 +0,0 @@ -return "0nm5b1ju" diff --git a/Applications/Weather/Weather.lua b/Applications/Weather/Weather.lua index 3bc73613..7e72a538 100755 --- a/Applications/Weather/Weather.lua +++ b/Applications/Weather/Weather.lua @@ -15,7 +15,7 @@ local MineOSPaths = require("MineOSPaths") -------------------------------------------------------------------------------------------------------- -local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 130, 30, 0)) +local mainContainer, window = MineOSInterface.addWindow(GUI.filledWindow(1, 1, 130, 30, 0)) window.backgroundPanel.colors.transparency = 0.2 local weatherContainer = window:addChild(GUI.container(1, 1, 1, 23)) @@ -77,12 +77,12 @@ local function newWeather(x, y, day) local wind = day.speed .. " m/s, " .. (winds[math.round(day.deg / 45)] or "N/A") local function centerText(y, color, text) - buffer.text(math.floor(object.x + object.width / 2 - unicode.len(text) / 2), y, color, text) + buffer.drawText(math.floor(object.x + object.width / 2 - unicode.len(text) / 2), y, color, text) end object.draw = function() centerText(object.y, 0xFFFFFF, os.date("%a", day.dt)) - buffer.image(object.x + 3, object.y + 2, weatherIcons[type]) + buffer.drawImage(object.x + 3, object.y + 2, weatherIcons[type]) centerText(object.y + 7, 0xFFFFFF, temp) centerText(object.y + 8, 0xDDDDDD, wind) centerText(object.y + 9, 0xBBBBBB, pressure) @@ -98,15 +98,15 @@ local function updateForecast() result = json:decode(result) if result.list then - weatherContainer:deleteChildren() + weatherContainer:removeChildren() local x, y = 1, 1 local currentDay = result.list[1] local object = weatherContainer:addChild(GUI.object(x + 2, y, 40, 8)) object.draw = function() bigLetters.drawText(object.x, object.y, 0xFFFFFF, math.round((currentDay.temp.max + currentDay.temp.min) / 2) .. "°") - buffer.text(object.x, object.y + 6, 0xFFFFFF, result.city.name .. ", " .. result.city.country) - buffer.text(object.x, object.y + 7, 0xFFFFFF, "Population: " .. math.shorten(result.city.population, 2)) + buffer.drawText(object.x, object.y + 6, 0xFFFFFF, result.city.name .. ", " .. result.city.country) + buffer.drawText(object.x, object.y + 7, 0xFFFFFF, "Population: " .. math.shorten(result.city.population, 2)) end y = y + object.height + 1 @@ -127,10 +127,10 @@ local function updateForecast() MineOSInterface.mainContainer:drawOnScreen() table.toFile(configPath, config) else - GUI.error(result.message) + GUI.alert(result.message) end else - GUI.error("Wrong result. Check city name and try again.") + GUI.alert("Wrong result. Check city name and try again.") end end diff --git a/Applications/convertImage.lua b/Applications/convertImage.lua deleted file mode 100644 index 82daa69b..00000000 --- a/Applications/convertImage.lua +++ /dev/null @@ -1,27 +0,0 @@ -local args = {...} - -local libraries = { - buffer = "doubleBuffering", - image = "image", - fs = "filesystem", - GUI = "GUI", -} - -for library in pairs(libraries) do if not _G[library] then _G[library] = require(libraries[library]) end end; libraries = nil - ------------------------------------------------------------------------------------------------------------------- -buffer.start() - -if fs.exists(args[1]) then - local cyka = image.load(args[1]) - buffer.clear(0x000000) - buffer.image(1, 1, cyka) - buffer.draw() - - if args[2] then - fs.makeDirectory(fs.path(args[2]) or "") - image.save(args[2], cyka, 4) - end -else - GUI.error("Файл \"" .. args[1] .. "\" не существует") -end diff --git a/Applications/palette.lua b/Applications/palette.lua deleted file mode 100644 index ffbc8d70..00000000 --- a/Applications/palette.lua +++ /dev/null @@ -1,9 +0,0 @@ -local palette = require("palette") - -local color = palette.draw() - -if color == nil then color = "никакой. Че, серьезно? Вообще ничего не выбрал? Во петух, а?" end - -print(" ") -print("Выбранный цвет = "..tostring(color)) -print(" ") diff --git a/Applications/scale.lua b/Applications/scale.lua deleted file mode 100755 index fa6fabdc..00000000 --- a/Applications/scale.lua +++ /dev/null @@ -1,17 +0,0 @@ -local ecs = require("ECSAPI") -local gpu = require("component").gpu - -local arg = {...} -if arg[1] == "get" or arg[1] == "show" or arg[1] == "print" or arg[1] == "write" or arg[1] == "info" or arg[1] == "help" then - local max1, max2 = gpu.maxResolution() - local cur1, cur2 = gpu.getResolution() - local scale = cur1 / max1 * 100 - print(" ") - print("Maximum resolution: " .. max1 .. "x".. max2) - print("Current resolution: " .. cur1 .. "x" .. cur2) - print(" ") - print("Scale: " .. scale .. "%") - print(" ") -else - ecs.setScale(tonumber(arg[1]) or 1) -end diff --git a/Documentation/Russian/GUI.md b/Documentation/Russian/GUI.md new file mode 100644 index 00000000..9f88aeae --- /dev/null +++ b/Documentation/Russian/GUI.md @@ -0,0 +1,1987 @@ +| Содержание | +| ----- | +| [О библиотеке](#О-библиотеке) | +| [Установка](#Установка) | +| [Standalone-методы](#standalone-методы) | +| [    GUI.contextMenu](#guicontextmenu-x-y--table-contextmenu) | +| [    GUI.error](#guierror-text-) | +| [Контейнеры](#Контейнеры) | +| [    GUI.container](#guicontainer-x-y-width-height--table-container) | +| [    GUI.layout](#guilayout-x-y-width-height-columns-rows--table-container) | +| [Виджеты](#Виджеты) | +| [    GUI.object](#guiobject-x-y-width-height--table-object) | +| [Анимация](#Анимация) | +| [Готовые виджеты](#Готовые-виджеты) | +| [    GUI.panel](#guipanel-x-y-width-height-color-transparency--table-panel) | +| [    GUI.text](#guitext-x-y-textcolor-text--table-text) | +| [    GUI.label](#guilabel-x-y-width-height-textcolor-text--table-label) | +| [    GUI.image](#guiimage-x-y-loadedimage--table-image) | +| [    GUI.button](#guibutton-x-y-width-height-buttoncolor-textcolor-buttonpressedcolor-textpressedcolor-text--table-button) | +| [    GUI.actionButtons](#guiactionbuttons-x-y-fat--table-actionbuttons) | +| [    GUI.input](#guiinput-x-y-width-height-backgroundcolor-textcolor-placeholdertextcolor-backgroundfocusedcolor-textfocusedcolor-text-placeholdertext-erasetextonfocus-textmask--table-input) | +| [    GUI.slider](#guislider-x-y-width-primarycolor-secondarycolor-pipecolor-valuecolor-minimumvalue-maximumvalue-value-showcornervalues-currentvalueprefix-currentvaluepostfix--table-slider) | +| [    GUI.switch](#guiswitch-x-y-width-primarycolor-secondarycolor-pipecolor-state--table-switch) | +| [    GUI.switchAndLabel](#guiswitchandlabel-x-y-width-switchwidth-primarycolor-secondarycolor-pipecolor-textcolor-text-switchstate--table-switchandlabel) | +| [    GUI.colorSelector](#guicolorselector-x-y-width-height-color-text--table-colorselector) | +| [    GUI.list](#guilist-x-y-width-height-itemsize-spacing-backgroundcolor-textcolor-alternatebackgroundcolor-alternatetextcolor-backgroundselectedcolor-textselectedcolor--offsetmode--table-list) | +| [    GUI.comboBox](#guicombobox-x-y-width-elementheight-backgroundcolor-textcolor-arrowbackgroundcolor-arrowtextcolor--table-combobox) | +| [    GUI.menu](#guimenu-x-y-width-backgroundcolor-textcolor-backgroundpressedcolor-textpressedcolor-backgroundtransparency--table-menu) | +| [    GUI.resizer](#guiresizer-x-y-width-height-resizercolor-arrowcolor--table-resizer) | +| [    GUI.progressBar](#guiprogressbar-x-y-width-primarycolor-secondarycolor-valuecolor-value-thin-showvalue-valueprefix-valuepostfix--table-progressbar) | +| [    GUI.filesystemTree](#guifilesystemtree-x-y-width-height-backgroundcolor-directorycolor-filecolor-arrowcolor-backgroundselectioncolor-textselectioncolor-arrowselectioncolor-disabledcolor-scrollbarbackground-scrollbarforeground-showmode-selectionmode--table-filesystemtree) | +| [    GUI.filesystemChooser](#guifilesystemchooser-x-y-width-height-backgroundcolor-textcolor-tipbackgroundcolor-tiptextcolor-initialtext-sumbitbuttontext-cancelbuttontext-placeholdertext-filesystemdialogmode-filesystemdialogpath--table-filesystemchooser) | +| [    GUI.codeView](#guicodeview-x-y-width-height-lines-fromsymbol-fromline-maximumlinelength-selections-highlights-highlightluasyntax-indentationwidth--table-codeview) | +| [    GUI.chart](#guichart-x-y-width-height-axiscolor-axisvaluecolor-axishelperscolor-chartcolor-xaxisvalueinterval-yaxisvalueinterval-xaxispostfix-yaxispostfix-fillchartarea-values--table-chart) | +| [    GUI.brailleCanvas](#guibraillecanvas-x-y-width-height--table-braillecanvas) | +| [    GUI.scrollBar](#guiscrollbar-x-y-width-height-backgroundcolor-foregroundcolor-minimumvalue-maximumvalue-value-shownvaluecount-onscrollvalueincrement-thinhorizontalmode--table-scrollbar) | +| [    GUI.textBox](#guitextbox-x-y-width-height-backgroundcolor-textcolor-lines-currentline-horizontaloffset-verticaloffset-autowrap-autoheight-table-textbox) | +| [Практические примеры](#Практические-примеры) | +| [    Пример #1: Окно авторизации](#Пример-1-Окно-авторизации) | +| [    Пример #2: Создание собственного виджета](#Пример-2-Создание-собственного-виджета) | +| [    Пример #3: Углубленная работа с Layout](#Пример-3-Углубленная-работа-с-layout) | +| [    Пример #4: Анимация собственного виджета](#Пример-4-Анимация-собственного-виджета) | + + +О библиотеке +====== +GUI - многофункциональная графическая библиотека, отлаженная под использование маломощными компьютерами с максимально возможной производительностью. С ее помощью можно реализовать самые извращенные фантазии: от банальных кнопок, слайдеров и графиков до сложных анимированных интерфейсов. Быстродействие библиотеки достигается за счет использования двойной буферизации и сложных группировочных алгоритмов. + +К примеру, моя операционная система, среда разработки и 3D-приложение полностью реализованы методами данной библиотеки: + +![Imgur](https://i.imgur.com/Ki5bX0I.gif) + +![Imgur](http://i.imgur.com/tHAiTmF.gif) + +Пусть обилие текста и вас не пугает, в документации имеется множество наглядных иллюстрированных примеров и практических задач. + +Установка +====== + +| Библиотека | Функционал | Документация | +| ------ | ------ | ------ | +| *[GUI](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/GUI.lua)* | Данная библиотека | - | +| *[advancedLua](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/advancedLua.lua)* | Дополнение стандартных библиотек Lua множеством функций: быстрой сериализацией таблиц, переносом строк, методами обработки бинарных данных и т.д. | [https://github.com/Igor...](https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/advancedLua.md) | +| *[color](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/color.lua)* | Экструзия и упаковка цветовых каналов, преобразовывание цветовой модели RGB в HSB и наоборот, осуществление альфа-блендинга, генерировация цветовых транзиций и конвертация цвета в 8-битный формат для палитры OpenComputers | [https://github.com/Igor...](https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/color.md) | +| *[doubleBuffering](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/doubleBuffering.lua)* | Двойная буферизация графического контекста и различные методы растеризации примитивов | [https://github.com/Igor...](https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/doubleBuffering.md) | +| *[image](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/image.lua)* | Реализация стандарта изображений для OpenComputers и базовые методы их обработки: транспонирование, обрезка, поворот, отражение и т.д. | - | +| *[OCIF](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/FormatModules/OCIF.lua)* | Модуль формата изображения OCIF (OpenComputers Image Format) для библиотеки image, написанный с учетом особенностей мода и реализующий эффективное сжатие пиксельных данных | - | + +Вы можете использовать имеющиеся выше ссылки для установки зависимостей вручную или запустить автоматический [установщик](https://pastebin.com/ryhyXUKZ), загружающий все необходимые файлы за вас: + + pastebin run ryhyXUKZ + +Standalone-методы +====== + +Библиотека имеет несколько полезных независимых методов, упрощающих разработку программ. К таковым относятся, к примеру, контекстное меню и информационное alert-окно. + +GUI.**contextMenu**( x, y ): *table* contextMenu +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата меню по оси x | +| *int* | y | Координата меню по оси y | + +Метод открывает по указанным координатам контекстное меню и ожидает действий пользователя. При выборе какого-либо элемента будет вызван его callback-метод .**onTouch**, если таковой имеется. + +Если контекстное меню содержит слишком большое количество элементов, то появятся удобные кнопочки и поддержка колеса мыши для прокрутки содержимого. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**addItem**( *string* text, *boolean* disabled, *string* shortcut, *int* color )| Добавить в контекстное меню элемент с указанными параметрами. При параметре disabled элемент не будет реагировать на клики мышью. Каждый элемент может иметь собственный callback-метод .**onTouch** для последующей обработки данных | +| *function* | :**addSeparator**()| Добавить в контекстное меню визуальный разделитель | +| *function* | :**addSubMenu**(*string* text): *table* contextMenu| Добавить в данное контекстное меню другое контекстное меню. Возвращаемый методом объект меню самостоятелен и поддерживает все описанные выше методы | | + +Example of implementation: + +```lua +local buffer = require("doubleBuffering") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local contextMenu = GUI.contextMenu(2, 2) +contextMenu:addItem("New") +contextMenu:addItem("Open").onTouch = function() + -- Do something to open file or whatever +end + +local subMenu = contextMenu:addSubMenu("Open with") +subMenu:addItem("Explorer.app") +subMenu:addItem("Viewer.app") +subMenu:addItem("Finder.app") +subMenu:addSeparator() +subMenu:addItem("Browse...") + +contextMenu:addSeparator() +contextMenu:addItem("Save", true) +contextMenu:addItem("Save as") +contextMenu:addSeparator() +for i = 1, 25 do + contextMenu:addItem("Do something " .. i) +end + +-------------------------------------------------------------------------------- + +buffer.clear(0x2D2D2D) +buffer.draw(true) +contextMenu:show() +``` + +Result: + +![Imgur](http://i.imgur.com/A9NCEdc.gif) + +GUI.**error**( text ) +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *string* | text | Текст информационного окна | + + +Показать отладочное окно с текстовой информацией. Слишком длинная строка будет автоматически перенесена. Для закрытия окна необходимо использовать клавишу return или нажать на кнопку "ОК". + +Example of implementation: + +```lua +local buffer = require("doubleBuffering") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +buffer.clear(0x2D2D2D) +GUI.error("Something went wrong here, my friend") +``` + +Result: + +![Imgur](http://i.imgur.com/s8mA2FL.png?1) + +Контейнеры +====== + +Вся библиотека делится на две основные кострукции: контейнеры и виджеты. Контейнер предназначен для группировки нескольких виджетов и их конвеерной обработки, поэтому в первую очередь необходимо изучить особенности работы с контейнерами. + +GUI.**container**( x, y, width, height ): *table* container +----------------------------------------------------------- +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата контейнера по оси x | +| *int* | y | Координата контейнера по оси y | +| *int* | width | Ширина контейнера | +| *int* | height | Высота контейнера | + +Каждый контейнер - это группировщик для других объектов, его поведение очень похоже на папку, содержащую множество вложенных файлов и других папок. Для создания контейнера по размеру экрана используйте метод GUI.**fullScreenContainer**(). + +Все дочерние элементы контейнера имеют две позиции. Первая позиция локальна, она используется для расположения объектов внутри контейнеров. Именно с ней пользователь взаимодействует большую часть времени. + +```lua +object.localX = 2 +object.localY = 4 +``` + +Вторая позиция - глобальная, экранная. Она позволяет получить текущую координату объекта на экране, то есть стартовую точку, относительно которой производится пиксельная отрисовка. Эти координаты существуют в виде **read-only**, рассчитываются автоматически и нужны исключительно для написания собственных виджетов: + +```lua +object.x = 10 +object.y = 20 +``` + +Наглядно система иерархии и позиционирования контейнеров и дочерних элементов представлена на следущем изображении: + +![Imgur](http://i.imgur.com/nU2bLU8.png?1) + +У контейнеров имеется немаловажная особенность: любой дочерний элемент, выступающий за границы контейнера, будет отрисован только в рамках размера этого контейнера: + +![Imgur](http://i.imgur.com/PMtOpNS.png?1) + +Для добавления в контейнер дочернего элемента используйте следующую синтаксическую конструкцию: + +```lua +container.addChild(<Объект>) +``` + +При этом координаты объекта, указанные при его инициализации, автоматически становятся локальными. К примеру, для добавления кнопки на локальную позицию **x = 5, y = 10** используйте: + +```lua +container.addChild(GUI.button(5, 10, ...)) +``` + +Разумеется, в контейнер можно добавлять другие контейнеры, а в добавленные - еще одни, создавая сложные иерархические цепочки и группируя дочерние объекты по своему усмотрению. + +И наконец, самая важная особенность контейнеров - это автоматизированная обработка системных событий, позволяющая кнопкам "нажиматься" при клике, слайдерам перемещаться, а полям для ввода текста получать данные с клавиатуры. Во время обработки событий текущий контейнер и всего его вложенные объекты будут рекурсивно проанализированы на наличие метода-обработчика *object*.**eventHandler**: именно он позволяет взаимодействовать с объектами в реальном времени. Для старта обработки событий необходимо использовать следующее: + +```lua +container:startEventHandling() +``` + +Если метод-обработчик у анализируемого объекта имеется, то он будет вызван со следующими аргументами: *container* **mainContainer**, *object* **object**, ... *varargs* **eventData**. Первым аргументом является контейнер, обрабатывающий события, вторым - текущий рассматриваемый объект обработчика событий, а все остальные - это множество данных события. Например, у события **key_down** этими данными будут **key_down**, **<адрес компонента клавиатуры>**, **<код символа>**, **<код клавиши>**, **<имя пользователя>**. + +Ниже приведен исходный код обработчика событий GUI.**button**. Как видите, в начале событие анализируется на соответствие "touch", затем кнопка визуально "нажимается", а в конце вызывается метод кнопки .*onTouch*, если он вообще имеется. + +```lua +button.eventHandler = function(mainContainer, button, event, ...) + if event == "touch" then + button.pressed = true + mainContainer:drawOnScreen() + + os.sleep(0.2) + + button.pressed = false + mainContainer:drawOnScreen() + + if button.onTouch then + button.onTouch(mainContainer, object, event, ...) + end + end +end +``` + +Ключевая деталь обработчика событий в том, что если событие "экранное", то есть относящееся к клику пользователя на монитор (touch, drag, drop, scroll), то метод-обработчик объекта будет вызван только в том случае, если на пути прослеживания клика не имеется никаких других объектов, после чего обработка событий для оставшихся необработанных дочерних элементов завершится. Если событие не относится к экрану (key_down, clipboard и т.д.), или же объект не имеет метода-обработчика, то обработка оставшихся дочерних элементов продолжится в прежнем виде. + +Если необходимо прекратить обработку событий, то необходимо вызвать метод :**stopEventHandling**(). + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**addChild**(*table* child, [*int* atIndex]): *table* child| Добавить произвольный объект в контейнер в качестве дочернего - таким образом вы способны создавать собственные виджеты с индивидуальными особенностями. Уточняю, что у добавляемого объекта **обязательно** должен иметься метод *:draw* (подробнее см. ниже). При добавлении объекта его глобальные координаты становятся локальными. Если указан опциональный параметр *atIndex*, то элемент будет добавлен на соответствующую позицию | +| *function* | :**deleteChildren**([*int* fromIndex, *int* toIndex]): *table* container | Удалить все дочерние элементы контейнера. Если указаны опциональные параметры индексов элементов, то удаление будет произведено в соответствующем диапазоне | +| *function* | :**draw**(): *table* container | Рекурсивная отрисовка содержимого контейнера в порядке очереди его дочерних элементов. Обращаю внимание на то, что данный метод осуществляет отрисовку только в экранный буфер. Для отображения изменений на экране необходимо использовать метод библиотеки двойного буфера *.draw()* | +| *function* | :**drawOnScreen**(*boolean* force): *table* container | Метод аналогичен :**draw**() с той лишь разницей, что после отрисовки контейнера в экранный буфер он автоматически отображает изменения на экране. То есть по факту он существует исключительно для удобства написания кода | +| *function* | :**startEventHandling**([*float* delay]): *table* container | Запуск обработчика событий для данного контейнера и всех вложенных в него дочерних элементов. Параметр *delay* аналогичен таковому в computer.**pullSignal** | +| *function* | :**stopEventHandling**(): *table* container | Остановка обработчика событий для данного контейнера | + +GUI.**layout**( x, y, width, height, columns, rows ): *table* container +----------------------------------------------------- + +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | columnCount | Количество рядов сетки | +| *int* | rowCount | Количество строк сетки | + +Layout является наследником GUI.**container**, автоматически располагающим дочерние объекты внутри себя. К примеру, если вам хочется визуально красиво отобразить множество объектов, не тратя время на ручной расчет координат, то layout создан для вас. На картинке ниже подробно показана структура layout размером 4x3: + +![Imgur](http://i.imgur.com/qf91PuM.png) + +В данном примере мы имеем 12 ячеек, каждая из которых может иметь собственную ориентацию объектов, расстояние между ними, а также выравнивание по границам. Границы ячеек условны, так что дочерние объекты могут без проблем выходить за них, если это допускает указанный alignment. + +Каждому столбцу и каждому ряду можно задать свой индивидуальный размер либо в пикселях, либо в процентном отношении, так что работа с layout фантастически удобна. + +| Type | Property | Description | +| ------ | ------ | ------ | +|*boolean*| .**showGrid**| Включение или отключение отображения границ координатной сетки. По умолчанию равно false | +| *function* | :**setGridSize**(*int* columnCount, *int* columnCount): *layout* layout | Установить размер сетки. Все объекты, находящиеся вне диапазона нового размера, должны быть размещены в сетке заново через :**setCellPosition**() | +| *function* | :**setColumnWidth**(*int* column, *enum* sizePolicy, *float* size): *layout* layout | Установить ширину указанного столбца. Ширина может быть двух типов: GUI.**sizePolicies.absolute** или GUI.**sizePolicies.percentage**. В первом случае ширина выражена в пикселях, и не меняется при изменении размеров layout, а во втором она выражена дробным числом в промежутке **[0; 1]**, обозначающим процентную ширину столбца. Если указана процентная ширина, и справа от выбранного столбца имеются другие, то их процентная ширина будет автоматически перерассчитана до нужных процентных значений. | +| *function* | :**setRowHeight**(*int* row, *enum* sizePolicy, *float* size): *layout* layout | Установить высоту указанного ряда. Поведение метода аналогично **:setColumnWidth** | +| *function* | :**addColumn**(*enum* sizePolicy, *float* size): *layout* layout | Добавить в сетку layout пустой столбец с указанным размером | +| *function* | :**addRow**(*enum* sizePolicy, *float* size): *layout* layout | Добавить в сетку layout пустой ряд с указанным размером | +| *function* | :**removeColumn**(*int* column): *layout* layout | Удалить из сетки layout указанный столбец | +| *function* | :**removeRow**(*int* row): *layout* layout | Удалить из сетки layout указанный ряд | +| *function* | :**setCellPosition**(*int* column, *int* row, *object* child): *object* child| Назначить дочернему объекту layout конкретную ячейку сетки. В одной ячейке может располагаться сколь угодно много объектов. | +| *function* | :**setCellDirection**(*int* column, *int* row, *enum* direction): *layout* layout | Назначить ячейке сетки ориентацию дочерних объектов. Поддерживаются GUI.DIRECTION_HORIZONTAL и GUI.DIRECTION_VERTICAL | +| *function* | :**setCellAlignment**(*int* column, *int* row, *enum* GUI.alignment.vertical, *enum* GUI.alignment.horizontal): *layout* layout | Назначить ячейке сетки метод выравнивания дочерних объектов. Поддерживаются все 9 вариантов | +| *function* | :**setCellSpacing**(*int* column, *int* row, *int* spacing): *layout* layout | Назначить ячейке сетки расстояние в пикселях между объектами. По умолчанию оно равняется 1 | +| *function* | :**setCellMargin**(*int* column, *int* row, *int* horizontalMargin, *int* verticalMargin): *layout* layout | Назначить ячейке сетки отступы в пикселях в зависимости от текущего *alignment* этой ячейки | +| *function* | :**setCellFitting**(*int* column, *int* row, *int* horizontalFitting, *int* verticalFitting [, *int* horizontalOffset, *int* verticalOffset] ): *layout* layout | Назначить ячейке сетки параметр автоматического назначения размера дочерних элементов равным размеру соответствующего ряда/столбца. Если указаны опциональные параметры, то имеется возможноть установки отступа по ширине и высоте, т.е. размер объектов будет равен "размер_ячейки - величина_отступа" | + +Example of implementation: +```lua +local image = require("image") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +-- Создаем полноэкранный контейнер, добавляем на него загруженное изображение и полупрозрачную черную панель +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.image(1, 1, image.load("/MineOS/Pictures/Raspberry.pic"))) +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D, 0.4)) + +-- Добавляем в созданный контейнер layout с сеткой размером 5x1 +local layout = mainContainer:addChild(GUI.layout(1, 1, mainContainer.width, mainContainer.height, 5, 1)) + +-- Добавяляем в layout 9 кнопок, назначая им соответствующие позиции в сетке. +-- Как видите, сначала создается объект кнопки, затем он добавляется в качестве дочернего к layout, +-- а в конце концов ему назначается позиция сетки. +layout:setCellPosition(1, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 1"))) +layout:setCellPosition(2, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 2"))) +layout:setCellPosition(2, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 3"))) +layout:setCellPosition(3, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 4"))) +layout:setCellPosition(3, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 5"))) +layout:setCellPosition(3, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 6"))) +layout:setCellPosition(4, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 7"))) +layout:setCellPosition(4, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 8"))) +layout:setCellPosition(5, 1, layout:addChild(GUI.button(1, 1, 26, 3, 0xEEEEEE, 0x000000, 0xAAAAAA, 0x000000, "Button 9"))) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/ti58Z75.png?1) + +Как видите, 9 кнопок автоматически сгруппировались по 5 ячейкам сетки. Визуально структура созданного layout выглядит так: + +![Imgur](http://i.imgur.com/4l7uK25.png) + +Также мы можем модифицировать код, чтобы кнопки группировались в 3 колонки, а расстояние между ними было равным 4 пикселям. А заодно включим отображение координатной сетки и активируем автоматический расчет ширины объектов в 3 колонке: + +```lua +-- Включаем отображение границ сетки +layout.showGrid = true +-- Изменяем размер сетки на 3x1 +layout:setGridSize(3, 1) +-- Устанавливаем расстояние между объектами для каждой колонки +for column = 1, 3 do + layout:setCellSpacing(column, 1, 4) +end +-- Обновляем позиции трех последних кнопок, чтобы они принадлежали третьей колонке +for child = 7, 9 do + layout:setCellPosition(3, 1, layout.children[child]) +end +-- Включаем автоматическое изменение ширины дочерних элементов в ячейке 3x1 +layout:setCellFitting(3, 1, true, false) +``` +Result: + +![Imgur](http://i.imgur.com/C2TWOJ7.png) + +Более подробно работа с layout рассмотрена в практическом примере 4 в конце документа. + +Виджеты +====== + +После понимания концепции контейнеров можно с легкостью приступить к добавлению виджетов в созданный контейнер. Каждый виджет - это наследник объекта типа GUI.**object** + +GUI.**object**( x, y, width, height ): *table* object +----------------------------------------------------- +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | + +Помимо координат и размера GUI.**object** имеет несколько универсальных свойств: + +| Тип свойства| Свойство |Описание | +| ------ | ------ | ------ | +| *boolean* | .**hidden** | Является ли объект скрытым. Если объект скрыт, то его отрисовка и анализ системных событий игнорируются | +| *boolean* | .**disabled** | Является ли объект отключенным. Если объект отключен, то он рисуется, однако все системные события при обработке игнорируются | +| *function* | :**draw**() | Обязательный метод, вызываемый для отрисовки виджета на экране. Он может быть определен пользователем любым удобным для него образом. Данный метод осуществляет отрисовку только в экранный буфер, а не на экран | +| *function* | :**isPointInside**( *int* x, *int* y ): *boolean* isPointInside | Метод для проверки вхождения точки в прямоугольный объект. Используется родительскими методами контейнеров и удобен для ручной проверки пересечения указанных координат с расположением объекта на экране | + +После добавления объекта в контейнер с помощью метода :**addChild** он приобретает дополнительные свойства для удобства использования: + +| Тип свойства| Свойство |Описание | +| ------ | ------ | ------ | +| *table* | .**parent** | Указатель на таблицу-контейнер родителя этого виджета | +| *int* | .**localX** | Локальная позиция по оси X в родительском контейнере | +| *int* | .**localY** | Локальная позиция по оси Y в родительском контейнере | +| *function* | :**indexOf**() | Получить индекс данного виджета в родительском контейнере | +| *function* | :**moveForward**() | Передвинуть виджет "назад" в иерархии виджетов контейнера | +| *function* | :**moveBackward**() | Передвинуть виджет "вперед" в иерархии виджетов контейнера | +| *function* | :**moveToFront**() | Передвинуть виджет в конец иерархии виджетов контейнера | +| *function* | :**moveToBack**() | Передвинуть виджет в начало иерархии виджетов контейнера | +| *function* | :**getFirstParent**() | Рекурсивно получить первый родительский контейнер. При существовании множества вложенных контейнеров метод вернет первый в иерархии и "главный" из них | +| *function* | :**delete**() | Удалить этот объект из родительского контейнера. Грубо говоря, это удобный способ самоуничтожения | +| *function* | :**addAnimation**(*function* frameHandler, *function* onFinish): *table* animation | Добавить к этому объекту анимацию. Подробнее об анимациях и их создании см. ниже | +| [*callback-function* | .**eventHandler**(*container* mainContainer, *object* object, ... *varargs* eventData) ]| Необязательный метод для обработки системных событий, вызываемый обработчиком родительского контейнера. Если он имеется у рассматриваемого объекта, то будет вызван с соотвествующими аргументами | + +Анимация +====== +Каждый виджет может быть без проблем анимирован при желании. К примеру, ниже представлена анимация GUI.**switch**. + +![Imgur](http://i.imgur.com/f5aO73U.gif) + +Чтобы добавить анимацию к виджету, вызовите метод *<виджет>*:**addAnimation**(*function* frameHandler, *function* onFinish). Данный метод возвращает объект анимации для дальнейшего использования, имеющий следущие свойства: + +| Тип свойства| Свойство |Описание | +| ------ | ------ | ------ | +| *table* | .**object** | Указатель на таблицу виджета, к которому была добавлена анимация | +| *float* | .**position** | Текущая позиция воспроизведения анимации. Всегда находится в диапазоне [0.0; 1.0], где левая граница - начало анимации, а правая - ее конец | +| *function* | :**start**() | Метод, начинающий воспроизведение анимации. **Важная деталь**: во время воспроизведения анимации контейнер, содержащий анимированные объекты, временно будет обрабатывать события с максимально возможной скоростью. По окончанию воспроизведения задержка между вызовами .**pullSignal** станет такой, какой была изначально | +| *function* | :**stop**() | Метод, завершающий воспроизведение анимации | +| *function* | :**delete**() | Метод, удаляющий анимацию из объекта | +| *callback-function* | .**frameHandler**(*table* mainContainer, *table* animation) | Функция-обработчик кадра анимации. Вызывается автоматически каждый раз перед отрисовкой объекта. Первым параметром идет главный контейнер, в котором вызван обработчик событий, а вторым - объект анимации | +| *callback-function* | .**onFinish**() | Функция, вызываемая по окончанию воспроизведения анимации. Отмечу, что метод **:stop()** не вызывает срабатывания **.onFinish** | + +Создание анимированных объектов во всех подробностях описано в практическом примере в конце документа. + +Готовые виджеты +====== + +Далее перечислены виджеты, поставляющиеся вместе с библиотекой и созданные на основе описанных выше инструкций. При желании вы можете сделать абсолютно аналогичные или гораздо более технически продвинутые виджеты без каких-либо затруднений. Подробнее о создании собственных виджетов см. практические примеры в конце документации. + +GUI.**panel**( x, y, width, height, color, [transparency] ): *table* panel +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | color | Цвет панели | +| [*int* | transparency] | Опциональная прозрачность панели | + +Создать объект типа "панель", представляющий собой закрашенный прямоугольник с определенной опциональной прозрачностью. В большинстве случаев служит декоративным элементом. + +Для изменения внешнего вида панели через код достаточно обратиться к таблице объекта .**colors**, имеющей следующую структуру: +```lua +panel.colors = { + background = 0xFFFFFF + transparency = 0; +} +``` + +Example of implementation: +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() + +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x262626)) +mainContainer:addChild(GUI.panel(10, 10, mainContainer.width - 20, mainContainer.height - 20, 0x880000)) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/Rho1RTl.png?1) + +GUI.**text**( x, y, textColor, text ): *table* text +-------------------------------------------------------------------- +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | textColor | Цвет текста лейбла| +| *string* | text | Текст лейбла | + +Простой текстовый виджет для отображения информации. Ширина объекта рассчитывается автоматически в зависимости от длины текста, а сам текст выравнивается по левому верхнему краю + +Example of implementation: +```lua +local GUI = require("GUI") + +--------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.text(3, 2, 0xFFFFFF, "Hello, world!")) +mainContainer:addChild(GUI.text(3, 3, 0xFFFFFF, "How are you? Wanna cast some EEWRD meatballs?")) + +--------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/ygqLguM.png) + +GUI.**label**( x, y, width, height, textColor, text ): *table* label +-------------------------------------------------------------------- +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | textColor | Цвет текста лейбла| +| *string* | text | Текст лейбла | + +Текстовый лейбл - это продвинутый вариант GUI.**text** с поддержкой различных вариантов выравнивания + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**setAlignment**(*enum* horizontalAlignment, *enum* verticalAlignment): *table* label| Выбрать вариант отображения текста относительно границ лейбла | + +Example of implementation: +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [left, top] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_TOP) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [center, top] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [right, top] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_TOP) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [left, center] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_CENTER) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [center, center] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_CENTER) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [right, center] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_CENTER) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [left, bottom] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_LEFT, GUI.ALIGNMENT_VERTICAL_BOTTOM) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [center, bottom] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_BOTTOM) +mainContainer:addChild(GUI.label(1, 1, mainContainer.width, mainContainer.height, 0xFFFFFF, "Label with [right, bottom] alighment")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_BOTTOM) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/ftonciY.png) + +GUI.**image**( x, y, loadedImage ): *table* image +------------------------------------------------- +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *table* | loadedImage | Изображение, загруженное методом *image.load()* | + +Этот виджет предназначен для отображения загруженного ранее изображения + +| Type | Property | Description | +| ------ | ------ | ------ | +| *table* | .**image**| Таблица пиксельных данных изображения | + +Example of implementation: + +```lua +local image = require("image") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.image(2, 2, image.load("/Furnance.pic"))) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![enter image description here](http://i91.fastpic.ru/big/2017/0402/80/3b0ec81c3b2f660b9a4c6f18908f4280.png) + +GUI.**button**( x, y, width, height, buttonColor, textColor, buttonPressedColor, textPressedColor, text ): *table* button +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | buttonColor | Цвет кнопки | +| *int* | textColor | Цвет текса | +| *int* | buttonPressedColor | Цвет кнопки при нажатии | +| *int* | textPressedColor | Цвет текста при нажатии | +| *string* | text | Текст на кнопке | + +Привычный всем объект кнопки имеет два состояния (*pressed = true/false*), автоматически переключаемые при нажатии. Для назначения какого-либо действия кнопке после нажатия создайте для нее метод *.onTouch()*. + +Помимо стандартного дизайна существуют также альтернативные варианты кнопок: + + - GUI.**framedButton**(...) отрисовывается с рамкой по краям кнопки + + ![Imgur](https://i.imgur.com/ajmXYFR.png) + + - GUI.**roundedButton**(...) имеет симпатичные скругленные уголки + + ![Imgur](https://i.imgur.com/0UO3Vbm.png) + +Для удобства имеется адаптивный вариант кнопки GUI.**adaptiveButton**(...). Он отличается тем, что вместо *width* и *height* использует отступ в пикселях со всех сторон от текста. Этот способ удобен для автоматического расчета размера кнопки без ручного расчета размеров. Разумеется, поддерживаются также GUI.**adaptiveFramedButton**(...) и GUI.**adaptiveRoundedButton**(...) + +| Type | Property | Description | +| ------ | ------ | ------ | +| *callback-function* | .**onTouch**()| Метод, вызываемый после нажатия на кнопку | +| *boolean* | .**pressed**| Параметр, отвечающий за состояние "нажатости" кнопки | +| *boolean* | .**switchMode**| Режим, при котором кнопка будет вести себя как переключатель: при нажатии она будет изменять свое состояние на противоположное. По умолчанию имеет значение *false* | +| *boolean* | .**animated**| Параметр, отвечающий за активность анимации перехода цветов кнопки при нажатии. По умолчанию имеет значение *true* | +| *float* | .**animationDuration**| Длительность воспроизведния анимации кнопки. По умолчанию имеет значение 0.2 | + + +Example of implementation: +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +-- Добавляем обычную кнопку +mainContainer:addChild(GUI.button(2, 2, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, "Regular button")).onTouch = function() + GUI.error("Regular button was pressed") +end + +-- Добавляем кнопку с состоянием disabled +local disabledButton = mainContainer:addChild(GUI.button(2, 6, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, "Disabled button")) +disabledButton.disabled = true + +-- Добавляем кнопку в режиме переключателя +local switchButton = mainContainer:addChild(GUI.button(2, 10, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, "Switch button")) +switchButton.switchMode = true +switchButton.onTouch = function() + GUI.error("Switch button was pressed") +end + +-- Добавляем кнопку с отключенной анимацией цветового перехода +local notAnimatedButton = mainContainer:addChild(GUI.button(2, 14, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, "Not animated button")) +notAnimatedButton.animated = false +notAnimatedButton.onTouch = function() + GUI.error("Not animated button was pressed") +end + +-- Добавляем скругленную кнопку +mainContainer:addChild(GUI.roundedButton(2, 18, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, "Rounded button")).onTouch = function() + GUI.error("Rounded button was pressed") +end + +-- Добавляем рамочную кнопку +mainContainer:addChild(GUI.framedButton(2, 22, 30, 3, 0xFFFFFF, 0xFFFFFF, 0x880000, 0x880000, "Framed button")).onTouch = function() + GUI.error("Framed button was pressed") +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/Q2sX0P5.gif) + +GUI.**actionButtons**( x, y, fat ): *table* actionButtons +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *boolean* | fat | Вариант отрисовки кнопок с большим размером | + +Создать объект-контейнер, содержащий 3 круглых кнопки. По большей части используется для управления состояниями окон: для закрытия, сворачивания и т.п. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *table* | .**close** | Указатель на объект красной кнопки | +| *table* | .**minimize** | Указатель на объект желтой кнопки | +| *table* | .**maximize** | Указатель на объект зеленой кнопки | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local actionButtonsRegular = mainContainer:addChild(GUI.actionButtons(3, 2, false)) +local actionButtonsFat = mainContainer:addChild(GUI.actionButtons(3, 4, true)) + +actionButtonsRegular.close.onTouch = function() + -- Do something when "close" button was touched +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![](https://i.imgur.com/lYUS7fl.png) + +GUI.**input**( x, y, width, height, backgroundColor, textColor, placeholderTextColor, backgroundFocusedColor, textFocusedColor, text, [placeholderText, eraseTextOnFocus, textMask ): *table* input +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | backgroundColor | Цвет фона | +| *int* | textColor | Цвет текста | +| *int* | placeholderTextColor | Цвет текста *placeholder* при условии, что он указан ниже | +| *int* | backgroundFocusedColor | Цвет фона в состоянии *focused* | +| *int* | textFocusedColor |Цвет текста в состоянии *focused* | +| *string* | text | Введенный на момент создания поля текст | +| [*string* | placeholderText] | Текст, появляющийся при условии, что введенный текст отсутствует | +| [*boolean* | eraseTextOnFocus] | Необходимо ли удалять текст при активации ввода | +| [*char* | textMask] | Символ-маска для вводимого текста. Удобно для создания поля ввода пароля | + +Создать объект, предназначенный для ввода и анализа текстовых данных с клавиатуры. Объект универсален и подходит как для создания простых форм для ввода логина/пароля, так и для сложных структур наподобие интерпретаторов команд. К примеру, окно *палитры* со скриншота в начале документации полностью основано на использовании этого объекта. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *string* | .**text** | Переменная, содержащая введенный текст поля | +| *function* | :**startInput**() | Метод для принудительной активации ввода данных в текстовое поле | +| *callback-function* | .**validator**( *string* text )| Метод, вызывающийся после окончания ввода текста в поле. Если возвращает *true*, то текст в текстовом поле меняется на введенный, в противном случае введенные данные игнорируются. К примеру, в данном методе удобно проверять, является ли введенная текстовая информация числом через *tonumber()* | +| *callback-function* | .**onInputFinished**( *table* mainContainer, *table* input, ... *varargs* eventData )| Метод, вызываемый после ввода данных в обработчике событий. Удобная штука, если хочется выполнить какие-либо действия сразу после ввода текста. Если у объекта имеется *validator*, и текст не прошел проверку через него, то *onInputFinished* вызван не будет. | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.input(2, 2, 30, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "Hello world", "Placeholder text")).onInputFinished = function() + GUI.error("Input finished!") +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/njPN0eg.gif) + +GUI.**slider**( x, y, width, primaryColor, secondaryColor, pipeColor, valueColor, minimumValue, maximumValue, value, [showCornerValues, currentValuePrefix, currentValuePostfix] ): *table* slider +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | primaryColor | Основной цвет слайдера | +| *int* | secondaryColor | Вторичный цвет слайдера | +| *int* | pipeColor | Цвет "пимпочки" слайдера | +| *int* | valueColor | Цвет текста значений слайдера | +| *float* | minimumValue | Минимальное значение слайдера | +| *float* | maximumValue | Максимальное значение слайдера | +| *float* | value | Значение слайдера | +| [*bool* | showCornerValues] | Показывать ли пиковые значения слайдера по сторонам от него | +| [*string* | currentValuePrefix] | Префикс для значения слайдера | +| [*string* | currentValuePostfix] | Постфикс для значения слайдера | + +Создать объект типа "слайдер", предназначенный для манипуляцией числовыми данными. Значение слайдера всегда будет варьироваться в диапазоне от минимального до максимального значений. Опционально можно указать значение поля *слайдер.**roundValues** = true*, если необходимо округлять изменяющееся число. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *callback-function* | .**onValueChanged**()| Метод, вызывающийся после изменения значения слайдера | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local slider = mainContainer:addChild(GUI.slider(4, 2, 30, 0x66DB80, 0x0, 0xFFFFFF, 0xAAAAAA, 0, 100, 50, true, "Prefix: ", " postfix")) +slider.roundValues = true +slider.onValueChanged = function(value) + -- Do something when slider's value changed +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/F7jrTPM.gif) + +GUI.**switch**( x, y, width, primaryColor, secondaryColor, pipeColor, state ): *table* switch +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | primaryColor | Основной цвет переключателя | +| *int* | secondaryColor | Вторичный цвет переключателя | +| *int* | pipeColor | Цвет "пимпочки" переключателя | +| *boolean* | state | Состояние переключателя | + +Создать объект типа "переключатель", для определения истинности или ложности того или иного события. При клике на объект меняет состояние на противоположное. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**setState**( *boolean* state )| Изменить состояние переключателя на указанное | +| *callback-function* | .**onStateChanged**( *table* mainContainer, *table* switch, ... *varargs* eventData )| Метод, вызывающийся после изменения состояния переключателя | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local switch1 = mainContainer:addChild(GUI.switch(3, 2, 8, 0x66DB80, 0x1D1D1D, 0xEEEEEE, true)) +local switch2 = mainContainer:addChild(GUI.switch(3, 4, 8, 0x66DB80, 0x1D1D1D, 0xEEEEEE, false)) +switch2.onStateChanged = function(state) + GUI.error("Switch state changed!") +end + +-------------------------------------------------------------------------------- +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/prBIAsL.gif) + +GUI.**switchAndLabel**( x, y, width, switchWidth, primaryColor, secondaryColor, pipeColor, textColor, text, switchState ): *table* switchAndLabel +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Общая ширина | +| *int* | width | Ширина переключателя | +| *int* | primaryColor | Основной цвет переключателя | +| *int* | secondaryColor | Вторичный цвет переключателя | +| *int* | pipeColor | Цвет "пимпочки" переключателя | +| *int* | textColor | Цвет текста лейбла | +| *string* | text | Текст лейбла | +| *boolean* | state | Состояние переключателя | + +Быстрый способ создания пары из свитча и лейбла одновременно. Идеально подходит для визуального отображения параметров типа *boolean* у любых объектов . + +| Type | Property | Description | +| ------ | ------ | ------ | +| *table* | .**switch**| Указатель на объект свитча | +| *table* | .**label**| Указатель на объект лейбла | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.switchAndLabel(2, 2, 25, 8, 0x66DB80, 0x1D1D1D, 0xEEEEEE, 0x999999, "Sample text 1:", true)) +mainContainer:addChild(GUI.switchAndLabel(2, 4, 25, 8, 0x66DB80, 0x1D1D1D, 0xEEEEEE, 0x999999, "Sample text 2:", false)) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/4zKOla9.gif) + +GUI.**colorSelector**( x, y, width, height, color, text ): *table* colorSelector +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | color | Текущий цвет селектора | +| *string* | text | Текст селектора | + +Создать объект типа "селектор цвета", представляющий собой аналог кнопки, позволяющей выбрать цвет при помощи удобной палитры. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *callback-function* | .**onTouch**()| Метод, вызываемый после нажатия на селектор цвета в обработчике событий | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.colorSelector(2, 2, 30, 3, 0xFF55FF, "Choose color")).onTouch = function() + -- Do something after choosing color +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/QVxu2N0.gif) + +GUI.**list**( x, y, width, height, itemSize, spacing, backgroundColor, textColor, alternateBackgroundColor, alternateTextColor, backgroundSelectedColor, textSelectedColor [, offsetMode] ): *table* list +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | width | Высота объекта | +| *int* | itemSize | Размер элемента по выбранной оси | +| *int* | spacing | Расстояние между элементами | +| *int* | backgroundColor | Цвет фона | +| *int* | textColor | Цвет текста | +| *int* | alternateBackgroundColor | Промежуточный цвет фона | +| *int* | alternateTextColor | Промежуточный цвет текста | +| *int* | backgroundSelectedColor | Цвет фона при выделении | +| *int* | textSelectedColor | Цвет текста при выделении | +| *boolean* | offsetMode | Опциональный режим, при котором размеры элемента создаются на основании пиксельного отступа от текста элементов | + +Объект **List** предназначен для выбора элементов из списка. Внешне он напоминает одноколонную таблицу Excel с возможностью изменения ориентации. List универсален и используется в качестве исходника для множества других виджетов. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *int* | .**selectedItem** | Индекс выбранного элемента List | +| *function* | :**addItem**(*string* text): *table* item| Добавить в List новый текстовый элемент. При необходимости ему можно назначить callback-функцию .**onTouch**() | +| *function* | :**getItem**(*int* index): *table* item| Получить элемент по его индексу | +| *function* | :**select**(*int* index): *table* list| Выбрать существующий элемент List | +| *function* | :**deselect**(): *table* list| Выбрать существующий элемент List | +| *function* | :**setAlignment**(*enum* horizontalAlignment, *enum* verticalAlignment): *table* list| Установить вариант выравнивания элементов List. По умолчанию вырванивание идет по левому верхнему углу | +| *function* | :**setDirection**(*enum* direction): *table* list| Установить направление элементов List. По умолчанию направление вертикальное | +| *function* | :**setSpacing**(*int* spacing): *table* list| Установить расстояние между элементами List | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +-- Создаем вертикально ориентированный список +local verticalList = mainContainer:addChild(GUI.list(3, 2, 25, 30, 3, 0, 0xE1E1E1, 0x4B4B4B, 0xD2D2D2, 0x4B4B4B, 0x3366CC, 0xFFFFFF, false)) +verticalList:addItem("Hello world") +verticalList:addItem("This is test").onTouch = function() + GUI.error("Selected item: " .. verticalList.selectedItem) +end +verticalList:addItem("Beautiful") +verticalList:addItem("Like a shit") + +-- Создаем горизонтально ориентированный список +local horizontalList = mainContainer:addChild(GUI.list(34, 2, 100, 3, 2, 0, 0xE1E1E1, 0x4B4B4B, 0xE1E1E1, 0x4B4B4B, 0x696969, 0xFFFFFF, true)) +horizontalList:setDirection(GUI.DIRECTION_HORIZONTAL) +horizontalList:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) +horizontalList:addItem("Applications") +horizontalList:addItem("Libraries") +horizontalList:addItem("Scripts") +horizontalList:addItem("Wallpapers") + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/lYzufn2.gif) + +GUI.**comboBox**( x, y, width, elementHeight, backgroundColor, textColor, arrowBackgroundColor, arrowTextColor ): *table* comboBox +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | elementHeight | Высота элемента комбо-бокса | +| *int* | backgroundColor | Цвет фона комбо-бокса | +| *int* | textColor | Цвет текста комбо-бокса | +| *int* | arrowBackgroundColor | Цвет фона стрелки комбо-бокса | +| *int* | arrowTextColor | Цвет текста стрелки комбо-бокса | + +Создать объект типа "комбо-бокс", позволяющий выбирать объекты из множества перечисленных вариантов. Методика обращения к комбо-боксу схожа с обращением к контекстному меню. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *int* | .**selectedItem** | Индекс выбранного элемента ComboBox | +| *function* | :**addItem**( *string* text, *boolean* disabled, *string* shortcut, *int* color ): *table* item| Добавить в комбо-бокс элемент с указанными параметрами. При параметре disabled элемент не будет реагировать на клики мышью. Каждый элемент может иметь собственный callback-метод .**onTouch** для последующей обработки данных | +| *function* | :**addSeparator**()| Добавить визуальный в комбо-бокс разделитель | +| *function* | :**removeItem**( *int* index) | Удалить из комбо-бокса элемент под указанным индексом | +| *function* | :**getItem**( *int* index ): *table* item| Получить элемент комбо-бокса с соответствующим индексом | +| *function* | :**indexOfItem**( *string* itemText ): *int* index | Получить индекс элемента комбо-бокса с соответствующим текстом | +| *function* | :**clear**()| Удалить все имеющиеся элементы комбо-бокса | +| *function* | :**count**(): *int* count| Получить число элементов комбо-бокса | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local comboBox = mainContainer:addChild(GUI.comboBox(3, 2, 30, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888)) +comboBox:addItem(".PNG") +comboBox:addItem(".JPG").onTouch = function() + -- Do something when .JPG was selected +end +comboBox:addItem(".GIF") +comboBox:addItem(".PIC") + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/6ROzLAc.gif) + +GUI.**menu**( x, y, width, backgroundColor, textColor, backgroundPressedColor, textPressedColor, backgroundTransparency ): *table* menu +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | backgroundColor | Цвет фона меню | +| *int* | textColor | Цвет текста меню | +| *int* | backgroundPressedColor | Цвет фона меню при нажатии на элемент | +| *int* | textPressedColor | Цвет текста меню при нажатии на элемент | +| *int* | backgroundTransparency | Прозрачность фона меню | + +Создать объект типа "горизонтальное меню", позволяющий выбирать объекты из множества перечисленных вариантов. По большей части применяется в структурах типа "Файл - Редактировать - Вид - Помощь" и подобных. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**addItem**( *string* text, *int* color ): *table* item | Добавить в меню элемент с указанными параметрами. Каждый элемент имеет собственный callback-метод .**onTouch** | +| *callback-function* | .**onItemSelected**( *table* item )| Метод, вызывающийся после выборе какого-либо элемента комбо-бокса | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local menu = mainContainer:addChild(GUI.menu(1, 1, mainContainer.width, 0xEEEEEE, 0x666666, 0x3366CC, 0xFFFFFF, nil)) +menu:addItem("MineCode IDE", 0x0) +local item = menu:addItem("File") +item.onTouch = function() + local contextMenu = GUI.contextMenu(item.x, item.y + 1) + contextMenu:addItem("New") + contextMenu:addItem("Open").onTouch = function() + GUI.error("Open was pressed") + end + contextMenu:addSeparator() + contextMenu:addItem("Save") + contextMenu:addItem("Save as") + contextMenu:show() +end +menu:addItem("Edit") +menu:addItem("View") +menu:addItem("About") + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](http://i.imgur.com/b1Tmge5.gif) + +GUI.**resizer**( x, y, width, height, resizerColor, arrowColor ): *table* resizer +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | resizerColor | Цвет "полоски" ресайзера | +| *int* | arrowColor | Цвет стрелки, возникающей при событиях drag/drop | + +Ресайзер предназначен для автоматизации изменения размеров каких-либо объектов. При перемещении указателя мыши с зажатой левой кнопкой ресайзер будет вызывать соответствующие callback-методы. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *callback-function* | .**onResize**( *table* mainContainer, *table* resizer, *int* dragWidth, *int* dragHeight ) | Данная функция вызывается во время перемещения указателя мыши с зажатой левой клавишей по ресайзеру. Последние два аргумента представляют из себя дистанцию, пройденную указателем мыши | +| *callback-function* | .**onResizeFinished**( *table* mainContainer, *table* resizer ) | Данная функция вызывается после прекращения перемещения указателя мыши по ресайзеру | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +-- Добавляем панель, символизирующую системное окно, размер которого мы будем изменять +local panel = mainContainer:addChild(GUI.panel(3, 2, 30, 10, 0xE1E1E1)) +-- Добавляем объект-ресайзер, по умолчанию находящийся в правой части окна. Для обработки событий "drag/drop" в обе стороны делаем ширину ресайзера как минимум 3 +local resizer = mainContainer:addChild(GUI.resizer(panel.localX + panel.width - 2, panel.localY + math.floor(panel.height / 2 - 2), 3, 4, 0xAAAAAA, 0x0)) + +-- Данная функция будет вызываться во время события "drag", когда пользователь перемещает курсор мыши по ресайзеру +resizer.onResize = function(mainContainer, resizer, dragWidth, dragHeight) + panel.width = panel.width + dragWidth + resizer.localX = resizer.localX + dragWidth + + mainContainer:drawOnScreen() +end + +-- А вот это событие вызовется при событии "drop" +resizer.onResizeFinished = function(mainContainer, resizer, dragWidth, dragHeight) + GUI.error("Resize finished!") +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/PvARN8j.gif) + +GUI.**progressBar**( x, y, width, primaryColor, secondaryColor, valueColor, value, [thin, showValue, valuePrefix, valuePostfix] ): *table* progressBar +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | primaryColor | Основной цвет шкалы прогресса | +| *int* | secondaryColor | Вторичный цвет шкалы прогресса | +| *int* | valueColor | Цвет текста значений шкалы прогресса | +| *float* | value | Значение шкалы прогресса | +| [*bool* | thin] | Активировать ли режим отрисовки "тонкого" объекта | +| [*bool* | showValue] | Показывать ли значение шкалы прогресса | +| [*string* | valuePrefix] | Префикс для значения шкалы прогресса | +| [*string* | valuePostfix] | Постфикс для значения шкалы прогресса | + +Создать объект типа "шкала прогресса", значение которой меняется от 0 до 100. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *int* | .**value**| Текущее числовое значение шкалы прогресса | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +mainContainer:addChild(GUI.progressBar(2, 2, 50, 0x3366CC, 0xEEEEEE, 0xEEEEEE, 80, true, true, "Value prefix: ", " value postfix")) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![](http://i89.fastpic.ru/big/2017/0402/f1/ef1da27531ccf899eb9eb59c010180f1.png) + +GUI.**filesystemTree**( x, y, width, height, backgroundColor, directoryColor, fileColor, arrowColor, backgroundSelectionColor, textSelectionColor, arrowSelectionColor, disabledColor, scrollBarBackground, scrollBarForeground, showMode, selectionMode ): *table* filesystemTree +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* or *nil* | backgroundColor | Цвет фона файлового древа | +| *int* | directoryColor | Цвет текста директорий | +| *int* | fileColor | Цвет текста файлов | +| *int* | arrowColor | Цвет текста стрелки директорий | +| *int* | backgroundSelectionColor | Цвет фона при выделении | +| *int* | textSelectionColor | Цвет текста при выделении | +| *int* | arrowSelectionColor | Цвет стрелки при выделении | +| *int* | disabledColor | Цвет файла, не соответствующего выбранному extensionFilter | +| *int* | scrollBarBackground | Первичный цвет скроллбара | +| *int* | scrollBarForeground | Вторичный цвет скроллбара | +| [*enum* | filesystemShowMode] | Опциональный режим отображения содержимого текущей директориии. Может принимать значения GUI.**filesystemModes**.**file**, GUI.**filesystemModes**.**directory** или GUI.**filesystemModes**.**both** | +| [*enum* | filesystemSelectionMode] | Опциональный режим выбора содепжимого текущей директориии. Значения принимает те же, что и у filesystemShowMode | + +Данный объект предназначен для навигации по файловой системе в виде иерархического древа. При клике на директорию будет показано ее содержимое, а во время прокрутки колесиком мыши содержимое будет "скроллиться" в указанном направлении. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *string* | .**workPath** | Текущая рабочая директория файлового древа | +| *callback-function* | .**onItemSelected**( *string* path )| Метод, вызываемый после выбора элемента в filesystemTree. В качестве аргумента передается абсолютный путь выбранного элемента | +| *function* | :**addExtensionFilter**( *string* extension )| Добавить фильтр на указанное расширение файла. После этого в диалоговом окне пользователь сможет выбирать лишь те файлы, которые имеют соответствующее расширение | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x262626)) + +local tree1 = mainContainer:addChild(GUI.filesystemTree(3, 2, 30, 41, 0xCCCCCC, 0x3C3C3C, 0x3C3C3C, 0x999999, 0x3C3C3C, 0xE1E1E1, 0xBBBBBB, 0xAAAAAA, 0xBBBBBB, 0x444444, GUI.IO_MODE_BOTH, GUI.IO_MODE_FILE)) +tree1:updateFileList() +tree1.onItemSelected = function(path) + GUI.error("Something was selected, the path is: \"" .. path .. "\"") +end + +local tree2 = mainContainer:addChild(GUI.filesystemTree(34, 2, 30, 41, 0xCCCCCC, 0x3C3C3C, 0x3C3C3C, 0x999999, 0x3C3C3C, 0xE1E1E1, 0xBBBBBB, 0xAAAAAA, 0xBBBBBB, 0x444444, GUI.IO_MODE_FILE, GUI.IO_MODE_FILE)) +tree2:updateFileList() +tree2.onItemSelected = function(path) + GUI.error("File was selected, the path is: \"" .. path .. "\"") +end + +local tree3 = mainContainer:addChild(GUI.filesystemTree(66, 2, 30, 41, 0xCCCCCC, 0x3C3C3C, 0x3C3C3C, 0x999999, 0x3C3C3C, 0xE1E1E1, 0xBBBBBB, 0xAAAAAA, 0xBBBBBB, 0x444444, GUI.IO_MODE_DIRECTORY, GUI.IO_MODE_DIRECTORY)) +tree3:updateFileList() +tree3.onItemSelected = function(path) + GUI.error("Directory was selected, the path is: \"" .. path .. "\"") +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/igGozFP.gif) + +GUI.**filesystemChooser**( x, y, width, height, backgroundColor, textColor, tipBackgroundColor, tipTextColor, initialText, sumbitButtonText, cancelButtonText, placeholderText, filesystemDialogMode, filesystemDialogPath ): *table* filesystemChooser +-------------------------------------------------------------------------------- +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | backgroundColor | Цвет фона | +| *int* | textColor | Цвет текста | +| *int* | tipBackgroundColor | Цвет фона "пимпочки" в правой части filesystemChooser | +| *int* | tipTextgroundColor | Цвет текста "пимпочки" в правой части filesystemChooser | +| *string* | path | Стартовый выбранный путь. Может принимать значение nil, если он не требуется | +| *string* | sumbitButtonText | Текст кнопки подтверждения выбора в диалоговом окне | +| *string* | cancelButtonText | Текст кнопки отмены выбора в диалоговом окне | +| *string* | placeholderText | Текст, появляющийся в случае отсутствия выбора конкретного пути | +| *enum* | filesystemDialogMode | Режим выбора содержимого в диалоговом окне. Может принимать значения GUI.**filesystemModes**.**file**, GUI.**filesystemModes**.**directory** или GUI.**filesystemModes**.**both** | +| *string* | filesystemDialogPath | Стартовая директория диалогового окна | + +FilesystemChooser предназначен для удобного выбора файла или директории. При нажатии на объект всплывает диалоговое окно с уже знакомым нам filesystemTree, позволяющее выбрать необходимый элемент путем навигации по файловой системе. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *callback-function* | .**onSubmit**( *string* path )| Метод, вызываемый после выбора файла или директории, а также нажатии кнопки подтверждения в диалоговом окне. В качестве аргумента передается абсолютный путь до выбранного элемента | +| *callback-function* | .**onCancel**( )| Метод, вызываемый после нажатия на кнопку отмены в диалоговом окне | +| *function* | :**setMode**( *enum* IOMode, *enum* typeMode )| Метод для выбора содержимого в диалоговом окне. Первый аргумент может принимать значения GUI.**filesystemModes**.**open** или GUI.**filesystemModes**.**save**. Второй аргумент принимает значения +GUI.**filesystemModes**.**file**, GUI.**filesystemModes**.**directory** или GUI.**filesystemModes**.**both** | +| *function* | :**addExtensionFilter**( *string* extension )| Добавить фильтр на указанное расширение файла. После этого в диалоговом окне пользователь сможет выбирать лишь те файлы, которые имеют соответствующее расширение | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x262626)) + +local filesystemChooser = mainContainer:addChild(GUI.filesystemChooser(2, 2, 30, 3, 0xE1E1E1, 0x888888, 0x3C3C3C, 0x888888, nil, "Open", "Cancel", "Choose", "/")) +filesystemChooser:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE) +filesystemChooser.onSubmit = function(path) + GUI.error("File \"" .. path .. "\" was selected") +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/F0ch8yQ.gif) + +GUI.**codeView**( x, y, width, height, lines, fromSymbol, fromLine, maximumLineLength, selections, highlights, highlightLuaSyntax, indentationWidth ): *table* codeView +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *table* | lines | Таблица с отображаемыми строками | +| *int* | fromSymbol | С какого символа начинать отображение кода | +| *int* | fromLine | С какой строки начинать отображение кода | +| *int* | maximumLineLength | Максимальная длина строки из имеющихся строк | +| *table* | selections | Таблица вида { {from = {line = *int* line, symbol = *int* symbol}, to = {line = *int* line, symbol = *int* symbol}}, ... }, позволяющая осуществлять выделение кода таким образом, как если бы пользователь выделил бы его мышью | +| *table* | highlights | Таблица вида { [*int* lineIndex] = *int* color, ... }, позволяющая подсвечивать указанные строки указанными цветом | +| *boolean* | highlightLuaSyntax | Подсвечивать ли синтаксис Lua | +| *int* | indentationWidth | Ширина индентации кода | + +Создать объект типа "CodeView", предназначенный для наглядного отображения Lua-кода с номерами строк, подсветкой синтаксиса, выделениям и скроллбарами. + +Example of implementation: + +```lua +local GUI = require("GUI") +local unicode = require("unicode") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local codeView = mainContainer:addChild(GUI.codeView(2, 2, 130, 30, {}, 1, 1, 1, {}, {}, true, 2)) + +local file = io.open("/lib/color.lua", "r") +for line in file:lines() do + line = line:gsub("\t", " "):gsub("\r\n", "\n") + table.insert(codeView.lines, line) + codeView.maximumLineLength = math.max(codeView.maximumLineLength, unicode.len(line)) +end +file:close() + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![](https://i.imgur.com/o1yLMJr.png) + +GUI.**chart**( x, y, width, height, axisColor, axisValueColor, axisHelpersColor, chartColor, xAxisValueInterval, yAxisValueInterval, xAxisPostfix, yAxisPostfix, fillChartArea, values ): *table* chart +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | axisColor | Цвет координатных осей | +| *int* | axisValueColor | Цвет числовых значений координатных осей | +| *int* | axisHelpersColor | Цвет вспомогательных линий координатных осей | +| *int* | chartColor | Цвет графика | +| *float* | xAxisValueInterval | Интервал от 0 до 1, с которым будут итерироваться значения графика на конкретной оси | +| *float* | yAxisValueInterval | Интервал от 0 до 1, с которым будут итерироваться значения графика на конкретной оси | +| *string* | xAxisPostfix | Текстовый постфикс для значений графика конкретной оси | +| *string* | yAxisPostfix | Текстовый постфикс для значений графика конкретной оси | +| *boolean* | fillChartArea | Необходимо ли закрашивать область графика или же рисовать его линией | +| *table* | values | Таблица вида {{*float* x, *float* y}, ...} со значениями графика | + +Создать объект типа "график", предназначенный для отображения статистической информации в виде графика с подписью значений осей. + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local chart = mainContainer:addChild(GUI.chart(2, 2, 100, 30, 0xEEEEEE, 0xAAAAAA, 0x888888, 0xFFDB40, 0.25, 0.25, "s", "t", true, {})) +for i = 1, 100 do + table.insert(chart.values, {i, math.random(0, 80)}) +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![enter image description here](http://i91.fastpic.ru/big/2017/0402/5b/66ff353492298f6a0c9b01c0fc8a525b.png) + +GUI.**brailleCanvas**( x, y, width, height ): *table* brailleCanvas +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | + +Данный объект по своей сути похож на пиксельный холст. Его отличительной особенностью является использование шрифта Брайля, создающего повышенное в сравнении с стандартным разрешение: каждый реальный пиксель может вмещать до 2х4 "мини-пикселей". Очень полезен для детальной отрисовки мелкой графики, с которой мод справиться не способен. К примеру, если создан BrailleCanvas размером 10x10 реальных пикселей, то он будет содержать 20x40 брайль-пикселей. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**set**( *int* x, *int* y, *boolean* state, [*int* color] )| Установить соответствующее значение пикселя по локальным координатам BrailleCanvas. Если в данной позиции уже имеется установленный пиксель, то значение его цвета будет заменено на новое. Если аргумент цвета не указывается, то цвет пикселя останется прежним | +| *function* | :**get**( *int* x, *int* y ): *boolean* state, *int* color, *char* symbol | Получить состояние, цвет, а также символ текущего брайль-пикселя | +| *function* | :**fill**( *int* x, *int* y, *int* width, *int* height, *boolean* state, *int* color ) | Работает аналогично методу :**set**, однако позволяет редактировать целые области BrailleCanvas | +| *function* | :**clear**() | Очищает содержимое BrailleCanvasе | + +Example of implementation: +```lua +local GUI = dofile("/lib/GUI.lua") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x262626)) + +-- Добавляем текстовый лейбл, чтобы можно было убедиться в графонистости канвас-виджета +mainContainer:addChild(GUI.label(3, 2, 30, 1, 0xFFFFFF, "Текст для сравнения размеров")) + +-- Создаем BrailleCanvas размером 30x15 экранных пикселей +local brailleCanvas = mainContainer:addChild(GUI.brailleCanvas(3, 4, 30, 15)) +-- Рисуем рамочку вокруг объекта. Для начала делаем две белых вертикальных линии +local canvasWidthInBraillePixels = brailleCanvas.width * 2 +for i = 1, brailleCanvas.height * 4 do + brailleCanvas:set(1, i, true, 0xFFFFFF) + brailleCanvas:set(canvasWidthInBraillePixels, i, true, 0xFFFFFF) +end +-- А затем две горизонтальных +local canvasHeightInBraillePixels = brailleCanvas.height * 4 +for i = 1, brailleCanvas.width * 2 do + brailleCanvas:set(i, 1, true, 0xFFFFFF) + brailleCanvas:set(i, canvasHeightInBraillePixels, true, 0xFFFFFF) +end +-- Рисуем диагональную линию красного цвета +for i = 1, 60 do + brailleCanvas:set(i, i, true, 0xFF4940) +end +-- Рисуем желтый прямоугольник +brailleCanvas:fill(20, 20, 20, 20, true, 0xFFDB40) +-- Рисуем чуть меньший прямоугольник, но с состоянием пикселей = false +brailleCanvas:fill(25, 25, 10, 10, false) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![Imgur](https://i.imgur.com/FPWbQkv.png) + +GUI.**scrollBar**( x, y, width, height, backgroundColor, foregroundColor, minimumValue, maximumValue, value, shownValueCount, onScrollValueIncrement, thinMode ): *table* scrollBar +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* | backgroundColor | Цвет фона scrollBar | +| *int* | foregroundColor | Цвет текста scrollBar | +| *int* | minimumValue | Минимальное значение scrollBar | +| *int* | maximumValue | Максимальное значение scrollBar | +| *int* | value | Текущее значение scrollBar | +| *int* | shownValueCount | Число "отображаемых" значений scrollBar | +| *int* | onScrollValueIncrement | Количество строк, пролистываемых при прокрутке | +| *boolean* | thinMode | Режим отображения scrollBar в тонком пиксельном виде | + +Создать объект типа "ScrollBar", предназначенный для визуальной демонстрации числа показанных объектов на экране. Сам по себе практически не используется, полезен в совокупности с другими виджетами. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *callback-function* | .**onTouch**( )| Метод, вызываемый при клике на скорллбар. Значение скроллбара будет изменяться автоматически в указанном диапазоне | +| *callback-function* | .**onScroll**( )| Метод, вызываемый при использовании колеса мыши на скроллбаре. Значение скроллбара будет изменяться в зависимости от величины *.onScrollValueIncrement* | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +-- Добавляем вертикальный скроллбар в главный контейнер +local verticalScrollBar = mainContainer:addChild(GUI.scrollBar(2, 3, 1, 15, 0x444444, 0x888888, 1, 100, 1, 10, 1, true)) +verticalScrollBar.onTouch = function() + GUI.error("Vertical scrollbar was touched") +end + +-- И горизонтальный заодно тоже +local horizontalScrollBar = mainContainer:addChild(GUI.scrollBar(3, 2, 60, 1, 0x444444, 0x888888, 1, 100, 1, 10, 1, true)) +horizontalScrollBar.onTouch = function() + GUI.error("Horizontal scrollbar was touched") +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![enter image description here](https://i.imgur.com/XrqDvBk.png) + +GUI.**textBox**(x, y, width, height, backgroundColor, textColor, lines, currentLine, horizontalOffset, verticalOffset, autoWrap, autoHeight): *table* textBox +------------------------------------------------------------------------ +| Type | Parameter | Description | +| ------ | ------ | ------ | +| *int* | x | Координата объекта по оси x | +| *int* | y | Координата объекта по оси y | +| *int* | width | Ширина объекта | +| *int* | height | Высота объекта | +| *int* or *nil* | backgroundColor | Цвет фона текстбокса. При значении *nil* фон не рисуется в экранный буфер | +| *int* | textColor | Цвет текста текстбокса | +| *table* | lines | Таблица отображаемых строк текстбокса. Имеется опциональная возможность установки цвета конкретной строки, для этого элемент таблицы должен иметь вид {text = *string*, color = *int*} | +| *int* | currentLine | Текущая строка текстбокса, с которой осуществляется отображение текста | +| *int* | horizontalOffset | Отступ отображения текста от левого и правого краев текстбокса | +| *int* | verticalOffset | Отступ отображения текста от верхнего и нижнего краев текстбокса | +| *boolean* | autoWrap | Автоматический перенос строк по ширине текстбокса | +| *boolean* | autoHeight | Автоматический расчет высоты объекта в зависимости от количества строк текстбокса | + +Текстбокс редназначен для отображения большого количества текстовых данных в небольшом контейнере с полосами прокрутки. При использовании колесика мыши и активации события *scroll* содержимое текстбокса будет автоматически "скроллиться" в нужном направлении. + +| Type | Property | Description | +| ------ | ------ | ------ | +| *function* | :**setAlignment**(*enum* horizontalAlignment, *enum* verticalAlignment): *table* textBox| Выбрать вариант отображения текста относительно границ текстбокса | +| *table* | .**lines**| Таблица со строковыми данными текстбокса | + +Example of implementation: + +```lua +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +local textBox = mainContainer:addChild(GUI.textBox(2, 2, 32, 16, 0xEEEEEE, 0x2D2D2D, {}, 1, 1, 0)) +table.insert(textBox.lines, {text = "Sample colored line ", color = 0x880000}) +for i = 1, 100 do + table.insert(textBox.lines, "Sample line " .. i) +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![enter image description here](http://i89.fastpic.ru/big/2017/0402/ad/01cdcf7aec919051f64ac2b7d9daf0ad.png) + +Практические примеры +====== +Ниже приведены подробно прокомментированные участки кода и иллюстрации, позволяющие во всех деталях разобраться с особенностями библиотеки. Не стесняйтесь изменять их под свой вкус и цвет. + +Пример #1: Окно авторизации +====== + +Поскольку в моде OpenComputers имеется интернет-плата, я написал небольшой клиент для работы с VK.com. Разумеется, для этого необходимо реализовать авторизацию на серверах, вводя свой e-mail/номер телефона и пароль к аккаунту. В качестве тренировки привожу часть кода, отвечающую за это: + +```lua +local buffer = require("doubleBuffering") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +-- Задаем базовые параметры - минимальную длину пароля и регулярное выражение для проверки валидности адреса почты +local minimumPasswordLength = 2 +local emailRegex = "%w+@%w+%.%w+" + +-- Для примера также задаем "корректные" данные пользователя +local userEmail = "cyka@gmail.com" +local userPassword = "1234567" + +-------------------------------------------------------------------------------- + +-- Создаем контейнер с синей фоновой панелью +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x002440)) +-- Добавляем в него layout с размерностью сетки 1x1 +local layout = mainContainer:addChild(GUI.layout(1, 1, mainContainer.width, mainContainer.height, 1, 1)) + +-- Добавляем в layout поле для ввода почтового адреса +local emailInput = layout:addChild(GUI.input(1, 1, 40, 3, 0xEEEEEE, 0x555555, 0x888888, 0xEEEEEE, 0x262626, nil, "E-mail", false, nil, nil, nil)) +-- Добавляем красный текстовый лейбл, показывающийся только в том случае, когда адрес почты невалиден +local invalidEmailLabel = layout:addChild(GUI.label(1, 1, mainContainer.width, 1, 0xFF5555, "Incorrect e-mail")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) +invalidEmailLabel.hidden = true + +-- Добавляем аналогичное текстовое поле с лейблом для ввода пароля +local passwordInput = layout:addChild(GUI.input(1, 1, 40, 3, 0xEEEEEE, 0x555555, 0x888888, 0xEEEEEE, 0x262626, nil, "Password", false, "*", nil, nil)) +local invalidPasswordLabel = layout:addChild(GUI.label(1, 1, mainContainer.width, 1, 0xFF5555, "Password is too short")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) +invalidPasswordLabel.hidden = true + +-- Добавляем кнопку, ползволяющую осуществлять авторизацию +local loginButton = layout:addChild(GUI.button(1, 1, 40, 3, 0x3392FF, 0xEEEEEE, 0xEEEEEE, 0x3392FF, "Login")) +-- По умолчанию кнопка имеет неактивное состояние, а также серый цвет +loginButton.disabled = true +loginButton.colors.disabled.background = 0xAAAAAA +loginButton.colors.disabled.text = 0xDDDDDD +-- При нажатии на кнопку логина идет сверка введенных данных с переменными выше, и выводится дебаг-сообщение +loginButton.onTouch = function() + GUI.error(emailInput.text == userEmail and passwordInput.text == userPassword and "Login successfull" or "Login failed") +end + +-- Создаем две переменных, в которых будут храниться состояния валидности введенных данных +local emailValid, passwordValid +-- Данная функция будет вызываться ниже после обращения к одному из текстовых полей, она необходима +-- для контроля активности кнопки логина +local function checkLoginButton() + loginButton.disabled = not emailValid or not passwordValid + + mainContainer:drawOnScreen() +end + +-- Создаем callback-функцию, вызывающуюся после ввода текста и проверяющую корректность введенного адреса +emailInput.onInputFinished = function() + emailValid = emailInput.text and emailInput.text:match(emailRegex) + invalidEmailLabel.hidden = emailValid + checkLoginButton() +end + +-- Аналогично поступаем с полем для ввода пароля +passwordInput.onInputFinished = function() + passwordValid = passwordInput.text and passwordInput.text:len() > minimumPasswordLength + invalidPasswordLabel.hidden = passwordValid + checkLoginButton() +end + +-- Добавляем заодно кнопку для закрытия программы +layout:addChild(GUI.button(1, 1, 40, 3, 0x336DBF, 0xEEEEEE, 0xEEEEEE, 0x336DBF, "Exit")).onTouch = function() + mainContainer:stopEventHandling() + buffer.clear(0x0) + buffer.draw(true) +end + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() + +``` + +Result: + +![enter image description here](http://i.imgur.com/CWuCLop.gif) + +Пример #2: Создание собственного виджета +====== + +Одной из важнейших особенностей библиотеки является простота создания виджетов с нуля. К примеру, давайте сделаем панель, реагирующую на клики мыши и позволяющую рисовать на ней произвольным цветом по аналогии со школьной доской. + +```lua +local buffer = require("doubleBuffering") +local GUI = require("GUI") + +--------------------------------------------------------------------- + +-- Создаем полноэкранный контейнер +local mainContainer = GUI.fullScreenContainer() + +-- Создаем метод-обработчик событий для нашего виджета +-- Грамотнее будет вынести его создание вне функции-конструктора, дабы не засорять память +local function myWidgetEventHandler(mainContainer, object, event, screenAddress, screenX, screenY, buttonCode) + if event == "touch" or event == "drag" then + local x, y = screenX - object.x + 1, screenY - object.y + 1 + object.pixels[y] = object.pixels[y] or {} + object.pixels[y][x] = buttonCode == 0 and true or nil + + mainContainer:drawOnScreen() + end +end + +-- Аналогичным образом поступим с функцией отрисовки виджета, храня ее в единственном экземпляре в памяти +local function myWidgetDraw(object) + -- Рисуем подложку цветом фона виджета + buffer.square(object.x, object.y, object.width, object.height, object.colors.background, 0x0, " ") + + -- Перебираем пиксельную карту, отрисовывая соответствующие пиксели в экранный буфер + for y = 1, object.height do + for x = 1, object.width do + if object.pixels[y] and object.pixels[y][x] then + buffer.set(object.x + x - 1, object.y + y - 1, object.colors.paint, 0x0, " ") + end + end + end +end + +-- Создаем метод, возвращающий наш виджет +local function createMyWidget(x, y, width, height, backgroundColor, paintColor) + -- Наследуемся от GUI.object, дополняем его параметрами цветов и пиксельной карты + local object = GUI.object(x, y, width, height) + object.colors = {background = backgroundColor, paint = paintColor} + object.pixels = {} + + -- Реализуем методы отрисовки виджета и обработки событий + object.draw = myWidgetDraw + object.eventHandler = myWidgetEventHandler + + return object +end + +--------------------------------------------------------------------- + +-- Добавляем темно-серую панель в контейнер +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) +-- Создаем 9 экземпляров виджета-рисовалки и добавляем их в контейнер +local x, y, width, height = 2, 2, 30, 15 +for j = 1, 3 do + for i = 1, 3 do + mainContainer:addChild(createMyWidget(x, y, width, height, 0x3C3C3C, 0xEEEEEEE)) + x = x + width + 2 + end + x, y = 2, y + height + 1 +end + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +Result: + +![enter image description here](http://i.imgur.com/SodpPQo.gif) + +Как видите, в создании собственных виджетов нет совершенно ничего сложного, главное - обладать информацией по наиболее эффективной работе с библиотекой. + +Пример #3: Углубленная работа с Layout +====== + +Предлагаю немного попрактиковаться в использовании layout. В качестве примера создадим контейнер-окно с четырьмя кнопками, изменяющими его размеры. Вы убедитесь, что нам ни разу не придется вручную считать координаты. + +```lua +local image = require("image") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +-- Создаем полноэкранный контейнер, добавляем темно-серую панель +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +-- Добавляем в главный контенер другой контейнер, который и будет нашим окошком +local window = mainContainer:addChild(GUI.container(2, 2, 80, 25)) +-- Добавляем в контейнер-окно светло-серую фоновую панель +local backgroundPanel = window:addChild(GUI.panel(1, 1, window.width, window.height, 0xDDDDDD)) +-- Добавляем layout с сеткой 3х1 и такими же размерами, как у окна +local layout = window:addChild(GUI.layout(1, 1, window.width, window.height, 3, 1)) + +-- В ячейку 2х1 добавляем загруженное изображение с лицом Стива +layout:setCellPosition(2, 1, layout:addChild(GUI.image(1, 1, image.load("/MineOS/System/Icons/Steve.pic")))) +-- Туда же добавляем слайдер, с помощью которого будем регулировать изменение размера окна +local slider = layout:setCellPosition(2, 1, layout:addChild(GUI.slider(1, 1, 30, 0x0, 0xAAAAAA, 0x1D1D1D, 0xAAAAAA, 1, 30, 10, true, "Изменять размер на: ", "px"))) +-- В ячейке 2х1 задаем вертикальную ориентацию объектов и расстояние между ними в 1 пиксель +layout:setCellDirection(2, 1, GUI.DIRECTION_VERTICAL) +layout:setCellSpacing(2, 1, 1) + +-- Cоздаем функцию, изменяющую размер окна на указанную величину +local function resizeWindow(horizontalOffset, verticalOffset) + window.width, backgroundPanel.width, layout.width = window.width + horizontalOffset, backgroundPanel.width + horizontalOffset, layout.width + horizontalOffset + window.height, backgroundPanel.height, layout.height = window.height + verticalOffset, backgroundPanel.height + verticalOffset, layout.height + verticalOffset + + mainContainer:drawOnScreen() +end + +-- В ячейку 3х1 добавляем 4 кнопки с назначенными функциями по изменению размера окна +layout:setCellPosition(3, 1, layout:addChild(GUI.adaptiveButton(1, 1, 3, 0, 0xFFFFFF, 0x000000, 0x444444, 0xFFFFFF, "Ниже"))).onTouch = function() + resizeWindow(0, -math.floor(slider.value)) +end +layout:setCellPosition(3, 1, layout:addChild(GUI.adaptiveButton(1, 1, 3, 0, 0xFFFFFF, 0x000000, 0x444444, 0xFFFFFF, "Выше"))).onTouch = function() + resizeWindow(0, math.floor(slider.value)) +end +layout:setCellPosition(3, 1, layout:addChild(GUI.adaptiveButton(1, 1, 3, 0, 0xFFFFFF, 0x000000, 0x444444, 0xFFFFFF, "Уже"))).onTouch = function() + resizeWindow(-math.floor(slider.value), 0) +end +layout:setCellPosition(3, 1, layout:addChild(GUI.adaptiveButton(1, 1, 3, 0, 0x3392FF, 0xFFFFFF, 0x444444, 0xFFFFFF, "Шире"))).onTouch = function() + resizeWindow(math.floor(slider.value), 0) +end + +-- В ячейке 3x1 задаем горизонтальную ориентацию кнопок и расстояние между ними в 2 пикселя +layout:setCellDirection(3, 1, GUI.DIRECTION_HORIZONTAL) +layout:setCellSpacing(3, 1, 2) +-- Далее устанавливаем выравнивание кнопок по правому нижнему краю, а также отступ от краев выравнивания в 2 пикселя по ширине и 1 пиксель по высоте +layout:setCellAlignment(3, 1, GUI.ALIGNMENT_HORIZONTAL_RIGHT, GUI.ALIGNMENT_VERTICAL_BOTTOM) +layout:setCellMargin(3, 1, 2, 1) + +-------------------------------------------------------------------------------- + +mainContainer:drawOnScreen(true) +mainContainer:startEventHandling() +``` + +В результате получаем симпатичное окошко с четырьмя кнопками, автоматически расположенными в его правой части. + +Если несколько раз нажать на кнопку "Шире" и "Выше", то окошко растянется, однако все объекты останутся на законных местах. Причем без каких-либо хардкорных расчетов вручную: + +![Imgur](http://i.imgur.com/c8Ks91w.gif) + +Пример #4: Анимация собственного виджета +====== + +Для демонстрации работы с анимациями привожу исходный код, позволяющий с абсолютного нуля создать виджет **switch** и добавить к нему анимацию перемещения. + +```lua +-- Подключаем необходимые библиотеки +local color = require("color") +local buffer = require("doubleBuffering") +local GUI = require("GUI") + +-------------------------------------------------------------------------------- + +-- Создаем функцию, отрисовывающую свитч в экранный буфер +local function switchDraw(switch) + local bodyX = switch.x + switch.width - switch.bodyWidth + -- Рисуем текст свитча + buffer.text(switch.x, switch.y, switch.colors.text, switch.text) + -- Рисуем базовую фоновую подложку пассивного оттенка + buffer.square(bodyX, switch.y, switch.bodyWidth, 1, switch.colors.passive, 0x0, " ") + buffer.text(bodyX + switch.bodyWidth, switch.y, switch.colors.passive, "⠆") + -- Рисуем подложку активного оттенка + buffer.text(bodyX - 1, switch.y, switch.colors.active, "⠰") + buffer.square(bodyX, switch.y, switch.pipePosition - 1, 1, switch.colors.active, 0x0, " ") + -- Рисуем "пимпочку" свитча + buffer.text(bodyX + switch.pipePosition - 2, switch.y, switch.colors.pipe, "⠰") + buffer.square(bodyX + switch.pipePosition - 1, switch.y, 2, 1, switch.colors.pipe, 0x0, " ") + buffer.text(bodyX + switch.pipePosition + 1, switch.y, switch.colors.pipe, "⠆") +end + +-- Создаем функцию-обработчик событий, вызываемую при клике на свитч +local function switchEventHandler(mainContainer, switch, event) + if event == "touch" then + -- Изменяем "состояние" свитча на противоположное и + -- создаем анимацию, плавно перемещающую "пимпочку" + switch.state = not switch.state + switch:addAnimation( + -- В качестве обработчика кадра анимации создаем функцию, + -- устанавливающую позицию "пимпочки" в зависимости от текущей + -- завершенности анимации. Помним также, что animation.position всегда + -- находится в диапазоне [0.0; 1.0]. Если состояние свитча имеет значение false, + -- то мы попросту инвертируем значение позиции анимации, чтобы та визуально + -- проигрывалась в обратную сторону. + function(mainContainer, animation) + if switch.state then + switch.pipePosition = math.round(1 + animation.position * (switch.bodyWidth - 2)) + else + switch.pipePosition = math.round(1 + (1 - animation.position) * (switch.bodyWidth - 2)) + end + end, + -- В качестве метода .onFinish создаем функцию, удаляющую анимацию по ее завершению + function(mainContainer, animation) + animation:delete() + end + -- Запускаем созданную анимацию с указанным интервалом + ):start(switch.animationDuration) + end +end + +-- Создаем объект свитча, наследуясь от GUI.object и заполняя его необходимыми свойствами +local function newSwitch(x, y, totalWidth, bodyWidth, activeColor, passiveColor, pipeColor, textColor, text, switchState) + local switch = GUI.object(x, y, totalWidth, 1) + + switch.bodyWidth = bodyWidth + switch.colors = { + active = activeColor, + passive = passiveColor, + pipe = pipeColor, + text = textColor + } + switch.text = text + switch.state = switchState + switch.pipePosition = switch.state and switch.bodyWidth - 1 or 1 + switch.animationDuration = 0.3 + + switch.draw = switchDraw + switch.eventHandler = switchEventHandler + + return switch +end + +-------------------------------------------------------------------------------- + +-- Создаем полноэкранный контейнер и добавляем в него темно-серую фоновую панель +local mainContainer = GUI.fullScreenContainer() +mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D)) + +-- Создаем гигантское поле из свитчей. Для начала указываем желаемое количество свитчей, +-- а затем зависимые от количество параметры - такие как оттенок по HSB-палитре, +-- координаты и длительность анимации +local count = 168 +local hue = 0 +local hueStep = 360 / count +local x, y = 3, 2 +local animationDurationMin = 0.3 +local animationDurationMax = 0.3 +local animationDuration = animationDurationMin +local animationDurationStep = (animationDurationMax - animationDurationMin) / count + +-- Добавляем в главный контейнер указанное число свитчей +for i = 1, count do + local switchColor = color.HSBToInteger(hue, 1, 1) + local switch = mainContainer:addChild( + newSwitch( + x, y, 19, 7, + switchColor, + 0x1D1D1D, + 0xEEEEEE, + switchColor, + "Cвитч " .. i .. ":", + math.random(2) == 2 + ) + ) + + switch.animationDuration = animationDuration + animationDuration = animationDuration + animationDurationStep + + hue = hue + hueStep + y = y + switch.height + 1 + if y >= mainContainer.height then + x, y = x + switch.width + 3, 2 + end +end + +-- Отрисовываем содержимое главного контейнера в экранный буфер и выводим результат на экран +mainContainer:drawOnScreen() +-- Запускаем обработку событий главного контейнера +mainContainer:startEventHandling() +``` + +Результат: + +![Imgur](http://i.imgur.com/f5aO73U.gif) \ No newline at end of file diff --git a/Documentation/Russian/MineOSInterface.md b/Documentation/Russian/MineOSInterface.md new file mode 100644 index 00000000..d4c4b79b --- /dev/null +++ b/Documentation/Russian/MineOSInterface.md @@ -0,0 +1,171 @@ + +Oписание +====== + +MineOSInterface - это библиотека, поставляющаяся в комплекте с операционной системой MineOS. Она реализует основные системные виджеты, а также отвечает за все манипуляции с окнами. В качестве интерфейсной основы она использует библиотеки **[GUI](https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/GUI.md)** и **[doubleBuffering](https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/doubleBuffering.md)**. + +Кроме того, она предоставляет таблицу с цветами интерфейса ОС по умолчанию: + +![](https://i.imgur.com/xm40hG3.png) + +Для произвольного изменения цветов отдельных элементов окон обращайтесь к ним напрямую. К примеру, через: + +```lua +<окно>.backgroundPanel.colors.background = 0xFF00FF +``` + +Основные методы +====== + +MineOSInterface.**addWindow**( window ): *table* mainContainer, *table* window +----------------------------------------------------------- + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | window | Объект окна, созданный методами, описанными ниже | + +Добавляет созданное окно в окружение MineOS, регистрирует его иконку в Dock, устанавливает обработчики событий, а также добавляет ему несколько методов для пользовательской манипуляции. + +| Тип свойства | Свойство |Описание | +| ------ | ------ | ------ | +| *function* | :**resize**(*int* width, *int* height) | Изменяет размеры окна на указанные, вызывая при этом callback-функцию .**onResize** | +| *callback-function* | .**onResize**(*int* newWidth, *int* newHeight) | Вызывается при изменении размеров окна. Как правило, этот метод используется для изменения размеров и координат содержимого окна после изменения размеров | +| *function* | :**close**() | Закрывает окно и удаляет его из системного окружения | +| *function* | :**minimize**() | Скрывает окно, однако оставляет возможность обратного показа путем клика на его иконку в Dock | +| *function* | :**maximize**() | Изменяет размеры окна под размер экрана, вызывая при этом callback-функцию .**onResize**. Повторный вызов функции вернет размер окна к прежним значениям. Последующие вызовы будут эквивалентны первым двум | + +Примеры реализации описаны ниже. + +Методы для создания окон +====== + +MineOSInterface.**window**( x, y, width, height ): *table* window +----------------------------------------------------------- + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата окна по оси X | +| *int* | x | Координата окна по оси Y | +| *int* | width | Ширина окна | +| *int* | height | Высота окна | + +Создает пустое окно без каких-либо элементов интерфейса. Данный объект является шаблоном для всех остальных, описанных ниже. + +Пример реализации: + +```lua +local GUI = require("GUI") +local MineOSInterface = require("MineOSInterface") + +------------------------------------------------------------------------------------------------------ + +local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.window(1, 1, 88, 25)) +window:addChild(GUI.panel(1, 1, window.width, window.height, 0x888888)) +``` + +Результат: + +![](https://i.imgur.com/lhrm0z6.png?1) + +MineOSInterface.**filledWindow**( x, y, width, height [, color]): *table* window +----------------------------------------------------------- + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата окна по оси X | +| *int* | x | Координата окна по оси Y | +| *int* | width | Ширина окна | +| *int* | height | Высота окна | +| [*int* | color] | Опциональный цвет фоновой панели | + +Создает окно с добавленной фоновой панелью, а также кнопками для закрытия/минимизации/максимизации, являющееся наследником *MineOSInterface*.**window**. Если цвет панели не указывается, то используется *MineOSInterface.colors.windows.backgroundPanel*. + +| Тип свойства | Свойство |Описание | +| ------ | ------ | ------ | +| *table* | .**backgroundPanel** | Указатель на объект фоновой панели (GUI.**panel**) | +| *table* | .**actionButtons** | Указатель на объект кнопок действия (GUI.**actionButtons**) | + +Пример реализации: + +```lua +local MineOSInterface = require("MineOSInterface") + +------------------------------------------------------------------------------------------------------ + +local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.filledWindow(1, 1, 88, 25, 0xF0F0F0)) +``` + +Результат: + +![](https://i.imgur.com/YlCOx68.png?1) + +MineOSInterface.**titledWindow**( x, y, width, height, titleText, [addTitlePanel]): *table* window +----------------------------------------------------------- + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата окна по оси X | +| *int* | x | Координата окна по оси Y | +| *int* | width | Ширина окна | +| *int* | height | Высота окна | +| *string* | titleText | Текст заголовка | +| [*int* | addTitlePanel] | Опциональное добавление подложки под текст заголовка | + +Создает окно с текстовым заголовком. Если указан аргумент, добавляющий подложку, то текст будет находиться на сером прямоугольнике. + +| Тип свойства | Свойство |Описание | +| ------ | ------ | ------ | +| *table* | .**backgroundPanel** | Указатель на объект фоновой панели (GUI.**panel**) | +| *table* | .**actionButtons** | Указатель на объект кнопок действия (GUI.**actionButtons**) | +| *table* | .**titleLabel** | Указатель на объект лейбла заголовка (GUI.**label**) | +| *table* | .**titlePanel** | Указатель на объект лейбла заголовка (GUI.**panel**). Создается только при наличии соответствующего аргумента | + +Пример реализации: + +```lua +local MineOSInterface = require("MineOSInterface") + +------------------------------------------------------------------------------------------------------ + +local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.titledWindow(1, 1, 88, 25, "Hello world", true)) +``` + +Результат: + +![](https://i.imgur.com/4q7DCDD.png?1) + +MineOSInterface.**tabbedWindow**( x, y, width, height ): *table* window +----------------------------------------------------------- + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата окна по оси X | +| *int* | x | Координата окна по оси Y | +| *int* | width | Ширина окна | +| *int* | height | Высота окна | + +Создает окно с панелью вкладок по шаблонным цветам. + +| Тип свойства | Свойство |Описание | +| ------ | ------ | ------ | +| *table* | .**tabBar** | Указатель на объект панели вкладок (GUI.**tabBar**) | +| *table* | .**backgroundPanel** | Указатель на объект фоновой панели (GUI.**panel**) | +| *table* | .**actionButtons** | Указатель на объект кнопок действия (GUI.**actionButtons**) | + +Пример реализации: + +```lua +local MineOSInterface = require("MineOSInterface") + +------------------------------------------------------------------------------------------------------ + +local mainContainer, window = MineOSInterface.addWindow(MineOSInterface.tabbedWindow(1, 1, 88, 25)) +window.tabBar:addItem("Приложения") +window.tabBar:addItem("Библиотеки") +window.tabBar:addItem("Обои") +window.tabBar:addItem("Обновления") +``` + +Результат: + +![](https://i.imgur.com/294FatT.png?1) diff --git a/Documentation/Russian/advancedLua.md b/Documentation/Russian/advancedLua.md new file mode 100644 index 00000000..bb578afb --- /dev/null +++ b/Documentation/Russian/advancedLua.md @@ -0,0 +1,407 @@ +| Содержание | +| ----- | +| [О библиотеке](#О-библиотеке) | +| [Установка](#Установка) | +| [Глобальные функции](#Глобальные-функции) | +| [Дополнения библиотеки table](#Дополнения-библиотеки-table) | +| [Дополнения библиотеки string](#Дополнения-библиотеки-string) | +| [Дополнения библиотеки math](#Дополнения-библиотеки-math) | +| [Дополнения библиотеки filesystem (OpenOS)](#Дополнения-библиотеки-filesystem-openos) | + +О библиотеке +====== +AdvancedLua - библиотека, дополняющая стандартные библиотеки Lua и OpenOS отсутствующими, однако крайне необходимыми в быту функциями: быстрой сериализацией таблиц, определением текущего исполняемого скрипта, переносом строк, округлением чисел, получением сортированных файловых списков, различными методами обработки бинарных данных и т.п. + +Установка +====== + +Исходный код доступен по ссылке: https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/advancedLua.lua + +Для загрузки на компьютер вы можете воспользоваться стандартной утилитой **wget**: + + wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/advancedLua.lua -f + +Глобальные функции +====== + +**getCurrentScript**( ): *string* path +----------------------------------------------------------- + +Функция возвращает путь к текущему исполняемому скрипту. Для примера запустим файл **/Test/Main.lua** со следующим содержимым: + +```lua +print("Путь к текущему скрипту: " .. getCurrentScript()) +``` +В результате на экране будет отображен тот самый путь: + +```lua +Путь к текущему скрипту: /Test/Main.lua +``` + +**enum**( ... ): *table* result +----------------------------------------------------------- + +Функция принимает строковые аргументы и возвращает таблицу с этими аргументами в виде ключей, а также с их порядковым номером в виде значений. Данная функция создана для удобства, когда нет желания вручную изменять значения полей на нужные: + +```lua +local alignment = enum( + "left", + "center", + "right" +) +``` + +В результате таблица alignment будет иметь следующий вид: + +```lua +{ + left = 1, + center = 2, + right = 3 +} +``` + +Дополнения библиотеки table +====== + +table.**serialize**( t, [ pretty, indentationWidth, indentUsingTabs, recursionStackLimit ] ): *string* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | t | Таблица, которую необходимо сериализовать | +| *boolean* | pretty | Опциональный аргумент, сериализующий таблицу для наилучшего визуального восприятия человеком. По умолчанию имеет значение false | +| *int* | indentationWidth | Опциональный аргумент, отвечающий за ширину отступа в символах при сериализации в режиме **pretty** | +| *boolean* | indentUsingTabs | Опциональный аргумент, отвечающий за выбор символа отступа при сериализации в режиме **pretty**. По умолчанию имеет значение false | +| *int* | recursionStackLimit | Опциональный аргумент, отвечающий за ограничение стека рекурсии при сериализации таблиц большого размера | + +Метод изначально создавался в качестве быстрой альтернативы **/lib/serialization.lua**, поставляемой OpenOS. Он преобразует содержимое таблицы в строку и крайне удобен для сохранения конфигов различного ПО в понятном для человека виде с сохранением исходной структуры таблицы. Для примера рассмотрим следующий код: + +```lua +local myTable = { + "Hello", + "world", + abc = 123, + def = "456", + ghi = { + jkl = true, + } +} + +print("Обычная сериализация: " .. table.serialize(myTable)) +print(" ") +print("Красивая сериализация: " .. table.serialize(myTable, true)) +``` + +В результате выполнения скрипта на экране будет отображена сериализованная структура таблицы : + +```lua +Обычная сериализация: {[1]="Hello",[2]="world",["abc"]=123,["def"]="456",["ghi"]={["jkl"]=true}} + +Красивая сериализация: { + [1] = "Hello", + [2] = "world", + abc = 123, + def = "456", + ghi = { + jkl = true, + } +} +``` + +Обращаю ваше внимание, что аргумент **pretty** выполняет несколько дополнительных проверок на тип ключей и значений таблицы, а также генерирует символы переноса строки после каждого значения. Поэтому используйте его только в том случае, когда читабельность результата стоит в приоритете над производительностью. + +table.**unserialize**( text ): *table or nil* result, *string* reason +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | text | Строка, созданная методом table.**serialize**() | + +Метод пытается десериализовать строковое представление lua-таблицы и вернуть результат. Если это невозможно, то возвращается nil и строка с причиной синтаксической ошибки. Для примера выполним простейшую десериализацию: + +```lua +local result = table.unserialize("{ abc = 123 }") +``` + +В результате таблица result будет иметь следующий вид: + +```lua +{ + abc = 123 +} +``` + +table.**toFile**( path, ... ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | path | Путь к файлу, в который необходимо записать сериализованный результат | +| - | ... | Множество аргументов, принимаемых функцией table.**serialize**(...) | + +Метод аналогичен table.**serialize**(...), однако вместо возвращения строкового результата записывает его в файл. Он крайне удобен для быстрого сохранения конфига ПО без излишних заморочек. + +table.**fromFile**( path ): *string* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | path | Путь к файлу, содержимое которого необходимо десериализовать | + +Метод аналогичен table.**unserialize**(...), однако строковое содержимое он читает напрямую из существующего файла, возвращая десериализованный результат. Опять же, по большей части он применяется для удобной загрузки конфигов ПО. + +table.**size**( t ): *int* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | t | Таблица, число ключей которой необходимо вычислить | + +Метод возвращает число ключей переданной таблицы. Отличается от варианта **#t** тем, что подсчитывает также ненумерические индексы + +table.**contains**( t, object ): *boolean* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | t | Таблица, в которой будет осуществлен поиск объекта | +| *var* | object | Объект, наличие которого в таблице необходимо проверить | + +Метод определяет, присутствует ли объект в таблице и возвращает результат + +table.**indexOf**( t, object ): *var* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | t | Таблица, в которой будет осуществлен поиск объекта | +| *var* | object | Объект, индекс которого необходимо определить | + +Метод возвращает индекс (ключ) переданного объекта. Тип индекса может быть различным в зависимости от структуры таблицы: к примеру, в таблице {abc = 123} число 123 имеет строковый индекс abc + +table.**copy**( t ): *table* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | t | Таблица, которую необходимо сдублирвать | + +Метод рекурсивно копирует содержимое таблицы t в новую и возвращает результат. Обращаю внимание на то, что таблицы, ссылающиеся сами на себя, не поддерживаются (ограничение стека рекурсии по аналогии с table.**serialize**() пилить было оч оч лень, прости <3) + +Дополнения библиотеки string +====== + +string.**limit**( s, limit, mode, noDots ): *string* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | s | Строка, длину которой необходимо ограничить | +| *int* | limit | Максимальная длину строки | +| *string* | mode | Режим ограничения для вставки символа многоточия. Может принимать значения **left**, **center** или **right** | +| *boolean* | noDots | Режим ограничения строки классической обрезкой без использования символа многоточия | + +Метод ограничивает строку, вставляя символ многоточия в необходимом месте и возвращая результат. Для примера запустим код: + +```lua +print("Ограничение слева: " .. string.limit("HelloBeautifulWorld", 10, "left")) +print("Ограничение по центру: " .. string.limit("HelloBeautifulWorld", 10, "center")) +print("Ограничение справа: " .. string.limit("HelloBeautifulWorld", 10, "right")) +``` + +В результате на экране будет отображено следующее: + +```lua +Ограничение слева: …ifulWorld +Ограничение по центру: Hello…orld +Ограничение справа: HelloBeau… +``` + +string.**wrap**( s, wrapWidth ): *table* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string/string[]* | s | Строка либо массив строк, которые необходимо перенести по указанной длине | +| *int* | wrapWidth | Максимальная длина строки, на которую следует ориентироваться при переносе | + +Метод осуществляет перенос строки с указанным ограничением по длине и возвращает результат в виде таблицы. Если размер отдельно взятого слова превышает указанную длину, то слово будет "разрезано" на составляющие части. + +Также поддерживаются символы **\n** для автоматического переноса каретки на новую строку. Для примера рассмотрим код: + +```lua +local limit = 20 +local text = "Привет, как дела? Сегодня отличный денек для выгула твоей вонючей псины, не так ли, Сэм?\n\nАх, ты уже не тот Сэм, с которым Фродо расплавил кольцо Саурона в самом сердце Роковой Горы" +local lines = string.wrap(text, limit) + +print(string.rep("-", limit)) +for i = 1, #lines do + print(lines[i]) +end +``` +В результате на экране будет отображен текст: + +```lua +-------------------- +Привет, как дела? +Сегодня отличный +денек для выгула +твоей вонючей псины, +не так ли, Сэм? + +Ах, ты уже не тот +Сэм, с которым Фродо +расплавил кольцо +Саурона в самом +сердце Роковой Горы +``` + + +string.**unicodeFind**( ... ): ... +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| - | ... | Множество аргументов, аналогичных таковым для функции string.**find**(...) | + +Метод аналогичен string.**find**(...), однако позволяет работать с юникодом. Незаменимая штука для русскоговорящей аудитории! + +Дополнения библиотеки math +====== + +math.**round**( number ): *float* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *float* | number | Число, которое необходимо округлить | + +Метод округляет число до ближайшего целого и возвращает результат + +math.**roundToDecimalPlaces**( number, decimalPlaces ): *float* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *float* | number | Число, которое необходимо округлить | +| *int* | decimalPlaces | Число знаков после запятой у округляемого числа | + +Метод округляет число до ближайшего целого, лимитируя результат до указаннонного числа знаков после запятой и возвращает результат + +math.**shorten**( number, decimalPlaces ): *string* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number | Число, которое необходимо визуально сократить | +| *int* | decimalPlaces | Число знаков после запятой у результата | + +Метод преобразует входное число в строку с приставками "**K**", "**M**", "**B**" и "**T**" в завимости от размера числа. Для примера выполним код: + +```lua +print("Сокращенный результат: " .. math.shortenNumber(13484381, 2)) +``` + +В результате на экране отобразится следующее: + +```lua +Сокращенный результат: 13.48M +``` + +math.**getDigitCount**( number ): *int* digitCount +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number | Число, количество десятичных знаков которого необходимо вычислить | + +Метод возвращает количество десятичных знаков в числе. К примеру, в числе **512** их **3**, в числе **1888** их **4** + +Дополнения библиотеки bit32 +====== + +bit32.**merge**( number1, number2 ): *int* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number1 | Первое число для склейки | +| *int* | number2 | Второе число для склейки | + +Метод "склеивает" два числа и возвращает результат. К примеру, вызов метода с аргументами **0xAA** и **0xBB** вернет число **0xAABB** + +bit32.**numberToByteArray**( number ) : *table* byteArray +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number | Число, которое необходимо преобразовать в байт-массив | + +Метод извлекает составляющие байты из числа и возвращает таблицу с ними. К примеру, вызов метода с аргументом **0xAABBCC** вернет таблицу **{0xAA, 0xBB, 0xCC}** + +bit32.**numberToFixedSizeByteArray**( number, arraySize ) : *table* byteArray +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number | Число, которое необходимо преобразовать в байт-массив | +| *int* | arraySize | Фиксированный размер выходного массива | + +Метод аналогичен bit32.**numberToByteArray**(), однако размер выходного массива указывается вручную. Если количество байт в числе меньше указанного размера, то выходной массив будет дополнен отсутствующими нулями, в противном случае массив заполнится лишь частью байт числа. К примеру, вызов метода с аргументами **0xAABBCC** и **5** вернет таблицу **{0x00, 0x00, 0xAA, 0xBB, 0xCC}** + +bit32.**byteArrayToNumber**( byteArray ) : *int* number +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number | Байт-массив, который необходимо преобразовать в число | + +Метод преобразует байты из переданного массива в целое число. К примеру, вызов метода с аргументом **{0xAA, 0xBB, 0xCC}** вернет число **0xAABBCC** + +bit32.**byteArrayToNumber**( byteArray ) : *int* number +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | number | Байт-массив, который необходимо преобразовать в число | + +Метод преобразует байты из переданного массива в целое число. К примеру, вызов метода с аргументом **{0xAA, 0xBB, 0xCC}** вернет число **0xAABBCC** + + +Дополнения библиотеки filesystem (OpenOS) +====== + +filesystem.**extension**( path ): *string* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | path | Путь к файлу, расширение которого необходимо получить | + +Метод возвращает строковое расширение файла по указанному пути. К примеру, для файла **/Test/HelloWorld.lua** будет возвращена строка **.lua** + +filesystem.**hideExtension**( path ): *string* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | path | Путь к файлу, расширение которого необходимо скрыть | + +Метод скрывает расширение файла по указанному пути (если оно имеется) и возвращает строковый результат. К примеру, для файла **/Test/HelloWorld.lua** будет возвращена строка **/Test/HelloWorld** + +filesystem.**isFileHidden**( path ): *boolean* result +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | path | Путь к файлу, скрытость которого необходимо проверить | + +Метод проверяет, является ли файл скрытым (т.е. начинается ли его название с символа "**.**") и возвращает результат. К примеру, для файла **/Test/.Hello.lua** будет возвращено **true** + +filesystem.**sortedList**(path, sortingMethod, [ showHiddenFiles, filenameMatcher, filenameMatcherCaseSensitive ] ): *table* fileList +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | path | Путь к директории, список файлов которой необходимо получить | +| *string* | sortingMethod | Метод сортировки файлов. Может принимать значения **name**, **type** и **date** | +| *boolean* | showHiddenFiles | Опциональный аргумент, отвечающий за включение в список скрытых файлов. По умолчанию имеет значение false | +| *string* | filenameMatcher | Опциональный аргумент, представляющий из себя регулярное выражение, по которому будут отсекаться файлы из списка. К примеру, выражение "**%d+%.lua**" будет включать в список только файлы с расширением **.lua** и имеющие в название исключительно цифры | +| *string* | filenameMatcherCaseSensitive | Опциональный аргумент, позволяющий игнорировать регистр символов при использовании аргумента **filenameMatcher** | + +Метод получает список файлов из указанной директории в соответствии с переданными условиями, сортируя их определенным методом. Возвращаемый результат представляет собой классическую нумерически индексированную таблицу: + +```lua +{ + "bin/", + "lib/", + "home/", + "Main.lua" +} +``` + + +filesystem.**readUnicodeChar**( fileHandle ): *string* char +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *handle* | fileHandle | Открытый файловый дескриптор в бинарном режиме (**rb**) | + +Метод читает из файлового дескриптора юникод-символ, используя бинарные операции. Поскольку "чистый" Lua не позволяет работать с юникод-символами при чтении файлов в текстовом режиме, то этот метод крайне полезен при написании собственных форматов данных. Отмечу, что для успешного чтения вы должны быть уверены, что читаемые байт-последовательности из дескриптора **гарантированно** соответствует какому-либо юникод-символу \ No newline at end of file diff --git a/Documentation/Russian/archive.md b/Documentation/Russian/archive.md new file mode 100644 index 00000000..15832e86 --- /dev/null +++ b/Documentation/Russian/archive.md @@ -0,0 +1,20 @@ + +archive.**pack**( pathToCompressedFile, fileList) +--------------------------------------------------------- + +> Объединить множество входных файлов и директорий в один файл-пакет без сжатия и потери данных + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | pathToCompressedFile | Путь, по которому результирующий пакет должен быть сохранен | +| *table* | fileList | Массив путей к файлам или директориям, которые должны быть упакованы в пакет | + +archive.**unpack**( *string* pathToCompressedFile, *string* pathWhereToUnpack ) +--------------------------------------------------------- + +> Распаковать содержимое пакета, созданного методом .**pack()**, в указанную директорию + +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | pathToCompressedFile | Путь к имеющемуся пакету | +| *string* | pathWhereToUnpack | Путь к папке, в которую должна быть произведена распаковка | diff --git a/Documentation/Russian/color.md b/Documentation/Russian/color.md new file mode 100644 index 00000000..8fe8bd66 --- /dev/null +++ b/Documentation/Russian/color.md @@ -0,0 +1,103 @@ + +О библиотеке +====== +Color - библиотека для работы с цветом. Она позволяет осуществлять экструзию и упаковку цветовых каналов, преобразовывать цветовую модель RGB в HSB и наоборот, осуществлять альфа-блендинг, генерировать цветовые переходы и конвертировать цвет в 8-битный формат для палитры OpenComputers. + +Установка +====== + +Исходный код доступен по ссылке: https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/color.lua + +Для загрузки на компьютер вы можете воспользоваться стандартной утилитой **wget**: + + wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/color.lua -f + +Работа с цветовыми каналами +====== + +color.**RGBToInteger**( red, green, blue ): *int* IntegerColor +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *byte* **[0; 255]** | red | Красный цветовой канал | +| *byte* **[0; 255]** | green | Зеленый цветовой канал | +| *byte* **[0; 255]** | blue | Синий цветовой канал | + +Метод упаковывает три цветовых канала и возвращает 24-битную целочисленную переменную + +color.**integerToRGB**( IntegerColor ): *byte* red, *byte* green, *byte* blue +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | IntegerColor | Цвет в формате 0xRRGGBB | + +Метод извлекает и возвращает три цветовых канала из 24-битной целочисленной переменной. Значения возвращаемых данных находятся в диапазоне [0; 255] + +Обработка цвета +====== + +color.**blend**( firstColor, secondColor, secondColorTransparency ): *int* blendedColor +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | firstColor | Первый цвет | +| *int* | secondColor | Второй цвет | +| *float* **[0.0; 1.0]** | secondColorTransparency | Прозрачность второго цвета при наложении | + +Метод накладывает второй цвет на первый, учитывая прозрачность второго. К примеру, если на красный цвет 0xFF0000 наложить черный цвет 0x000000 с прозрачностью 0.5, то в результате получится цвет 0x7F0000, то есть, темно-красный + +color.**transition**( firstColor, secondColor, position ): *int* transitionColor +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | firstColor | Первый цвет | +| *int* | secondColor | Второй цвет | +| *float* **[0.0; 1.0]** | position | Позиция точки перехода от первого цвета ко второму | + +Метод генерирует переходный цвет между первым и вторым цветом, основываясь на аргументе transition, где значение 0.0 эквивалентно первому цвету, а 1.0 - второму. К примеру, если осуществить переход от черного цвета 0x000000 к белому 0xFFFFFF с позицией перехода 0.5, то в результате получится цвет 0x7F7F7F, то есть, серый. + +Преобразование цветовых моделей +====== + +color.**RGBToHSB**( red, green, blue ): *int* hue, *float* saturation, *float* brightness +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *byte* **[0; 255]** | red | Красный цветовой канал | +| *byte* **[0; 255]** | green | Зеленый цветовой канал | +| *byte* **[0; 255]** | blue | Синий цветовой канал | + +Метод преобразует три цветовых канала цветовой модели RGB в цветовую модель HSB (HSV) и возвращает соответствующий результат. Значения возвращаемых данных *hue* находится в диапазоне [0; 360], а *saturation* и *brightness* - в диапазоне [0.0; 1.0]. + +Для удобства также имеется метод color.**integerToHSB**(*int* integerColor): *int* hue, *float* saturation, *float* brightness + +color.**HSBToRGB**( hue, saturation, brightness ): *byte* red, *byte* green, *byte* blue +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* **[0; 360]** | hue | Оттенок | +| *float* **[0.0; 1.0]** | saturation | Насыщенность | +| *float* **[0.0; 1.0]** | brightness | Яркость | + +Метод преобразует параметры цветовой модели HSB (HSV) в три цветовых канала модели RGB и возвращает соответствующий результат. + +Для удобства также имеется метод color.**HSBToInteger**(*int* hue, *float* saturation, *float* brightness): *int* integerColor + +Компрессия цвета +====== + +color.**to8Bit**( 24BitColor ): *byte* 8BitColor +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | 24BitColor | Цвет в формате 0xRRGGBB | + +Метод обращается к 256-цветной палитре OpenComputers и возвращает индекс цвета, наилучшим образом соответствующего переданному значению, используя тот же метод поиска, что и в gpu.**setBackground**(color). В результате возвращается переменная в диапазоне [0; 255], которая может быть использована для записи в бинарный файл, позволяя экономить память. Обращаю внимание, что метод медленный, и не подходит для отрисовки графики на экране. + +color.**to24Bit**( 8BitColor ): *int* 24BitColor +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | 8BitColor | Индекс палитры OpenComputers | + +Метод позволяет осуществить обратное преобразование 8-битного индекса, созданного методом color.**to8Bit**. diff --git a/Documentation/Russian/doubleBuffering.md b/Documentation/Russian/doubleBuffering.md new file mode 100644 index 00000000..52feb5f4 --- /dev/null +++ b/Documentation/Russian/doubleBuffering.md @@ -0,0 +1,387 @@ +| Содержание | +| ----- | +| [О библиотеке](#О-библиотеке) | +| [Установка](#Установка) | +| [Методы библиотеки](#Методы-библиотеки) | +| [    buffer.getResolution](#buffergetresolution-int-width-int-height) | +| [    buffer.setResolution](#buffersetresolution-width-height-) | +| [    buffer.bindScreen](#bufferbindscreen-address-) | +| [    buffer.bindGPU](#bufferbindgpu-address-) | +| [Методы отрисовки](#Методы-отрисовки) | +| [    buffer.draw](#bufferdraw-force-) | +| [    buffer.setDrawLimit](#buffersetdrawlimit-x1-y1-x2-y2-) | +| [    buffer.getDrawLimit](#buffergetdrawlimit--int-x1-int-y1-int-x2-int-y2) | +| [    buffer.copy](#buffercopy-x-y-width-height--table-pixeldata) | +| [    buffer.paste](#bufferpaste-x-y-pixeldata-) | +| [    buffer.set](#bufferpaste-x-y-pixeldata-) | +| [    buffer.get](#bufferpaste-x-y-pixeldata-) | +| [    buffer.square](#buffersquare-x-y-width-height-background-foreground-symbol-transparency-) | +| [    buffer.clear](#bufferclear-color-transparency-) | +| [    buffer.text](#buffertext-x-y-color-text-transparency-) | +| [    buffer.formattedText](#bufferformattedtext-x-y-text-) | +| [    buffer.image](#bufferimage-x-y-picture-) | +| [Методы полупиксельной отрисовки:](#Методы-полупиксельной-отрисовки) | +| [    buffer.semiPixelSet](#buffersemipixelset-x-y-color-) | +| [    buffer.semiPixelSquare](#buffersemipixelsquare-x-y-width-height-color-) | +| [    buffer.semiPixelLine](#buffersemipixelline-x1-y1-x2-y2-color-) | +| [    buffer.semiPixelCircle](#buffersemipixelcircle-xcenter-ycenter-radius-color-) | +| [    buffer.semiPixelBezierCurve](#buffersemipixelbeziercurve-points-color-precision-) | +| [Вспомогательные методы:](#Вспомогательные-методы) | +| [    buffer.flush](#bufferflush-width-height-) | +| [    buffer.getIndexByCoordinates](#buffergetindexbycoordinates-x-y--int-index) | +| [    buffer.getCoordinatesByIndex](#buffergetcoordinatesbyindex-index--int-x-int-y) | +| [    buffer.rawSet](#bufferrawset-index-background-foreground-symbol-) | +| [    buffer.rawGet](#bufferrawget-index--int-background-int-foreground-char-symbol) | +| [Практический пример #1](#Практический-пример-1) | + + +О библиотеке +====== +DoubleBuffering - низкоуровневая библиотека для эффективного использования ресурсов GPU и отрисовки содержимого экрана с предельно возможной скоростью. К примеру, с ее помощью реализован наш игровой движок с динамическим освещением сцен, а также небольшая игра на алгоритме рейкастинга, выдающие более чем достойные значения FPS: + +![Imgur](http://i.imgur.com/YgL9fCo.png?1) + +![Imgur](http://i.imgur.com/yHEwiNo.png?1) + +Сама суть библиотеки очень проста: в оперативной памяти хранится два массива, содержащих информацию о пикселях на экране. Первый хранит то, что отображено в данный момент, а второй - то, что пользователь желает отрисовать. После осуществления всех операций отрисовки пользователь вызывает метод buffer.**draw**(), затем система автоматически определяет изменившиеся пиксели, группирует их в промежуточный буфер, чтобы число GPU-операций было минимальным, а затем выводит изменения на экран. + +По сравнению с стандартной отрисовкой время отображения сокращается в сотни и тысячи раз. На рисунке ниже наглядно показана эффективность библиотеки: + +![meow](http://i60.fastpic.ru/big/2015/1026/8a/4c72bfcbe8fbee5993bfd7a058a5f88a.png) + +Цена таких космических скоростей - повышенный расход оперативной памяти. Чтобы предельно уменьшить его, мы используем одномерную структуру экранных массивов вместо трехмерной: + +![Imgur](http://i.imgur.com/2Pkne53.png) + +Для получения данных о пикселях используются специальные методы, преобразующие экранные координаты в индексы экранного буфера и наоборот, подробнее об этом написано ниже в разделе "**Вспомогательные методы**". + +Кроме того, библиотека не обращается ни к одной lua-таблице напрямую, заменяя их на переменные-аналоги и избегая при этом расчетов данных хеш-таблиц: к примеру, каждый метод GPU экранирован, и вместо gpu.setBackground используется GPUSetBackground(). При грамотной реализации такой подход колоссально увеличивает производительность, не нагружая при этом Lua GC. + +Установка +====== + +| Библиотека | Функционал | +| ------ | ------ | +| *[advancedLua](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/advancedLua.lua)* | Дополнение стандартных библиотек Lua множеством функций: быстрой сериализацией таблиц, переносом строк, методами обработки бинарных данных и т.д. | +| *[color](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/color.lua)* | Экструзия цветовых каналов, альфа-блендинг, поддержка различных палитр и конвертации цвета в 8-битный формат | +| *[image](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/image.lua)* | Реализация стандарта изображений для OpenComputers и базовые методы их обработки: транспонирование, обрезка, поворот, отражение и т.д. | +| *[OCIF](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/FormatModules/OCIF.lua)* | Модуль формата изображения OCIF (OpenComputers Image Format) для библиотеки image, написанный с учетом особенностей мода и реализующий эффективное сжатие пиксельных данных | +| *[doubleBuffering](https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/doubleBuffering.lua)* | Данная библиотека | + +Вы можете использовать имеющиеся выше ссылки для установки зависимостей вручную или запустить автоматический [установщик](https://pastebin.com/vTM8nbSZ), загружающий все необходимые файлы за вас: + + pastebin run vTM8nbSZ + +Основные методы +====== + +buffer.**getResolution**(): *int* width, *int* height +----------------------------------------------------------- +Получить разрешение экранного буфера. Для удобства также имеются методы buffer.**getWidth**() и buffer.**getHeight**(). + +buffer.**setResolution**( width, height ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | width | Ширина буфера | +| *int* | height | Высота буфера | + +Установить разрешение экранного буфера и GPU равным указанному. Содержимое буфера при этом будет заполнено черными пикселями с символом пробела. + +buffer.**bindScreen**( address ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | address | Адрес компонента экрана | + +Связать используемую буфером видеокарту с указанным адресом компонента экрана. Содержимое буфера при этом будет очищено черными пикселями с символом пробела. + +buffer.**bindGPU**( address ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *string* | address | Адрес компонента видеокарты | + +Изменить используемую буфером видеокарту на указанную. Содержимое буфера при этом будет очищено черными пикселями с символом пробела. + +buffer.**getGPUProxy**( ): *table* GPUProxy +----------------------------------------------------------- +Получить указатель на proxy используемого буфером компонента видеокарты. + +Методы отрисовки +====== + +buffer.**draw**( [force] ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| [*boolean* | force] | Принудительная отрисовка | + +Отрисовать содержимое буфера на экран. Если имеется опциональный аргумент *force*, то содержимое буфера будет отрисовано полностью и вне зависимости от изменившихся пикселей. + +buffer.**setDrawLimit**( x1, y1, x2, y2 ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x1 | Координата первой точки лимита отрисовки по оси x | +| *int* | y1 | Координата первой точки лимита отрисовки по оси y | +| *int* | x2 | Координата второй точки лимита отрисовки по оси x | +| *int* | y2 | Координата второй точки лимита отрисовки по оси y | + +Установить лимит отрисовки буфера до указанного. При этом любые операции, выходящие за границы лимита, будут игнорироваться. По умолчанию буфер всегда имеет лимит отрисовки в диапазонах **x ∈ [1; buffer.width]** и **y ∈ [1; buffer.height]** + +buffer.**getDrawLimit**( ): *int* x1, *int* y1, *int* x2, *int* y2 +----------------------------------------------------------- +Получить текущий лимит отрисовки. + +buffer.**copy**( x, y, width, height ): *table* pixelData +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата копируемой области по оси x | +| *int* | y | Координата копируемой области по оси y | +| *int* | width | Ширина копируемой области | +| *int* | height | Высота копируемой области | + +Скопировать содержимое указанной области из буфера и выдать в виде таблицы. Впоследствии можно использовать с buffer.**paste**(...). + +buffer.**paste**( x, y, pixelData ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата вставки по оси x | +| *int* | y | Координата вставки по оси y | +| *table* | pixelData | Таблица со скопированной ранее областью буфера | + +Вставить скопированное содержимое буфера по указанным координатам. + +buffer.**set**( x, y, background, foreground, symbol ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата по оси x | +| *int* | y | Координата по оси y | +| *int* | background | Цвет фона | +| *int* | foreground | Цвет символа | +| *char* | symbol | Символ | + +Установить значение конкретного пикселя на экране. Полезно для мелкого и точного редактирования. + +buffer.**get**( x, y ): *int* background, *int* foreground, *char* symbol +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата по оси x | +| *int* | y | Координата по оси y | + +Получить значение конкретного пикселя на экране. + +buffer.**square**( x, y, width, height, background, foreground, symbol, transparency ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата прямоугольника по оси x | +| *int* | y | Координата прямоугольника по оси y | +| *int* | width | Ширина прямоугольника | +| *int* | height | Высота прямоугольника | +| *int* | background | Цвет фона прямоугольника | +| *int* | foreground | Цвет символов прямоугольника | +| *char* | symbol | Символ, которым будет заполнен прямоугольник | +| [*float* | transparency] | Опциональная прозрачность прямоугольника | + +Заполнить прямоугольную область указанными данными. При указании прозрачности в диапазоне [0.0; 1.0] прямоугольник будет накладываться поверх существующей информации, словно прозрачное стеклышко. + +buffer.**clear**( [color, transparency] ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| [*int* | background] | Опциональный цвет фона | +| [*float* | transparency] | Опциональная прозрачность фона | + +Работает как buffer.**square**(...), однако применяется сразу ко всем пикселям буфера. Если аргументов не передается, то буфер заполняется стандартным черным цветом и символом пробела. Удобно для быстрой очистки содержимого буфера. + +buffer.**text**( x, y, color, text, transparency ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата текста по оси x | +| *int* | y | Координата текста по оси y | +| *int* | foreground | Цвет текста | +| *string* | text | Текст | +| [*float* | transparency] | Опциональная прозрачность текста | + +Нарисовать текст указанного цвета поверх имеющихся пикселей. Цвет фона при этом остается прежним. Можно также указать опциональную прозрачность текста текста в диапазоне [0.0; 1.0]. + +buffer.**formattedText**( x, y, text ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата текста по оси x | +| *int* | y | Координата текста по оси y | +| *string* | text | Текст | + +Аналогичен методу buffer.**text**(), однако поддерживает цветовое форматирование. По умолчанию цвет текста имеет значение 0xFFFFFF, для его изменения используйте синтаксическую вставку вида **\#RRGGBB**. К примеру, "Hello world, **\#FF00FF**this is formatted text!". + +buffer.**image**( x, y, picture ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата изображения по оси x | +| *int* | y | Координата изображения по оси y | +| *table* | picture | Загруженное изображение | + +Нарисовать загруженное через image.**load**(*string* path) изображение. Альфа-канал изображения также поддерживается. + +Методы полупиксельной отрисовки +====== + +Все методы полупиксельной отрисовки позволяют избежать эффекта удвоения высоты пикселя консольной графики, используя специальные символы наподобие "▄". При этом передаваемые координаты по оси **Y** должны принадлежать промежутку **[0; buffer.height * 2]**. + + +buffer.**semiPixelSet**( x, y, color ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x1 | Координата пикселя по оси x | +| *int* | y1 | Координата пикселя по оси y | +| *int* | color | Цвет пикселя | + +Установка пиксельного значения в указанной точке. + +buffer.**semiPixelSquare**( x, y, width, height, color ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата прямоугольника по оси x | +| *int* | y | Координата прямоугольника по оси y | +| *int* | width | Ширина прямоугольника | +| *int* | height | Высота прямоугольника | +| *int* | color | Цвет прямоугольника | + +Отрисовка прямоугольника с указанными параметрами. + +buffer.**semiPixelLine**( x1, y1, x2, y2, color ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x1 | Координата первой точки линии по оси x | +| *int* | y1 | Координата первой точки линии по оси y | +| *int* | x2 | Координата второй точки линии по оси x | +| *int* | y2 | Координата второй точки линии по оси y | +| *int* | color | Цвет линии | + +Растеризация отрезка указанного цвета + +buffer.**semiPixelCircle**( xCenter, yCenter, radius, color ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | xCenter | Координата центральной точки окружности по оси x | +| *int* | yCenter | Координата центральной точки окружности по оси y | +| *int* | radius | Радиус окружности | +| *int* | color | Цвет окружности | + +buffer.**semiPixelBezierCurve**( points, color, precision ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *table* | points | Таблица вида ```{{x = 32, y = 2}, {x = 2, y = 2}, {x = 2, y = 98}}```, содержащая опорные точки для отрисовки кривой Безье | +| *int* | color | Цвет кривой Безье | +| *float* | precision | Точность отрисовки кривой Безье. Чем меньше - тем точнее | + +Растеризация [кривой Безье](https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%91%D0%B5%D0%B7%D1%8C%D0%B5) с указанным цветом. + +Вспомогательные методы +====== + +Ниже перечислены методы, используемые самой библиотекой или приложениями, требующими максимального быстродействия и рассчитывающими пиксельные данные буфера вручную. В большинстве случаев они не пригождаются, однако для ознакомления указаны. + +buffer.**flush**( [width, height] ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | width | Ширина буфера | +| *int* | height | Высота буфера | + +Метод, устанавливающий разрешение экранного буфера равным указанному и заполняющий его черными пикселями с символом пробела. В отличие от buffer.**setResolution** не изменяет текущего разрешения GPU. Если опциональные аргументы не указаны, то размер буфера становится эквивалентным текущему разрешению GPU. + +buffer.**getIndex*( x, y ): int index +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | x | Координата пикселя экрана по оси x | +| *int* | y | Координата пикселя экрана по оси y | + +Метод, преобразующий экранные координаты в индекс экраннного буфера. К примеру, пиксель 2x1 имеет индекс буфера 4, а пиксель 3x1 имеет индекс буфера 7. + +buffer.**getCoordinates**( index ): int x, int y +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | index | Индекс экранного буфера | + +Метод, преобразующий индекс буфера в соответствующие ему координаты на экране. + +buffer.**rawSet**( index, background, foreground, symbol ) +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | index | Индекс экранного буфера | +| *int* | background | Цвет фона | +| *int* | foreground | Цвет символа | +| *char* | symbol | Символ | + +Метод, устанавливающий соответствующие значения цветов и символа пикселю с указанным индексом. + +buffer.**rawGet**( index ): int background, int foreground, char symbol +----------------------------------------------------------- +| Тип | Аргумент | Описание | +| ------ | ------ | ------ | +| *int* | index | Индекс экранного буфера | + +Метод, возвращающий соответствующие значения цветов и символа пикселя с указанным индексом. + +Практический пример +====== + +```lua +-- Подключаем библиотеки +local buffer = require("doubleBuffering") +local image = require("image") + +----------------------------------------------------------------------------------------------- + +-- Загружаем и рисуем изображение +buffer.image(1, 1, image.load("/MineOS/Pictures/Raspberry.pic")) +-- Заполняем буфер черным цветом с прозрачностью 0.6, чтобы изображение было чуть темнее +buffer.clear(0x0, 0.6) + +-- Рисуем 10 квадратиков, заполненных случайным цветом +local x, y, xStep, yStep = 2, 2, 4, 2 +for i = 1, 10 do + buffer.square(x, y, 6, 3, math.random(0x0, 0xFFFFFF), 0x0, " ") + x, y = x + xStep, y + yStep +end + +-- Рисуем желтую окружность +buffer.semiPixelCircle(22, 22, 10, 0xFFDB40) +-- Рисуем белую линию +buffer.semiPixelLine(2, 36, 35, 3, 0xFFFFFF) +-- Рисуем зеленую кривую Безье с точностью 0.01 +buffer.semiPixelBezierCurve( + { + { x = 2, y = 63}, + { x = 63, y = 63}, + { x = 63, y = 2} + }, + 0x44FF44, + 0.01 +) + +-- Выводим содержимое буфера на экран +buffer.draw() +``` + +Результат: + +![Imgur](http://i.imgur.com/wvu0jeh.png?1) diff --git a/Files.cfg b/Files.cfg index aa51b2ed..ecd67aea 100644 --- a/Files.cfg +++ b/Files.cfg @@ -2,63 +2,63 @@ preInstall = { { path="/lib/advancedLua.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/advancedLua.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/AdvancedLua/master/AdvancedLua.lua", fileID=93, }, { path="/lib/color.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/color.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/Color/master/Color.lua", fileID=92, }, { path="/lib/FormatModules/OCIF.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/FormatModules/OCIF.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/Image/master/OCIF.lua", }, { path="/lib/image.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/image.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/Image/master/Image.lua", fileID=73, }, { path="/lib/doubleBuffering.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/doubleBuffering.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/DoubleBuffering/master/DoubleBuffering.lua", fileID=97, }, { path="/lib/GUI.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/GUI.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/GUI/master/GUI.lua", fileID=100, }, { path="/lib/MineOSCore.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSCore.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/MineOSCore.lua", fileID=108, }, { path="/lib/MineOSPaths.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSPaths.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/MineOSPaths.lua", fileID=110, }, { path="/lib/web.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/web.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/web.lua", fileID=101, }, }, localizations = { { path="/MineOS/System/Localizations/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Localizations/OS/English.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Localizations/OS/English.lang", fileID=554, }, { path="/MineOS/System/Localizations/French.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Localizations/OS/French.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Localizations/OS/French.lang", fileID=848, }, { path="/MineOS/System/Localizations/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Localizations/OS/Russian.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Localizations/OS/Russian.lang", fileID=553, }, }, @@ -66,357 +66,357 @@ -- Либы { path="/lib/MineOSNetwork.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSNetwork.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/MineOSNetwork.lua", fileID=253, }, { path="/lib/MineOSInterface.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/MineOSInterface.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/MineOSInterface.lua", fileID=109, }, { path="/lib/event.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/event.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/event.lua", fileID=102, }, { path="/lib/FormatModules/OCAF.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/FormatModules/OCAF.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/FormatModules/OCAF.lua", }, { path="/lib/archive.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/archive.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/archive.lua", fileID=94, }, { path="/lib/SHA2.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/SHA2.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/SHA2.lua", fileID=104, }, { path="/lib/ECSAPI.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/ECSAPI.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/lib/ECSAPI.lua", fileID=252, }, -- Скрипты { path="/bin/OS.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/OS.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/OS.lua", fileID=106, }, -- Ассоциации контекстного меню { path="/MineOS/System/Extensions/Lua/ContextMenu.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Lua/ContextMenu.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Extensions/Lua/ContextMenu.lua", fileID=150, }, { path="/MineOS/System/Extensions/Lua/Launcher.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Lua/Launcher.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Extensions/Lua/Launcher.lua", fileID=151, }, { path="/MineOS/System/Extensions/Pic/ContextMenu.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Pic/ContextMenu.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Extensions/Pic/ContextMenu.lua", fileID=152, }, { path="/MineOS/System/Extensions/Arc/Launcher.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Extensions/Arc/Launcher.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Extensions/Arc/Launcher.lua", fileID=153, }, -- Системные иконки { path="/MineOS/System/Icons/Application.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Application.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Application.pic", fileID=131, }, { path="/MineOS/System/Icons/3DModel.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/3DModel.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/3DModel.pic", fileID=132, }, { path="/MineOS/System/Icons/Computer.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Computer.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Computer.pic", fileID=133, }, { path="/MineOS/System/Icons/Robot.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Robot.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Robot.pic", fileID=134, }, { path="/MineOS/System/Icons/Tablet.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Tablet.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Tablet.pic", fileID=135, }, { path="/MineOS/System/Icons/Pastebin.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Pastebin.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Pastebin.pic", fileID=136, }, { path="/MineOS/System/Icons/HDD.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/HDD.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/HDD.pic", fileID=137, }, { path="/MineOS/System/Icons/Floppy.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Floppy.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Floppy.pic", fileID=138, }, { path="/MineOS/System/Icons/Steve.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Steve.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Steve.pic", fileID=139, }, { path="/MineOS/System/Icons/Folder.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Folder.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Folder.pic", fileID=140, }, { path="/MineOS/System/Icons/FileNotExists.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/FileNotExists.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/FileNotExists.pic", fileID=141, }, { path="/MineOS/System/Icons/Script.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Script.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Script.pic", fileID=142, }, { path="/MineOS/System/Icons/Text.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Text.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Text.pic", fileID=143, }, { path="/MineOS/System/Icons/Config.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Config.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Config.pic", fileID=144, }, { path="/MineOS/System/Icons/Image.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Image.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Image.pic", fileID=145, }, { path="/MineOS/System/Icons/Lua.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Lua.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Lua.pic", fileID=146, }, { path="/MineOS/System/Icons/SampleIcon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/SampleIcon.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/SampleIcon.pic", fileID=147, }, { path="/MineOS/System/Icons/Archive.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Archive.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Archive.pic", fileID=148, }, { path="/MineOS/System/Icons/Trash.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Icons/Trash.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Icons/Trash.pic", fileID=149, }, -- Скринсейверы { path="/MineOS/System/Screensavers/Matrix.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Matrix.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Screensavers/Matrix.lua", }, { path="/MineOS/System/Screensavers/Mandala.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Mandala.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Screensavers/Mandala.lua", }, { path="/MineOS/System/Screensavers/Clock.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Clock.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Screensavers/Clock.lua", }, { path="/MineOS/System/Screensavers/Lines.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Lines.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Screensavers/Lines.lua", }, { path="/MineOS/System/Screensavers/XCOM.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/XCOM.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Screensavers/XCOM.lua", }, { path="/MineOS/System/Screensavers/NyanCat.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/NyanCat.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Screensavers/NyanCat.lua", }, -- Приложения { path="/MineOS/Applications/App Market.app/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Main.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/AppMarket/Main.lua", fileID=164, }, { path="/MineOS/Applications/App Market.app/Icon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Icon.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/AppMarket/Icon.pic", }, { path="/MineOS/Applications/App Market.app/Localizations/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Localization/Russian.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/AppMarket/Localization/Russian.lang", }, { path="/MineOS/Applications/App Market.app/Localizations/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Localization/English.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/AppMarket/Localization/English.lang", }, { path="/MineOS/Applications/App Market.app/Localizations/French.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/AppMarket/Localization/French.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/AppMarket/Localization/French.lang", }, -- { path="/MineOS/Applications/MineCode IDE.app/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Main.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/MineCodeIDE/Main.lua", fileID=169, }, { path="/MineOS/Applications/MineCode IDE.app/Icon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Icon.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/MineCodeIDE/Icon.pic", }, { path="/MineOS/Applications/MineCode IDE.app/Localizations/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Localization/Russian.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/MineCodeIDE/Localization/Russian.lang", }, { path="/MineOS/Applications/MineCode IDE.app/Localizations/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Localization/English.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/MineCodeIDE/Localization/English.lang", }, { path="/MineOS/Applications/MineCode IDE.app/Localizations/French.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Localization/French.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/MineCodeIDE/Localization/French.lang", }, -- { path="/MineOS/Applications/Picture Edit.app/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Main.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Main.lua", fileID=798, }, { path="/MineOS/Applications/Picture Edit.app/Icon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Icon.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Icon.pic", }, { path="/MineOS/Applications/Picture Edit.app/Tools/1.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/1.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/1.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/2.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/2.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/2.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/3.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/3.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/3.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/4.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/4.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/4.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/5.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/5.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/5.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/6.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/6.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/6.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/7.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/7.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/7.lua", }, { path="/MineOS/Applications/Picture Edit.app/Tools/8.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/PictureEdit/Tools/8.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/PictureEdit/Tools/8.lua", }, -- { path="/MineOS/Applications/Control.app/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Main.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Main.lua", fileID=292, }, { path="/MineOS/Applications/Control.app/Icon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Icon.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Icon.pic", }, { path="/MineOS/Applications/Control.app/Localizations/Russian.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/Russian.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Localization/Russian.lang", }, { path="/MineOS/Applications/Control.app/Localizations/English.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/English.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Localization/English.lang", }, { path="/MineOS/Applications/Control.app/Localizations/French.lang", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Localization/French.lang", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Localization/French.lang", }, { path="/MineOS/Applications/Control.app/Modules/1.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/1.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Modules/1.lua", }, { path="/MineOS/Applications/Control.app/Modules/2.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/2.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Modules/2.lua", }, { path="/MineOS/Applications/Control.app/Modules/3.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/3.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Modules/3.lua", }, { path="/MineOS/Applications/Control.app/Modules/4.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Control/Modules/4.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Control/Modules/4.lua", }, -- { path="/MineOS/Applications/Finder.app/Main.lua", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Finder/Main.lua", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Finder/Main.lua", fileID=175, }, { path="/MineOS/Applications/Finder.app/Icon.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Applications/Finder/Icon.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Applications/Finder/Icon.pic", }, }, wallpapers = { { path="/MineOS/Pictures/MoonTouch.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/MoonTouch.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/MoonTouch.pic", }, { path="/MineOS/Pictures/Raspberry.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Raspberry.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Raspberry.pic", }, { path="/MineOS/Pictures/Catniss.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Catniss.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Catniss.pic", }, { path="/MineOS/Pictures/Ciri.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Ciri.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Ciri.pic", }, { path="/MineOS/Pictures/Girl.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Girl.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Girl.pic", }, { path="/MineOS/Pictures/Space.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Space.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Space.pic", }, { path="/MineOS/Pictures/Block.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Block.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Block.pic", }, { path="/MineOS/Pictures/Road.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/Road.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/Road.pic", }, { path="/MineOS/Pictures/TyanSunset.pic", - url="https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Wallpapers/TyanSunset.pic", + url="https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Wallpapers/TyanSunset.pic", }, } } \ No newline at end of file diff --git a/ImageConverter/.idea/artifacts/ImageConverter_jar.xml b/ImageConverter/.idea/artifacts/ImageConverter_jar.xml deleted file mode 100644 index fa59c593..00000000 --- a/ImageConverter/.idea/artifacts/ImageConverter_jar.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - $PROJECT_DIR$/out/artifacts/ImageConverter_jar - - - - - \ No newline at end of file diff --git a/ImageConverter/.idea/codeStyles/codeStyleConfig.xml b/ImageConverter/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a17..00000000 --- a/ImageConverter/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/ImageConverter/.idea/compiler.xml b/ImageConverter/.idea/compiler.xml deleted file mode 100644 index 217af471..00000000 --- a/ImageConverter/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/ImageConverter/.idea/description.html b/ImageConverter/.idea/description.html deleted file mode 100644 index cc10d567..00000000 --- a/ImageConverter/.idea/description.html +++ /dev/null @@ -1,2 +0,0 @@ -Simple JavaFX 2.0 application that includes simple .fxml file with attached controller and Main class to quick start. Artifact to build JavaFX application is provided. - \ No newline at end of file diff --git a/ImageConverter/.idea/encodings.xml b/ImageConverter/.idea/encodings.xml deleted file mode 100644 index e206d70d..00000000 --- a/ImageConverter/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/ImageConverter/.idea/gradle.xml b/ImageConverter/.idea/gradle.xml deleted file mode 100644 index 157a0c14..00000000 --- a/ImageConverter/.idea/gradle.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/ImageConverter/.idea/kotlinc.xml b/ImageConverter/.idea/kotlinc.xml deleted file mode 100644 index 1c24f9a8..00000000 --- a/ImageConverter/.idea/kotlinc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ImageConverter/.idea/misc.xml b/ImageConverter/.idea/misc.xml deleted file mode 100644 index a4e3dc88..00000000 --- a/ImageConverter/.idea/misc.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/ImageConverter/.idea/modules.xml b/ImageConverter/.idea/modules.xml deleted file mode 100644 index cf4ecd4d..00000000 --- a/ImageConverter/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/ImageConverter/.idea/uiDesigner.xml b/ImageConverter/.idea/uiDesigner.xml deleted file mode 100644 index 3b000203..00000000 --- a/ImageConverter/.idea/uiDesigner.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ImageConverter/.idea/vcs.xml b/ImageConverter/.idea/vcs.xml deleted file mode 100644 index def6a6a1..00000000 --- a/ImageConverter/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/ImageConverter/.idea/workspace.xml b/ImageConverter/.idea/workspace.xml deleted file mode 100644 index 2307786b..00000000 --- a/ImageConverter/.idea/workspace.xml +++ /dev/null @@ -1,967 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - open - ocif - onTextFieldTextChanged - initi - OCIF6 - OCIF5ConvertAsBraille - OCIF5ConvertAsSemiPixel - mainPane - play - playAnimation( - initiali - loadIm - encodingMethods - combo - результ - enable bra - scene - integerToByteArray - currentImagePath - new Image - imageGridPan - loadImage - dragEn - playAnimationSt - hints - OCIF - loadImage( - onDithering - new - percen - - - sample - dragDropAnimationGridPane - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -