private static void OnToolbarItemChanged(MySyncButtonPanel sync, ref ChangeToolbarItemMsg msg, MyNetworkClient sender) { sync.m_syncing = true; MyToolbarItem item = null; if (msg.Item.EntityID != 0) { if (string.IsNullOrEmpty(msg.Item.GroupName)) { MyTerminalBlock block; if (MyEntities.TryGetEntityById <MyTerminalBlock>(msg.Item.EntityID, out block)) { var builder = MyToolbarItemFactory.TerminalBlockObjectBuilderFromBlock(block); builder.Action = msg.Item.Action; item = MyToolbarItemFactory.CreateToolbarItem(builder); } } else { MyButtonPanel parent; if (MyEntities.TryGetEntityById <MyButtonPanel>(msg.Item.EntityID, out parent)) { var grid = parent.CubeGrid; var groupName = msg.Item.GroupName; var group = grid.GridSystems.TerminalSystem.BlockGroups.Find((x) => x.Name.ToString() == groupName); if (group != null) { var builder = MyToolbarItemFactory.TerminalGroupObjectBuilderFromGroup(group); builder.Action = msg.Item.Action; builder.BlockEntityId = msg.Item.EntityID; item = MyToolbarItemFactory.CreateToolbarItem(builder); } } } } sync.m_panel.Toolbar.SetItemAtIndex(msg.Index, item); sync.m_syncing = false; }
public static ToolbarItem FromItem(MyToolbarItem item) { var tItem = new ToolbarItem(); tItem.EntityID = 0; var terminalItem = item as MyToolbarItemTerminalBlock; if (terminalItem != null) { var block = item.GetObjectBuilder() as MyObjectBuilder_ToolbarItemTerminalBlock; tItem.EntityID = block.BlockEntityId; tItem.Action = block.Action; tItem.Parameters = block.Parameters; } else if (item is MyToolbarItemTerminalGroup) { var block = item.GetObjectBuilder() as MyObjectBuilder_ToolbarItemTerminalGroup; tItem.EntityID = block.BlockEntityId; tItem.Action = block.Action; tItem.GroupName = block.GroupName; tItem.Parameters = block.Parameters; } return(tItem); }
public FileTransferPage() : base("File Transfer") { MyLogger.TestMethodAdded += (name, task) => { var ti = new MyToolbarItem(name); ti.Clicked += async delegate { await task(); }; this.ToolbarItems.Add(ti); }; { GDmain = new MyGrid(); GDmain.RowDefinitions.Add(new Xamarin.Forms.RowDefinition { Height = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Auto) }); GDmain.RowDefinitions.Add(new Xamarin.Forms.RowDefinition { Height = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); { GDctrl = new MyGrid(); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(3, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(2, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(4, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); GDctrl.ColumnDefinitions.Add(new Xamarin.Forms.ColumnDefinition { Width = new Xamarin.Forms.GridLength(1, Xamarin.Forms.GridUnitType.Star) }); int columnNumber = 0; { var sw = new MySwitch("Auto Restart Failed tasks", "Manual Restart Failed Tasks", false); FTmain = new FileTransferContentView(); sw.Toggled += delegate { FTmain.SetAutoRestartFailedTasks(sw.IsToggled); }; sw.IsToggled = true; GDctrl.Children.Add(sw, columnNumber++, 0); } { var toSpeedText = new Func <long, string>((value) => { double v = value; if (v <= 1023) { return($"{v.ToString("F5").Remove(5).PadRight(5, '0')} B/s"); } v /= 1024; if (v <= 1023) { return($"{v.ToString("F5").Remove(5).PadRight(5, '0')} KB/s"); } v /= 1024; return($"{v.ToString("F5").Remove(5).PadRight(5, '0')} MB/s"); }); var lbl = new MyLabel($"{toSpeedText(0)}") { VerticalTextAlignment = TextAlignment.Center }; System.Threading.SemaphoreSlim semaphoreSlim = new System.Threading.SemaphoreSlim(1, 1); long totalAmountSent = 0; CloudFile.Networker.ChunkProcceeded += async(coda) => { totalAmountSent += coda; DateTime startTime = DateTime.Now; await semaphoreSlim.WaitAsync(); while ((DateTime.Now - startTime).TotalSeconds <= 5) { lbl.Text = $"{toSpeedText(totalAmountSent / 5)}"; await Task.Delay(100); } totalAmountSent -= coda; lbl.Text = toSpeedText(totalAmountSent / 5); lock (semaphoreSlim) semaphoreSlim.Release(); }; GDctrl.Children.Add(lbl, columnNumber++, 0); } { var btn = new MyButton("Reset"); GDctrl.Children.Add(btn, columnNumber++, 0); var lbl = new MyLabel("") { VerticalTextAlignment = TextAlignment.Center }; long totalAmountLeft = 0, totalFilesLeft = 0, totalFoldersLeft = 0; long totalAmount = 0, totalFiles = 0, totalFolders = 0; btn.Clicked += async delegate { btn.IsEnabled = false; if (await MyLogger.Ask("Are you sure to reset the statistic data?\r\nIncluding: total data amount, file count, folder count")) { totalAmount = totalFiles = totalFolders = 0; } btn.IsEnabled = true; }; var toSizeText = new Func <long, string>((value) => { double v = value; if (v <= 1023) { return($"{v.ToString("F5").Remove(5)} B"); } v /= 1024; if (v <= 1023) { return($"{v.ToString("F5").Remove(5)} KB"); } v /= 1024; if (v <= 1023) { return($"{v.ToString("F5").Remove(5)} MB"); } v /= 1024; if (v <= 1023) { return($"{v.ToString("F5").Remove(5)} GB"); } v /= 1024; return($"{v.ToString("F5").Remove(5)} TB"); }); System.Threading.SemaphoreSlim semaphoreSlim = new System.Threading.SemaphoreSlim(1, 1); DateTime lastUpdate = DateTime.MinValue; var showResult = new Func <Task>(async() => { var updateTime = DateTime.Now; await semaphoreSlim.WaitAsync(); if (updateTime <= lastUpdate) { return; } lbl.Text = $"{toSizeText(totalAmountLeft)} / {toSizeText(totalAmount)} \t{totalFilesLeft } / {totalFiles} files \t{totalFoldersLeft } / {totalFolders} folders"; await Task.Delay(100); lock (semaphoreSlim) semaphoreSlim.Release(); }); CloudFile.Networker.TotalAmountRemainChanged += async(coda) => { if (coda < 0) { totalAmount -= coda; } totalAmountLeft += coda; await showResult(); }; CloudFile.Networker.TotalFilesRemainChanged += async(coda) => { if (coda < 0) { totalFiles -= coda; } totalFilesLeft += coda; await showResult(); }; CloudFile.Networker.TotalFoldersRemainChanged += async(coda) => { if (coda < 0) { totalFolders -= coda; } totalFoldersLeft += coda; await showResult(); }; GDctrl.Children.Add(lbl, columnNumber++, 0); } { var actions = new Dictionary <CloudFile.Networker.NetworkStatus, Func <int, Task> >(); foreach (var status in Enum.GetValues(typeof(CloudFile.Networker.NetworkStatus)).Cast <CloudFile.Networker.NetworkStatus>()) { networkers[status] = new HashSet <CloudFile.Networker>(); string text; Func <CloudFile.Networker, Task> clickAction = null; switch (status) { case CloudFile.Networker.NetworkStatus.Completed: text = "\u2714"; break; case CloudFile.Networker.NetworkStatus.ErrorNeedRestart: { text = "\u26a0"; clickAction = new Func <CloudFile.Networker, Task>(async(networker) => { await networker.ResetAsync(); await networker.StartAsync(); }); } break; case CloudFile.Networker.NetworkStatus.Networking: { text = "\u23f8"; clickAction = new Func <CloudFile.Networker, Task>(async(networker) => { await networker.PauseAsync(); }); } break; case CloudFile.Networker.NetworkStatus.NotStarted: { text = "\u23f0"; clickAction = new Func <CloudFile.Networker, Task>(async(networker) => { await networker.StartAsync(); }); } break; case CloudFile.Networker.NetworkStatus.Paused: { text = "\u25b6"; clickAction = new Func <CloudFile.Networker, Task>(async(networker) => { await networker.StartAsync(); }); } break; default: throw new Exception($"status: {status}"); } MyButton btn = new MyButton(text) { Opacity = 0 }; if (status == CloudFile.Networker.NetworkStatus.Completed) { btn.IsEnabled = false; } btn.Clicked += async delegate { IEnumerable <Task> tasks; lock (networkers) { tasks = networkers[status].ToList().Select(async(networker) => { await clickAction(networker); }); } await Task.WhenAll(tasks); }; int number = 0; System.Threading.SemaphoreSlim semaphoreSlim = new System.Threading.SemaphoreSlim(1, 1); DateTime lastUpdate = DateTime.Now; actions[status] = new Func <int, Task>(async(difference) => { bool isZeroBefore = (number == 0); number += difference; DateTime updateTime = DateTime.Now; await semaphoreSlim.WaitAsync(); try { if (updateTime <= lastUpdate) { return; } lastUpdate = updateTime; btn.Text = $"{text}{number}"; if (number == 0 && !isZeroBefore) { await btn.FadeTo(0, 500); } if (number != 0 && isZeroBefore) { await btn.FadeTo(1, 500); } await Task.Delay(100); } finally { lock (semaphoreSlim) semaphoreSlim.Release(); } }); GDctrl.Children.Add(btn, columnNumber++, 0); } FTmain.StatusEnter += async(networker, status) => { networkers[status].Add(networker); await actions[status](1); }; FTmain.StatusLeave += async(networker, status) => { networkers[status].Remove(networker); await actions[status](-1); }; } GDmain.Children.Add(GDctrl, 0, 0); } { GDmain.Children.Add(new Frame { OutlineColor = Color.Accent, Padding = new Thickness(5), Content = FTmain }, 0, 1); } this.Content = GDmain; } }