Exemplo n.º 1
0
 public Rulerbar()
 {
     RootWidget = new Widget {
         Id            = nameof(Rulerbar),
         MinMaxHeight  = Metrics.ToolbarHeight,
         HitTestTarget = true
     };
     RootWidget.CompoundPresenter.Add(new SyncDelegatePresenter <Widget>(Render));
     RootWidget.LateTasks.Add(
         new KeyPressHandler(Key.Mouse0DoubleClick, RootWidget_DoubleClick),
         new KeyPressHandler(Key.Mouse1, (input, key) => new ContextMenu().Show())
         );
     RootWidget.AddChangeWatcher(() => Document.Current.AnimationFrame, (value) => {
         var markers = Document.Current.Animation.Markers;
         int i       = markers.FindIndex(m => m.Frame == value);
         if (i >= 0)
         {
             upperMarker = markers[i];
         }
     });
     RootWidget.AddChangeWatcher(() => Document.Current.Container, (value) => {
         upperMarker = null;
     });
     warningIcon = IconPool.GetTexture("Inspector.Warning");
 }
Exemplo n.º 2
0
 public Timeline(Panel panel)
 {
     RootWidget                 = new Widget();
     FilesDropHandler           = new FilesDropHandler(RootWidget);
     FilesDropHandler.Handling += FilesDropOnHandling;
     Panel       = panel;
     PanelWidget = panel.ContentWidget;
     Toolbar     = new Toolbar();
     Ruler       = new Rulerbar();
     Overview    = new OverviewPane();
     Grid        = new GridPane(this);
     CurveEditor = new CurveEditorPane(this);
     Roll        = new RollPane();
     CreateProcessors();
     InitializeWidgets();
     RootWidget.AddChangeWatcher(() => Document.Current.Container, (container) => {
         Offset = container.Components.GetOrAdd <TimelineOffset>().Offset;
     });
     RootWidget.AddChangeWatcher(() => Offset, (value) => {
         var offset = Document.Current.Container.Components.Get <TimelineOffset>();
         if (offset != null)
         {
             offset.Offset = value;
         }
     });
 }
Exemplo n.º 3
0
 public Timeline(Panel panel)
 {
     RootWidget  = new Widget();
     Panel       = panel;
     PanelWidget = panel.ContentWidget;
     Toolbar     = new Toolbar();
     Ruler       = new Rulerbar();
     Overview    = new OverviewPane();
     Grid        = new GridPane(this);
     CurveEditor = new CurveEditorPane(this);
     Roll        = new RollPane();
     CreateProcessors();
     InitializeWidgets();
     WaveformCache = new WaveformCache(Project.Current.FileSystemWatcher);
     RootWidget.AddChangeWatcher(() => Document.Current.Container, container => {
         Offset = container.Components.GetOrAdd <TimelineOffset>().Offset;
     });
     RootWidget.AddChangeWatcher(() => Offset, (value) => {
         var offset = Document.Current.Container.Components.Get <TimelineOffset>();
         if (offset != null)
         {
             offset.Offset = value;
         }
     });
     RootWidget.Gestures.Add(DropFilesGesture = new DropFilesGesture());
     CreateFilesDropHandlers();
     OnCreate?.Invoke(this);
 }
