Feature/house dialog (#75)

This commit is contained in:
Zero Fanker 2024-07-04 06:52:41 +08:00 committed by GitHub
parent 487df9bead
commit 98cf96b927
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 257 additions and 50 deletions

View file

@ -85,7 +85,6 @@ BEGIN_MESSAGE_MAP(CHouses, CDialog)
ON_CBN_KILLFOCUS(IDC_EDGE, OnKillfocusEdge)
ON_CBN_KILLFOCUS(IDC_SIDE, OnKillfocusSide)
ON_CBN_KILLFOCUS(IDC_COLOR, OnKillfocusColor)
ON_EN_KILLFOCUS(IDC_ALLIES, OnKillfocusAllies)
ON_EN_KILLFOCUS(IDC_CREDITS, OnKillfocusCredits)
ON_CBN_EDITCHANGE(IDC_ACTSLIKE, OnEditchangeActslike)
ON_CBN_KILLFOCUS(IDC_NODECOUNT, OnKillfocusNodecount)
@ -94,8 +93,8 @@ BEGIN_MESSAGE_MAP(CHouses, CDialog)
ON_CBN_KILLFOCUS(IDC_PLAYERCONTROL, OnKillfocusPlayercontrol)
ON_CBN_SELCHANGE(IDC_HUMANPLAYER, OnSelchangeHumanplayer)
ON_CBN_SELCHANGE(IDC_ACTSLIKE, OnSelchangeActslike)
ON_EN_SETFOCUS(IDC_ALLIES, OnSetfocusAllies)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_HOUSES_CHANGE_ALLIES, &CHouses::OnBnClickedHousesChangeAllies)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
@ -191,6 +190,7 @@ BOOL CHouses::OnInitDialog()
UpdateDialog();
#ifdef RA2_MODE
::ShowWindow(GetDlgItem(IDC_LACTSLIKE)->m_hWnd, SW_HIDE);
m_ActsLike.ShowWindow(SW_HIDE);
//m_Edge.ShowWindow(SW_HIDE);
#endif
@ -424,7 +424,6 @@ void CHouses::OnShowWindow(BOOL bShow, UINT nStatus)
// call all KillFocus !
OnKillfocusIq();
OnEditchangeActslike();
OnKillfocusAllies();
OnKillfocusColor();
OnKillfocusCredits();
OnKillfocusEdge();
@ -571,26 +570,6 @@ void CHouses::OnKillfocusColor()
((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_minimap.RedrawWindow();
}
void CHouses::OnKillfocusAllies()
{
CIniFile& ini = Map->GetIniFile();
SetMainStatusBarReady();
int cusel;
cusel = m_houses.GetCurSel();
if (cusel == -1) return;
CString name;
m_houses.GetLBText(cusel, name);
name = TranslateHouse(name);
CString t;
m_Allies.GetWindowText(t);
t = TranslateHouse(t);
ini.SetString(name, "Allies", t);
}
void CHouses::OnKillfocusCredits()
{
CIniFile& ini = Map->GetIniFile();
@ -742,6 +721,41 @@ void CHouses::OnSelchangeActslike()
ini.SetString(name, "ActsLike", t);
}
void CHouses::OnBnClickedHousesChangeAllies()
{
auto const curSel = m_houses.GetCurSel();
if (curSel == -1) {
return;
}
CString name;
m_houses.GetLBText(curSel, name);
name = TranslateHouse(name);
CIniFile& ini = Map->GetIniFile();
std::vector<CString> allHouses;
for (auto idx = 0; idx < m_houses.GetCount(); ++idx) {
CString item;
m_houses.GetLBText(idx, item);
allHouses.emplace_back(std::move(item));
}
CHouseAllies dlg(std::move(allHouses), ini.GetString(name, "Allies"));
if (dlg.DoModal() == IDCANCEL) {
return;
}
auto&& allies = dlg.GetAllies();
ini.SetString(name, "Allies", INIHelper::Join(allies));
for (auto& house : allies) {
house = TranslateHouse(house, true);
}
m_Allies.SetWindowText(INIHelper::Join(allies));
SetMainStatusBarReady();
}
void CHouses::UpdateStrings()
{
SetDlgItemText(IDC_DESC, GetLanguageStringACP("HousesDesc"));
@ -768,12 +782,110 @@ void CHouses::UpdateStrings()
SetWindowText(TranslateStringACP(HOUSES));
}
void CHouses::OnSetfocusAllies()
{
SetMainStatusBar(GetLanguageStringACP("HousesAlliesHelp"));
}
void CHouses::PostNcDestroy()
{
CDialog::PostNcDestroy();
}
// CHouseAllies
CHouseAllies::CHouseAllies(std::vector<CString>&& houses, const CString& allies, CWnd* pParent) :
CDialog(CHouseAllies::IDD, pParent),
m_allHouses(std::move(houses))
{
auto const allyStrings = INIHelper::Split(allies);
for (auto& str : allyStrings) {
m_allies.insert(TranslateHouse(str, true));
}
}
CHouseAllies::~CHouseAllies()
{
}
std::vector<CString> CHouseAllies::GetAllies() const
{
std::vector<CString> ret;
for (auto const& str : m_allies) {
ret.emplace_back(TranslateHouse(str));
}
return ret;
}
BOOL CHouseAllies::OnInitDialog()
{
auto const ret = CDialog::OnInitDialog();
translateUI();
for (auto const& str : m_allies) {
m_allyList.AddString(str);
}
for (auto const& house : m_allHouses) {
if (m_allies.find(house) == m_allies.end()) {
m_enemyList.AddString(house);
}
}
updateAllyTexts();
return ret;
}
void CHouseAllies::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_HOUSE_LIST_ALLIES, m_allyList);
DDX_Control(pDX, IDC_HOUSE_LIST_ENEMIES, m_enemyList);
DDX_Control(pDX, IDC_HOUSE_ALLIES_VALUES, m_allianceText);
}
BEGIN_MESSAGE_MAP(CHouseAllies, CDialog)
ON_BN_CLICKED(IDC_HOUSE_ALLIES_ADD, &CHouseAllies::OnBnClickedHouseAlliesAdd)
ON_BN_CLICKED(IDC_HOUSE_ALLIES_REMOVE, &CHouseAllies::OnBnClickedHouseAlliesRemove)
END_MESSAGE_MAP()
void CHouseAllies::translateUI()
{
TranslateWindowCaption(*this, "HouseAlliesCaption");
TranslateDlgItem(*this, IDC_HOUSE_ALLIES_T_ENEMIES, "HouseAlliesEnemies");
TranslateDlgItem(*this, IDC_HOUSE_ALLIES_T_ALLIES, "HouseAlliesAllies");
SetDlgItemText(IDOK, GetLanguageStringACP("OK"));
SetDlgItemText(IDCANCEL, GetLanguageStringACP("Cancel"));
}
void CHouseAllies::updateAllyTexts()
{
m_allianceText.SetWindowText(INIHelper::Join(m_allies));
}
void CHouseAllies::OnBnClickedHouseAlliesAdd()
{
auto const selected = m_enemyList.GetCurSel();
if (selected < 0) {
return;
}
CString house;
m_enemyList.GetText(selected, house);
m_enemyList.DeleteString(selected);
m_allies.insert(house);
m_allyList.AddString(house);
updateAllyTexts();
}
void CHouseAllies::OnBnClickedHouseAlliesRemove()
{
auto const selected = m_allyList.GetCurSel();
if (selected < 0) {
return;
}
CString house;
m_allyList.GetText(selected, house);
m_allyList.DeleteString(selected);
m_allies.erase(house);
m_enemyList.AddString(house);
updateAllyTexts();
}

