90 | function MixerWagonHUDExtension:draw(leftPosX, rightPosX, posY) |
91 | -- posY is bottom of the display |
92 | |
93 | setTextColor(unpack(self.uiTextColor)) |
94 | setTextBold(true) |
95 | setTextAlignment(RenderText.ALIGN_LEFT) |
96 | local text = string.format("%s (%s)", g_i18n:getText("info_mixingRatio"), self.vehicle:getFullName()) |
97 | renderText(leftPosX, posY + self.displayHeight - self.uiTextSize * 1.5, self.uiTextSize, text) |
98 | setTextBold(false) |
99 | |
100 | local totalFillLevel = 0 |
101 | if self.vehicle:getFillUnitFillLevel(self.mixerWagon.fillUnitIndex) > 0 then |
102 | for i, mixerWagonFillType in ipairs(self.mixerWagon.mixerWagonFillTypes) do |
103 | totalFillLevel = totalFillLevel + mixerWagonFillType.fillLevel |
104 | -- fill type display status is a synchronous array -> set corresponding fill level info |
105 | self.fillTypeStatus[i].fillLevel = mixerWagonFillType.fillLevel |
106 | end |
107 | end |
108 | |
109 | local barY = posY + #self.fillTypeStatus * self.helpHeightPerFruit + self.helpHeightPerFruit * 0.3 |
110 | for _, fillTypeDisplay in ipairs(self.fillTypeStatus) do |
111 | barY = barY - self.helpHeightPerFruit |
112 | |
113 | local percentage = 0 |
114 | if self.vehicle:getFillUnitFillLevel(self.mixerWagon.fillUnitIndex) > 0 then |
115 | percentage = fillTypeDisplay.fillLevel / totalFillLevel |
116 | end |
117 | |
118 | if fillTypeDisplay.fillLevel > 0 then |
119 | if self.vehicle:getFillUnitFillType(self.mixerWagon.fillUnitIndex) ~= FillType.FORAGE_MIXING or (percentage >= fillTypeDisplay.minPercentage and percentage <= fillTypeDisplay.maxPercentage) then |
120 | fillTypeDisplay.statusBar:setColor(unpack(fillTypeDisplay.statusBarColor)) |
121 | else |
122 | fillTypeDisplay.statusBar:setColor(unpack(fillTypeDisplay.statusBarColor2)) |
123 | end |
124 | end |
125 | |
126 | fillTypeDisplay.statusBar:setPosition(rightPosX - fillTypeDisplay.statusBar.width, barY + (self.helpHeightPerFruit - fillTypeDisplay.statusBar.height) * 0.5) |
127 | fillTypeDisplay.statusBar:setValue(percentage) |
128 | fillTypeDisplay.statusBar:render() |
129 | |
130 | if fillTypeDisplay.overlay ~= nil then |
131 | fillTypeDisplay.overlay:setPosition(leftPosX, barY + (self.helpHeightPerFruit - fillTypeDisplay.overlay.height) * 0.5) |
132 | fillTypeDisplay.overlay:render() |
133 | end |
134 | |
135 | setTextAlignment(RenderText.ALIGN_RIGHT) |
136 | renderText(leftPosX + self.fillLevelTextOffsetX, barY + self.fillLevelTextOffsetY, self.uiTextSize, string.format("%1.1f%%", percentage * 100)) |
137 | setTextAlignment(RenderText.ALIGN_LEFT) |
138 | |
139 | local y = fillTypeDisplay.statusBar.y + fillTypeDisplay.statusBar.height * 0.5 |
140 | local maxLeft = fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width |
141 | local xLeft = math.min(fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width * fillTypeDisplay.minPercentage, maxLeft) |
142 | local xRight = math.min(fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width * fillTypeDisplay.maxPercentage, maxLeft) |
143 | |
144 | self.fillRangeMarkerOverlay:setInvertX(false) |
145 | self.fillRangeMarkerOverlay:setPosition(xLeft, y) |
146 | self.fillRangeMarkerOverlay:render() |
147 | self.fillRangeMarkerOverlay:setInvertX(true) -- base sprite points right, need to point to the left now |
148 | self.fillRangeMarkerOverlay:setPosition(xRight - self.fillRangeMarkerOverlay.width, y) |
149 | self.fillRangeMarkerOverlay:render() |
150 | end |
151 | |
152 | return posY |
153 | end |
24 | function MixerWagonHUDExtension.new(vehicle, uiScale, uiTextColor, uiTextSize) |
25 | local self = VehicleHUDExtension.new(MixerWagonHUDExtension_mt, vehicle, uiScale, uiTextColor, uiTextSize) |
26 | self.mixerWagon = vehicle.spec_mixerWagon |
27 | |
28 | self.fillTypeStatus = {} -- array of fill type display entries, definition see below |
29 | |
30 | for _, mixerWagonFillType in ipairs(self.mixerWagon.mixerWagonFillTypes) do |
31 | local fillType = g_fillTypeManager:getFillTypeByIndex(next(mixerWagonFillType.fillTypes)) |
32 | if fillType ~= nil then |
33 | local entry = {fillType=fillType, overlay=nil, statusBar=nil, statusBarColor=nil, statusBarColor2=nil, |
34 | minPercentage=0, maxPercentage=0, fillLevel=0} |
35 | |
36 | entry.minPercentage = mixerWagonFillType.minPercentage |
37 | entry.maxPercentage = mixerWagonFillType.maxPercentage |
38 | |
39 | local width, height = getNormalizedScreenValues(30 * uiScale, 30 * uiScale) |
40 | entry.overlay = Overlay.new(fillType.hudOverlayFilename, 0, 0, width, height) |
41 | entry.overlay:setColor(unpack(uiTextColor)) |
42 | self:addComponentForCleanup(entry.overlay) |
43 | |
44 | entry.statusBarColor = MixerWagonHUDExtension.COLOR.STATUS_BAR_GOOD |
45 | entry.statusBarColor2 = MixerWagonHUDExtension.COLOR.STATUS_BAR_BAD |
46 | width, height = getNormalizedScreenValues(315 * uiScale, 12 * uiScale) |
47 | entry.statusBar = StatusBar.new(g_baseUIFilename, g_colorBgUVs, nil, MixerWagonHUDExtension.COLOR.STATUS_BAR_BG, entry.statusBarColor2, nil, 0, 0, width, height) |
48 | self:addComponentForCleanup(entry.statusBar) |
49 | |
50 | table.insert(self.fillTypeStatus, entry) |
51 | end |
52 | end |
53 | |
54 | local _ |
55 | self.fillLevelTextOffsetX, self.fillLevelTextOffsetY = getNormalizedScreenValues(105 * uiScale, 7 * uiScale) |
56 | _, self.helpHeightPerFruit = getNormalizedScreenValues(0, 28 * uiScale) |
57 | _, self.helpHeightOffset = getNormalizedScreenValues(0, 12 * uiScale) |
58 | |
59 | local width, height = getNormalizedScreenValues(9 * uiScale, 12.5 * uiScale) |
60 | self.fillRangeMarkerOverlay = Overlay.new(g_baseUIFilename, 0, 0, width, height) |
61 | self.fillRangeMarkerOverlay:setAlignment(Overlay.ALIGN_VERTICAL_MIDDLE, Overlay.ALIGN_HORIZONTAL_LEFT) |
62 | self.fillRangeMarkerOverlay:setUVs(GuiUtils.getUVs(MixerWagonHUDExtension.UV.RANGE_MARKER_ARROW)) |
63 | self.fillRangeMarkerOverlay:setColor(unpack(uiTextColor)) |
64 | self:addComponentForCleanup(self.fillRangeMarkerOverlay) |
65 | |
66 | self.displayHeight = (#self.mixerWagon.mixerWagonFillTypes + 1) * self.helpHeightPerFruit + self.helpHeightOffset |
67 | |
68 | return self |
69 | end |