/* * 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, };