View file

@ -27,6 +27,37 @@
// Houses.h : Header-Datei
//
#include <set>
class CHouseAllies : public CDialog
{
public:
enum { IDD = IDD_HOUSES_ALLIES };
CHouseAllies(std::vector<CString>&& houses, const CString& allies, CWnd* pParent = NULL);
~CHouseAllies();
std::vector<CString> GetAllies() const;
private:
virtual BOOL OnInitDialog() override;
virtual void DoDataExchange(CDataExchange* pDX) override;
DECLARE_MESSAGE_MAP()
void translateUI();
void updateAllyTexts();
afx_msg void OnBnClickedHouseAlliesAdd();
afx_msg void OnBnClickedHouseAlliesRemove();
CListBox m_enemyList;
CListBox m_allyList;
CEdit m_allianceText;
std::vector<CString> m_allHouses;
std::set<CString> m_allies;
};
/////////////////////////////////////////////////////////////////////////////
// Dialogfeld CHouses
@ -65,12 +96,12 @@ public:
// Der Klassen-Assistent generiert virtuelle Funktionsüberschreibungen
//{{AFX_VIRTUAL(CHouses)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
virtual void PostNcDestroy();
virtual void DoDataExchange(CDataExchange* pDX) override; // DDX/DDV-Unterstützung
virtual void PostNcDestroy() override;
//}}AFX_VIRTUAL
// Implementierung
protected:
DECLARE_MESSAGE_MAP()
// Generierte Nachrichtenzuordnungsfunktionen
//{{AFX_MSG(CHouses)
virtual BOOL OnInitDialog();
@ -83,7 +114,6 @@ protected:
afx_msg void OnKillfocusEdge();
afx_msg void OnKillfocusSide();
afx_msg void OnKillfocusColor();
afx_msg void OnKillfocusAllies();
afx_msg void OnKillfocusCredits();
afx_msg void OnEditchangeActslike();
afx_msg void OnKillfocusNodecount();
@ -92,12 +122,12 @@ protected:
afx_msg void OnKillfocusPlayercontrol();
afx_msg void OnSelchangeHumanplayer();
afx_msg void OnSelchangeActslike();
afx_msg void OnSetfocusAllies();
afx_msg void OnBnClickedHousesChangeAllies();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.

