Fix UI issues with Camera Monitor (#31809)
* Fix jumpy camera monitor UI Basically copy-pasted same solution from #30292 * Remove duplicate code; use shared ItemList method to sync items
This commit is contained in:
@@ -213,52 +213,14 @@ public sealed partial class CriminalRecordsConsoleWindow : FancyWindow
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var entries = listing.ToList();
|
var entries = listing.Select(i => new ItemList.Item(RecordListing) {
|
||||||
entries.Sort((a, b) => string.Compare(a.Value, b.Value, StringComparison.Ordinal));
|
Text = i.Value,
|
||||||
// `entries` now contains the definitive list of items which should be in
|
Metadata = i.Key
|
||||||
// our list of records and is in the order we want to present those items.
|
}).ToList();
|
||||||
|
entries.Sort((a, b) => string.Compare(a.Text, b.Text, StringComparison.Ordinal));
|
||||||
// Walk through the existing items in RecordListing and in the updated listing
|
RecordListing.SetItems(entries, (a,b) => string.Compare(a.Text, b.Text));
|
||||||
// in parallel to synchronize the items in RecordListing with `entries`.
|
|
||||||
int i = RecordListing.Count - 1;
|
|
||||||
int j = entries.Count - 1;
|
|
||||||
while (i >= 0 && j >= 0)
|
|
||||||
{
|
|
||||||
var strcmp = string.Compare(RecordListing[i].Text, entries[j].Value, StringComparison.Ordinal);
|
|
||||||
if (strcmp == 0)
|
|
||||||
{
|
|
||||||
// This item exists in both RecordListing and `entries`. Nothing to do.
|
|
||||||
i--;
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
else if (strcmp > 0)
|
|
||||||
{
|
|
||||||
// Item exists in RecordListing, but not in `entries`. Remove it.
|
|
||||||
RecordListing.RemoveAt(i);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
else if (strcmp < 0)
|
|
||||||
{
|
|
||||||
// A new entry which doesn't exist in RecordListing. Create it.
|
|
||||||
RecordListing.Insert(i + 1, new ItemList.Item(RecordListing){Text = entries[j].Value, Metadata = entries[j].Key});
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any remaining items in RecordListing don't exist in `entries`, so remove them
|
|
||||||
while (i >= 0)
|
|
||||||
{
|
|
||||||
RecordListing.RemoveAt(i);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// And finally, any remaining items in `entries`, don't exist in RecordListing. Create them.
|
|
||||||
while (j >= 0)
|
|
||||||
{
|
|
||||||
RecordListing.Insert(0, new ItemList.Item(RecordListing){ Text = entries[j].Value, Metadata = entries[j].Key });
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PopulateRecordContainer(GeneralStationRecord stationRecord, CriminalRecord criminalRecord)
|
private void PopulateRecordContainer(GeneralStationRecord stationRecord, CriminalRecord criminalRecord)
|
||||||
{
|
{
|
||||||
var specifier = new SpriteSpecifier.Rsi(new ResPath("Interface/Misc/job_icons.rsi"), "Unknown");
|
var specifier = new SpriteSpecifier.Rsi(new ResPath("Interface/Misc/job_icons.rsi"), "Unknown");
|
||||||
|
|||||||
@@ -125,14 +125,12 @@ public sealed partial class SurveillanceCameraMonitorWindow : DefaultWindow
|
|||||||
|
|
||||||
private void PopulateCameraList(Dictionary<string, string> cameras)
|
private void PopulateCameraList(Dictionary<string, string> cameras)
|
||||||
{
|
{
|
||||||
SubnetList.Clear();
|
var entries = cameras.Select(i => new ItemList.Item(SubnetList) {
|
||||||
|
Text = $"{i.Value}: {i.Key}",
|
||||||
foreach (var (address, name) in cameras)
|
Metadata = i.Key
|
||||||
{
|
}).ToList();
|
||||||
AddCameraToList(name, address);
|
entries.Sort((a, b) => string.Compare(a.Text, b.Text, StringComparison.Ordinal));
|
||||||
}
|
SubnetList.SetItems(entries, (a,b) => string.Compare(a.Text, b.Text));
|
||||||
|
|
||||||
SubnetList.SortItemsByText();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetCameraView(IEye? eye)
|
private void SetCameraView(IEye? eye)
|
||||||
@@ -187,12 +185,6 @@ public sealed partial class SurveillanceCameraMonitorWindow : DefaultWindow
|
|||||||
return SubnetSelector.ItemCount - 1;
|
return SubnetSelector.ItemCount - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddCameraToList(string name, string address)
|
|
||||||
{
|
|
||||||
var item = SubnetList.AddItem($"{name}: {address}");
|
|
||||||
item.Metadata = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnSubnetListSelect(ItemList.ItemListSelectedEventArgs args)
|
private void OnSubnetListSelect(ItemList.ItemListSelectedEventArgs args)
|
||||||
{
|
{
|
||||||
CameraSelected!((string) SubnetList[args.ItemIndex].Metadata!);
|
CameraSelected!((string) SubnetList[args.ItemIndex].Metadata!);
|
||||||
|
|||||||
Reference in New Issue
Block a user