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"); }
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; } }); }
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); }
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, } })); }
public Toolbar(Widget container) { widget = new Widget(); container.Nodes.Add(widget); DecorateToolbar(widget); container.AddChangeWatcher(() => Version, _ => Rebuild()); }
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); }
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 ); })); }
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; } }
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); }
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); }
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); }
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) ); }
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(); }
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); }
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) }; }
private void CreateWatchersToRebuild() { RootWidget.AddChangeWatcher(CalcSelectedRowsHashcode, _ => Rebuild()); RootWidget.Tasks.Add(DisableInspectorTask()); }
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); }
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); }