# aardio 范例: packer



```aardio
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="WinAsar - packer";right=1075;bottom=734;acceptfiles=1;bgcolor=0xFFFFFF;)
winform.add(
btnBuild={cls="plus";text="生成asar文件";left=805;top=664;right=967;bottom=701;align="left";anchors={right=1;bottom=1};font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(name='FontAwesome');padding={left=15}};iconText='\uF090';notify=1;textPadding={left=35};z=3};
btnClear={cls="plus";text="清空";left=272;top=8;right=355;bottom=43;align="left";anchors={left=1;top=1};font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(name='FontAwesome');padding={left=15}};iconText='\uF1F8';textPadding={left=35};z=8};
btnOpen={cls="plus";text="添加";left=25;top=8;right=129;bottom=43;align="left";anchors={left=1;top=1};font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(name='FontAwesome');padding={left=15}};iconText='\uF07C';textPadding={left=35};z=5};
btnRemove={cls="plus";text="移除";left=135;top=8;right=239;bottom=43;align="left";disabled=1;anchors={left=1;top=1};font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(name='FontAwesome');padding={left=15}};iconText='\uF08B';textPadding={left=35};z=9};
editInfo={cls="richedit";left=371;top=8;right=1064;bottom=655;anchors={left=1;top=1;right=1;bottom=1};edge=1;hscroll=1;multiline=1;vscroll=1;z=2};
editOutPath={cls="edit";left=138;top=666;right=800;bottom=699;anchors={left=1;right=1;bottom=1};edge=1;multiline=1;z=6};
lbTip={cls="plus";text="可直接拖放要添加的文件到当前窗体";left=382;top=706;right=663;bottom=728;align="right";anchors={right=1;bottom=1};transparent=1;z=11};
plusWebSite={cls="plus";text="Star";left=975;top=698;right=1052;bottom=729;align="left";color=-1;anchors={right=1;bottom=1};font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=15;top=1}};iconText='\uF09B';notify=1;textPadding={left=35;bottom=1};z=10};
progress={cls="plus";left=21;top=710;right=1058;bottom=723;bgcolor=6447459;anchors={left=1;right=1;bottom=1};forecolor=9959653;hide=1;max=100;min=0;z=4};
static={cls="static";text="输出文件:";left=42;top=672;right=128;bottom=696;align="right";anchors={left=1;bottom=1};font=LOGFONT(h=-15);transparent=1;z=7};
treeview={cls="treeview";left=18;top=51;right=364;bottom=658;bgcolor=0xFFFFFF;anchors={left=1;top=1;bottom=1};edge=1;vscroll=1;z=1}
)
/*}}*/

import fsys.asar.writer;
var asarFile = fsys.asar.writer();

var showAsarInfo = function(){
	var info,err = asarFile.createInfo(); 
	if(!info){
		winform.msgboxErr(err)
		return;	
	}
	winform.treeview.clear();
	winform.treeview.insertItem(asarFile.treeData()); 
	winform.editInfo.text = JSON.stringify(asarFile.info,true); 
	
	if( ( !# ( ..string.trim( winform.editOutPath.text )) )
		|| (winform.editOutPath.autoPath = winform.editOutPath.text ) ){
		winform.editOutPath.text = fsys.path.removeBackslash(asarFile.rootDirectory) + ".asar";
		winform.editOutPath.autoPath = winform.editOutPath.text;
	}
}

winform.btnClear.oncommand = function(id,event){
	asarFile.clear();
	winform.treeview.clear();
	winform.editInfo.text = "";
	winform.btnRemove.disabled = true;
}

import fsys.dlg;
winform.btnOpen.oncommand = function(id,event){
	var path = fsys.dlg.open("*.*|*.*||","添加文件到asar文件",,winform.hwnd);
	if(#path){
		asarFile.add( path );
		showAsarInfo();
	} 
}

winform.wndproc = {
    [0x233/*_WM_DROPFILES*/] = function(hwnd,message,wParam,lParam){ 
		var files = win.getDropFile(wParam)
		if(#files){
			for(i=1;#files;1){
				asarFile.add( files[i] );
			}
			
			showAsarInfo();
		};
	}
}

import fsys;
import win.ui.menu;
import process;
winform.treeview.onnotify = function(id,code,ptr){
 
    if( code == 0xFFFFFE3D/*_TVN_SELCHANGEDW*/ ){  
		var hItem = winform.treeview.getSelection();
		if(hItem){
			winform.btnRemove.disabled = false;
			var data  = winform.treeview.getItemData(hItem);
			var data = table.clone(data); 
			for(k,v in data){
				if( v[["size"]] ) v.size =..math.size64(v.size).format(); 
			}
			if( data[["size"]] ) data.size =..math.size64(data.size).format(); 
			
            winform.editInfo.text = JSON.stringify(data,true)  
		}
		else {
			winform.btnRemove.disabled = true;
		}
    } 
}

import fsys.dlg;
import process;
winform.btnBuild.oncommand = function(id,event){
	var outpath = winform.editOutPath.text;
	if(!#outpath){
		outpath = fsys.dlg.save("*.asar|*.asar||","请选择asar文件",,winform.hwnd);
	} 
	
	if(!#outpath) return;
	if(!..string.endsWith(outpath,".asar",true)){
		winform.msgboxErr("输出文件必须以.asar作为文件名后缀");
		winform.editOutPath.setFocus();
		return;
	}
	
	winform.plusWebSite.visible = false;
	
	winform.btnBuild.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}
	winform.progress.visible = true;
    winform.progress.setProgressRange(1,1000);
    for(path,size,progress in asarFile.eachPack(outpath)){
    	winform.progress.progressPos = progress * 1000;
		win.delay(1)	
    } 
	winform.btnBuild.disabledText = null;
	
	if( asarFile.lasterr ) winform.msgboxErr(asarFile.lasterr)
	winform.progress.visible = false;
	process.explore_select(outpath)
}

winform.btnRemove.oncommand = function(id,event){
	var hItem = winform.treeview.getSelection();
	if(hItem){
		var path = winform.treeview.getItemPath(hItem);
		if(asarFile.remove(path)){
			winform.treeview.delItem(hItem)
		}
	}	
}

winform.btnClear.skin({
	background={
		default=0xFF8FB2B0;
		hover=0xFF928BB3;
		disabled=0xFFCCCCCC;
	}
})

winform.btnOpen.skin({
	background={
		default=0xFF8FB2B0;
		hover=0xFF928BB3;
		disabled=0xFFCCCCCC; 
	}
})

winform.btnRemove.skin({
	background={
		default=0xFF8FB2B0;
		hover=0xFF928BB3;
		disabled=0xFFCCCCCC;
	}
})

winform.btnBuild.skin({
	background={
		default=0xFF8FB2B0;
		hover=0xFF928BB3;
		disabled=0xFFCCCCCC;
	}
})

winform.plusWebSite.skin(
    color = {  
        hover = 0xFFFF0000;  
        active = 0xFF00FF00;  
    }
)
winform.plusWebSite.oncommand = function(id,event){
	import process
	process.openUrl("https://github.com/aardio/WinAsar")
}

winform.enableDpiScaling();
winform.show();

win.loopMessage();
return winform;
```

