Implements custom cursor support for the new theme and includes a standard cursor (it should be replaced though).
svn-id: r22019
This commit is contained in:
parent
8828daba84
commit
0a767b6467
5 changed files with 94 additions and 3 deletions
|
@ -38,7 +38,7 @@
|
||||||
#define kShadowTr3 64
|
#define kShadowTr3 64
|
||||||
#define kShadowTr4 128
|
#define kShadowTr4 128
|
||||||
|
|
||||||
#define THEME_VERSION 9
|
#define THEME_VERSION 10
|
||||||
|
|
||||||
using Graphics::Surface;
|
using Graphics::Surface;
|
||||||
|
|
||||||
|
@ -216,6 +216,8 @@ _lastUsedBitMask(0), _forceRedraw(false), _fonts(), _imageHandles(0), _images(0)
|
||||||
_configFile.getKey("popupwidget_top", "pixmaps", imageHandlesTable[kPopUpWidgetBkgdTop]);
|
_configFile.getKey("popupwidget_top", "pixmaps", imageHandlesTable[kPopUpWidgetBkgdTop]);
|
||||||
_configFile.getKey("popupwidget_left", "pixmaps", imageHandlesTable[kPopUpWidgetBkgdLeft]);
|
_configFile.getKey("popupwidget_left", "pixmaps", imageHandlesTable[kPopUpWidgetBkgdLeft]);
|
||||||
_configFile.getKey("popupwidget_bkgd", "pixmaps", imageHandlesTable[kPopUpWidgetBkgd]);
|
_configFile.getKey("popupwidget_bkgd", "pixmaps", imageHandlesTable[kPopUpWidgetBkgd]);
|
||||||
|
|
||||||
|
_configFile.getKey("cursor_image", "pixmaps", imageHandlesTable[kGUICursor]);
|
||||||
|
|
||||||
// load the gradient factors from the config file
|
// load the gradient factors from the config file
|
||||||
getFactorFromConfig(_configFile, "main_dialog", _gradientFactors[kMainDialogFactor]);
|
getFactorFromConfig(_configFile, "main_dialog", _gradientFactors[kMainDialogFactor]);
|
||||||
|
@ -242,6 +244,9 @@ _lastUsedBitMask(0), _forceRedraw(false), _fonts(), _imageHandles(0), _images(0)
|
||||||
getExtraValueFromConfig(_configFile, "shadow_right_width", _shadowRightWidth, 4);
|
getExtraValueFromConfig(_configFile, "shadow_right_width", _shadowRightWidth, 4);
|
||||||
getExtraValueFromConfig(_configFile, "shadow_top_height", _shadowTopHeight, 2);
|
getExtraValueFromConfig(_configFile, "shadow_top_height", _shadowTopHeight, 2);
|
||||||
getExtraValueFromConfig(_configFile, "shadow_bottom_height", _shadowBottomHeight, 4);
|
getExtraValueFromConfig(_configFile, "shadow_bottom_height", _shadowBottomHeight, 4);
|
||||||
|
|
||||||
|
getExtraValueFromConfig(_configFile, "cursor_hotspot_x", _cursorHotspotX, 0);
|
||||||
|
getExtraValueFromConfig(_configFile, "cursor_hotspot_y", _cursorHotspotY, 0);
|
||||||
|
|
||||||
// inactive dialog shading stuff
|
// inactive dialog shading stuff
|
||||||
_dialogShadingCallback = 0;
|
_dialogShadingCallback = 0;
|
||||||
|
@ -293,12 +298,16 @@ _lastUsedBitMask(0), _forceRedraw(false), _fonts(), _imageHandles(0), _images(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastUsedBitMask = gBitFormat;
|
_lastUsedBitMask = gBitFormat;
|
||||||
|
|
||||||
|
// creats the cursor image
|
||||||
|
createCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
ThemeNew::~ThemeNew() {
|
ThemeNew::~ThemeNew() {
|
||||||
deleteFonts();
|
deleteFonts();
|
||||||
deinit();
|
deinit();
|
||||||
delete [] _images;
|
delete [] _images;
|
||||||
|
delete [] _cursor;
|
||||||
_images = 0;
|
_images = 0;
|
||||||
if (_imageHandles) {
|
if (_imageHandles) {
|
||||||
for (int i = 0; i < kImageHandlesMax; ++i) {
|
for (int i = 0; i < kImageHandlesMax; ++i) {
|
||||||
|
@ -353,10 +362,12 @@ void ThemeNew::enable() {
|
||||||
resetDrawArea();
|
resetDrawArea();
|
||||||
_system->showOverlay();
|
_system->showOverlay();
|
||||||
clearAll();
|
clearAll();
|
||||||
|
setUpCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThemeNew::disable() {
|
void ThemeNew::disable() {
|
||||||
_system->hideOverlay();
|
_system->hideOverlay();
|
||||||
|
_system->setPalette(_backUpCols, 0, MAX_CURS_COLORS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThemeNew::openDialog(bool topDialog) {
|
void ThemeNew::openDialog(bool topDialog) {
|
||||||
|
@ -1487,6 +1498,65 @@ OverlayColor ThemeNew::calcDimColor(OverlayColor col) {
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
|
void ThemeNew::setUpCursor() {
|
||||||
|
_system->grabPalette(_backUpCols, 0, MAX_CURS_COLORS);
|
||||||
|
_system->setPalette(_cursorPal, 0, MAX_CURS_COLORS);
|
||||||
|
|
||||||
|
_system->setMouseCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeNew::createCursor() {
|
||||||
|
const Surface *cursor = _images[kGUICursor];
|
||||||
|
|
||||||
|
_cursorWidth = cursor->w;
|
||||||
|
_cursorHeight = cursor->h;
|
||||||
|
|
||||||
|
uint colorsFound = 0;
|
||||||
|
const OverlayColor *src = (const OverlayColor*)cursor->pixels;
|
||||||
|
|
||||||
|
byte *table = new byte[65536];
|
||||||
|
assert(table);
|
||||||
|
memset(table, 0, sizeof(byte)*65536);
|
||||||
|
|
||||||
|
byte r, g, b;
|
||||||
|
|
||||||
|
_system->colorToRGB(_colors[kColorTransparency], r, g, b);
|
||||||
|
uint16 transparency = RGBToColor<ColorMasks<565> >(r, g, b);
|
||||||
|
|
||||||
|
_cursor = new byte[_cursorWidth * _cursorHeight];
|
||||||
|
assert(_cursor);
|
||||||
|
memset(_cursor, 255, sizeof(byte)*_cursorWidth*_cursorHeight);
|
||||||
|
|
||||||
|
for (uint y = 0; y < _cursorHeight; ++y) {
|
||||||
|
for (uint x = 0; x < _cursorWidth; ++x) {
|
||||||
|
_system->colorToRGB(src[x], r, g, b);
|
||||||
|
uint16 col = RGBToColor<ColorMasks<565> >(r, g, b);
|
||||||
|
if (!table[col] && col != transparency) {
|
||||||
|
table[col] = colorsFound++;
|
||||||
|
|
||||||
|
uint index = table[col];
|
||||||
|
_cursorPal[index * 4 + 0] = r;
|
||||||
|
_cursorPal[index * 4 + 1] = g;
|
||||||
|
_cursorPal[index * 4 + 2] = b;
|
||||||
|
_cursorPal[index * 4 + 3] = 0xFF;
|
||||||
|
|
||||||
|
if (colorsFound > MAX_CURS_COLORS)
|
||||||
|
error("Cursor contains too much colors (%d, but only %d are allowed)", colorsFound, MAX_CURS_COLORS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (col != transparency) {
|
||||||
|
uint index = table[col];
|
||||||
|
_cursor[y * _cursorWidth + x] = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
src += _cursorWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete [] table;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline OverlayColor getColorAlphaImpl(OverlayColor col1, OverlayColor col2, int alpha) {
|
inline OverlayColor getColorAlphaImpl(OverlayColor col1, OverlayColor col2, int alpha) {
|
||||||
OverlayColor output = 0;
|
OverlayColor output = 0;
|
||||||
|
|
|
@ -144,6 +144,7 @@ void NewGui::runLoop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
bool useStandardCurs = !_theme->ownCursor();
|
||||||
|
|
||||||
while (!_dialogStack.empty() && activeDialog == _dialogStack.top()) {
|
while (!_dialogStack.empty() && activeDialog == _dialogStack.top()) {
|
||||||
activeDialog->handleTickle();
|
activeDialog->handleTickle();
|
||||||
|
@ -172,7 +173,8 @@ void NewGui::runLoop() {
|
||||||
_needRedraw = false;
|
_needRedraw = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
animateCursor();
|
if (useStandardCurs)
|
||||||
|
animateCursor();
|
||||||
_theme->drawAll();
|
_theme->drawAll();
|
||||||
_system->updateScreen();
|
_system->updateScreen();
|
||||||
|
|
||||||
|
|
15
gui/theme.h
15
gui/theme.h
|
@ -106,6 +106,8 @@ public:
|
||||||
|
|
||||||
virtual void refresh() = 0;
|
virtual void refresh() = 0;
|
||||||
|
|
||||||
|
virtual bool ownCursor() { return false; }
|
||||||
|
|
||||||
virtual void enable() = 0;
|
virtual void enable() = 0;
|
||||||
virtual void disable() = 0;
|
virtual void disable() = 0;
|
||||||
|
|
||||||
|
@ -281,6 +283,8 @@ public:
|
||||||
|
|
||||||
void refresh();
|
void refresh();
|
||||||
|
|
||||||
|
bool ownCursor() { return true; }
|
||||||
|
|
||||||
void enable();
|
void enable();
|
||||||
void disable();
|
void disable();
|
||||||
|
|
||||||
|
@ -428,6 +432,8 @@ public:
|
||||||
kPopUpWidgetBkgdTop = 41,
|
kPopUpWidgetBkgdTop = 41,
|
||||||
kPopUpWidgetBkgdLeft = 42,
|
kPopUpWidgetBkgdLeft = 42,
|
||||||
kPopUpWidgetBkgd = 43,
|
kPopUpWidgetBkgd = 43,
|
||||||
|
|
||||||
|
kGUICursor = 44,
|
||||||
|
|
||||||
kImageHandlesMax
|
kImageHandlesMax
|
||||||
};
|
};
|
||||||
|
@ -441,6 +447,15 @@ private:
|
||||||
OverlayColor calcLuminance(OverlayColor col);
|
OverlayColor calcLuminance(OverlayColor col);
|
||||||
OverlayColor calcDimColor(OverlayColor col);
|
OverlayColor calcDimColor(OverlayColor col);
|
||||||
|
|
||||||
|
void setUpCursor();
|
||||||
|
void createCursor();
|
||||||
|
int _cursorHotspotX, _cursorHotspotY;
|
||||||
|
#define MAX_CURS_COLORS 255
|
||||||
|
byte *_cursor;
|
||||||
|
uint _cursorWidth, _cursorHeight;
|
||||||
|
byte _cursorPal[4*MAX_CURS_COLORS];
|
||||||
|
byte _backUpCols[4*MAX_CURS_COLORS];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const String *_imageHandles;
|
const String *_imageHandles;
|
||||||
const Graphics::Surface **_images;
|
const Graphics::Surface **_images;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# $URL$
|
# $URL$
|
||||||
# $Id$
|
# $Id$
|
||||||
[theme]
|
[theme]
|
||||||
version=9
|
version=10
|
||||||
|
|
||||||
[pixmaps]
|
[pixmaps]
|
||||||
dialog_corner=dialog_bkgd_corner.bmp
|
dialog_corner=dialog_bkgd_corner.bmp
|
||||||
|
@ -61,6 +61,8 @@ popupwidget_bkgd=widget_small_bkgd.bmp
|
||||||
|
|
||||||
theme_logo=logo.bmp
|
theme_logo=logo.bmp
|
||||||
|
|
||||||
|
cursor_image=cursor.bmp
|
||||||
|
|
||||||
[colors]
|
[colors]
|
||||||
main_dialog_start=210 114 10
|
main_dialog_start=210 114 10
|
||||||
main_dialog_end=239 196 24
|
main_dialog_end=239 196 24
|
||||||
|
@ -146,6 +148,8 @@ shadow_bottom_height=4
|
||||||
inactive_dialog_shading=dim
|
inactive_dialog_shading=dim
|
||||||
shading_dim_percent=30
|
shading_dim_percent=30
|
||||||
fontfile_normal=helvr12-l1.bdf
|
fontfile_normal=helvr12-l1.bdf
|
||||||
|
cursor_hotspot_x=0
|
||||||
|
cursor_hotspot_y=0
|
||||||
|
|
||||||
[640xY]
|
[640xY]
|
||||||
def_launcherX=23
|
def_launcherX=23
|
||||||
|
|
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue