客户端专用 ui对象类 CUILuaUtil


使用说明

说明



///返回系统版本号
string version();

///获取本地IP
string getIP();

//获取界面的Intent值
bool getItent(CIntent& itUpdate, CIntent& itInsert, CIntent& itWhere);

///增加获取用户当前的车间、工厂权限
void getUserSubCompany(CSelectHelp& help);

unsigned int Q2W(unsigned int iColor);
string toHexColor(unsigned int iColor,bool bQT=false);


///获取车间权限
void getUserWorkShop(CSelectHelp& help);

///获取是否拥有指定的权限
bool hasRightByAlias(const string& sAlias);


///是否链接到采集服务
bool isEdgeServer();

///同步一张表文件,会清空数据
int syncTable(const string& sTable,const string& sFile);

///同步整个数据库到文件
int syncDatabase(const string& sFile);

///按SQL进行同步
int syncTableSQL(const string& sFile, const string& sDataSQL, const string& sTable, const string& pkid, const string& sCacheKey = "");

///按help进行同步数据
int syncTableHelp(const string& sFile, CSelectHelp& helpCenter, CSelectHelp& helpLocal, const string& sTable, const string& pkid);

///将客户端脚本运行在服务器端
int runServerScript(const string &script, CIntent& inIt,CIntent& outIt);

///转化图片
string pngToJpg(const string& sFile,const string& sDestPath="");

///转成16进制
string toHexColor(unsigned int iColor,bool bQT);

///getBusiUniqueID.SF 流水号,sys_cfg_seq.user_id 数字流水号, getStrID.seqname.TD.5.0.1 订单号类型 sSeqName,sPre,iSize,bFullDate=0代表20160212  1代表201602121234    2代表 201602   3代表2016   4代表 1602 5代表160212  9代表无时间 ,iNeedRestart=1
string getTypeID(string sType);
///获取指定的系统参数 po_type,help
int getSysPara(const string& sTypeID, CSelectHelp& help);

///获取系统的tip消息
void getTipMessage(CSelectHelp& help);

///用于方便系统执行SQL,idb_开头的为控件的值,其它为变量对应的值
string getParamString(const string& sSQL,CTNString& err,bool bDump=false);


///查找目录下的文件或者子目录列表 help字段名为 name,type  type=dir,file,other
int dirFiles(const string& sPath, CSelectHelp& help, const string& sFilter = "*.*");
///查找置顶路径下所有的路径
int dirDirs(const string& sPath, CSelectHelp& help);

///加载塔网外部的dll插件, 放在目录客户端plugin目录下, 假如插件文件为xxxx.dll, 用ui:import('xxxx');
bool import(const string& sLib);

///启用条码事件,使用function process_barcode(sCmd,sBarcode)函数接收
void enableUSBBarcode(bool bEnable);

///发送必须发送到中心的数据库操作
void addMustSendSQL(const string& sSQL, const string& sParam, const string& sOther = "");

///重新加载串口
void reInitCom();

///运行外部程序
int runProc(string sExe, CVector& v);

///获取UI权限
string getUIRight(const string& sCode);

void testFirst(const string& src);
///设置窗口关闭前调用的脚本函数
void setCloseScript(const string& sScript);

///毫秒级延时,不锁死界面
void sleep(int iMisecond);

///前一天仅限date控件,idx>0代表后,idx小于0代表前
void preDay(const string& cid,int idx=-1);

///设置文本的颜色
void setTextColor(const string& cid, unsigned int iColor);

///取消执行
void cancel(const string& sID);
void cancelAll();
///增加ICE远程访问功能
int select(const string& sIP,int iPort,const string &sql, const string &param, CSelectHelp &help,CTNString& err,const string& sID="");
bool execSQL(const string& sIP, int iPort, const string &sql, const string &param, CTNString& err,const string& sID="");
int commandStr(const string& sIP, int iPort, const string &cmd, const string &param, CTNString& str,const string& sID="");
int command(const string& sIP, int iPort, const string &cmd, const string &param, CIntent& it,const string& sID="");
int execCmdStr(const string& sIP, int iPort, const std::string &cmd, const std::string &sqlcode, const std::string &param, CTNString& ostr,const string& sID="");
int selectCmdStr(const string& sIP, int iPort, const std::string &cmd, const std::string &sqlcode, const std::string &param, CTNString& ostr,const string& sID="");

