Skip to content

Commit

Permalink
Add multiple selection (savushkin-r-d#1235)
Browse files Browse the repository at this point in the history
  • Loading branch information
KirillGutyrchik authored Nov 10, 2023
1 parent 51abe65 commit 9b2ba26
Show file tree
Hide file tree
Showing 17 changed files with 556 additions and 305 deletions.
19 changes: 19 additions & 0 deletions EasyEplanner.Tests/Editor.Test/ObjectProperty.Test.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using Editor;
using Moq;
using NUnit.Framework;

namespace Tests.Editor
Expand Down Expand Up @@ -419,6 +420,24 @@ public void UpdateOnGenericTechObject()
});
}

[Test]
public void QuickMultiSelect()
{
var item1 = GetEmptyProperty();
var item2 = GetEmptyProperty();
var item3 = GetEmptyProperty();
var parentMock = new Mock<ITreeViewItem>();
parentMock.Setup(o => o.Items).Returns(new[] { item1, item2, item3 });

item1.Parent = parentMock.Object;
item2.Parent = parentMock.Object;
item3.Parent = parentMock.Object;

var multiselect = item2.QuickMultiSelect();

CollectionAssert.AreEqual(new List<ITreeViewItem>() { item1, item2, item3 }, multiselect);
}

private ObjectProperty GetEmptyProperty()
{
return new ObjectProperty(string.Empty, string.Empty);
Expand Down
18 changes: 18 additions & 0 deletions EasyEplanner.Tests/Editor.Test/TreeViewItem.Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,24 @@ public void Filter_ReapeatFilterAndReset()
});
}

[Test]
public void QuickMultiSelect()
{
var item1 = GetNewTreeViewItem();
var item2 = GetNewTreeViewItem();
var item3 = GetNewTreeViewItem();
var parent = GetNewTreeViewItem();

item1.Parent = parent;
item2.Parent = parent;
item3.Parent = parent;

parent.Childs = new ITreeViewItem[] { item1, item2, item3 };

var multiselect = item2.QuickMultiSelect();

CollectionAssert.AreEqual(new List<ITreeViewItem>() { item1, item2, item3 }, multiselect);
}

public InheritedTreeViewItem GetNewTreeViewItem()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,5 +287,38 @@ public void Cut()
Assert.IsNull(baseObject.Cut(baseObject));
});
}

[Test]
public void Replace()
{
var techObjects = new List<TechObject.TechObject>();

var techObject1 = new TechObject.TechObject("1", GetN => 1, 1, 2, "TANK", -1, "", string.Empty, new BaseTechObject());
var techObject2 = new TechObject.TechObject("2", GetN => 2, 2, 3, "TANK_COPY", -1, "", string.Empty, new BaseTechObject());

techObjects.Add(techObject1);
techObjects.Add(techObject2);

var techObjectManagerMock = new Mock<ITechObjectManager>();
techObjectManagerMock.Setup(obj => obj.TechObjects).Returns(techObjects);

var baseObject = new BaseObject("bto", techObjectManagerMock.Object);

var baseTechObjectField = typeof(BaseObject).GetField("baseTechObject",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

baseTechObjectField.SetValue(baseObject, new BaseTechObject());

baseObject.AddObject(techObject1);
baseObject.TechObjects.Add(techObject1);

baseObject.Replace(techObject1, techObject2);

Assert.Multiple(() =>
{
Assert.AreEqual(techObject2.TechType, baseObject.TechObjects[0].TechType);
Assert.AreEqual(techObject2.NameEplan, baseObject.TechObjects[0].NameEplan);
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,22 @@ public void InsertCopy()
var baseTechObject = new BaseTechObject()
{
EplanName = "BTO",
Name = "BTO_NAME",
};
var baseTechObject_2 = new BaseTechObject()
{
EplanName = "BTO2",
Name = "BTO2_NAME",
};

var baseObject = new BaseObject("BTO", techObjectManagerMock.Object);

var techObject1 = new TechObject.TechObject("Танк", GetN => 1, 1, 2, "TANK", -1, "", "", baseTechObject);
var techObject2 = new TechObject.TechObject("Танк", GetN => 2, 2, 2, "TANK", -1, "", "", baseTechObject);
techObject2.MarkToCut = true;
techObject2.AddParent(baseObject);

var techObject3 = new TechObject.TechObject("Танк", GetN => 2, 2, 2, "TANK", -1, "", "", baseTechObject);
var techObject3 = new TechObject.TechObject("Танк", GetN => 2, 2, 2, "TANK", -1, "", "", baseTechObject_2);
techObject3.MarkToCut = true;

techObjects.Add(techObject1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Editor;
using Moq;
using NUnit.Framework;

namespace EasyEplannerTests.TechObjectTest.ObjectsTreeTest.UniversalObjecsTest
Expand Down Expand Up @@ -50,5 +52,31 @@ public void SaveAsLuaTable_CheckResultString()

Assert.AreEqual(expected.ToString(), techObject.SaveAsLuaTable(prefix, globalNum));
}


[Test]
public void QuickMultiSelect()
{
var item1 = new TechObject.TechObject("", GetN => 1, 1, 2, "", -1, "", "", null);
var item2 = new TechObject.TechObject("", GetN => 1, 1, 2, "", -1, "", "", null);
var item3 = new TechObject.TechObject("", GetN => 1, 1, 3, "", -1, "", "", null);
var parentMock = new Mock<ITreeViewItem>();
parentMock.Setup(o => o.Items).Returns(new[] { item1, item2, item3 });

item1.Parent = parentMock.Object;
item2.Parent = parentMock.Object;
item3.Parent = parentMock.Object;

Assert.Multiple(() =>
{
var multiselect = item2.QuickMultiSelect();
CollectionAssert.AreEqual(new List<ITreeViewItem>() { item1, item2 }, multiselect);
multiselect = item3.QuickMultiSelect();
CollectionAssert.AreEqual(new List<ITreeViewItem>() { item3 }, multiselect);
});

}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Editor;
using Moq;
using NUnit.Framework;
using TechObject;

namespace TechObjectTests
{
public class UserObjectTest
{
[Test]
public void InsertCuttedCopy()
{
var techObjectManagerMock = new Mock<ITechObjectManager>();
var techObjectParentMock = new Mock<ITreeViewItem>();

techObjectParentMock.Setup(o => o.Cut(It.IsAny<TechObject.TechObject>())).Returns<TechObject.TechObject>(to => to);

var userObject = new UserObject(techObjectManagerMock.Object);
var techObject = new TechObject.TechObject("", GetN => 1, 1, 2, "", -1, "", "", null);
techObject.Parent = techObjectParentMock.Object;

var method = typeof(UserObject).GetMethod("InsertCuttedCopy",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

method.Invoke(userObject, new object[] { techObject });

Assert.AreSame(techObject, userObject.Items.SingleOrDefault());
}
}
}
39 changes: 21 additions & 18 deletions docs/user_manual/ReadMe.md
Original file line number Diff line number Diff line change
Expand Up @@ -1218,8 +1218,8 @@ HLA | PXC.1191993 | 0 | 1
8. <img src=images/ToolBar/copy.png width = 20 height = 20> - Копировать выделенный объект (**Ctrl + V**).
9. <img src=images/ToolBar/paste.png width = 20 height = 20> - Вставить скопированный объект в выделенное место как новый (**Ctrl + V**).
10. <img src=images/ToolBar/replace.png width = 20 height = 20> - Вставить скопированный объект в выделенной место с заменой выделенного объекта (**Ctrl + B**).
11. <img src=images/ToolBar/moveUp.png width = 20 height = 20> - Переместить выделеный объект выше (**Shift + Up**).
12. <img src=images/ToolBar/moveDown.png width = 20 height = 20> - Переместить выделенный объект ниже (**Shift + Down**).
11. <img src=images/ToolBar/moveUp.png width = 20 height = 20> - Переместить выделеный объект выше (**Ctrl + Up**).
12. <img src=images/ToolBar/moveDown.png width = 20 height = 20> - Переместить выделенный объект ниже (**Ctrl + Down**).
13. <img src=images/ToolBar/import.png width = 20 height = 20> - Импорт объектов в проект.
14. <img src=images/ToolBar/export.png width = 20 height = 20> - Экспорт объектов из проекта.
15. <img src=images/ToolBar/changeObj.png width = 20 height = 20> - Сброс базового объекта.
Expand Down Expand Up @@ -1255,22 +1255,25 @@ HLA | PXC.1191993 | 0 | 1
4. Глобальный номер объекта - "**(#4)**".

Для редактирования любого узла дерева применяются следующие команды (_клавиши_) клавиатуры:
* удаление – **DEL**,
* вставка – **INS**,
* редактирование текстового представления – **двойной клик по активному узлу дерева**,
* отмена редактирования – **ESC** (_во время редактирования_),
* ввод редактирования – **ENTER** (_во время редактирования_), или клик по другой строке,
* копирование узла – **CTR + C**,
* вставка узла – **CTR + V**, при этом надо находиться на родительском узле, куда мы вставляем скопированный элемент.
* вставка узла – **CTR + B**, необходимо находиться на узле, который хотим заменить ранее скопированным,
* вырезка узла - **CTR + X**, необходимо находиться в узле, который надо вырезать. Работает только для неопознанных объектов.
* перемещение узла вверх – **Shift + Up**,
* перемещение узла вниз – **Shift + Down**.
При копировании – вставке/замене объекта копируются все поля исходного объекта необходимо учитывать следующие нюансы:
* Номер объекта меняется на номер объекта, на место которого вставляем объект
* Копируется полный список операций и происходит копирование устройств, которые используются в операции. При этом происходит корректная замена номера объекта на новый. Это происходит в случае совпадения у двух объектов поля ОУ. Так при копировании операций из объекта __Танк 1__ с устройством __TANK1V1__ и заменой в объекте __Танк 3__ устройство изменит свое имя на __TANK3V1__.
* При копировании операций происходит копирование ограничений, описанных в операции. Для ограничений, относящихся к данному объекту (_«Ограничения внутри объекта», «Ограничения на последующие операции»_), происходит замена старого номера объекта на новый.
* Можно копировать не только отдельные строки параметров, операций, а также целые группы параметров, ограничений, операций.
* Удаление – **DEL**;
* Вставка – **INS**;
* Редактирование текстового представления – **двойной клик по активному узлу дерева**;
* Отмена редактирования – **ESC** (_во время редактирования_);
* Ввод редактирования – **ENTER** (_во время редактирования_), или клик по другой строке;
* Копирование узла – **CTR + C**;
* Вставка узла – **CTR + V**, при этом надо находиться на родительском узле, куда мы вставляем скопированный элемент;
* Вставка узла – **CTR + B**, необходимо находиться на узле, который хотим заменить ранее скопированным;
* Вырезка узла - **CTR + X**, необходимо находиться в узле, который надо вырезать. Работает только для неопознанных объектов;
* Перемещение узла вверх – **Ctrl + Up**;
* Перемещение узла вниз – **Ctrl + Down**;
* Выделение нескольких элементов – **Shift + Up** / **Shift + Down**;
* Выделение элемента / снятие выделения с элемента – **Ctrl + ЛКМ**;
* Быстрое выделение элементов (выделяются все элементы одного типа относящиеся к одной группе, технологические объекты выделяются также по одному технологическому типу) – **Ctrl + 2x ЛКМ**;
* При копировании – вставке/замене объекта копируются все поля исходного объекта необходимо учитывать следующие нюансы:
* Номер объекта меняется на номер объекта, на место которого вставляем объект
* Копируется полный список операций и происходит копирование устройств, которые используются в операции. При этом происходит корректная замена номера объекта на новый. Это происходит в случае совпадения у двух объектов поля ОУ. Так при копировании операций из объекта __Танк 1__ с устройством __TANK1V1__ и заменой в объекте __Танк 3__ устройство изменит свое имя на __TANK3V1__.
* При копировании операций происходит копирование ограничений, описанных в операции. Для ограничений, относящихся к данному объекту (_«Ограничения внутри объекта», «Ограничения на последующие операции»_), происходит замена старого номера объекта на новый.
* Можно копировать не только отдельные строки параметров, операций, а также целые группы параметров, ограничений, операций.

#### 7.1.1 Неопознанные объекты при загрузке описания проекта ####
<p align="justify">Если базовый объект будет не распознан системой, добавляемый при загрузке объект будет добавлен в группу "<em>Неопознанные объекты</em>". Пример на рисунке ниже.</p>
Expand Down
9 changes: 7 additions & 2 deletions src/Editor/ITreeViewItem.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using BrightIdeasSoftware;
using Aga.Controls.Tree;
using BrightIdeasSoftware;
using System.Collections.Generic;

namespace Editor
Expand Down Expand Up @@ -292,9 +293,13 @@ void GetDisplayObjects(out EplanDevice.DeviceType[] devTypes,
/// <summary>
/// Визуализатор для ячеек
/// </summary>

IRenderer[] CellRenderer { get; }

/// <summary>
/// Быстрое выделение смежных элементов
/// </summary>
List<ITreeViewItem> QuickMultiSelect();

event OnValueChanged ValueChanged;

void OnValueChanged(object sender);
Expand Down
Loading

0 comments on commit 9b2ba26

Please sign in to comment.