Перейти к контенту

Сборочный цех


Zander_driver

Рекомендуемые сообщения

Внесу и свои три копейки)

Небольшой GUI-класс для имитации поддержки вводв с русской раскладки клавиатуры в CUIEditBox:

--[[-----------------------------------------------------------------------------------------------------
	File              : rus_edit_box.script
	Description       : Эмуляция русской раскладки клавиатуры в CUIEditBox (ТЧ)
	Created           : 13.11.2014
	Copyright         : naxac
---------------------------------------------------------------------------------------------------------
Обязательные передаваемые параметры:
 		x, y - координаты верхнего левого угла относительно элемента окна, к которому приаттачивам бокс
		width - ширина окна (высота фиксированная, 25), рекомендуется хотя бы >=100
		stat - элемент базового класса, к которому приаттачиваем бокс
type - необязательный параметр: текстура бокса (см. таблицу box_textures). По умолчанию - ui_linetext_e

Методы:	GetText() - получить введённый текст,
		SetText(string) - поместить в поле текст
		SetTextColor(number,number,number,number) - задать цвет текста (A,R,G,

Пример использования:
	self.edit_box = rus_edit_box.NewEditBox(self.form, 10, 45, 200, "pda")	-- приаттачиваем бокс к базовому классу
Обязательно добавляем в каллбэк на нажатие клавиш базового класса (OnKeyboard):
	self.edit_box:KeyboardCallback(dik)
--]]-----------------------------------------------------------------------------------------------------
local string_sub = string.sub

local eng = [[qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?!@#$%^&*()-_+=\| 0123456789]]
local rus = [[йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,!"№;%:?*()-_+=\/ 0123456789]]
local translit_tbl = {}
for pos = 1, #rus do
	translit_tbl[string_sub(eng, pos, pos)] = string_sub(rus, pos, pos)
end

function translit(s)
	return translit_tbl[s] or s
end

function string.split(str,k)
	local _f, _s = string.match(str, "([^"..k.."]*)"..k.."([^"..k.."]*)")
	return (_f or ""), (_s or "")
end
----------------------------------------------------------------------------------------

class "NewEditBox" (CUIScriptWnd)

local kr = "_"	-- курсор
local box_textures = {
	def		= "ui_linetext_e",
	pda		= "ui_icons_PDA_dialog_string"
	}

function NewEditBox:__init(stat, x, y, width, type) super()
	self.text = kr
	self.lang = "RUS"
	
	local texture = box_textures["def"]
	if type and box_textures[type] then
		texture = box_textures[type]
	end
	
	self.st = CUIStatic()
	self.st:Init(x, y, width, 25)
	
	stat:AttachChild(self.st)
	
	self.edit_box = CUIEditBox()
	self.edit_box:SetAutoDelete(true)
    self.edit_box:Init(0,2,width-39,22)
	self.edit_box:InitTexture(texture)
	self.edit_box:SetTextColor(GetARGB(0,0,0,0))
	self.edit_box:SetFont(GetFontLetterica18Russian())
    self.st:AttachChild(self.edit_box)
	
	self.text_stat = CUIStatic()
	self.text_stat:SetAutoDelete(true)
    self.text_stat:Init(2,4,width-42,22)
	self.text_stat:SetText(self.text)
	self.text_stat:SetTextColor(255,180,255,140)
	self.text_stat:SetFont(GetFontLetterica18Russian())
    self.st:AttachChild(self.text_stat)
	
	self.btn_lang = CUI3tButton()
	self.btn_lang:Init(width-37,0,37,25)
	self.btn_lang:SetAutoDelete(true)
	self.btn_lang:InitTexture("ui_hud_button_voting_01")
	self.btn_lang:SetText(self.lang)
	self.btn_lang:SetTextAlign(CGameFont.alCenter)
	self.btn_lang:SetTextY(1)
	self.btn_lang:SetTextColor(255,216,186,140)
	self.st:AttachChild(self.btn_lang)
	self:Register(self.btn_lang, "btn_lang")
	self:AddCallback("btn_lang", ui_events.BUTTON_CLICKED, self.on_ButtonChangeLang_clicked, self)
end

function NewEditBox:on_ButtonChangeLang_clicked()
	self.lang = (self.lang == "RUS" and "ENG") or "RUS"
	self.btn_lang:SetText(self.lang)
end

function NewEditBox:GetText()
	return string.gsub(self.text, kr, "")
end

function NewEditBox:SetText(text)
	self.text = text..kr
	self.text_stat:SetText(self.text)
end

function NewEditBox:SetTextColor(a,r,g,
	self.text_stat:SetTextColor(a,r,g,
end


function NewEditBox:ChangeText(letter)
	if letter == kr then return end
	local lett = letter and (self.lang=="RUS" and translit(letter) or letter) or ""
	
	local s1, s2 = string.split(self.text,kr)
	self.text = s1..lett..kr..s2
	
	self.text_stat:SetText(self.text)
end

function NewEditBox:DeleteLetter(mode)
	local s1, s2 = string.split(self.text,kr)
	if mode then
		s1 = #s1>1 and string_sub(s1,1,-2) or ""
	else
		s2 = #s2>1 and string_sub(s2,2) or ""
	end
	self.text = s1..kr..s2
	
	self.text_stat:SetText(self.text)
end

function NewEditBox:CursorMove(mode)
	local s1, s2 = string.split(self.text,kr)
	local str1, str2 = "", ""
	if mode then
		str1 = s1..(#s2>0 and string_sub(s2,1,1) or "")
		str2 = #s2>1 and string_sub(s2,2) or ""
	else
		str1 = #s1>1 and string_sub(s1,1,-2) or ""
		str2 = (#s1>0 and string_sub(s1,-1) or "")..s2
	end
	self.text = str1..kr..str2
	
	self.text_stat:SetText(self.text)
end

function NewEditBox:KeyboardCallback(dik)
	if dik == DIK_keys.DIK_BACK then self:DeleteLetter(true)
	elseif dik == DIK_keys.DIK_DELETE then self:DeleteLetter(false)
	elseif dik == DIK_keys.DIK_LEFT then self:CursorMove(false)
	elseif dik == DIK_keys.DIK_RIGHT then self:CursorMove(true)
	elseif dik == DIK_keys.DIK_LMENU or dik == DIK_keys.DIK_RMENU then self:on_ButtonChangeLang_clicked()
	else
		local letter = string_sub(self.edit_box:GetText(),-1)
		if letter and letter~="" then
			self:ChangeText(letter)
			self.edit_box:SetText("")
		end
	end
end

 



Функция string.lower с поддержкой кириллицы

-- 'string.lower' с поддержкой кириллицы.
local low = [[qwertyuiopasdfghjklzxcvbnmйцукенгшщзхъфывапролджэячсмитьбюё]]
local high = [[QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ]]
function string.lower1 (str)
	local ret = ""
	local f
	for s in string.gmatch(str, ".") do
		f = string.find(high, s, 1, true)
		ret = ret..(f and string.sub(low,f,f) or s)
	end
	return ret
endend

Добавить куда-нибудь в _g.script

 

Изменено пользователем Murarius
  • Спасибо 2

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, я даже не помню, что за версия.. В конфиге написано "last edit: 27.09.2013".

Да, про table.size забыл совсем - у меня xrLua Extensions от RvP стоит, это оттуда.

 

 

Если нужно, могу скинуть диф с изменениями.

Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, модуль m_netpk, который я выкладывал, с теми же правками чтения/записи (кроме матрицы вместо векторов) используется в моде ОП-2.1. Его как раз правили, основываясь на движке, для того, чтобы нетпакет правильно читался. Бетатест идет уже давно, до сих пор никаких глюков с этим модулем обнаружено не было. Кроме того, что уже написал dsh.

Вот это

исправлен разбор num_items и чтение некоторых параметров update-части пакета объектов, наследованных от cse_alife_inventory_item;

исправлено чтение update-части в net_cse_alife_item_weapon_magazined_w_gl

точно нужно добавить в подборку. Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Поделиться этим сообщением


Ссылка на сообщение

Та ошибка, на которую наступил я, существовала очень давно и "никаких глюков" тоже не было.

Эту ошибку исправили чуть ли не первым делом, когда начали использовать этот модуль. Просто я за основу брал старое, и этот момент пропустил. А про остальное - в новом движке сейчас стоит проверка, которая крашит игру при попытке чтения за границы нет-пакета. До указанных в предыдущем посте правок ошибки чтения были, после них - нет.

Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Поделиться этим сообщением


Ссылка на сообщение

@Graff46,

[logic]\nactive = remark\n[remark]\nanim = guard\nmeet = default_meet

 

{
  ["logic"] = {
    ["active"] = "remark"
  },
  ["remark"] = {
    ["anim"] = "guard",
    ["meet"] = "default_meet"
  }
}

 

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...