Makepad Code (editor layout, selection, sidebar, early yield), the EN/ZH Translator with voice, Weather with a generated offline forecast, Amp playing its offline library, and fixes across the other apps and examples. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
253 lines
13 KiB
Text
253 lines
13 KiB
Text
// Military — hardened field equipment: an olive-drab powder-coated front with
|
|
// rubber bumpers at the corners, gunmetal plates, recessed guarded keys,
|
|
// hazard-striped edges on the control wings, night-vision green lights and a
|
|
// green segment-style readout on the displays.
|
|
use mod.prelude.widgets_internal.*
|
|
|
|
// ---- palette: phosphor-green lists and bars ----
|
|
mod.widgets.hw_palette.screen_bg = #x0a0e0a
|
|
mod.widgets.hw_palette.screen_text = #xb8f5a8
|
|
mod.widgets.hw_palette.screen_muted = #x5f8f58
|
|
mod.widgets.hw_palette.accent = #x5dff4a
|
|
// The device's floor is dark: display type sits on it bare.
|
|
mod.widgets.hw_palette.dark_floor = 1.0
|
|
|
|
// ---- the front: olive-drab powder coat, rubber bumpers at the corners ----
|
|
mod.widgets.HwChassis.draw_bg.ground = #x4a4f33
|
|
mod.widgets.HwChassis.draw_bg.light_ink = vec4(0.86, 0.88, 0.74, 1.0)
|
|
mod.widgets.HwChassis.draw_bg.shadow_ink = vec4(0.06, 0.07, 0.04, 1.0)
|
|
mod.widgets.HwChassis.draw_bg.pattern = vec4(4.0, 1.2, 0.20, 0.0)
|
|
mod.widgets.HwChassis.draw_bg.glow_ink = vec4(0.36, 1.0, 0.29, 1.0)
|
|
mod.widgets.HwChassis.draw_bg.spill = vec2(1.4, 0.6)
|
|
mod.widgets.HwChassis.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
var col = self.surface(p, self.ground.xyz)
|
|
col = col * (1.0 + (self.hw_hash(floor(self.world.xy * 1.3)) - 0.5) * 0.06)
|
|
let v = length((self.pos - vec2(0.5, 0.35)) * vec2(0.9, 1.3))
|
|
col = col * (1.06 - 0.26 * v * v)
|
|
// Rubber bumpers: a moulded black block over each corner.
|
|
let s = self.rect_size
|
|
let cq = min(p, s - p)
|
|
// A moulded rubber block over each corner.
|
|
let bq = cq - vec2(40.0, 40.0)
|
|
let bd = length(max(bq, vec2(0.0, 0.0))) + min(max(bq.x, bq.y), 0.0) - 8.0
|
|
let bump = 1.0 - smoothstep(-0.8, 0.8, bd)
|
|
let rn = clamp(-bd / 8.0, 0.0, 1.0)
|
|
let ridge = smoothstep(0.35, 0.65, 0.5 + 0.5 * sin((cq.x + cq.y) * 0.7))
|
|
var rub = vec3(0.055, 0.056, 0.052) * (0.7 + 0.5 * rn) * (0.8 + 0.35 * ridge)
|
|
rub = rub + vec3(0.30, 0.31, 0.28) * (1.0 - smoothstep(0.0, 1.8, abs(bd + 1.8))) * 0.55
|
|
// A bolt through the corner block.
|
|
let bolt = length(cq - vec2(17.0, 17.0))
|
|
rub = mix(rub, vec3(0.42, 0.43, 0.40) * (1.25 - bolt * 0.09), 1.0 - smoothstep(4.0, 5.0, bolt))
|
|
let lip = (1.0 - smoothstep(0.0, 10.0, bd)) * (1.0 - bump) * 0.65
|
|
col = col * (1.0 - lip)
|
|
col = mix(col, rub, bump)
|
|
col = col * (1.0 - self.env_ao(0.0)) + self.env_spill(vec3(0.0, 0.0, 1.0))
|
|
return vec4(col + self.dither(), 1.0)
|
|
}
|
|
mod.widgets.Window.pass.clear_color = #x3c402a
|
|
|
|
// Raised plates: gunmetal, bolted, a hazard band round the edge.
|
|
mod.widgets.HwPlate.draw_bg.ground = #x3a3d3c
|
|
mod.widgets.HwPlate.draw_bg.light_ink = vec4(0.80, 0.83, 0.80, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.shadow_ink = vec4(0.02, 0.02, 0.02, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.pattern = vec4(7.0, 1.0, 0.0, 0.0)
|
|
mod.widgets.HwPlate.draw_bg.pattern_ink = vec4(0.95, 0.74, 0.08, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.pattern_seam = vec4(18.0, 7.0, 1.0, 2.5)
|
|
mod.widgets.HwPlate.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
let w = self.world.xy
|
|
// Powder-coated gunmetal: soft cells and fine speckle.
|
|
let n = self.hw_noise(w * 0.3) * 0.6 + self.hw_noise(w * 0.8) * 0.4
|
|
var col = base * (1.0 + (n - 0.5) * 0.18)
|
|
col = col * (1.0 + (self.hw_hash(floor(w * 1.6)) - 0.5) * 0.08)
|
|
// Hazard band: yellow and black diagonals in the edge band.
|
|
let band = self.pattern_seam.y
|
|
let e = min(min(p.x, p.y), min(self.rect_size.x - p.x, self.rect_size.y - p.y)) - self.inset
|
|
let inb = 1.0 - smoothstep(band - 0.6, band + 0.6, e)
|
|
let t = fract((w.x + w.y) / max(self.pattern_seam.x, 2.0))
|
|
let st = smoothstep(0.47, 0.53, t) * (1.0 - smoothstep(0.97, 1.0, t)) + (1.0 - smoothstep(0.0, 0.03, t))
|
|
let chip = step(0.86, self.hw_noise(w * 0.25))
|
|
let stripe = mix(vec3(0.06, 0.06, 0.05), self.pattern_ink.xyz, st) * (0.9 + 0.2 * self.hw_hash(floor(w * 2.0)))
|
|
col = mix(col, stripe, inb * (1.0 - chip * 0.7))
|
|
// A screw head inside each corner of the band.
|
|
let cq = min(p, self.rect_size - p) - vec2(self.inset, self.inset)
|
|
let sd = length(cq - vec2(band + 7.0, band + 7.0))
|
|
let screw = 1.0 - smoothstep(3.2, 4.2, sd)
|
|
let slot = (1.0 - smoothstep(0.4, 1.0, abs((cq.x - cq.y) * 0.707))) * screw
|
|
col = mix(col, vec3(0.50, 0.52, 0.50) * (1.2 - sd * 0.12), screw)
|
|
col = mix(col, vec3(0.08, 0.08, 0.08), slot)
|
|
return col
|
|
}
|
|
mod.widgets.HwPlate.draw_bg.relief = vec4(1.8, 0.7, 2.0, 0.25)
|
|
mod.widgets.HwPlate.draw_bg.finish = vec4(0.6, 0.35, 0.12, 0.8)
|
|
mod.widgets.HwPlate.draw_bg.shadow = vec4(0.65, 9.0, 1.0, 0.6)
|
|
mod.widgets.HwPlate.draw_bg.glow_ink = vec4(0.36, 1.0, 0.29, 1.0)
|
|
mod.widgets.HwPlate.draw_bg.spill = vec2(1.6, 0.6)
|
|
|
|
// Recessed panels: a darker olive well.
|
|
mod.widgets.HwPanel.draw_bg.ground = #x2c3020
|
|
mod.widgets.HwPanel.draw_bg.light_ink = vec4(0.72, 0.76, 0.60, 1.0)
|
|
mod.widgets.HwPanel.draw_bg.shadow_ink = vec4(0.01, 0.01, 0.0, 1.0)
|
|
mod.widgets.HwPanel.draw_bg.pattern = vec4(4.0, 1.2, 0.16, 0.0)
|
|
mod.widgets.HwPanel.draw_bg.inner = vec4(0.85, 9.0, 0.0, 0.55)
|
|
mod.widgets.HwPanel.draw_bg.finish = vec4(0.7, 0.3, 0.05, 0.9)
|
|
mod.widgets.HwPanel.draw_bg.glow_ink = vec4(0.36, 1.0, 0.29, 1.0)
|
|
mod.widgets.HwPanel.draw_bg.spill = vec2(1.5, 0.6)
|
|
|
|
// The screen's surround: blackened steel, very deep.
|
|
mod.widgets.HwBezel.draw_bg.ground = #x141614
|
|
mod.widgets.HwBezel.draw_bg.light_ink = vec4(0.55, 0.58, 0.52, 1.0)
|
|
mod.widgets.HwBezel.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwBezel.draw_bg.pattern = vec4(4.0, 0.8, 0.14, 0.0)
|
|
mod.widgets.HwBezel.draw_bg.inner = vec4(1.0, 14.0, 0.0, 0.6)
|
|
mod.widgets.HwBezel.draw_bg.spill = vec2(1.0, 0.5)
|
|
|
|
// The glass: a faint green scan and a heavy rim.
|
|
mod.widgets.HwGlass.draw_bg.glass = vec4(0.10, 0.05, 0.55, 0.06)
|
|
mod.widgets.HwGlass.draw_bg.tint = vec4(0.6, 1.0, 0.55, 0.0)
|
|
|
|
// ---- keys: recessed, guarded gunmetal caps with stencil glyphs ----
|
|
mod.widgets.HwKey.depth = 1.6
|
|
mod.widgets.HwKey.press = -2.6
|
|
mod.widgets.HwKey.radius = 4
|
|
mod.widgets.HwKey.draw_bg.ground = #x2d302e
|
|
mod.widgets.HwKey.draw_bg.light_ink = vec4(0.78, 0.80, 0.74, 1.0)
|
|
mod.widgets.HwKey.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwKey.draw_bg.pattern = vec4(4.0, 0.7, 0.16, 0.0)
|
|
mod.widgets.HwKey.draw_bg.relief = vec4(2.4, 0.4, 1.6, 0.20)
|
|
mod.widgets.HwKey.draw_bg.finish = vec4(0.7, 0.3, 0.08, 0.9)
|
|
mod.widgets.HwKey.draw_bg.shadow = vec4(0.75, 5.0, 1.0, 0.75)
|
|
mod.widgets.HwKey.draw_bg.glow_ink = vec4(0.36, 1.0, 0.29, 1.0)
|
|
mod.widgets.HwKey.draw_bg.spill = vec2(2.0, 0.6)
|
|
// The guard: a gunmetal frame standing round each cap.
|
|
mod.widgets.HwKey.draw_bg.pixel = fn() {
|
|
let p = self.pos * self.rect_size
|
|
var o = self.layer(self.key_face(p, self.ground.xyz))
|
|
if self.mech.x > 0.5 {
|
|
o = self.mech_key()
|
|
}
|
|
let px = 1.0 / max(self.draw_pass.dpi_factor, 0.5)
|
|
let d = self.sd(p)
|
|
let c = self.rect_size * 0.5
|
|
let e = min(min(p.x, p.y), min(self.rect_size.x - p.x, self.rect_size.y - p.y))
|
|
let g = smoothstep(2.4 - px, 2.4 + px, d) * (1.0 - smoothstep(-px, px, 1.2 - e))
|
|
let lt = normalize(self.light.xy + vec2(0.000001, 0.000001))
|
|
let side = dot(normalize(p - c + vec2(0.0001, 0.0001)), -lt)
|
|
let gcol = vec3(0.20, 0.215, 0.20) * (0.8 + 0.45 * side) + self.env_spill(vec3(0.0, 0.0, 1.0)) * 0.5
|
|
let groove = 1.0 - smoothstep(0.0, 1.4, abs(d - 3.2))
|
|
let gc = gcol * (1.0 - groove * 0.5)
|
|
o = vec4(gc * g, g) + o * (1.0 - g)
|
|
o = self.key_marks(o, p)
|
|
return vec4(o.xyz + self.dither() * step(0.002, o.w), o.w)
|
|
}
|
|
mod.widgets.HwKeyButton.draw_text.color = #xd9dcc4
|
|
mod.widgets.HwKeyButton.draw_text.color_hover = #x9dff8a
|
|
mod.widgets.HwKeyButton.draw_text.color_down = #x5dff4a
|
|
mod.widgets.HwKeyText.draw_text.color = #xd9dcc4
|
|
mod.widgets.HwKeyText.draw_text.color_hover = #x9dff8a
|
|
mod.widgets.HwKeyText.draw_text.color_down = #x5dff4a
|
|
|
|
// ---- lights: night-vision green ----
|
|
mod.widgets.HwDash.emissive = vec4(0.30, 1.0, 0.22, 8.0)
|
|
mod.widgets.HwDash.draw_bg.glow_ink = vec4(0.36, 1.0, 0.28, 1.0)
|
|
mod.widgets.HwDash.draw_bg.ground = #x0e120c
|
|
mod.widgets.HwLed.emissive = vec4(0.30, 1.0, 0.22, 3.5)
|
|
mod.widgets.HwLed.draw_bg.glow_ink = vec4(0.36, 1.0, 0.28, 1.0)
|
|
|
|
// ---- knob: a black knurled skirt, a stepped olive cap ----
|
|
mod.widgets.HwKnobFace.draw_bg.ground = #x1c1e1c
|
|
mod.widgets.HwKnobFace.draw_bg.light_ink = vec4(0.80, 0.82, 0.76, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.pattern = vec4(5.0, 0.8, 0.12, 0.0)
|
|
mod.widgets.HwKnobFace.draw_bg.knob = vec4(1.0, 0.62, 36.0, 0.65)
|
|
mod.widgets.HwKnobFace.draw_bg.cap_ink = vec4(0.30, 0.32, 0.22, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.ptr_ink = vec4(0.98, 0.78, 0.10, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.ring = vec4(13.0, 1.30, 2.3, 2.35619)
|
|
mod.widgets.HwKnobFace.draw_bg.led_off = vec4(0.07, 0.10, 0.06, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.glow_ink = vec4(0.36, 1.0, 0.28, 1.0)
|
|
mod.widgets.HwKnobFace.draw_bg.shadow = vec4(0.85, 10.0, 1.0, 0.8)
|
|
mod.widgets.HwKnobFace.emissive = vec4(0.30, 1.0, 0.22, 0.7)
|
|
|
|
// ---- meter: green LED ladder, amber at the top ----
|
|
mod.widgets.HwMeterFace.draw_bg.ground = #x070907
|
|
mod.widgets.HwMeterFace.draw_bg.meter = vec4(0.0, 20.0, 0.9, 0.8)
|
|
mod.widgets.HwMeterFace.draw_bg.glow_ink = vec4(0.36, 1.0, 0.28, 1.0)
|
|
mod.widgets.HwMeterFace.draw_bg.hot_ink = vec4(1.0, 0.72, 0.08, 1.0)
|
|
mod.widgets.HwMeterFace.draw_bg.led_off = vec4(0.05, 0.08, 0.04, 1.0)
|
|
mod.widgets.HwMeterFace.emissive = vec4(0.30, 1.0, 0.22, 0.5)
|
|
|
|
// ---- type: stencil-white on the drab, green on the displays ----
|
|
mod.widgets.HwCaption.draw_text.color = #xc9cca8
|
|
mod.widgets.HwTitle.draw_text.color = #xe4e6cc
|
|
mod.widgets.HwText.draw_text.color = #xb3b793
|
|
mod.widgets.HwPanelTitle.draw_text.color = #xdfe2c6
|
|
mod.widgets.HwPanelText.draw_text.color = #x9da283
|
|
mod.widgets.HwNavButton.draw_text.color = #xcfd3b3
|
|
mod.widgets.HwNavButton.draw_text.color_hover = #x9dff8a
|
|
mod.widgets.HwNavButton.draw_bg.color = vec4(0.13, 0.145, 0.10, 1.0)
|
|
mod.widgets.HwNavButton.draw_bg.color_hover = vec4(0.17, 0.20, 0.12, 1.0)
|
|
mod.widgets.HwNavButton.draw_bg.color_down = vec4(0.08, 0.10, 0.06, 1.0)
|
|
mod.widgets.HwNavButton.draw_bg.color_focus = vec4(0.13, 0.145, 0.10, 1.0)
|
|
mod.widgets.HwNavButton.draw_bg.border_color = vec4(0.0, 0.0, 0.0, 0.5)
|
|
mod.widgets.HwNavButton.draw_bg.border_color_hover = vec4(0.36, 1.0, 0.28, 0.35)
|
|
mod.widgets.HwDisplayText.draw_text.color = #x7dff66
|
|
mod.widgets.HwDisplayText.draw_text.text_style = theme.font_code{font_size: 10.0}
|
|
mod.widgets.HwDisplay.draw_bg.ground = #x060906
|
|
mod.widgets.HwDisplay.draw_bg.light_ink = vec4(0.55, 0.58, 0.52, 1.0)
|
|
mod.widgets.HwDisplay.draw_bg.shadow_ink = vec4(0.0, 0.0, 0.0, 1.0)
|
|
mod.widgets.HwDisplay.draw_bg.surface = fn(p: vec2, base: vec3) -> vec3 {
|
|
// A segment readout's glass: a faint phosphor-green cell grid.
|
|
let f = fract(p / vec2(3.0, 3.0))
|
|
let cell = step(0.25, f.x) * step(0.25, f.y)
|
|
return base + vec3(0.010, 0.030, 0.008) * cell
|
|
}
|
|
mod.widgets.HwDisplay.draw_bg.inner = vec4(1.0, 10.0, 0.0, 0.6)
|
|
mod.widgets.HwDropDown.draw_bg.well = vec4(0.03, 0.05, 0.03, 1.0)
|
|
mod.widgets.HwDropDown.draw_bg.rim = vec4(0.36, 1.0, 0.28, 0.22)
|
|
mod.widgets.HwDropDown.draw_bg.arrow = vec4(0.45, 1.0, 0.36, 1.0)
|
|
mod.widgets.HwDropDown.draw_text.color = #x9df58a
|
|
mod.widgets.HwTextInput.draw_bg.well = vec4(0.03, 0.05, 0.03, 1.0)
|
|
mod.widgets.HwTextInput.draw_bg.rim = vec4(0.36, 1.0, 0.28, 0.22)
|
|
mod.widgets.HwSplitter.draw_bg.groove = vec4(0.0, 0.0, 0.0, 0.45)
|
|
mod.widgets.HwSplitter.draw_bg.glint = vec4(0.8, 0.85, 0.6, 0.18)
|
|
|
|
// ---- the picture lights the front ----
|
|
mod.widgets.HwMilk.light = 1.9
|
|
mod.widgets.HwMilk.light_knee = 1.0
|
|
mod.widgets.HwSpectrum.light = 3.2
|
|
// Critical keys (play, presets) carry a hazard band.
|
|
mod.widgets.HwKey.draw_bg.critical_ink = vec4(0.93, 0.74, 0.10, 1.0)
|
|
mod.widgets.HwKey.draw_bg.critical_band = vec4(1.0, 4.0, 7.0, 0.0)
|
|
// ---- transport: guarded keys that drop inside their guards and latch ----
|
|
mod.widgets.HwTransportKey.latch = 1.0
|
|
mod.widgets.HwTransportKey.press_secs = 0.07
|
|
mod.widgets.HwTransportKey.draw_bg.spill = vec2(0.9, 0.45)
|
|
mod.widgets.HwTransportKey.travel = 3.5
|
|
mod.widgets.HwTransportKey.draw_bg.mech = vec4(1.0, 0.66, 0.0, 0.0)
|
|
mod.widgets.HwTransportKey.draw_bg.dimple = vec4(0.0, 3.0, 0.3, 0.1)
|
|
mod.widgets.HwTransportKey.draw_bg.housing_ink = vec4(0.02, 0.022, 0.02, 1.0)
|
|
mod.widgets.HwTransportKey.draw_bg.front_ink = vec4(0.22, 0.235, 0.22, 1.0)
|
|
|
|
// ---- the picture in this style's colours (THEME COLOURS key; on by default) ----
|
|
mod.widgets.hw_palette.map0 = #x020a02
|
|
mod.widgets.hw_palette.map1 = #x0f4010
|
|
mod.widgets.hw_palette.map2 = #x3fd84a
|
|
mod.widgets.hw_palette.map3 = #xd8ffcc
|
|
mod.widgets.hw_palette.map_strength = 0.85
|
|
mod.widgets.hw_palette.map_default = 1.0
|
|
// The screen filter with the THEME COLOURS key: CRT: a bulging tube, scanlines, an RGB mask, bloom.
|
|
mod.widgets.hw_palette.screen_filter = 1.0
|
|
mod.widgets.hw_palette.screen_filter_strength = 0.85
|
|
mod.widgets.hw_palette.screen_cell = 2.5
|
|
mod.widgets.hw_palette.screen_curve = 0.07
|
|
true
|
|
|
|
// ---- EQ (HwEqGraph: the graphic equalizer's era look, STYLE_GUIDE "Graphic EQ") ----
|
|
mod.widgets.HwEqGraph.draw_fader.fader = vec4(2.0, 0.56, 15.0, 4.0)
|
|
mod.widgets.HwEqGraph.draw_fader.cap_ink = vec4(0.26, 0.29, 0.20, 1.0)
|
|
mod.widgets.HwEqGraph.draw_fader.track_ink = vec4(0.02, 0.03, 0.02, 1.0)
|
|
mod.widgets.HwEqGraph.draw_curve.curve = vec4(1.0, 1.8, 8.0, 0.06)
|
|
mod.widgets.HwEqGraph.draw_grid.grid = vec4(3.0, 0.14, 0.34, 0.0)
|
|
mod.widgets.HwEqGraph.draw_grid.grid_ink = vec4(0.36, 1.0, 0.29, 0.8)
|
|
mod.widgets.HwEqGraph.draw_spectrum.spectrum = vec4(0.18, 1.0, 0.0, 0.0)
|
|
true
|