Skip to content
Snippets Groups Projects
Commit 0b5ff711 authored by echicken's avatar echicken
Browse files

Mouse support.

parent e2ce2364
No related branches found
No related tags found
No related merge requests found
......@@ -8,10 +8,12 @@ load('event-timer.js');
load('ansiedit.js');
const sauce_lib = load({}, 'sauce_lib.js');
if(bbs.mods.avatar_lib)
if (bbs.mods.avatar_lib) {
avatar_lib = bbs.mods.avatar_lib;
else
} else {
avatar_lib = load({}, 'avatar_lib.js');
}
require("mouse_getkey.js", "mouse_getkey");
const ansiterm = load({}, 'ansiterm_lib.js');
const BORDER = [ BLUE, LIGHTBLUE, CYAN, LIGHTCYAN, WHITE ];
......@@ -92,6 +94,11 @@ Frame.prototype.blit = function (bin, w, h, x, y, str, sc) {
}
}
function mouse_enable(enable) {
if (!console.term_supports(USER_ANSI)) return;
ansiterm.send('mouse', enable ? 'set' : 'clear', 'normal_tracking');
}
function bury_cursor() {
console.gotoxy(console.screen_columns, console.screen_rows);
}
......@@ -167,12 +174,10 @@ function CollectionBrowser(filename, parent_frame) {
}
function draw_collection(offset) {
const f = new File(filename);
f.open('rb');
const avatars = f.read();
f.close();
var x = 1, y = 2;
for (var a = 0; a < collection.count; a++) {
frames.container.blit(avatars.substr(a * avatar_lib.size, avatar_lib.size), avatar_lib.defs.width, avatar_lib.defs.height, x, y, collection.descriptions[a], WHITE);
......@@ -182,9 +187,7 @@ function CollectionBrowser(filename, parent_frame) {
y += avatar_lib.defs.height + 2;
}
}
highlight();
}
function highlight() {
......@@ -243,53 +246,79 @@ function CollectionBrowser(filename, parent_frame) {
this.getcmd = function (cmd) {
var ret = null;
switch (cmd.toLowerCase()) {
case KEY_LEFT:
if (cmd.mouse !== null && cmd.mouse.press && cmd.mouse.x >= frames.container.x && cmd.mouse.x < frames.container.x + frames.container.width && cmd.mouse.y >= frames.container.y && cmd.mouse.y < frames.container.y + frames.container.height) {
if (cmd.mouse.button == 0) {
var mx = cmd.mouse.x - frames.container.x;
var my = cmd.mouse.y - frames.container.y;
var mcol = Math.min(Math.floor(mx / (avatar_lib.defs.width + 2)), state.cols);
var mrow = Math.min(Math.floor(my / (avatar_lib.defs.height + 2)), state.rows);
var sel = (mcol + (state.cols * mrow));
if (sel < collection.count) {
state.selected = sel;
highlight();
flashy_flashy();
ret = state.selected;
}
} else if (cmd.mouse.button == 64) {
if (state.selected > 0) {
state.selected--;
highlight();
}
break;
case KEY_RIGHT:
} else if (cmd.mouse.button == 65) {
if (state.selected < collection.count - 1) {
state.selected++;
highlight();
}
break;
case KEY_UP:
if (state.selected - state.cols >= 0) {
state.selected -= state.cols;
highlight();
}
break;
case KEY_DOWN:
if (state.selected + state.cols < collection.count) {
state.selected += state.cols;
highlight();
}
break;
case KEY_HOME:
if (state.selected > 0) {
state.selected = 0;
highlight();
}
break;
case KEY_END:
if (state.selected < collection.count - 1) {
state.selected = collection.count - 1;
highlight();
}
break;
case '\r':
case '\n':
flashy_flashy();
ret = state.selected;
break;
case 'q':
ret = -1;
break;
default:
break;
}
} else {
switch (cmd.key.toLowerCase()) {
case KEY_LEFT:
if (state.selected > 0) {
state.selected--;
highlight();
}
break;
case KEY_RIGHT:
if (state.selected < collection.count - 1) {
state.selected++;
highlight();
}
break;
case KEY_UP:
if (state.selected - state.cols >= 0) {
state.selected -= state.cols;
highlight();
}
break;
case KEY_DOWN:
if (state.selected + state.cols < collection.count) {
state.selected += state.cols;
highlight();
}
break;
case KEY_HOME:
if (state.selected > 0) {
state.selected = 0;
highlight();
}
break;
case KEY_END:
if (state.selected < collection.count - 1) {
state.selected = collection.count - 1;
highlight();
}
break;
case '\r':
case '\n':
flashy_flashy();
ret = state.selected;
break;
case 'q':
ret = -1;
break;
default:
break;
}
}
return ret;
}
......@@ -405,7 +434,7 @@ function CollectionLister(dir, parent_frame) {
state.tree.colors.kfg = LIGHTCYAN;
var first_collection = null;
directory(dir + '/*.bin').forEach(
function (e, i) {
function (e) {
if (e.search(EXCLUDE_FILES) > -1) return;
const sauce = sauce_lib.read(e);
if (!sauce) return;
......@@ -452,20 +481,20 @@ function CollectionLister(dir, parent_frame) {
state.collection = null;
}
} else {
if (cmd.toLowerCase() == 'q') {
if (cmd.key.toLowerCase() == 'q') {
return false;
} else if (cmd == KEY_LEFT) {
} else if (cmd.key == KEY_LEFT) {
var num_avatars = Math.floor(state.tree.currentItem.sauce.filesize / avatar_lib.size);
state.preview = state.preview - 1;
if (state.preview < 0) state.preview = num_avatars - 1;
display_preview(state.tree.currentItem.file, state.preview);
} else if (cmd == KEY_RIGHT) {
} else if (cmd.key == KEY_RIGHT) {
var num_avatars = Math.floor(state.tree.currentItem.sauce.filesize / avatar_lib.size);
state.preview = (state.preview + 1) % num_avatars;
display_preview(state.tree.currentItem.file, state.preview);
} else if (
(state.tree.index > 0 || cmd != KEY_UP) &&
(state.tree.index < state.tree.items.length - 1 || cmd != KEY_DOWN) &&
(state.tree.index > 0 || cmd.key != KEY_UP) &&
(state.tree.index < state.tree.items.length - 1 || cmd.key != KEY_DOWN) &&
state.tree.getcmd(cmd)
) {
frames.info.clear();
......@@ -565,7 +594,7 @@ function AvatarEditor(parent_frame, on_exit) {
}
this.getcmd = function (cmd) {
editor.getcmd(cmd);
editor.getcmd(cmd.key);
}
this.cycle = function () {
......@@ -589,22 +618,22 @@ function MainMenu(parent_frame) {
const user_fname = avatar_lib.localuser_fname(user.number);
const frames = {
parent : parent_frame,
container : null,
tree : null,
info : null,
user_avatar : null
parent: parent_frame,
container: null,
tree: null,
info: null,
user_avatar: null
};
const state = {
ae : null,
cl : null,
tree : null,
ed_item : null,
timer : new Timer(),
utime : file_exists(user_fname) ? file_date(user_fname) : -1,
user_avatar : null,
opt_out_item : null
ae: null,
cl: null,
tree: null,
ed_item: null,
timer: new Timer(),
utime: file_exists(user_fname) ? file_date(user_fname) : -1,
user_avatar: null,
opt_out_item: null
};
function load_user_avatar() {
......@@ -618,11 +647,9 @@ function MainMenu(parent_frame) {
'My Avatar', WHITE
);
state.user_avatar = {};
Object.keys(user_avatar).forEach(
function (e) {
if (e !== 'data') state.user_avatar[e] = user_avatar[e];
}
);
Object.keys(user_avatar).forEach(function (e) {
if (e !== 'data') state.user_avatar[e] = user_avatar[e];
});
if (state.user_avatar.disabled) {
for (var y = 1; y < frames.user_avatar.data.length - 2; y++) {
if (!Array.isArray(frames.user_avatar.data[y])) continue;
......@@ -710,51 +737,40 @@ function MainMenu(parent_frame) {
state.tree.colors.lfg = WHITE;
state.tree.colors.lbg = BG_BLUE;
state.tree.colors.kfg = LIGHTCYAN;
state.tree.addItem(
'Select an avatar', function () {
state.tree.close();
state.cl = new CollectionLister(avatar_lib.local_library(), frames.parent);
state.cl.open();
}
);
state.tree.addItem(
'Upload an avatar', function () {
console.clear(WHITE);
console.putmsg('Your avatar must be 10 x 6 characters in size and saved in binary format.\r\n');
if (upload_avatar()) {
console.putmsg('Your avatar has been updated.');
} else {
console.putmsg('An error was encountered. Your avatar has nto been updated.');
}
console.clear(LIGHTGRAY);
frames.parent.invalidate();
}
);
state.tree.addItem(
'Download your avatar', function () {
console.clear(WHITE);
console.putmsg(
'Avatars are ' +
avatar_lib.defs.width + ' x ' + avatar_lib.defs.height +
' characters in size, and are sent in binary format.\r\n'
);
download_avatar();
console.clear(LIGHTGRAY);
frames.parent.invalidate();
}
);
state.tree.addItem(
'Edit your avatar', function () {
state.ae = new AvatarEditor(
frames.parent,
function () {
state.ae.close();
state.ae = null;
}
);
state.ae.open();
state.tree.addItem('Select an avatar', function () {
state.tree.close();
state.cl = new CollectionLister(avatar_lib.local_library(), frames.parent);
state.cl.open();
});
state.tree.addItem('Upload an avatar', function () {
console.clear(WHITE);
console.putmsg('Your avatar must be 10 x 6 characters in size and saved in binary format.\r\n');
if (upload_avatar()) {
console.putmsg('Your avatar has been updated.');
} else {
console.putmsg('An error was encountered. Your avatar has nto been updated.');
}
);
console.clear(LIGHTGRAY);
frames.parent.invalidate();
});
state.tree.addItem('Download your avatar', function () {
console.clear(WHITE);
console.putmsg(
'Avatars are ' +
avatar_lib.defs.width + ' x ' + avatar_lib.defs.height +
' characters in size, and are sent in binary format.\r\n'
);
download_avatar();
console.clear(LIGHTGRAY);
frames.parent.invalidate();
});
state.tree.addItem('Edit your avatar', function () {
state.ae = new AvatarEditor(frames.parent, function () {
state.ae.close();
state.ae = null;
});
state.ae.open();
});
state.ed_item = state.tree.addItem(
tree_strings[state.user_avatar !== null && state.user_avatar.disabled ? 'enable' : 'disable'],
enable_disable
......@@ -762,14 +778,12 @@ function MainMenu(parent_frame) {
if (state.user_avatar === null) {
state.ed_item.disable();
state.ed_item.hide();
state.opt_out_item = state.tree.addItem(
"I don't want an avatar", function () {
avatar_lib.update_localuser(user.number, '');
avatar_lib.enable_localuser(user.number, false);
state.opt_out_item.hide();
state.tree.getcmd(KEY_UP);
}
);
state.opt_out_item = state.tree.addItem("I don't want an avatar", function () {
avatar_lib.update_localuser(user.number, '');
avatar_lib.enable_localuser(user.number, false);
state.opt_out_item.hide();
state.tree.getcmd(KEY_UP);
});
}
state.tree.open();
......@@ -792,7 +806,7 @@ function MainMenu(parent_frame) {
state.opt_out_item.hide();
}
}
} else if (cmd.toLowerCase() == 'q') {
} else if (cmd.key.toLowerCase() == 'q') {
return false;
} else {
state.tree.getcmd(cmd);
......@@ -821,18 +835,21 @@ function MainMenu(parent_frame) {
var sys_status, console_attr;
function init() {
sys_status = bbs.sys_status;
console_attr = console.attributes;
bbs.sys_status|=SS_MOFF;
console.clear(LIGHTGRAY);
ansiterm.send("ext_mode", "clear", "cursor");
js.on_exit("console.ctrlkey_passthru = " + console.ctrlkey_passthru);
js.on_exit("ansiterm.send('ext_mode', 'set', 'cursor')");
js.on_exit("mouse_enable(false);");
js.on_exit("bbs.sys_status = " + bbs.sys_status + ";");
js.on_exit("console.attributes = " + console.attributes + ";");
js.on_exit("console.clear();");
console.ctrlkey_passthru|=(1<<11); // Disable Ctrl-K handling in sbbs
console.ctrlkey_passthru|=(1<<16); // Disable Ctrl-P handling in sbbs
console.ctrlkey_passthru|=(1<<20); // Disable Ctrl-T handling in sbbs
console.ctrlkey_passthru|=(1<<21); // Disable Ctrl-U handling in sbbs
console.ctrlkey_passthru|=(1<<26); // Disable Ctrl-Z handling in sbbs
mouse_enable(true);
}
function main() {
......@@ -848,8 +865,8 @@ function main() {
const menu = new MainMenu(frame);
menu.open();
while (true) {
var i = console.inkey(K_NONE);
if (i !== '' && !menu.getcmd(i)) break;
var i = mouse_getkey(K_NONE, 5, true); //console.inkey(K_NONE);
if (!menu.getcmd(i)) break;
menu.cycle();
if (frame.cycle()) bury_cursor();
}
......@@ -858,12 +875,5 @@ function main() {
}
function clean_up() {
bbs.sys_status = sys_status;
console.attributes = console_attr;
console.clear();
}
init();
main();
clean_up();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment