From be0a6f83f32886395351275ab26ff304aa8da3a3 Mon Sep 17 00:00:00 2001 From: Eric House Date: Thu, 11 Feb 2021 14:11:02 -0800 Subject: [PATCH] drive letters/values from a three-value enum There are three choices now. The button pops up a menu on android and moves through the choices on linux. --- .../org/eehouse/android/xw4/BoardCanvas.java | 22 ++++++-- .../eehouse/android/xw4/BoardDelegate.java | 43 ++++++++++++--- .../eehouse/android/xw4/jni/CommonPrefs.java | 17 ++++++ .../org/eehouse/android/xw4/jni/DrawCtx.java | 6 ++- .../eehouse/android/xw4/jni/JNIThread.java | 5 -- .../org/eehouse/android/xw4/jni/XwJNI.java | 1 - .../src/main/res/menu-small/board_menu.xml | 3 -- .../app/src/main/res/menu/tile_values.xml | 13 +++++ .../app/src/main/res/values/common_rsrc.xml | 1 + .../app/src/main/res/values/strings.xml | 10 ++-- xwords4/android/jni/drawwrapper.c | 52 ++++++++++++------- xwords4/android/jni/xwjni.c | 13 +---- xwords4/common/board.c | 38 ++++---------- xwords4/common/board.h | 1 - xwords4/common/boarddrw.c | 13 ++--- xwords4/common/boardp.h | 3 +- xwords4/common/comtypes.h | 9 ++++ xwords4/common/draw.h | 8 +-- xwords4/common/tray.c | 2 +- xwords4/linux/cursesboard.c | 8 +-- xwords4/linux/cursesdraw.c | 5 +- xwords4/linux/gtkboard.c | 7 +-- xwords4/linux/gtkboard.h | 2 +- xwords4/linux/gtkdraw.c | 29 ++++++++--- 24 files changed, 196 insertions(+), 115 deletions(-) create mode 100644 xwords4/android/app/src/main/res/menu/tile_values.xml 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 9763a8564..b3296312a 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 @@ -38,6 +38,7 @@ import java.util.Set; import org.eehouse.android.xw4.jni.BoardDims; import org.eehouse.android.xw4.jni.CommonPrefs; +import org.eehouse.android.xw4.jni.CommonPrefs.TileValueType; import org.eehouse.android.xw4.jni.DrawCtx; import org.eehouse.android.xw4.jni.DrawScoreInfo; import org.eehouse.android.xw4.jni.JNIThread; @@ -372,8 +373,8 @@ public class BoardCanvas extends Canvas implements DrawCtx { } @Override - public boolean drawCell( Rect rect, String text, int tile, String value, - int owner, int bonus, int hintAtts, int flags ) + public boolean drawCell( Rect rect, String text, int tile, int tileValue, + int owner, int bonus, int flags, TileValueType tvType ) { boolean canDraw = figureFontDims(); if ( canDraw ) { @@ -431,6 +432,19 @@ public class BoardCanvas extends Canvas implements DrawCtx { drawCentered( bonusStr, brect, m_fontDims ); } } else { + String value = String.format( "%d", tileValue ); + switch ( tvType ) { + case TVT_BOTH: + break; + case TVT_FACES: + value = null; + break; + case TVT_VALUES: + text = value; + value = null; + break; + } + m_fillPaint.setColor( adjustColor(foreColor) ); if ( null == value ) { drawCentered( text, rect, m_fontDims ); @@ -441,8 +455,8 @@ public class BoardCanvas extends Canvas implements DrawCtx { drawCentered( text, smaller, m_fontDims ); smaller = new Rect(rect); - smaller.left += (3 * smaller.width()) / 4; - smaller.top += (3 * smaller.height()) / 4; + smaller.left += (2 * smaller.width()) / 3; + smaller.top += (2 * smaller.height()) / 3; drawCentered( value, smaller, m_fontDims ); } } diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java index ba69d5f1f..2006f20dd 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/BoardDelegate.java @@ -41,6 +41,7 @@ import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; +import android.widget.PopupMenu; import android.widget.TextView; import java.io.Serializable; @@ -761,8 +762,6 @@ public class BoardDelegate extends DelegateBase Utils.setItemVisible( menu, R.id.board_menu_flip, m_gsi.visTileCount >= 1 ); - Utils.setItemVisible( menu, R.id.board_menu_toggle, - m_gsi.visTileCount >= 1 ); Utils.setItemVisible( menu, R.id.board_menu_juggle, m_gsi.canShuffle ); Utils.setItemVisible( menu, R.id.board_menu_undo_current, @@ -885,9 +884,6 @@ public class BoardDelegate extends DelegateBase case R.id.board_menu_chat: startChatActivity(); break; - case R.id.board_menu_toggle: - cmd = JNICmd.CMD_VALUES; - break; case R.id.board_menu_trade: String msg = getString( R.string.not_again_trading ); @@ -1031,7 +1027,7 @@ public class BoardDelegate extends DelegateBase cmd = JNICmd.CMD_UNDO_CUR; break; case VALUES_ACTION: - cmd = JNICmd.CMD_VALUES; + doValuesPopup( m_toolbar.getButtonFor( Buttons.BUTTON_VALUES ) ); break; case CHAT_ACTION: startChatActivity(); @@ -2496,6 +2492,41 @@ public class BoardDelegate extends DelegateBase names, locs ); } + private void doValuesPopup( View button ) + { + PopupMenu popup = new PopupMenu( m_activity, button ); + popup.inflate( R.menu.tile_values ); + popup.setOnMenuItemClickListener( new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick( MenuItem item ) { + CommonPrefs.TileValueType tvType = null; + int id = item.getItemId(); + switch ( id ) { + case R.id.values_faces: + tvType = CommonPrefs.TileValueType.TVT_FACES; + break; + case R.id.values_values: + tvType = CommonPrefs.TileValueType.TVT_VALUES; + break; + case R.id.values_both: + tvType = CommonPrefs.TileValueType.TVT_BOTH; + break; + default: + Assert.failDbg(); + } + + if ( null != tvType ) { + XWPrefs.setPrefsInt( m_activity, + R.string.key_tile_valuetype, + tvType.ordinal() ); + handleViaThread( JNICmd.CMD_PREFS_CHANGE ); + } + return true; + } + } ); + popup.show(); + } + private void getConfirmPause( boolean isPause ) { showDialogFragment( DlgID.ASK_DUP_PAUSE, isPause ); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java index 52b986855..ac55c667c 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/CommonPrefs.java @@ -35,6 +35,12 @@ import org.eehouse.android.xw4.loc.LocUtils; public class CommonPrefs extends XWPrefs { private static final String TAG = CommonPrefs.class.getSimpleName(); + public enum TileValueType { + TVT_BOTH, + TVT_FACES, + TVT_VALUES, + }; + public static final int COLOR_TILE_BACK = 0; public static final int COLOR_NOTILE = 1; public static final int COLOR_FOCUS = 2; @@ -53,6 +59,7 @@ public class CommonPrefs extends XWPrefs { public boolean sortNewTiles; public boolean allowPeek; public boolean hideCrosshairs; + public TileValueType tvType; public int[] playerColors; public int[] bonusColors; @@ -85,6 +92,9 @@ public class CommonPrefs extends XWPrefs { allowPeek = getBoolean( context, sp, R.string.key_peek_other, false ); hideCrosshairs = getBoolean( context, sp, R.string.key_hide_crosshairs, false ); + int ord = getInt(context, sp, R.string.key_tile_valuetype, 0); + tvType = TileValueType.values()[ord]; + int ids[] = { R.string.key_player0, R.string.key_player1, R.string.key_player2, @@ -125,6 +135,13 @@ public class CommonPrefs extends XWPrefs { return sp.getBoolean( key, dflt ); } + private int getInt( Context context, SharedPreferences sp, + int id, int dflt ) + { + String key = LocUtils.getString( context, id ); + return sp.getInt( key, dflt ); + } + private int prefToColor( Context context, SharedPreferences sp, int id ) { String key = LocUtils.getString( context, id ); 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 3e5a82948..903c8d423 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 @@ -22,6 +22,8 @@ package org.eehouse.android.xw4.jni; import android.graphics.Rect; +import org.eehouse.android.xw4.jni.CommonPrefs.TileValueType; + public interface DrawCtx { // These must be kept in sync with the enum CellFlags in draw.h static final int CELL_NONE = 0x00; @@ -59,8 +61,8 @@ public interface DrawCtx { void drawTimer( Rect rect, int player, int secondsLeft, boolean inDuplicateMode ); - boolean drawCell( Rect rect, String text, int tile, String value, - int owner, int bonus, int hintAtts, int flags ); + boolean drawCell( Rect rect, String text, int tile, int value, + int owner, int bonus, int flags, TileValueType tvType ); void drawBoardArrow ( Rect rect, int bonus, boolean vert, int hintAtts, int flags ); boolean trayBegin ( Rect rect, int owner, int score ); diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/JNIThread.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/JNIThread.java index 2d4094301..f8db5e877 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/JNIThread.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/JNIThread.java @@ -84,7 +84,6 @@ public class JNIThread extends Thread implements AutoCloseable { CMD_ZOOM, CMD_PREV_HINT, CMD_NEXT_HINT, - CMD_VALUES, CMD_COUNTS_VALUES, CMD_REMAINING, CMD_RESEND, @@ -641,10 +640,6 @@ public class JNIThread extends Thread implements AutoCloseable { barr ); break; - case CMD_VALUES: - draw = XwJNI.board_toggle_showValues( m_jniGamePtr ); - break; - case CMD_COUNTS_VALUES: sendForDialog( ((Integer)args[0]).intValue(), XwJNI.server_formatDictCounts( m_jniGamePtr, 3 ) diff --git a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java index d04cfe5cb..ceeae1673 100644 --- a/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java +++ b/xwords4/android/app/src/main/java/org/eehouse/android/xw4/jni/XwJNI.java @@ -414,7 +414,6 @@ public class XwJNI { public static native int board_getTrayVisState( GamePtr gamePtr ); public static native boolean board_hideTray( GamePtr gamePtr ); public static native boolean board_showTray( GamePtr gamePtr ); - public static native boolean board_toggle_showValues( GamePtr gamePtr ); public static native boolean board_commitTurn( GamePtr gamePtr, boolean phoniesConfirmed, boolean turnConfirmed, diff --git a/xwords4/android/app/src/main/res/menu-small/board_menu.xml b/xwords4/android/app/src/main/res/menu-small/board_menu.xml index b553c5711..7e9f505a3 100644 --- a/xwords4/android/app/src/main/res/menu-small/board_menu.xml +++ b/xwords4/android/app/src/main/res/menu-small/board_menu.xml @@ -66,9 +66,6 @@ - diff --git a/xwords4/android/app/src/main/res/menu/tile_values.xml b/xwords4/android/app/src/main/res/menu/tile_values.xml new file mode 100644 index 000000000..25ab19742 --- /dev/null +++ b/xwords4/android/app/src/main/res/menu/tile_values.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/xwords4/android/app/src/main/res/values/common_rsrc.xml b/xwords4/android/app/src/main/res/values/common_rsrc.xml index 7afc9f29d..e4394820a 100644 --- a/xwords4/android/app/src/main/res/values/common_rsrc.xml +++ b/xwords4/android/app/src/main/res/values/common_rsrc.xml @@ -15,6 +15,7 @@ key_sort_tiles key_peek_other key_hide_crosshairs + key_tile_valuetype key_hide_values key_hide_title key_hide_newgames diff --git a/xwords4/android/app/src/main/res/values/strings.xml b/xwords4/android/app/src/main/res/values/strings.xml index 4e884b7b5..72b01dd83 100644 --- a/xwords4/android/app/src/main/res/values/strings.xml +++ b/xwords4/android/app/src/main/res/values/strings.xml @@ -1813,8 +1813,6 @@ Chat %1$s: - - Toggle values Browse wordlist @@ -2673,4 +2671,10 @@ Tap this and you'll get taken to the "Game configure" screen --> Configure first - \ No newline at end of file + + + Letters only + Values only + Letters and Values + + diff --git a/xwords4/android/jni/drawwrapper.c b/xwords4/android/jni/drawwrapper.c index a4a8009bc..d59a2c364 100644 --- a/xwords4/android/jni/drawwrapper.c +++ b/xwords4/android/jni/drawwrapper.c @@ -43,12 +43,15 @@ typedef struct _AndDraw { jobject jdraw; /* global ref; free it! */ XP_LangCode curLang; jobject jCache[JCACHE_COUNT]; + jobject jTvType; XP_UCHAR miniTextBuf[128]; MPSLOT } AndDraw; #define CHECKOUT_MARKER ((jobject)-1) +static void deleteGlobalRef( JNIEnv* env, jobject jobj ); + static jobject makeJRect( AndDraw* draw, JNIEnv* env, int indx, const XP_Rect* rect ) { @@ -399,24 +402,32 @@ static XP_Bool and_draw_beginDraw( DrawCtx* XP_UNUSED(dctx), static void and_draw_endDraw( DrawCtx* XP_UNUSED(dctx), XWEnv XP_UNUSED(xwe) ) {} static XP_Bool -and_draw_boardBegin( DrawCtx* XP_UNUSED(dctx), XWEnv XP_UNUSED(xwe), - const XP_Rect* XP_UNUSED(rect), +and_draw_boardBegin( DrawCtx* dctx, XWEnv xwe, const XP_Rect* XP_UNUSED(rect), XP_U16 XP_UNUSED(cellWidth), XP_U16 XP_UNUSED(cellHeight), - DrawFocusState XP_UNUSED(dfs) ) + DrawFocusState XP_UNUSED(dfs), TileValueType tvType ) { + JNIEnv* env = xwe; + AndDraw* draw = (AndDraw*)dctx; + + jobject jTvType = intToJEnum( env, tvType, PKG_PATH("jni/CommonPrefs$TileValueType") ); + draw->jTvType = (*env)->NewGlobalRef( env, jTvType ); + deleteLocalRef( env, jTvType ); + return XP_TRUE; } static XP_Bool and_draw_drawCell( DrawCtx* dctx, XWEnv xwe, const XP_Rect* rect, const XP_UCHAR* text, const XP_Bitmaps* bitmaps, - Tile tile, const XP_UCHAR* value, + Tile tile, XP_U16 value, XP_S16 owner, XWBonusType bonus, HintAtts hintAtts, CellFlags flags ) { jboolean result; DRAW_CBK_HEADER("drawCell", - "(Landroid/graphics/Rect;Ljava/lang/String;ILjava/lang/String;IIII)Z" ); + "(Landroid/graphics/Rect;Ljava/lang/String;IIIII" + "L" PKG_PATH("jni/CommonPrefs$TileValueType") ";)Z" ); + jobject jrect = makeJRect( draw, xwe, JCACHE_RECT0, rect ); jstring jtext = NULL; if ( !!text ) { @@ -425,14 +436,12 @@ and_draw_drawCell( DrawCtx* dctx, XWEnv xwe, const XP_Rect* rect, } jtext = (*env)->NewStringUTF( env, text ); } - jstring jval = !!value ? (*env)->NewStringUTF( env, value ) : NULL; - result = (*env)->CallBooleanMethod( env, draw->jdraw, mid, - jrect, jtext, tile, jval, - owner, bonus, hintAtts, - flags ); + result = (*env)->CallBooleanMethod( env, draw->jdraw, mid, jrect, + jtext, tile, value, owner, bonus, + flags, draw->jTvType ); returnJRect( draw, JCACHE_RECT0, jrect ); - deleteLocalRefs( env, jtext, jval, DELETE_NO_REF ); + deleteLocalRef( env, jtext ); DRAW_CBK_HEADER_END(); return result; @@ -576,6 +585,10 @@ and_draw_objFinished( DrawCtx* dctx, XWEnv xwe, BoardObjectType typ, (*env)->CallVoidMethod( env, draw->jdraw, mid, (jint)typ, jrect ); returnJRect( draw, JCACHE_RECT0, jrect ); + + if ( OBJ_BOARD == typ ) { + deleteGlobalRef( env, draw->jTvType ); + } DRAW_CBK_HEADER_END(); #endif } @@ -734,20 +747,23 @@ makeDraw( MPFORMAL JNIEnv* env, return (DrawCtx*)draw; } +static void +deleteGlobalRef( JNIEnv* env, jobject jobj ) +{ + if ( !!jobj ) { + (*env)->DeleteGlobalRef( env, jobj ); + } +} + void destroyDraw( DrawCtx** dctx, JNIEnv* env ) { if ( !!*dctx ) { AndDraw* draw = (AndDraw*)*dctx; - if ( NULL != draw->jdraw ) { - (*env)->DeleteGlobalRef( env, draw->jdraw ); - } + deleteGlobalRef( env, draw->jdraw ); for ( int ii = 0; ii < JCACHE_COUNT; ++ii ) { - jobject jobj = draw->jCache[ii]; - if ( !!jobj ) { - (*env)->DeleteGlobalRef( env, jobj ); - } + deleteGlobalRef( env, draw->jCache[ii] ); } XP_FREE( draw->mpool, draw->vtable ); diff --git a/xwords4/android/jni/xwjni.c b/xwords4/android/jni/xwjni.c index 436fe7557..c108de8a1 100644 --- a/xwords4/android/jni/xwjni.c +++ b/xwords4/android/jni/xwjni.c @@ -598,6 +598,8 @@ loadCommonPrefs( JNIEnv* env, CommonPrefs* cp, jobject j_cp ) #ifdef XWFEATURE_CROSSHAIRS cp->hideCrosshairs = getBool( env, j_cp, "hideCrosshairs" ); #endif + cp->tvType = jenumFieldToInt( env, j_cp, "tvType", + PKG_PATH("jni/CommonPrefs$TileValueType")); } static XWStreamCtxt* @@ -1834,17 +1836,6 @@ Java_org_eehouse_android_xw4_jni_XwJNI_board_1setBlankValue return result; } -JNIEXPORT jboolean JNICALL -Java_org_eehouse_android_xw4_jni_XwJNI_board_1toggle_1showValues -( JNIEnv* env, jclass C, GamePtrType gamePtr ) -{ - jboolean result; - XWJNI_START(); - result = board_toggle_showValues( state->game.board ); - XWJNI_END(); - return result; -} - JNIEXPORT jboolean JNICALL Java_org_eehouse_android_xw4_jni_XwJNI_board_1commitTurn ( JNIEnv* env, jclass C, GamePtrType gamePtr, jboolean phoniesConfirmed, diff --git a/xwords4/common/board.c b/xwords4/common/board.c index d872a31f9..e762fab19 100644 --- a/xwords4/common/board.c +++ b/xwords4/common/board.c @@ -231,7 +231,9 @@ board_makeFromStream( MPFORMAL XWEnv xwe, XWStreamCtxt* stream, ModelCtxt* model board->isFlipped = (XP_Bool)stream_getBits( stream, 1 ); board->gameOver = (XP_Bool)stream_getBits( stream, 1 ); board->showColors = (XP_Bool)stream_getBits( stream, 1 ); - board->showCellValues = (XP_Bool)stream_getBits( stream, 1 ); + // board->showCellValues = (XP_Bool) + // FIX_NEXT_VERSION_CHANGE: remove this conditionally + (void)stream_getBits( stream, 1 ); /* REMOVE ME */ if ( version >= STREAM_VERS_KEYNAV ) { board->focussed = (BoardObjectType)stream_getBits( stream, 2 ); @@ -330,7 +332,8 @@ board_writeToStream( const BoardCtxt* board, XWStreamCtxt* stream ) stream_putBits( stream, 1, board->isFlipped ); stream_putBits( stream, 1, board->gameOver ); stream_putBits( stream, 1, board->showColors ); - stream_putBits( stream, 1, board->showCellValues ); + // FIX_NEXT_VERSION_CHANGE: remove this + stream_putBits( stream, 1, 0 ); // board->showCellValues ); stream_putBits( stream, 2, board->focussed ); #ifdef KEYBOARD_NAV stream_putBits( stream, 1, board->focusHasDived ); @@ -684,13 +687,10 @@ board_getScale( BoardCtxt* board, XP_U16* hScale, XP_U16* vScale ) XP_Bool board_prefsChanged( BoardCtxt* board, const CommonPrefs* cp ) { - XP_Bool showArrowChanged; - XP_Bool hideValChanged; - XP_Bool showColorsChanged; - - showArrowChanged = cp->showBoardArrow == board->disableArrow; - hideValChanged = cp->hideTileValues != board->hideValsInTray; - showColorsChanged = board->showColors != cp->showColors; + XP_Bool showArrowChanged = cp->showBoardArrow == board->disableArrow; + XP_Bool hideValChanged = cp->hideTileValues != board->hideValsInTray; + XP_Bool showColorsChanged = board->showColors != cp->showColors; + XP_Bool showValsChanged = board->tvType != cp->tvType; board->disableArrow = !cp->showBoardArrow; board->hideValsInTray = cp->hideTileValues; @@ -700,6 +700,7 @@ board_prefsChanged( BoardCtxt* board, const CommonPrefs* cp ) #ifdef XWFEATURE_CROSSHAIRS board->hideCrosshairs = cp->hideCrosshairs; #endif + board->tvType = cp->tvType; if ( showArrowChanged ) { showArrowChanged = setArrowVisible( board, XP_FALSE ); @@ -707,7 +708,7 @@ board_prefsChanged( BoardCtxt* board, const CommonPrefs* cp ) if ( hideValChanged ) { board_invalTrayTiles( board, ALLTILES ); } - if ( showColorsChanged ) { + if ( showColorsChanged || showValsChanged ) { board->scoreBoardInvalid = XP_TRUE; showColorsChanged = invalCellsWithTiles( board ); } @@ -2059,23 +2060,6 @@ board_inTrade( const BoardCtxt* board, XP_Bool* anySelected ) return pti->tradeInProgress; } -XP_Bool -board_toggle_showValues( BoardCtxt* board ) -{ - XP_Bool changed; - board->showCellValues = !board->showCellValues; - - /* We show the tile values when showCellValues is set even if - hideValsInTray is set. So inval the tray if there will be a change. - And set changed to true in case there are no tiles on the baord yet. - */ - changed = board->hideValsInTray && (board->trayVisState == TRAY_REVEALED); - if ( changed ) { - board_invalTrayTiles( board, ALLTILES ); - } - return invalCellsWithTiles( board ) || changed; -} /* board_toggle_showValues */ - XP_Bool board_replaceNTiles( BoardCtxt* board, XWEnv xwe, XP_U16 nTiles ) { diff --git a/xwords4/common/board.h b/xwords4/common/board.h index cd369defc..8dc0728b8 100644 --- a/xwords4/common/board.h +++ b/xwords4/common/board.h @@ -148,7 +148,6 @@ XP_Bool board_draw( BoardCtxt* board, XWEnv xwe ); XP_Bool board_get_flipped( const BoardCtxt* board ); XP_Bool board_flip( BoardCtxt* board ); XP_Bool board_inTrade( const BoardCtxt* board, XP_Bool* anySelected ); -XP_Bool board_toggle_showValues( BoardCtxt* board ); XP_Bool board_replaceTiles( BoardCtxt* board, XWEnv xwe ); XP_Bool board_redoReplacedTiles( BoardCtxt* board, XWEnv xwe ); diff --git a/xwords4/common/boarddrw.c b/xwords4/common/boarddrw.c index 5c25c3bce..f62a480c8 100644 --- a/xwords4/common/boarddrw.c +++ b/xwords4/common/boarddrw.c @@ -269,7 +269,7 @@ drawBoard( BoardCtxt* board, XWEnv xwe ) && draw_boardBegin( board->draw, xwe, &board->boardBounds, board->sd[SCROLL_H].scale, board->sd[SCROLL_V].scale, - dfsFor( board, OBJ_BOARD ) ) ) { + dfsFor( board, OBJ_BOARD ), board->tvType ) ) { XP_Bool allDrawn = XP_TRUE; XP_S16 ii; @@ -404,8 +404,7 @@ drawCell( BoardCtxt* board, XWEnv xwe, const XP_U16 col, HintAtts hintAtts; CellFlags flags = CELL_NONE; XP_Bool isOrigin; - XP_UCHAR valBuf[4]; - XP_UCHAR* value = NULL; + XP_U16 value = 0; isEmpty = !model_getTile( model, modelCol, modelRow, showPending, selPlayer, &tile, &isBlank, @@ -426,17 +425,13 @@ drawCell( BoardCtxt* board, XWEnv xwe, const XP_U16 col, break; } else { Tile valTile = isBlank? dict_getBlankTile( dict ) : tile; - XP_U16 val = dict_getTileValue( dict, valTile ); + value = dict_getTileValue( dict, valTile ); if ( board->showColors ) { owner = (XP_S16)model_getCellOwner( model, modelCol, modelRow ); } - if ( board->showCellValues ) { - XP_SNPRINTF( valBuf, VSIZE(valBuf), "%d", val ); - value = valBuf; - } if ( dict_faceIsBitmap( dict, tile ) ) { dict_getFaceBitmaps( dict, tile, &bitmaps ); bptr = &bitmaps; @@ -550,7 +545,7 @@ drawDragTileIf( BoardCtxt* board, XWEnv xwe ) if ( isBlank ) { flags |= CELL_ISBLANK; } - if ( board->hideValsInTray && !board->showCellValues ) { + if ( board->hideValsInTray ) { flags |= CELL_VALHIDDEN; } draw_drawTileMidDrag( board->draw, xwe, &rect, face, diff --git a/xwords4/common/boardp.h b/xwords4/common/boardp.h index 8aacb6f58..9b0168e89 100644 --- a/xwords4/common/boardp.h +++ b/xwords4/common/boardp.h @@ -177,6 +177,7 @@ struct BoardCtxt { #ifdef XWFEATURE_CROSSHAIRS XP_Bool hideCrosshairs; #endif + TileValueType tvType; XP_Bool eraseTray; XP_Bool boardObscuresTray; @@ -228,7 +229,7 @@ struct BoardCtxt { XW_TrayVisState trayVisState; XP_Bool penTimerFired; - XP_Bool showCellValues; + XP_Bool unused_showCellValues; XP_Bool showColors; MPSLOT diff --git a/xwords4/common/comtypes.h b/xwords4/common/comtypes.h index eac0fd3d4..c50d79b0b 100644 --- a/xwords4/common/comtypes.h +++ b/xwords4/common/comtypes.h @@ -216,6 +216,14 @@ typedef enum { BONUS_LAST } XWBonusType; +typedef enum _TileValueType { + TVT_BOTH, + TVT_FACES, + TVT_VALUES, + + TVT_N_ENTRIES, +} TileValueType; + /* For now, let's define keys here. Old method based on __FILE__ was * stupid. Can be more clever later -- as long as these don't change again */ @@ -262,6 +270,7 @@ typedef struct CommonPrefs { #ifdef XWFEATURE_ROBOTPHONIES XP_U16 makePhonyPct; #endif + TileValueType tvType; } CommonPrefs; typedef struct _PlayerDicts { diff --git a/xwords4/common/draw.h b/xwords4/common/draw.h index 5e5eb52fc..7cc515df4 100644 --- a/xwords4/common/draw.h +++ b/xwords4/common/draw.h @@ -123,7 +123,7 @@ typedef struct DrawCtxVTable { XP_Bool DRAW_VTABLE_NAME(boardBegin) ( DrawCtx* dctx, XWEnv xwe, const XP_Rect* rect, XP_U16 hScale, XP_U16 vScale, - DrawFocusState dfs ); + DrawFocusState dfs, TileValueType tvType ); void DRAW_VTABLE_NAME(objFinished)( DrawCtx* dctx, XWEnv xwe, BoardObjectType typ, const XP_Rect* rect, DrawFocusState dfs ); @@ -179,7 +179,7 @@ typedef struct DrawCtxVTable { XP_Bool DRAW_VTABLE_NAME(drawCell) ( DrawCtx* dctx, XWEnv xwe, const XP_Rect* rect, /* at least one of these two will be null */ const XP_UCHAR* text, const XP_Bitmaps* bitmaps, - Tile tile, const XP_UCHAR* value, /* null if hidden */ + Tile tile, XP_U16 value, XP_S16 owner, /* -1 means don't use */ XWBonusType bonus, HintAtts hintAtts, CellFlags flags ); @@ -279,8 +279,8 @@ struct DrawCtx { #define draw_dictChanged( dc, e, n, d ) CALL_DRAW_NAME2(dictChanged, (dc),(e),(n),(d)) #define draw_beginDraw( dc,e ) CALL_DRAW_NAME0(beginDraw, (dc), (e)) #define draw_endDraw( dc,e ) CALL_DRAW_NAME0(endDraw, (dc), (e)) -#define draw_boardBegin( dc,e,r,h,v,f ) CALL_DRAW_NAME4(boardBegin, (dc), (e), \ - (r),(h),(v),(f)) +#define draw_boardBegin( dc,e,r,h,v,f,tvt ) CALL_DRAW_NAME5(boardBegin, (dc), (e), \ + (r),(h),(v),(f), (tvt)) #define draw_objFinished( dc, e, t, r, d ) \ CALL_DRAW_NAME3(objFinished, (dc),(e), (t), (r), (d)) #define draw_trayBegin( dc, e, r, o, s, f ) \ diff --git a/xwords4/common/tray.c b/xwords4/common/tray.c index bfe4df32a..76c8927c2 100644 --- a/xwords4/common/tray.c +++ b/xwords4/common/tray.c @@ -172,7 +172,7 @@ drawTray( BoardCtxt* board, XWEnv xwe ) XP_U16 numInTray = countTilesToShow( board ); XP_Bool isBlank; XP_Bool isADrag = dragDropInProgress( board ); - CellFlags baseFlags = board->hideValsInTray && !board->showCellValues + CellFlags baseFlags = board->hideValsInTray ? CELL_VALHIDDEN : CELL_NONE; dragDropGetTrayChanges( board, &ddRmvdIndx, &ddAddedIndx ); diff --git a/xwords4/linux/cursesboard.c b/xwords4/linux/cursesboard.c index fcaa0db60..9a2deea1e 100644 --- a/xwords4/linux/cursesboard.c +++ b/xwords4/linux/cursesboard.c @@ -1180,13 +1180,9 @@ handleFlip( void* closure, int XP_UNUSED(key) ) } /* handleFlip */ static bool -handleToggleValues( void* closure, int XP_UNUSED(key) ) +handleToggleValues( void* XP_UNUSED(closure), int XP_UNUSED(key) ) { - CursesBoardGlobals* bGlobals = (CursesBoardGlobals*)closure; - CommonGlobals* cGlobals = &bGlobals->cGlobals; - if ( board_toggle_showValues( cGlobals->game.board ) ) { - board_draw( cGlobals->game.board, NULL_XWE ); - } + XP_ASSERT( 0 ); return XP_TRUE; } /* handleToggleValues */ diff --git a/xwords4/linux/cursesdraw.c b/xwords4/linux/cursesdraw.c index 0a28cb905..7ecf4a939 100644 --- a/xwords4/linux/cursesdraw.c +++ b/xwords4/linux/cursesdraw.c @@ -95,7 +95,8 @@ static XP_Bool curses_draw_boardBegin( DrawCtx* XP_UNUSED(p_dctx), XWEnv XP_UNUSED(xwe), const XP_Rect* XP_UNUSED(rect), XP_U16 XP_UNUSED(width), XP_U16 XP_UNUSED(height), - DrawFocusState XP_UNUSED(dfs) ) + DrawFocusState XP_UNUSED(dfs), + TileValueType XP_UNUSED(tvType) ) { return XP_TRUE; } /* curses_draw_boardBegin */ @@ -392,7 +393,7 @@ static XP_Bool curses_draw_drawCell( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, const XP_UCHAR* letter, const XP_Bitmaps* XP_UNUSED(bitmaps), - Tile XP_UNUSED(tile), const XP_UCHAR* XP_UNUSED(value), + Tile XP_UNUSED(tile), const XP_U16 XP_UNUSED(value), XP_S16 XP_UNUSED(owner), XWBonusType bonus, HintAtts XP_UNUSED(hintAtts), CellFlags flags ) { diff --git a/xwords4/linux/gtkboard.c b/xwords4/linux/gtkboard.c index 918e730a0..05ceb431d 100644 --- a/xwords4/linux/gtkboard.c +++ b/xwords4/linux/gtkboard.c @@ -1221,9 +1221,10 @@ static gboolean handle_value_button( GtkWidget* XP_UNUSED(widget), gpointer closure ) { GtkGameGlobals* globals = (GtkGameGlobals*)closure; - if ( board_toggle_showValues( globals->cGlobals.game.board ) ) { - board_draw( globals->cGlobals.game.board, NULL_XWE ); - } + CommonGlobals* cGlobals = &globals->cGlobals; + cGlobals->cp.tvType = (cGlobals->cp.tvType + 1) % TVT_N_ENTRIES; + board_prefsChanged( cGlobals->game.board, &cGlobals->cp ); + board_draw( cGlobals->game.board, NULL_XWE ); return TRUE; } /* handle_value_button */ diff --git a/xwords4/linux/gtkboard.h b/xwords4/linux/gtkboard.h index f3533215c..cc4aac949 100644 --- a/xwords4/linux/gtkboard.h +++ b/xwords4/linux/gtkboard.h @@ -77,7 +77,7 @@ typedef struct GtkDrawCtx { XP_U16 trayOwner; XP_U16 cellWidth; XP_U16 cellHeight; - + TileValueType tvType; XP_Bool scoreIsVertical; } GtkDrawCtx; diff --git a/xwords4/linux/gtkdraw.c b/xwords4/linux/gtkdraw.c index c8a497e06..55977450d 100644 --- a/xwords4/linux/gtkdraw.c +++ b/xwords4/linux/gtkdraw.c @@ -490,12 +490,13 @@ gtk_draw_endDraw( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe) ) static XP_Bool gtk_draw_boardBegin( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, XP_U16 width, XP_U16 height, - DrawFocusState XP_UNUSED(dfs) ) + DrawFocusState XP_UNUSED(dfs), TileValueType tvType ) { GdkRectangle gdkrect; GtkDrawCtx* dctx = (GtkDrawCtx*)(void*)p_dctx; dctx->cellWidth = width; dctx->cellHeight = height; + dctx->tvType = tvType; gtkSetForeground( dctx, &dctx->black ); @@ -610,7 +611,7 @@ static XP_Bool gtk_draw_drawCell( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, const XP_UCHAR* letter, const XP_Bitmaps* bitmaps, Tile XP_UNUSED(tile), - const XP_UCHAR* value, XP_S16 owner, XWBonusType bonus, + const XP_U16 tileValue, XP_S16 owner, XWBonusType bonus, HintAtts hintAtts, CellFlags flags ) { GtkDrawCtx* dctx = (GtkDrawCtx*)(void*)p_dctx; @@ -623,6 +624,10 @@ gtk_draw_drawCell( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, ((flags & CELL_ISCURSOR) != 0) ? &dctx->cursor : NULL; GdkRGBA* foreground = &dctx->white; + XP_UCHAR valBuf[4]; + XP_SNPRINTF( valBuf, sizeof(valBuf), "%d", tileValue ); + const XP_UCHAR* value = valBuf; + gtkEraseRect( dctx, rect ); gtkInsetRect( &rectInset, 1 ); @@ -669,6 +674,7 @@ gtk_draw_drawCell( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, XP_GTK_JUST_CENTER, &dctx->black, NULL ); } } else if ( !!bitmaps && !!bitmaps->bmps[0] ) { + XP_ASSERT(0); /* we don't handle this now */ XP_Rect tmpRect = *rect; if ( !!value ) { tmpRect.width = tmpRect.width * 3 / 4; @@ -676,6 +682,14 @@ gtk_draw_drawCell( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, } drawBitmapFromLBS( dctx, bitmaps->bmps[0], &tmpRect ); } else if ( !!letter ) { + TileValueType useTyp = dctx->tvType; + if ( TVT_VALUES == useTyp ) { + letter = value; + useTyp = TVT_FACES; + } + if ( TVT_FACES == useTyp ) { + value = NULL; + } XP_Bool isBlank = (flags & CELL_ISBLANK) != 0; if ( cursor ) { gtkSetForeground( dctx, cursor ); @@ -722,12 +736,13 @@ gtk_draw_drawCell( DrawCtx* p_dctx, XWEnv XP_UNUSED(xwe), const XP_Rect* rect, } if ( !!value ) { + const int fraction = 3; XP_Rect tmpRect = *rect; - tmpRect.left += tmpRect.width * 3 / 4; - tmpRect.width /= 4; - tmpRect.top += tmpRect.height * 3 / 4; - tmpRect.height /= 4; - draw_string_at( dctx, NULL, value, dctx->cellHeight/4, &tmpRect, + tmpRect.left += tmpRect.width * (fraction-1) / fraction; + tmpRect.width /= fraction; + tmpRect.top += tmpRect.height * (fraction-1) / fraction; + tmpRect.height /= fraction; + draw_string_at( dctx, NULL, value, dctx->cellHeight/fraction, &tmpRect, XP_GTK_JUST_CENTER, foreground, cursor ); }