///用于专门与采集器连接
int dcCmd(const string &cmd, const string &param, CTNString& str);
int dcSelect(const string &sql, const string &param, CSelectHelp &help, CTNString& err);
bool dcExecSQL(const string &sql, const string &param, CTNString& err);

///重新加载站点IP
void reloadSite();

///检查输入控件是否输入了正确的值,如果cid为空则代表检查全部对话框中的
bool checkInput(const string& cid="");

///串口操作相关
int writeCom(string sName, string sV);
int writeComHex(string sName, string sV);
int clearBuffer(const string& sName);
int readCom(string sName, CTNString& sV,int iTimeout=2000);
int readComHex(string sName, CTNString& sV, int iTimeout=2000);

void setIntervalTimeout(const string& sName, int iIntervalTimeout);
int reOpen(const string& sName);

///启动gif动画
void startGif(const string& sCID);
///停止gif动画
void stopGif(const string& sCID);

///获取随机颜色
unsigned int getColor(int idx);

///设置一个额外的ID属性
bool setID(const string& cid, const string& v);

///获取一个额外的ID属性
string getID(string cid);

///转化为颜色
unsigned int s2Color(const string& sColor);

///检查LUA语法
string checkSyntax(const string& sLua);

///是否Linux系统
bool isLinux();
///执行系统命令, 有超时参数
string execCmdV2(const string& cmd, int waitTime = 5000, CVector arguments = CVector());
///取系统剪贴板数据   如果是图片前缀为pic=
string getClipboard();

///设置剪贴板数据
bool setClipboard(const string& sCont);

///播放一个音频文件, 路径为绝对路径
void playSound(const string& file);

///加载UI
bool loadUI(const string& sCode);
int  loadUIByParam(const string& sCode, CIntent& inIt,const string& sName="");

void getUi(CVector &value);

///返回cid控件类型
string controlType(const string& sCid);

///获取UI的字符串
string getUIString(const string& sUICode);

///获取UI的内容
bool getUIHelp(const string& sValue,CSelectHelp& helpObject,CIntent& it,bool bFull=false);

///获取Lua字符串
string getLuaString(const string& sUICode);

///废弃, 使用ui:getOpenFileName或者ui:getOpenFileNames获取单个和多个文件路径
string getOpenFile(const string& sCaption, const string& sDefaultDir, const string& sFilter);

///废弃, 使用ui:getSaveFileName
string getSaveFile(const string& sDefault);

///打开一个系统选择路径的窗口, 返回选择的路径
string getDir();

///获取控件操作类, sParentCID为空查找当前页面的控件
bool getWndUtil(const string& sParentCID, const string& sCID,LuaWndUtil& util);
///获取窗口操作类
bool getDialogUtil(LuaWndUtil& util);

///增加消息
string addMessage(const string& sModule,const string& sTitle, const string& sPic, const string& sContent);

///清空消息
void clearMessage();
///删除一条消息
bool removeMessage(const string& sMessageID);

///获取本地的站位编号
string siteID();

///获取设备编号
string eqptID();

///用于设置svg属性
void setSvgProp(const string& cid,const string& eid, const string& sProp, const string& sValue, bool bRedraw = true);

///演示当前登录用户是否有sRight这个权限
bool hasRight(string sRight);
///调用默认浏览器打开一个网页
void openURL(const string& sURL);

///修改加工数,请谨慎使用,仅用于调试,iMod为正代表+多少,为负代表-多少
int addData(const string& sEqptID,int iMod);

///返回控件的宽度, cid为空返回当前窗口的宽度
int width(const string& cid);
///返回控件的高度, cid为空返回当前窗口的宽度
int height(const string& cid);
///返回控件的x坐标, cid为空返回当前窗口的x坐标
int left(const string& cid);
///返回控件的y坐标, cid为空返回当前窗口的y坐标
int top(const string& cid);
///移动控件的位置, cid为空移动当前窗口的位置, bAnimation为是否开启动画
void move(const string& cid,int x,int y, bool bAnimation = false);
///设置控件大小, cid为空设置当前窗口的大小
void resize(const string& cid,int w,int h);
///隐藏控件
void hide(const string& cid);
///显示控件
void show(const string& cid);
///设置焦点到控件
void focus(const string& cid);
///启用控件
void enable(const string& cid);
///禁用控件
void disable(const string& cid);
///重新布局, 重新计算控件的大小位置
void rePos();
///启用或者禁用某个工具栏的按扭
void enableToolbar(const string& sToolbarCID, const string& sButtonCID, bool bEnable);
///在工具栏中插入一个按钮, 参数idx=-1为在最后追加
bool addToolbarButton(const string& sToolbarCID, const string& sButtonCID, const string& sText, const string& sImage = "", int iWidth = 50, const string& sRightID = "", int idx = -1);
///删除工具栏中的按钮
bool delToolbarButton(const string& sToolbarCID, const string& sButtonCID);

///获取系统屏幕分辨率width
int screenWidth();
///获取系统屏幕分辨率height
int screenHeight();

///对话框的宽度
int dialogWidth();

///对话框的高度
int dialogHeight();

///传递参数到其它窗口, 使用function process_command(sCmd,sParam)接收
void sendDialogCommand(const string& sDialogName,const string& sCmd, const string& sParam);

///查找Tab页的对话框,true代表存在
bool findDialog(const string& sDialogName);

///显示和隐藏对话框
bool showDialog(const string& sDialogName,bool bShow);

///设置出的CIntent, 窗口关闭会保存在itOut
void setIt(const string& k, const string& v);
///设置出的CIntent, 窗口关闭会保存在itOut
void setItHelp(const string& k, CSelectHelp& help);
///从itOut获取
string getIt(const string& k);
///从itOut获取
void getItHelp(const string& k, CSelectHelp& help);

///启动繁忙标示
void startBusyIndicator();
void stopBusyIndicator();

///获取本地sqlite(tn_app.db中的表site_sys_setting_l)保存的参数信息
string getSetting_l(string key);
///保存参数到本地sqlite(tn_app.db中的表site_sys_setting_l)
bool   setSetting_l(const string& key,const string& v);

///获取本地sqlite(tn_app.db中的表site_sys_setting, 客户端启动会从中心同步该表)保存的参数信息
string getSetting(string key);
///保存参数到本地sqlite(tn_app.db中的表site_sys_setting)和中心表site_sys_setting
bool   setSetting(string key,string v);
///获取全局参数, 比如当前用户的登录信息user_id,user_name,user_cn_name,svn_version
string getSysVar(string key);
///设置全局参数, 所有窗口可用
void setSysVar(const string& key, const string& v);
///获取全局help数据
void setSysHelpVar(const string& key, CSelectHelp& help);
///设置全局help数据
void getSysHelpVar(const string& key, CSelectHelp& help);
///从系统的缓存中查找指定的条件的值
int  lookupSysHelp(const string& key, const string& sField, const string& sValue, CSelectHelp& help,int iMaxCount=30);

///重新加载缓存
bool reloadCache(const string& key);

///显示所有传入的变量
void dumpAllVar();

///获取从ui:execDialog传进来的itIn的数据
string getDialogVar(string key);
///设置数据到当前窗口的全局it中
void setDialogVar(const string& sVar,const string& key);

///获取从ui:execDialog传进来的itIn中的help数据
void getDialogHelp(const string& sVar, CSelectHelp& help);
///设置help数据到当前窗口的全局it中
void setDialogHelp(const string& sVar, CSelectHelp& help);

///绑定CUILuaUtil对象到指定窗口, 可以操作其它窗口
void setDialogByName(const string& sName);
///从当前窗口的frame或map容器 绑定CUILuaUtil对象
bool setFrameByCID(const string& sDialogName, const string& sFrameCID);
///从当前窗口的frame或map容器中的容器(3级容器) 绑定CUILuaUtil对象
bool setFrameByDlgFrameCID(const string& sDialogName, const string& sParentFrameCID, const string& sFrameCID);
///返回当前窗口的名称
string getDialogName();

///返回当前窗口的编码
string getDialogCode();

///返回当前窗口的xui字符串
string getDialogUIString();

bool setSQLite(int iIndex);


void setDCProcessScript(const string& sScript);
void stopDC();

///用于外部调用内部脚本函数
bool callFunc(const string& sLuaScript);
///运行lua脚本字符串
bool runString(const string& sLuaScript);

