Пример #1
0
 public GenericToolbarEntry(long id, string icon, bool toggled, bool enabled, ToolbarClickHandler handler, object userdata)
 {
     Id       = id;
     Icon     = icon;
     Toggled  = toggled;
     Enabled  = enabled;
     Handler  = handler;
     Userdata = userdata;
 }
        public GenericToolbarEntry[] GetToolbarItems()
        {
            if (_updateMenuItems == null || _updateMenuItems.IsCompleted)
            {
                _updateMenuItems = Task.Run(async() =>
                {
                    var items = new List <GenericToolbarEntry>();
                    foreach (var ext in _extensionManager.Extensions)
                    {
                        var toRemove = new List <WeakReference <Extension.Extension> >();
                        if (_ignoredExtensions.Any(x =>
                        {
                            Extension.Extension oext;
                            if (x.TryGetTarget(out oext))
                            {
                                return(oext == ext);
                            }
                            else
                            {
                                toRemove.Add(x);
                            }
                            return(false);
                        }))
                        {
                            continue;
                        }
                        _ignoredExtensions.RemoveAll(toRemove.Contains);

                        var client = ext.GetClient <Grpc.ExtensionHost.ToolbarEntries.ToolbarEntriesClient>();
                        RepeatedField <Grpc.ExtensionHost.GenericToolbarItem> rawItems;
                        try
                        {
                            var result = await client.GetToolbarItemsAsync(new Grpc.ExtensionHost.GetToolbarItemsRequest());
                            rawItems   = result.ToolbarItems;
                        }
                        catch (Exception ex)
                        {
                            _consoleHandle.LogError(ex);
                            _ignoredExtensions.Add(new WeakReference <Extension.Extension>(ext));
                            continue;
                        }
                        items.AddRange(rawItems.Select(y =>
                        {
                            ToolbarClickHandler clickCallback = e =>
                            {
                                Task.Run(async() =>
                                {
                                    try
                                    {
                                        await client.ToolbarItemClickedAsync(new Grpc.ExtensionHost.ToolbarItemClickedRequest {
                                            ToolbarId = y.Id
                                        });
                                    }
                                    catch (Exception ex)
                                    {
                                        _consoleHandle.LogError(ex);
                                    }
                                });
                            };
                            return(new GenericToolbarEntry(y.Id, y.Icon, y.Toggled, y.Enabled, clickCallback, null));
                        }));
                    }
                    _menuItems = items.ToArray();
                    await Task.Delay(1000);
                });
            }

            return(_menuItems);
        }