Пример #1
0
        /// <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();
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        /// <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();
 }