/* * Evaluation graph * * Author: Alessandro Scotti (Dec 2005) * Translated to X by H.G.Muller (Nov 2009) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014, 2015, * 2016 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include "common.h" #include "backend.h" #include "dialogs.h" #include "menus.h" #include "evalgraph.h" #include "draw.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif static char *title[2] = { N_("Evaluation graph"), N_("Blunder graph") }; Option *disp; /* Module variables */ static Option *EvalCallback P((int button, int x, int y)); static int initDone = FALSE; static void InitializeEvalGraph (Option *opt, int w, int h) { nWidthPB = w, nHeightPB = h; initDone = TRUE; } // The following stuff is really back-end (but too little to bother with a separate file) static void EvalClick (int x, int y) { int index = GetMoveIndexFromPoint( x, y ); if( index >= 0 && index < currLast ) ToNrEvent( index + 1 ); } static Option graphOptions[] = { { 150, 0x9C, 300, NULL, (void*) &EvalCallback, NULL, NULL, Graph , "" }, { 0, 2, 0, NULL, NULL, "", NULL, EndMark , "" } }; static void DisplayEvalGraph () { // back-end painting; calls back front-end primitives for lines, rectangles and text char *t = MakeEvalTitle(_(title[differentialView])); nWidthPB = disp->max; nHeightPB = disp->value; if(t != title[differentialView] && nWidthPB < 340) t = MakeEvalTitle(nWidthPB < 240 ? "" : differentialView ? _("Blunder") : _("Eval")); PaintEvalGraph(); GraphExpose(graphOptions, 0, 0, nWidthPB, nHeightPB); SetDialogTitle(EvalGraphDlg, t); } static Option * EvalCallback (int button, int x, int y) { int dir = appData.zoom + 1; if(!initDone) return NULL; switch(button) { case 3: dir = 0; differentialView = !differentialView; case 4: dir -= 2; case 5: if(dir > 0) appData.zoom = dir; case 10: // expose event /* Create or recreate paint box if needed */ if(x != nWidthPB || y != nHeightPB) { InitializeEvalGraph(&graphOptions[0], x, y); } nWidthPB = x; nHeightPB = y; DisplayEvalGraph(); break; case 1: EvalClick(x, y); // left button default: break; // other buttons ignored } return NULL; // no context menu! } void EvalGraphPopUp () { if (GenericPopUp(graphOptions, _(title[differentialView]), EvalGraphDlg, BoardWindow, NONMODAL, appData.topLevel)) { InitializeEvalGraph(&graphOptions[0], wpEvalGraph.width, wpEvalGraph.height); // first time: add callbacks and initialize pens disp = graphOptions; } else { SetDialogTitle(EvalGraphDlg, _(title[differentialView])); SetIconName(EvalGraphDlg, _(title[differentialView])); } MarkMenu("View.EvaluationGraph", EvalGraphDlg); // ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output } void EvalGraphPopDown () { PopDown(EvalGraphDlg); // ShowThinkingEvent(); // [HGM] thinking: might need to shut off thinking output } Boolean EvalGraphIsUp () { return shellUp[EvalGraphDlg]; } int EvalGraphDialogExists () { return DialogExists(EvalGraphDlg); } void EvalGraphProc () { if (!PopDown(EvalGraphDlg)) EvalGraphPopUp(); } // This function is the interface to the back-end. void EvalGraphSet (int first, int last, int current, ChessProgramStats_Move * pvInfo) { /* [AS] Danger! For now we rely on the pvInfo parameter being a static variable! */ currFirst = first; currLast = last; currCurrent = current; currPvInfo = pvInfo; if( DialogExists(EvalGraphDlg) ) { DisplayEvalGraph(); } }