diff --git a/Applications/InfoPanel/Icon.pic b/Applications/InfoPanel/Icon.pic new file mode 100644 index 00000000..91bbd794 Binary files /dev/null and b/Applications/InfoPanel/Icon.pic differ diff --git a/Applications/InfoPanel/InfoPanel.lua b/Applications/InfoPanel/InfoPanel.lua index 51dcb6a2..af2fe403 100644 --- a/Applications/InfoPanel/InfoPanel.lua +++ b/Applications/InfoPanel/InfoPanel.lua @@ -1,79 +1,154 @@ local ecs = require("ECSAPI") +local event = require("event") +local unicode = require("unicode") local fs = require("filesystem") local gpu = require("component").gpu --------------------------------------------------------------------------------------------------------------- - -local colors = { - background = 0x262626, - leftBar = 0xEEEEEE, - leftBarText = 0x262626, - text = 0xFFFFFF, +local config = { + scale = 0.63, + leftBarWidth = 20, + colors = { + leftBar = 0xEEEEEE, + leftBarText = 0x262626, + leftBarSelection = 0x00C6FF, + leftBarSelectionText = 0xFFFFFF, + scrollbarBack = 0xEEEEEE, + scrollbarPipe = 0x3366CC, + background = 0x262626, + text = 0xFFFFFF, + }, } +local xOld, yOld = gpu.getResolution() +ecs.setScale(config.scale) local xSize, ySize = gpu.getResolution() -local leftBarWidth = 20 -local fileList + +local pathToFiles = "Infopanel/" +fs.makeDirectory(pathToFiles) local currentFile = 1 -local currentLine = 1 -local pathToInfoPanel = "InfoPanel" +local fileList +local stroki = {} +local currentString = 1 +local scrollValue = 4 +local stringsHeightLimit = ySize - 2 +local stringsWidthLimit = xSize - config.leftBarWidth - 4 --------------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------ -local function loadFile(number) - -end - -local function getFileList() - fs.makeDirectory(pathToInfoPanel) - fileList = ecs.getFileList(pathToInfoPanel) +local obj = {} +local function newObj(class, name, ...) + obj[class] = obj[class] or {} + obj[class][name] = {...} end local function drawLeftBar() - ecs.square(1, 1, leftBarWidth, ySize, colors.leftBar) - gpu.setForeground(colors.leftBarText) + --ecs.square(1, 1, config.leftBarWidth, ySize, config.colors.leftBar) + fileList = ecs.getFileList(pathToFiles) + obj["Files"] = {} + local yPos = 1, 1 for i = 1, #fileList do - local text = ecs.stringLimit("end", fileList[i], leftBarWidth - 2) if i == currentFile then - ecs.square(1, i, leftBarWidth, 1, ecs.colors.blue) - ecs.colorText(2, i, 0xFFFFFF, text) - gpu.setForeground(colors.leftBarText) - gpu.setBackground(colors.leftBar) + newObj("Files", i, ecs.drawButton(1, yPos, config.leftBarWidth, 3, ecs.hideFileFormat(fileList[i]), config.colors.leftBarSelection, config.colors.leftBarSelectionText)) else - gpu.set(2, i, text) + if i % 2 == 0 then + newObj("Files", i, ecs.drawButton(1, yPos, config.leftBarWidth, 3, ecs.stringLimit("end", fileList[i], config.leftBarWidth - 2), config.colors.leftBar, config.colors.leftBarText)) + else + newObj("Files", i, ecs.drawButton(1, yPos, config.leftBarWidth, 3, ecs.stringLimit("end", fileList[i], config.leftBarWidth - 2), config.colors.leftBar - 0x111111, config.colors.leftBarText)) + end end + yPos = yPos + 3 end + ecs.square(1, yPos, config.leftBarWidth, ySize - yPos + 1, config.colors.leftBar) +end + +local function loadFile() + stroki = {} + local file = io.open(pathToFiles .. fileList[currentFile], "r") + for line in file:lines() do table.insert(stroki, line) end + file:close() end local function drawMain() - local text = {} - local file = io.open(pathToInfoPanel .. "/" .. fileList[currentFile], "r") - for line in file:lines() do - table.insert(text, line) - end - file:close() + local xPos, yPos = config.leftBarWidth + 3, 2 - local xPos, yPos = leftBarWidth + 1, 1 - ecs.square(xPos, yPos, xSize, ySize, colors.background) + ecs.square(xPos, yPos, xSize - config.leftBarWidth - 5, ySize, config.colors.background) - xPos = xPos + 2 - yPos = yPos + 1 + gpu.setForeground(config.colors.text) - gpu.setForeground(colors.text) - for i = currentLine, currentLine + (ySize - 2) do - if text[i] then - ecs.smartText(xPos, yPos, text[i]) + for i = currentString, (stringsHeightLimit + currentString - 1) do + if stroki[i] then + ecs.formattedText(xPos, yPos, stroki[i], stringsWidthLimit) yPos = yPos + 1 + else + break end end - end --------------------------------------------------------------------------------------------------------------- +local function drawScrollBar() + local name + name = "⬆"; newObj("Scroll", name, ecs.drawButton(xSize - 2, 1, 3, 3, name, config.colors.leftBarSelection, config.colors.leftBarSelectionText)) + name = "⬇"; newObj("Scroll", name, ecs.drawButton(xSize - 2, ySize - 2, 3, 3, name, config.colors.leftBarSelection, config.colors.leftBarSelectionText)) -getFileList() + ecs.srollBar(xSize - 2, 4, 3, ySize - 6, #stroki, currentString, config.colors.scrollbarBack, config.colors.scrollbarPipe) +end + +------------------------------------------------------------------------------------------------------------------ + +ecs.prepareToExit() drawLeftBar() +loadFile() drawMain() +drawScrollBar() + +while true do + local e = {event.pull()} + if e[1] == "touch" then + for key in pairs(obj["Files"]) do + if ecs.clickedAtArea(e[3], e[4], obj["Files"][key][1], obj["Files"][key][2], obj["Files"][key][3], obj["Files"][key][4]) then + currentFile = key + loadFile() + drawLeftBar() + drawMain() + drawScrollBar() + break + end + end + + for key in pairs(obj["Scroll"]) do + if ecs.clickedAtArea(e[3], e[4], obj["Scroll"][key][1], obj["Scroll"][key][2], obj["Scroll"][key][3], obj["Scroll"][key][4]) then + ecs.drawButton(obj["Scroll"][key][1], obj["Scroll"][key][2], 3, 3, key, config.colors.leftBarSelectionText, config.colors.leftBarSelection) + os.sleep(0.2) + ecs.drawButton(obj["Scroll"][key][1], obj["Scroll"][key][2], 3, 3, key, config.colors.leftBarSelection, config.colors.leftBarSelectionText) + + if key == "⬆" then + if currentString > scrollValue then + currentString = currentString - scrollValue + drawMain() + drawScrollBar() + end + else + if currentString < (#stroki - scrollValue + 1) then + currentString = currentString + scrollValue + drawMain() + drawScrollBar() + end + end + + break + end + end + end +end + + + + + + + + + diff --git a/Applications/InfoPanel/Rules.txt b/Applications/InfoPanel/Rules.txt new file mode 100644 index 00000000..a19ebf76 --- /dev/null +++ b/Applications/InfoPanel/Rules.txt @@ -0,0 +1,49 @@ + Правила + +На сервере существует лишь одно правило: §FF5555нет никаких правил§FFFFFF. + +Вам дозволяется абсолютно все: гриферство, читерство, мат в чате, +оскорбление админа и других игроков, ибо все это - неотъемлимая +часть нашего бытия. Вы можете быть культурным и святым человеком, +а можете крушить все направо-налево, строя члены и свастики из грязи. +Помните, что не существует плохих или хороших деяний, есть лишь +поступки и их закономерные последствия. Таким образом, если вы +загадите личную хату админа, то он отымеет вас по самые гланды, а если +будете неадекватным малым, то крайне велика вероятность, что вам +всадят нож в спину. + + Багоюз + +Любые баги - это вина администрации, безответственно отнесшейся к +исправлению ошибок плагинов и модов. Таким образом, если вы нашли +способ дюпа, способ использования недочетов сервера себе на благо, +крайне рекомендуется сообщить об этом админам - вы получите приятный +бонус за бдительность, а другие игроки получат честную игру. + + Флуд + +Если в чате творится полный бардак, и нежелательные личности флудят +или просто раздражают вас - используйте систему Серверной Поддержки +Игроков, чтобы навести порядок: команда "§FFAA00сервер замуть Cyka§FFFFFF" +откроет голосование за мут игрока под ником Cyka. + + Убийства + +Вас убил сильно развитый игрок? Ну что ж, печально. Чтобы избежать +подобных эксцессов, защищайте ваше жилище тщательнее, закрывайте +дыры в обороне, копайте больше ресурсов для создания орудия мести. + + Гриферство + +Чей-то робот своровал ваши солнечные панели и механизмы IC2? Какая +неприятность! Чтобы защититься от этого, грамотно приватьте зону +вашего дома, закрывайте все щели, ставьте двери, которые нельзя +открыть редстоуном. Если вы узнали имя вора, обратитесь к обладателям +мощной брони и оружия, чтобы восстановить справедливость. + + Заключение + +Причиной всему этому "беззаконию" послужило наличие слишком больших +ограничений на большинстве серверов, где складывается впечатление, +что админы - нежные телки с завышенным ЧСВ. Но долой такую чушь! +Добро пожаловать на §FFAA00Buttex§FFFFFF, где каждый сам себе хозяин! \ No newline at end of file diff --git a/lib/ECSAPI.lua b/lib/ECSAPI.lua index 449e3b20..cedffbe9 100644 --- a/lib/ECSAPI.lua +++ b/lib/ECSAPI.lua @@ -11,7 +11,7 @@ local libraries = { ["computer"] = "computer", ["serialization"] = "serialization", ["internet"] = "internet", - ["image"] = "image", + --["image"] = "image", } local components = { @@ -457,6 +457,35 @@ function ECSAPI.smartText(x, y, text) end end +--Аналог умного текста, но использующий HEX-цвета для кодировки +function ECSAPI.formattedText(x, y, text, limit) + --Ограничение длины строки + limit = limit or math.huge + --Стартовая позиция курсора для отрисовки + local xPos = x + --Создаем массив символов данной строки + local symbols = {} + for i = 1, unicode.len(text) do table.insert(symbols, unicode.sub(text, i, i)) end + --Перебираем все символы строки, пока не переберем все или не достигнем указанного лимита + local i = 1 + while i <= #symbols and i <= limit do + --Если находим символ параграфа, то + if symbols[i] == "§" then + --Меняем цвет текста на указанный + gpu.setForeground(tonumber("0x" .. symbols[i+1] .. symbols[i+2] .. symbols[i+3] .. symbols[i+4] .. symbols[i+5] .. symbols[i+6])) + --Увеличиваем лимит на 7, т.к. + limit = limit + 7 + --Сдвигаем итератор цикла на 7 + i = i + 7 + end + --Рисуем символ на нужной позиции + gpu.set(xPos, y, symbols[i]) + --Увеличиваем позицию курсора и итератор на 1 + xPos = xPos + 1 + i = i + 1 + end +end + --Инвертированный текст на основе цвета фона function ECSAPI.invertedText(x,y,symbol) local info = {gpu.get(x,y)} @@ -1525,6 +1554,7 @@ ECSAPI.OSIconsHeight = 6 --Вся необходимая информация для иконок local function OSIconsInit() + if not _G.image then _G.image = require("image") end if not _G.buffer then _G.buffer = require("doubleBuffering") end if not ECSAPI.OSIcons then --Константы для иконок