mirror of https://github.com/stella-emu/stella.git
Reworked overlaid messages in the framebuffer; you can now select the
region of the screen in a 9x9 grid (top/middle/bottom by left/center/right), as well as the color of the message text. Updated some strings on the ROM launcher, since it doesn't make sense to 'Play' a directory. Disabled display of 'Note' while in rom browse mode in the ROM launcher. It ends up taking too much CPU time to parse all the ROMs in a directory each time it changes, so there are now two options: (1) don't browse the filesystem, and precompute the folder contents/see all the ROM info or (2) browse the filesystem, allowing selection of folders, etc, but not seeing ROM names and notes as defined in the properties file. For performance reasons, it's going to have to be an either/or thing. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1056 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
0da30905ee
commit
79c815afc6
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: Console.cxx,v 1.86 2006-03-16 16:10:47 stephena Exp $
|
||||
// $Id: Console.cxx,v 1.87 2006-03-19 18:17:48 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -94,7 +94,8 @@ Console::Console(const uInt8* image, uInt32 size, const string& md5,
|
|||
iHeight = atoi(myProperties.get(Display_Height).c_str());
|
||||
if(iWidth > sWidth || iHeight > sHeight)
|
||||
{
|
||||
myOSystem->frameBuffer().showMessage("PAL ROMS not supported, screen too small");
|
||||
myOSystem->frameBuffer().showMessage("PAL ROMS not supported, screen too small",
|
||||
kMiddleCenter, kTextColorEm);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: FrameBuffer.cxx,v 1.82 2006-03-18 00:00:30 stephena Exp $
|
||||
// $Id: FrameBuffer.cxx,v 1.83 2006-03-19 18:17:48 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#include <sstream>
|
||||
|
@ -52,10 +52,7 @@ FrameBuffer::FrameBuffer(OSystem* osystem)
|
|||
myUsePhosphor(false),
|
||||
myPhosphorBlend(77),
|
||||
myFrameRate(0),
|
||||
myPauseStatus(false),
|
||||
myMessageTime(0),
|
||||
myMessageText(""),
|
||||
myNumRedraws(0)
|
||||
myPauseStatus(false)
|
||||
{
|
||||
myBaseDim.x = myBaseDim.y = myBaseDim.w = myBaseDim.h = 0;
|
||||
myImageDim = myScreenDim = myDesktopDim = myBaseDim;
|
||||
|
@ -143,7 +140,7 @@ void FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height,
|
|||
SDL_EnableUNICODE(1);
|
||||
|
||||
// Erase any messages from a previous run
|
||||
myMessageTime = 0;
|
||||
myMessage.counter = 0;
|
||||
|
||||
myUseDirtyRects = myOSystem->settings().getBool("dirtyrects");
|
||||
}
|
||||
|
@ -177,7 +174,7 @@ void FrameBuffer::update()
|
|||
drawMediaSource();
|
||||
|
||||
// Draw any pending messages
|
||||
if(myMessageTime > 0 && !myPauseStatus)
|
||||
if(myMessage.counter > 0 && !myPauseStatus)
|
||||
drawMessage();
|
||||
|
||||
break; // S_EMULATE
|
||||
|
@ -202,7 +199,7 @@ void FrameBuffer::update()
|
|||
myOSystem->commandMenu().draw();
|
||||
|
||||
// Draw any pending messages
|
||||
if(myMessageTime > 0 && !myPauseStatus)
|
||||
if(myMessage.counter > 0 && !myPauseStatus)
|
||||
drawMessage();
|
||||
break; // S_CMDMENU
|
||||
}
|
||||
|
@ -212,7 +209,7 @@ void FrameBuffer::update()
|
|||
myOSystem->launcher().draw();
|
||||
|
||||
// Draw any pending messages
|
||||
if(myMessageTime > 0)
|
||||
if(myMessage.counter > 0)
|
||||
drawMessage();
|
||||
|
||||
break; // S_LAUNCHER
|
||||
|
@ -239,50 +236,100 @@ void FrameBuffer::update()
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void FrameBuffer::showMessage(const string& message)
|
||||
void FrameBuffer::showMessage(const string& message, MessagePosition position,
|
||||
OverlayColor color)
|
||||
{
|
||||
// Erase old messages on the screen
|
||||
if(myMessageTime > 0)
|
||||
if(myMessage.counter > 0)
|
||||
{
|
||||
theRedrawTIAIndicator = true;
|
||||
myOSystem->eventHandler().refreshDisplay();
|
||||
}
|
||||
|
||||
myMessageText = message;
|
||||
myMessageTime = myFrameRate << 1; // Show message for 2 seconds
|
||||
// Precompute the message coordinates
|
||||
myMessage.text = message;
|
||||
myMessage.counter = myFrameRate << 1; // Show message for 2 seconds
|
||||
myMessage.color = color;
|
||||
|
||||
myMessage.w = myOSystem->font().getStringWidth(myMessage.text) + 10;
|
||||
myMessage.h = myOSystem->font().getFontHeight() + 8;
|
||||
|
||||
switch(position)
|
||||
{
|
||||
case kTopLeft:
|
||||
myMessage.x = 5;
|
||||
myMessage.y = 5;
|
||||
break;
|
||||
|
||||
case kTopCenter:
|
||||
myMessage.x = (myBaseDim.w >> 1) - (myMessage.w >> 1);
|
||||
myMessage.y = 5;
|
||||
break;
|
||||
|
||||
case kTopRight:
|
||||
myMessage.x = myBaseDim.w - myMessage.w - 5;
|
||||
myMessage.y = 5;
|
||||
break;
|
||||
|
||||
case kMiddleLeft:
|
||||
myMessage.x = 5;
|
||||
myMessage.y = (myBaseDim.h >> 1) - (myMessage.h >> 1);
|
||||
break;
|
||||
|
||||
case kMiddleCenter:
|
||||
myMessage.x = (myBaseDim.w >> 1) - (myMessage.w >> 1);
|
||||
myMessage.y = (myBaseDim.h >> 1) - (myMessage.h >> 1);
|
||||
break;
|
||||
|
||||
case kMiddleRight:
|
||||
myMessage.x = myBaseDim.w - myMessage.w - 5;
|
||||
myMessage.y = (myBaseDim.h >> 1) - (myMessage.h >> 1);
|
||||
break;
|
||||
|
||||
case kBottomLeft:
|
||||
myMessage.x = 5;//(myMessage.w >> 1);
|
||||
myMessage.y = myBaseDim.h - myMessage.h - 5;
|
||||
break;
|
||||
|
||||
case kBottomCenter:
|
||||
myMessage.x = (myBaseDim.w >> 1) - (myMessage.w >> 1);
|
||||
myMessage.y = myBaseDim.h - myMessage.h - 5;
|
||||
break;
|
||||
|
||||
case kBottomRight:
|
||||
myMessage.x = myBaseDim.w - myMessage.w - 5;
|
||||
myMessage.y = myBaseDim.h - myMessage.h - 5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void FrameBuffer::hideMessage()
|
||||
{
|
||||
// Erase old messages on the screen
|
||||
if(myMessageTime > 0)
|
||||
if(myMessage.counter > 0)
|
||||
myOSystem->eventHandler().refreshDisplay();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
inline void FrameBuffer::drawMessage()
|
||||
{
|
||||
int w = myOSystem->font().getStringWidth(myMessageText) + 10;
|
||||
int h = myOSystem->font().getFontHeight() + 8;
|
||||
int x = (myBaseDim.w >> 1) - (w >> 1);
|
||||
int y = myBaseDim.h - h - 10/2;
|
||||
|
||||
// Draw the bounded box and text
|
||||
fillRect(x+1, y+2, w-2, h-4, kBGColor);
|
||||
box(x, y+1, w, h-2, kColor, kColor);
|
||||
drawString(&myOSystem->font(), myMessageText, x+1, y+4, w, kTextColor, kTextAlignCenter);
|
||||
myMessageTime--;
|
||||
fillRect(myMessage.x+1, myMessage.y+2, myMessage.w-2, myMessage.h-4, kBGColor);
|
||||
box(myMessage.x, myMessage.y+1, myMessage.w, myMessage.h-2, kColor, kColor);
|
||||
drawString(&myOSystem->font(), myMessage.text, myMessage.x+1, myMessage.y+4,
|
||||
myMessage.w, myMessage.color, kTextAlignCenter);
|
||||
myMessage.counter--;
|
||||
|
||||
// Either erase the entire message (when time is reached),
|
||||
// or show again this frame
|
||||
if(myMessageTime == 0)
|
||||
if(myMessage.counter == 0)
|
||||
{
|
||||
// Force an immediate update
|
||||
myOSystem->eventHandler().refreshDisplay(true);
|
||||
}
|
||||
else
|
||||
addDirtyRect(x, y, w, h);
|
||||
addDirtyRect(myMessage.x, myMessage.y, myMessage.w, myMessage.h);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: FrameBuffer.hxx,v 1.66 2006-03-18 00:00:30 stephena Exp $
|
||||
// $Id: FrameBuffer.hxx,v 1.67 2006-03-19 18:17:48 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#ifndef FRAMEBUFFER_HXX
|
||||
|
@ -49,6 +49,19 @@ enum BufferType {
|
|||
kGLBuffer
|
||||
};
|
||||
|
||||
// Positions for onscreen/overlaid messages
|
||||
enum MessagePosition {
|
||||
kTopLeft,
|
||||
kTopCenter,
|
||||
kTopRight,
|
||||
kMiddleLeft,
|
||||
kMiddleCenter,
|
||||
kMiddleRight,
|
||||
kBottomLeft,
|
||||
kBottomCenter,
|
||||
kBottomRight
|
||||
};
|
||||
|
||||
/**
|
||||
This class encapsulates the MediaSource and is the basis for the video
|
||||
display in Stella. All graphics ports should derive from this class for
|
||||
|
@ -57,7 +70,7 @@ enum BufferType {
|
|||
All GUI elements (ala ScummVM) are drawn here as well.
|
||||
|
||||
@author Stephen Anthony
|
||||
@version $Id: FrameBuffer.hxx,v 1.66 2006-03-18 00:00:30 stephena Exp $
|
||||
@version $Id: FrameBuffer.hxx,v 1.67 2006-03-19 18:17:48 stephena Exp $
|
||||
*/
|
||||
class FrameBuffer
|
||||
{
|
||||
|
@ -94,8 +107,12 @@ class FrameBuffer
|
|||
Shows a message onscreen.
|
||||
|
||||
@param message The message to be shown
|
||||
@param position Onscreen position for the message
|
||||
@param color Color of text in the message
|
||||
*/
|
||||
void showMessage(const string& message);
|
||||
void showMessage(const string& message,
|
||||
MessagePosition position = kBottomCenter,
|
||||
OverlayColor color = kTextColor);
|
||||
|
||||
/**
|
||||
Hides any onscreen messages.
|
||||
|
@ -144,7 +161,7 @@ class FrameBuffer
|
|||
Indicates that the TIA area is dirty, and certain areas need
|
||||
to be redrawn.
|
||||
*/
|
||||
void refresh() { theRedrawTIAIndicator = true; myMessageTime = 0; }
|
||||
void refresh() { theRedrawTIAIndicator = true; }
|
||||
|
||||
/**
|
||||
Toggles between fullscreen and window mode.
|
||||
|
@ -494,15 +511,14 @@ class FrameBuffer
|
|||
// Indicates the current pause status
|
||||
bool myPauseStatus;
|
||||
|
||||
// Message timer
|
||||
Int32 myMessageTime;
|
||||
|
||||
// Message text
|
||||
string myMessageText;
|
||||
|
||||
// Indicates how many times the framebuffer has been redrawn
|
||||
// Used only for debugging purposes
|
||||
uInt32 myNumRedraws;
|
||||
// Used for onscreen messages
|
||||
struct Message {
|
||||
string text;
|
||||
int counter;
|
||||
int x, y, w, h;
|
||||
OverlayColor color;
|
||||
};
|
||||
Message myMessage;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -16,9 +16,11 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: MD5.cxx,v 1.3 2005-10-19 00:59:51 stephena Exp $
|
||||
// $Id: MD5.cxx,v 1.4 2006-03-19 18:17:48 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#include <fstream>
|
||||
|
||||
#include "MD5.hxx"
|
||||
|
||||
/*
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: LauncherDialog.cxx,v 1.47 2006-03-10 01:20:04 markgrebe Exp $
|
||||
// $Id: LauncherDialog.cxx,v 1.48 2006-03-19 18:17:48 stephena Exp $
|
||||
//
|
||||
// Based on code from ScummVM - Scumm Interpreter
|
||||
// Copyright (C) 2002-2004 The ScummVM project
|
||||
|
@ -64,12 +64,12 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
|||
WidgetArray wid;
|
||||
|
||||
// Show game name
|
||||
lwidth = font.getStringWidth("Select a game from the list ...");
|
||||
lwidth = font.getStringWidth("Select an item from the list ...");
|
||||
xpos += 10; ypos += 8;
|
||||
new StaticTextWidget(this, font, xpos, ypos, lwidth, fontHeight,
|
||||
"Select a game from the list ...", kTextAlignLeft);
|
||||
"Select an item from the list ...", kTextAlignLeft);
|
||||
|
||||
lwidth = font.getStringWidth("XXXX files found");
|
||||
lwidth = font.getStringWidth("XXXX items found");
|
||||
xpos = _w - lwidth - 10;
|
||||
myRomCount = new StaticTextWidget(this, font, xpos, ypos,
|
||||
lwidth, fontHeight,
|
||||
|
@ -89,7 +89,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
|||
// Add note textwidget to show any notes for the currently selected ROM
|
||||
xpos += 5; ypos += myList->getHeight() + 4;
|
||||
lwidth = font.getStringWidth("Note:");
|
||||
new StaticTextWidget(this, font, xpos, ypos, lwidth, fontHeight,
|
||||
myNoteLabel = new StaticTextWidget(this, font, xpos, ypos, lwidth, fontHeight,
|
||||
"Note:", kTextAlignLeft);
|
||||
xpos += lwidth + 5;
|
||||
myNote = new StaticTextWidget(this, font, xpos, ypos,
|
||||
|
@ -100,7 +100,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
|||
xpos = 10; ypos += myNote->getHeight() + 4;
|
||||
#ifndef MAC_OSX
|
||||
myStartButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight,
|
||||
"Play", kStartCmd, 0);
|
||||
"Select", kStartCmd, 0);
|
||||
myStartButton->setEditable(true);
|
||||
wid.push_back(myStartButton);
|
||||
xpos += bwidth + 8;
|
||||
|
@ -119,7 +119,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
|||
myQuitButton->setEditable(true);
|
||||
wid.push_back(myQuitButton);
|
||||
xpos += bwidth + 8;
|
||||
mySelectedItem = 0; // Highlight 'Play' button
|
||||
mySelectedItem = 0; // Highlight 'Select' button
|
||||
#else
|
||||
myQuitButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight,
|
||||
"Quit", kQuitCmd, 0);
|
||||
|
@ -137,11 +137,11 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
|||
wid.push_back(myRelPrevButton);
|
||||
xpos += bwidth + 8;
|
||||
myStartButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight,
|
||||
"Play", kStartCmd, 0);
|
||||
"Select", kStartCmd, 0);
|
||||
myStartButton->setEditable(true);
|
||||
wid.push_back(myStartButton);
|
||||
xpos += bwidth + 8;
|
||||
mySelectedItem = 3; // Highlight 'Play' button
|
||||
mySelectedItem = 3; // Highlight 'Select' button
|
||||
#endif
|
||||
|
||||
// Create the launcher options dialog, where you can change ROM
|
||||
|
@ -158,6 +158,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
|||
// (De)activate browse mode
|
||||
myBrowseModeFlag = instance()->settings().getBool("rombrowse");
|
||||
myRelPrevButton->setLabel(myBrowseModeFlag ? "Go Up" : "Reload");
|
||||
myNoteLabel->setEnabled(!myBrowseModeFlag);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -241,7 +242,7 @@ void LauncherDialog::updateListing(bool fullReload)
|
|||
|
||||
// Indicate how many files were found
|
||||
ostringstream buf;
|
||||
buf << myGameList->size() << " files found";
|
||||
buf << myGameList->size() << " items found";
|
||||
myRomCount->setLabel(buf.str());
|
||||
|
||||
enableButtons(true);
|
||||
|
@ -538,6 +539,7 @@ void LauncherDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
case kBrowseChangedCmd:
|
||||
myBrowseModeFlag = instance()->settings().getBool("rombrowse");
|
||||
myRelPrevButton->setLabel(myBrowseModeFlag ? "Go Up" : "Reload");
|
||||
myNoteLabel->setEnabled(!myBrowseModeFlag);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: LauncherDialog.hxx,v 1.17 2006-03-09 17:04:01 stephena Exp $
|
||||
// $Id: LauncherDialog.hxx,v 1.18 2006-03-19 18:17:48 stephena Exp $
|
||||
//
|
||||
// Based on code from ScummVM - Scumm Interpreter
|
||||
// Copyright (C) 2002-2004 The ScummVM project
|
||||
|
@ -67,6 +67,7 @@ class LauncherDialog : public Dialog
|
|||
ButtonWidget* myQuitButton;
|
||||
|
||||
StringListWidget* myList;
|
||||
StaticTextWidget* myNoteLabel;
|
||||
StaticTextWidget* myNote;
|
||||
StaticTextWidget* myRomCount;
|
||||
GameList* myGameList;
|
||||
|
|
Loading…
Reference in New Issue