//字体图标 import fsys; import fonts; import fonts.fontAwesome; import ide; import win.ui.atom; import win.ui.shadow; import win.ui; /*DSG{{*/ var winform = win.form(text="aardio 图标字体浏览器";right=994;bottom=611;bgcolor=0xFFFFFF) winform.add( btnAdd={cls="button";text="添加图标字体";left=605;top=0;right=707;bottom=25;dr=1;dt=1;z=13}; cbFonts={cls="combobox";left=77;top=2;right=206;bottom=28;dl=1;dt=1;edge=1;items={};mode="dropdownlist";z=10}; chkTopmost={cls="checkbox";text="此窗口保持置顶";left=774;top=584;right=902;bottom=605;bgcolor=0xFFFFFF;db=1;dr=1;z=9}; cmbCssClass={cls="combobox";left=840;top=75;right=981;bottom=98;dr=1;dt=1;edge=1;items={};mode="dropdown";z=15}; custom={cls="custom";text="custom";left=1;top=30;right=765;bottom=612;bgcolor=0xF0FBFF;db=1;dl=1;dr=1;dt=1;z=3}; editFontPath={cls="edit";left=213;top=2;right=604;bottom=26;align="right";dl=1;dr=1;dt=1;edge=1;z=12}; editNcr={cls="edit";left=840;top=48;right=981;bottom=71;dr=1;dt=1;edge=1;z=18}; editText={cls="edit";left=840;top=21;right=981;bottom=44;dr=1;dt=1;edge=1;z=5}; groupbox={cls="groupbox";text="在线图标工具";left=773;top=498;right=981;bottom=575;bgcolor=0xFFFFFF;db=1;dr=1;edge=1;z=2}; groupbox2={cls="groupbox";text="添加图标字体步骤";left=773;top=248;right=981;bottom=493;bgcolor=0xFFFFFF;db=1;dr=1;edge=1;z=17}; lbCssClass={cls="static";text="CSS类名:";left=770;top=75;right=831;bottom=98;align="right";dr=1;dt=1;transparent=1;z=4}; lbEscape={cls="static";text="转义字符:";left=770;top=24;right=831;bottom=47;align="right";dr=1;dt=1;transparent=1;z=6}; lbPlusSet={cls="static";text="点上方按钮 / 修改选定控件图标";left=781;top=219;right=977;bottom=238;color=0x344BC7;dr=1;dt=1;transparent=1;z=8}; lbTip={cls="static";left=782;top=268;right=974;bottom=484;bgcolor=0xFFFFFF;db=1;dr=1;z=1}; lnkFontello={cls="plus";text="fontello.com";left=789;top=517;right=892;bottom=541;align="left";color=0x800000;db=1;dr=1;font=LOGFONT(charset=0;h=-13);notify=1;textPadding={left=5};z=14}; lnkIconfont={cls="plus";text="iconfont.cn";left=789;top=546;right=892;bottom=570;align="left";color=0x800000;db=1;dr=1;font=LOGFONT(charset=0;h=-13);notify=1;textPadding={left=5};z=16}; plusSet={cls="plus";text='\uF0AD';left=827;top=118;right=920;bottom=202;bgcolor=0xFFFFFF;color=0x0000FF;dr=1;dt=1;font=LOGFONT(h=-64;name='FontAwesome');notify=1;z=7}; static={cls="static";text="选择字体:";left=12;top=5;right=71;bottom=24;align="right";dl=1;dt=1;transparent=1;z=11}; static2={cls="static";text="NCR:";left=770;top=50;right=831;bottom=73;align="right";dr=1;dt=1;transparent=1;z=19} ) /*}}*/ var atom,hwnd = winform.atom("0CCD6A28-2296-4C26-9AC7-80AC4B585E27.FONTAWESOME"); if(!atom){ win.setForeground(hwnd); win.quitMessage(); return; } var fontResFiles = {} //加载标准库图标字体 var fontResPath = io.fullpath("~\lib\fonts\.res") fsys.enum( fontResPath, "*.*", function(dir,filename,fullpath){ if(filename) { var family = fonts.addFamily(fullpath); if(family){ var fontName = family.getName(); if(fontName){ fontResFiles[fontName] = "~\lib\fonts\.res" + fsys.path.relative(fullpath,fontResPath,true) } } } } ); //查找在标准库中已注册的字体 var fontFamilyNames = fonts.getFamilyNames(); import fsys; var stdFontLibs = {} for i,fileName in table.eachIndex( fsys.list("~/lib/fonts","\a\w+\.aardio") ){ var libName = ..string.replace(fileName,"\.aardio$",""); if(libName=="http") continue; for(i,fontName in fontFamilyNames){ var fontName2 = string.replace(fontName,"\s+",""); if(string.cmp(fontName2,libName)==0){ stdFontLibs[fontName] = libName; continue; } } } //加载工程用户库下的图标字体 var projectDir = ide.getProjectDir(); if(#projectDir){ var fontResPath = io.joinpath(projectDir,"\lib\fonts\.res"); if(io.exist(fontResPath) ){ fsys.enum( fontResPath, "*.*", function(dir,filename,fullpath){ var family = fonts.addFamily(fullpath); if(family){ var fontName = family.getName(); if(fontName){ fontResFiles[fontName] = "\lib\fonts\.res" + fsys.path.relative(fullpath,fontResPath,true) } } } ); } //查找在用户库中已注册的字体 var fontLibPath = io.joinpath(projectDir,"\lib\fonts"); if(..io.exist(fontLibPath)){ fontFamilyNames = fonts.getFamilyNames(); for i,fileName in table.eachIndex( fsys.list(fontLibPath,"\a\w+\.aardio") ){ var libName = ..string.replace(fileName,"\.aardio$",""); for(i,fontName in fontFamilyNames){ var fontName2 = string.replace(fontName,"\s+",""); if(string.cmp(fontName2,libName)==0){ stdFontLibs[fontName] = libName; continue; } } } } } /* var cssFontAwesome = string.search({} ,$"~\lib\web\layout\fontAwesome\.res\fontAwesome.css" ,"\.fa-glass.+",`\.(fa\-[\w\-]+)\s*\{\s*content\:\s*"(.+?)"`) cssFontAwesome = table.map(cssFontAwesome,function(v,k,result){ v[2] = string.replace( string.escape( v[2],true,true ),"\\u5","\\uF"); result[..string.unescape(v[2])] = ..string.match(v[1],"fa-(.+)") }) var str = table.tostring(cssFontAwesome,true); string.save("E:\Project\aardio10\ide\tools\2) 界面\.res\fontAwesome.css.map", str) */ var cssFontAwesome = eval($"\.res\fontAwesome.css.map") import fonts; import inet.http; var userFontLibs = {}; var addUserFont = function(path){ var family; if(..string.startsWith(path,"//")){ path = "http:" + path; } if(..string.startsWith(path,"http") || ..string.startsWith(path,"//")){ var http = inet.http(); var data = http.get(path); if(#data){ var fontCollection = gdip.privateFontCollection(); fontCollection.add(data); var families = fontCollection.getFamilies(,false) var fontName; if(families[[1]])fontName = families[[1]].getName(); fontCollection.delete(); if(#fontName){ string.save("/.res/http-ttf/"+fontName + ".ttf",data); family = fonts.addFamily("/.res/http-ttf/"+fontName + ".ttf"); } } } elseif( !..io.exist(path) ){ winform.msgboxErr("请输入有效的图标文件路径!"); winform.editFontPath.setFocus(0,-1); return; } else { family = fonts.addFamily(path) } if(family){ var fontName = family.getName() if( ! winform.cbFonts.findEx(fontName) ) winform.cbFonts.add(fontName); showFonts(fontName); if(!..string.startsWith(path,"http",true) ){ ide.loadPrivateFont(path); } userFontLibs[fontName] = path; } } winform.onDropFiles = function(files){ winform.editFontPath.text = files[1] } import fsys.dlg; winform.btnAdd.oncommand = function(id,event){ var path = winform.editFontPath.text; if(#path){ path = string.trim(path); path = string.trim(path,`'"`); } if(!#path){ path = fsys.dlg.open("*.ttf|*.ttf||","请选择图标字体文件"); if(!#path) return; winform.editFontPath.text = path; } addUserFont(path) } import web.form; var wb = web.form(winform.custom); import string.xml; unescape2 = function(s){ s = string.xml.ncr(s); var hex = ..string.match(s,"\x\x\x\x+"); if(hex) return ..string.unescape( ..string.format("\U%06x",tonumber(hex,16) ) ); return s; } winform.editText.onChange = function(){ s = unescape2(winform.editText.text); winform.plusSet.text = s; winform.editNcr.text = #s ? (""+..string.format("%X",string.charCodeAt(s))+";") : ""; } wb.external={ click = function(chr){ winform.plusSet.text = ustring.fromCharCode(chr); winform.editNcr.text = (""+..string.format("%X",chr)+";") winform.editText.text = string.escape(winform.plusSet.text,true,true); if(winform.currentIconFontName=="FontAwesome"){ var f = ..string.unescape(winform.editText.text) var css = cssFontAwesome[f]; winform.cmbCssClass.text = css : ""; } } mouseover = function(chr){ var str = ustring.fromCharCode(chr); winform.text ="aardio 图标字体浏览器 - " + string.escape(str,true,true) } explorer = function(path){ import process; process.explore(path) } } winform.cbFonts.items = fontFamilyNames; winform.cbFonts.oncommand = function(id,event){ if(event==1/*_CBN_SELCHANGE*/){ showFonts(winform.cbFonts.selText); } } var htmlTemplate = /**
for(i=1;#owner.fontUnicodeChars/2;1){ ?> =owner.fontUnicodeChars[i]?>; } ?> **/ import string.fontRanges; showFonts = function(fontName){ winform.cbFonts.selText = fontName; winform.currentIconFontName = fontName; if(stdFontLibs[fontName]){ var fontUnicodeChars; fontUnicodeChars = string.fontRanges.getUnicodeString(fontName,0xE000,0xF8FF ); wb.loadcode(htmlTemplate,{fontUnicodeChars=fontUnicodeChars;fontName=fontName}); } else { var fontUnicodeChars = string.fontRanges.getUnicodeString(fontName); wb.loadcode(htmlTemplate,{fontUnicodeChars=fontUnicodeChars;fontName=fontName}); } if(fontName=="FontAwesome"){ winform.lbCssClass.hide = false; winform.cmbCssClass.hide = false; } else { winform.lbCssClass.hide = true; winform.cmbCssClass.hide = true; } winform.plusSet.setFont(h=-64;name=fontName); } showFonts("FontAwesome"); winform.plusSet.skin( color = { hover = 0xFF80E000; active = 0xFF50A000; } ) if(winform.parent){ winform.lbPlusSet.text = "点击下方按钮修改选定输入框的图标" } import ide; winform.plusSet.oncommand = function(id,event){ if(winform.parent && winform.onSetIcon){ var strImport; if(stdFontLibs[winform.currentIconFontName ]){ strImport = 'import fonts.'+stdFontLibs[winform.currentIconFontName ] + ';\r\n'; } elseif(userFontLibs[winform.currentIconFontName]){ if(string.startsWith(userFontLibs[winform.currentIconFontName],"http",true)){ strImport = 'import fonts.httpFamily\r\nfonts.httpFamily("'+userFontLibs[winform.currentIconFontName] + '");\r\n' } else { strImport = 'import fonts\r\nfonts.addFamily("'+userFontLibs[winform.currentIconFontName] + '");\r\n' } } winform.onSetIcon( winform.plusSet.text,winform.plusSet.getFont(),strImport ); return; } if(!#owner.text){ winform.msgboxErr("请选择图标字体"); return; } var formName = ide.getActiveForm(); if(!formName){ winform.msgboxErr("请在aardio中打开并切换到窗体设计器"); return; } var ctrlName = ide.getSelectedControl(); if(!ctrlName){ winform.msgboxErr("当前窗体设计器中未选定plus控件"); return; } var ctrlParam = ide.getControlParam(ctrlName); if(!ctrlParam){ winform.msgboxErr("获取选定控件设置失败"); return; } if(ctrlParam.iconStyle){ ctrlParam.iconText = winform.plusSet.text; if(ctrlParam.iconStyle.font){ if(ctrlParam.iconStyle.font["name"] != winform.currentIconFontName ){ ctrlParam.iconStyle.font["name"] = winform.currentIconFontName; } } } else{ if(!#ctrlParam.text){ ctrlParam.text = winform.plusSet.text; if(ctrlParam.font["name"] != winform.currentIconFontName ){ ctrlParam.font["name"] = winform.currentIconFontName; ctrlParam.font["h"] = -18; } } else { ctrlParam.font["name"] = winform.currentIconFontName; var text = string.toUtf16(ctrlParam.text) if( text[1] >= 0xE000 && text[1] <= 0xF8FF ){ ctrlParam.text = winform.plusSet.text ++ string.right(ctrlParam.text,-2,true) } elseif( text[#text/2] >= 0xE000 && text[#text/2] <= 0xF8FF ){ ctrlParam.text = string.left(ctrlParam.text,-2,true) ++ winform.plusSet.text; } else { if( #winform.plusSet.text <= 2 ) { ctrlParam.text = winform.plusSet.text; } else { ctrlParam.text = winform.plusSet.text + " " + ctrlParam.text ; } } } } if(!ide.setControlParam(ctrlName,ctrlParam)){ winform.msgboxErr("更新窗体设计器中选定控件参数失败"); return; } var frmCode = ide.getActiveCode(); if(frmCode){ if(stdFontLibs[winform.currentIconFontName ]){ if(!string.find(frmCode,"@fonts."+stdFontLibs[winform.currentIconFontName ] )){ frmCode = 'import fonts.'+stdFontLibs[winform.currentIconFontName ] + ';\r\n'+ frmCode ; ide.setActiveCode(frmCode); ide.setSelectedControl(ctrlName); } } elseif(userFontLibs[winform.currentIconFontName]){ if(!string.find(frmCode,"@"+userFontLibs[winform.currentIconFontName])){ if(string.startsWith(userFontLibs[winform.currentIconFontName],"http",true)){ frmCode = 'fonts.httpFamily("'+userFontLibs[winform.currentIconFontName] + '");\r\n'+ frmCode; if(!string.find(frmCode,"import\s*fonts.httpFamily")) frmCode = 'import fonts.httpFamily;\r\n'+ frmCode ; } else { frmCode = 'fonts.addFamily($"'+userFontLibs[winform.currentIconFontName] + '");\r\n'+ frmCode; if(!string.find(frmCode,"import\s*fonts")) frmCode = 'import fonts;\r\n'+ frmCode } ; ide.setActiveCode(frmCode); ide.setSelectedControl(ctrlName); } } } } winform.chkTopmost.oncommand = function(id,event){ win.setTopmost(winform.hwnd,owner.checked) } import process; winform.lnkFontello.skin({ color={ active=0xFF00FF00; default=0xFF000080; disabled=0xFF6D6D6D; hover=0xFFFF0000 } }) winform.lnkFontello.oncommand = function(id,event){ process.openUrl("https://fontello.com") } winform.lnkIconfont.skin({ color={ active=0xFF00FF00; default=0xFF000080; disabled=0xFF6D6D6D; hover=0xFFFF0000 } }) winform.lnkIconfont.oncommand = function(id,event){ process.openUrl("http://iconfont.cn/collections/index?type=4") } winform.lbTip.text =/* 1、复制*.ttf 格式字体文件。 2、在 aardio 标准库管理器 "fonts/" 目录右键菜单上点“粘贴文件...”。 3、退出并重新打开“aardio工具->图标字体”就可以了。 程序必须引用在 fonts 命名空间下自动生成的字体库文件(发布后的程序将自带嵌入的图标字体)。 例如调用 import fonts.fontAwesome 即可引入 FontAwesome 字体。 */ winform.editFontPath.setCueBannerText("请直接将ttf图标字体文件拖放到这里/也支持粘贴网址"); import win.image; var hico = win.image.loadIconFromFile("/.img/iconfont.ico"); winform.setIcon( hico ) winform.show() winform.plusSet.orphanWindow(false) winform.plusSet.shawdow = win.ui.shadow(winform.plusSet) winform.plusSet.shawdow.show(false); winform.plusSet.onMouseEnter = function(wParam,lParam){ winform.opacity = 0 winform.plusSet.shawdow.show(true); } winform.plusSet.onMouseLeave = function(wParam,lParam){ winform.opacity = null winform.plusSet.shawdow.show(false); } import win.debounce; winform.cmbCssClass.onEditChange = win.debounce( function(){ var suggestion = {}; var text = winform.cmbCssClass.text; for(k,v in cssFontAwesome){ if(string.indexOf(v,text)){ table.push(suggestion,"fa-"+v); } } table.sort(suggestion) winform.cmbCssClass.autoComplete(suggestion,1); },300 ) winform.cmbCssClass.onSelChange = win.debounce( function(){ var text = string.match(winform.cmbCssClass.selText,"fa-(.+)"); for(k,v in cssFontAwesome){ if(v===text){ winform.editText.text = string.escape(k,true,true); winform.plusSet.text = string.unescape(k) winform.editNcr.text =(""+..string.format("%X",string.charCodeAt(winform.plusSet.text))+";") } } },300 ) win.loopMessage();