static void EvalMoves(hintdata * phd, evalcontext * pec) { GList *pl; cubeinfo ci; int *ai; GList *plSelList = MoveListGetSelectionList(phd); if (!plSelList) return; GetMatchStateCubeInfo(&ci, &ms); for (pl = plSelList; pl; pl = pl->next) { scoreData sd; sd.pm = MoveListGetMove(phd, pl); sd.pci = &ci; sd.pec = pec; if (RunAsyncProcess((AsyncFun) asyncScoreMove, &sd, _("Evaluating positions...")) != 0) { MoveListFreeSelectionList(plSelList); return; } /* Calling RefreshMoveList here requires some extra work, as * it may reorder moves */ MoveListUpdate(phd); } MoveListFreeSelectionList(plSelList); MoveListClearSelection(0, 0, phd); ai = (int *) malloc(phd->pml->cMoves * sizeof(int)); RefreshMoveList(phd->pml, ai); if (phd->piHighlight && phd->pml->cMoves) *phd->piHighlight = ai[*phd->piHighlight]; free(ai); find_skills(phd->pmr, &ms, -1, -1); MoveListUpdate(phd); if (phd->hist) { SetAnnotation(pmrCurAnn); ChangeGame(NULL); } }
extern void MoveListRefreshSize(void) { custom_cell_renderer_invalidate_size(); if (pwMoveAnalysis) { hintdata *phd = (hintdata *)g_object_get_data(G_OBJECT(pwMoveAnalysis), "user_data"); MoveListUpdate(phd); } }
static void MoveListMWC(GtkWidget * pw, hintdata * phd) { char sz[80]; int f = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pw)); if (f != fOutputMWC) { sprintf(sz, "set output mwc %s", fOutputMWC ? "off" : "on"); UserCommand(sz); UserCommand("save settings"); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pw), fOutputMWC); /* Make sure display is up to date */ MoveListUpdate(phd); SetAnnotation(pmrCurAnn); }
static void MoveListCmarkClicked(GtkWidget * UNUSED(pw), hintdata * phd) { guint new_mark; guint all_marked = TRUE; GList *pl; GList *plSelList = MoveListGetSelectionList(phd); if (!plSelList) return; for (pl = plSelList; pl; pl = pl->next) { move *m = MoveListGetMove(phd, pl); if (m->cmark == CMARK_NONE) all_marked = FALSE; } new_mark = all_marked ? 0 : 1; for (pl = plSelList; pl; pl = pl->next) { move *m = MoveListGetMove(phd, pl); m->cmark = new_mark; } MoveListFreeSelectionList(plSelList); MoveListUpdate(phd); }
extern void MoveListCreate(hintdata *phd) { static const char *aszTitleDetails[] = { N_("Rank"), N_("Type"), N_("Win"), N_("W g"), N_("W bg"), N_("Lose"), N_("L g"), N_("L bg"), NULL, N_("Diff."), N_("Move") }; unsigned int i; int showWLTree = showMoveListDetail && !phd->fDetails; /* Create list widget */ GtkListStore *store; GtkTreeIter iter; GtkTreeSelection* sel; GtkWidget *view = gtk_tree_view_new(); int offset = (phd->fDetails) ? 0 : MIN_COLUMN_COUNT - DETAIL_COLUMN_COUNT; if (showWLTree) { GtkStyle *psDefault = gtk_widget_get_style(view); GtkCellRenderer *renderer = custom_cell_renderer_movelist_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_RANK], renderer, "movelist", 0, "rank", 1, NULL); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); g_object_set(renderer, "cell-background-gdk", &psDefault->bg[GTK_STATE_NORMAL], "cell-background-set", TRUE, NULL); g_object_set_data(G_OBJECT(view), "hintdata", phd); } else { GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); g_object_set(renderer, "ypad", 0, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_RANK], renderer, "text", ML_COL_RANK, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_TYPE], renderer, "text", ML_COL_TYPE, "foreground", ML_COL_FGCOL + offset, NULL); if (phd->fDetails) { gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_WIN], renderer, "text", ML_COL_WIN, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_GWIN], renderer, "text", ML_COL_GWIN, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_BGWIN], renderer, "text", ML_COL_BGWIN, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_LOSS], renderer, "text", ML_COL_LOSS, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_GLOSS], renderer, "text", ML_COL_GLOSS, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_BGLOSS], renderer, "text", ML_COL_BGLOSS, "foreground", ML_COL_FGCOL + offset, NULL); } gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_EQUITY], renderer, "text", ML_COL_EQUITY + offset, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_DIFF], renderer, "text", ML_COL_DIFF + offset, "foreground", ML_COL_FGCOL + offset, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, aszTitleDetails[ML_COL_MOVE], renderer, "text", ML_COL_MOVE + offset, "foreground", ML_COL_FGCOL + offset, NULL); } phd->pwMoves = view; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE); g_signal_connect(view, "row-activated", G_CALLBACK(HintDoubleClick), phd); g_signal_connect(sel, "changed", G_CALLBACK(HintSelect), phd); /* Add empty rows */ if (phd->fDetails) store = gtk_list_store_new(DETAIL_COLUMN_COUNT + 2, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); else { if (showWLTree) store = gtk_list_store_new(2, G_TYPE_POINTER, G_TYPE_INT); else store = gtk_list_store_new(MIN_COLUMN_COUNT + 2, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); } for (i = 0; i < phd->pml->cMoves; i++) gtk_list_store_append(store, &iter); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); MoveListUpdate(phd); }
static void MoveListRolloutClicked(GtkWidget * pw, hintdata * phd) { cubeinfo ci; int i, c, res; move *m; int *ai; void *p; GList *pl, *plSelList = MoveListGetSelectionList(phd); if (!plSelList) return; GetMatchStateCubeInfo(&ci, &ms); c = g_list_length(plSelList); /* setup rollout dialog */ { move **ppm = (move **) malloc(c * sizeof(move *)); cubeinfo **ppci = (cubeinfo **) malloc(c * sizeof(cubeinfo *)); char (*asz)[40] = (char (*)[40]) malloc(40 * c); for (i = 0, pl = plSelList; i < c; pl = pl->next, i++) { m = ppm[i] = MoveListGetMove(phd, pl); ppci[i] = &ci; FormatMove(asz[i], msBoard(), m->anMove); } MoveListFreeSelectionList(plSelList); GTKSetCurrentParent(pw); RolloutProgressStart(&ci, c, NULL, &rcRollout, asz, FALSE, &p); res = ScoreMoveRollout(ppm, (const cubeinfo **) ppci, c, RolloutProgress, p); RolloutProgressEnd(&p, FALSE); free(asz); free(ppm); free(ppci); if (res < 0) return; /* If the source widget parent has been destroyed do not attempt * to update the hint window */ if (!GDK_IS_WINDOW(gtk_widget_get_parent_window(pw))) return; /* Calling RefreshMoveList here requires some extra work, as * it may reorder moves */ MoveListUpdate(phd); } MoveListClearSelection(0, 0, phd); ai = (int *) malloc(phd->pml->cMoves * sizeof(int)); RefreshMoveList(phd->pml, ai); if (phd->piHighlight && phd->pml->cMoves) *phd->piHighlight = ai[*phd->piHighlight]; free(ai); find_skills(phd->pmr, &ms, -1, -1); MoveListUpdate(phd); if (phd->hist) { SetAnnotation(pmrCurAnn); ChangeGame(NULL); } }