(from <Someone>)

The patch that deals with tabs is attached. I also fixed bug when the
program won't quit if Quit option is selected in the player selection
dialog.
This commit is contained in:
nethack.allison
2002-02-07 05:42:31 +00:00
parent 4b364d6927
commit 562d7855a7
2 changed files with 77 additions and 37 deletions

View File

@@ -10,6 +10,7 @@
#define MENU_MARGIN 0 #define MENU_MARGIN 0
#define NHMENU_STR_SIZE BUFSZ #define NHMENU_STR_SIZE BUFSZ
#define MIN_TABSTOP_SIZE 8
typedef struct mswin_menu_item { typedef struct mswin_menu_item {
int glyph; int glyph;
@@ -35,6 +36,7 @@ typedef struct mswin_nethack_menu_window {
char gacc[QBUFSZ]; /* group accelerators */ char gacc[QBUFSZ]; /* group accelerators */
BOOL counting; /* counting flag */ BOOL counting; /* counting flag */
char prompt[QBUFSZ]; /* menu prompt */ char prompt[QBUFSZ]; /* menu prompt */
int tab_stop_size; /* for options menu we use tabstops to align option values */
} menu; } menu;
struct menu_text { struct menu_text {
@@ -71,6 +73,7 @@ static void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int coun
static void reset_menu_count(HWND hwndList, PNHMenuWindow data); static void reset_menu_count(HWND hwndList, PNHMenuWindow data);
static BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch); static BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch);
/*-----------------------------------------------------------------------------*/
HWND mswin_init_menu_window (int type) { HWND mswin_init_menu_window (int type) {
HWND ret; HWND ret;
@@ -87,8 +90,7 @@ HWND mswin_init_menu_window (int type) {
SetMenuType(ret, type); SetMenuType(ret, type);
return ret; return ret;
} }
/*-----------------------------------------------------------------------------*/
int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected) int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
{ {
MSG msg; MSG msg;
@@ -219,7 +221,7 @@ int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
return ret_val; return ret_val;
} }
/*-----------------------------------------------------------------------------*/
BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
PNHMenuWindow data; PNHMenuWindow data;
@@ -405,7 +407,7 @@ BOOL CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
} }
return FALSE; return FALSE;
} }
/*-----------------------------------------------------------------------------*/
void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
PNHMenuWindow data; PNHMenuWindow data;
@@ -451,11 +453,14 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
data->menu.allocated = 0; data->menu.allocated = 0;
data->done = 0; data->done = 0;
data->result = 0; data->result = 0;
data->menu.tab_stop_size = MIN_TABSTOP_SIZE;
break; break;
case MSNH_MSG_ADDMENU: case MSNH_MSG_ADDMENU:
{ {
PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam; PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam;
char *p, *p1;
int new_item;
if( data->type!=MENU_TYPE_MENU ) break; if( data->type!=MENU_TYPE_MENU ) break;
if( strlen(msg_data->str)==0 ) break; if( strlen(msg_data->str)==0 ) break;
@@ -465,15 +470,27 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
data->menu.items = (PNHMenuItem)realloc(data->menu.items, data->menu.allocated*sizeof(NHMenuItem)); data->menu.items = (PNHMenuItem)realloc(data->menu.items, data->menu.allocated*sizeof(NHMenuItem));
} }
ZeroMemory( &data->menu.items[data->menu.size], sizeof(data->menu.items[data->menu.size])); new_item = data->menu.size;
data->menu.items[data->menu.size].glyph = msg_data->glyph; ZeroMemory( &data->menu.items[new_item], sizeof(data->menu.items[new_item]));
data->menu.items[data->menu.size].identifier = *msg_data->identifier; data->menu.items[new_item].glyph = msg_data->glyph;
data->menu.items[data->menu.size].accelerator = msg_data->accelerator; data->menu.items[new_item].identifier = *msg_data->identifier;
data->menu.items[data->menu.size].group_accel = msg_data->group_accel; data->menu.items[new_item].accelerator = msg_data->accelerator;
data->menu.items[data->menu.size].attr = msg_data->attr; data->menu.items[new_item].group_accel = msg_data->group_accel;
strncpy(data->menu.items[data->menu.size].str, msg_data->str, NHMENU_STR_SIZE); data->menu.items[new_item].attr = msg_data->attr;
data->menu.items[data->menu.size].presel = msg_data->presel; strncpy(data->menu.items[new_item].str, msg_data->str, NHMENU_STR_SIZE);
data->menu.items[new_item].presel = msg_data->presel;
/* calculate tabstop size */
p1 = data->menu.items[new_item].str;
p = strchr(data->menu.items[new_item].str, '\t');
while( p ) {
data->menu.tab_stop_size =
max( data->menu.tab_stop_size, p - p1 );
p1 = p;
p = strchr(p+1, '\t');
}
/* increment size */
data->menu.size++; data->menu.size++;
} break; } break;
@@ -489,7 +506,7 @@ void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
} }
} }
/*-----------------------------------------------------------------------------*/
void LayoutMenu(HWND hWnd) void LayoutMenu(HWND hWnd)
{ {
PNHMenuWindow data; PNHMenuWindow data;
@@ -528,7 +545,7 @@ void LayoutMenu(HWND hWnd)
MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE ); MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE ); MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE );
} }
/*-----------------------------------------------------------------------------*/
void SetMenuType(HWND hWnd, int type) void SetMenuType(HWND hWnd, int type)
{ {
PNHMenuWindow data; PNHMenuWindow data;
@@ -555,7 +572,7 @@ void SetMenuType(HWND hWnd, int type)
} }
LayoutMenu(hWnd); LayoutMenu(hWnd);
} }
/*-----------------------------------------------------------------------------*/
void SetMenuListType(HWND hWnd, int how) void SetMenuListType(HWND hWnd, int how)
{ {
PNHMenuWindow data; PNHMenuWindow data;
@@ -645,8 +662,7 @@ void SetMenuListType(HWND hWnd, int how)
} }
SetFocus(control); SetFocus(control);
} }
/*-----------------------------------------------------------------------------*/
HWND GetMenuControl(HWND hWnd) HWND GetMenuControl(HWND hWnd)
{ {
PNHMenuWindow data; PNHMenuWindow data;
@@ -659,8 +675,7 @@ HWND GetMenuControl(HWND hWnd)
return GetDlgItem(hWnd, IDC_MENU_LIST); return GetDlgItem(hWnd, IDC_MENU_LIST);
} }
} }
/*-----------------------------------------------------------------------------*/
BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
LPMEASUREITEMSTRUCT lpmis; LPMEASUREITEMSTRUCT lpmis;
@@ -686,7 +701,7 @@ BOOL onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
ReleaseDC(GetMenuControl(hWnd), hdc); ReleaseDC(GetMenuControl(hWnd), hdc);
return TRUE; return TRUE;
} }
/*-----------------------------------------------------------------------------*/
BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam) BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
LPDRAWITEMSTRUCT lpdis; LPDRAWITEMSTRUCT lpdis;
@@ -700,6 +715,7 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
int x, y; int x, y;
TCHAR wbuf[BUFSZ]; TCHAR wbuf[BUFSZ];
RECT drawRect; RECT drawRect;
DRAWTEXTPARAMS dtp;
lpdis = (LPDRAWITEMSTRUCT) lParam; lpdis = (LPDRAWITEMSTRUCT) lParam;
@@ -739,8 +755,10 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom ); SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
} }
x += tm.tmAveCharWidth + 5; x += tm.tmAveCharWidth + tm.tmOverhang + 5;
SelectObject(tileDC, saveBmp); SelectObject(tileDC, saveBmp);
} else {
x += TILE_X + tm.tmAveCharWidth + tm.tmOverhang + 10;
} }
/* print glyph if present */ /* print glyph if present */
@@ -762,12 +780,18 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
x += TILE_X + 5; x += TILE_X + 5;
/* draw item text */
SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom ); SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
DrawText(lpdis->hDC,
NH_A2W(item->str, wbuf, BUFSZ), ZeroMemory(&dtp, sizeof(dtp));
strlen(item->str), dtp.cbSize = sizeof(dtp);
&drawRect, dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size);
DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX DrawTextEx(lpdis->hDC,
NH_A2W(item->str, wbuf, BUFSZ),
strlen(item->str),
&drawRect,
DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP,
&dtp
); );
/* draw focused item */ /* draw focused item */
@@ -812,7 +836,7 @@ BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
DeleteDC(tileDC); DeleteDC(tileDC);
return TRUE; return TRUE;
} }
/*-----------------------------------------------------------------------------*/
BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch) BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
{ {
int i = 0; int i = 0;
@@ -1079,7 +1103,7 @@ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch)
reset_menu_count(hwndList, data); reset_menu_count(hwndList, data);
return -1; return -1;
} }
/*-----------------------------------------------------------------------------*/
void mswin_menu_window_size (HWND hWnd, LPSIZE sz) void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
{ {
TEXTMETRIC tm; TEXTMETRIC tm;
@@ -1089,6 +1113,7 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
PNHMenuWindow data; PNHMenuWindow data;
int i; int i;
RECT rt; RECT rt;
TCHAR wbuf[BUFSZ];
GetClientRect(hWnd, &rt); GetClientRect(hWnd, &rt);
sz->cx = rt.right - rt.left; sz->cx = rt.right - rt.left;
@@ -1100,15 +1125,31 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
hdc = GetDC(control); hdc = GetDC(control);
if( data->type==MENU_TYPE_MENU ) { if( data->type==MENU_TYPE_MENU ) {
/* Set the height of the list box items. */ /* Calculate the width of the list box. */
saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE)); saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
GetTextMetrics(hdc, &tm); GetTextMetrics(hdc, &tm);
for(i=0; i<data->menu.size; i++ ) { for(i=0; i<data->menu.size; i++ ) {
DRAWTEXTPARAMS dtp;
RECT drawRect;
SetRect(&drawRect, 0, 0, 1, 1);
ZeroMemory(&dtp, sizeof(dtp));
dtp.cbSize = sizeof(dtp);
dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size);
DrawTextEx(hdc,
NH_A2W(data->menu.items[i].str, wbuf, BUFSZ),
strlen(data->menu.items[i].str),
&drawRect,
DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP,
&dtp
);
sz->cx = max(sz->cx, sz->cx = max(sz->cx,
(LONG)(2*TILE_X + tm.tmAveCharWidth*(strlen(data->menu.items[i].str)+12) + tm.tmOverhang)); (LONG)(2*TILE_X + (drawRect.right - drawRect.left) + tm.tmAveCharWidth*12 + tm.tmOverhang));
} }
SelectObject(hdc, saveFont); SelectObject(hdc, saveFont);
} else { } else {
/* Calculate the width of the text box. */
RECT text_rt; RECT text_rt;
saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE)); saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
GetTextMetrics(hdc, &tm); GetTextMetrics(hdc, &tm);
@@ -1122,7 +1163,7 @@ void mswin_menu_window_size (HWND hWnd, LPSIZE sz)
ReleaseDC(control, hdc); ReleaseDC(control, hdc);
} }
} }
/*-----------------------------------------------------------------------------*/
void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count) void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count)
{ {
int i; int i;
@@ -1141,7 +1182,7 @@ void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count)
ListView_RedrawItems( hwndList, item, item ); ListView_RedrawItems( hwndList, item, item );
reset_menu_count(hwndList, data); reset_menu_count(hwndList, data);
} }
/*-----------------------------------------------------------------------------*/
void reset_menu_count(HWND hwndList, PNHMenuWindow data) void reset_menu_count(HWND hwndList, PNHMenuWindow data)
{ {
int i; int i;
@@ -1151,7 +1192,7 @@ void reset_menu_count(HWND hwndList, PNHMenuWindow data)
if( i>=0 ) ListView_RedrawItems( hwndList, i, i ); if( i>=0 ) ListView_RedrawItems( hwndList, i, i );
} }
} }
/*-----------------------------------------------------------------------------*/
/* List window Proc */ /* List window Proc */
LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
@@ -1203,7 +1244,7 @@ LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
else else
return 0; return 0;
} }
/*-----------------------------------------------------------------------------*/
/* Text control window proc - implements close on space */ /* Text control window proc - implements close on space */
LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
@@ -1223,4 +1264,4 @@ LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
else else
return 0; return 0;
} }
/*-----------------------------------------------------------------------------*/

View File

@@ -133,8 +133,7 @@ void mswin_player_selection(void)
/* select a role */ /* select a role */
if( mswin_player_selection_window( &nRole ) == IDCANCEL ) { if( mswin_player_selection_window( &nRole ) == IDCANCEL ) {
clearlocks(); bail(0);
mswin_exit_nhwindows(0);
} }
} }