void Update() { //点击任意空白位置,弹出菜单消失 if (Input.GetMouseButtonDown(0)) { if (null == Menu.CurMenu) { return; } bool b = RectTransformUtility.RectangleContainsScreenPoint(Menu.CurMenu._RectTransform, new Vector2(Input.mousePosition.x, Input.mousePosition.y)); if (!b) { Menu.CurMenu.Hide(); } } //正常运行的情况下这段不起作用 if (Input.GetKeyUp(KeyCode.LeftAlt) /*&& Input.GetKeyUp (KeyCode.F4)*/) { GEditorDataMgr.SaveEditorData(); GEditorDataMgr.CloseSql(); Application.Quit(); Log.i("编辑器正常关闭"); } }
/// <summary> /// 修改本地的一条kv数据,包括本地数据,及sql中的存储数据 /// </summary> /// <param name="treeItemID">Tree item I.</param> /// <param name="index">这个kvdata数据在sql同时也是在数据dic中的index(kvdata.key在sql中的顺序位置)</param> /// <param name="key">Key.</param> /// <param name="value">Value.</param> /// <param name="type">数据编辑类型,或打开窗口类型</param> public void ModifyKVItem(string treeItemID, int index, string key, string value, string type) { //修改本地数据------------------------------------- if (KVDateDic.ContainsKey(treeItemID)) { KVDateDic [treeItemID] [index].key = key; KVDateDic [treeItemID] [index].value = value; KVDateDic [treeItemID] [index].type = type; } else { //说明,这个函数OnDialogReturnValue是打开某一项TreeItem后再点击其中的KvItem才执行的,所以不可能出现在KVContainer中找不到当前TreeItem数据的情况 Log.e("KVListItem", "OnDialogReturnValue", "KVContainer中不包含当前打开的dialog所处理的treeItem TreeItemID:" + treeItemID, BeShowLog); } //修改sql数据------------------------------------- int key_offset_inSql = 0; int _index = (index * 3 + key_offset_inSql); string key_col_name_inSql = "line" + _index; //这里这么写的原因可以参考SQLitHelper中对数据库设计的说明 int value_offset_inSql = 1; _index = (index * 3 + value_offset_inSql); string value_col_name_inSql = "line" + _index; //这里这么写的原因可以参考SQLitHelper中对数据库设计的说明 int type_offset_inSql = 2; _index = (index * 3 + type_offset_inSql); string type_col_name_inSql = "line" + _index; //这里这么写的原因可以参考SQLitHelper中对数据库设计的说明 GEditorDataMgr.ModifyKVSqlData(Name, new string[] { key_col_name_inSql, value_col_name_inSql, type_col_name_inSql }, new string[] { key, value, type }, Convert.ToInt32(treeItemID)); //修改ui,这里稍微有点浪费效率,整体都重新刷新了一便,但是不用重新开发功能,就这样 RefreshKVListUI(KVDateDic[treeItemID]); }
/// <summary> /// Creates the KV item. /// </summary> /// <param name="kvType">Kv type.数据表名,kvitem属于那个tree,哪个tab,就是tabType或editorType</param> public string CreateKVList(string kvType) { //使用模板数据填入sql,并取回id //Dictionary<int,KVData> dic = GEditorConfig.GetKVTemplateData(kvType); string[] _defaultDate = GEditorConfig.GetKVDefaultValueData(kvType); string[] _fullDefaultDate = GEditorConfig.GetFullKVDefaultValueData(kvType, _defaultDate); //_t[0]= "null"; //从sql拿回id,并保存这个id int id = GEditorDataMgr.CreateKVSqlData(kvType, _fullDefaultDate); //NINFO nsql 这里3处"ID",写法不是很好,但目前是正确的,后面如果感觉不合理要修改下 //从sql取出id为id的数据dic,这个函数还会把数据存到本地 Dictionary <int, KVData> dic = CheckAndLoadTreeItemData2Local(id.ToString()); dic[0].value = id.ToString(); //Log.i("KVContainer","CreateKVItem","key:"+dic[0]); //KVDateDic.Add(dic[0].value,dic); //使用KvDic中的数据填充 itemUI prefab,刷新ui RefreshKVListUI(dic); CurTreeItemID = dic[0].value; Log.i("KVContainer", "CreateKVItem", "新增KVItem id:" + id, BeShowLog); return(id.ToString()); }
public void CreateMenu(TreeFolder menuListFolder) { if (null != FolderRightMenu) { return; } Dictionary <string, Listener> dic = new Dictionary <string, Listener> (); dic.Add("创建文件夹", menuListFolder.AddFolder); if (!BeRootFolder) { dic.Add("删除文件夹", menuListFolder.DelFolder); } else { Listener callback = () => { GEditorDataMgr.GenerateGameData(Name); }; dic.Add("导出" + Name + "数据", callback); } dic.Add("创建文件", menuListFolder.AddItem); dic.Add("重命名", menuListFolder.ReName); dic.Add("黏贴", menuListFolder.Paste); FolderRightMenu = Menu.Generate(dic, "FolderMenu"); FolderRightMenu.ItemDic["黏贴"].interactable = false;//默认禁用黏贴 }
/// <summary> /// 利用剪切版里的数据新建一个Item /// 新建一个item /// 这里要注意的是创建的位置 /// /// 当选择一个item并且黏贴时,是把剪切版中的item粘到这个选择item的前面 /// 原因是如果是后面的化,那么folder下第一个位置永远不能被插入 /// </summary> private void Paste() { //这里要判定黏贴板上是否有数据 if (MyTreeContainer.CurCopyItem == null) { Log.i("TreeItem", "Paste", "黏贴的数据为null,不该出现的状态", BeShowLog); return; } //插入TreeItem项到指定位置 var treeItem = InsertItem(IndexInParentFolder, MyTreeContainer.CurCopyItem.Name, ParentFolder, MyTreeContainer); treeItem.Icon = MyTreeContainer.CurCopyItem.Icon; treeItem.TreeItemID = MyTreeContainer.CurCopyItem.TreeItemID; string _curCopyItemID = MyTreeContainer.CurCopyItem.TreeItemID; //如果数据来自剪切,就要清理原数据,如果来自复制,就要复制原数据(数据id如果不变,复制是没有意义的) //如果是剪切,要删除前一个状态 if (MyTreeContainer.CurCopyItem.BeCut) { Log.i("TreeItem", "Paste", "开始黏贴", BeShowLog); MyTreeContainer.CurCopyItem.BeCut = false; MyTreeContainer.CurCopyItem.DelItem(false); } else //如果是copy,要新生成sql数据,拿到ID,然后再插入数据 { //NINFO nsql 这里是否也要向本地写数据 //这里并不需要向本地Dic写入数据,只向sql写入数据即可,复制并没有把当前选中项置为 复制项, //当鼠标点击选中复制项时,选中逻辑自然会把sql数据导入本地 Log.i("TreeItem", "Paste", "开始复制", BeShowLog); //step1 创建一个空的默认数据 新建sql并拿回新id string kvType = this.MyTreeContainer.Name; string[] _defaultDate = GEditorConfig.GetKVDefaultValueData(kvType); string[] _fullDefaultDate = GEditorConfig.GetFullKVDefaultValueData(kvType, _defaultDate); int newID = GEditorDataMgr.CreateKVSqlData(kvType, _fullDefaultDate); treeItem.TreeItemID = newID.ToString(); Log.i("TreeItem", "Paste", "新建数据完毕返回 newID:" + newID, BeShowLog); //step2 获取旧数据 根据treeItem.ID(被copy的那个item的sql数据id)查询copy的数据 //string[] rowNames = GEditorConfig.GetKVRowNames(kvType); string[] copyDate = GEditorDataMgr.QueryKVSqlData(kvType /*,rowNames*/, Convert.ToInt32(_curCopyItemID)); //step3 向新建的空位置添加旧数据,id使用新id copyDate[1] = newID.ToString(); //特别注意这里是第一个元素,不是第0个,可以参考SQLiteHelper4DataEditor的说明 string[] Col_Names_InSql = SQLiteHelper4DataEditor.Get_Col_Names_InSql(kvType); GEditorDataMgr.ModifyKVSqlData(kvType, Col_Names_InSql, copyDate, newID); } //黏贴要要清理黏贴版,这里暂时逻辑为无论剪切还是复制,每到黏贴时都要清空剪贴板 MyTreeContainer.CurCopyItem = null; Log.i("TreeItem", "Paste", "黏贴的item ID:" + treeItem.TreeItemID, BeShowLog); }
/// <summary> /// 要删除的item的ID /// </summary> /// <param name="ID"></param> public void DelKVListData(string ID) { //删本地数据 KVDateDic.Remove(ID); int id = Convert.ToInt32(ID); //删sql数据 GEditorDataMgr.DelKVSqlData(Name, id); Log.i("KVContainer", "DelKVItem", "删除KVItem id:" + id, BeShowLog); }
/// <summary> /// 这里的黏贴是treeItme的黏贴,不存在文件夹整体黏贴的说法 /// treefolder的黏贴跟TreeItem有些不同(除了这些不同其他都相同,跟treeitem paste的操作类似) /// treeItem是把黏贴项放到自己之前 /// treefoler是把黏贴项放到自己内部所有元素之后 /// </summary> public void Paste() { //这里要判定黏贴板上是否有数据 if (MyTreeContainer.CurCopyItem == null) { Log.i("TreeItem", "Paste", "黏贴的数据为null,不该出现的状态", BeShowLog); return; } if (!BeFolderOpen) { OpenFolder(); //没打开的先打开再创建,否则位置错乱 } //创建新位置的item的ui,ui节点名称与黏贴板上的一致 var ti = TreeItem.Create(MyTreeContainer.CurCopyItem.Name, this, MyTreeContainer); //如果是剪切,要删除前一个状态 if (MyTreeContainer.CurCopyItem.BeCut) { Log.i("TreeItem", "Paste", "开始黏贴", BeShowLog); MyTreeContainer.CurCopyItem.BeCut = false; MyTreeContainer.CurCopyItem.DelItem(false); ti.TreeItemID = MyTreeContainer.CurCopyItem.TreeItemID;//黏贴的话id保持不变 } else//如果是copy,要新生成sql数据,拿到ID,然后再插入数据 { //step1 创建一个空的默认数据 新建sql并拿回新id string kvType = this.MyTreeContainer.Name; string[] _defaultDate = GEditorConfig.GetKVDefaultValueData(kvType); string[] _fullDefaultDate = GEditorConfig.GetFullKVDefaultValueData(kvType, _defaultDate); int newID = GEditorDataMgr.CreateKVSqlData(kvType, _fullDefaultDate); ti.TreeItemID = newID.ToString(); Log.i("TreeFolder", "Paste", "新建数据完毕返回 newID:" + newID, BeShowLog); //step2 获取旧数据 根据treeItem.ID(被copy的那个item的sql数据id)查询copy的数据 //string[] rowNames = GEditorConfig.GetKVRowNames(kvType); string[] copyDate = GEditorDataMgr.QueryKVSqlData(kvType /*,rowNames*/, Convert.ToInt32(MyTreeContainer.CurCopyItem.TreeItemID)); //step3 向新建的空位置添加旧数据,id使用新id copyDate[1] = newID.ToString();//特别注意这里是第一个元素,不是第0个,可以参考SQLiteHelper4DataEditor的说明 string[] Col_Names_InSql = SQLiteHelper4DataEditor.Get_Col_Names_InSql(kvType); GEditorDataMgr.ModifyKVSqlData(kvType, Col_Names_InSql, copyDate, newID); } //黏贴要要清理黏贴版,这里暂时逻辑为无论剪切还是复制,每到黏贴时都要请客剪贴板 MyTreeContainer.CurCopyItem = null; Log.i("TreeItem", "Paste", "黏贴的item ID:" + ti.TreeItemID, BeShowLog); }
/// <summary> /// 检测本地是否存在TreeItmeID的数据, /// 不存在就去sql中查找,并存到本地,返回找到的这个treeItem的数据 /// 存在就直接返回 public Dictionary <int, KVData> CheckAndLoadTreeItemData2Local(string TreeItemID) { //根据TreeItem.ID判断本地是否有对应的Kvitem的数据,如果有就直接填充数据 bool b = BeKVListDataCache(TreeItemID); Dictionary <int, KVData> kvDic = null; if (b) //如果有缓存就从缓存刷新数据 { Log.i("KVContainer", "RefreshKVList", "从本地缓存刷数据 ID:" + TreeItemID, BeShowLog); kvDic = GetLocaCacheKVListData(TreeItemID); // if (beRefreshUI) { // RefreshKVListUI(GetLocaCacheKVListData(TreeItemID)); // CurTreeItemID = TreeItemID; // } } else //如果没有就使用TreeItem.ID从sql查询读取,并缓存到本地 { Log.i("KVContainer", "RefreshKVList", "从sql查询获取数据 ID:" + TreeItemID, BeShowLog); //这里要把不同tab的row刷出来填进去 int _id = Convert.ToInt32(TreeItemID); //string[] rowNames = GEditorConfig.GetKVRowNames(Name); //string[] openType = GEditorConfig.GetKVRowOpenType(Name); //这里查询结果要存到本地缓存,这里查询到的是某个id的数据 string[] queryResult = GEditorDataMgr.QueryKVSqlData(Name /*, rowNames*/, _id); kvDic = new Dictionary <int, KVData>(); for (int i = 0, j = 0; i < queryResult.Length; i += 3, j++) //nafio nsql { KVData kvdata = new KVData(); kvdata.key = queryResult [i]; kvdata.value = queryResult[i + 1]; kvdata.type = queryResult[i + 2]; kvDic.Add(j, kvdata); //Log.i("KVContainer","RefreshKVList","从sql向本地填充queryResult["+i+"]->key:"+kvdata.key+" value:"+kvdata.value+" type:"+kvdata.type); } KVDateDic.Add(TreeItemID, kvDic); } // if (beRefreshUI){ // RefreshKVListUI(kvDic); // CurTreeItemID = TreeItemID; // } return(kvDic); }
/// <summary> /// 编辑器初始化,重要流程 /// </summary> private void InitGEditor() { //创建Tab管理器 TabContainer = new TabContainer(TabContainer.TabLayoutType.horizontal, TabPanel); TabContainer.TabSelectEvent = OnTabSelect; TabContainer.TabDeSelectEvent = OnTabDeSelect; //创建Tree管理器 if (null == TreeContainerDic) { TreeContainerDic = new Dictionary <string, TreeContainer> (); } //创建列表管理器 if (null == KVContainerDic) { KVContainerDic = new Dictionary <string, KVContainer>(); } //加载tab数据,根据数据创建打开tab //检测是否存在tab.config配置文件,如果没有,就使用默认打开项目(GEditorEnum.OPENED_EDITORS) string tabCfgPath = GEditorEnum.EDITOR_DATA_ROOTURL + GEditorEnum.EDITOR_TAB_CONFIG_NAME; bool beTabCfgExists = FileHelper.BeFileExists(tabCfgPath); //VLog.I("tabCfgPaht:"+tabCfgPath+" beExis:"+beTabCfgExists); string[,] _CurOpenedTabs = null; if (beTabCfgExists) { _CurOpenedTabs = GEditorDataMgr.LoadTabConfig(tabCfgPath); //非首次,使用tab.config中记录的数据 } else { _CurOpenedTabs = GEditorEnum.OPENED_EDITORS; //首次打开,不存tab.config相关记录,使用默认打开tab页 } for (int i = 0; i < _CurOpenedTabs.GetLength(0); i++) { //根据数创建tab项 TabData tabData = new TabData(); tabData.Name = _CurOpenedTabs[i, 0]; tabData.RefName = _CurOpenedTabs[i, 1]; tabData.Index = i; var tabItem = TabItem.Create(tabData, TabPanel, TabContainer); TabContainer.Add(tabItem); //根据现有打开的tab,创建对应的tree项 string treeCfgPath = GEditorEnum.EDITOR_DATA_ROOTURL + GEditorEnum.EDITOR_TREE_CONFIG_NAME + tabData.RefName + ".config"; bool beTreeConfigExists = FileHelper.BeFileExists(treeCfgPath); TreeContainer treeContainer = new TreeContainer(); if (beTreeConfigExists) //treeConfig配表存在,从配表载入TreeContainer { byte[] bs = GEditorDataMgr.LoadOneTreeConfig(treeCfgPath); treeContainer.CreateByData(tabData.RefName, TreePanel, TreePanel, 0, 0, bs); TreeContainerDic.Add(tabData.RefName, treeContainer); } else //treeConfig配表不存在存在,创建新的根节点 { treeContainer.Create(tabData.RefName, TreePanel, TreePanel, 0, 0); TreeContainerDic.Add(tabData.RefName, treeContainer); } treeContainer.Hide(); //创建完先隐藏,等等具体tab被选中时才显示 //设置tabitem初始选中状态,这句需要放在TreeContainer被创建之后, //因为Beselect一旦被执行,就会执行切换TreeContainer的操作,如果TreeContainer还没被创建,就会出错 if (i == 0) { tabItem.BeSelecte = true; } else { tabItem.BeSelecte = false; } //创建KVContainer,打开几个tab创建几个,跟tree类似 KVContainerDic.Add(tabData.RefName, new KVContainer(KeyValuePanel, KeyPanel, ValuePanel, tabData.RefName)); } //打开数据库,保持长连接 GEditorDataMgr.ConnectSql(); //判定是否是首次打开editor,如果是创建sql table,并创建首次打开标示文件app.config GEditorDataMgr.CheckSQLTableExist(); }
void OnDestroy() { GEditorDataMgr.SaveEditorData(); GEditorDataMgr.CloseSql(); Ins = null; }
void Update() { // if (Input.GetKeyUp (KeyCode.B)) { // sql.OpenConnection("data source= data/sqlite4unity.db"); // sql.BeTableExist ("table1"); // sql.CloseConnection(); // } if (Input.GetKeyUp(KeyCode.S)) { Debug.Log("Start"); sql = SQLiteHelper.GetIns(); sql.OpenConnection("data source= data/test.db"); } if (Input.GetKeyUp(KeyCode.T)) { //创建名为table1的数据表 sql.CreateTable("table1", new string[] { "ID", "Name", "Email" }, new string[] { "INTEGER PRIMARY KEY", "TEXT", "TEXT" }); } if (Input.GetKeyUp(KeyCode.N)) { Debug.Log("End"); sql.CloseConnection(); } //测试新增一条数据 if (Input.GetKeyUp(KeyCode.C)) { Debug.Log("Create"); string s = "name3333333"; GEditorDataMgr.CreateKVSqlData("table1", new string[] { "null", s, "*****@*****.**" }); } //测试查询 if (Input.GetKeyUp(KeyCode.Q)) { Debug.Log("Query"); //GEditorDataMgr.QueryKVSqlData("table1",new string[]{"ID","Name","Email"},1); } //测试修改 if (Input.GetKeyUp(KeyCode.M)) { Debug.Log("Motify"); GEditorDataMgr.ModifyKVSqlData("table1", new string[] { "Name" }, new string[] { "'f**k'" }, 1); } //测试删除 if (Input.GetKeyUp(KeyCode.D)) { Debug.Log("Del"); GEditorDataMgr.DelKVSqlData("table1", 1); } //测试copy // if(Input.GetKeyUp(KeyCode.P)) // { // Debug.Log ("Copy"); // string s = "INSERT INTO table1 SELECT * FROM table1"; // SQLiteHelper.GetIns ().ExecuteQuery (s); // } }
private void OnGenerateAllClick() { Debug.Log("generateAll date Click"); GEditorDataMgr.GenerateAllGameData(); }