/// <summary> /// 開始局面をsfenで与えて、そのあとの指し手をmovesとして渡すとそれを棋譜として読み込む。 /// 継ぎ盤用。ply手進めた局面にする。 /// </summary> public void SetBoardDataCommand(MiniShogiBoardData data, int ply) { AddCommand( () => { Debug.Assert(data != null); var sfen = data.moves.Count == 0 ? data.rootSfen : $"sfen {data.rootSfen} moves { Core.Util.MovesToUsiString(data.moves) }"; // 対局中ではないので、EnableKifuList == falseになっているが、 // 一時的にこれをtrueにしないと、読み込んだ棋譜に対して、Tree.KifuListが同期しない。 // ゆえに、読み込みの瞬間だけtrueにして、そのあとfalseに戻す。 kifuManager.EnableKifuList = true; var error = kifuManager.FromString(sfen); kifuManager.EnableKifuList = false; if (error != null) { TheApp.app.MessageShow(error); } else { RaisePropertyChanged("SetKifuListIndex", ply); // rootの局面からply手進める } } ); }
/// <summary> /// 開始局面をsfenで与えて、そのあとの指し手をmovesとして渡すとそれを棋譜として読み込む。 /// 継ぎ盤用。ply手進めた局面にする。 /// </summary> public void SetBoardDataCommand(MiniShogiBoardData data, int ply) { AddCommand( () => { Debug.Assert(data != null); // 対局中ではないので、EnableKifuList == falseになっているが、 // 一時的にこれをtrueにしないと、読み込んだ棋譜に対して、Tree.KifuListが同期しない。 // ゆえに、読み込みの瞬間だけtrueにして、そのあとfalseに戻す。 kifuManager.EnableKifuList = true; var error = kifuManager.FromString(Core.Util.RootSfenAndMovesToUsiString(data.rootSfen, data.moves)); kifuManager.EnableKifuList = false; if (error != null) { TheApp.app.MessageShow(error, MessageShowType.Error); } else { // rootの局面からply手進める UpdateKifuSelectedIndex(ply); } } ); }
/// <summary> /// PV(最善応手列)をお抱えのMiniShogiBoardに反映させる。 /// </summary> /// <param name="data"></param> private void SendPvToMiniboard(MiniShogiBoardData data) { // 自分がminiShogiBoardを抱えているなら、強制表示。 if (Controls.Contains(miniShogiBoard1)) { MiniShogiBoardVisible = true; } miniShogiBoard1.BoardData = data; }
/// <summary> /// PV(最善応手列)をお抱えのMiniShogiBoardに反映させる。 /// </summary> /// <param name="data"></param> private void SendPvToMiniboard(MiniShogiBoardData data) { // 自分がminiShogiBoardを抱えているなら、強制表示。 if (tabControl1.TabPages.Contains(tabPage1)) { MiniShogiBoardTabVisible = true; } miniShogiBoard1.BoardData = data; }
/// <summary> /// 右クリックメニュー「メイン棋譜をこの読み筋で置き換える(&R)」 /// </summary> /// <param name="board"></param> private void RepalceMainKifu(MiniShogiBoardData board) { // 棋譜が開始局面だけのときは、破壊的変更とは言えないのでその場合は警告を出さないことにする。 if (gameScreenControl1.gameServer.KifuDirty && gameServer.KifuList.Count > 1) { if (TheApp.app.MessageShow("未保存の棋譜が残っていますが、本当にメイン棋譜を置き換えますか?", MessageShowType.WarningOkCancel) != DialogResult.OK) { return; } } var sfen = Model.Shogi.Core.Util.RootSfenAndMovesToUsiString(board.rootSfen, board.moves); gameServer.KifuReadCommand(sfen, false, true); }
/// <summary> /// 検討ウインドウでの右クリックメニュー「メイン棋譜にこの読み筋を分岐棋譜として送る(&S)」 /// </summary> /// <param name="board"></param> private void SendToMainKifu(MiniShogiBoardData board) { #if false if (gameScreenControl1.gameServer.KifuDirty) { if (TheApp.app.MessageShow("未保存の棋譜が残っていますが、本当にメイン棋譜に分岐棋譜として取り込みますか?", MessageShowType.WarningOkCancel) != DialogResult.OK) { return; } } #endif // 分岐棋譜として加わるだけだから破壊的変更とも言えないのでこの警告はオフにする。 var sfen = Model.Shogi.Core.Util.RootSfenAndMovesToUsiString(board.rootSfen, board.moves); gameServer.KifuReadCommand(sfen, /* merge = */ true, true); }
/// <summary> /// 検討ウインドウでの右クリックメニュー /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listView1_MouseDown(object sender, MouseEventArgs e) { var early_exit = true; ListViewItem targetItem = null; try { // 右クリックではないなら帰る // TODO : 左クリックならこの読み筋、再度ミニ盤面に送るべきでは。 if (e.Button != MouseButtons.Right) { return; } targetItem = listView1.GetItemAt(e.X, e.Y); if (targetItem == null) { return; } // これが読み筋のある有効なItemであるかを確認しないといけないが…。 // まあ、読み筋が書いてあればとりまOk(あとでよく考える) var pv_text = targetItem.SubItems[6].Text; if (pv_text.Empty()) { return; } // 抜けないことが確定した early_exit = false; } finally { // なんか変なところをクリックしたので右クリックメニューを隠す if (early_exit) { ResetContextMenu(); } } // コンテキストメニューを表示する。 contextMenuStrip1.Show(Cursor.Position); // このコンテキストメニューはどのItemに対して出しているのかを記録しておく。 selectedListViewItem = targetItem; // -- この瞬間のアイテムを保存しておく // (右クリックメニューが選ばれるときには異なる内容になっている可能性があるので) // ここの文字列そのまま取得 pvTextOnClick = selectedListViewItem.SubItems[6].Text; // ここの文字列そのまま取得 var index = selectedListViewItem.Index; if (!(0 <= index && index < list_item_moves.Count)) { return; } if (root_sfen == null) { return; } boardDataOnRightClick = new MiniShogiBoardData() { rootSfen = root_sfen, moves = list_item_moves[index] }; }