View file

@ -80,4 +80,15 @@ public:
return ret;
}
template<typename TContainer>
static inline CString Join(const TContainer& strings, char ch = ',') {
CString ret;
for (auto const& item : strings) {
ret += item;
ret += ch;
}
ret.Delete(ret.GetLength() - 1, 1);
return ret;
}
};

View file

@ -550,10 +550,10 @@ BEGIN
EDITTEXT IDC_P5,155,78,65,12,ES_AUTOHSCROLL
END
IDD_HOUSES DIALOG 0, 0, 303, 207
IDD_HOUSES DIALOGEX 0, 0, 303, 207
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Houses"
FONT 8, "Tahoma"
FONT 8, "Tahoma", 0, 0, 0x0
BEGIN
LTEXT "DESC [quite long]",IDC_DESC,7,5,290,43
COMBOBOX IDC_HOUSES,77,65,220,125,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
@ -562,17 +562,17 @@ BEGIN
PUSHBUTTON "Standard houses",IDC_PREPAREHOUSES,75,82,70,15
PUSHBUTTON "Delete house",IDC_DELETEHOUSE,150,82,70,15
LTEXT "IQ:",IDC_LIQ,10,105,40,10
COMBOBOX IDC_IQ,55,105,70,70,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_IQ,64,105,70,70,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Edge:",IDC_LEDGE,10,120,40,10
COMBOBOX IDC_EDGE,55,120,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_EDGE,64,120,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Side",IDC_LSIDE,10,135,40,10
COMBOBOX IDC_SIDE,55,135,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_SIDE,64,134,70,65,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Color",IDC_LCOLOR,10,150,40,10
COMBOBOX IDC_COLOR,55,150,70,150,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Allies:",IDC_LALLIES,10,165,40,10
EDITTEXT IDC_ALLIES,55,165,70,12,ES_AUTOHSCROLL
LTEXT "Credits (x100):",IDC_LCREDITS,10,181,40,17
EDITTEXT IDC_CREDITS,55,179,70,12,ES_AUTOHSCROLL
COMBOBOX IDC_COLOR,64,149,70,150,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Allies:",IDC_LALLIES,7,179,40,10
EDITTEXT IDC_ALLIES,64,179,205,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "Credits (x100):",IDC_LCREDITS,7,164,60,15
EDITTEXT IDC_CREDITS,64,164,70,12,ES_AUTOHSCROLL
LTEXT "Acts like:",IDC_LACTSLIKE,150,105,69,14
COMBOBOX IDC_ACTSLIKE,227,105,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Nodecount:",IDC_LNODECOUNT,150,119,68,15
@ -581,11 +581,28 @@ BEGIN
COMBOBOX IDC_TECHLEVEL,227,135,70,135,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
LTEXT "Build activity (%):",IDC_LBUILDACTIVITY,150,150,66,17
COMBOBOX IDC_PERCENTBUILT,227,150,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Player control:",IDC_LPLAYERCONTROL,150,166,70,20
COMBOBOX IDC_PLAYERCONTROL,227,166,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Player control:",IDC_LPLAYERCONTROL,150,164,70,15
COMBOBOX IDC_PLAYERCONTROL,227,164,70,50,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Human Player:",IDC_LPLAYER,7,48,65,16
COMBOBOX IDC_HUMANPLAYER,77,49,220,70,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
GROUPBOX "",IDC_STATIC,6,98,293,102
PUSHBUTTON "...",IDC_HOUSES_CHANGE_ALLIES,271,179,26,14
END
IDD_HOUSES_ALLIES DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Alliance Editor"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,7,155,50,14
PUSHBUTTON "Cancel",IDCANCEL,252,155,50,14
LTEXT "Enemies",IDC_HOUSE_ALLIES_T_ENEMIES,7,7,28,13,SS_SUNKEN
LTEXT "Allies",IDC_HOUSE_ALLIES_T_ALLIES,281,7,21,11,SS_SUNKEN
LISTBOX IDC_HOUSE_LIST_ENEMIES,7,19,125,129,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
LISTBOX IDC_HOUSE_LIST_ALLIES,177,19,125,129,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "->",IDC_HOUSE_ALLIES_ADD,137,57,36,14
PUSHBUTTON "<-",IDC_HOUSE_ALLIES_REMOVE,137,78,36,14
EDITTEXT IDC_HOUSE_ALLIES_VALUES,69,155,167,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP,WS_EX_STATICEDGE
END
IDD_AIRCRAFT DIALOG 0, 0, 232, 130
@ -1789,6 +1806,19 @@ BEGIN
END
IDD_HOUSES, DIALOG
BEGIN
VERTGUIDE, 7
VERTGUIDE, 64
VERTGUIDE, 297
HORZGUIDE, 105
HORZGUIDE, 120
HORZGUIDE, 134
HORZGUIDE, 149
HORZGUIDE, 164
HORZGUIDE, 179
END
IDD_HOUSES_ALLIES, DIALOG
BEGIN
END
@ -3597,6 +3627,16 @@ BEGIN
0
END
IDD_HOUSES AFX_DIALOG_LAYOUT
BEGIN
0
END
IDD_HOUSES_ALLIES AFX_DIALOG_LAYOUT
BEGIN
0
END
/////////////////////////////////////////////////////////////////////////////
//

View file

@ -1300,8 +1300,8 @@ HousesIQ=IQ:
HousesEdge=地图边界:
HousesSide=所属:
HousesColor=颜色:
HousesAllies=同盟国:
HousesAlliesHelp=列出所有联盟国,如:GDI, Nod, Neutral
HousesAllies=盟友:
HousesAlliesHelp=列出所有联盟国,如:盟军,苏军,平民
HousesCredits=金钱(x100):
HousesActsLike=Acts like
HousesNodeCount=节点总计:
@ -1311,6 +1311,9 @@ HousesPlayerControl=游戏者控制:
HousesPrepareHouses=标准参战方
HousesAddHouse=新建参战方
HousesDeleteHouse=删除参战方
HouseAlliesCaption=敌我关系编辑器
HouseAlliesEnemies=敌对方
HouseAlliesAllies=友方
; loading dialog
LoadLoadRules=正在载入 rules ...

View file

@ -37,6 +37,7 @@
#define IDD_BUILDING 175
#define IDD_UNIT 176
#define IDD_HOUSES 177
#define IDD_HOUSES_ALLIES 178
#define IDD_AIRCRAFT 179
#define IDI_AIR 180
#define IDD_LOADING 181
@ -560,6 +561,16 @@
#define IDC_TASKFORCE_T_MEMBERS 1486
#define IDC_TASKFORCE_T_U_NUM 1487
#define IDC_TASKFORCE_T_U_TYPE 1488
#define IDC_HOUSES_CHANGE_ALLIES 1489
#define IDC_HOUSE_LIST_ENEMIES 1490
#define IDC_HOUSE_LIST_ALLIES 1491
#define IDC_HOUSE_ALLIES_ADD 1492
#define IDC_HOUSE_ALLIES_REMOVE 1493
#define IDC_EDIT2 1494
#define IDC_HOUSE_ALLIES_VALUES 1494
#define IDC_EDIT3 1495
#define IDC_HOUSE_ALLIES_T_ENEMIES 1496
#define IDC_HOUSE_ALLIES_T_ALLIES 1497
#define ID_FILE_OPENMAP 40001
#define ID_FILE_SAVEAS 40002
#define ID_FILE_QUIT 40003
@ -654,9 +665,9 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 302
#define _APS_NEXT_RESOURCE_VALUE 312
#define _APS_NEXT_COMMAND_VALUE 40144
#define _APS_NEXT_CONTROL_VALUE 1489
#define _APS_NEXT_CONTROL_VALUE 1498
#define _APS_NEXT_SYMED_VALUE 111
#endif
#endif