mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2024-12-27 09:58:45 +01:00
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.
This commit is contained in:
parent
64f1d83b5d
commit
be0a6f83f3
24 changed files with 196 additions and 115 deletions
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -66,9 +66,6 @@
|
|||
<item android:id="@+id/board_menu_chat"
|
||||
android:title="@string/menu_chat"
|
||||
/>
|
||||
<item android:id="@+id/board_menu_toggle"
|
||||
android:title="@string/menu_toggle_values"
|
||||
/>
|
||||
|
||||
<item android:title="@string/board_submenu_game">
|
||||
<menu>
|
||||
|
|
13
xwords4/android/app/src/main/res/menu/tile_values.xml
Normal file
13
xwords4/android/app/src/main/res/menu/tile_values.xml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/values_both"
|
||||
android:title="@string/values_menu_both"
|
||||
/>
|
||||
<item android:id="@+id/values_faces"
|
||||
android:title="@string/values_menu_faces"
|
||||
/>
|
||||
<item android:id="@+id/values_values"
|
||||
android:title="@string/values_menu_values"
|
||||
/>
|
||||
</menu>
|
|
@ -15,6 +15,7 @@
|
|||
<string name="key_sort_tiles">key_sort_tiles</string>
|
||||
<string name="key_peek_other">key_peek_other</string>
|
||||
<string name="key_hide_crosshairs">key_hide_crosshairs</string>
|
||||
<string name="key_tile_valuetype">key_tile_valuetype</string>
|
||||
<string name="key_hide_values">key_hide_values</string>
|
||||
<string name="key_hide_title">key_hide_title</string>
|
||||
<string name="key_hide_newgames">key_hide_newgames</string>
|
||||
|
|
|
@ -1813,8 +1813,6 @@
|
|||
<!-- -->
|
||||
<string name="menu_chat">Chat</string>
|
||||
<string name="chat_sender_fmt">%1$s:</string>
|
||||
<!-- -->
|
||||
<string name="menu_toggle_values">Toggle values</string>
|
||||
<!-- board menu for small devices only -->
|
||||
<string name="board_menu_dict">Browse wordlist</string>
|
||||
<!-- -->
|
||||
|
@ -2673,4 +2671,10 @@
|
|||
Tap this and you'll get taken to the "Game configure"
|
||||
screen -->
|
||||
<string name="newgame_configure_first">Configure first</string>
|
||||
</resources>
|
||||
|
||||
<!-- For the (new) popup menu for how tile displayed on board -->
|
||||
<string name="values_menu_faces">Letters only</string>
|
||||
<string name="values_menu_values">Values only</string>
|
||||
<string name="values_menu_both">Letters and Values</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 ) \
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ typedef struct GtkDrawCtx {
|
|||
XP_U16 trayOwner;
|
||||
XP_U16 cellWidth;
|
||||
XP_U16 cellHeight;
|
||||
|
||||
TileValueType tvType;
|
||||
XP_Bool scoreIsVertical;
|
||||
} GtkDrawCtx;
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue