/// <summary> /// 対局結果の保存設定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, System.EventArgs e) { using (var dialog = new GameResultWindowSettingDialog()) { FormLocationUtility.CenteringToThisForm(dialog, this); dialog.ShowDialog(this); } SelectListView(); }
/// <summary> /// 詰検討エンジンの設定ダイアログを表示する。 /// (イベントハンドラを適切に設定した上で) /// </summary> private void ShowMateEngineSettingDialog() { using (var dialog = new ConsiderationEngineSettingDialog()) { FormLocationUtility.CenteringToThisForm(dialog, this); var setting = TheApp.app.Config.MateEngineSetting; dialog.ViewModel.DialogType = ConsiderationEngineSettingDialogType.MateSetting; dialog.ViewModel.AddPropertyChangedHandler("StartButtonClicked", _ => ToggleMateConsideration()); dialog.Bind(setting); dialog.ShowDialog(this); } }
/// <summary> /// 選択ダイアログの生成 /// </summary> private void CreateEngineSelectionDialog(SCore.Color c) { // 詳細設定ボタンの無効化と、このエンジン選択ダイアログを閉じる時に詳細設定ボタンの再有効化。 using (var dialog = new EngineSelectionDialog()) { dialog.InitEngineDefines(true, false); var playerSettings = new[] { playerSettingControl1, playerSettingControl2 }; // エンジンを選択し、「選択」ボタンが押された時のイベントハンドラ dialog.ViewModel.AddPropertyChangedHandler("ButtonClicked", (args) => { // これが選択された。 var engineDefine = (EngineDefineEx)args.value; var vm = playerSettings[(int)c].ViewModel; vm.EngineDefineFolderPath = engineDefine.FolderPath; vm.RaisePropertyChanged("EngineSelected", null); // CPUのradio buttonを選択。先にEngineDefineを設定してからでないとエンジン選択ダイアログがまた出てしまう。 Debug.Assert(engineDefine.FolderPath != null); var indivisualEngine = TheApp.app.EngineConfigs.NormalConfig.Find(engineDefine.FolderPath); var preset = indivisualEngine.SelectedPresetIndex; if (preset < 0) // 前回未選択だと-1がありうるので0に補整してやる。 { preset = 0; } var setting = TheApp.app.Config.GameSetting; //setting.PlayerSetting(c).SelectedEnginePreset = preset; // TwoWayでbindingしているのでこれで値変わるはずだが同じ番号が選ばれるとイベントが発生しなくて…。 setting.PlayerSetting(c).SetValueAndRaisePropertyChanged("SelectedEnginePreset", preset); // プレイヤー表示名の変更。 setting.PlayerSetting(c).PlayerName = engineDefine.EngineDefine.DisplayName; dialog.Close(); }); // modal dialogとして出すべき。 FormLocationUtility.CenteringToThisForm(dialog, this); dialog.ShowDialog(Parent); engineSelectionDialog = dialog; // あとで何らかの操作をするときのためにMainWindowにもたせておく。 } }
/// <summary> /// エンジンオプション設定ダイアログを出す。 /// /// この構築のために思考エンジンに接続してoption文字列を取得しないといけなかったりしてわりと大変。 /// </summary> private void ShowEngineOptionSettingDialog() { var dialog = EngineOptionSettingDialogBuilder.Build( EngineCommonOptionsSample.CreateEngineCommonOptions(), // 共通設定のベース TheApp.app.EngineConfigs.NormalConfig, // 共通設定の値はこの値で上書き ViewModel.EngineDefineFolderPath // 個別設定の情報はここにある。 ); // 構築に失敗。 if (dialog == null) { return; } // 「詳細設定」ボタンをDisableにする。 //ViewModel.SettingButton = false; // → この処理やめる。modal dialogとして出せばOk. FormLocationUtility.CenteringToThisForm(dialog, this.Parent as Form /* thisはControlなのでParentはFormのはず.. */); // modal dialogとして出す dialog.ShowDialog(this.Parent); }
/// <summary> /// 現在のデスクトップのサイズに合わせて画面サイズにしてやる。(起動時用) /// </summary> public void FitToScreenSize() { // 前回起動時のサイズが記録されているならそれを復元してやる。 var size = TheApp.app.Config.MainDialogClientSize; if (size.Width < 192 || size.Height < 108) { size = Size.Empty; } if (size.IsEmpty) { // ディスプレイに収まるサイズのスクリーンにする必要がある。 // プライマリスクリーンを基準にして良いのかどうかはわからんが、 // 初回起動なのでとりあえずプライマリスクリーンに表示させるしかないので、そこを基準に考える。 int w = Screen.PrimaryScreen.Bounds.Width; int h = Screen.PrimaryScreen.Bounds.Height - menu_height; // いっぱいいっぱいだと邪魔なので70%ぐらい使う。(検討ウィンドウのこともあるので…) w = (int)(w * 0.7); h = (int)(h * 0.7); // 縦(h)を基準に横方向のクリップ位置を決める // 1920 * 1080が望まれる比率 int w2 = h * 1920 / 1080; if (w > w2) { w = w2; // 横幅が余りつつも画面にぴったりなのでこのサイズで生成する。 } else { int h2 = w * 1080 / 1920; h = h2; } ClientSize = new Size(w, h + menu_height); } else { ClientSize = size; } MinimumSize = new Size(192 * 2, 108 * 2 + menu_height); // 前回のスクリーンの表示位置を復元する。 var desktopLocation = TheApp.app.Config.DesktopLocation; bool reset = false; // 位置を初期化するのかのフラグ if (desktopLocation == null) { reset = true; } else { // これが現在のいずれかの画面上であることを保証しなくてはならない。 foreach (var s in Screen.AllScreens) { if (s.Bounds.Left <= desktopLocation.Value.X && desktopLocation.Value.X < s.Bounds.Right && s.Bounds.Top <= desktopLocation.Value.Y && desktopLocation.Value.Y < s.Bounds.Bottom) { goto Ok; } } reset = true; } Ok: if (reset) { // 表示される位置があまりデスクトップの下の方だとウィンドウが画面下にめり込んでしまうのでデスクトップに対してセンタリングする。 // → 検討ウィンドウの表示のことを考えて、少し上らへんにする。 desktopLocation = FormLocationUtility.DesktopLocation(this, 50, 25); // Desktopに対して左から50%(center),25%(上寄り)にする。 } DesktopLocation = desktopLocation.Value; }