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