14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ciconst { X2DFast } = require('./graphics/X2DFast');
174514f5e3Sopenharmony_ciconst { Scr } = require('./XDefine');
184514f5e3Sopenharmony_ciconst { XTools } = require('./XTools');
194514f5e3Sopenharmony_ci
204514f5e3Sopenharmony_ciclass RightMenu {
214514f5e3Sopenharmony_ci  static backgroundImg_ = -1;
224514f5e3Sopenharmony_ci  static backgroundCut_ = -1;
234514f5e3Sopenharmony_ci
244514f5e3Sopenharmony_ci  static popItemFocusImg_ = -1;
254514f5e3Sopenharmony_ci  static popItemFocusCut_ = -1;
264514f5e3Sopenharmony_ci  static MENU = null;
274514f5e3Sopenharmony_ci  static PADDING = 16;
284514f5e3Sopenharmony_ci  static FOCUS_ITEM_MARGIN = 4;
294514f5e3Sopenharmony_ci  static FOCUS_ITEM_HEIGHT = 32;
304514f5e3Sopenharmony_ci  static TEXT_SIZE = 14;
314514f5e3Sopenharmony_ci  static isDarkBackground_ = true;
324514f5e3Sopenharmony_ci  static Reset(detail, x, y) {
334514f5e3Sopenharmony_ci    RightMenu.MENU = {
344514f5e3Sopenharmony_ci      x: x == null ? XTools.MOUSE_POS.x : x,
354514f5e3Sopenharmony_ci      y: y == null ? XTools.MOUSE_POS.y : y,
364514f5e3Sopenharmony_ci      detail: detail,
374514f5e3Sopenharmony_ci      needClose: false,
384514f5e3Sopenharmony_ci    };
394514f5e3Sopenharmony_ci  }
404514f5e3Sopenharmony_ci  static Append(detail) {
414514f5e3Sopenharmony_ci    if (RightMenu.MENU) {
424514f5e3Sopenharmony_ci      RightMenu.MENU.detail.push(...detail);
434514f5e3Sopenharmony_ci    }
444514f5e3Sopenharmony_ci  }
454514f5e3Sopenharmony_ci  static Button(icon, name, hootkey, callback) {
464514f5e3Sopenharmony_ci    return {
474514f5e3Sopenharmony_ci      type: 0,
484514f5e3Sopenharmony_ci      icon: icon,
494514f5e3Sopenharmony_ci      name: name,
504514f5e3Sopenharmony_ci      hk: hootkey,
514514f5e3Sopenharmony_ci      cb: () => {
524514f5e3Sopenharmony_ci        callback(this);
534514f5e3Sopenharmony_ci        RightMenu.close();
544514f5e3Sopenharmony_ci      },
554514f5e3Sopenharmony_ci    };
564514f5e3Sopenharmony_ci  }
574514f5e3Sopenharmony_ci  static Group(icon, name, objs) {
584514f5e3Sopenharmony_ci    return {
594514f5e3Sopenharmony_ci      type: 1,
604514f5e3Sopenharmony_ci      icon: icon,
614514f5e3Sopenharmony_ci      name: name,
624514f5e3Sopenharmony_ci      open: false,
634514f5e3Sopenharmony_ci      group: objs,
644514f5e3Sopenharmony_ci    };
654514f5e3Sopenharmony_ci  }
664514f5e3Sopenharmony_ci  static Gap() {
674514f5e3Sopenharmony_ci    return {
684514f5e3Sopenharmony_ci      type: 2,
694514f5e3Sopenharmony_ci    };
704514f5e3Sopenharmony_ci  }
714514f5e3Sopenharmony_ci  static close() {
724514f5e3Sopenharmony_ci    if (RightMenu.MENU) {
734514f5e3Sopenharmony_ci      RightMenu.MENU.needClose = true;
744514f5e3Sopenharmony_ci    }
754514f5e3Sopenharmony_ci  }
764514f5e3Sopenharmony_ci  static Draw() {
774514f5e3Sopenharmony_ci    if (RightMenu.MENU) {
784514f5e3Sopenharmony_ci      RightMenu.DrawGroup(
794514f5e3Sopenharmony_ci        RightMenu.MENU.detail,
804514f5e3Sopenharmony_ci        RightMenu.MENU.x,
814514f5e3Sopenharmony_ci        RightMenu.MENU.y
824514f5e3Sopenharmony_ci      );
834514f5e3Sopenharmony_ci      if (RightMenu.MENU.needClose) {
844514f5e3Sopenharmony_ci        RightMenu.MENU = null;
854514f5e3Sopenharmony_ci      }
864514f5e3Sopenharmony_ci    }
874514f5e3Sopenharmony_ci  }
884514f5e3Sopenharmony_ci  static MENUW = 155;
894514f5e3Sopenharmony_ci  static DrawGroup(grp, x, y) {
904514f5e3Sopenharmony_ci    let w = RightMenu.MENUW;
914514f5e3Sopenharmony_ci    let l = 0;
924514f5e3Sopenharmony_ci    for (let e of grp) {
934514f5e3Sopenharmony_ci      if (e.type != 2) {
944514f5e3Sopenharmony_ci        l += 1;
954514f5e3Sopenharmony_ci      }
964514f5e3Sopenharmony_ci    }
974514f5e3Sopenharmony_ci    if (grp.length == 3) {
984514f5e3Sopenharmony_ci      X2DFast.px2f.drawCut(this.backgroundCut_, x, y, 1, 0.88, 0, -1, -1);
994514f5e3Sopenharmony_ci    } else if (grp.length == 1) {
1004514f5e3Sopenharmony_ci      X2DFast.px2f.drawCut(this.backgroundCut_, x, y, 1, 0.3, 0, -1, -1);
1014514f5e3Sopenharmony_ci    } else {
1024514f5e3Sopenharmony_ci      X2DFast.px2f.drawCut(this.backgroundCut_, x, y, 1, 1, 0, -1, -1);
1034514f5e3Sopenharmony_ci    }
1044514f5e3Sopenharmony_ci    for (let e of grp) {
1054514f5e3Sopenharmony_ci      e.rect = [x, y, w, 32];
1064514f5e3Sopenharmony_ci      if (e.on) {
1074514f5e3Sopenharmony_ci        X2DFast.px2f.drawCut(
1084514f5e3Sopenharmony_ci          this.popItemFocusCut_,
1094514f5e3Sopenharmony_ci          x + RightMenu.FOCUS_ITEM_MARGIN,
1104514f5e3Sopenharmony_ci          y
1114514f5e3Sopenharmony_ci        );
1124514f5e3Sopenharmony_ci      }
1134514f5e3Sopenharmony_ci      if (e.type == 2) {
1144514f5e3Sopenharmony_ci        e.rect = [x, y, w, 0];
1154514f5e3Sopenharmony_ci        X2DFast.px2f.drawLine(x, y, x + w, y, 0xff808080, 2);
1164514f5e3Sopenharmony_ci        continue;
1174514f5e3Sopenharmony_ci      }
1184514f5e3Sopenharmony_ci      let OFFY_ = y + RightMenu.FOCUS_ITEM_HEIGHT / 2 - RightMenu.TEXT_SIZE / 2;
1194514f5e3Sopenharmony_ci      let textColor = this.isDarkBackground_ ? 0xffffffff : 0xff000000;
1204514f5e3Sopenharmony_ci      X2DFast.px2f.drawText(
1214514f5e3Sopenharmony_ci        e.name,
1224514f5e3Sopenharmony_ci        RightMenu.TEXT_SIZE,
1234514f5e3Sopenharmony_ci        x + RightMenu.PADDING,
1244514f5e3Sopenharmony_ci        OFFY_,
1254514f5e3Sopenharmony_ci        1,
1264514f5e3Sopenharmony_ci        1,
1274514f5e3Sopenharmony_ci        0,
1284514f5e3Sopenharmony_ci        0,
1294514f5e3Sopenharmony_ci        0,
1304514f5e3Sopenharmony_ci        textColor
1314514f5e3Sopenharmony_ci      );
1324514f5e3Sopenharmony_ci      if (e.type == 0) {
1334514f5e3Sopenharmony_ci        if (e.hk) {
1344514f5e3Sopenharmony_ci          X2DFast.px2f.drawText(
1354514f5e3Sopenharmony_ci            e.hk,
1364514f5e3Sopenharmony_ci            RightMenu.TEXT_SIZE,
1374514f5e3Sopenharmony_ci            x + w,
1384514f5e3Sopenharmony_ci            OFFY_,
1394514f5e3Sopenharmony_ci            1,
1404514f5e3Sopenharmony_ci            1,
1414514f5e3Sopenharmony_ci            0,
1424514f5e3Sopenharmony_ci            -3,
1434514f5e3Sopenharmony_ci            -2,
1444514f5e3Sopenharmony_ci            0xff808080
1454514f5e3Sopenharmony_ci          );
1464514f5e3Sopenharmony_ci        }
1474514f5e3Sopenharmony_ci      } else if (e.type == 1) {
1484514f5e3Sopenharmony_ci        if (e.open) {
1494514f5e3Sopenharmony_ci          X2DFast.px2f.drawText(
1504514f5e3Sopenharmony_ci            '<',
1514514f5e3Sopenharmony_ci            RightMenu.TEXT_SIZE,
1524514f5e3Sopenharmony_ci            x + w,
1534514f5e3Sopenharmony_ci            OFFY_,
1544514f5e3Sopenharmony_ci            1,
1554514f5e3Sopenharmony_ci            1,
1564514f5e3Sopenharmony_ci            0,
1574514f5e3Sopenharmony_ci            -3,
1584514f5e3Sopenharmony_ci            -2,
1594514f5e3Sopenharmony_ci            textColor
1604514f5e3Sopenharmony_ci          );
1614514f5e3Sopenharmony_ci          RightMenu.DrawGroup(e.group, x + w, y);
1624514f5e3Sopenharmony_ci        } else {
1634514f5e3Sopenharmony_ci          X2DFast.px2f.drawText(
1644514f5e3Sopenharmony_ci            '>',
1654514f5e3Sopenharmony_ci            RightMenu.TEXT_SIZE,
1664514f5e3Sopenharmony_ci            x + w,
1674514f5e3Sopenharmony_ci            OFFY_,
1684514f5e3Sopenharmony_ci            1,
1694514f5e3Sopenharmony_ci            1,
1704514f5e3Sopenharmony_ci            0,
1714514f5e3Sopenharmony_ci            -3,
1724514f5e3Sopenharmony_ci            -2,
1734514f5e3Sopenharmony_ci            textColor
1744514f5e3Sopenharmony_ci          );
1754514f5e3Sopenharmony_ci        }
1764514f5e3Sopenharmony_ci      }
1774514f5e3Sopenharmony_ci      y += 32;
1784514f5e3Sopenharmony_ci    }
1794514f5e3Sopenharmony_ci  }
1804514f5e3Sopenharmony_ci  static Touch(msg, x, y) {
1814514f5e3Sopenharmony_ci    if (RightMenu.MENU) {
1824514f5e3Sopenharmony_ci      if (RightMenu.TouchGroup(RightMenu.MENU.detail, msg, x, y)) {
1834514f5e3Sopenharmony_ci        return true;
1844514f5e3Sopenharmony_ci      } else if (msg != 2) {
1854514f5e3Sopenharmony_ci        RightMenu.MENU.needClose = true;
1864514f5e3Sopenharmony_ci      }
1874514f5e3Sopenharmony_ci    }
1884514f5e3Sopenharmony_ci    return false;
1894514f5e3Sopenharmony_ci  }
1904514f5e3Sopenharmony_ci
1914514f5e3Sopenharmony_ci  isClicked() {
1924514f5e3Sopenharmony_ci    if (this.clicked_) {
1934514f5e3Sopenharmony_ci      this.clicked_ = false;
1944514f5e3Sopenharmony_ci      return true;
1954514f5e3Sopenharmony_ci    }
1964514f5e3Sopenharmony_ci    return false;
1974514f5e3Sopenharmony_ci  }
1984514f5e3Sopenharmony_ci
1994514f5e3Sopenharmony_ci  static TouchGroup(grp, msg, x, y) {
2004514f5e3Sopenharmony_ci    for (let e of grp) {
2014514f5e3Sopenharmony_ci      e.on = false;
2024514f5e3Sopenharmony_ci    }
2034514f5e3Sopenharmony_ci    for (let e of grp) {
2044514f5e3Sopenharmony_ci      if (!e.rect) {
2054514f5e3Sopenharmony_ci        return false;
2064514f5e3Sopenharmony_ci      }
2074514f5e3Sopenharmony_ci      if (XTools.InRect(x, y, ...e.rect)) {
2084514f5e3Sopenharmony_ci        if (e.type == 1 && msg == 1) {
2094514f5e3Sopenharmony_ci          e.open = !e.open;
2104514f5e3Sopenharmony_ci        }
2114514f5e3Sopenharmony_ci        if (e.type == 2) {
2124514f5e3Sopenharmony_ci        }
2134514f5e3Sopenharmony_ci        if (e.type == 0) {
2144514f5e3Sopenharmony_ci          if (msg == 1) {
2154514f5e3Sopenharmony_ci            e.cb();
2164514f5e3Sopenharmony_ci          }
2174514f5e3Sopenharmony_ci        }
2184514f5e3Sopenharmony_ci        e.on = true;
2194514f5e3Sopenharmony_ci        return true;
2204514f5e3Sopenharmony_ci      }
2214514f5e3Sopenharmony_ci      if (e.type == 1) {
2224514f5e3Sopenharmony_ci        if (e.open && RightMenu.TouchGroup(e.group, msg, x, y)) {
2234514f5e3Sopenharmony_ci          return true;
2244514f5e3Sopenharmony_ci        }
2254514f5e3Sopenharmony_ci      }
2264514f5e3Sopenharmony_ci    }
2274514f5e3Sopenharmony_ci    return false;
2284514f5e3Sopenharmony_ci  }
2294514f5e3Sopenharmony_ci}
2304514f5e3Sopenharmony_ci
2314514f5e3Sopenharmony_cimodule.exports = {
2324514f5e3Sopenharmony_ci  RightMenu,
2334514f5e3Sopenharmony_ci};
234