///运行线程函数
bool isGUIThreadRunning();
///跟ui:run一样
bool runGUI(const string& sLuaScript, const string& sFinishLuaScript);
///注意: 在线程中不能操作控件, 所以在线程中使用ui:threadChangeValue调用主线程操作控件
void threadChangeValue(const string& sChangeScript);
void threadNormalChangeValue(const string& sChangeScript);

///启用线程运行sLuaScript函数, 线程结束运行sFinishLuaScript函数, 注意: 在线程中不能操作控件, 使用ui:threadChangeValue调用的函数操作控件
bool run(const string& sLuaScript, const string& sFinishLuaScript);

///启动定时器, 定时调用sScript函数, 例如ui:startTimer(3000, 'test_func()')
void startTimer(int iTimeout,string& sScript);
///停止定时器
void stopTimer();

///设置常规控件的值
bool set(const string& cid, const string& v);
///废弃, 使用setProp
bool setCommon(const string& cid, const string& cmd, CIntent& itIn);

///加载help到控件,可用于grid,custom_grid,tree,line_gauge控件
bool setHelp(const string& cid, CSelectHelp& help);
///设置控件的属性值
int setProp(const string& cid, const string& key, const string& v, bool bNeedSet = false);
///获取内部的属性
string getProp(const string& cid, const string& key);


///获取控件的常规值, 与ui:set对应
string get(string cid);
bool get(CIntent& iIn, CIntent& iOut);
///获取当前窗口指定类型的所有控件列表 type为空获取所有控件
int getControlsHelp(string &type, CSelectHelp& helpControls);

///显示一个提示对话框, iTimeOut为超时关闭
void msg(const string& sTitle, const string& sInfoText = "", int iTimeOut = 0, bool isErrorInfo = false);
///显示一个有确定取消按钮的提示对话框, iTimeOut为超时关闭
bool msgConfirm(const string& sTitle, const string& sInfoText = "", int iTimeOut = 0, bool isErrorInfo = false);
///提示对话框, sButtons为按钮名称  使用,号分割  如 确认,退出,取消  返回值固定为 YES NO CANCEL   如果有超时 默认选择最后一个
string confirm(const string& sButtons, const string& sTitle, const string& sInfoText = "", int iTimeOut = 0);
///显示一个tip提示框
void tip(const string& sTitle, const string& sInfoText = "", int iTimeOut = 3000, bool isErrorInfo = false);

///设置控件的气泡起始信息, 鼠标放上去后出现的提示信息
bool setToolTip(const string& cid, const string& sInfo);

///获取占用程序焦点的活跃窗口, 如果当前窗口活跃, 返回true
bool getActiveDialog(CTNString& sUIcode, CTNString& sDlgName);
///close真实关闭对话框, 跟ui:closeDialog()一样
void close(bool bAccept = true);
///关闭对话框
void closeDialog(bool bAccept = true);
///检测此脚本所有线程是否都停止运行  用于控制线程return, 注意:死循环线程一定要用该函数控制return
bool allThreadStop();

string getInput(string sTitle,string sDefault);
string getInputAsc(string sTitle,string sDefault);
string getInputNormal(string sTitle,string sDefault);

///设置窗口是否允许关闭, 一般在setCloseScript回调的函数中使用, 流程为关闭窗口->调用setCloseScript的函数->setClose(false)窗口不允许关闭
void setClose(bool bClose);
///打开一个阻塞模式的对话框, itIn系统参数, no_exec不阻塞打开, fixed_size=1固定窗口大小,win_no_title=1不显示标题栏, show_top=1置顶显示
int execDialog(const string& sUICode,const string& sInName, CIntent& iIn, CIntent& iOut);
///在页签中打开一个窗口
int openDialog(const string& sUICode, CIntent& iIn, CIntent& iOut, string sName = "");
int reOpenDialog(const string& sUICode, CIntent& iIn, CIntent& iOut, string sName = "");
int openDialogFile(const string& sFile, CIntent& iIn, CIntent& iOut,bool bPlugin=false);

///设置edit, mult_edit控件只读, 不能编辑
void setReadOnly(const string& cid, bool bReadOnly);

///web浏览器加载html字符串
void webSetHtml(const string& cid, const string& html, const string& baseUrl);
///发送参数到浏览器
void webSendValue(const string& cid, const string& key, const string& v1, const string& v2);

///activex控件专用
string dynamicCall(const string& cid, const string& sFunc, CVector& paramList);

