diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java index 4aa6fc2ee..d3270d53a 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardCanvas.java @@ -363,7 +363,8 @@ public class BoardCanvas extends Canvas implements DrawCtx { if ( canDraw ) { int backColor; boolean empty = 0 != (flags & (CELL_DRAGSRC|CELL_ISEMPTY)); - boolean pending = 0 != (flags & CELL_HIGHLIGHT); + boolean pending = 0 != (flags & CELL_PENDING); + boolean recent = 0 != (flags & CELL_RECENT); String bonusStr = null; if ( m_inTrade ) { @@ -384,8 +385,10 @@ public class BoardCanvas extends Canvas implements DrawCtx { backColor = m_bonusColors[bonus]; bonusStr = m_bonusSummaries[bonus]; } - } else if ( pending ) { - ++mPendingCount; + } else if ( pending || recent ) { + if ( pending ) { + ++mPendingCount; + } if ( darkOnLight() ) { foreColor = WHITE; backColor = BLACK; @@ -484,7 +487,7 @@ public class BoardCanvas extends Canvas implements DrawCtx { public void drawTrayDivider( Rect rect, int flags ) { boolean isCursor = 0 != (flags & CELL_ISCURSOR); - boolean selected = 0 != (flags & CELL_HIGHLIGHT); + boolean selected = 0 != (flags & (CELL_PENDING|CELL_RECENT)); int index = isCursor? CommonPrefs.COLOR_FOCUS : CommonPrefs.COLOR_BACKGRND; fillRectOther( rect, index ); @@ -602,7 +605,7 @@ public class BoardCanvas extends Canvas implements DrawCtx { Paint paint = getTileStrokePaint( rect ); drawRect( rect, paint ); // frame - if ( 0 != (flags & CELL_HIGHLIGHT) ) { + if ( 0 != (flags & (CELL_PENDING|CELL_RECENT)) ) { int width = (int)paint.getStrokeWidth(); rect.inset( width, width ); drawRect( rect, paint ); // frame diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/DrawCtx.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/DrawCtx.java index 30933fab0..68e5069f7 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/DrawCtx.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/DrawCtx.java @@ -23,9 +23,10 @@ package org.eehouse.android.xw4.jni; import android.graphics.Rect; public interface DrawCtx { + // These must be kept in sync with the enum CellFlags in draw.h static final int CELL_NONE = 0x00; static final int CELL_ISBLANK = 0x01; - static final int CELL_HIGHLIGHT = 0x02; + static final int CELL_RECENT = 0x02; static final int CELL_ISSTAR = 0x04; static final int CELL_ISCURSOR = 0x08; static final int CELL_ISEMPTY = 0x10; /* of a tray tile slot */ @@ -34,7 +35,8 @@ public interface DrawCtx { static final int CELL_DRAGCUR = 0x80; /* where drag is now */ static final int CELL_CROSSVERT = 0x100; static final int CELL_CROSSHOR = 0x200; - static final int CELL_ALL = 0x3FF; + static final int CELL_PENDING = 0x400; + static final int CELL_ALL = 0x7FF; /* BoardObjectType */ static final int OBJ_NONE = 0; diff --git a/xwords4/common/boarddrw.c b/xwords4/common/boarddrw.c index f8f5bb495..7b732e54d 100644 --- a/xwords4/common/boarddrw.c +++ b/xwords4/common/boarddrw.c @@ -397,7 +397,6 @@ drawCell( BoardCtxt* board, const XP_U16 col, const XP_U16 row, XP_Bool skipBlan !rectContainsRect( &board->trayBounds, &cellRect ) ) { XP_UCHAR ch[4] = {'\0'}; XP_S16 owner = -1; - XP_Bool invert = XP_FALSE; XP_Bitmaps bitmaps; XP_Bitmaps* bptr = NULL; const XP_UCHAR* textP = NULL; @@ -432,8 +431,6 @@ drawCell( BoardCtxt* board, const XP_U16 col, const XP_U16 row, XP_Bool skipBlan modelRow ); } - invert = showPending? pending : recent; - if ( board->showCellValues ) { XP_SNPRINTF( ch, VSIZE(ch), "%d", value ); textP = ch; @@ -451,8 +448,10 @@ drawCell( BoardCtxt* board, const XP_U16 col, const XP_U16 row, XP_Bool skipBlan if ( (col==board->star_row) && (row==board->star_row) ) { flags |= CELL_ISSTAR; } - if ( invert ) { - flags |= CELL_HIGHLIGHT; + if ( recent && !showPending ) { + flags |= CELL_RECENT; + } else if ( pending ) { + flags |= CELL_PENDING; } if ( isBlank ) { flags |= CELL_ISBLANK; @@ -656,7 +655,8 @@ static XP_UCHAR* formatFlags( XP_UCHAR* buf, XP_U16 len, CellFlags flags ) if ( 0 != (flag & flags) ) { switch (flag) { case CELL_ISBLANK: str = "BLNK"; break; - case CELL_HIGHLIGHT: str = "HLIT"; break; + case CELL_PENDING: str = "PEND"; break; + case CELL_RECENT: str = "RCNT"; break; case CELL_ISEMPTY: str = "MPTY"; break; case CELL_ISCURSOR: str = "CURS"; break; case CELL_VALHIDDEN: str = "HIDN"; break; diff --git a/xwords4/common/draw.h b/xwords4/common/draw.h index 81027ac04..9b986d723 100644 --- a/xwords4/common/draw.h +++ b/xwords4/common/draw.h @@ -34,7 +34,7 @@ typedef XP_Bool (*LastScoreCallback)( void* closure, XP_S16 player, typedef enum { CELL_NONE = 0x00 , CELL_ISBLANK = 0x01 - , CELL_HIGHLIGHT = 0x02 + , CELL_RECENT = 0x02 , CELL_ISSTAR = 0x04 , CELL_ISCURSOR = 0x08 , CELL_ISEMPTY = 0x10 /* of a tray tile slot */ @@ -43,7 +43,8 @@ typedef enum { , CELL_DRAGCUR = 0x80 /* where drag is now */ , CELL_CROSSVERT = 0x100 /* vertical component of crosshair */ , CELL_CROSSHOR = 0x200 /* horizontal component of crosshair */ - , CELL_ALL = 0x3FF + , CELL_PENDING = 0x400 + , CELL_ALL = 0x7FF } CellFlags; typedef struct DrawScoreInfo { diff --git a/xwords4/common/tray.c b/xwords4/common/tray.c index 1eb926c07..730b2bbf5 100644 --- a/xwords4/common/tray.c +++ b/xwords4/common/tray.c @@ -226,10 +226,10 @@ drawTray( BoardCtxt* board ) &bitmaps, &value ); if ( isADrag ) { if ( ddAddedIndx == ii ) { - flags |= CELL_HIGHLIGHT; + flags |= CELL_PENDING; } } else if ( (traySelBits & (1<dividerSelected || dragDropIsDividerDrag(board) ) { - flags |= CELL_HIGHLIGHT; + flags |= CELL_PENDING; } draw_drawTrayDivider( board->draw, ÷r, flags ); board->dividerInvalid = XP_FALSE; diff --git a/xwords4/linux/cursesdraw.c b/xwords4/linux/cursesdraw.c index 7e7eb2eca..66f2c14d7 100644 --- a/xwords4/linux/cursesdraw.c +++ b/xwords4/linux/cursesdraw.c @@ -352,7 +352,7 @@ curses_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, HintAtts XP_UNUSED(hintAtts), CellFlags flags ) { CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx; - XP_Bool highlight = (flags & (CELL_HIGHLIGHT|CELL_ISCURSOR)) != 0; + XP_Bool highlight = (flags & (CELL_PENDING|CELL_RECENT|CELL_ISCURSOR)) != 0; XP_UCHAR loc[rect->width+1]; if ( !!letter ) { XP_MEMCPY( loc, letter, 1 + strlen(letter) ); @@ -438,7 +438,7 @@ curses_draw_drawTile( DrawCtx* p_dctx, const XP_Rect* rect, char* nump = NULL; XP_UCHAR* letterp = NULL; CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx; - XP_Bool highlight = (flags&(CELL_HIGHLIGHT|CELL_ISCURSOR)) != 0; + XP_Bool highlight = (flags&(CELL_RECENT|CELL_PENDING|CELL_ISCURSOR)) != 0; if ( highlight ) { wstandout( dctx->boardWin ); @@ -462,7 +462,7 @@ curses_draw_drawTile( DrawCtx* p_dctx, const XP_Rect* rect, } curses_stringInTile( dctx, rect, letterp, nump ); - if ( (flags&CELL_HIGHLIGHT) != 0 ) { + if ( (flags & (CELL_RECENT|CELL_PENDING)) != 0 ) { mvwaddnstr( dctx->boardWin, rect->top+rect->height-1, rect->left, "*-*", 3 ); } diff --git a/xwords4/linux/gtkdraw.c b/xwords4/linux/gtkdraw.c index 1f4d3515f..a8e01b658 100644 --- a/xwords4/linux/gtkdraw.c +++ b/xwords4/linux/gtkdraw.c @@ -614,7 +614,8 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, XP_Rect rectInset = *rect; GtkGameGlobals* globals = dctx->globals; XP_Bool showGrid = globals->gridOn; - XP_Bool highlight = (flags & CELL_HIGHLIGHT) != 0; + XP_Bool recent = (flags & CELL_RECENT) != 0; + XP_Bool pending = (flags & CELL_PENDING) != 0; GdkRGBA* cursor = ((flags & CELL_ISCURSOR) != 0) ? &dctx->cursor : NULL; @@ -671,7 +672,7 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, GdkRGBA* foreground; if ( cursor ) { gtkSetForeground( dctx, cursor ); - } else if ( !highlight ) { + } else if ( !recent && !pending ) { gtkSetForeground( dctx, &dctx->tileBack ); } draw_rectangle( dctx, TRUE, rectInset.left, rectInset.top, @@ -682,7 +683,13 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, isBlank = XP_FALSE; } - foreground = highlight? &dctx->white : &dctx->playerColors[owner]; + if ( pending ) { + foreground = &dctx->white; + } else if ( recent ) { + foreground = &dctx->grey; + } else { + foreground = &dctx->playerColors[owner]; + } draw_string_at( dctx, NULL, letter, dctx->cellHeight, &rectInset, XP_GTK_JUST_CENTER, foreground, cursor ); @@ -797,7 +804,7 @@ gtkDrawTileImpl( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* textP, insetR.left, insetR.top, insetR.width, insetR.height ); - if ( (flags & CELL_HIGHLIGHT) != 0 ) { + if ( (flags & (CELL_PENDING|CELL_RECENT)) != 0 ) { gtkInsetRect( &insetR, 1 ); draw_rectangle( dctx, FALSE, insetR.left, insetR.top, insetR.width, insetR.height); @@ -821,7 +828,7 @@ gtk_draw_drawTileMidDrag( DrawCtx* p_dctx, const XP_Rect* rect, { gtk_draw_trayBegin( p_dctx, rect, owner, 0, DFS_NONE ); return gtkDrawTileImpl( p_dctx, rect, textP, bitmaps, val, - flags | CELL_HIGHLIGHT, XP_FALSE ); + flags | (CELL_PENDING|CELL_RECENT), XP_FALSE ); } #endif @@ -852,7 +859,7 @@ gtk_draw_drawTrayDivider( DrawCtx* p_dctx, const XP_Rect* rect, { GtkDrawCtx* dctx = (GtkDrawCtx*)p_dctx; XP_Rect r = *rect; - XP_Bool selected = 0 != (flags & CELL_HIGHLIGHT); + XP_Bool selected = 0 != (flags & (CELL_RECENT|CELL_PENDING)); XP_Bool isCursor = 0 != (flags & CELL_ISCURSOR); gtkEraseRect( dctx, &r );