/// <summary> /// 編集項目テキストボックスフォーカス移動後の処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnItemTextBoxValidated(object sender, EventArgs e) { // 選択中の国家がなければ戻る if (countryListBox.SelectedIndex < 0) { return; } Country country = Countries.Tags[countryListBox.SelectedIndex]; // 選択中のユニット名種類がなければ戻る UnitClass unit = typeListBox.SelectedItem as UnitClass; if (unit == null) { return; } TextBox textBox = sender as TextBox; if (textBox == null) { return; } int index = (int)textBox.Tag; if (unit.ExistsModelName(index, country)) { // 値に変化がなければ何もしない if (textBox.Text.Equals(unit.GetCountryModelName(index, country))) { return; } if (string.IsNullOrEmpty(textBox.Text)) { // 変更後の文字列が空ならば国別のモデル名を削除する unit.RemoveModelName(index, country); } else { // 値を更新する unit.SetModelName(index, country, textBox.Text); } } else { // 値に変化がなければ何もしない if (string.IsNullOrEmpty(textBox.Text)) { return; } // 値を更新する unit.SetModelName(index, country, textBox.Text); } // 編集済みフラグを設定する UnitModel model = unit.Models[index]; model.SetDirtyName(country); Units.SetDirtyModelName(country, unit.Type); // 文字色を変更する textBox.ForeColor = Color.Red; // 編集済みフラグが更新されるため国家リストボックスの表示を更新する countryListBox.Refresh(); typeListBox.Refresh(); // ユニットモデル名の更新を通知する HoI2EditorController.OnItemChanged(EditorItemId.CountryModelName, this); }
/// <summary> /// 編集項目の表示を更新する /// </summary> private void UpdateEditableItems() { itemPanel.Controls.Clear(); // 選択中の国家がなければ戻る if (countryListBox.SelectedIndex < 0) { return; } Country country = Countries.Tags[countryListBox.SelectedIndex]; // 選択中のユニット名種類がなければ戻る UnitClass unit = typeListBox.SelectedItem as UnitClass; if (unit == null) { return; } Graphics g = Graphics.FromHwnd(Handle); int itemHeight = DeviceCaps.GetScaledHeight(25); int labelStartX = DeviceCaps.GetScaledWidth(10); int labelStartY = DeviceCaps.GetScaledHeight(13); int textBoxStartY = DeviceCaps.GetScaledHeight(10); int labelEditMargin = DeviceCaps.GetScaledWidth(10); int columnMargin = DeviceCaps.GetScaledWidth(10); int textBoxWidthBase = DeviceCaps.GetScaledWidth(100); int textBoxWidthMargin = DeviceCaps.GetScaledWidth(8); int textBoxHeight = DeviceCaps.GetScaledHeight(19); int itemsPerColumn = (itemPanel.DisplayRectangle.Height - textBoxStartY * 2) / itemHeight; int labelX = labelStartX; int index = 0; while (index < unit.Models.Count) { int max = Math.Min(unit.Models.Count - index, itemsPerColumn) + index; int labelY = labelStartY; int maxLabelWidth = 0; int maxEditWidth = textBoxWidthBase; for (int i = index; i < max; i++) { // ラベルを作成する Label label = new Label { Text = $"{i}: {unit.GetModelName(i)}", AutoSize = true, Location = new Point(labelX, labelY) }; itemPanel.Controls.Add(label); maxLabelWidth = Math.Max(maxLabelWidth, label.Width); labelY += itemHeight; // テキストボックスの最大幅を求める if (unit.ExistsModelName(i, country)) { string s = unit.GetCountryModelName(i, country); maxEditWidth = Math.Max(maxEditWidth, (int)g.MeasureString(s, Font).Width + textBoxWidthMargin); } } int textBoxX = labelX + maxLabelWidth + labelEditMargin; int textBoxY = textBoxStartY; for (int i = index; i < max; i++) { // テキストボックスを作成する TextBox textBox = new TextBox { Size = new Size(maxEditWidth, textBoxHeight), Location = new Point(textBoxX, textBoxY), ForeColor = unit.Models[i].IsDirtyName(country) ? Color.Red : SystemColors.WindowText, Tag = i }; if (unit.ExistsModelName(i, country)) { textBox.Text = unit.GetCountryModelName(i, country); } textBox.Validated += OnItemTextBoxValidated; itemPanel.Controls.Add(textBox); textBoxY += itemHeight; } // 次の列へ移動する index += itemsPerColumn; labelX = textBoxX + maxEditWidth + columnMargin; } // スクロールバーの位置を調整するため最終列の次にダミーラベルを作成する itemPanel.Controls.Add(new Label { Location = new Point(labelX, labelStartY), AutoSize = true }); }