ultimatepp/uppdev/VegaTeam5/ImproveColors.cpp
cxl 3cd394812c Merge continued
git-svn-id: svn://ultimatepp.org/upp/trunk@10263 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2016-10-04 08:34:39 +00:00

608 lines
18 KiB
C++

#include "VegaMain.h"
#include "Tournament.h"
#include "SwissUSCF.h"
extern int CanPlayWith(int player1, int player2, int round);
//============= Aris ScrollArea ===========================
//====== can move to your lib ScrollArea.h ================
/*class ScrollArea : public StaticRect {
public:
ScrollBars sc;
StaticRect work;
void SetWorkSize(Size sz);
virtual void Scroll();
typedef ScrollArea CLASSNAME;
ScrollArea();
~ScrollArea() {;}
};
*/
//====== can move to your lib ScrollArea.cpp ================
void ScrollArea::Scroll()
{
Size ws = work.GetSize(); // WhenResize callback is needed?! or?...
work.SetRect(-sc.x, -sc.y, ws.cx, ws.cy);
}
void ScrollArea::SetWorkSize(Size ws)
{
work.SetRect(0,0,ws.cx,ws.cy);
sc.SetTotal(ws.cx,ws.cy); //can be adjusted depending on GetRect...
sc.SetPage(100,100); //can be calculated... let's keep for a while
}
ScrollArea::ScrollArea()
{
SetWorkSize(Size(500,1000));
AddFrame(sc);
Add(work);
//sc.HideX(); //
// sc.HideY(); // ADDED uncomment to hide...
sc.WhenScroll=THISBACK(Scroll);
// AddFrame(ThinOutsetFrame());
AddFrame(ThinInsetFrame());
}
/*
class ImageButton : public Button {
private:
int align;
public:
ImageButton() {align = ALIGN_CENTER; }; //default alignment is center
virtual void Paint(Draw& draw);
//void SetAlignment(int _align) {align = _align;}; //method to set the Alignment
void SetAlignment(int _align) {align=_align; Refresh();};
int GetAlignment() {return align;}; //method to get the alignment
};
void ImageButton::Paint(Draw& w)
{
Size sz = GetSize(); //this is the beginning of the original Paint method
bool ds = !IsShowEnabled();
DrawLabel dl;
///////////////////
dl.align = align; //this is the only line to be added
///////////////////
dl.text = label;
dl.font = Nvl(font, ButtonFont());
dl.limg = img;
dl.disabled = ds;
dl.lspc = !label.IsEmpty() && !img.IsEmpty() ? 4 : 0;
if(VisibleAccessKeys())
dl.accesskey = accesskey;
if(monoimg)
dl.lcolor = SColorText;
Value (*st)(int) = look;
if(look == ButtonLook) {
if(InFrame())
st = EdgeButtonLook;
if(type == OK)
st = OkButtonLook;
}
int i = GetVisualState();
ChPaint(w, sz, (*st)(i));
dl.ink = ButtonTextColor(i);
if(monoimg)
dl.lcolor = ButtonMonoColor(i);
int m = IsPush() && ButtonPressOffsetFlag();
dl.Paint(w, 3 + m, 3 + m, sz.cx - 6, sz.cy - 6);
};
*/
/*
enum {WY=0, WN, BY, BN, NG};
class ColoredRow : public WithRowLayout<ParentCtrl> {
public:
int wid, bid, board;
int wrtg, brtg;
float wscr, bscr;
int wflag, bflag;
typedef ColoredRow CLASSNAME;
ColoredRow();
void Set(int board, int wid, int bid, int wrtg, int brtg, float wscr, float bscr, int wflag, int bflag);
void SetSide(int side, int id, int rtg, float scr, int flag);
void GetSide(int side, int& id, int& rtg, float& scr, int& flag);
};
*/
ColoredRow::ColoredRow()
{
CtrlLayout(*this);
rect.Color(White);
wid = bid = board = 0;
wimg.SetImage(Vega5Img::whiteY());
bimg.SetImage(Vega5Img::blackN());
}
void ColoredRow::Set(int indexboard, int whiteid, int blackid, int whitertg, int blackrtg,
float whitescr, float blackscr, int whiteflag, int blackflag)
{ board = indexboard;
wid = whiteid;
bid = blackid;
wrtg = whitertg;
brtg = blackrtg;
wscr = whitescr;
bscr = blackscr;
wflag = whiteflag;
bflag = blackflag;
lblBoard.SetLabel(AsString(board));
lblwrtg.SetLabel(AsString(wrtg));
lblbrtg.SetLabel(AsString(brtg));
lblwscr.SetLabel(AsString(wscr));
lblbscr.SetLabel(AsString(bscr));
btnwid.SetLabel(AsString(wid));
btnbid.SetLabel(AsString(bid));
switch (wflag) {
case WY: wimg.SetImage(Vega5Img::whiteY());
break;
case WN: wimg.SetImage(Vega5Img::whiteN());
break;
case BY: wimg.SetImage(Vega5Img::blackY());
break;
case BN: wimg.SetImage(Vega5Img::blackN());
break;
case NG: wimg.SetImage(Vega5Img::neutral());
break;
}
switch (bflag) {
case WY: bimg.SetImage(Vega5Img::whiteY());
break;
case WN: bimg.SetImage(Vega5Img::whiteN());
break;
case BY: bimg.SetImage(Vega5Img::blackY());
break;
case BN: bimg.SetImage(Vega5Img::blackN());
break;
case NG: bimg.SetImage(Vega5Img::neutral());
break;
}
}
void ColoredRow::Get(int& whiteid, int& blackid, int& whitertg, int& blackrtg)
{
whiteid = wid;
blackid = bid;
whitertg = wrtg;
blackrtg = brtg;
}
void ColoredRow::SetSide(int side, int id, int rtg, float scr, int flag)
{
if (side == 1) { //right
bid = id;
brtg = rtg;
bscr = scr;
bflag = flag;
lblbrtg.SetLabel(AsString(rtg));
lblbscr.SetLabel(AsString(scr));
btnbid.SetLabel(AsString(id));
switch (flag) {
case WY: bimg.SetImage(Vega5Img::whiteY());
break;
case WN: bimg.SetImage(Vega5Img::whiteN());
break;
case BY: bimg.SetImage(Vega5Img::blackY());
break;
case BN: bimg.SetImage(Vega5Img::blackN());
break;
case NG: bimg.SetImage(Vega5Img::neutral());
break;
}
}
else { //left
wid = id;
wrtg = rtg;
wscr = scr;
wflag = flag;
lblwrtg.SetLabel(AsString(rtg));
lblwscr.SetLabel(AsString(scr));
btnwid.SetLabel(AsString(id));
switch (flag) {
case WY: wimg.SetImage(Vega5Img::whiteY());
break;
case WN: wimg.SetImage(Vega5Img::whiteN());
break;
case BY: wimg.SetImage(Vega5Img::blackY());
break;
case BN: wimg.SetImage(Vega5Img::blackN());
break;
case NG: wimg.SetImage(Vega5Img::neutral());
break;
}
}
}
void ColoredRow::GetSide(int side, int& id, int& rtg, float& scr, int& flag)
{
if (side == 0) { //left
id = wid;
rtg = wrtg;
scr = wscr;
flag = wflag;
}
else { //right
id = bid;
rtg = brtg;
scr = bscr;
flag = bflag;
}
}
//-----------------------
/*
class Abbinamento : public WithAbbinamento<TopWindow> {
ColoredRow a[3];
// ScrollArea scrollarea;
int lastlabel, numlabel;
int id1, id2; // remind the two ids has been selected
int iboard[2], side[2]; // remind the board (1...npair) and the side(0=left, 1=right)
void FillEdit(int board, int id);
void ExchangePlayersCB();
public:
typedef Abbinamento CLASSNAME;
Abbinamento();
};
*/
Abbinamento::Abbinamento()
{
CtrlLayout(*this, "Modify Colors");
// Add(scrollarea);
// scrollarea.LeftPosZ(14, 499).TopPosZ(7, 307);
// scrollarea.SetRect(50,50,490,400);
// scrollarea.work.Color(SRed); //not necessary... just to play with total...
int i, npair, code, idw, idb, res, wf, bf;
lastlabel = 1;
numlabel = 0;
id1 = id2 = 0;
iboard[0] = iboard[1] = 0;
side[0] = side[1] = 0;
npair = TD.pairing[0][TD.currentRound];
//for (i=1; i<=npair; i++) pairingNew[i]=pairing[i][currentRound];//do a copy
scrollarea.SetWorkSize( Size(485, 26*npair) );
scrollarea.sc.HideX();
for (i=1; i<=npair; i++)
{ //code = pairingNew[i];
code = TD.pairing[i][TD.currentRound];
TD.DecodeResult(code, &idw, &idb, &res);
if (player[idw].canChangeDuecolor && player[idw].duecolor==WHITE) wf = WY;
else if (player[idw].canChangeDuecolor && player[idw].duecolor==BLACK) wf = BY;
else if (!player[idw].canChangeDuecolor && player[idw].duecolor==BLACK) wf = BN;
else if (!player[idw].canChangeDuecolor && player[idw].duecolor==WHITE) wf = WN;
else wf = NG;
if (player[idb].canChangeDuecolor && player[idb].duecolor==WHITE) bf = WY;
else if (player[idb].canChangeDuecolor && player[idb].duecolor==BLACK) bf = BY;
else if (!player[idb].canChangeDuecolor && player[idb].duecolor==BLACK) bf = BN;
else if (!player[idb].canChangeDuecolor && player[idb].duecolor==WHITE) bf = WN;
else bf = NG;
scrollarea.work.Add(a[i]);
a[i].Set(i, idw, idb, player[idw].RATING, player[idb].RATING,
player[idw].tiebreak[SCORE], player[idb].tiebreak[SCORE], wf, bf);
a[i].LeftPosZ(1, 478).TopPosZ(1 + (i-1)*26, 26);
a[i].btnwid.WhenAction = THISBACK2(FillEdit, a[i].board * 10 + 0, a[i].wid);
a[i].btnbid.WhenAction = THISBACK2(FillEdit, a[i].board * 10 + 1, a[i].bid);
}
edtw.SetLabel(""); //<<= "";
edtb.SetLabel(""); // <<= "";
btnExchange.WhenAction = THISBACK(ExchangePlayersCB);
btnVerify.WhenAction = THISBACK(VerifyPairCB);
btnDone.WhenAction = THISBACK(DoneCB);
btnClose.WhenAction = THISBACK(CloseCB);
// ImageButton btn;
// Add(btn);
// btn.LeftPosZ(24, 73).TopPosZ(231, 27);
// btn.SetImage(Vega5Img::blackN());
}
void Abbinamento::FillEdit(int board, int id)
{ // flaglabel = 0 left, 1 right
int flaglabel;
String str;
flaglabel = board % 10; // extract the side
board = board/10;
// code = pairingNew[board];
// DecodeResult(code, &idw, &idb, &res);
// str = NFormat("%3d (%3d)", id, board);
str = NFormat("%d", id);
numlabel++;
if (lastlabel) { // force to write not in the last label
edtw.SetLabel(str); // <<= str;
id1 = id;
if (numlabel > 2) a[ iboard[0] ].rect.Color(White);
lastlabel = 0;
iboard[lastlabel] = board;
side[lastlabel] = flaglabel;
a[board].rect.Color(Color(175,255,84)); // old return White
}
else { // try to write in right label
edtb.SetLabel(str); // <<= str;
id2 = id;
if (numlabel > 2) a[ iboard[1] ].rect.Color(White);
lastlabel = 1;
iboard[lastlabel] = board;
side[lastlabel] = flaglabel;
a[board].rect.Color(Color(175,255,84)); // old return White
}
if (numlabel>2) numlabel = 2; // count the written label
//String a=NFormat("(%3d-%d) (%3d-%d)", iboard[0], side[0], iboard[1], side[1]);
//lbl.SetLabel(a);
if (numlabel == 2) ShowInfo();
}
void Abbinamento::VerifyPairCB()
{
String str1, str2;
str1 = edtw.GetText(); // AsString(~edtw);
str2 = edtb.GetText(); // AsString(~edtb);
if ( IsNull(str1) || IsNull(str2) ) {
Exclamation(t_("Please select two players"));
return;
}
if ( CanPlayWith(id1, id2, TD.currentRound) ) Exclamation(t_("The selected players are compatible"));
else Exclamation(t_("The selected players are NON compatible"));
}
void Abbinamento::DoneCB()
{
String str;
int i, idw, idb, rtgw, rtgb, npair;
extern void SortPairs(int round);
npair = TD.pairing[0][TD.currentRound];
for (i=1; i<=npair; i++) {
a[i].Get(idw, idb, rtgw, rtgb);
TD.pairing[i][TD.currentRound] = TD.CodifyResult( idw, idb, 9);
}
if (TD.currentRound>1) TD.VerifyColor(TD.currentRound); // check only for round>1
SortPairs(TD.currentRound);
TD.SavePairsFile(TD.currentRound); // save on a file the pairing
Close();
}
bool Abbinamento::ShowInfo()
{ String str1, str2;
SwissUSCF USCF;
int b1, b2;
int idw1, idb1, idw2, idb2, rtgw, rtgb;
int d;
str1 = edtw.GetText(); // AsString(~edtw);
str2 = edtb.GetText(); // AsString(~edtb);
if ( IsNull(str1) || IsNull(str2) ) {
Exclamation(t_("Please select two players"));
return false;
}
b1 = iboard[0];
b2 = iboard[1];
a[b1].Get(idw1, idb1, rtgw, rtgb);
a[b2].Get(idw2, idb2, rtgw, rtgb);
if (b1==b2) {
lbl.SetLabel("0");
return false;
}
if (id1==idw1 && id2==idw2) { // transposition
d = USCF.CompareTranspose(idw1, idb1, idw2, idb2);
if (d == 100000) {
lbl.SetLabel(t_("FORBID!"));
return false;
}
lbl.SetLabel( NFormat("%d trans.", d) );
}
else if (id1==idw1 && id2==idb2) {
d = USCF.CompareInterchange(idw1, idb1, idw2, idb2, 1);
if ( d == 100000 ) {
lbl.SetLabel( t_("FORBID!"));
return false;
}
lbl.SetLabel( NFormat("%d inter.", d) );
}
else if (id1==idb1 && id2==idw2) {
d = USCF.CompareInterchange(idw1, idb1, idw2, idb2, 0);
if (d == 100000) {
lbl.SetLabel( "FORBID!");
return false;
}
lbl.SetLabel( NFormat("%d inter.", d) );
}
else if (id1==idb1 && id2==idb2) {
d = USCF.CompareTranspose(idw1, idb1, idw2, idb2);
if (d == 100000) {
lbl.SetLabel( t_("FORBID!"));
return false;
}
lbl.SetLabel( NFormat("%d trans.", d) );
}
return true;
}
void Abbinamento::CloseCB()
{
if (!PromptYesNo(t_("The current data will be lost.&Do you want to continue?"))) return;
Close();
}
void Abbinamento::ExchangePlayersCB()
{ String str1, str2;
// int id1, b1, id2, b2, flagalign1, flagalign2;
// int code1, code2, idw1, idb1, idw2, idb2, res;
// int ans, d;
// int p1, p2, s1, s2, r80, r200;
str1 = edtw.GetText(); // AsString(~edtw);
str2 = edtb.GetText(); // AsString(~edtb);
if ( IsNull(str1) || IsNull(str2) ) {
Exclamation(t_("Choose two players to exchange"));
return;
}
if ( !ShowInfo() ) {
Exclamation(t_("This exchange is ILLEGAL"));
return;
}
/*
sscanf(str1, "%d (%d", &id1, &b1);
code1 = pairingNew[b1];
DecodeResult(code1, &idw1, &idb1, &res);
sscanf(str2, "%d (%d", &id2, &b2);
code2 = pairingNew[b2];
DecodeResult(code2, &idw2, &idb2, &res);
if (id1==id2) {
Exclamation("This exchange looks rather stupid.&Do you agree?");
return;
}
if (b1==b2) {
Exclamation("This exchange will be performed by Vega if necessary");
return;
}
// check 200 points rule
// WW & BB, oppure BB & WW, in ogni caso i duecolor
// sono diversi nelle due coppie
p1 = playerState[idw1].colorDiff * playerState[idb1].colorDiff;
p2 = playerState[idw2].colorDiff * playerState[idb2].colorDiff;
s1 = playerState[idw1].duecolor + playerState[idb1].duecolor;
s2 = playerState[idw2].duecolor + playerState[idb2].duecolor;
if ( (p1>0 || p2>0) && (s1*s2<0) ) r200 = 1;
else r200 = 0;
// check 80 points rule
// WW & BB, oppure BB & WW, con diff=0 e duecolor
// diversi nelle due coppie
p1 = playerState[idw1].colorDiff + playerState[idb1].colorDiff;
p2 = playerState[idw2].colorDiff + playerState[idb2].colorDiff;
s1 = playerState[idw1].duecolor + playerState[idb1].duecolor;
s2 = playerState[idw2].duecolor + playerState[idb2].duecolor;
if ( (p1==0 && p2==0) && (s1*s2<0) ) r80 = 1;
else r80 = 0;
if (id1==idw1 && id2==idw2) { // transposition
d = CompareTranspose(idw1, idb1, idw2, idb2);
if (d == 100000)
{ Exclamation("The exchange is illegal");
return;
}
if (d>200 && r200) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "Contrast with 200 points rule. Do you want to proceede anyway?");
if (ans == 0) return;
}
else if (d>80 && r80) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "Contrast with 80 points rule. Do you want to proceede anyway?");
if (ans == 0) return;
}
flagalign1 = 0;
flagalign2 = 0;
pairingNew[b1] = CodifyResult(id2, idb1, 9);
pairingNew[b2] = CodifyResult(id1, idb2, 9);
}
else if (id1==idw1 && id2==idb2) {
d = CompareInterchange(idw1, idb1, idw2, idb2, 1);
if (d==100000)
{ WarningMessage( sss[S_PLAYNOTC] , sss[S_CLOSE]);
return;
}
if (d>200 && r200) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "This interchange do not met the 200 points rule\nDo you want to proceede anyway?");
if (ans == 0) return;
}
else if (d>80 && r80) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "This interchange do not met the 80 points rule\nDo you want to proceede anyway?");
if (ans == 0) return;
}
flagalign1 = 1;
flagalign2 = 0;
pairingNew[b1] = CodifyResult(id2, idb1, 9);
pairingNew[b2] = CodifyResult(idw2, id1, 9);
}
else if (id1==idb1 && id2==idw2) {
d = CompareInterchange(idw1, idb1, idw2, idb2, 0);
if (d == 100000)
{ WarningMessage( sss[S_PLAYNOTC] , sss[S_CLOSE]);
return;
}
if (d>200 && r200) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "This interchange do not met the 200 points rule\nDo you want to proceede anyway?");
if (ans == 0) return;
}
else if (d>80 && r80) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "This interchange do not met the 80 points rule\nDo you want to proceede anyway?");
if (ans == 0) return;
}
flagalign1 = 0;
flagalign2 = 1;
pairingNew[b1] = CodifyResult(idw1, id2, 9);
pairingNew[b2] = CodifyResult(id1, idb2, 9);
}
else if (id1==idb1 && id2==idb2) {
d = CompareTranspose(idw1, idb1, idw2, idb2);
if (d==100000)
{ WarningMessage( sss[S_PLAYNOTC] , sss[S_CLOSE]);
return;
}
if (d>200 && r200) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "This transposition do not met the 200 points rule\nDo you want to proceede anyway?");
if (ans == 0) return;
}
else if (d>80 && r80) {
sprintf(str, "D = %d", d);
ans = WarningDialog(str, "This transposition do not met the 80 points rule\nDo you want to proceede anyway?");
if (ans == 0) return;
}
flagalign1 = flagalign2 = 1;
pairingNew[b1] = CodifyResult(idw1, id2, 9);
pairingNew[b2] = CodifyResult(idw2, id1, 9);
}
*/
int tid, trtg, tflag, xid, xrtg, xflag;
float tscr, xscr;
int bb0, ss0, bb1, ss1;
bb0 = iboard[0]; ss0 = side[0];
bb1 = iboard[1]; ss1 = side[1];
a[ bb0 ].GetSide(ss0, tid, trtg, tscr, tflag); // get bb0-ss0 data
a[ bb1 ].GetSide(ss1, xid, xrtg, xscr, xflag); // get bb1-ss1 data
a[ bb0 ].SetSide(ss0, xid, xrtg, xscr, xflag); // set bb1-ss1 data in bb0-ss0
a[ bb1 ].SetSide(ss1, tid, trtg, tscr, tflag); // set bb0-ss0 data in bb1-ss1
// set white colors both selected board
edtw.SetLabel(""); // <<= "";
edtb.SetLabel(""); // <<= "";
a[ bb0 ].rect.Color(White);
a[ bb1 ].rect.Color(White);
numlabel = 0;
}