///Combox/ListBox专用, 增加一行数据到控件
void addBoxString(const string& cid, const string& sID, const string& sValue, int row = -1);
///Combox/ListBox专用, 清空数据
void resetBox(const string& cid);
///Combox/ListBox专用, 加载help指定的两列id和name到控件
void setBoxHelp(const string cid,CSelectHelp& help,const string& sCID,const string& sName);
///废弃
void setSysBoxHelp(const string cid, const string& sHelpKey, const string& sCID, const string& sName);
///Combox/ListBox专用, 追加help数据到控件
void addBoxHelp(const string cid,CSelectHelp& help,const string& sCID,const string& sName);
///根据id选择下拉框
void selBoxByID(const string cid, const string& id);
///根据索引号选择下拉框
void selBoxByIdx(const string cid,int idx);
///根据name选择下拉框
void selBoxByName(const string cid, const string& id);
///获取下拉框当前选择的name
string getBoxSelName(string cid);

/// 获取行数或者数量,可用于[grid]、[combobox]、[listbox]、[custom_grid]控件
int getCount(string cid);

///Combox/ListBox专用, 不选中任何元素
void unselBox(const string cid);

/// 获取当前选择的数据,可用于[grid]、[listBox]、[tree]、[list_view]、[combobox]控件
int getSelected(string cid, CSelectHelp& help);

///引用某个文件(不需要.lua文件类型), 引用后可使用该文件的全局变量和全局函数
bool use(string sLuaFile);

//QTextEdit 移动至末尾
void move2End(const string& cid);

///两个表格关联拖动 true为水平拖动,false为垂直拖动
bool gridSetSyncDrag(const string& cidGrid1, const string& cidGrid2, bool bDirection);

///Line Wait
void lineWaitStart(const string& cid,int iTimeout);
void lineWaitStop(const string& cid);

///chart 相关函数, sCurveName为某条线的名称, 先createCurve创建一条线才能使用
void chartSetHelp(const string& cid, const string& sCurveName, CSelectHelp& help, const string& sXFiedld, const string& sYField);
///chart 相关函数, 增加一条线
void createCurve(const string& cid, const string& sCurveNname, const int& iCurveColor);
///chart 相关函数, 实时曲线用, 增加线的一个数据
void curveAddData(const string& cid, const string& sCurveName, const string& sX, double fY);

///返回10进制色值
unsigned int rgb(int r,int g,int b);

unsigned int getColorDialog(unsigned int iDefaultColor = 0, const string& sTitle = "");

///打开等待对话框, 必须在主线程使用
void openWaitingDialog(const string& sMsg);
///关闭等待对话框, 必须在主线程使用
void closeWaitingDialog();

///请使用专用类CLuaListViewUtil
bool listviewSetUICode(const string& cid,const string& sUICode);
bool listviewSetHelp(const string& cid,CSelectHelp& help);

///使用专用类CLuaTreeUtil操作
void treeSetHelp(const string& cid,  CSelectHelp& help, int bLoadType = 1);
void treeExpandAll(const string& cid);
int treeSelectedNodes(const string& cid, CSelectHelp& help);
int treeAllRootNodes(const string& cid, CSelectHelp& help);

///打开 获取文件路径对话框, 选择图片复制到user目录下 返回值为picture/user/xxx.xxx
string getPicPath();

///保存文件时选择保存位置对话框;title 对话框标题;defaultSaveFile 对话框打开时默认存放的文件路径,留空默认打开程序根目录,无文件名;fileType 限定文件类型,格式"xxx(sys_login.png;logo*.png;*.gif)xxx",可使用通配符,注意:括号内必须按格式,括号外任意字符串;返回值为保存文件的 绝对路径 无选择为空
string getSaveFileName(string title, string defaultSaveFile = "", string fileType = "");

///选择打开文件路径对话框;defaultOpenFile 对话框打开时默认打开的文件路径,留空默认打开程序根目录;返回值为选择打开的文件的 绝对路径  无选择为空
string getOpenFileName(string title, string defaultOpenFile = "", string fileType = "");
///与getOpenFileName功能一致, 可以选择多个文件
bool getOpenFileNames(string title, CVector& files, const string& defaultOpenFile = "", const string& fileType = "");//多选文件