Exemplo n.º 4
0
 void InitializeWidgets()
 {
     RootWidget.AddChangeWatcher(() => selection.Version, Selection_Changed);
     scrollView.Content.Layout = new FlowLayout {
         Spacing = 1.0f
     };
     scrollView.Content.Padding = new Thickness(5.0f);
     scrollView.Content.CompoundPostPresenter.Insert(0, new DelegatePresenter <Widget>(RenderFilesWidgetRectSelection));
     scrollView.Updated          += ScrollViewUpdated;
     scrollView.Content.Presenter = new DelegatePresenter <Widget>((w) => {
         w.PrepareRendererState();
         var wp = w.ParentWidget;
         var p  = wp.Padding;
         Renderer.DrawRect(-w.Position + Vector2.Zero - new Vector2(p.Left, p.Top),
                           -w.Position + wp.Size + new Vector2(p.Right, p.Bottom), Theme.Colors.WhiteBackground);
     });
     RootWidget.AddChangeWatcher(() => dragState, (ds) => Window.Current.Invalidate());
     RootWidget.AddChangeWatcher(() => dragEndPosition, WhenSelectionRectChanged);
     RootWidget.AddChangeWatcher(() => WidgetContext.Current.NodeUnderMouse, (value) => {
         if (value != null && scrollView.Content == value.Parent)
         {
             Window.Current.Invalidate();
         }
     });
     RootWidget.AddChangeWatcher(() => model.CurrentPath, (p) => {
         var up  = RootWidget.Components.Get <ViewNodeComponent>().ViewNode as FSViewNode;
         up.Path = p;
         AddToNavHystory(p);
         selection.Clear();
         InvalidateView(p);
         InvalidateFSWatcher(p);
         preview.ClearTextureCache();
         lastKeyboardSelectedFilesystemItem = scrollView.Content.FirstChild as FilesystemItem;
     });
     RootWidget.Layout = new VBoxLayout();
     RootWidget.AddNode((cookingRulesSplitter = new ThemedHSplitter {
         Nodes =
         {
             (new Widget {
                 Layout = new VBoxLayout(),
                 Nodes =
                 {
                     toolbar,
                     (selectionPreviewSplitter = new ThemedVSplitter{
                         Nodes =
                         {
                             scrollView,
                             preview.RootWidget,
                         }
                     })
                 }
             }),
             crEditor.RootWidget,
         }
     }));
 }
Exemplo n.º 5
0
 public Toolbar(Widget container)
 {
     widget = new Widget();
     container.Nodes.Add(widget);
     DecorateToolbar(widget);
     container.AddChangeWatcher(() => Version, _ => Rebuild());
 }
Exemplo n.º 6
0
 public GridPane(Timeline timeline)
 {
     this.timeline           = timeline;
     timeline.OffsetChanged += value => ContentWidget.Position = -value;
     RootWidget              = new Frame {
         Id     = nameof(GridPane),
         Layout = new StackLayout {
             HorizontallySizeable = true, VerticallySizeable = true
         },
         ClipChildren  = ClipMethod.ScissorTest,
         HitTestTarget = true,
     };
     ContentWidget = new Widget {
         Id      = nameof(GridPane) + "Content",
         Padding = new Thickness {
             Top = 1, Bottom = 1
         },
         Layout = new VBoxLayout {
             Spacing = TimelineMetrics.RowSpacing
         },
         Presenter     = new DelegatePresenter <Node>(RenderBackgroundAndGrid),
         PostPresenter = new DelegatePresenter <Widget>(w => OnPostRender(w))
     };
     RootWidget.AddNode(ContentWidget);
     RootWidget.AddChangeWatcher(() => RootWidget.Size,
                                 // Some document operation processors (e.g. ColumnCountUpdater) require up-to-date timeline dimensions.
                                 _ => Core.Operations.Dummy.Perform());
     OnPostRender += RenderCursor;
     OnPostRender += RenderSelection;
     RootWidget.Tasks.Add(HandleRightClickTask);
 }
Exemplo n.º 7
0
        public override void Initialize()
        {
            Tab = new ThemedTab {
                Text = "Devices"
            };
            Content = new Widget {
                Layout = new VBoxLayout(),
                Nodes  =
                {
                    (mainToolbar                     = new RemoteScriptingWidgets.Toolbar()),
                    new Widget {
                        Layout = new HBoxLayout(),
                        Nodes  =
                        {
                            (devicesScrollView       = new ThemedScrollView {
                                MinMaxWidth          =                                   300,
                                TabTravesable        = new TabTraversable()
                            }),
                            (deviceWidgetPlaceholder = new Widget()
                            {
                                Layout               = new HBoxLayout()
                            })
                        }
                    }
                }
            };
            RefreshMainToolbar();
            Content.AddChangeWatcher(
                () => CompiledAssembly.Instance,
                _ => {
                RefreshMainToolbar();
            }
                );

            void SelectDeviceBasedOnMousePosition()
            {
                devicesScrollView.SetFocus();
                var index = (devicesScrollView.Content.LocalMousePosition().Y / rowHeight).Floor();

                if (index < devices.Count)
                {
                    SelectDevice(index);
                }
            }

            var mouseDownGesture = new ClickGesture(0);

            mouseDownGesture.Began += SelectDeviceBasedOnMousePosition;
            devicesScrollView.Gestures.Add(mouseDownGesture);
            devicesScrollView.Content.CompoundPresenter.Insert(0, new SyncDelegatePresenter <Widget>(w => {
                w.PrepareRendererState();
                Renderer.DrawRect(
                    0, rowHeight * selectedDeviceIndex,
                    w.Width, rowHeight * (selectedDeviceIndex + 1),
                    devicesScrollView.IsFocused() ? Theme.Colors.SelectedBackground : Theme.Colors.SelectedInactiveBackground
                    );
            }));
        }
Exemplo n.º 8
0
        private void CreateWidgetsForSingleField(CookingRulesCollection crc, string path, Meta.Item yi)
        {
            var    key    = NormalizePath(path);
            var    parent = crc[key];
            Widget headerWidget;
            Widget overridesWidget;
            var    fieldRootWidget = new Widget {
                Layout = new VBoxLayout(),
                Nodes  =
                {
                    (headerWidget        = new Widget     {
                        Layout           = new HBoxLayout {
                            IgnoreHidden = false,
                        },
                        // TODO: maybe some Metrics.ScrollView.SliderWidth ? (though ScrollView is decorated in DesktopTheme which is inside Lime)
                        Padding          = new Thickness  {
                            Right        =     10.0f
                        },
                    }),
                    (overridesWidget     = new Widget     {
                        Visible          = false,
                        Layout           = new VBoxLayout(),
                        Padding          = new Thickness  {
                            Left         = 30.0f
                        }
                    }),
                }
            };

            fieldRootWidget.AddChangeWatcher(() => WidgetContext.Current.NodeUnderMouse, (value) => {
                if (value != null && value.Parent == fieldRootWidget)
                {
                    Window.Current?.Invalidate();
                }
            });
            scrollView.Content.AddNode(fieldRootWidget);
            bool rootAdded = false;

            while (parent != null)
            {
                var isRoot = parent == crc[key];
                foreach (var kv in parent.Enumerate())
                {
                    if (isRoot && !rootAdded)
                    {
                        rootAdded = true;
                        CreateHeaderWidgets(crc, path, yi, headerWidget, overridesWidget, parent);
                    }
                    if (kv.Value.FieldOverrides.Contains(yi))
                    {
                        CreateOverridesWidgets(crc, key, kv.Key, yi, parent, overridesWidget);
                    }
                }
                parent = parent.Parent;
            }
        }
Exemplo n.º 9
0
 public TriangleColorWheel(Property <ColorHSVA> color)
 {
     this.color = color;
     Widget     = new Widget {
         HitTestTarget = true,
         MinMaxSize    = OuterRadius * 2 * Vector2.One,
         PostPresenter = new SyncDelegatePresenter <Widget>(Render)
     };
     Widget.Tasks.Add(SelectTask());
     Widget.AddChangeWatcher(() => color.Value.H, _ => wasHueChanged = true);
 }
Exemplo n.º 10
0
 public FilesystemPane(DockPanel dockPanel)
 {
     Instance        = this;
     this.dockPanel  = dockPanel;
     dockPanelWidget = dockPanel.ContentWidget;
     dockPanelWidget.AddChangeWatcher(() => Core.Project.Current.CitprojPath, (path) => {
         Initialize();
     });
     CommandHandlerList.Global.Connect(FilesystemCommands.NavigateTo, HandleHavigateTo);
     CommandHandlerList.Global.Connect(FilesystemCommands.OpenInSystemFileManager, HandleOpenInSystemFileManager);
 }
Exemplo n.º 11
0
            public NodeComponentCollectionRow(
                Model3DAttachment.NodeComponentCollection source,
                ObservableCollection <Model3DAttachment.NodeComponentCollection> sourceCollection) : base(source, sourceCollection)
            {
                Layout = new VBoxLayout();
                var expandedButton = new ThemedExpandButton {
                    MinMaxSize = new Vector2(AttachmentMetrics.ExpandButtonSize),
                    Anchors    = Anchors.Left
                };

                Padding = new Thickness(AttachmentMetrics.Spacing);
                Header.Nodes.Add(expandedButton);

                var nodeIdPropEditor = new StringPropertyEditor(
                    Decorate(new PropertyEditorParams(
                                 Header,
                                 source,
                                 nameof(Model3DAttachment.NodeComponentCollection.NodeId))));

                nodeIdPropEditor.ContainerWidget.MinMaxWidth = AttachmentMetrics.EditorWidth;

                var expandableContentWrapper = new Widget {
                    Layout = new VBoxLayout {
                        Spacing = AttachmentMetrics.Spacing
                    },
                    LayoutCell = new LayoutCell {
                        StretchY = 0
                    },
                    Padding = new Thickness {
                        Left   = AttachmentMetrics.ExpandContentPadding,
                        Top    = AttachmentMetrics.Spacing,
                        Bottom = AttachmentMetrics.Spacing
                    },
                    Visible = false,
                };

                if (source.Components == null)
                {
                    source.Components = new ObservableCollection <NodeComponent>();
                }

                BuildList(source.Components, expandableContentWrapper);
                Nodes.Add(expandableContentWrapper);
                expandableContentWrapper.AddChangeWatcher(
                    () => expandedButton.Expanded,
                    (v) => expandableContentWrapper.Visible = v);
                CompoundPresenter.Add(Presenters.StripePresenter);
            }
