您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
189 行
7.8 KiB
189 行
7.8 KiB
using System.Collections.Generic;
|
|
using uiwidgets;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.material;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.ui;
|
|
using Unity.UIWidgets.widgets;
|
|
using TextStyle = Unity.UIWidgets.painting.TextStyle;
|
|
|
|
namespace UIWidgetsSample.RaycastableScene
|
|
{
|
|
public class PickListItem
|
|
{
|
|
public string itemName;
|
|
public bool active;
|
|
public string showName;
|
|
|
|
public PickListItem(string itemName, bool active = true, string showName = null)
|
|
{
|
|
this.itemName = itemName;
|
|
this.active = active;
|
|
this.showName = showName ?? itemName;
|
|
}
|
|
}
|
|
|
|
public delegate void OnItemSelected(int itemIndex);
|
|
|
|
public delegate void OnItemChecked(int itemIndex, bool active);
|
|
|
|
public class LeftUIPanel : StatefulWidget
|
|
{
|
|
public LeftUIPanel(Key key = null,
|
|
List<PickListItem> itemNames = null,
|
|
OnItemChecked itemCheckCallback = null,
|
|
OnItemSelected itemSelectCallback = null) : base(key: key)
|
|
{
|
|
this.itemNames = itemNames ?? new List<PickListItem>();
|
|
this.itemCheckCallback = itemCheckCallback;
|
|
this.itemSelectCallback = itemSelectCallback;
|
|
}
|
|
|
|
public readonly List<PickListItem> itemNames;
|
|
public readonly OnItemChecked itemCheckCallback;
|
|
public readonly OnItemSelected itemSelectCallback;
|
|
|
|
public override State createState()
|
|
{
|
|
return new LeftUIPanelState();
|
|
}
|
|
}
|
|
|
|
public class LeftUIPanelState : State<LeftUIPanel>
|
|
{
|
|
readonly TextEditingController controller = new TextEditingController();
|
|
public override Widget build(BuildContext context)
|
|
{
|
|
return new Column(
|
|
children: new List<Widget>
|
|
{
|
|
buildSearchBar(),
|
|
buildItemList()
|
|
}
|
|
);
|
|
}
|
|
|
|
public override void initState()
|
|
{
|
|
base.initState();
|
|
_searchResult.AddRange(widget.itemNames);
|
|
}
|
|
|
|
private readonly List<PickListItem> _searchResult = new List<PickListItem>();
|
|
private int selectedIndex = -1;
|
|
|
|
private Widget buildSearchBar()
|
|
{
|
|
return new Container(
|
|
color: Colors.grey,
|
|
child: new Padding(
|
|
padding: EdgeInsets.all(1.0f),
|
|
child:
|
|
new Card(
|
|
child: new Row(
|
|
children: new List<Widget>{
|
|
new Padding(padding: EdgeInsets.only(left: 2f)),
|
|
new Icon(Icons.search, size: 14f),
|
|
new Flexible(child: new TextField(
|
|
controller: controller,
|
|
style: new TextStyle(fontSize: 8f),
|
|
decoration: new InputDecoration(
|
|
hintText: "Search", border: InputBorder.none,
|
|
contentPadding: EdgeInsets.all(4),
|
|
isDense: true),
|
|
onChanged: onSearchTextChanged
|
|
)),
|
|
new GestureDetector(
|
|
child: new Icon(Icons.cancel, size: 10f),
|
|
onTap: () =>
|
|
{
|
|
controller.clear();
|
|
onSearchTextChanged("");
|
|
}
|
|
),
|
|
new Padding(padding: EdgeInsets.only(right: 2f))
|
|
}))));
|
|
}
|
|
|
|
private Widget buildItemList()
|
|
{
|
|
return new Expanded(
|
|
child: _searchResult.Count != 0 ?
|
|
(Widget) ListView.builder(itemCount: _searchResult.Count,
|
|
itemBuilder: (build_context, index) =>
|
|
{
|
|
return new Container(
|
|
child: new Padding(
|
|
padding: EdgeInsets.only(left: 4.0f, right: 4f),
|
|
child: new Card(
|
|
shape:new RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.all(Radius.circular(2.0f))
|
|
),
|
|
margin: EdgeInsets.all(1),
|
|
child: new GestureDetector(
|
|
onTap: () =>
|
|
{
|
|
setState(() =>
|
|
{
|
|
selectedIndex = index;
|
|
GameObjectManager.FocusOnObject(_searchResult[index].itemName);
|
|
widget.itemSelectCallback?.Invoke(selectedIndex);
|
|
});
|
|
},
|
|
child: new AnimateButton(
|
|
selected: selectedIndex == index,
|
|
child: new Row(
|
|
children: new List<Widget> {
|
|
new Padding(padding: EdgeInsets.only(left: 2f)),
|
|
new Checkbox(value: _searchResult[index].active, onChanged: (value) =>
|
|
{
|
|
if (value == null)
|
|
{
|
|
return;
|
|
}
|
|
setState(() =>
|
|
{
|
|
_searchResult[index].active = value.Value;
|
|
if (value.Value)
|
|
{
|
|
GameObjectManager.MoveCenter(_searchResult[index].itemName);
|
|
}
|
|
else
|
|
{
|
|
GameObjectManager.MoveFar(_searchResult[index].itemName);
|
|
}
|
|
widget.itemCheckCallback?.Invoke(index, value.Value);
|
|
});
|
|
}),
|
|
new Text(_searchResult[index].showName, style: new TextStyle(fontSize: 8f))
|
|
}
|
|
)
|
|
)))));
|
|
}) : new Center(
|
|
child: new Text("No Available Item", style: new TextStyle(fontSize: 8f))
|
|
)
|
|
);
|
|
}
|
|
|
|
private void onSearchTextChanged(string text)
|
|
{
|
|
_searchResult.Clear();
|
|
if (text.isEmpty())
|
|
{
|
|
_searchResult.AddRange(widget.itemNames);
|
|
}
|
|
else
|
|
{
|
|
foreach (var item in widget.itemNames)
|
|
{
|
|
if (item.showName.StartsWith(text))
|
|
{
|
|
_searchResult.Add(item);
|
|
}
|
|
}
|
|
}
|
|
|
|
setState(() => {});
|
|
}
|
|
}
|
|
}
|