private void RaiseShaderNameChanged(ShaderNameChangedEventArgs e) { SetNewShaderName(e); if (!e.OldValue.Equals(e.Shader.Name)) { e.Shader.Move(Workspace); } }
private void SetNewShaderName(ShaderNameChangedEventArgs e) { string newValue = e.NewValue; string oldValue = e.OldValue; Shader shader = e.Shader; string extension; if (shader.ShaderType == ShaderType.Header) { extension = ".hlsli"; } else { extension = ".hlsl"; } // Check if new name is a valid filename, if not reset to old try { if (string.IsNullOrWhiteSpace(newValue) || newValue.LastIndexOf('.') == 0 || !newValue.Equals(Path.GetFileName(newValue))) { shader.Name = oldValue; return; } } catch (Exception) { shader.Name = oldValue; return; } // Check if it ends with the correct extension, if not add it if (!newValue.EndsWith(extension)) { int startPos = newValue.LastIndexOf('.'); if (startPos == -1) { startPos = newValue.Length; } newValue = newValue.Substring(0, startPos) + extension; } // If filename already in use add a counter IEnumerable <string> shaders = shader.Group.Shaders.Where((s) => s != shader).Select((s) => s.Name); string filename = Path.GetFileNameWithoutExtension(newValue); int counter = 0; while (shaders.Contains(newValue)) { ++counter; newValue = $"{filename}_{counter.ToString("D3")}{extension}"; if (counter == 999) { // Unable to find free name shader.Name = oldValue; return; } } shader.Name = newValue; shader.Group.Save(Workspace); }