public void ConfirmSettings() { var prevSettings = GameSettings.Default.Clone(); ApplySettings(GetNewSettings()); var popup = new SettingsApplier() { PreviousSettings = prevSettings, State = this, Text = "Do you want to keep these settings? They will be reverted after 10 seconds...", CancelText = "" }; GuiRoot.ShowModalPopup(popup); GuiRoot.RegisterForUpdate(popup); }
public void Reset() { mainPanel.Clear(); Rectangle rect = GuiRoot.RenderData.VirtualScreen; mainPanel.AddChild(new Gui.Widgets.Button { Text = "< Back", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Border = "border-button", Font = "font16", OnClick = (sender, args) => { StateManager.PopState(); }, AutoLayout = AutoLayout.FloatBottomLeft, }); var widgetList = mainPanel.AddChild(new WidgetListView() { AutoLayout = AutoLayout.DockTop, SelectedItemForegroundColor = Color.Black.ToVector4(), SelectedItemBackgroundColor = new Vector4(0, 0, 0, 0), ItemBackgroundColor2 = new Vector4(0, 0, 0, 0.1f), ItemBackgroundColor1 = new Vector4(0, 0, 0, 0), ItemHeight = 64, MinimumSize = new Point(0, 3 * GuiRoot.RenderData.VirtualScreen.Height / 4) }) as WidgetListView; var factions = World.Factions.Factions.Where(f => !f.Value.IsRaceFaction && f.Value.Race.IsIntelligent && f.Value != World.PlayerFaction).OrderBy(k => { if (k.Value.Race.Name == "Dwarf") { return(0); } var currentExpedition = World.Diplomacy.Adventures.Where(a => a.DestinationFaction == k.Key).FirstOrDefault(); if (currentExpedition != null) { return(k.Value.DistanceToCapital); } return(k.Value.DistanceToCapital + 100000.0f); }); foreach (var faction in factions) { var diplomacy = World.Diplomacy.GetPolitics(faction.Value, World.PlayerFaction); var details = diplomacy.RecentEvents.Select(e => string.Format("{0} ({1})", TextGenerator.ToSentenceCase(e.Description), e.Change > 0 ? "+" + e.Change.ToString() : e.Change.ToString())); var entry = widgetList.AddItem(new Widget() { Background = new TileReference("basic", 0), }); StringBuilder sb = new StringBuilder(); foreach (var detail in details) { sb.AppendLine(detail); } entry.Tooltip = "Recent events:\n" + sb.ToString(); if (sb.ToString() == "") { entry.Tooltip = "No recent events."; } var titlebar = entry.AddChild(new Widget() { InteriorMargin = new Margin(5, 5, 5, 5), MinimumSize = new Point(512, 36), AutoLayout = AutoLayout.DockTop, }); titlebar.AddChild(new Widget() { Background = new TileReference("map-icons", faction.Value.Race.Icon), MaximumSize = new Point(32, 32), MinimumSize = new Point(32, 32), AutoLayout = AutoLayout.DockLeft, }); titlebar.AddChild(new Widget() { Text = System.String.Format("{0} ({1}){2}", faction.Value.Name, faction.Value.Race.Name, diplomacy.WasAtWar ? " -- At war!" : ""), TextHorizontalAlign = HorizontalAlign.Right, TextVerticalAlign = VerticalAlign.Bottom, Font = "font10", AutoLayout = AutoLayout.DockLeft }); var currentAdventure = World.Diplomacy.Adventures.Where(a => a.DestinationFaction == faction.Key).FirstOrDefault(); if (currentAdventure == null && World.PlayerFaction.Minions.Count > 0) { titlebar.AddChild(new Button() { Text = "Send Expedition...", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Font = "font10", AutoLayout = AutoLayout.DockRight, OnClick = (sender, args) => { World.Tutorial("adventures"); GuiRoot.ShowModalPopup(GuiRoot.ConstructWidget(new PrepareExpeditionDialog() { Faction = World.PlayerFaction, World = World, DestinationFaction = faction.Value, Rect = GuiRoot.RenderData.VirtualScreen.Interior(128, 128, 128, 128), OnProceed = (dialog) => { GuiRoot.ShowModalPopup(GuiRoot.ConstructWidget(new SelectEmployeesDialog() { Faction = World.PlayerFaction, World = World, Rect = GuiRoot.RenderData.VirtualScreen.Interior(32, 32, 32, 32), OnProceed = (selectEmployees) => { GuiRoot.ShowModalPopup(new SelectResourcesDialog() { Rect = GuiRoot.RenderData.VirtualScreen.Interior(32, 32, 32, 32), Faction = World.PlayerFaction, OnProceed = (selectResources) => { var adventure = dialog.SelectedAdventure; adventure.Party = selectEmployees.GoingCreatures; adventure.Money = selectResources.SelectedMoney; adventure.Resources = selectResources.SelectedResources; adventure.DestinationFaction = faction.Key; adventure.OwnerFaction = World.PlayerFaction.Name; adventure.Position = World.WorldOrigin; adventure.Start = World.WorldOrigin; World.Diplomacy.Adventures.Add(adventure); World.PlayerFaction.RemoveResources(selectResources.SelectedResources, Vector3.Zero, false); World.PlayerFaction.AddMoney(-selectResources.SelectedMoney); Reset(); } }); } })); } })); } }); } else if (currentAdventure != null) { var eta = currentAdventure.GetStatusString(World); titlebar.AddChild(new TextProgressBar() { MinimumSize = new Point(128, 32), Percentage = currentAdventure.GetProgress(World), SegmentCount = 10, AutoLayout = AutoLayout.DockRight }); titlebar.AddChild(new Widget() { Text = string.Format("Expedition underway ...\n {0}", eta), TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Font = "font10", AutoLayout = AutoLayout.DockRight, }); } var relation = diplomacy.GetCurrentRelationship(); var relationshipColor = Color.Black.ToVector4(); if (relation == Relationship.Loving) { relationshipColor = GameSettings.Default.Colors.GetColor("Positive", Color.DarkGreen).ToVector4(); } else if (relation == Relationship.Hateful) { relationshipColor = GameSettings.Default.Colors.GetColor("Negative", Color.Red).ToVector4(); } entry.AddChild(new Widget() { Text = System.String.Format(" Relationship: {0}{1}", diplomacy.GetCurrentRelationship(), faction.Value.ClaimsColony ? " (Claims this territory)" : ""), TextHorizontalAlign = HorizontalAlign.Left, TextVerticalAlign = VerticalAlign.Top, Font = "font8", AutoLayout = AutoLayout.DockTop, TextColor = relationshipColor }); entry.AddChild(new Widget() { Text = System.String.Format(" GDP: {0} Size: {1} Distance to capital: {2} miles", faction.Value.TradeMoney, faction.Value.TerritorySize, (int)faction.Value.DistanceToCapital), TextHorizontalAlign = HorizontalAlign.Left, TextVerticalAlign = VerticalAlign.Top, Font = "font8", AutoLayout = AutoLayout.DockTop }); } mainPanel.Layout(); }
public override void OnEnter() { // Clear the input queue... cause other states aren't using it and it's been filling up. DwarfGame.GumInputMapper.GetInputQueue(); GuiRoot = new Gui.Root(DwarfGame.GuiSkin); GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0); Rectangle rect = GuiRoot.RenderData.VirtualScreen; rect.Inflate(-rect.Width / 3, -rect.Height / 3); var mainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget { Rect = rect, MinimumSize = new Point(512, 256), AutoLayout = AutoLayout.FloatCenter, Border = "border-fancy", Padding = new Margin(4, 4, 4, 4), InteriorMargin = new Margin(2, 0, 0, 0), TextSize = 1, Font = "font10" }); mainPanel.AddChild(new Gui.Widgets.Button { Text = "Create!", Font = "font16", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Border = "border-button", OnClick = (sender, args) => { // Grab string values from widgets! CompanyInformation.Name = NameField.Text; CompanyInformation.Motto = MottoField.Text; // Why are they stored as statics on this class??? StateManager.PushState(new NewGameChooseWorldState(Game, Game.StateManager)); }, AutoLayout = AutoLayout.FloatBottomRight }); mainPanel.AddChild(new Gui.Widgets.Button { Text = "< Back", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Border = "border-button", Font = "font16", OnClick = (sender, args) => { StateManager.PopState(); }, AutoLayout = AutoLayout.FloatBottomLeft, }); #region Name mainPanel.AddChild(new Widget() { Text = "Create a Company", Font = "font16", AutoLayout = AutoLayout.DockTop, }); var nameRow = mainPanel.AddChild(new Widget { MinimumSize = new Point(0, 24), AutoLayout = AutoLayout.DockTop, Padding = new Margin(0, 0, 2, 2) }); nameRow.AddChild(new Gui.Widget { MinimumSize = new Point(64, 0), Text = "Name", AutoLayout = AutoLayout.DockLeft, TextHorizontalAlign = HorizontalAlign.Right, TextVerticalAlign = VerticalAlign.Center }); nameRow.AddChild(new Gui.Widgets.Button { Text = "Randomize", AutoLayout = AutoLayout.DockRight, Border = "border-button", OnClick = (sender, args) => { var templates = TextGenerator.GetAtoms(ContentPaths.Text.Templates.company_exploration); NameField.Text = TextGenerator.GenerateRandom(Datastructures.SelectRandom(templates).ToArray()); } }); NameField = nameRow.AddChild(new EditableTextField { Text = CompanyInformation.Name, AutoLayout = AutoLayout.DockFill }) as EditableTextField; #endregion #region Motto var mottoRow = mainPanel.AddChild(new Widget { MinimumSize = new Point(0, 24), AutoLayout = AutoLayout.DockTop, Padding = new Margin(0, 0, 2, 2) }); mottoRow.AddChild(new Widget { MinimumSize = new Point(64, 0), Text = "Motto", AutoLayout = AutoLayout.DockLeft, TextHorizontalAlign = HorizontalAlign.Right, TextVerticalAlign = VerticalAlign.Center }); mottoRow.AddChild(new Button { Text = "Randomize", AutoLayout = AutoLayout.DockRight, Border = "border-button", OnClick = (sender, args) => { var templates = TextGenerator.GetAtoms(ContentPaths.Text.Templates.mottos); MottoField.Text = TextGenerator.GenerateRandom(Datastructures.SelectRandom(templates).ToArray()); // Todo: Doesn't automatically invalidate when text changed?? MottoField.Invalidate(); } }); MottoField = mottoRow.AddChild(new EditableTextField { Text = CompanyInformation.Motto, AutoLayout = AutoLayout.DockFill }) as EditableTextField; #endregion #region Logo var logoRow = mainPanel.AddChild(new Widget { MinimumSize = new Point(0, 64), AutoLayout = AutoLayout.DockTop, Padding = new Margin(0, 0, 2, 2) }); CompanyLogoDisplay = logoRow.AddChild(new Gui.Widgets.CompanyLogo { AutoLayout = AutoLayout.DockLeft, MinimumSize = new Point(64, 64), MaximumSize = new Point(64, 64), CompanyInformation = CompanyInformation }) as Gui.Widgets.CompanyLogo; logoRow.AddChild(new Widget { Text = "BG:", AutoLayout = AutoLayout.DockLeft }); logoRow.AddChild(new Widget { Background = CompanyInformation.LogoBackground, MinimumSize = new Point(32, 32), MaximumSize = new Point(32, 32), AutoLayout = AutoLayout.DockLeft, OnClick = (sender, args) => { var source = GuiRoot.GetTileSheet("company-logo-background") as Gui.TileSheet; var chooser = new Gui.Widgets.GridChooser { ItemSource = Enumerable.Range(0, source.Columns * source.Rows) .Select(i => new Widget { Background = new TileReference("company-logo-background", i) }), OnClose = (s2) => { var gc = s2 as Gui.Widgets.GridChooser; if (gc.DialogResult == Gui.Widgets.GridChooser.Result.OKAY && gc.SelectedItem != null) { sender.Background = gc.SelectedItem.Background; sender.Invalidate(); CompanyInformation.LogoBackground = gc.SelectedItem.Background; CompanyLogoDisplay.Invalidate(); } }, PopupDestructionType = PopupDestructionType.DestroyOnOffClick }; GuiRoot.ShowModalPopup(chooser); } }); logoRow.AddChild(new Widget { Background = new TileReference("basic", 1), BackgroundColor = CompanyInformation.LogoBackgroundColor, MinimumSize = new Point(32, 32), MaximumSize = new Point(32, 32), AutoLayout = AutoLayout.DockLeft, OnClick = (sender, args) => { var chooser = new Gui.Widgets.GridChooser { ItemSize = new Point(16, 16), ItemSpacing = new Point(4, 4), ItemSource = EnumerateDefaultColors() .Select(c => new Widget { Background = new TileReference("basic", 1), BackgroundColor = new Vector4(c.ToVector3(), 1), }), OnClose = (s2) => { var gc = s2 as Gui.Widgets.GridChooser; if (gc.DialogResult == Gui.Widgets.GridChooser.Result.OKAY && gc.SelectedItem != null) { sender.BackgroundColor = gc.SelectedItem.BackgroundColor; sender.Invalidate(); CompanyInformation.LogoBackgroundColor = gc.SelectedItem.BackgroundColor; CompanyLogoDisplay.Invalidate(); } }, PopupDestructionType = PopupDestructionType.DestroyOnOffClick }; GuiRoot.ShowModalPopup(chooser); } }); logoRow.AddChild(new Widget { Text = "FG:", AutoLayout = AutoLayout.DockLeft }); logoRow.AddChild(new Widget { Background = CompanyInformation.LogoSymbol, MinimumSize = new Point(32, 32), MaximumSize = new Point(32, 32), AutoLayout = AutoLayout.DockLeft, OnClick = (sender, args) => { var source = GuiRoot.GetTileSheet("company-logo-symbol") as Gui.TileSheet; var chooser = new Gui.Widgets.GridChooser { ItemSource = Enumerable.Range(0, source.Columns * source.Rows) .Select(i => new Widget { Background = new TileReference("company-logo-symbol", i) }), OnClose = (s2) => { var gc = s2 as Gui.Widgets.GridChooser; if (gc.DialogResult == Gui.Widgets.GridChooser.Result.OKAY && gc.SelectedItem != null) { sender.Background = gc.SelectedItem.Background; sender.Invalidate(); CompanyInformation.LogoSymbol = gc.SelectedItem.Background; CompanyLogoDisplay.Invalidate(); } }, PopupDestructionType = PopupDestructionType.DestroyOnOffClick }; GuiRoot.ShowModalPopup(chooser); } }); logoRow.AddChild(new Widget { Background = new TileReference("basic", 1), BackgroundColor = CompanyInformation.LogoSymbolColor, MinimumSize = new Point(32, 32), MaximumSize = new Point(32, 32), AutoLayout = AutoLayout.DockLeft, OnClick = (sender, args) => { var chooser = new Gui.Widgets.GridChooser { ItemSize = new Point(16, 16), ItemSpacing = new Point(4, 4), ItemSource = EnumerateDefaultColors() .Select(c => new Widget { Background = new TileReference("basic", 1), BackgroundColor = new Vector4(c.ToVector3(), 1), }), OnClose = (s2) => { var gc = s2 as Gui.Widgets.GridChooser; if (gc.DialogResult == Gui.Widgets.GridChooser.Result.OKAY && gc.SelectedItem != null) { sender.BackgroundColor = gc.SelectedItem.BackgroundColor; sender.Invalidate(); CompanyInformation.LogoSymbolColor = gc.SelectedItem.BackgroundColor; CompanyLogoDisplay.Invalidate(); } }, PopupDestructionType = PopupDestructionType.DestroyOnOffClick }; GuiRoot.ShowModalPopup(chooser); } }); #endregion GuiRoot.RootItem.Layout(); IsInitialized = true; base.OnEnter(); }
public override void OnEnter() { // Clear the input queue... cause other states aren't using it and it's been filling up. DwarfGame.GumInputMapper.GetInputQueue(); GuiRoot = new Gui.Root(DwarfGame.GuiSkin); GuiRoot.MousePointer = new MousePointer("mouse", 15.0f, 16, 17, 18, 19, 20, 21, 22, 23); var mainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget { Rect = GuiRoot.RenderData.VirtualScreen, Border = "border-fancy", Text = Settings.Name, Font = "font16", TextColor = new Vector4(0, 0, 0, 1), Padding = new Gui.Margin(4, 4, 4, 4), InteriorMargin = new Gui.Margin(24, 0, 0, 0), }); var rightPanel = mainPanel.AddChild(new Gui.Widget { AutoLayout = Gui.AutoLayout.DockRight, MinimumSize = new Point(256, 0), Padding = new Gui.Margin(2, 2, 2, 2) }); rightPanel.AddChild(new Gui.Widget { Text = "Regenerate", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { Settings = new WorldGenerationSettings(); RestartGeneration(); } }); rightPanel.AddChild(new Gui.Widget { Text = "Save World", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { if (Generator.CurrentState != WorldGenerator.GenerationState.Finished) { GuiRoot.ShowTooltip(GuiRoot.MousePosition, "Generator is not finished."); } else { System.IO.DirectoryInfo worldDirectory = System.IO.Directory.CreateDirectory(DwarfGame.GetWorldDirectory() + System.IO.Path.DirectorySeparatorChar + Settings.Name); NewOverworldFile file = new NewOverworldFile(Game.GraphicsDevice, Overworld.Map, Settings.Name, Settings.SeaLevel); file.WriteFile(worldDirectory.FullName); file.SaveScreenshot(worldDirectory.FullName + System.IO.Path.DirectorySeparatorChar + "screenshot.png"); GuiRoot.ShowModalPopup(GuiRoot.ConstructWidget(new Gui.Widgets.Popup { Text = "File saved." })); } } }); rightPanel.AddChild(new Gui.Widget { Text = "Advanced", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { var advancedSettingsEditor = GuiRoot.ConstructWidget(new Gui.Widgets.WorldGenerationSettingsDialog { Settings = Settings, OnClose = (s) => { if ((s as Gui.Widgets.WorldGenerationSettingsDialog).Result == Gui.Widgets.WorldGenerationSettingsDialog.DialogResult.Okay) { RestartGeneration(); } } }); GuiRoot.ShowModalPopup(advancedSettingsEditor); } }); rightPanel.AddChild(new Gui.Widget { Text = "Back", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { Generator.Abort(); StateManager.PopState(); } }); StartButton = rightPanel.AddChild(new Gui.Widget { Text = "Start Game", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockBottom, OnClick = (sender, args) => { if (Generator.CurrentState != WorldGenerator.GenerationState.Finished) { GuiRoot.ShowTooltip(GuiRoot.MousePosition, "World generation is not finished."); } else { Overworld.Name = Settings.Name; Settings.ExistingFile = null; Settings.WorldOrigin = Settings.WorldGenerationOrigin; Settings.SpawnRect = Generator.GetSpawnRectangle(); if (Settings.Natives == null || Settings.Natives.Count == 0) { Settings.Natives = Generator.NativeCivilizations; } //Settings.StartUnderground = StartUnderground.CheckState; //Settings.RevealSurface = RevealSurface.CheckState; foreach (var faction in Settings.Natives) { Vector2 center = new Vector2(faction.Center.X, faction.Center.Y); Vector2 spawn = new Vector2(Generator.GetSpawnRectangle().Center.X, Generator.GetSpawnRectangle().Center.Y); faction.DistanceToCapital = (center - spawn).Length(); faction.ClaimsColony = false; } foreach (var faction in Generator.GetFactionsInSpawn()) { faction.ClaimsColony = true; } StateManager.ClearState(); StateManager.PushState(new LoadState(Game, StateManager, Settings)); } } }); rightPanel.AddChild(new Gui.Widget { Text = "Territory size", AutoLayout = Gui.AutoLayout.DockTop, Font = "font8", TextColor = new Vector4(0, 0, 0, 1), }); var colonySizeCombo = rightPanel.AddChild(new Gui.Widgets.ComboBox { AutoLayout = Gui.AutoLayout.DockTop, Items = new List <string>(new string[] { "Small", "Medium", "Large" }), Font = "font8", TextColor = new Vector4(0, 0, 0, 1), OnSelectedIndexChanged = (sender) => { switch ((sender as Gui.Widgets.ComboBox).SelectedItem) { case "Small": Settings.ColonySize = new Point3(4, 1, 4); break; case "Medium": Settings.ColonySize = new Point3(8, 1, 8); break; case "Large": Settings.ColonySize = new Point3(10, 1, 10); break; } var worldSize = Settings.ColonySize.ToVector3() * VoxelConstants.ChunkSizeX / Settings.WorldScale; float w = worldSize.X; float h = worldSize.Z; float clickX = System.Math.Max(System.Math.Min(Settings.WorldGenerationOrigin.X, Settings.Width - w), 0); float clickY = System.Math.Max(System.Math.Min(Settings.WorldGenerationOrigin.Y, Settings.Height - h), 0); Settings.WorldGenerationOrigin = new Vector2((int)(clickX), (int)(clickY)); } }) as Gui.Widgets.ComboBox; rightPanel.AddChild(new Gui.Widget { Text = "Difficulty", AutoLayout = Gui.AutoLayout.DockTop, Font = "font8", TextColor = new Vector4(0, 0, 0, 1) }); var difficultySelectorCombo = rightPanel.AddChild(new Gui.Widgets.ComboBox { AutoLayout = Gui.AutoLayout.DockTop, Items = EmbarkmentLibrary.Embarkments.Select(e => e.Key).ToList(), TextColor = new Vector4(0, 0, 0, 1), Font = "font8", OnSelectedIndexChanged = (sender) => { Settings.InitalEmbarkment = EmbarkmentLibrary.Embarkments[(sender as Gui.Widgets.ComboBox).SelectedItem]; } }) as Gui.Widgets.ComboBox; /* * StartUnderground = rightPanel.AddChild(new Gui.Widgets.CheckBox * { * AutoLayout = Gui.AutoLayout.DockTop, * Font = "font8", * Text = "@world-generation-start-underground" * }) as Gui.Widgets.CheckBox; * * RevealSurface = rightPanel.AddChild(new Gui.Widgets.CheckBox * { * AutoLayout = Gui.AutoLayout.DockTop, * Font = "font8", * Text = "@world-generation-reveal-surface", * CheckState = true * }) as Gui.Widgets.CheckBox; */ rightPanel.AddChild(new Gui.Widget { Text = "Cave Layers", AutoLayout = Gui.AutoLayout.DockTop, Font = "font8", TextColor = new Vector4(0, 0, 0, 1), }); var layerSetting = rightPanel.AddChild(new Gui.Widgets.ComboBox { AutoLayout = AutoLayout.DockTop, Items = new List <string>(new string[] { "Barely any", "Few", "Normal", "Lots", "Way too many" }), Font = "font8", TextColor = new Vector4(0, 0, 0, 1), OnSelectedIndexChanged = (sender) => { switch ((sender as Gui.Widgets.ComboBox).SelectedItem) { case "Barely any": Settings.NumCaveLayers = 2; break; case "Few": Settings.NumCaveLayers = 3; break; case "Normal": Settings.NumCaveLayers = 4; break; case "Lots": Settings.NumCaveLayers = 6; break; case "Way too many": Settings.NumCaveLayers = 9; break; } } }) as Gui.Widgets.ComboBox; ZoomedPreview = rightPanel.AddChild(new Gui.Widget { AutoLayout = Gui.AutoLayout.DockBottom, OnLayout = (sender) => { var space = System.Math.Min( layerSetting.Rect.Width, StartButton.Rect.Top - layerSetting.Rect.Bottom - 4); sender.Rect.Height = space; sender.Rect.Width = space; sender.Rect.Y = layerSetting.Rect.Bottom + 2; sender.Rect.X = layerSetting.Rect.X + ((layerSetting.Rect.Width - space) / 2); } }); GenerationProgress = mainPanel.AddChild(new Gui.Widgets.ProgressBar { AutoLayout = Gui.AutoLayout.DockBottom, TextHorizontalAlign = Gui.HorizontalAlign.Center, TextVerticalAlign = Gui.VerticalAlign.Center, Font = "font10", TextColor = new Vector4(1, 1, 1, 1) }) as Gui.Widgets.ProgressBar; Preview = mainPanel.AddChild(new WorldGeneratorPreview(Game.GraphicsDevice) { Border = "border-thin", AutoLayout = Gui.AutoLayout.DockFill }) as WorldGeneratorPreview; GuiRoot.RootItem.Layout(); difficultySelectorCombo.SelectedIndex = difficultySelectorCombo.Items.IndexOf("Normal"); colonySizeCombo.SelectedIndex = colonySizeCombo.Items.IndexOf("Medium"); layerSetting.SelectedIndex = layerSetting.Items.IndexOf("Normal"); IsInitialized = true; if (AutoGenerate) { RestartGeneration(); } else // Setup a dummy generator for now. { Generator = new WorldGenerator(Settings); Generator.LoadDummy( new Color[Overworld.Map.GetLength(0) * Overworld.Map.GetLength(1)], Game.GraphicsDevice); Preview.SetGenerator(Generator); } base.OnEnter(); }
public override void Update(DwarfTime gameTime) { if (DoneLoading) { // Todo: Decouple gui/input from world. // Copy important bits to PlayState - This is a hack; decouple world from gui and input instead. PlayState.Input = Input; StateManager.PopState(false); StateManager.PushState(new PlayState(Game, StateManager, World)); World.OnSetLoadingMessage = null; Overworld.NativeFactions = World.Natives; } else { if (Settings.GenerateFromScratch && Generator.CurrentState == WorldGenerator.GenerationState.Finished && World == null) { Settings = Generator.Settings; CreateWorld(); } else if (Settings.GenerateFromScratch) { if (!LoadTicker.HasMesssage(Generator.LoadingMessage)) { LoadTicker.AddMessage(Generator.LoadingMessage); } } foreach (var item in DwarfGame.GumInputMapper.GetInputQueue()) { GuiRoot.HandleInput(item.Message, item.Args); if (item.Message == Gui.InputEvents.KeyPress) { Runner.Jump(); } } GuiRoot.Update(gameTime.ToRealTime()); Runner.Update(gameTime); if (World != null && World.LoadStatus == WorldManager.LoadingStatus.Failure && !DisplayException) { DisplayException = true; string exceptionText = World.LoadingException == null ? "Unknown exception." : World.LoadingException.ToString(); GuiRoot.MouseVisible = true; GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0); DwarfTime.LastTime.IsPaused = false; DwarfTime.LastTime.Speed = 1.0f; World = null; GuiRoot.ShowModalPopup(new Gui.Widgets.Confirm() { CancelText = "", Text = "Oh no! Loading failed :( This crash has been automatically reported to Completely Fair Games: " + exceptionText, OnClick = (s, a) => { StateManager.PopState(); StateManager.ClearState(); StateManager.PushState(new MainMenuState(Game, StateManager)); }, OnClose = (s) => { StateManager.PopState(); StateManager.ClearState(); StateManager.PushState(new MainMenuState(Game, StateManager)); }, Rect = GuiRoot.RenderData.VirtualScreen }); } } base.Update(gameTime); }
public override void Update(DwarfTime gameTime) { foreach (var @event in DwarfGame.GumInputMapper.GetInputQueue()) { GuiRoot.HandleInput(@event.Message, @event.Args); if ([email protected]) { // Pass event to game... } } if (NeedsRefresh) { NeedsRefresh = false; Grid.ClearItems(); int i = 0; foreach (var item in Items) { var itemWidget = new ChooserWidget { Item = item, Background = new TileReference("basic", 0), BackgroundColor = i % 2 == 0 ? new Vector4(0, 0, 0, 0.1f) : new Vector4(0, 0, 0, 0.2f) }; Grid.AddItem(itemWidget); itemWidget.DeleteButton.OnClick = (sender, args) => { var confirm = GuiRoot.ConstructWidget(new Gui.Widgets.Confirm { OkayText = "Delete", CancelText = "Keep", Text = "Are you sure you want to delete this?", OnClose = (s) => { if ((s as Gui.Widgets.Confirm).DialogResult == Gui.Widgets.Confirm.Result.OKAY) { var selectedItem = itemWidget.Item; Items.Remove(selectedItem); try { global::System.IO.Directory.Delete(selectedItem.Path, true); } catch (Exception e) { GuiRoot.ShowModalPopup(new Gui.Widgets.Confirm() { OkayText = "Ok", CancelText = "", Text = e.Message }); } NeedsRefresh = true; } } }); GuiRoot.ShowModalPopup(confirm); }; if (itemWidget.LoadButton != null) { itemWidget.LoadButton.OnClick = (sender, args) => { if (String.IsNullOrEmpty(itemWidget.Item.Valid) && OnProceedClicked != null) { OnProceedClicked(itemWidget.Item.Path); } } } ; i++; } Grid.OnSelectedIndexChanged = (widget) => { this.ItemSelected = Grid.SelectedIndex; NeedsRefresh = true; }; if (Grid.SelectedIndex > Items.Count - 1 || Grid.SelectedIndex < 0) { Grid.SelectedIndex = 0; } ItemSelected = Grid.SelectedIndex; if (Items.Count > 0) { DateTime directoryTime; try { directoryTime = global::System.IO.File.GetLastWriteTime(Items[ItemSelected].Path + System.IO.Path.DirectorySeparatorChar + "meta.txt"); } catch (Exception) { directoryTime = DateTime.MinValue; } BottomBar.Text = Items[ItemSelected].Path; if (!String.IsNullOrEmpty(Items[ItemSelected].Valid)) { BottomBar.Text += "\n" + Items[ItemSelected].Valid; } else { BottomBar.Text += "\n" + directoryTime.ToShortDateString() + " " + directoryTime.ToShortTimeString(); } } else { BottomBar.Text = NoItemsText; } } GuiRoot.Update(gameTime.ToRealTime()); base.Update(gameTime); }
public override void OnEnter() { DwarfGame.GumInputMapper.GetInputQueue(); GuiRoot = new Gui.Root(DwarfGame.GuiSkin); GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0); var screen = GuiRoot.RenderData.VirtualScreen; float scale = 0.9f; float newWidth = System.Math.Min(System.Math.Max(screen.Width * scale, 640), screen.Width * scale); float newHeight = System.Math.Min(System.Math.Max(screen.Height * scale, 480), screen.Height * scale); Rectangle rect = new Rectangle((int)(screen.Width / 2 - newWidth / 2), (int)(screen.Height / 2 - newHeight / 2), (int)newWidth, (int)newHeight); var main = GuiRoot.RootItem.AddChild(new Gui.Widget { Rect = rect }); var bottom = main.AddChild(new Widget { Transparent = true, MinimumSize = new Point(0, 32), AutoLayout = AutoLayout.DockBottom, Padding = new Margin(2, 2, 2, 2) }); bottom.AddChild(new Gui.Widgets.Button { Text = "Close", Font = "font16", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Border = "border-button", OnClick = (sender, args) => { // If changes, prompt before closing. if (HasChanges) { var confirm = new Popup { Text = "Dwarf Corp must be restarted for changes to take effect.", OkayText = "Okay", OnClose = (s2) => StateManager.PopState() }; GuiRoot.ShowModalPopup(confirm); } else { StateManager.PopState(); } }, AutoLayout = AutoLayout.DockRight }); var tabs = main.AddChild(new Gui.Widgets.TabPanel { AutoLayout = AutoLayout.DockFill, TextSize = 1, SelectedTabColor = new Vector4(1, 0, 0, 1) }) as Gui.Widgets.TabPanel; tabs.AddTab("Installed", new InstalledModsWidget { OwnerState = this }); tabs.AddTab("Search", new SearchWidget { Owner = this }); GuiRoot.RootItem.Layout(); IsInitialized = true; base.OnEnter(); }
private void RebuildGui() { BuildingGUI = true; // Create and initialize GUI framework. GuiRoot = new Gui.Root(DwarfGame.GumSkin); GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0); var screen = GuiRoot.RenderData.VirtualScreen; float scale = 0.75f; float newWidth = System.Math.Min(System.Math.Max(screen.Width * scale, 640), screen.Width * scale); float newHeight = System.Math.Min(System.Math.Max(screen.Height * scale, 480), screen.Height * scale); Rectangle rect = new Rectangle((int)(screen.Width / 2 - newWidth / 2), (int)(screen.Height / 2 - newHeight / 2), (int)newWidth, (int)newHeight); // CONSTRUCT GUI HERE... MainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget { Rect = rect, Padding = new Margin(4, 4, 4, 4), Transparent = true, MinimumSize = new Point(640, 480), Font = "font10" }); MainPanel.AddChild(new Gui.Widgets.Button { Text = "Close", Font = "font16", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Border = "border-button", OnClick = (sender, args) => { // If changes, prompt before closing. if (HasChanges) { var confirm = new Gui.Widgets.Confirm { Text = "Apply changes?", OkayText = "Yes", CancelText = "No", OnClose = (s2) => { if ((s2 as Gui.Widgets.Confirm).DialogResult == Gui.Widgets.Confirm.Result.OKAY) { ConfirmSettings(); } if (OnClosed != null) { OnClosed(); } StateManager.PopState(); } }; GuiRoot.ShowModalPopup(confirm); } else { if (OnClosed != null) { OnClosed(); } StateManager.PopState(); } }, AutoLayout = AutoLayout.FloatBottomRight }); MainPanel.AddChild(new Gui.Widgets.Button { Text = "Apply", Font = "font16", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, Border = "border-button", OnClick = (sender, args) => { ConfirmSettings(); }, AutoLayout = AutoLayout.FloatBottomRight, OnLayout = s => s.Rect.X -= 128 // Hack to keep it from floating over the other button. }); TabPanel = MainPanel.AddChild(new Gui.Widgets.TabPanel { AutoLayout = AutoLayout.DockFill, TextSize = 1, SelectedTabColor = new Vector4(1, 0, 0, 1), OnLayout = (sender) => sender.Rect.Height -= 36 // Keep it from overlapping bottom buttons. }) as Gui.Widgets.TabPanel; CreateGameplayTab(); CreateAudioTab(); CreateKeysTab(); CreateGraphicsTab(); TabPanel.SelectedTab = 0; GuiRoot.RootItem.Layout(); LoadSettings(); BuildingGUI = false; }
public override void Update(DwarfTime gameTime) { if (DoneLoading) { // Todo: Decouple gui/input from world. // Copy important bits to PlayState - This is a hack; decouple world from gui and input instead. PlayState.Input = Input; GameStateManager.PopState(false); GameStateManager.PushState(new PlayState(Game, World)); World.OnSetLoadingMessage = null; } else { if (LoadType == LoadTypes.GenerateOverworld) { if (Generator.CurrentState == OverworldGenerator.GenerationState.Finished && World == null) { // World generation is finished! LoadTicker.AddMessage("Checking spawn position..."); while (InitialCell.Bounds.Width == 8 && InitialCell.Bounds.Height == 8 && !IsGoodSpawn()) { LoadTicker.AddMessage("Selecting new spawn..."); InitialCell = Settings.ColonyCells.EnumerateCells().Where(c => c.Bounds.Width == 8 && c.Bounds.Height == 8).SelectRandom(); } CreateWorld(); } else { if (!LoadTicker.HasMesssage(Generator.LoadingMessage)) { LoadTicker.AddMessage(Generator.LoadingMessage); } } } foreach (var item in DwarfGame.GumInputMapper.GetInputQueue()) { GuiRoot.HandleInput(item.Message, item.Args); if (item.Message == Gui.InputEvents.KeyPress) { Runner.Jump(); } } GuiRoot.Update(gameTime.ToRealTime()); Runner.Update(gameTime); if (World != null && World.LoadStatus == WorldManager.LoadingStatus.Failure && !DisplayException) { DisplayException = true; string exceptionText = World.LoadingException == null ? "Unknown exception." : World.LoadingException.ToString(); GuiRoot.MouseVisible = true; GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0); DwarfTime.LastTime.IsPaused = false; DwarfTime.LastTime.Speed = 1.0f; World = null; DwarfGame.LogSentryBreadcrumb("Loading", "Loading failed.", SharpRaven.Data.BreadcrumbLevel.Error); GuiRoot.ShowModalPopup(new Gui.Widgets.Confirm() { CancelText = "", Text = "Oh no! Loading failed :( This crash has been automatically reported to the developers: " + exceptionText, OnClick = (s, a) => { DwarfGame.LogSentryBreadcrumb("Loading", "Loading failed. Player going back to start."); GameStateManager.ClearState(); }, OnClose = (s) => { DwarfGame.LogSentryBreadcrumb("Loading", "Loading failed. Player going back to start."); GameStateManager.ClearState(); }, Rect = GuiRoot.RenderData.VirtualScreen }); } } base.Update(gameTime); }
public override void OnEnter() { // Clear the input queue... cause other states aren't using it and it's been filling up. DwarfGame.GumInputMapper.GetInputQueue(); GuiRoot = new Gui.Root(DwarfGame.GumSkin); GuiRoot.MousePointer = new MousePointer("mouse", 15.0f, 16, 17, 18, 19, 20, 21, 22, 23); var mainPanel = GuiRoot.RootItem.AddChild(new Gui.Widget { Rect = GuiRoot.RenderData.VirtualScreen, Border = "border-fancy", Text = Settings.Name, Font = "font16", TextColor = new Vector4(0, 0, 0, 1), Padding = new Gui.Margin(4, 4, 4, 4), InteriorMargin = new Gui.Margin(24, 0, 0, 0), }); var rightPanel = mainPanel.AddChild(new Gui.Widget { AutoLayout = Gui.AutoLayout.DockRight, MinimumSize = new Point(256, 0), Padding = new Gui.Margin(2, 2, 2, 2) }); rightPanel.AddChild(new Gui.Widget { Text = "Regenerate", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { Settings = new WorldGenerationSettings(); RestartGeneration(); } }); rightPanel.AddChild(new Gui.Widget { Text = "Save World", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { if (Generator.CurrentState != WorldGenerator.GenerationState.Finished) { GuiRoot.ShowTooltip(GuiRoot.MousePosition, "Generator is not finished."); } else { System.IO.DirectoryInfo worldDirectory = System.IO.Directory.CreateDirectory(DwarfGame.GetWorldDirectory() + ProgramData.DirChar + Settings.Name); NewOverworldFile file = new NewOverworldFile(Game.GraphicsDevice, Overworld.Map, Settings.Name, Settings.SeaLevel); file.WriteFile(worldDirectory.FullName); file.SaveScreenshot(worldDirectory.FullName + ProgramData.DirChar + "screenshot.png"); GuiRoot.ShowModalPopup(GuiRoot.ConstructWidget(new Gui.Widgets.Popup { Text = "File saved." })); } } }); rightPanel.AddChild(new Gui.Widget { Text = "Advanced", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { var advancedSettingsEditor = GuiRoot.ConstructWidget(new Gui.Widgets.WorldGenerationSettingsDialog { Settings = Settings, OnClose = (s) => RestartGeneration() }); GuiRoot.ShowModalPopup(advancedSettingsEditor); } }); rightPanel.AddChild(new Gui.Widget { Text = "Back", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockTop, OnClick = (sender, args) => { Generator.Abort(); StateManager.PopState(); } }); StartButton = rightPanel.AddChild(new Gui.Widget { Text = "Start Game", Border = "border-button", ChangeColorOnHover = true, TextColor = new Vector4(0, 0, 0, 1), Font = "font16", AutoLayout = Gui.AutoLayout.DockBottom, OnClick = (sender, args) => { if (Generator.CurrentState != WorldGenerator.GenerationState.Finished) { GuiRoot.ShowTooltip(GuiRoot.MousePosition, "World generation is not finished."); } else { Overworld.Name = Settings.Name; Settings.ExistingFile = null; Settings.WorldOrigin = Settings.WorldGenerationOrigin; if (Settings.Natives == null || Settings.Natives.Count == 0) { Settings.Natives = Generator.NativeCivilizations; } StateManager.ClearState(); StateManager.PushState(new LoadState(Game, StateManager, Settings)); } } }); rightPanel.AddChild(new Gui.Widget { Text = "Colony size", AutoLayout = Gui.AutoLayout.DockTop, Font = "font8", TextColor = new Vector4(0, 0, 0, 1) }); var colonySizeCombo = rightPanel.AddChild(new Gui.Widgets.ComboBox { AutoLayout = Gui.AutoLayout.DockTop, Items = new List <string>(new string[] { "Small", "Medium", "Large" }), Font = "font8", TextColor = new Vector4(0, 0, 0, 1), OnSelectedIndexChanged = (sender) => { switch ((sender as Gui.Widgets.ComboBox).SelectedItem) { case "Small": Settings.ColonySize = new Point3(4, 1, 4); break; case "Medium": Settings.ColonySize = new Point3(8, 1, 8); break; case "Large": Settings.ColonySize = new Point3(10, 1, 10); break; } var worldSize = Settings.ColonySize.ToVector3() * VoxelConstants.ChunkSizeX / Settings.WorldScale; float w = worldSize.X / 2; float h = worldSize.Z / 2; float clickX = System.Math.Max(System.Math.Min(Settings.WorldGenerationOrigin.X, Settings.Width - w), w); float clickY = System.Math.Max(System.Math.Min(Settings.WorldGenerationOrigin.Y, Settings.Height - h), h); Settings.WorldGenerationOrigin = new Vector2((int)(clickX), (int)(clickY)); } }) as Gui.Widgets.ComboBox; rightPanel.AddChild(new Gui.Widget { Text = "Difficulty", AutoLayout = Gui.AutoLayout.DockTop, Font = "font8", TextColor = new Vector4(0, 0, 0, 1) }); var difficultySelectorCombo = rightPanel.AddChild(new Gui.Widgets.ComboBox { AutoLayout = Gui.AutoLayout.DockTop, Items = Embarkment.EmbarkmentLibrary.Select(e => e.Key).ToList(), TextColor = new Vector4(0, 0, 0, 1), Font = "font8", OnSelectedIndexChanged = (sender) => { Settings.InitalEmbarkment = Embarkment.EmbarkmentLibrary[(sender as Gui.Widgets.ComboBox).SelectedItem]; } }) as Gui.Widgets.ComboBox; ZoomedPreview = rightPanel.AddChild(new Gui.Widget { AutoLayout = Gui.AutoLayout.DockBottom, OnLayout = (sender) => { var space = System.Math.Min( difficultySelectorCombo.Rect.Width, StartButton.Rect.Top - difficultySelectorCombo.Rect.Bottom - 4); sender.Rect.Height = space; sender.Rect.Width = space; sender.Rect.Y = difficultySelectorCombo.Rect.Bottom + 2; sender.Rect.X = difficultySelectorCombo.Rect.X + ((difficultySelectorCombo.Rect.Width - space) / 2); } }); StatsLabel = rightPanel.AddChild(new Gui.Widget() { AutoLayout = Gui.AutoLayout.DockBottom, Font = "font8", TextColor = new Vector4(1, 1, 1, 1), Background = new TileReference("sbasic", 0), BackgroundColor = new Vector4(0.0f, 0.0f, 0.0f, 0.2f), TextHorizontalAlign = HorizontalAlign.Left, MinimumSize = new Point(128, 64), WrapText = true, Padding = new Margin(10, 10, 10, 0) }); GenerationProgress = mainPanel.AddChild(new Gui.Widgets.ProgressBar { AutoLayout = Gui.AutoLayout.DockBottom, TextHorizontalAlign = Gui.HorizontalAlign.Center, TextVerticalAlign = Gui.VerticalAlign.Center, Font = "font10", TextColor = new Vector4(1, 1, 1, 1) }) as Gui.Widgets.ProgressBar; Preview = mainPanel.AddChild(new WorldGeneratorPreview(Game.GraphicsDevice) { Border = "border-thin", AutoLayout = Gui.AutoLayout.DockFill }) as WorldGeneratorPreview; GuiRoot.RootItem.Layout(); Preview.PreviewPanel.OnClick += (widget, args) => { StatsLabel.Text = Generator.GetSpawnStats(); StatsLabel.Invalidate(); }; difficultySelectorCombo.SelectedIndex = difficultySelectorCombo.Items.IndexOf("Normal"); colonySizeCombo.SelectedIndex = colonySizeCombo.Items.IndexOf("Medium"); IsInitialized = true; if (AutoGenerate) { RestartGeneration(); } else // Setup a dummy generator for now. { Generator = new WorldGenerator(Settings); Generator.LoadDummy( new Color[Overworld.Map.GetLength(0) * Overworld.Map.GetLength(1)], Game.GraphicsDevice); Preview.SetGenerator(Generator); } base.OnEnter(); }
public override void OnEnter() { if (ItemSource != null) { foreach (var path in ItemSource()) { Items.Add(new ChooserItem { Path = path, Valid = ValidateItem == null ? true : ValidateItem(path) }); } } // Clear the input queue... cause other states aren't using it and it's been filling up. DwarfGame.GumInputMapper.GetInputQueue(); GuiRoot = new Gui.Root(DwarfGame.GumSkin); GuiRoot.MousePointer = new Gui.MousePointer("mouse", 4, 0); GuiRoot.RootItem.Transparent = false; GuiRoot.RootItem.Background = new Gui.TileReference("basic", 0); GuiRoot.RootItem.InteriorMargin = new Gui.Margin(16, 16, 16, 16); // CONSTRUCT GUI HERE... BottomBar = GuiRoot.RootItem.AddChild(new Gui.Widget { AutoLayout = Gui.AutoLayout.DockBottom, MinimumSize = new Point(0, 60), TextHorizontalAlign = Gui.HorizontalAlign.Center, Font = "font10" }); if (Items.Count == 0) { BottomBar.Text = NoItemsText; } LoadButton = BottomBar.AddChild(new Gui.Widgets.Button { AutoLayout = Gui.AutoLayout.FloatBottomRight, Border = "border-button", Text = ProceedButtonText, OnClick = (sender, args) => { var selectedItem = Items[PreviewOffset + ItemSelected]; if (selectedItem.Valid && OnProceedClicked != null) { OnProceedClicked(selectedItem.Path); } } }); NextButton = BottomBar.AddChild(new Gui.Widgets.Button { AutoLayout = Gui.AutoLayout.FloatTopRight, Border = "border-button", Text = "Next >", OnClick = (sender, args) => { if (PreviewOffset + Grid.ItemsThatFit < Items.Count) { NeedsRefresh = true; PreviewOffset += Grid.ItemsThatFit; } } }); PrevButton = BottomBar.AddChild(new Gui.Widgets.Button { AutoLayout = Gui.AutoLayout.FloatTopLeft, Border = "border-button", Text = "< Prev", OnClick = (sender, args) => { if (PreviewOffset > 0) { NeedsRefresh = true; PreviewOffset -= Grid.ItemsThatFit; } } }); DeleteButton = BottomBar.AddChild(new Gui.Widgets.Button { AutoLayout = AutoLayout.FloatBottom, Border = "border-button", Text = "Delete", OnClick = (sender, args) => { var confirm = GuiRoot.ConstructWidget(new Gui.Widgets.Confirm { OkayText = "Delete", CancelText = "Keep", Text = "Are you sure you want to delete this?", OnClose = (s) => { if ((s as Gui.Widgets.Confirm).DialogResult == Gui.Widgets.Confirm.Result.OKAY) { var selectedItem = Items[PreviewOffset + ItemSelected]; Items.Remove(selectedItem); try { System.IO.Directory.Delete(selectedItem.Path, true); } catch (Exception e) { GuiRoot.ShowModalPopup(new Gui.Widgets.Confirm() { OkayText = "Ok", CancelText = "", Text = e.Message }); } NeedsRefresh = true; } } }); GuiRoot.ShowModalPopup(confirm); } }); BottomBar.AddChild(new Gui.Widgets.Button { AutoLayout = Gui.AutoLayout.FloatBottomLeft, Border = "border-button", Text = "< Back", OnClick = (sender, args) => { StateManager.PopState(); } }); Grid = GuiRoot.RootItem.AddChild(new Gui.Widgets.GridPanel { ItemSize = new Point(128, 128), ItemSpacing = new Point(8, 8), AutoLayout = Gui.AutoLayout.DockFill, Border = "border-one", Font = "font10", InteriorMargin = new Gui.Margin(32, 0, 0, 0), TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Top }) as Gui.Widgets.GridPanel; GuiRoot.RootItem.Layout(); var gridSpaces = Grid.ItemsThatFit; for (var i = 0; i < gridSpaces; ++i) { var lambda_index = i; Grid.AddChild(new Gui.Widget { Border = "border-one", Text = "No Image", TextHorizontalAlign = HorizontalAlign.Center, TextVerticalAlign = VerticalAlign.Center, OnClick = (sender, args) => { ItemSelected = lambda_index; NeedsRefresh = true; } }); } GuiRoot.RootItem.Layout(); // Must be true or Render will not be called. IsInitialized = true; base.OnEnter(); }