From bc72fe0bf97a02ce30add62fd0275bca4a6ee11d Mon Sep 17 00:00:00 2001 From: H.G.Muller Date: Mon, 30 Oct 2017 18:11:24 +0100 Subject: [PATCH] Redesign WinBoard Load Engine dialog The checkboxes for protocol choice are replaced by a combobox, which also contains an autodetect option. This is encoded through the kludge of setting isUCI = 3. The fields that do not usually have to be specified are now put in group boxes, which make it more clear the user can ignore them. For this a ew control type GroupBox had to be defined, and supported in the GenericPopup. --- backend.c | 2 +- backend.h | 2 +- winboard/wsettings.c | 33 +++++++++++++++++++++------------ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/backend.c b/backend.c index e5c7f72..7358f4a 100644 --- a/backend.c +++ b/backend.c @@ -1060,13 +1060,13 @@ Load (ChessProgramState *cps, int i) } if(jar) { snprintf(buf3, MSG_SIZ, "java -jar %s", p); p = buf3; } ASSIGN(appData.chessProgram[i], p); + if(isUCI == 3) tryNr = 1, isUCI = 0; // auto-detect appData.isUCI[i] = isUCI; appData.protocolVersion[i] = v1 ? 1 : PROTOVER; appData.hasOwnBookUCI[i] = hasBook; if(!nickName[0]) useNick = FALSE; if(useNick) ASSIGN(appData.pgnName[i], nickName); safeStrCpy(newEngineCommand, p, MSG_SIZ); - tryNr = 1; ReplaceEngine(cps, i); } diff --git a/backend.h b/backend.h index befa893..2fbae11 100644 --- a/backend.h +++ b/backend.h @@ -297,7 +297,7 @@ int Explode P((Board board, int fromX, int fromY, int toX, int toY)); typedef enum { CheckBox, ComboBox, TextBox, Button, Spin, ResetButton, SaveButton, ListBox, Graph, PopUp, FileName, PathName, Slider, Message, Fractional, Label, Icon, - BoxBegin, BoxEnd, BarBegin, BarEnd, DropDown, Break, EndMark, Skip } Control; + BoxBegin, BoxEnd, BarBegin, BarEnd, DropDown, Break, GroupBox, EndMark, Skip } Control; typedef struct XB_OPT { // [HGM] options: descriptor of UCI-style option int value; // current setting, starts as default diff --git a/winboard/wsettings.c b/winboard/wsettings.c index 04957e7..b65566c 100644 --- a/winboard/wsettings.c +++ b/winboard/wsettings.c @@ -57,7 +57,7 @@ int groupNameList[2*MAX_OPTIONS]; int breaks[MAX_OPTIONS]; int checks, combos, buttons, layout, groups; char title[MSG_SIZ]; -char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params; +char *engineName, *engineDir, *protocolChoice, *engineLine, *nickName, *params; Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick, isUCCI; extern Option installOptions[], matchOptions[]; char *engineList[MAXENGINES] = {""}, *engineMnemonic[MAXENGINES] = {""}; @@ -141,6 +141,7 @@ LayoutOptions(int firstOption, int endOption, char *groupName, Option *optionLis case PathName: case Slider: case Label: + case GroupBox: case Spin: stop++; default: case Message: ; // cannot happen @@ -241,6 +242,7 @@ DesignOptionDialog(int nrOpt, Option *optionList) // look if we hit a group of options having names that start with the same word int groupSize = 1, groupNameLength = 50; sscanf(optionList[k].name, "%s", buf); // get first word of option name + if(optionList[k].type == GroupBox) groupSize = optionList[k].max, groupNameLength = -strlen(optionList[k].name), groupNameList[groups+1] = k; else while(k + groupSize < nrOpt && strstr(optionList[k+groupSize].name, buf) == optionList[k+groupSize].name) { int j; @@ -255,6 +257,7 @@ DesignOptionDialog(int nrOpt, Option *optionList) LayoutOptions(n, k, "", optionList); // flush all solitary options appearing before the group groupNameList[groups] = groupNameLength; boxList[groups++] = layout; // group start in even entries + if(groupNameLength <= 0) n = ++k; LayoutOptions(k, k+groupSize, buf, optionList); // flush the group boxList[groups++] = layout; // group end in odd entries k = n = k + groupSize; @@ -372,6 +375,7 @@ SetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList) if(layoutList[k] < 0) continue; for(p=0; p 0) { + if(!cps && new >= 0) { if(*(char**)optionList[j].target) free(*(char**)optionList[j].target); *(char**)optionList[j].target = strdup(optionList[j].choice[new]); break; @@ -640,7 +644,7 @@ CreateDialogTemplate(int *layoutList, int nr, Option *optionList) template.header.cdit = 0; template.header.cx = 307; buttonRows = (buttons + 1 + 3)/4; // 4 per row, rounded up - if(nr > 50) { + if(nr > 48) { breakPoint = (nr+2*buttonRows+1)/2 & ~1; template.header.cx = 625; } @@ -648,10 +652,11 @@ CreateDialogTemplate(int *layoutList, int nr, Option *optionList) for(ii=0; ii>1)-2, 301, 13*(boxList[k+1]-boxList[k]>>1)+8, 0x0082, WS_VISIBLE | WS_CHILD | SS_BLACKFRAME, 2400); - AddControl(x+60, y+13*(i>>1)-6, 10*groupNameList[k]/3, 10, + AddControl(x+60, y+13*(i>>1)-6, 10*tlen/3, 10, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, 2*(ii+MAX_OPTIONS)); } j = layoutList[i]; @@ -715,11 +720,16 @@ RefreshSettingsDialog (ChessProgramState *cps, int val) int EnterGroup P((HWND hDlg)); static int engineNr, selected; +char *protocols[] = { "autodetect", "WB", "UCI", "USI/UCCI", "WB v1", NULL }; int InstallOK() { if(selected >= 0) { ASSIGN(engineLine, engineList[selected]); } if(engineLine[0] == '#') { DisplayError(_("Select single engine from the group"), 0); return 0; } + if(!strcmp(protocolChoice, protocols[0])) isUCI = 3; else + if(!strcmp(protocolChoice, protocols[2])) isUCI = 1; else + if(!strcmp(protocolChoice, protocols[3])) isUCCI = 1; else + if(!strcmp(protocolChoice, protocols[4])) v1 = 1; if(isUCCI) isUCI = 2; if(!engineNr) Load(&first, 0); else Load(&second, 1); return 1; @@ -729,19 +739,19 @@ Option installOptions[] = { // { 0, 0, 0, NULL, (void*) &engineLine, (char*) engineMnemonic, engineList, ComboBox, N_("Select engine from list:") }, { 195, 14, 0, NULL, (void*) &EnterGroup, (char*) &selected, engineMnemonic, ListBox, N_("Select engine from list:") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("or specify one below:") }, + { 0, 0, 32+3, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine (.exe or .jar):") }, + { 0, 0, 5, NULL, (void*) &protocolChoice, (char*) protocols, protocols, ComboBox, N_("Engine protocol") }, + { 0, 0, 5, NULL, NULL, NULL, NULL, GroupBox, N_("Optional user preferences") }, { 0, 0, 0, NULL, (void*) &nickName, NULL, NULL, TextBox, N_("Nickname (optional):") }, + { 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") }, + { 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") }, { 0, 0, 0, NULL, (void*) &useNick, NULL, NULL, CheckBox, N_("Use nickname in PGN tag") }, - { 0, 0, 32+3, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine (.exe or .jar):") }, + { 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") }, + { 0, 0, 4, NULL, NULL, NULL, NULL, GroupBox, N_("Advanced (special cases only, as per engine README file)") }, { 0, 0, 0, NULL, (void*) ¶ms, NULL, NULL, TextBox, N_("command-line parameters:") }, { 0, 0, 0, NULL, (void*) &wbOptions, NULL, NULL, TextBox, N_("Special WinBoard options:") }, { 0, 0, 0, NULL, (void*) &engineDir, NULL, NULL, PathName, N_("directory:") }, { 95, 0, 0, NULL, NULL, NULL, NULL, Label, N_("(Directory will be derived from engine path when left empty)") }, - { 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") }, - { 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") }, - { 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") }, - { 0, 0, 0, NULL, (void*) &isUCI, NULL, NULL, CheckBox, N_("UCI") }, - { 0, 0, 0, NULL, (void*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (skip waiting for features)") }, - { 0, 0, 0, NULL, (void*) &isUCCI, NULL, NULL, CheckBox, N_("UCCI/USI/Arena960 (through /uxiAdapter)") }, { 0, 1, 0, NULL, (void*) &InstallOK, "", NULL, EndMark , "" } }; @@ -790,7 +800,6 @@ EnterGroup(HWND hDlg) void LoadEnginePopUp(HWND hwnd, int nr) { - if(*engineListFile) ParseSettingsFile(engineListFile, &engineListFile); // contains engine list isUCI = isUCCI = storeVariant = v1 = useNick = FALSE; addToList = hasBook = TRUE; // defaults engineNr = nr; if(engineDir) free(engineDir); engineDir = strdup(""); -- 1.7.0.4