// -------------------------------------------------- void title_select(do_action_t da) { if (gdmgr._da == da) { return; } if (gdmgr._da == da_sync) { sync_hide_ui(); } else if (gdmgr._da == da_wgen) { #ifndef _ROSE_EDITOR wgen_hide_ui(); #endif } else if (gdmgr._da == da_core) { if (!core_hide_ui()) { return; } } else if (gdmgr._da == da_visual) { visual_hide_ui(); } else if (gdmgr._da == da_campaign) { #ifndef _ROSE_EDITOR if (!campaign_hide_ui()) { return; } #endif } else if (gdmgr._da == da_integrate) { if (!integrate_hide_ui()) { return; } } ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_SYNC, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_WGEN, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_CORE, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_PLAY, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_TBOX, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_BUILDER, 0); ShowWindow(gdmgr._hdlg_sync, SW_HIDE); ShowWindow(gdmgr._hdlg_wgen, SW_HIDE); ShowWindow(gdmgr._hdlg_core, SW_HIDE); ShowWindow(gdmgr._hdlg_visual, SW_HIDE); ShowWindow(gdmgr._hdlg_campaign, SW_HIDE); ShowWindow(gdmgr._hdlg_integrate, SW_HIDE); // 记住当前正在执行的会话 gdmgr._da = da; if (da == da_sync) { ShowWindow(gdmgr._hdlg_sync, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_SYNC, 1); sync_enter_ui(); } else if (da == da_wgen) { ShowWindow(gdmgr._hdlg_wgen, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_WGEN, 1); #ifndef _ROSE_EDITOR wgen_enter_ui(); #endif } else if (da == da_core) { ShowWindow(gdmgr._hdlg_core, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_CORE, 1); core_enter_ui(); } else if (da == da_visual) { ShowWindow(gdmgr._hdlg_visual, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_PLAY, 1); visual_enter_ui(); } else if (da == da_campaign) { ShowWindow(gdmgr._hdlg_campaign, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_TBOX, 1); #ifndef _ROSE_EDITOR campaign_enter_ui(); #endif } else if (da == da_integrate) { ShowWindow(gdmgr._hdlg_integrate, SW_RESTORE); integrate_enter_ui(); } return; }
void On_DlgDDescCommand(HWND hdlgP, int id, HWND hwndCtrl, UINT codeNotify) { char *ptr = NULL; int retval; char text[_MAX_PATH]; BOOL fok; std::string str; std::stringstream strstr; switch (id) { case IDC_BT_DDESC_BROWSE: ptr = GetBrowseFilePath(hdlgP); if (!ptr) { break; } strcpy(text, appendbackslash(ptr)); if (text[strlen(text) - 1] == '\\') { text[strlen(text) - 1] = 0; } if (!check_wok_root_folder(text)) { posix_print_mb("%s,不是有效的kingdom-src-x.x.x源数据目录,请重新选择", appendbackslash(text)); break; } if (strcasecmp(ptr, game_config::path.c_str())) { game_config::path = ptr; gdmgr.heros_.set_path(game_config::path.c_str()); Edit_SetText(GetDlgItem(hdlgP, IDC_ET_DDESC_WWWROOT), appendbackslash(ptr)); OnLSBt(TRUE); if (gdmgr._da != da_sync) { title_select(da_sync); } else { sync_enter_ui(); } update_locale_dir(); } break; case IDM_NEW_EXTRAINSDIST: sprintf(text, "Do you want to extract install-material to C:\\kingdom-ins?"); retval = MessageBox(hdlgP, text, "Confirm Generate", MB_YESNO | MB_DEFBUTTON2); if (retval == IDYES) { fok = extra_kingdom_ins_disk(gdmgr._menu_text, "c:\\kingdom-ins", "c:\\kingdom-ins-android\\com.freeors.kingdom"); posix_print_mb("Extract install-material from %s to C:\\kingdom-ins, %s!!", gdmgr._menu_text, fok? "Success": "Fail"); } break; case IDM_NEW_CAMPAIGN: if (campaign_new()) { // title_select(da_sync); } break; case IDM_EXPLORER_WML: if (!_stricmp(gdmgr._menu_text, "hero.dat")) { if (gdmgr._da != da_wgen) { title_select(da_wgen); } else { wgen_enter_ui(); } } else if (!_stricmp(gdmgr._menu_text, "tb.dat")) { editor_config::type = BIN_BUILDINGRULE; if (gdmgr._da != da_visual) { title_select(da_visual); } else { visual_enter_ui(); } } else if (!_stricmp(extname(gdmgr._menu_text), "bin")) { if (wml_checksum_from_file(std::string(gdmgr._menu_text))) { editor_config::type = BIN_WML; if (gdmgr._da != da_visual) { title_select(da_visual); } else { visual_enter_ui(); } } } break; case IDM_DELETE_ITEM0: // 册除指定的文件/目录 strstr.str(""); str = gdmgr._menu_text; strstr << str.substr(0, str.rfind("\\xwml")); strstr << "\\data\\campaigns\\" << offextname(basename(gdmgr._menu_text)); strcpy(text, strstr.str().c_str()); strstr.str(""); strstr << "您想删除文件:" << gdmgr._menu_text << ",以及目录:"; strstr << text << "?"; // Confirm Multiple File Delete retval = MessageBox(hdlgP, strstr.str().c_str(), "确认删除", MB_YESNO | MB_DEFBUTTON2); if (retval == IDYES) { if (delfile1(gdmgr._menu_text)) { TreeView_DeleteItem(GetDlgItem(hdlgP, IDC_TV_DDESC_EXPLORER), (HTREEITEM)(UINT_PTR)gdmgr._menu_lparam); TreeView_SetChilerenByPath(GetDlgItem(hdlgP, IDC_TV_DDESC_EXPLORER), (HTREEITEM)(UINT_PTR)gdmgr._menu_lparam, dirname(gdmgr._menu_text)); } else { posix_print_mb("Failed delete %s !", gdmgr._menu_text); } if (!delfile1(text)) { posix_print_mb("Failed delete %s !", text); } sync_refresh_sync(); } break; case IDM_DELETE_ITEM1: strstr.str(""); strstr << "将产生不同步,您想删除文件:" << gdmgr._menu_text << "?"; // Confirm Multiple File Delete retval = MessageBox(hdlgP, strstr.str().c_str(), "确认删除", MB_YESNO | MB_DEFBUTTON2); if (retval == IDYES) { if (delfile1(gdmgr._menu_text)) { TreeView_DeleteItem(GetDlgItem(hdlgP, IDC_TV_DDESC_EXPLORER), (HTREEITEM)(UINT_PTR)gdmgr._menu_lparam); TreeView_SetChilerenByPath(GetDlgItem(hdlgP, IDC_TV_DDESC_EXPLORER), (HTREEITEM)(UINT_PTR)gdmgr._menu_lparam, dirname(gdmgr._menu_text)); } else { posix_print_mb("Failed delete %s !", gdmgr._menu_text); } // inform user, there is non sync. if (gdmgr._da != da_sync) { title_select(da_sync); } else { // forbid refresh sync_enter_ui(); } } break; default: break; } return; }
// // On_DlgDDescNotify() // BOOL On_DlgDDescNotify(HWND hdlgP, int DlgItem, LPNMHDR lpNMHdr) { LPNMTREEVIEW lpnmitem; HTREEITEM htvi; TVITEMEX tvi; char text[_MAX_PATH]; POINT point; if (gdmgr._syncing || (lpNMHdr->idFrom != IDC_TV_DDESC_EXPLORER)) { return FALSE; } lpnmitem = (LPNMTREEVIEW)lpNMHdr; // NM_RCLICK/NM_CLICK/NM_DBLCLK这些通知被发来后,其附代参数没法指定是哪个叶子句柄, // 需通过判断鼠标坐标来判断是哪个叶子被按下? // 1. GetCursorPos, 得到屏幕坐标系下的鼠标坐标 // 2. TreeView_HitTest1(自写宏),由屏幕坐标系下的鼠标坐标返回指向的叶子句柄 GetCursorPos(&point); // 得到的是屏幕坐标 TreeView_HitTest1(lpNMHdr->hwndFrom, point, htvi); // NM_表示对通用控件都通用,范围丛(0, 99) // TVN_表示只能TreeView通用,范围丛(400, 499) if (lpNMHdr->code == NM_RCLICK) { // // 右键单击: 弹出菜单 // // 准备两个菜单上下文变量 TreeView_GetItem1(lpNMHdr->hwndFrom, htvi, &tvi, TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT, text); strcpy(gdmgr._menu_text, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); gdmgr._menu_lparam = (uint32_t)tvi.lParam; // new if (!can_execute_tack(TASK_NEW) || strcasecmp(gdmgr._menu_text, game_config::path.c_str())) { EnableMenuItem(gdmgr._hpopup_new, IDM_NEW_EXTRAINSDIST, MF_BYCOMMAND | MF_GRAYED); } if (!can_execute_tack(TASK_NEW)) { EnableMenuItem(gdmgr._hpopup_new, IDM_NEW_CAMPAIGN, MF_BYCOMMAND | MF_GRAYED); } // explorer if (!can_execute_tack(TASK_EXPLORER) || (_stricmp(extname(gdmgr._menu_text), "bin") && _stricmp(extname(gdmgr._menu_text), "dat"))) { EnableMenuItem(gdmgr._hpopup_explorer, IDM_EXPLORER_WML, MF_BYCOMMAND | MF_GRAYED); } // delete if (!can_execute_tack(TASK_DELETE) || _stricmp(extname(gdmgr._menu_text), "bin") || !strstr(gdmgr._menu_text, "\\campaigns\\")) { EnableMenuItem(gdmgr._hpopup_delete, IDM_DELETE_ITEM0, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(gdmgr._hpopup_delete, IDM_DELETE_ITEM1, MF_BYCOMMAND | MF_GRAYED); } TrackPopupMenuEx(gdmgr._hpopup_ddesc, 0, point.x, point.y, hdlgP, NULL); EnableMenuItem(gdmgr._hpopup_new, IDM_NEW_EXTRAINSDIST, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(gdmgr._hpopup_explorer, IDM_EXPLORER_WML, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(gdmgr._hpopup_delete, IDM_DELETE_ITEM0, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(gdmgr._hpopup_delete, IDM_DELETE_ITEM1, MF_BYCOMMAND | MF_ENABLED); } else if (lpNMHdr->code == NM_CLICK) { // // 左键单击: 如果底下被击的是目录,且没有生成过叶子,成生叶子 // strcpy(text, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); TreeView_GetItem1(lpNMHdr->hwndFrom, htvi, &tvi, TVIF_CHILDREN, NULL); if (tvi.cChildren && !TreeView_GetChild(lpNMHdr->hwndFrom, htvi)) { dir_2_tv(lpNMHdr->hwndFrom, htvi, text, 0); } // 址址栏中显示选中目录 strcpy(text, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); if (!is_directory(text)) { strcpy(text, dirname(text)); } // Edit_SetText(GetDlgItem(hdlgP, IDC_ET_DDESC_WWWROOT), text + strlen(dirname(game_config::path.c_str())) + 1); } else if (lpNMHdr->code == NM_DBLCLK) { // // 目录: 展开/折叠叶子(系统自动) // 文件: 用特定应程序打开 // // 切换到编辑窗口 TreeView_GetItem1(lpNMHdr->hwndFrom, htvi, &tvi, TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT, text); if (!_stricmp(text, "hero.dat")) { strcpy(gdmgr._menu_text, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); gdmgr._menu_lparam = (uint32_t)tvi.lParam; if (gdmgr._da != da_wgen) { title_select(da_wgen); } else { wgen_enter_ui(); } } else if (!_stricmp(text, "tb.dat") || !_stricmp(text, "tb-1.dat")) { strcpy(gdmgr._menu_text, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); gdmgr._menu_lparam = (uint32_t)tvi.lParam; editor_config::type = BIN_BUILDINGRULE; if (gdmgr._da != da_visual) { title_select(da_visual); } else { visual_enter_ui(); } } else if (!_stricmp(extname(text), "bin")) { strcpy(gdmgr._menu_text, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); if (wml_checksum_from_file(std::string(gdmgr._menu_text))) { gdmgr._menu_lparam = (uint32_t)tvi.lParam; if (strstr(gdmgr._menu_text, "\\campaigns\\") && !strstr(gdmgr._menu_text, "duel") && !strstr(gdmgr._menu_text, "legend_of_bei_liu") && !strstr(gdmgr._menu_text, "tower_defense") && !strstr(gdmgr._menu_text, "tutorial")) { if (gdmgr._da != da_campaign) { title_select(da_campaign); } else { campaign_enter_ui(); } } else if (strstr(gdmgr._menu_text, "data.bin")) { if (gdmgr._da != da_core) { title_select(da_core); } else { // core_enter_ui(); } } else { editor_config::type = BIN_WML; if (gdmgr._da != da_visual) { title_select(da_visual); } else { visual_enter_ui(); } } } } } else if (lpNMHdr->code == TVN_ITEMEXPANDED) { // // 子叶子已被展开或折叠, 是折叠时删除所子有叶子, 以便下次展开时通反映最近文件系统 // if (lpnmitem->action & TVE_COLLAPSE) { TreeView_Walk(lpNMHdr->hwndFrom, lpnmitem->itemNew.hItem, FALSE, NULL, NULL, TRUE); TreeView_SetChilerenByPath(lpNMHdr->hwndFrom, htvi, TreeView_FormPath(lpNMHdr->hwndFrom, htvi, dirname(game_config::path.c_str()))); } } return FALSE; }
// -------------------------------------------------- void title_select(do_action_t da) { if (gdmgr._da == da) { // 当前已正在运行选择的操作,不执行任何动作 return; } if (gdmgr._da == da_sync) { sync_hide_ui(); } else if (gdmgr._da == da_wgen) { wgen_hide_ui(); } else if (gdmgr._da == da_core) { if (!core_hide_ui()) { return; } } else if (gdmgr._da == da_visual) { visual_hide_ui(); } else if (gdmgr._da == da_campaign) { if (!campaign_hide_ui()) { return; } } ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_SYNC, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_WGEN, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_XCHG, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_PLAY, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_TBOX, 0); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_ABOUT, 0); ShowWindow(gdmgr._hdlg_sync, SW_HIDE); ShowWindow(gdmgr._hdlg_wgen, SW_HIDE); ShowWindow(gdmgr._hdlg_core, SW_HIDE); ShowWindow(gdmgr._hdlg_visual, SW_HIDE); ShowWindow(gdmgr._hdlg_campaign, SW_HIDE); ShowWindow(gdmgr._hdlg_about, SW_HIDE); // 记住当前正在执行的会话 gdmgr._da = da; if (da == da_sync) { ShowWindow(gdmgr._hdlg_sync, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_SYNC, 1); sync_enter_ui(); } else if (da == da_wgen) { ShowWindow(gdmgr._hdlg_wgen, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_WGEN, 1); wgen_enter_ui(); } else if (da == da_core) { ShowWindow(gdmgr._hdlg_core, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_XCHG, 1); core_enter_ui(); } else if (da == da_visual) { ShowWindow(gdmgr._hdlg_visual, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_PLAY, 1); visual_enter_ui(); } else if (da == da_campaign) { ShowWindow(gdmgr._hdlg_campaign, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_TBOX, 1); campaign_enter_ui(); } else if (da == da_about) { ShowWindow(gdmgr._hdlg_about, SW_RESTORE); ToolBar_CheckButton(gdmgr._htb_sys, IDM_SYS_ABOUT, 1); } return; }