/// <summary> /// Изменена текстура меша /// </summary> public void SurfaceTextureChanged(Project.Entry file) { if (surfData != null && !surfaceCodeChange) { if (file != null) { bool needTex = forceTextureReload; if (!needTex) { needTex = file != surfData[selectedSurface].file; } if (needTex) { surfData[selectedSurface].file = file; surfData[selectedSurface].tex = new Texture(surfData[selectedSurface].file.ProjectPath, Texture.LoadingMode.Queued); surfData[selectedSurface].tex.ApplyMetaConfig(file.Meta); } } else { surfData[selectedSurface].file = null; surfData[selectedSurface].tex = null; } ApplySurfaceData(); UpdateSurfaceItemText(selectedSurface, file); Saved = false; } }
/// <summary> /// Текстура изменена /// </summary> /// <param name="side">Сторона</param> /// <param name="file">Имя файла</param> public void TextureChanged(Skybox.Side side, Project.Entry file) { if (file != null) { bool needTex = true; if (sky[side] != null) { if (sky[side].Link == file.ProjectPath && !forceTextureReload) { needTex = false; } } if (needTex) { sky[side] = new Texture(file.ProjectPath, Texture.LoadingMode.Queued); sky[side].ApplyMetaConfig(file.Meta); } } else { sky[side] = null; } Saved = false; }
/// <summary> /// Обновление файловой системы /// </summary> /// <param name="en">Файл</param> /// <param name="ev">Событие</param> public override void ProjectEntryEvent(Project.Entry en, Project.FileEvent ev) { base.ProjectEntryEvent(en, ev); if (closed) { return; } // Просмотр на изменение текстур SkyboxForm fr = Form as SkyboxForm; NSFileDropControl[] drops = new NSFileDropControl[] { fr.frontSkyTexture, fr.rightSkyTexture, fr.backSkyTexture, fr.leftSkyTexture, fr.topSkyTexture, fr.bottomSkyTexture }; forceTextureReload = true; foreach (NSFileDropControl fc in drops) { if (fc.File == en) { if (ev == Project.FileEvent.Deleted) { fc.File = null; } else { fc.File = en; } } } forceTextureReload = false; }
/// <summary> /// Изменен файл текстуры /// </summary> private void skyTexture_FileChanged(object sender, EventArgs e) { Skybox.Side side = Skybox.Side.Front; Project.Entry file = frontSkyTexture.File; NSFileDropControl s = sender as NSFileDropControl; if (s == topSkyTexture) { file = topSkyTexture.File; side = Skybox.Side.Top; } else if (s == bottomSkyTexture) { file = bottomSkyTexture.File; side = Skybox.Side.Bottom; } else if (s == leftSkyTexture) { file = leftSkyTexture.File; side = Skybox.Side.Left; } else if (s == rightSkyTexture) { file = rightSkyTexture.File; side = Skybox.Side.Right; } else if (s == backSkyTexture) { file = backSkyTexture.File; side = Skybox.Side.Back; } (FileEditor as SkyboxEditor).TextureChanged(side, file); }
/// <summary> /// Перетаскивание вышло за границы контрола /// </summary> void Canvas_DragLeave(object sender, EventArgs e) { if (dragTexture != null) { (FileEditor as ModelEditor).TextureDragCanceled(); } dragTexture = null; }
/// <summary> /// Событие изменения файла /// </summary> /// <param name="en">Файл</param> /// <param name="ev">Событие</param> public override void ProjectEntryEvent(Project.Entry en, Project.FileEvent ev) { base.ProjectEntryEvent(en, ev); if (closed) { return; } }
/// <summary> /// Перетащен файл /// </summary> void Canvas_DragDrop(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Link; if (dragTexture != null) { Point p = Canvas.PointToClient(new Point(e.X, e.Y)); e.Effect = (FileEditor as ModelEditor).TextureDragOver(p.X, p.Y) ? DragDropEffects.Link : DragDropEffects.None; (FileEditor as ModelEditor).TextureDropped(); } dragTexture = null; }
/// <summary> /// Открытие редактора для файла /// </summary> /// <param name="e">Файл</param> public static Editor OpenEditor(Project.Entry e) { if (W != null) { bool found = false; if (Editors != null) { foreach (BaseForm frm in Editors) { if (frm.FileEditor.File == e) { W.projectTabs.SelectedTab = frm.Tag as TabPage; found = true; break; } } } if (!found) { Editor ed = Editor.Create(e); if (ed != null) { TabPage p = new TabPage(ed.Title); p.Tag = (object)ed.Form; ed.Form.Tag = (object)p; ed.Form.FormBorderStyle = FormBorderStyle.None; ed.Form.Dock = DockStyle.Fill; ed.Form.TopLevel = false; ed.Form.TextChanged += delegate(object sender, EventArgs ea) { p.Text = ((BaseForm)sender).Text; }; p.Controls.Add(ed.Form); ed.Form.Show(); W.projectTabs.AddTab(p, true); List <BaseForm> edlist = Editors != null?Editors.ToList() : new List <BaseForm>(); edlist.Add(ed.Form); Editors = edlist.ToArray(); return(ed); } else { MessageDialog.Show(ControlStrings.EditorNotFoundTitle, ControlStrings.EditorNotFoundText.Replace("%FILE%", e.Name), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } return(null); }
/// <summary> /// Создание меню создаваемых файлов /// </summary> /// <param name="col">Список для добавления</param> private void AddCreationMenuItems(ToolStripItemCollection col) { // Папка col.Add(ControlStrings.InspectorContextFolder, ShadowImage.CompiledFromImage(InspectorIcons.Folder, 16, 1), (sndr, args) => { Project.Dir d = projectInspector.Tag as Project.Dir; CreateItemDialog dlg = new CreateItemDialog(ControlStrings.InspectorContextFolder); dlg.ExistingNames = d.UsedNames; DialogResult dr = dlg.ShowDialog(); if (dr == System.Windows.Forms.DialogResult.OK) { localFileEvent = true; NSDirectoryInspector.Entry en = new NSDirectoryInspector.Entry(); en.IsDirectory = true; en.Name = dlg.SpecifiedName; en.Tag = Project.CreateDir(dlg.SpecifiedName, d); projectInspector.Entries.Add(en); projectInspector.SelectedEntry = en; localFileEvent = false; } }); if (Editor.CreatableList.Length > 0) { col.Add(new ToolStripSeparator()); foreach (Editor.FileCreator fc in Editor.CreatableList) { col.Add(fc.Name, ShadowImage.CompiledFromImage(fc.Icon, 16, 1), (sndr, args) => { Project.Dir cd = projectInspector.Tag as Project.Dir; Editor.FileCreator f = fc; if (cd != null) { CreateItemDialog dlg = new CreateItemDialog(fc.Name); dlg.Extension = f.Extension; dlg.ExistingNames = cd.UsedNames; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { localFileEvent = true; Project.Entry ce = Project.CreateEntry(dlg.SpecifiedName, cd); NSDirectoryInspector.Entry en = new NSDirectoryInspector.Entry(); en.IsDirectory = false; en.Name = System.IO.Path.GetFileNameWithoutExtension(dlg.SpecifiedName); en.Icon = ce.Icon; en.Tag = (object)ce; projectInspector.Entries.Add(en); projectInspector.SelectedEntry = en; localFileEvent = false; } } }); } } }
/// <summary> /// Обновление данных для записи в списке /// </summary> /// <param name="id">Индекс поверхности</param> /// <param name="file">Файл</param> void UpdateSurfaceItemText(int id, Project.Entry file) { string label = "(none)"; if (file != null) { label = System.IO.Path.GetFileNameWithoutExtension(file.ProjectPath); if (file.Parent != Project.BaseDir) { label = file.Parent.Name + "/" + label; } } (Form as ModelForm).surfacesList.Items[id].SubItems[1].Text = label; (Form as ModelForm).surfacesList.Invalidate(); }
protected override void OnShown(EventArgs e) { base.OnShown(e); prevFile = Dropper.File; if (Dropper.File != null) { currentDir = Dropper.File.Parent; } else { currentDir = Project.BaseDir; } Populate(true); Preview.PreviewsReady += Preview_PreviewsReady; Focus(); }
/// <summary> /// Вхождение перетаскивания /// </summary> void Canvas_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.None; dragTexture = null; if (e.Data.GetDataPresent(typeof(Project.DraggingEntry))) { Project.DraggingEntry de = (Project.DraggingEntry)e.Data.GetData(typeof(Project.DraggingEntry)); if (textureFile.FileSupported(de.File.Name)) { dragTexture = de.File; } } if (dragTexture != null) { (FileEditor as ModelEditor).TextureDragEntered(dragTexture); Point p = Canvas.PointToClient(new Point(e.X, e.Y)); e.Effect = (FileEditor as ModelEditor).TextureDragOver(p.X, p.Y) ? DragDropEffects.Link : DragDropEffects.None; } }
/// <summary> /// Событие, связанное с файлом проекта /// </summary> public static void ProjectEntryEvent(Project.Entry e, Project.FileEvent ev) { System.Diagnostics.Debug.WriteLine("File " + e.ProjectPath + ev.ToString()); }
/// <summary> /// Рекурсивное копирование директории /// </summary> /// <param name="cd">Директория</param> /// <param name="parent">Новый родитель</param> /// <returns>Скопированная директория</returns> Project.Dir RecursiveCopyDir(Project.Dir cd, Project.Dir parent) { // Подбор имени папки string dirName = cd.ShortName; while (Directory.Exists(parent.FullPath + "/" + dirName)) { dirName += " - Copy"; } // Создание папки Directory.CreateDirectory(parent.FullPath + "/" + dirName); // Создание объекта папки Project.Dir d = new Project.Dir(); d.Parent = parent; d.Name = parent != Project.BaseDir ? parent.Name + "/" + dirName : dirName; // Внутренние части List <Project.Dir> dirs = new List <Project.Dir>(); List <Project.Entry> entries = new List <Project.Entry>(); if (!abortCopy) { // Копирование файлов foreach (Project.Entry e in cd.Entries) { // Создание записи currentFileName = e.Name; filesCopied++; Project.Entry ce = new Project.Entry(); ce.Name = e.Name; ce.Parent = d; ce.Meta = e.Meta; entries.Add(ce); // Копирование файла File.Copy(e.FullPath, ce.FullPath); // Выход если отмена if (abortCopy) { break; } } // Копирование папок foreach (Project.Dir dr in cd.Dirs) { dirs.Add(RecursiveCopyDir(dr, d)); // Выход если отмена if (abortCopy) { break; } } } d.Dirs = dirs.ToArray(); d.Entries = entries.ToArray(); // Сохранение папки return(d); }
/// <summary> /// Клик по файлу в инспекторе /// </summary> private void projectInspector_MouseClick(object sender, MouseEventArgs e) { NSDirectoryInspector.Entry en = projectInspector.SelectedEntry; bool free = false; if (en != null) { free = Project.LegalFile(en.Tag); } if (e.Button == System.Windows.Forms.MouseButtons.Right) { NSContextMenu cm = new NSContextMenu(); if (en != null) { // Открытие файла cm.Items.Add(ControlStrings.InspectorContextOpen, ShadowImage.CompiledFromImage(InspectorIcons.MenuOpen, 16, 1), (sndr, args) => { if (en != null) { if (en.IsDirectory) { Project.Dir dr = en.Tag as Project.Dir; if (dr != null) { PopulateManager(dr); } } else { OpenEditor(en.Tag as Project.Entry); } } }); } // Создание файла ToolStripMenuItem crItem = new ToolStripMenuItem(ControlStrings.InspectorContextCreate, ShadowImage.CompiledFromImage(InspectorIcons.MenuAdd, 16, 1)); crItem.DropDown = new NSContextMenu(); AddCreationMenuItems(crItem.DropDown.Items); cm.Items.Add(crItem); // Разделитель cm.Items.Add(new ToolStripSeparator()); if (en != null) { // Смена имени cm.Items.Add(new ToolStripMenuItem(ControlStrings.InspectorContextRename, ShadowImage.CompiledFromImage(InspectorIcons.MenuRename, 16, 1), (sndr, args) => { }) { Enabled = free }); // Копирование cm.Items.Add(new ToolStripMenuItem(ControlStrings.InspectorContextCopy, ShadowImage.CompiledFromImage(InspectorIcons.MenuCopy, 16, 1), (sndr, args) => { if (en != null) { copyingDir = null; copyingEntry = null; if (en.IsDirectory) { copyingDir = en.Tag as Project.Dir; } else { copyingEntry = en.Tag as Project.Entry; } } }) { Enabled = free }); } // Вставка ToolStripMenuItem ps = new ToolStripMenuItem(ControlStrings.InspectorContextPaste, ShadowImage.CompiledFromImage(InspectorIcons.MenuPaste, 16, 1), (sndr, args) => { }); ps.Enabled = copyingDir != null || copyingEntry != null; cm.Items.Add(ps); if (en != null) { // Удаление cm.Items.Add(new ToolStripMenuItem(ControlStrings.InspectorContextDelete, ShadowImage.CompiledFromImage(InspectorIcons.MenuDelete, 16, 1), (sndr, args) => { if (en.IsDirectory) { if (Project.DeleteDir(en.Tag as Project.Dir)) { projectInspector.SelectedEntry = null; projectInspector.Entries.Remove(en); } } else { if (Project.DeleteEntry(en.Tag as Project.Entry)) { projectInspector.SelectedEntry = null; projectInspector.Entries.Remove(en); } } projectRemove.Enabled = false; }) { Enabled = free }); } cm.Show(inspectorPopupLocation); } }
/// <summary> /// Клик по файлу в инспекторе /// </summary> private void projectInspector_MouseClick(object sender, MouseEventArgs e) { NSDirectoryInspector.Entry en = projectInspector.SelectedEntry; bool free = false; if (en != null) { free = Project.OperableFile(en.Tag); } if (e.Button == System.Windows.Forms.MouseButtons.Right) { NSContextMenu cm = new NSContextMenu(); if (en != null) { // Открытие файла cm.Items.Add(ControlStrings.InspectorContextOpen, ShadowImage.CompiledFromImage(InspectorIcons.MenuOpen, 16, 1), (sndr, args) => { if (en != null) { if (en.IsDirectory) { Project.Dir dr = en.Tag as Project.Dir; if (dr != null) { PopulateManager(dr); } } else { OpenEditor(en.Tag as Project.Entry); } } }); } // Создание файла ToolStripMenuItem crItem = new ToolStripMenuItem(ControlStrings.InspectorContextCreate, ShadowImage.CompiledFromImage(InspectorIcons.MenuAdd, 16, 1)); crItem.DropDown = new NSContextMenu(); AddCreationMenuItems(crItem.DropDown.Items); cm.Items.Add(crItem); // Разделитель cm.Items.Add(new ToolStripSeparator()); if (en != null) { // Смена имени cm.Items.Add(new ToolStripMenuItem(ControlStrings.InspectorContextRename, ShadowImage.CompiledFromImage(InspectorIcons.MenuRename, 16, 1), (sndr, args) => { string[] used; string ext = ""; if (en.IsDirectory) { used = (en.Tag as Project.Dir).UsedNames; } else { used = (en.Tag as Project.Entry).Parent.UsedNames; ext = System.IO.Path.GetExtension((en.Tag as Project.Entry).Name); } RenameItemDialog rd = new RenameItemDialog(en.Name); rd.SpecifiedName = en.Name; rd.Extension = ext; rd.ExistingNames = used; needProjectRescan = false; if (rd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if (en.IsDirectory) { Project.RenameItem(en.Tag as Project.Dir, rd.SpecifiedName); } else { Project.RenameItem(en.Tag as Project.Entry, rd.SpecifiedName); } } }) { Enabled = free }); // Копирование cm.Items.Add(new ToolStripMenuItem(ControlStrings.InspectorContextCopy, ShadowImage.CompiledFromImage(InspectorIcons.MenuCopy, 16, 1), (sndr, args) => { if (en != null) { copyingDir = null; copyingEntry = null; if (en.IsDirectory) { copyingDir = en.Tag as Project.Dir; } else { copyingEntry = en.Tag as Project.Entry; } } }) { Enabled = free }); } // Вставка ToolStripMenuItem ps = new ToolStripMenuItem(ControlStrings.InspectorContextPaste, ShadowImage.CompiledFromImage(InspectorIcons.MenuPaste, 16, 1), (sndr, args) => { Project.Dir bd = (Project.Dir)projectInspector.Tag; localFileEvent = true; needProjectRescan = false; if (copyingDir != null) { Project.Dir cd = Project.CopyDir(copyingDir, bd); NSDirectoryInspector.Entry fen = new NSDirectoryInspector.Entry(); fen.IsDirectory = true; fen.Name = cd.ShortName; fen.Tag = (object)cd; projectInspector.Entries.Add(fen); projectInspector.SelectedEntry = fen; } else if (copyingEntry != null) { Project.Entry ce = Project.CopyEntry(copyingEntry, bd); NSDirectoryInspector.Entry fen = new NSDirectoryInspector.Entry(); fen.IsDirectory = false; fen.Name = System.IO.Path.GetFileNameWithoutExtension(ce.Name); fen.Icon = ce.Icon; fen.Tag = (object)ce; projectInspector.Entries.Add(fen); projectInspector.SelectedEntry = fen; } localFileEvent = false; }); ps.Enabled = copyingDir != null || copyingEntry != null; cm.Items.Add(ps); if (en != null) { // Удаление cm.Items.Add(new ToolStripMenuItem(ControlStrings.InspectorContextDelete, ShadowImage.CompiledFromImage(InspectorIcons.MenuDelete, 16, 1), (sndr, args) => { if (en != null) { RemoveEntry(en); } }) { Enabled = free }); } cm.Show(inspectorPopupLocation); } }
/// <summary> /// Перетаскивание текстуры отменено /// </summary> public void TextureDragCanceled() { draggingTexture = null; draggingFile = null; textureHoveredSurface = -1; }
/// <summary> /// Вхождение перетаскивания текстуры /// </summary> public void TextureDragEntered(Project.Entry file) { draggingFile = file; draggingTexture = new Texture(file.ProjectPath, Texture.LoadingMode.Queued); draggingTexture.ApplyMetaConfig(draggingFile.Meta); }
/// <summary> /// Событие, связанное с файлом проекта /// </summary> public static void ProjectEntryEvent(Project.Entry e, Project.FileEvent ev) { System.Diagnostics.Debug.WriteLine("File " + e.ProjectPath + " " + ev.ToString()); if (W != null) { // Обновление редакторов if (Editors != null) { foreach (BaseForm b in Editors) { needProjectRescan = false; b.FileEditor.ProjectEntryEvent(e, ev); } } // Обновление инспектора if (!W.localFileEvent) { Project.Dir cd = W.projectInspector.Tag as Project.Dir; switch (ev) { case Project.FileEvent.Created: if (e.Parent == cd) { if (e.Icon == null) { e.Icon = Preview.Get(e.FullPath); } W.projectInspector.Entries.Add(new NSDirectoryInspector.Entry() { IsDirectory = false, Tag = (object)e, Name = Path.GetFileNameWithoutExtension(e.Name), Icon = e.Icon }); W.projectInspector.Invalidate(); } break; case Project.FileEvent.Modified: case Project.FileEvent.Renamed: if (e.Parent == cd) { object oe = (object)e; if (ev == Project.FileEvent.Modified) { e.Icon = Preview.Get(e.FullPath); } foreach (NSDirectoryInspector.Entry en in W.projectInspector.Entries) { if (en.Tag == oe) { en.Name = Path.GetFileNameWithoutExtension(e.Name); en.Icon = e.Icon; W.projectInspector.Invalidate(); break; } } } break; case Project.FileEvent.Deleted: if (e.Parent == cd) { object oe = (object)e; foreach (NSDirectoryInspector.Entry en in W.projectInspector.Entries) { if (en.Tag == oe) { W.projectInspector.Entries.Remove(en); W.projectInspector.Invalidate(); break; } } } break; } } } }