Загрузка данных


import { createWidget, widget } from '@zeppos/device-types'

Page({
  state: {
    num1: 0,
    num2: 0,
    action: '+',
    result: 0
  },

  // Умная функция вычислений без пиксельных багов JavaScript
  calculate() {
    const n1 = this.state.num1
    const n2 = this.state.num2
    let res = 0

    switch (this.state.action) {
      case '+': res = n1 + n2; break
      case '-': res = n1 - n2; break
      case '*': res = n1 * n2; break
      case '/': 
        if (n2 === 0) return 'Error'
        res = n1 / n2
        break
    }

    // Если число дробное, аккуратно округляем до 2 знаков после запятой
    if (res % 1 !== 0 && typeof res === 'number') {
      return Number(res.toFixed(2))
    }
    return res
  },

  build() {
    // 1. Черный фон под размер экрана Mi Band 7
    createWidget(widget.BG, { x: 0, y: 0, w: 192, h: 490, color: 0x000000 })

    // 2. Главное цифровое табло (Ярко-зеленый хакерский цвет)
    const display = createWidget(widget.TEXT, {
      x: 10, y: 40, w: 172, h: 60,
      color: 0x00FF00, text_size: 24,
      align_h: widget.ALIGN.CENTER_H,
      text: '0 + 0 = 0'
    })

    // Функция для обновления текста на табло при кликах
    const updateDisplay = () => {
      this.state.result = this.calculate()
      display.setProperty(widget.prop.MORE, {
        text: `${this.state.num1} ${this.state.action} ${this.state.num2} = ${this.state.result}`
      })
    }

    // 3. БЛОК УПРАВЛЕНИЯ ЧИСЛАМИ (Верхняя половина экрана)
    // Кнопка: Изменить Первое Число (+1)
    createWidget(widget.BUTTON, {
      x: 16, y: 120, w: 75, h: 50, radius: 10,
      normal_color: 0x333333, press_color: 0x555555,
      text: 'N1 +1', text_size: 16, color: 0xFFFFFF
    }).addEventListener(widget.EDGE_EVENT.TAP, () => {
      this.state.num1++
      updateDisplay()
    })

    // Кнопка: Изменить Второе Число (+1)
    createWidget(widget.BUTTON, {
      x: 101, y: 120, w: 75, h: 50, radius: 10,
      normal_color: 0x333333, press_color: 0x555555,
      text: 'N2 +1', text_size: 16, color: 0xFFFFFF
    }).addEventListener(widget.EDGE_EVENT.TAP, () => {
      this.state.num2++
      updateDisplay()
    })

    // Кнопка: Минус 1 от Первого Числа (-1)
    createWidget(widget.BUTTON, {
      x: 16, y: 180, w: 75, h: 50, radius: 10,
      normal_color: 0x333333, press_color: 0x555555,
      text: 'N1 -1', text_size: 16, color: 0xFFFFFF
    }).addEventListener(widget.EDGE_EVENT.TAP, () => {
      this.state.num1--
      updateDisplay()
    })

    // Кнопка: Минус 1 от Второго Числа (-1)
    createWidget(widget.BUTTON, {
      x: 101, y: 180, w: 75, h: 50, radius: 10,
      normal_color: 0x333333, press_color: 0x555555,
      text: 'N2 -1', text_size: 16, color: 0xFFFFFF
    }).addEventListener(widget.EDGE_EVENT.TAP, () => {
      this.state.num2--
      updateDisplay()
    })

    // 4. БЛОК ВЫБОРА ОПЕРАЦИЙ (Оранжевые кнопки, как на iOS/Xiaomi)
    const actions = ['+', '-', '*', '/']
    actions.forEach((act, index) => {
      const posX = 16 + (index % 2) * 85
      const posY = 250 + Math.floor(index / 2) * 60

      createWidget(widget.BUTTON, {
        x: posX, y: posY, w: 75, h: 50, radius: 25,
        normal_color: 0xFF9500, press_color: 0xCC7600,
        text: act, text_size: 20, color: 0xFFFFFF
      }).addEventListener(widget.EDGE_EVENT.TAP, () => {
        this.state.action = act
        updateDisplay()
      })
    })

    // 5. Кнопка полного сброса (Красная)
    createWidget(widget.BUTTON, {
      x: 16, y: 380, w: 160, h: 50, radius: 10,
      normal_color: 0xAA0000, press_color: 0x770000,
      text: 'СБРОС (С)', text_size: 18, color: 0xFFFFFF
    }).addEventListener(widget.EDGE_EVENT.TAP, () => {
      this.state.num1 = 0
      this.state.num2 = 0
      this.state.action = '+'
      this.state.result = 0
      display.setProperty(widget.prop.MORE, { text: '0 + 0 = 0' })
    })
  }
})