89 | function MixerWagonHUDExtension:draw(leftPosX, rightPosX, posY) |
90 | if not self:canDraw() then |
91 | return |
92 | end |
93 | |
94 | setTextColor(unpack(self.uiTextColor)) |
95 | setTextBold(true) |
96 | setTextAlignment(RenderText.ALIGN_LEFT) |
97 | renderText(leftPosX, posY + (self.helpHeightPerFruit - self.uiTextSize) * 0.5, self.uiTextSize, g_i18n:getText("info_mixingRatio")) |
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 | for _, fillTypeDisplay in ipairs(self.fillTypeStatus) do |
110 | posY = posY - self.helpHeightPerFruit |
111 | |
112 | local percentage = 0 |
113 | if self.vehicle:getFillUnitFillLevel(self.mixerWagon.fillUnitIndex) > 0 then |
114 | percentage = fillTypeDisplay.fillLevel / totalFillLevel |
115 | end |
116 | |
117 | if fillTypeDisplay.fillLevel > 0 then |
118 | if self.vehicle:getFillUnitFillType(self.mixerWagon.fillUnitIndex) ~= FillType.FORAGE_MIXING or (percentage >= fillTypeDisplay.minPercentage and percentage <= fillTypeDisplay.maxPercentage) then |
119 | fillTypeDisplay.statusBar:setColor(unpack(fillTypeDisplay.statusBarColor)) |
120 | else |
121 | fillTypeDisplay.statusBar:setColor(unpack(fillTypeDisplay.statusBarColor2)) |
122 | end |
123 | end |
124 | |
125 | fillTypeDisplay.statusBar:setPosition(rightPosX - fillTypeDisplay.statusBar.width, posY + (self.helpHeightPerFruit - fillTypeDisplay.statusBar.height) * 0.5) |
126 | fillTypeDisplay.statusBar:setValue(percentage) |
127 | fillTypeDisplay.statusBar:render() |
128 | |
129 | if fillTypeDisplay.overlay ~= nil then |
130 | fillTypeDisplay.overlay:setPosition(leftPosX, posY + (self.helpHeightPerFruit - fillTypeDisplay.overlay.height) * 0.5) |
131 | fillTypeDisplay.overlay:render() |
132 | end |
133 | |
134 | renderText(leftPosX + self.fillLevelTextOffsetX, posY + self.fillLevelTextOffsetY, self.uiTextSize, string.format("%1.2f%%", percentage * 100)) |
135 | |
136 | local y = fillTypeDisplay.statusBar.y + fillTypeDisplay.statusBar.height * 0.5 |
137 | local maxLeft = fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width |
138 | local xLeft = math.min(fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width * fillTypeDisplay.minPercentage, maxLeft) |
139 | local xRight = math.min(fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width * fillTypeDisplay.maxPercentage, maxLeft) |
140 | |
141 | self.fillRangeMarkerOverlay:setInvertX(false) |
142 | self.fillRangeMarkerOverlay:setPosition(xLeft, y) |
143 | self.fillRangeMarkerOverlay:render() |
144 | self.fillRangeMarkerOverlay:setInvertX(true) -- base sprite points right, need to point to the left now |
145 | self.fillRangeMarkerOverlay:setPosition(xRight - self.fillRangeMarkerOverlay.width, y) |
146 | self.fillRangeMarkerOverlay:render() |
147 | end |
148 | |
149 | return posY |
150 | 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:getFillTypeByName(mixerWagonFillType.name) |
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(20 * uiScale, 20 * uiScale) |
40 | entry.overlay = Overlay:new(fillType.hudOverlayFilenameSmall, 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 | local width, height = getNormalizedScreenValues(208 * 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 | self.fillLevelTextOffsetX, self.fillLevelTextOffsetY = getNormalizedScreenValues(28 * uiScale, 7 * uiScale) |
55 | _, self.helpHeightPerFruit = getNormalizedScreenValues(0, 28 * uiScale) |
56 | _, self.helpHeightOffset = getNormalizedScreenValues(0, 12 * uiScale) |
57 | |
58 | local width, height = getNormalizedScreenValues(9 * uiScale, 12.5 * uiScale) |
59 | self.fillRangeMarkerOverlay = Overlay:new(g_baseUIFilename, 0, 0, width, height) |
60 | self.fillRangeMarkerOverlay:setAlignment(Overlay.ALIGN_VERTICAL_MIDDLE, Overlay.ALIGN_HORIZONTAL_LEFT) |
61 | self.fillRangeMarkerOverlay:setUVs(getNormalizedUVs(MixerWagonHUDExtension.UV.RANGE_MARKER_ARROW)) |
62 | self.fillRangeMarkerOverlay:setColor(unpack(uiTextColor)) |
63 | self:addComponentForCleanup(self.fillRangeMarkerOverlay) |
64 | |
65 | self.displayHeight = (#self.mixerWagon.mixerWagonFillTypes + 1) * self.helpHeightPerFruit + self.helpHeightOffset |
66 | |
67 | return self |
68 | end |