///选择系统图片对话框, defaultOpenPath为picture目录的的文件夹 如user和user/eqpt  为空时默认打开picture目录 
string openPhotoView(string defaultOpenPath = "");

///* xuiFileName xui界面文件名,如[sys_printer_test].xui只需简括号内的文件名
///* helpCID两列  一列控件的cid  一列value
///* pdfName 远程打印时会生成pdf文件,参数为生成的文件名,留空为时间作为文件名
///* count 打印份数,小于1时使用本地设置的打印份数
bool printerXui(const string& xuiFileName, CSelectHelp& helpCID, const string& pdfName, int count = 0, int width = 210, int height = 297);
bool printerXuiV2(const string& xuiFileName, CSelectHelp& helpCID, const string& pdfName, int count = 0, int width = 210, int height = 297, int iRotation=0);
///获取打印机列表,WINDOWS下可用
int getPrinterList(CVector& line);
///条码打印机使用, xui模板文件转换成图片, 再把图片转换成ZPL 发送到指定打印机 完成打印
bool printerCmd(const string& xuiFileName, CSelectHelp& helpCID, const string& printerName, CIntent& itParam);

///鹰眼图  it的参数为:上方标题id  下方数字num  状态颜色color  是否闪烁flash  图片pic
bool mapviewSetIt(const string& mapviewCid, const string& childCid, CIntent& it);

///刷卡对话框 itOut三个参数card_num、user_id、right,rightId为空时itOut只有card_num和user_id
bool readId(const string& rightId, CIntent& itOut);
///读取卡内数据, help存放块地址和数据 有两列,一列块地址,一列块地址对应的数据
bool readCardValue(CIntent& itOut, const string& sCardPass, CSelectHelp& help);
///写入数据到IC卡, help存放块地址和数据 有两列,一列块地址,一列块地址对应的数据
bool writeCardValue(const string& sCardPass, CSelectHelp& help, CTNString& error);

///bType为true上传,false为下载,helpFileInfo最低必须有四列,前三列要求如下  第四列为是否成功
///上传模式:   服务器目录                   本地文件   需要更改的文件名
///下载模式:   服务器相对目录文件      本地目录   无用
void upAndDownFile(bool bType, CSelectHelp& helpFileInfo);

/// 增加右键菜单,配合setRightMenuCilckEvent事件方法使用,可用于以下控件
/// [grid] seat为增加的位置,0为表头,1为单元格,setRightMenuCilckEvent中有三个参数,菜单id和表格的行列号
/// [tree] seat-0为表头,1为单元格,setRightMenuCilckEvent中有两个参数,菜单id和右键选择的树节点id
/// [gantt] seat-0为表格表头, 1为表格单元格,    2为甘特图表头   3为甘特图单元格   4为甘特图task
/// id 为空 增加分割线
void addRightMenu(const string& cid, const string& id, const string& ico, const string& menuName, int seat = 0);
bool setRightMenuEnable(const string& cid, const string& id, int seat, bool enable);

///脚本事件响应, sLuaFuncName函数名不要()
void setClickListViewEvent(const string& cid, const string& sLuaFuncName);
void setClickEvent(const string& cid, const string& sLuaFuncName, CUILuaUtil* pRunUI = NULL);
///双击事件
void setDoubleClickEvent(const string& cid, const string& sLuaFuncName, CUILuaUtil* pRunUI = NULL);
void setSelChangeEvent(const string& cid, const string& sLuaFuncName, CUILuaUtil* pRunUI = NULL);
///表格点击行改变事件
void setGridRowSelChangeEvent(const string& cid, const string& sLuaFuncName, CUILuaUtil* pRunUI = NULL);
void setGridCellValueChangeEvent(const string& cid, const string& sLuaFuncName);
void setPadPressedEvent(const string& sLuaFuncName);
void setBarCodeGunEvent(const string& sLuaFuncName);
///右键菜单事件
void setRightMenuCilckEvent(const string& cid, const string& sLuaFuncName, CUILuaUtil* pRunUI = NULL);
///值改变事件, edit可用
void setValueChangeEvent(const string& cid, const string& sLuaFuncName, CUILuaUtil* pRunUI = NULL);
Copyright © TouchNet 2015 all right reserved,powered by Gitbook最后修订时间: 2022-06-21 09:21:04

results matching ""

    No results matching ""