Exemplo n.º 12
0
 public CurveEditorPane(Timeline timeline)
 {
     this.timeline           = timeline;
     timeline.OffsetChanged += value => ContentWidget.X = -value.X;
     MainAreaWidget          = new Frame {
         Layout = new StackLayout {
             HorizontallySizeable = true, VerticallySizeable = true
         },
         ClipChildren  = ClipMethod.ScissorTest,
         HitTestTarget = true,
     };
     ContentWidget = new Widget {
         Id      = nameof(CurveEditorPane) + "Content",
         Padding = new Thickness {
             Top = 1, Bottom = 1
         },
         Layout = new VBoxLayout {
             Spacing = TimelineMetrics.RowSpacing
         },
         Presenter = new SyncDelegatePresenter <Node>(RenderBackgroundAndGrid),
     };
     MainAreaWidget.AddNode(ContentWidget);
     toolbar = new Widget {
         Padding      = new Thickness(2, 0),
         MinMaxHeight = Metrics.ToolbarHeight,
         Layout       = new HBoxLayout {
             Spacing = 4, DefaultCell = new DefaultLayoutCell {
                 Alignment = Alignment.Center
             }
         },
         Presenter = new WidgetFlatFillPresenter(ColorTheme.Current.Toolbar.Background),
     };
     RootWidget = new Widget {
         Id     = nameof(CurveEditorPane),
         Layout = new VBoxLayout(),
         Nodes  = { MainAreaWidget, toolbar }
     };
     RootWidget.AddChangeWatcher(() => RootWidget.Size,
                                 // Some document operation processors (e.g. ColumnCountUpdater) require up-to-date timeline dimensions.
                                 _ => Core.Operations.Dummy.Perform(Document.Current.History));
     RootWidget.Tasks.Add(
         new CurveEditorVerticalZoomProcessor(this),
         new CurveEditorSelectAndDragKeysProcessor(this),
         new CurveEditorPanProcessor(timeline)
         );
 }
Exemplo n.º 13
0
 public FilesystemView()
 {
     RootWidget = new Widget()
     {
         Id = "FSRoot"
     };
     RootWidget.FocusScope = new KeyboardFocusScope(RootWidget);
     scrollView            = new ThemedScrollView {
         TabTravesable = new TabTraversable()
     };
     // TODO: Display path
     RootWidget.AddChangeWatcher(() => model.CurrentPath, (path) => toolbar.Path = path.ToString());
     crEditor = new CookingRulesEditor(NavigateAndSelect);
     crEditor.RootWidget.TabTravesable = new TabTraversable();
     preview = new Preview();
     preview.RootWidget.TabTravesable = new TabTraversable();
 }
Exemplo n.º 14
0
            public VisualHintEditor(VisualHint hint, float leftOffset = 0f)
            {
                this.hint = hint;
                Layout    = new VBoxLayout();

                if (hint.Command != null)
                {
                    BooleanEditor = new BooleanEditor(hint.Command);
                }
                else
                {
                    BooleanEditor = new BooleanEditor(hint.Title);
                }
                BooleanEditor.Changed       += e => CheckHandle(e);
                BooleanEditor.Checked        = hint.Enabled;
                BooleanEditor.CommandIssued += () => CheckSelfAndChildren(BooleanEditor.Checked);

                var rowWidget = new Widget {
                    Layout  = new HBoxLayout(),
                    Padding = new Thickness {
                        Left = leftOffset
                    }
                };

                rowWidget.AddNode(hint.SubHints.Count > 0 ? (button = CreateExpandButton()) : offsetWidget.Clone());
                rowWidget.AddNode(BooleanEditor);
                AddNode(rowWidget);
                container = new Widget {
                    Layout = new VBoxLayout()
                };
                foreach (var subHint in hint.SubHints.Values)
                {
                    if (subHint.Hidden)
                    {
                        continue;
                    }
                    container.AddNode(new VisualHintEditor(subHint, leftOffset + 23)
                    {
                        parent = this
                    });
                }
                rowWidget.AddChangeWatcher(() => hint.Expanded, _ => HandleExpanded());
                TryCheckAll(traverseParents: false);
            }
