public void 最後の小節の後ろに小節を4つ追加する() { int 最大小節番号 = this.SSTFormatScore.最大小節番号を返す(); // 最終小節の小節先頭位置grid と 小節長倍率 を取得する。 int 小節先頭位置grid = this.小節先頭の譜面内絶対位置gridを返す(最大小節番号); int 小節の長さgrid = this.小節長をグリッドで返す(最大小節番号); double 最終小節の小節長倍率 = this.SSTFormatScore.小節長倍率を取得する(最大小節番号); // ダミーで置いた Unknown チップがあれば削除する。 this.チップを削除する(編集レーン種別.Unknown, 小節先頭位置grid); // 新しくダミーの Unknown チップを、最終小節番号の控え+4の小節の先頭に置く。 var dummyChip = new 描画用チップ() { チップ種別 = チップ種別.Unknown, 小節番号 = 最大小節番号 + 4, 小節解像度 = 1, 小節内位置 = 0, 譜面内絶対位置grid = 小節先頭位置grid + 小節の長さgrid + (this.Form.GRID_PER_PART * 3), }; var 更後チップ = new 描画用チップ(dummyChip); var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 小節長倍率, 任意2) => { this.SSTFormatScore.チップリスト.Remove(更対象); for (int i = 0; i < 4; i++) { this.SSTFormatScore.小節長倍率リスト.RemoveAt(更後.小節番号 - 3); } }, Redoアクション: (更対象, 更前, 更後, 小節長倍率, 任意2) => { 更対象.CopyFrom(更後); this.SSTFormatScore.チップリスト.Add(更対象); this.SSTFormatScore.チップリスト.Sort(); if ((double)小節長倍率 != 1.0) // 増設した4つの小節の小節長倍率を、最終小節の小節長倍率と同じにする。1.0 の場合は何もしない。 { for (int i = 0; i < 4; i++) { this.SSTFormatScore.小節長倍率を設定する(更後.小節番号 - i, (double)小節長倍率); } } this.Form.未保存である = true; }, 更対象: dummyChip, 更前の値: null, 更後の値: 更後チップ, 任意1: 最終小節の小節長倍率, 任意2: null); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); }
public void 全チップを選択する() { try { this.Form.UndoRedo管理.トランザクション記録を開始する(); foreach (描画用チップ chip in this.Form.譜面.SSTFormatScore.チップリスト) { // 選択されていないすべてのチップを選択する。 if (chip.選択が確定していない) { var 更前のチップ = new 描画用チップ(chip); var 更後のチップ = new 描画用チップ(chip) { ドラッグ操作により選択中である = false, 選択が確定している = true, }; var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更前); this.Form.未保存である = true; }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更後); this.Form.未保存である = true; }, 更対象: chip, 更前の値: 更前のチップ, 更後の値: 更後のチップ); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); } } } finally { this.Form.UndoRedo管理.トランザクション記録を終了する(); this.Form.UndoRedo用GUIのEnabledを設定する(); this.Form.選択チップの有無に応じて編集用GUIのEnabledを設定する(); this.Form.譜面をリフレッシュする(); } }
protected void 移動の終了処理(MouseEventArgs e) { try { this.Form.UndoRedo管理.トランザクション記録を開始する(); foreach (描画用チップ chip in this.Form.譜面.SSTFormatScore.チップリスト) { // 選択が確定かつ初期位置から移動しているチップのみ対象とする。 if (chip.選択が確定している && (chip.譜面内絶対位置grid != this.移動開始時のチップ状態[chip].譜面内絶対位置grid || chip.チップ種別 != this.移動開始時のチップ状態[chip].チップ種別)) { // ここではまだ、譜面範囲外に出ている(=枠外レーン数がゼロでない)チップの削除は行わない。(その後再び移動される可能性があるため。) // これらの削除処理は「t全チップの選択を解除する()」で行う。 var chip変更前 = this.移動開始時のチップ状態[chip]; var 小節情報 = this.Form.譜面.譜面内絶対位置gridに位置する小節の情報を返す(chip.譜面内絶対位置grid); var chip変更後 = new 描画用チップ(chip) { 小節番号 = 小節情報.小節番号, 小節解像度 = (int)(this.Form.GRID_PER_PART * this.Form.譜面.SSTFormatScore.小節長倍率を取得する(小節情報.小節番号)), 小節内位置 = chip.譜面内絶対位置grid - 小節情報.小節の先頭位置grid, }; var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更前); }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更後); }, 更対象: chip, 更前の値: chip変更前, 更後の値: chip変更後); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); } } } finally { this.Form.UndoRedo管理.トランザクション記録を終了する(); this.Form.UndoRedo用GUIのEnabledを設定する(); this.移動のためにドラッグ中である = false; } }
public void 別選択を解除する(描画用チップ chip) { var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.選択が確定している = true; this.Form.未保存である = true; }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.選択が確定している = false; this.Form.未保存である = true; }, 更対象: chip, 更前の値: null, 更後の値: null); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); this.Form.UndoRedo用GUIのEnabledを設定する(); }
protected void 範囲選択の終了処理(MouseEventArgs e) { this.範囲選択のためにドラッグ中である = false; try { this.Form.UndoRedo管理.トランザクション記録を開始する(); // ドラック選択範囲に入っているがまだ選択が確定していないチップを選択確定させる。 foreach (描画用チップ chip in this.Form.譜面.SSTFormatScore.チップリスト) { // ドラッグ選択範囲内にあって既に選択が確定されているものについては何もしない。 if (chip.ドラッグ操作により選択中である && (false == chip.選択が確定している)) { var chip変更前 = new 描画用チップ(chip); var chip変更後 = new 描画用チップ(chip) { ドラッグ操作により選択中である = false, 選択が確定している = true, }; var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更前); }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更後); }, 更対象: chip, 更前の値: chip変更前, 更後の値: chip変更後); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); } } } finally { this.Form.UndoRedo管理.トランザクション記録を終了する(); this.Form.UndoRedo用GUIのEnabledを設定する(); this.Form.選択チップの有無に応じて編集用GUIのEnabledを設定する(); } }
public void チップを削除する(編集レーン種別 e編集レーン, int 譜面内絶対位置grid) { var 削除チップ = (描画用チップ) (from chip in this.SSTFormatScore.チップリスト where ((this.dicチップ編集レーン対応表[chip.チップ種別] == e編集レーン) && (((描画用チップ)chip).譜面内絶対位置grid == 譜面内絶対位置grid)) select chip).FirstOrDefault(); // チップが重なってたとしても、削除するのはひとつだけ。 if (null != 削除チップ) { // UndoRedo セルを登録。 var 更前チップ = new 描画用チップ(削除チップ); var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更前); this.SSTFormatScore.チップリスト.Add(更対象); this.SSTFormatScore.チップリスト.Sort(); this.Form.未保存である = true; }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { this.SSTFormatScore.チップリスト.Remove(更対象); this.Form.未保存である = true; }, 更対象: 削除チップ, 更前の値: 更前チップ, 更後の値: null); this.Form.UndoRedo管理.セルを追加する(cell); // 削除する。 cell.Redoを実行する(); // 削除完了。 this.Form.UndoRedo用GUIのEnabledを設定する(); } }
public void チップを配置または置換する(編集レーン種別 e編集レーン, チップ種別 eチップ, int 譜面内絶対位置grid, string チップ文字列, int 音量, double BPM, bool 選択確定中) { try { this.Form.UndoRedo管理.トランザクション記録を開始する(); // 配置位置にチップがあれば削除する。 this.チップを削除する(e編集レーン, 譜面内絶対位置grid); // そこにチップがなければ何もしない。 // 新しいチップを作成し配置する。 var 小節情報 = this.譜面内絶対位置gridに位置する小節の情報を返す(譜面内絶対位置grid); int 小節の長さgrid = this.小節長をグリッドで返す(小節情報.小節番号); var chip = new 描画用チップ() { 選択が確定している = 選択確定中, BPM = BPM, 発声時刻sec = 0, // SSTFEditorでは使わない チップ種別 = eチップ, 音量 = 音量, 小節解像度 = 小節の長さgrid, 小節内位置 = 譜面内絶対位置grid - 小節情報.小節の先頭位置grid, 小節番号 = 小節情報.小節番号, 譜面内絶対位置grid = 譜面内絶対位置grid, チップ内文字列 = チップ文字列, }; // チップを譜面に追加。 var 更前チップ = new 描画用チップ(chip); var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { this.SSTFormatScore.チップリスト.Remove(更対象); this.Form.未保存である = true; }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更前); this.SSTFormatScore.チップリスト.Add(更対象); this.SSTFormatScore.チップリスト.Sort(); this.Form.未保存である = true; }, 更対象: chip, 更前の値: 更前チップ, 更後の値: null); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); // 配置した小節が現状最後の小節だったら、後ろに小節を4つ追加する。 if (chip.小節番号 == this.SSTFormatScore.最大小節番号を返す()) { this.最後の小節の後ろに小節を4つ追加する(); } } finally { this.Form.UndoRedo管理.トランザクション記録を終了する(); this.Form.UndoRedo用GUIのEnabledを設定する(); this.Form.未保存である = true; } }
public void 全チップの選択を解除する() { try { this.Form.UndoRedo管理.トランザクション記録を開始する(); foreach (描画用チップ chip in this.Form.譜面.SSTFormatScore.チップリスト) { if ((0 != chip.枠外レーン数) || (0 > chip.譜面内絶対位置grid)) { #region " 譜面範囲外に出たチップがあれば削除する。" //----------------- var chip変更前 = this.移動開始時のチップ状態[chip]; var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(chip変更前); this.Form.譜面.SSTFormatScore.チップリスト.Add(更対象); this.Form.譜面.SSTFormatScore.チップリスト.Sort(); this.Form.未保存である = true; }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { this.Form.譜面.SSTFormatScore.チップリスト.Remove(更対象); this.Form.未保存である = true; }, 更対象: chip, 更前の値: chip変更前, 更後の値: null); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); //----------------- #endregion } else if (chip.ドラッグ操作により選択中である || chip.選択が確定している) { #region " チップの選択を解除する。" //----------------- var chip変更前 = new 描画用チップ(chip); var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.CopyFrom(更前); }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.選択が確定している = false; 更対象.ドラッグ操作により選択中である = false; 更対象.移動済みである = false; }, 更対象: chip, 更前の値: chip変更前, 更後の値: null); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); //----------------- #endregion } } } finally { this.Form.UndoRedo管理.トランザクション記録を終了する(); this.Form.UndoRedo用GUIのEnabledを設定する(); this.Form.未保存である = true; } }
public void 検索する() { using var dialog = new 検索条件入力ダイアログ(); if (dialog.ShowDialog(this.Form) != DialogResult.OK) { return; // キャンセルされたら何もしない。 } int 開始小節番号 = (dialog.小節範囲指定CheckBoxがチェックされている) ? dialog.小節範囲開始番号 : 0; int 終了小節番号 = (dialog.小節範囲指定CheckBoxがチェックされている) ? dialog.小節範囲終了番号 : this.Form.譜面.SSTFormatScore.最大小節番号を返す(); if (0 > 開始小節番号) { 開始小節番号 = 0; // 省略時は 0 とみなす。 } if (0 > 終了小節番号) { 終了小節番号 = this.Form.譜面.SSTFormatScore.最大小節番号を返す(); // 省略時は 最大小節番号とする。 } int 選択チップ数 = 0; try { this.Form.UndoRedo管理.トランザクション記録を開始する(); foreach (描画用チップ chip in this.Form.譜面.SSTFormatScore.チップリスト) { var e編集レーン = this.Form.譜面.dicチップ編集レーン対応表[chip.チップ種別]; // 編集レーンを持たないチップは無視する。 if (e編集レーン == 編集レーン種別.Unknown) { continue; } if ((chip.小節番号 >= 開始小節番号) && (chip.小節番号 <= 終了小節番号)) { if (dialog.選択されている(e編集レーン) || dialog.選択されている(chip.チップ種別)) { // チップを選択する。 var chip変更前 = new 描画用チップ(chip); var cell = new UndoRedo.セル <描画用チップ>( 所有者ID: null, Undoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.選択が確定している = 更前.選択が確定している; }, Redoアクション: (更対象, 更前, 更後, 任意1, 任意2) => { 更対象.選択が確定している = true; }, 更対象: chip, 更前の値: chip変更前, 更後の値: null); this.Form.UndoRedo管理.セルを追加する(cell); cell.Redoを実行する(); 選択チップ数++; } } } } finally { this.Form.UndoRedo管理.トランザクション記録を終了する(); this.Form.UndoRedo用GUIのEnabledを設定する(); this.Form.譜面をリフレッシュする(); } #region " チップ数に応じて結果を表示する。" //----------------- if (0 < 選択チップ数) { this.Form.選択チップの有無に応じて編集用GUIのEnabledを設定する(); MessageBox.Show( 選択チップ数 + Properties.Resources.MSG_個のチップが選択されました, Properties.Resources.MSG_検索結果ダイアログのタイトル, MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1); } else { MessageBox.Show( Properties.Resources.MSG_該当するチップはありませんでした, Properties.Resources.MSG_検索結果ダイアログのタイトル, MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1); } //----------------- #endregion }