Hhwx1163501整改版权头
51db117d创建于 2023年12月18日历史提交
/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

const { X2DFast } = require('./graphics/X2DFast');
const { Scr } = require('./XDefine');
const { XTools } = require('./XTools');

class RightMenu {
  static backgroundImg_ = -1;
  static backgroundCut_ = -1;

  static popItemFocusImg_ = -1;
  static popItemFocusCut_ = -1;
  static MENU = null;
  static PADDING = 16;
  static FOCUS_ITEM_MARGIN = 4;
  static FOCUS_ITEM_HEIGHT = 32;
  static TEXT_SIZE = 14;
  static isDarkBackground_ = true;
  static Reset(detail, x, y) {
    RightMenu.MENU = {
      x: x == null ? XTools.MOUSE_POS.x : x,
      y: y == null ? XTools.MOUSE_POS.y : y,
      detail: detail,
      needClose: false,
    };
  }
  static Append(detail) {
    if (RightMenu.MENU) {
      RightMenu.MENU.detail.push(...detail);
    }
  }
  static Button(icon, name, hootkey, callback) {
    return {
      type: 0,
      icon: icon,
      name: name,
      hk: hootkey,
      cb: () => {
        callback(this);
        RightMenu.close();
      },
    };
  }
  static Group(icon, name, objs) {
    return {
      type: 1,
      icon: icon,
      name: name,
      open: false,
      group: objs,
    };
  }
  static Gap() {
    return {
      type: 2,
    };
  }
  static close() {
    if (RightMenu.MENU) {
      RightMenu.MENU.needClose = true;
    }
  }
  static Draw() {
    if (RightMenu.MENU) {
      RightMenu.DrawGroup(
        RightMenu.MENU.detail,
        RightMenu.MENU.x,
        RightMenu.MENU.y
      );
      if (RightMenu.MENU.needClose) {
        RightMenu.MENU = null;
      }
    }
  }
  static MENUW = 155;
  static DrawGroup(grp, x, y) {
    let w = RightMenu.MENUW;
    let l = 0;
    for (let e of grp) {
      if (e.type != 2) {
        l += 1;
      }
    }
    if (grp.length == 3) {
      X2DFast.px2f.drawCut(this.backgroundCut_, x, y, 1, 0.88, 0, -1, -1);
    } else if (grp.length == 1) {
      X2DFast.px2f.drawCut(this.backgroundCut_, x, y, 1, 0.3, 0, -1, -1);
    } else {
      X2DFast.px2f.drawCut(this.backgroundCut_, x, y, 1, 1, 0, -1, -1);
    }
    for (let e of grp) {
      e.rect = [x, y, w, 32];
      if (e.on) {
        X2DFast.px2f.drawCut(
          this.popItemFocusCut_,
          x + RightMenu.FOCUS_ITEM_MARGIN,
          y
        );
      }
      if (e.type == 2) {
        e.rect = [x, y, w, 0];
        X2DFast.px2f.drawLine(x, y, x + w, y, 0xff808080, 2);
        continue;
      }
      let OFFY_ = y + RightMenu.FOCUS_ITEM_HEIGHT / 2 - RightMenu.TEXT_SIZE / 2;
      let textColor = this.isDarkBackground_ ? 0xffffffff : 0xff000000;
      X2DFast.px2f.drawText(
        e.name,
        RightMenu.TEXT_SIZE,
        x + RightMenu.PADDING,
        OFFY_,
        1,
        1,
        0,
        0,
        0,
        textColor
      );
      if (e.type == 0) {
        if (e.hk) {
          X2DFast.px2f.drawText(
            e.hk,
            RightMenu.TEXT_SIZE,
            x + w,
            OFFY_,
            1,
            1,
            0,
            -3,
            -2,
            0xff808080
          );
        }
      } else if (e.type == 1) {
        if (e.open) {
          X2DFast.px2f.drawText(
            '<',
            RightMenu.TEXT_SIZE,
            x + w,
            OFFY_,
            1,
            1,
            0,
            -3,
            -2,
            textColor
          );
          RightMenu.DrawGroup(e.group, x + w, y);
        } else {
          X2DFast.px2f.drawText(
            '>',
            RightMenu.TEXT_SIZE,
            x + w,
            OFFY_,
            1,
            1,
            0,
            -3,
            -2,
            textColor
          );
        }
      }
      y += 32;
    }
  }
  static Touch(msg, x, y) {
    if (RightMenu.MENU) {
      if (RightMenu.TouchGroup(RightMenu.MENU.detail, msg, x, y)) {
        return true;
      } else if (msg != 2) {
        RightMenu.MENU.needClose = true;
      }
    }
    return false;
  }

  isClicked() {
    if (this.clicked_) {
      this.clicked_ = false;
      return true;
    }
    return false;
  }

  static TouchGroup(grp, msg, x, y) {
    for (let e of grp) {
      e.on = false;
    }
    for (let e of grp) {
      if (!e.rect) {
        return false;
      }
      if (XTools.InRect(x, y, ...e.rect)) {
        if (e.type == 1 && msg == 1) {
          e.open = !e.open;
        }
        if (e.type == 2) {
        }
        if (e.type == 0) {
          if (msg == 1) {
            e.cb();
          }
        }
        e.on = true;
        return true;
      }
      if (e.type == 1) {
        if (e.open && RightMenu.TouchGroup(e.group, msg, x, y)) {
          return true;
        }
      }
    }
    return false;
  }
}

module.exports = {
  RightMenu,
};