public async Task <bool> SetMaterial(XivMtrl material, IItemModel item, MaterialEditorMode mode = MaterialEditorMode.EditSingle)
 {
     _material = material;
     _item     = item;
     _mode     = mode;
     return(await viewModel.SetMaterial(material, item, mode));
 }
        public async Task <bool> SetMaterial(XivMtrl material, IItemModel item, MaterialEditorMode mode)
        {
            if (material == null)
            {
                return(false);
            }

            _mode     = mode;
            _material = material;
            _item     = item;

            var gameDirectory = new DirectoryInfo(Properties.Settings.Default.FFXIV_Directory);

            _mtrl    = new Mtrl(gameDirectory, item.DataFile, GetLanguage());
            _index   = new Index(gameDirectory);
            _modding = new Modding(gameDirectory);
            _gear    = new Gear(gameDirectory, GetLanguage());


            // Drop the multi functions down to singles if they only have one Material to edit anyways.
            if (_mode == MaterialEditorMode.EditMulti || _mode == MaterialEditorMode.NewMulti)
            {
                // This isn't an actual perfect check for if there's only one Variant, but doing so
                // would be a bit expensive here, and passing it through EditMulti isn't harmful anyways.
                var sameModelItems = await _item.GetSharedModelItems();

                if (sameModelItems.Count == 1)
                {
                    if (_mode == MaterialEditorMode.EditMulti)
                    {
                        _mode = MaterialEditorMode.EditSingle;
                    }
                    else
                    {
                        _mode = MaterialEditorMode.NewSingle;
                    }
                }
            }

            /*
             * // Debug code for finding unknown Shader Parameters.
             * var unknowns = new List<ShaderParameterStruct>();
             * foreach(var sp in material.ShaderParameterList)
             * {
             *  if (!Enum.IsDefined(typeof(MtrlShaderParameterId), sp.ParameterID))
             *  {
             *      unknowns.Add(sp);
             *  }
             * }
             * if(unknowns.Count > 0)
             * {
             *  // Debug line
             *  var json = JsonConvert.SerializeObject(unknowns.ToArray());
             * }
             */


            // Update to new material name
            switch (_mode)
            {
            case MaterialEditorMode.EditSingle:
                _view.MaterialPathLabel.Text = _material.MTRLPath;
                break;

            case MaterialEditorMode.EditMulti:
                _view.MaterialPathLabel.Text = "Editing Multiple Materials: Material " + _material.GetMaterialIdentifier();
                break;

            case MaterialEditorMode.NewSingle:
                _view.MaterialPathLabel.Text = "New Material";
                break;

            case MaterialEditorMode.NewMulti:
                _view.MaterialPathLabel.Text = "New Materials";
                break;
            }

            var shader     = _material.GetShaderInfo();
            var normal     = _material.GetMapInfo(XivTexType.Normal);
            var diffuse    = _material.GetMapInfo(XivTexType.Diffuse);
            var specular   = _material.GetMapInfo(XivTexType.Specular);
            var multi      = _material.GetMapInfo(XivTexType.Multi);
            var reflection = _material.GetMapInfo(XivTexType.Reflection);

            // Show Paths
            _view.NormalTextBox.Text   = normal == null ? "" : normal.path;
            _view.SpecularTextBox.Text = specular == null ? "" : specular.path;
            _view.SpecularTextBox.Text = multi == null ? _view.SpecularTextBox.Text : multi.path;
            _view.DiffuseTextBox.Text  = diffuse == null ? "" : diffuse.path;
            _view.DiffuseTextBox.Text  = reflection == null ? _view.DiffuseTextBox.Text : reflection.path;

            // Add Other option if needed.
            if (shader.Shader == MtrlShader.Other)
            {
                _view.ShaderSource.Add(new KeyValuePair <MtrlShader, string>(MtrlShader.Other, "Other"));
            }

            // Show Settings
            _view.TransparencyComboBox.SelectedValue = shader.TransparencyEnabled;
            _view.BackfacesComboBox.SelectedValue    = shader.RenderBackfaces;
            _view.ColorsetComboBox.SelectedValue     = shader.HasColorset;
            _view.ShaderComboBox.SelectedValue       = shader.Shader;
            _view.PresetComboBox.SelectedValue       = shader.Preset;


            if (_mode == MaterialEditorMode.NewMulti)
            {
                // Bump up the material identifier letter.
                _newMaterialIdentifier = await GetNewMaterialIdentifier();

                _view.MaterialPathLabel.Text = "New Materials: Material " + _newMaterialIdentifier;
            }
            else if (_mode == MaterialEditorMode.NewSingle)
            {
                _newMaterialIdentifier = await GetNewMaterialIdentifier();

                _view.MaterialPathLabel.Text = "New Material: Material " + _newMaterialIdentifier;
            }

            // Get the mod entry.
            if (_mode == MaterialEditorMode.EditSingle || _mode == MaterialEditorMode.EditMulti)
            {
                var mod = await _modding.TryGetModEntry(_material.MTRLPath);

                if (mod != null && mod.enabled)
                {
                    _view.DisableButton.IsEnabled  = true;
                    _view.DisableButton.Visibility = System.Windows.Visibility.Visible;
                }
            }

            return(true);
        }