Tim Young
84685e3bd4
editor was madly messing up crlf and whatnot. Changed it to be lf since that is what we had started with.
225 lines
7.5 KiB
JavaScript
225 lines
7.5 KiB
JavaScript
//This file pertains to the textwindow.
|
|
//We use this for displaying a puzzle's starting instructions
|
|
//and for choosing new puzzles.
|
|
|
|
var tmOutsideYMargin=20; //How far from the top and bottom left blank
|
|
var tmOutsideXMargin=20; //How far from right and left side left blank
|
|
var tmBorderWidth=4;
|
|
var tmMenuBarHight=20;
|
|
var tmScrollBarWidth=20;
|
|
var tmWindowBackground="grey";
|
|
var tmTextHeight; //Calculated when we build the page
|
|
var tmLastHighlightedIndex=-1;
|
|
var tmTextYGap=5; //The gap between lines
|
|
var tmPuzzleSelectMenuLevel=0;
|
|
|
|
var cachedTextMenuCanvas = null;
|
|
|
|
|
|
//Print the textmenu
|
|
function textMenuPrint(TextToPrint, selectedindex = -1, highlightedindex = -1)
|
|
{
|
|
//It would be nice to print it on top of whatever is currently there.
|
|
//But we will do that later.
|
|
PrintScreen(0); //Print the network, then we can lay over it
|
|
|
|
if(cachedTextMenuCanvas == null)
|
|
{
|
|
cachedTextMenuCanvas = document.createElement('canvas');
|
|
cachedTextMenuCanvas.width = MainCanvas.width - (tmOutsideXMargin * 2);
|
|
cachedTextMenuCanvas.height = MainCanvas.height - (tmOutsideYMargin * 2);
|
|
}
|
|
//If we get here, it is already created. Get the context
|
|
var cTMCctx = cachedTextMenuCanvas.getContext('2d');
|
|
var rect;
|
|
|
|
//Fill in the background
|
|
cTMCctx.fillStyle = tmWindowBackground;
|
|
cTMCctx.fillRect(0,0, cachedTextMenuCanvas.width, cachedTextMenuCanvas.height);
|
|
|
|
//Put the X there so we can click on it
|
|
rect = makeRectangle(cachedTextMenuCanvas.width - tmScrollBarWidth, 0, tmScrollBarWidth, tmMenuBarHight, tmOutsideXMargin, tmOutsideYMargin);
|
|
cTMCctx.drawImage(imageFromName("x"), rect.sx, rect.sy, rect.deltax, rect.deltay);
|
|
registerActionStruct("square", rect, null, textwindow_XClick);
|
|
|
|
|
|
//Put the DownArrow there so we can click on it
|
|
cTMCctx.drawImage(imageFromName("ArrowUp"),cachedTextMenuCanvas.width - tmScrollBarWidth,tmMenuBarHight,tmScrollBarWidth,tmMenuBarHight);
|
|
|
|
//Put the X there so we can click on it
|
|
cTMCctx.drawImage(imageFromName("ArrowDown"),cachedTextMenuCanvas.width - tmScrollBarWidth,cachedTextMenuCanvas.height - tmMenuBarHight,tmScrollBarWidth,tmMenuBarHight);
|
|
|
|
//Create and Draw the menu bar
|
|
cTMCctx.beginPath();
|
|
cTMCctx.moveTo(cachedTextMenuCanvas.width - tmScrollBarWidth,0);
|
|
cTMCctx.lineTo(cachedTextMenuCanvas.width - tmScrollBarWidth,cachedTextMenuCanvas.height);
|
|
cTMCctx.strokeStyle="white";
|
|
cTMCctx.stroke();
|
|
|
|
//horizontal line under the X
|
|
cTMCctx.beginPath();
|
|
cTMCctx.moveTo(cachedTextMenuCanvas.width - tmScrollBarWidth,tmMenuBarHight);
|
|
cTMCctx.lineTo(cachedTextMenuCanvas.width,tmMenuBarHight);
|
|
cTMCctx.strokeStyle="white";
|
|
cTMCctx.stroke();
|
|
|
|
var cachedTextMenuTextCanvas = document.createElement('canvas');
|
|
//Figure out how much space we need. - start with a simple canvas (non expandable)
|
|
|
|
cachedTextMenuTextCanvas.width = cachedTextMenuCanvas.width - tmScrollBarWidth;
|
|
cachedTextMenuTextCanvas.height = cachedTextMenuCanvas.height;
|
|
|
|
var cTMTCctx = cachedTextMenuTextCanvas.getContext('2d');
|
|
|
|
cTMTCctx.strokeStyle="black";
|
|
cTMTCctx.font = "20px serif";
|
|
|
|
var lines = [];
|
|
if(typeof(TextToPrint) === "string")
|
|
lines = fragmentTextIntoLines(cTMTCctx, TextToPrint, cachedTextMenuTextCanvas.width - 10);
|
|
else
|
|
lines = TextToPrint; //If we passed in a list of strings
|
|
//Now we have the number of lines.
|
|
var metrics = cTMTCctx.measureText("test");
|
|
var yHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent + tmTextYGap; //the hight of the default font and gap
|
|
tmTextHeight = yHeight; //store it for use in highlighting
|
|
//console.log("Height = "+yHeight);
|
|
|
|
var totalHeight = (lines.length * yHeight) + tmTextYGap;
|
|
|
|
if(cachedTextMenuTextCanvas.height < totalHeight) cachedTextMenuTextCanvas.height = totalHeight;// resize if needed
|
|
|
|
//Highlight text
|
|
if (highlightedindex >= 0)
|
|
{
|
|
//console.log("Showing hilighted index " + highlightedindex);
|
|
//Fill in the area highlighted
|
|
cTMTCctx.fillStyle = "white";
|
|
cTMTCctx.globalAlpha = 0.3; //mostly transparent
|
|
cTMTCctx.fillRect(0,highlightedindex * yHeight + (yHeight/3), cachedTextMenuCanvas.width, yHeight);
|
|
cTMTCctx.globalAlpha = 1.0; //reset
|
|
}
|
|
|
|
//Chosen text
|
|
if (selectedindex >= 0)
|
|
{
|
|
//console.log("Showing selected index " + selectedindex + " " + yHeight);
|
|
//Fill in the area highlighted
|
|
cTMTCctx.fillStyle = "green";
|
|
cTMTCctx.globalAlpha = 0.4; //mostly transparent
|
|
cTMTCctx.fillRect(0,selectedindex * yHeight + (yHeight/3), cachedTextMenuCanvas.width, yHeight);
|
|
cTMTCctx.globalAlpha = 1.0; //reset
|
|
}
|
|
|
|
cTMTCctx.fillStyle = "black";
|
|
cTMTCctx.strokeStyle="black";
|
|
|
|
|
|
//Now, print text on the canvas.
|
|
for (var i = 0; i < lines.length; i++)
|
|
{
|
|
cTMTCctx.fillText(lines[i], 5, ((i+1) * yHeight));
|
|
//console.log("printing text part: " + lines[i]);
|
|
}
|
|
|
|
//Write the text canvas on the main canvas. If we are scrolled up or down, do that.
|
|
cTMCctx.drawImage(cachedTextMenuTextCanvas,0,0);
|
|
|
|
//create and Draw the scroll-bar on the side
|
|
//Then make the text if we have not done so
|
|
//Finally print on top of the main canvas
|
|
MainCanvas_ctx.globalAlpha = 0.9; //some transparancy
|
|
MainCanvas_ctx.drawImage(cachedTextMenuCanvas,tmOutsideXMargin, tmOutsideYMargin)
|
|
MainCanvas_ctx.globalAlpha = 1; //reset transparancy
|
|
}
|
|
|
|
|
|
function fragmentTextIntoLines(ctx, text, maxWidth) {
|
|
var words = text.split(" ");
|
|
var lines = [];
|
|
var currentLine = words[0];
|
|
|
|
for (var i = 1; i < words.length; i++) {
|
|
var word = words[i];
|
|
var width = ctx.measureText(currentLine + " " + word).width;
|
|
if (width < maxWidth) {
|
|
currentLine += " " + word;
|
|
} else {
|
|
lines.push(currentLine);
|
|
currentLine = word;
|
|
}
|
|
}
|
|
lines.push(currentLine);
|
|
return lines;
|
|
}
|
|
|
|
function TextWindow_handleMouseUp(evt)
|
|
{
|
|
console.log("TextWindow Mouse Up");
|
|
//If we get here, it is a mouse-click event. See if we are on the X
|
|
if(mouseDownLocation.pageX + tmScrollBarWidth >= cachedTextMenuCanvas.width - tmScrollBarWidth)
|
|
{
|
|
console.log("TextWindow Mouse Up - X fits");
|
|
|
|
//The X fits. Now, see which button, or scroll-bar we clicked on.
|
|
if(mouseDownLocation.pageY - tmOutsideYMargin <= tmMenuBarHight
|
|
&& mouseDownLocation.pageY - tmOutsideYMargin >= 0)
|
|
{
|
|
console.log("TextWindow Mouse Up - Y fits");
|
|
|
|
//We clicked the X
|
|
|
|
textwindow_XClick();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(uiMode == 2)
|
|
{
|
|
//We are in puzzle-select mode and clicked somewhere.
|
|
var levellist=networkNamesMatchingText("Level"+tmPuzzleSelectMenuLevel);
|
|
if(tmLastHighlightedIndex>=0 && tmLastHighlightedIndex< levellist.length)
|
|
{
|
|
//We found a puzzle
|
|
console.log("Clicked on puzzle: " + levellist[tmLastHighlightedIndex]);
|
|
uiMode=1;
|
|
switchPuzzle(levellist[tmLastHighlightedIndex]);
|
|
|
|
}
|
|
}
|
|
}
|
|
mouseDidMovement=false; //reset it after we raise the button
|
|
}
|
|
|
|
function textwindow_XClick(point, object) {
|
|
//When the x is clicked, we do not care about the position or object. There is no object
|
|
//Dispose of the text window
|
|
uiMode = 0;
|
|
|
|
//dispose of temp canvas; will recreate later if needed
|
|
cachedTextMenuCanvas = null;
|
|
cachedTextMenuTextCanvas = null;
|
|
|
|
//Redraw the screen
|
|
PrintScreen();
|
|
}
|
|
|
|
function PrintPuzzleSelectMenu(level=0)
|
|
{
|
|
var levellist=networkNamesMatchingText("Level"+level);
|
|
//console.log("list is this long: " + levellist.length);
|
|
textMenuPrint(levellist, -1, tmLastHighlightedIndex);
|
|
tmPuzzleSelectMenuLevel=level;
|
|
}
|
|
|
|
function textMenu_HandleMouseMove(evt)
|
|
{
|
|
var highlighted_index = Math.floor(((evt.pageY - tmOutsideYMargin) - (tmTextHeight/3)) / tmTextHeight);
|
|
if(tmLastHighlightedIndex != highlighted_index)
|
|
{
|
|
//the index has changed
|
|
console.log("index = " + highlighted_index);
|
|
tmLastHighlightedIndex = highlighted_index;
|
|
PrintPuzzleSelectMenu(tmPuzzleSelectMenuLevel);
|
|
}
|
|
} |