public ClassicProductionLogic(Widget widget, OrderManager orderManager, World world) { this.world = world; palette = widget.Get<ProductionPaletteWidget>("PRODUCTION_PALETTE"); var background = widget.GetOrNull("PALETTE_BACKGROUND"); var foreground = widget.GetOrNull("PALETTE_FOREGROUND"); if (background != null || foreground != null) { Widget backgroundTemplate = null; Widget backgroundBottom = null; Widget foregroundTemplate = null; if (background != null) { backgroundTemplate = background.Get("ROW_TEMPLATE"); backgroundBottom = background.GetOrNull("BOTTOM_CAP"); } if (foreground != null) foregroundTemplate = foreground.Get("ROW_TEMPLATE"); Action<int, int> updateBackground = (_, icons) => { var rows = Math.Max(palette.MinimumRows, (icons + palette.Columns - 1) / palette.Columns); rows = Math.Min(rows, palette.MaximumRows); if (background != null) { background.RemoveChildren(); var rowHeight = backgroundTemplate.Bounds.Height; for (var i = 0; i < rows; i++) { var row = backgroundTemplate.Clone(); row.Bounds.Y = i * rowHeight; background.AddChild(row); } if (backgroundBottom == null) return; backgroundBottom.Bounds.Y = rows * rowHeight; background.AddChild(backgroundBottom); } if (foreground != null) { foreground.RemoveChildren(); var rowHeight = foregroundTemplate.Bounds.Height; for (var i = 0; i < rows; i++) { var row = foregroundTemplate.Clone(); row.Bounds.Y = i * rowHeight; foreground.AddChild(row); } } }; palette.OnIconCountChanged += updateBackground; // Set the initial palette state updateBackground(0, 0); } var typesContainer = widget.Get("PRODUCTION_TYPES"); foreach (var i in typesContainer.Children) SetupProductionGroupButton(orderManager, i as ProductionTypeButtonWidget); var ticker = widget.Get<LogicTickerWidget>("PRODUCTION_TICKER"); ticker.OnTick = () => { if (palette.CurrentQueue == null || palette.DisplayedIconCount == 0) { // Select the first active tab foreach (var b in typesContainer.Children) { var button = b as ProductionTypeButtonWidget; if (button == null || button.IsDisabled()) continue; button.OnClick(); break; } } }; // Hook up scroll up and down buttons on the palette var scrollDown = widget.GetOrNull<ButtonWidget>("SCROLL_DOWN_BUTTON"); if (scrollDown != null) { scrollDown.OnClick = palette.ScrollDown; scrollDown.IsVisible = () => palette.TotalIconCount > (palette.MaxIconRowOffset * palette.Columns); scrollDown.IsDisabled = () => !palette.CanScrollDown; } var scrollUp = widget.GetOrNull<ButtonWidget>("SCROLL_UP_BUTTON"); if (scrollUp != null) { scrollUp.OnClick = palette.ScrollUp; scrollUp.IsVisible = () => palette.TotalIconCount > (palette.MaxIconRowOffset * palette.Columns); scrollUp.IsDisabled = () => !palette.CanScrollUp; } SetMaximumVisibleRows(palette); }
static void SetMaximumVisibleRows(ProductionPaletteWidget productionPalette) { var screenHeight = Game.Renderer.Resolution.Height; // Get height of currently displayed icons var containerWidget = Ui.Root.GetOrNull<ContainerWidget>("SIDEBAR_PRODUCTION"); if (containerWidget == null) return; var sidebarProductionHeight = containerWidget.Bounds.Y; // Check if icon heights exceed y resolution var maxItemsHeight = screenHeight - sidebarProductionHeight; var maxIconRowOffest = (maxItemsHeight / productionPalette.IconSize.Y) - 1; productionPalette.MaxIconRowOffset = Math.Min(maxIconRowOffest, productionPalette.MaximumRows); }