mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2024-12-29 02:57:35 +02:00
Улучшение шаблона ВК
This commit is contained in:
parent
3f63a8aeb1
commit
f2bcde2124
70
src/addins/tmpl/src/component/mod.rs
Normal file
70
src/addins/tmpl/src/component/mod.rs
Normal file
@ -0,0 +1,70 @@
|
||||
mod methods;
|
||||
|
||||
use addin1c::{name, Variant};
|
||||
|
||||
|
||||
// МЕТОДЫ КОМПОНЕНТЫ -------------------------------------------------------------------------------
|
||||
|
||||
// Синонимы
|
||||
pub const METHODS: &[&[u16]] = &[
|
||||
name!("Метод1") // 0
|
||||
];
|
||||
|
||||
// Число параметров функций компоненты
|
||||
pub fn get_params_amount(num: usize) -> usize {
|
||||
match num {
|
||||
0 => 1,
|
||||
_ => 0,
|
||||
}
|
||||
}
|
||||
|
||||
// Соответствие функций Rust функциям компоненты
|
||||
// Вызовы должны быть обернуты в Box::new
|
||||
pub fn cal_func(obj: &AddIn, num: usize, params: &mut [Variant]) -> Box<dyn crate::core::getset::ValueType> {
|
||||
|
||||
match num {
|
||||
0 => Box::new(methods::send_message(&obj, ¶ms)),
|
||||
_ => Box::new(false),
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
|
||||
// ПОЛЯ КОМПОНЕНТЫ ---------------------------------------------------------------------------------
|
||||
|
||||
// Синонимы
|
||||
pub const PROPS: &[&[u16]] = &[
|
||||
name!("Свойство1"),
|
||||
name!("Свойство2")
|
||||
];
|
||||
|
||||
// Имена и типы
|
||||
pub struct AddIn {
|
||||
field1: String,
|
||||
field2: i32
|
||||
}
|
||||
|
||||
// Конструктор
|
||||
impl AddIn {
|
||||
|
||||
// Значения по умолчанию
|
||||
pub fn new() -> AddIn {
|
||||
AddIn {
|
||||
field1: String::from(""),
|
||||
field2: 0
|
||||
}
|
||||
}
|
||||
|
||||
// Сюда просто нужно еще раз добавить имена полей
|
||||
pub fn get_field_ptr<T>(&self, index: usize) -> *const T {
|
||||
match index {
|
||||
0 => &self.field1 as *const _,
|
||||
1 => &self.field2 as *const _,
|
||||
_ => panic!("Index out of bounds"),
|
||||
}
|
||||
}
|
||||
pub fn get_field_ptr_mut<T>(&mut self, index: usize) -> *mut T { self.get_field_ptr(index) as *mut _ }
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
@ -1,86 +1,14 @@
|
||||
mod getset;
|
||||
mod methods;
|
||||
pub mod getset;
|
||||
|
||||
use addin1c::{name, ParamValue, RawAddin, Variant};
|
||||
use std::ops::{Index, IndexMut};
|
||||
|
||||
// МЕТОДЫ КОМПОНЕНТЫ -------------------------------------------------------------------------------
|
||||
use crate::component::METHODS;
|
||||
use crate::component::PROPS;
|
||||
use crate::component::get_params_amount;
|
||||
use crate::component::cal_func;
|
||||
use crate::component::AddIn;
|
||||
|
||||
// Русские синонимы
|
||||
const METHODS: &[&[u16]] = &[
|
||||
name!("Метод1")
|
||||
];
|
||||
|
||||
// Число параметров по индексу
|
||||
fn get_params_amount(num: usize) -> usize {
|
||||
match num {
|
||||
0 => 1,
|
||||
_ => 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn cal_func(obj: &AddIn, num: usize, params: &mut [Variant]) -> Box<dyn getset::ValueType> {
|
||||
|
||||
match num {
|
||||
0 => Box::new(methods::send_message(&obj, ¶ms)),
|
||||
_ => Box::new(false),
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
|
||||
// ПОЛЯ КОМПОНЕНТЫ ---------------------------------------------------------------------------------
|
||||
|
||||
// Русские синонимы
|
||||
const PROPS: &[&[u16]] = &[
|
||||
name!("Свойство1"),
|
||||
name!("Свойство2")
|
||||
];
|
||||
|
||||
// Имена и типы
|
||||
pub struct AddIn {
|
||||
field1: String,
|
||||
field2: i32
|
||||
}
|
||||
|
||||
// Значения по умолчанию
|
||||
impl AddIn {
|
||||
pub fn new() -> AddIn {
|
||||
AddIn {
|
||||
field1: String::from(""),
|
||||
field2: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Индекс
|
||||
impl Index<usize> for AddIn {
|
||||
type Output = dyn getset::ValueType;
|
||||
|
||||
fn index(&self, index: usize) -> &Self::Output {
|
||||
match index {
|
||||
0 => &self.field1, // Возвращаем ссылку на field1
|
||||
1 => &self.field2, // Возвращаем ссылку на field2
|
||||
_ => panic!("Index out of bounds"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexMut<usize> for AddIn {
|
||||
|
||||
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
|
||||
match index {
|
||||
0 => &mut self.field1, // Возвращаем изменяемую ссылку на field1
|
||||
1 => &mut self.field2, // Возвращаем изменяемую ссылку на field2
|
||||
_ => panic!("Index out of bounds"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
|
||||
// ТО, ЧТО ТРОГАТЬ НЕ НУЖНО ------------------------------------------------------------------------
|
||||
|
||||
// Обработка удаления объекта
|
||||
impl Drop for AddIn {
|
||||
@ -115,4 +43,18 @@ impl RawAddin for AddIn {
|
||||
|
||||
}
|
||||
|
||||
impl std::ops::Index<usize> for AddIn {
|
||||
type Output = dyn getset::ValueType;
|
||||
|
||||
fn index(&self, index: usize) -> &Self::Output {
|
||||
unsafe { &*self.get_field_ptr(index) }
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::IndexMut<usize> for AddIn {
|
||||
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
|
||||
unsafe { &mut *self.get_field_ptr_mut(index) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
pub mod component;
|
||||
mod core;
|
||||
|
||||
|
||||
use std::{
|
||||
ffi::{c_int, c_long, c_void},
|
||||
sync::atomic::{AtomicI32, Ordering},
|
||||
|
@ -1,3 +1,4 @@
|
||||
Manifest-Version: 1.0
|
||||
Runtime-Version: 8.3.15
|
||||
Base-Project: OpenIntegrations_ENG
|
||||
Base-Project: OpenIntegrationsENG
|
||||
Manifest-Version: 1.0
|
||||
|
Loading…
Reference in New Issue
Block a user