/// <summary> /// 編集結果を反映させる。 /// </summary> /// <param name="entryFile">エントリファイル</param> private void ApplyEdit(MaterialEntryFile entryFile) { var entryFileDir = System.IO.Path.GetDirectoryName(entryFile.Path); foreach (var layerEntry in entryFile.Layers) { var layerInfo = layerEntry.Value; if (string.IsNullOrEmpty(layerInfo.Path)) { // 普通はここに来ないけど。 continue; } if (System.IO.Path.IsPathRooted(layerInfo.Path)) { // 絶対パス指定になってるので変更されたやつである。 if (layerInfo.Path.StartsWith(entryFileDir)) { // エントリファイルと同じフォルダかサブフォルダにあるので // 相対パスに書き換えるだけで良い。 layerInfo.Path = RemoveRootDirectory(layerInfo.Path, entryFileDir); } else { // コピーして相対パスに変更する。 var newFileName = $"{entryFile.Name}.{layerInfo.Name}.png"; var newPath = System.IO.Path.Combine(entryFileDir, newFileName); System.IO.File.Copy(layerInfo.Path, newPath, true); layerInfo.Path = newFileName; } } } // 設定変更を書き出す。 entryFile.Save(); }
/// <summary> /// 素材を追加する。 /// </summary> /// <param name="srcEntryFilePath">追加するエントリファイルパス</param> private void AddMaterial(string srcEntryFilePath) { var materialList = GetCurrentMaterialList(); var srcEntryFileDir = System.IO.Path.GetDirectoryName(srcEntryFilePath); var dstEntryFileDir = System.IO.Path.Combine(AppData.Instance.MaterialDirectory, materialList.SubDirectoryName); var materialName = System.IO.Path.GetFileNameWithoutExtension(srcEntryFilePath); var srcEntryFile = MaterialEntryFile.LoadFrom(srcEntryFilePath); // レイヤーを構成する画像ファイルをコピーする。 foreach (var layerEntry in srcEntryFile.Layers) { if (!string.IsNullOrEmpty(layerEntry.Value.Path)) { CopyFile(srcEntryFileDir, dstEntryFileDir, layerEntry.Value.Path); } } // エントリファイルをコピーする。 var entryFileName = System.IO.Path.GetFileName(srcEntryFilePath); CopyFile(srcEntryFileDir, dstEntryFileDir, entryFileName); // 既存のエントリがあるなら削除 if (materialList.Contains(materialName)) { materialList.Delete(materialName); } var relPath = System.IO.Path.Combine(materialList.SubDirectoryName, entryFileName); materialList.Add(new Material(relPath, srcEntryFile)); }
/// <summary> /// 素材名が有効かどうかを確認する。 /// 正しくない場合には例外がスルーされる。 /// </summary> /// <param name="materialList">マテリアルリスト</param> /// <param name="name">素材名</param> private void CheckMaterialName(MaterialList materialList, string name) { if (name.Length == 0) { throw new Exception(Resources.MessageMaterialNameNotSpecified); } // 使用不可能な文字が使われていないか? if (!MaterialEntryFile.IsValidName(name)) { throw new Exception(Resources.MessageInvalidMaterialNameCharacter); } // 同名のファイルが存在しないか? if (materialList.Contains(name)) { throw new Exception(Resources.MessageMaterialNameUsed); } }
/// <summary> /// 編集ボタンがクリックされた時に通知を受け取る。 /// </summary> /// <param name="sender">送信元オブジェクト</param> /// <param name="e">イベントオブジェクト</param> private void OnMaterialEditClicked(object sender, EventArgs e) { var selectedIndices = listViewMaterials.SelectedIndices; if (selectedIndices.Count != 1) { return; } try { int selectedIndex = selectedIndices[0]; var selectedItem = listViewMaterials.Items[selectedIndex]; var materialList = GetCurrentMaterialList(); var materialName = selectedItem.SubItems[0].Text; var material = materialList.Get(materialName); if (material == null) { return; } var form = new MaterialEditorForm.MaterialEditorForm(); string entryFilePath = System.IO.Path.Combine( AppData.Instance.MaterialDirectory, material.RelativePath); var entryFile = MaterialEntryFile.LoadFrom(entryFilePath); form.MaterialEntryFile = entryFile; if (form.ShowDialog(this) != DialogResult.OK) { return; } // 編集反映処理 ApplyEdit(entryFile); material.Reload(); // 更新する。 listViewMaterials.Items.RemoveAt(selectedIndex); listViewMaterials.Items.Insert(selectedIndex, GenerateListViewMaterial(material)); } catch (Exception ex) { MessageBox.Show(this, ex.Message, Resources.DialogTitleError); } }
/// <summary> /// レイヤー情報を設定する /// </summary> /// <param name="entryFile">エントリーファイル</param> /// <param name="layerInfo">レイヤー情報</param> public void SetLayerInfo(MaterialEntryFile entryFile, MaterialLayerInfo layerInfo) { this.entryFile = entryFile; this.layerInfo = layerInfo; ModelToUI(); }