Exemplo n.º 15
0
 public GridAnimationTrackView(Row row)
 {
     track      = row.Components.Get <AnimationTrackRow>().Track;
     GridWidget = new Widget {
         LayoutCell = new LayoutCell {
             StretchY = 0
         },
         MinHeight = TimelineMetrics.DefaultRowHeight,
         Presenter = new SyncDelegatePresenter <Widget>(Render)
     };
     GridWidgetAwakeBehavior.Action += _ => {
         GridWidget.AddChangeWatcher(() => CalcLabelsHashCode(GridWidget, track), __ => RefreshLabels(GridWidget, track));
     };
     OverviewWidget = new Widget {
         LayoutCell = new LayoutCell {
             StretchY = 0
         },
         MinHeight = TimelineMetrics.DefaultRowHeight,
         Presenter = new SyncDelegatePresenter <Widget>(Render)
     };
 }
Exemplo n.º 16
0
 private void CreateWatchersToRebuild()
 {
     RootWidget.AddChangeWatcher(CalcSelectedRowsHashcode, _ => Rebuild());
     RootWidget.Tasks.Add(DisableInspectorTask());
 }
Exemplo n.º 17
0
            public AnimationRow(Model3DAttachment.Animation animation, ObservableCollection <Model3DAttachment.Animation> options)
                : base(animation, options)
            {
                var isDefault = animation.Name == Model3DAttachment.DefaultAnimationName;

                deleteButton.Visible = !isDefault;
                Layout = new VBoxLayout();
                var expandedButton = new ThemedExpandButton {
                    MinMaxSize = new Vector2(AttachmentMetrics.ExpandButtonSize),
                    Anchors    = Anchors.Left
                };

                Padding = new Thickness(AttachmentMetrics.Spacing);
                Header.Nodes.Add(expandedButton);

                var animationNamePropEditor = new StringPropertyEditor(
                    new PropertyEditorParams(
                        Header,
                        animation,
                        nameof(Model3DAttachment.Animation.Name))
                {
                    ShowLabel = false
                });

                animationNamePropEditor.ContainerWidget.MinMaxWidth = AttachmentMetrics.EditorWidth;

                Header.AddNode(new BlendingCell(Source, nameof(Model3DAttachment.Animation.Blending)));

                var expandableContentWrapper = new Widget {
                    Layout = new VBoxLayout {
                        Spacing = AttachmentMetrics.Spacing
                    },
                    LayoutCell = new LayoutCell {
                        StretchY = 0
                    },
                    Padding = new Thickness {
                        Left   = AttachmentMetrics.ExpandContentPadding,
                        Top    = AttachmentMetrics.Spacing,
                        Bottom = AttachmentMetrics.Spacing
                    },
                    Visible = false,
                };

                BuildList <Model3DAttachment.MarkerData, MarkerRow>(
                    animation.Markers,
                    expandableContentWrapper,
                    "Markers",
                    () => new Model3DAttachment.MarkerData {
                    Marker = new Marker {
                        Id    = "Marker",
                        Frame = 0,
                    }
                },
                    MarkerRow.CreateHeader());

                BuildList <Model3DAttachment.MarkerBlendingData, MarkerBlendingRow>(
                    animation.MarkersBlendings,
                    expandableContentWrapper,
                    "Marker Blendings",
                    () => new Model3DAttachment.MarkerBlendingData {
                    SourceMarkerId = "Marker2",
                    DestMarkerId   = "Marker1"
                },
                    MarkerBlendingRow.CreateHeader());
                if (!isDefault)
                {
                    BuildList <Model3DAttachment.NodeData, NodeRow>(
                        animation.Nodes,
                        expandableContentWrapper,
                        "Nodes",
                        () => new Model3DAttachment.NodeData {
                        Id = "NodeId"
                    },
                        NodeRow.CreateHeader());

                    BuildList <Model3DAttachment.NodeData, NodeRow>(
                        animation.IgnoredNodes,
                        expandableContentWrapper,
                        "Ignored Nodes",
                        () => new Model3DAttachment.NodeData {
                        Id = "NodeId"
                    },
                        NodeRow.CreateHeader());
                }


                Nodes.Add(expandableContentWrapper);
                expandableContentWrapper.AddChangeWatcher(
                    () => expandedButton.Expanded,
                    (v) => expandableContentWrapper.Visible = v);
                CompoundPresenter.Add(Presenters.StripePresenter);
            }
