Implement action bar.

This commit is contained in:
2023-11-23 18:03:55 +08:00
parent e9d0f4ce1a
commit 522699152b
8 changed files with 142 additions and 14 deletions

View File

@@ -0,0 +1,28 @@
using Cryville.Crtr.Browsing.Actions;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Cryville.Crtr.Browsing.UI {
internal class ActionBar : MonoBehaviour {
[SerializeField]
ActionButton m_mainButton;
public void Load(ResourceBrowser browser, IReadOnlyCollection<IResourceAction> actions) {
var enumerator = actions.OrderBy(i => i.Priority).GetEnumerator();
if (enumerator.MoveNext()) {
gameObject.SetActive(true);
m_mainButton.Load(browser, enumerator.Current);
// TODO Subactions
}
else {
m_mainButton.Clear();
Clear();
}
}
public void Clear() {
gameObject.SetActive(false);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2023a3c5fbf0e144588637193aabf286
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
using Cryville.Crtr.Browsing.Actions;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
namespace Cryville.Crtr.Browsing.UI {
internal class ActionButton : MonoBehaviour, IPointerClickHandler {
[SerializeField]
TextMeshProUGUI m_text;
ResourceBrowser _browser;
IResourceAction _action;
public void Load(ResourceBrowser browser, IResourceAction action) {
gameObject.SetActive(true);
_browser = browser;
_action = action;
m_text.text = action.Name;
}
public void Clear() {
gameObject.SetActive(false);
}
public void OnPointerClick(PointerEventData eventData) {
if (_action == null) return;
_browser.InvokeAction(_action);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9a8a3fbcb7ecfd941bcc43425f01cfef
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -20,7 +20,7 @@ namespace Cryville.Crtr.Browsing.UI {
[SerializeField]
DetailPanel m_detailPanel;
[SerializeField]
GameObject m_actionBar;
ActionBar m_actionBar;
IPathedResourceManager<ChartDetail> _manager;
IResourceAction _importAction;
@@ -77,6 +77,7 @@ namespace Cryville.Crtr.Browsing.UI {
_items.Clear();
m_itemContainer.ItemCount = _manager.Count;
m_detailPanel.Clear();
m_actionBar.Clear();
}
}
@@ -102,8 +103,9 @@ namespace Cryville.Crtr.Browsing.UI {
_selectedItems.Clear();
_items[id].OnSelect();
_selectedItems.Add(id);
m_detailPanel.Load(_manager[id]);
m_actionBar.SetActive(true);
ChartDetail res = _manager[id];
m_detailPanel.Load(res);
m_actionBar.Load(this, Master.Actions.GetActions(res.GetType()));
}
public void OnPathClicked(int index) {
@@ -121,5 +123,19 @@ namespace Cryville.Crtr.Browsing.UI {
if (result != 0) return;
foreach (var item in _selectedItems.OrderByDescending(i => i)) _manager.RemoveAt(item);
}
public override void InvokeAction(IResourceAction action) {
if (_selectedItems.Count == 0) {
Popup.Create("No item is selected.");
return;
}
if (_selectedItems.Count > 1) {
Popup.Create("Cannot run this action with multiple items.");
return;
}
foreach (var i in _selectedItems) {
action.Invoke(_manager.GetItemUri(i), _manager[i]);
}
}
}
}

View File

@@ -1,3 +1,4 @@
using Cryville.Crtr.Browsing.Actions;
using UnityEngine;
namespace Cryville.Crtr.Browsing.UI {
@@ -10,5 +11,7 @@ namespace Cryville.Crtr.Browsing.UI {
protected void Init(ResourceBrowserMaster master) {
Master = master;
}
public abstract void InvokeAction(IResourceAction action);
}
}

View File

@@ -1,3 +1,4 @@
using Cryville.Crtr.Browsing.Actions;
using Cryville.Crtr.Config;
using Cryville.Crtr.Config.UI;
@@ -6,5 +7,6 @@ namespace Cryville.Crtr.Browsing.UI {
protected virtual void Awake() {
GetComponent<PropertyMasterPanel>().Adapter = new DefaultPropertyMasterAdapter(Settings.Default);
}
public override void InvokeAction(IResourceAction action) { }
}
}

View File

@@ -469,6 +469,7 @@ GameObject:
- component: {fileID: 92937987}
- component: {fileID: 92937986}
- component: {fileID: 92937985}
- component: {fileID: 92937989}
m_Layer: 5
m_Name: Play
m_TagString: Untagged
@@ -495,7 +496,7 @@ RectTransform:
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 198.26378, y: 0}
m_SizeDelta: {x: 202.3943, y: 0}
m_Pivot: {x: 1, y: 0.5}
--- !u!114 &92937985
MonoBehaviour:
@@ -593,6 +594,19 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 92937983}
m_CullTransparentMesh: 1
--- !u!114 &92937989
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 92937983}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9a8a3fbcb7ecfd941bcc43425f01cfef, type: 3}
m_Name:
m_EditorClassIdentifier:
m_text: {fileID: 1830105347}
--- !u!1 &142941875
GameObject:
m_ObjectHideFlags: 0
@@ -1562,10 +1576,10 @@ RectTransform:
m_Father: {fileID: 913152473}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 304, y: -19.808006}
m_SizeDelta: {x: 47.539215, y: 39.616013}
m_Pivot: {x: 1, y: 0.5}
--- !u!222 &268116900
CanvasRenderer:
@@ -3570,10 +3584,10 @@ RectTransform:
m_Father: {fileID: 913152473}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 128.2304, y: -19.808006}
m_SizeDelta: {x: 256.4608, y: 39.616013}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &969586382
GameObject:
@@ -3788,7 +3802,7 @@ MonoBehaviour:
m_pathText: {fileID: 13115418}
m_itemContainer: {fileID: 17676803}
m_detailPanel: {fileID: 1177404488}
m_actionBar: {fileID: 1514109545}
m_actionBar: {fileID: 1514109549}
--- !u!1 &1039999565
GameObject:
m_ObjectHideFlags: 0
@@ -5080,6 +5094,7 @@ GameObject:
- component: {fileID: 1514109546}
- component: {fileID: 1514109548}
- component: {fileID: 1514109547}
- component: {fileID: 1514109549}
m_Layer: 5
m_Name: Actionbar
m_TagString: Untagged
@@ -5146,6 +5161,19 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1514109545}
m_CullTransparentMesh: 1
--- !u!114 &1514109549
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1514109545}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2023a3c5fbf0e144588637193aabf286, type: 3}
m_Name:
m_EditorClassIdentifier:
m_mainButton: {fileID: 92937989}
--- !u!1 &1585700337
GameObject:
m_ObjectHideFlags: 0
@@ -5677,7 +5705,7 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 29.55
m_fontSize: 30.15
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 1