Beispiel #1
0
            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);
        }
Beispiel #3
0
        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;
            }
        }