Exemplo n.º 18
0
        private Widget CreateThemeEditor()
        {
            var pane = new Widget {
                Layout = new VBoxLayout {
                    Spacing = 10
                },
                Padding = contentPadding
            };
            var themeEditor = new ColorThemeEditor()
            {
                Layout = new VBoxLayout {
                    Spacing = 10
                },
                Padding = contentPadding
            };
            bool firstCall = true;

            pane.AddChangeWatcher(() => themeEditor.Version, _ => {
                if (firstCall)
                {
                    firstCall = false;
                    return;
                }
                themeChanged = true;
                themeEdited  = true;
            });
            var darkIcons      = CreateDarkIconsSwitch(pane);
            var loadDarkButton = new ThemedButton("Dark preset")
            {
                Clicked = () => {
                    AppUserPreferences.Instance.ColorThemeKind = ColorTheme.ColorThemeKind.Dark;
                    AppUserPreferences.Instance.LimeColorTheme = Theme.ColorTheme.CreateDarkTheme();
                    AppUserPreferences.Instance.ColorTheme     = ColorTheme.CreateDarkTheme();
                    themeEditor.Rebuild();
                    themeChanged = true;
                }
            };
            var loadLightButton = new ThemedButton("Light preset")
            {
                Clicked = () => {
                    AppUserPreferences.Instance.ColorThemeKind = ColorTheme.ColorThemeKind.Light;
                    AppUserPreferences.Instance.LimeColorTheme = Theme.ColorTheme.CreateLightTheme();
                    AppUserPreferences.Instance.ColorTheme     = ColorTheme.CreateLightTheme();
                    themeEditor.Rebuild();
                    themeChanged = true;
                }
            };
            var saveButton = new ThemedButton("Save theme")
            {
                Clicked = () => {
                    var dlg = new FileDialog {
                        AllowedFileTypes = new string[] { "theme" },
                        Mode             = FileDialogMode.Save
                    };
                    if (dlg.RunModal())
                    {
                        string path       = dlg.FileName;
                        var    serializer = new Yuzu.Json.JsonSerializer();
                        try {
                            var limeTheme = AppUserPreferences.Instance.LimeColorTheme;
                            var theme     = AppUserPreferences.Instance.ColorTheme;
                            using (var fileStream = new FileStream(path, FileMode.OpenOrCreate)) {
                                serializer.ToStream(new List <object> {
                                    limeTheme, theme
                                }, fileStream);
                            }
                        } catch (System.Exception e) {
                            AlertDialog.Show(e.Message);
                        }
                    }
                }
            };
            var loadButton = new ThemedButton("Load theme")
            {
                Clicked = () => {
                    var dlg = new FileDialog {
                        AllowedFileTypes = new string[] { "theme" },
                        Mode             = FileDialogMode.Open
                    };
                    if (dlg.RunModal())
                    {
                        string path         = dlg.FileName;
                        var    deserializer = new Yuzu.Json.JsonDeserializer();
                        try {
                            using (var fs = new FileStream(path, FileMode.OpenOrCreate)) {
                                var read = deserializer.FromStream(new List <object>(), fs) as List <object>;
                                AppUserPreferences.Instance.ColorThemeKind = ColorTheme.ColorThemeKind.Custom;
                                AppUserPreferences.Instance.LimeColorTheme = (Theme.ColorTheme)read[0];
                                AppUserPreferences.Instance.ColorTheme     = (ColorTheme)read[1];
                            }
                        } catch (System.Exception e) {
                            AlertDialog.Show(e.Message);
                        }
                    }
                    themeEditor.Rebuild();
                    themeChanged = true;
                }
            };
            var buttons = new Widget {
                Layout = new HBoxLayout {
                    Spacing = 4
                },
                Nodes = { loadDarkButton, loadLightButton, saveButton, loadButton }
            };

            pane.AddNode(buttons);
            pane.AddNode(themeEditor);
            return(pane);
        }