aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorYotam Barnoy2010-10-31 11:08:43 +0000
committerYotam Barnoy2010-10-31 11:08:43 +0000
commit94c8d0a14df429a1b25bd9f5c5d75497fd0ddbd1 (patch)
tree3df2a4ae7967c56d464729669fc06ce4e93dff36 /gui
parent8df4278ba8cfbf71228e1927f9db635a9a30a57f (diff)
parentdca3c8d8bfc6c4db38cf8e8291818dd472041d4e (diff)
downloadscummvm-rg350-94c8d0a14df429a1b25bd9f5c5d75497fd0ddbd1.tar.gz
scummvm-rg350-94c8d0a14df429a1b25bd9f5c5d75497fd0ddbd1.tar.bz2
scummvm-rg350-94c8d0a14df429a1b25bd9f5c5d75497fd0ddbd1.zip
Updated with latest from trunk
svn-id: r53976
Diffstat (limited to 'gui')
-rw-r--r--gui/EditTextWidget.cpp2
-rw-r--r--gui/GuiManager.cpp3
-rw-r--r--gui/KeysDialog.h3
-rw-r--r--gui/ListWidget.cpp12
-rw-r--r--gui/ThemeEngine.cpp90
-rw-r--r--gui/ThemeEngine.h12
-rw-r--r--gui/ThemeEval.h4
-rw-r--r--gui/ThemeParser.cpp42
-rw-r--r--gui/Tooltip.cpp18
-rw-r--r--gui/Tooltip.h9
-rw-r--r--gui/browser.cpp5
-rw-r--r--gui/browser.h6
-rw-r--r--gui/browser_osx.mm3
-rw-r--r--gui/credits.h26
-rw-r--r--gui/editable.cpp5
-rw-r--r--gui/editable.h2
-rw-r--r--gui/launcher.cpp27
-rw-r--r--gui/message.cpp6
-rw-r--r--gui/options.cpp109
-rw-r--r--gui/saveload.cpp2
-rw-r--r--gui/themes/scummmodern.zipbin181317 -> 181827 bytes
-rw-r--r--gui/themes/scummmodern/scummmodern_layout.stx6
-rw-r--r--gui/themes/scummmodern/scummmodern_layout_lowres.stx2
-rwxr-xr-xgui/themes/scummtheme.py36
-rw-r--r--gui/themes/translations.datbin75042 -> 80935 bytes
25 files changed, 223 insertions, 207 deletions
diff --git a/gui/EditTextWidget.cpp b/gui/EditTextWidget.cpp
index 7079453173..e5de1c6e7f 100644
--- a/gui/EditTextWidget.cpp
+++ b/gui/EditTextWidget.cpp
@@ -88,7 +88,7 @@ void EditTextWidget::drawWidget() {
}
Common::Rect EditTextWidget::getEditRect() const {
- Common::Rect r(2 + _leftPadding, 1, _w - 2 - _leftPadding - _rightPadding, _h-1);
+ Common::Rect r(2 + _leftPadding, 2, _w - 2 - _leftPadding - _rightPadding, _h-1);
return r;
}
diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp
index bbd7718d71..a2a8654bf6 100644
--- a/gui/GuiManager.cpp
+++ b/gui/GuiManager.cpp
@@ -63,6 +63,9 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), _tooltipCheck(false),
// Clear the cursor
memset(_cursor, 0xFF, sizeof(_cursor));
+ // Enable translation
+ TransMan.setLanguage(ConfMan.get("gui_language").c_str());
+
ConfMan.registerDefault("gui_theme", "scummmodern");
Common::String themefile(ConfMan.get("gui_theme"));
diff --git a/gui/KeysDialog.h b/gui/KeysDialog.h
index d18bcb3617..7a9936a085 100644
--- a/gui/KeysDialog.h
+++ b/gui/KeysDialog.h
@@ -30,12 +30,13 @@
#include "gui/dialog.h"
#include "gui/ListWidget.h"
#include "common/str.h"
+#include "common/translation.h"
namespace GUI {
class KeysDialog : public GUI::Dialog {
public:
- KeysDialog(const Common::String &title = "Choose an action to map");
+ KeysDialog(const Common::String &title = _("Choose an action to map"));
virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
virtual void handleKeyUp(Common::KeyState state);
diff --git a/gui/ListWidget.cpp b/gui/ListWidget.cpp
index 4447b62244..f5f41bba80 100644
--- a/gui/ListWidget.cpp
+++ b/gui/ListWidget.cpp
@@ -449,11 +449,15 @@ bool ListWidget::handleKeyUp(Common::KeyState state) {
}
void ListWidget::receivedFocusWidget() {
+ _inversion = ThemeEngine::kTextInversionFocus;
+
// Redraw the widget so the selection color will change
draw();
}
void ListWidget::lostFocusWidget() {
+ _inversion = ThemeEngine::kTextInversion;
+
// If we lose focus, we simply forget the user changes
_editMode = false;
g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
@@ -491,12 +495,8 @@ void ListWidget::drawWidget() {
ThemeEngine::TextInversionState inverted = ThemeEngine::kTextInversionNone;
// Draw the selected item inverted, on a highlighted background.
- if (_selectedItem == pos) {
- if (_hasFocus)
- inverted = ThemeEngine::kTextInversionFocus;
- else
- inverted = ThemeEngine::kTextInversion;
- }
+ if (_selectedItem == pos)
+ inverted = _inversion;
Common::Rect r(getEditRect());
int pad = _leftPadding;
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 9cc98d83ce..d9a1e05855 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -44,8 +44,6 @@
#include "gui/ThemeEval.h"
#include "gui/ThemeParser.h"
-#define GUI_ENABLE_BUILTIN_THEME
-
namespace GUI {
const char * const ThemeEngine::kImageLogo = "logo.bmp";
@@ -331,15 +329,12 @@ ThemeEngine::~ThemeEngine() {
* Rendering mode management
*********************************************************/
const ThemeEngine::Renderer ThemeEngine::_rendererModes[] = {
- { _s("Disabled GFX"), "none", kGfxDisabled },
- { _s("Standard Renderer (16bpp)"), "normal_16bpp", kGfxStandard16bit },
+ { _s("Disabled GFX"), _sc("Disabled GFX", "lowres"), "none", kGfxDisabled },
+ { _s("Standard Renderer (16bpp)"), _s("Standard (16bpp)"), "normal_16bpp", kGfxStandard16bit },
#ifndef DISABLE_FANCY_THEMES
- { _s("Antialiased Renderer (16bpp)"), "aa_16bpp", kGfxAntialias16bit }
+ { _s("Antialiased Renderer (16bpp)"), _s("Antialiased (16bpp)"), "aa_16bpp", kGfxAntialias16bit }
#endif
};
-
-DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Standard Renderer (16bpp)", "lowres")
-DECLARE_TRANSLATION_ADDITIONAL_CONTEXT("Antialiased Renderer (16bpp)", "lowres")
const uint ThemeEngine::_rendererModesSize = ARRAYSIZE(ThemeEngine::_rendererModes);
@@ -578,25 +573,26 @@ bool ThemeEngine::addFont(TextData textId, const Common::String &file) {
if (!_texts[textId]->_fontPtr) {
// First try to load localized font
_texts[textId]->_fontPtr = loadFont(localized);
-
+
if (_texts[textId]->_fontPtr)
FontMan.assignFontToName(file, _texts[textId]->_fontPtr);
- // Fallback to non-localized font
+ // Fallback to non-localized font and default translation
else {
// Try built-in fonts
_texts[textId]->_fontPtr = FontMan.getFontByName(file);
-
+
// Try to load it
if (!_texts[textId]->_fontPtr) {
_texts[textId]->_fontPtr = loadFont(file);
if (!_texts[textId]->_fontPtr)
error("Couldn't load font '%s'", file.c_str());
-
+
FontMan.assignFontToName(file, _texts[textId]->_fontPtr);
}
- warning("Failed to load localized font '%s'. Using non-localized font instead", file.c_str());
+ TransMan.setLanguage("C");
+ warning("Failed to load localized font '%s'. Using non-localized font and default GUI language instead", file.c_str());
}
}
}
@@ -716,7 +712,7 @@ bool ThemeEngine::loadDefaultXML() {
// file inside the themes directory.
// Use the Python script "makedeftheme.py" to convert a normal XML theme
// into the "default.inc" file, which is ready to be included in the code.
-#ifdef GUI_ENABLE_BUILTIN_THEME
+#ifndef DISABLE_GUI_BUILTIN_THEME
const char *defaultXML =
#include "themes/default.inc"
;
@@ -1192,70 +1188,6 @@ void ThemeEngine::debugWidgetPosition(const char *name, const Common::Rect &r) {
_screen.vLine(r.right, r.top, r.bottom, 0xFFFF);
}
-ThemeEngine::StoredState *ThemeEngine::storeState(const Common::Rect &r) {
- StoredState *state = new StoredState;
- byte *dst;
- byte *src;
-
- state->r.top = r.top;
- state->r.bottom = r.bottom;
- state->r.left = r.left;
- state->r.right = r.right;
-
- state->r.clip(_screen.w, _screen.h);
-
- state->screen.create(state->r.width(), state->r.height(), _screen.bytesPerPixel);
- state->backBuffer.create(state->r.width(), state->r.height(), _backBuffer.bytesPerPixel);
-
- src = (byte *)_screen.getBasePtr(state->r.left, state->r.top);
- dst = (byte *)state->screen.getBasePtr(0, 0);
-
- for (int i = state->r.height(); i > 0; i--) {
- memcpy(dst, src, state->r.width() * _screen.bytesPerPixel);
- src += _screen.pitch;
- dst += state->screen.pitch;
- }
-
- src = (byte *)_backBuffer.getBasePtr(state->r.left, state->r.top);
- dst = (byte *)state->backBuffer.getBasePtr(0, 0);
-
- for (int i = state->r.height(); i > 0; i--) {
- memcpy(dst, src, state->r.width() * _backBuffer.bytesPerPixel);
- src += _backBuffer.pitch;
- dst += state->backBuffer.pitch;
- }
-
- return state;
-}
-
-void ThemeEngine::restoreState(StoredState *state) {
- byte *dst;
- byte *src;
-
- if (!state)
- return;
-
- src = (byte *)state->screen.getBasePtr(0, 0);
- dst = (byte *)_screen.getBasePtr(state->r.left, state->r.top);
-
- for (int i = state->r.height(); i > 0; i--) {
- memcpy(dst, src, state->r.width() * _screen.bytesPerPixel);
- src += state->screen.pitch;
- dst += _screen.pitch;
- }
-
- src = (byte *)state->backBuffer.getBasePtr(0, 0);
- dst = (byte *)_backBuffer.getBasePtr(state->r.left, state->r.top);
-
- for (int i = state->r.height(); i > 0; i--) {
- memcpy(dst, src, state->r.width() * _backBuffer.bytesPerPixel);
- src += state->backBuffer.pitch;
- dst += _backBuffer.pitch;
- }
-
- addDirtyRect(state->r);
-}
-
/**********************************************************
* Screen/overlay management
*********************************************************/
@@ -1661,7 +1593,7 @@ struct TDComparator {
} // end of anonymous namespace
void ThemeEngine::listUsableThemes(Common::List<ThemeDescriptor> &list) {
-#ifdef GUI_ENABLE_BUILTIN_THEME
+#ifndef DISABLE_GUI_BUILTIN_THEME
ThemeDescriptor th;
th.name = "ScummVM Classic Theme (Builtin Version)";
th.id = "builtin";
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index 73181b74a6..3d2fca04eb 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -238,6 +238,7 @@ public:
struct Renderer {
const char *name;
+ const char *shortname;
const char *cfg;
GraphicsMode mode;
};
@@ -263,17 +264,6 @@ public:
void enable();
void disable();
- struct StoredState {
- Common::Rect r;
- Graphics::Surface screen;
- Graphics::Surface backBuffer;
-
- StoredState() {}
- };
-
- StoredState *storeState(const Common::Rect &r);
- void restoreState(StoredState *state);
-
/**
* Implementation of the GUI::Theme API. Called when a
* new dialog is opened. Note that the boolean parameter
diff --git a/gui/ThemeEval.h b/gui/ThemeEval.h
index c484a49564..ac867512da 100644
--- a/gui/ThemeEval.h
+++ b/gui/ThemeEval.h
@@ -23,8 +23,8 @@
*
*/
-#ifndef GUI_THEME_EVAL
-#define GUI_THEME_EVAL
+#ifndef GUI_THEME_EVAL_H
+#define GUI_THEME_EVAL_H
#include "common/scummsys.h"
#include "common/hashmap.h"
diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp
index c809447cbd..0daf2528dd 100644
--- a/gui/ThemeParser.cpp
+++ b/gui/ThemeParser.cpp
@@ -144,7 +144,7 @@ Graphics::DrawStep *ThemeParser::defaultDrawStep() {
Graphics::DrawStep *ThemeParser::newDrawStep() {
assert(_defaultStepGlobal);
- Graphics::DrawStep *step = 0 ; //new DrawStep;
+ Graphics::DrawStep *step = 0; //new DrawStep;
if (_defaultStepLocal) {
step = new Graphics::DrawStep(*_defaultStepLocal);
@@ -195,7 +195,7 @@ bool ThemeParser::parserCallback_text_color(ParserNode *node) {
if (_palette.contains(node->values["color"]))
getPaletteColor(node->values["color"], red, green, blue);
- else if (!parseIntegerKey(node->values["color"].c_str(), 3, &red, &green, &blue))
+ else if (!parseIntegerKey(node->values["color"], 3, &red, &green, &blue))
return parserError("Error parsing color value for text color definition.");
if (!_theme->addTextColor(colorId, red, green, blue))
@@ -216,10 +216,10 @@ bool ThemeParser::parserCallback_cursor(ParserNode *node) {
int spotx, spoty, scale;
- if (!parseIntegerKey(node->values["hotspot"].c_str(), 2, &spotx, &spoty))
+ if (!parseIntegerKey(node->values["hotspot"], 2, &spotx, &spoty))
return parserError("Error parsing cursor Hot Spot coordinates.");
- if (!parseIntegerKey(node->values["scale"].c_str(), 1, &scale))
+ if (!parseIntegerKey(node->values["scale"], 1, &scale))
return parserError("Error parsing cursor scale.");
if (!_theme->createCursor(node->values["file"], spotx, spoty, scale))
@@ -286,7 +286,7 @@ bool ThemeParser::parserCallback_color(ParserNode *node) {
int red, green, blue;
- if (parseIntegerKey(node->values["rgb"].c_str(), 3, &red, &green, &blue) == false ||
+ if (parseIntegerKey(node->values["rgb"], 3, &red, &green, &blue) == false ||
red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255)
return parserError("Error parsing RGB values for palette color '%s'", name.c_str());\
@@ -387,7 +387,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst
*/
#define __PARSER_ASSIGN_INT(struct_name, key_name, force) \
if (stepNode->values.contains(key_name)) { \
- if (!parseIntegerKey(stepNode->values[key_name].c_str(), 1, &x)) \
+ if (!parseIntegerKey(stepNode->values[key_name], 1, &x)) \
return parserError("Error parsing key value for '%s'.", key_name); \
\
drawstep->struct_name = x; \
@@ -411,7 +411,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst
red = _palette[val].r; \
green = _palette[val].g; \
blue = _palette[val].b; \
- } else if (parseIntegerKey(val.c_str(), 3, &red, &green, &blue) == false || \
+ } else if (parseIntegerKey(val, 3, &red, &green, &blue) == false || \
red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255) \
return parserError("Error parsing color struct '%s'", val.c_str());\
\
@@ -481,7 +481,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst
drawstep->autoWidth = false;
val = stepNode->values["width"];
- if (parseIntegerKey(val.c_str(), 1, &x))
+ if (parseIntegerKey(val, 1, &x))
drawstep->w = x;
else if (val == "height")
drawstep->w = -1;
@@ -490,7 +490,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst
if (stepNode->values.contains("xpos")) {
val = stepNode->values["xpos"];
- if (parseIntegerKey(val.c_str(), 1, &x))
+ if (parseIntegerKey(val, 1, &x))
drawstep->x = x;
else if (val == "center")
drawstep->xAlign = Graphics::DrawStep::kVectorAlignCenter;
@@ -509,7 +509,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst
drawstep->autoHeight = false;
val = stepNode->values["height"];
- if (parseIntegerKey(val.c_str(), 1, &x))
+ if (parseIntegerKey(val, 1, &x))
drawstep->h = x;
else if (val == "width")
drawstep->h = -1;
@@ -518,7 +518,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst
if (stepNode->values.contains("ypos")) {
val = stepNode->values["ypos"];
- if (parseIntegerKey(val.c_str(), 1, &x))
+ if (parseIntegerKey(val, 1, &x))
drawstep->y = x;
else if (val == "center")
drawstep->yAlign = Graphics::DrawStep::kVectorAlignCenter;
@@ -569,7 +569,7 @@ bool ThemeParser::parserCallback_def(ParserNode *node) {
if (_theme->getEvaluator()->hasVar(node->values["value"]) == true)
value = _theme->getEvaluator()->getVar(node->values["value"]);
- else if (!parseIntegerKey(node->values["value"].c_str(), 1, &value))
+ else if (!parseIntegerKey(node->values["value"], 1, &value))
return parserError("Invalid definition for '%s'.", var.c_str());
_theme->getEvaluator()->setVar(var, value);
@@ -608,7 +608,7 @@ bool ThemeParser::parserCallback_widget(ParserNode *node) {
if (_theme->getEvaluator()->hasVar(node->values["width"]) == true)
width = _theme->getEvaluator()->getVar(node->values["width"]);
- else if (!parseIntegerKey(node->values["width"].c_str(), 1, &width))
+ else if (!parseIntegerKey(node->values["width"], 1, &width))
return parserError("Corrupted width value in key for %s", var.c_str());
}
@@ -616,7 +616,7 @@ bool ThemeParser::parserCallback_widget(ParserNode *node) {
if (_theme->getEvaluator()->hasVar(node->values["height"]) == true)
height = _theme->getEvaluator()->getVar(node->values["height"]);
- else if (!parseIntegerKey(node->values["height"].c_str(), 1, &height))
+ else if (!parseIntegerKey(node->values["height"], 1, &height))
return parserError("Corrupted height value in key for %s", var.c_str());
}
@@ -651,7 +651,7 @@ bool ThemeParser::parserCallback_dialog(ParserNode *node) {
}
if (node->values.contains("inset")) {
- if (!parseIntegerKey(node->values["inset"].c_str(), 1, &inset))
+ if (!parseIntegerKey(node->values["inset"], 1, &inset))
return false;
}
@@ -682,7 +682,7 @@ bool ThemeParser::parserCallback_layout(ParserNode *node) {
int spacing = -1;
if (node->values.contains("spacing")) {
- if (!parseIntegerKey(node->values["spacing"].c_str(), 1, &spacing))
+ if (!parseIntegerKey(node->values["spacing"], 1, &spacing))
return false;
}
@@ -697,7 +697,7 @@ bool ThemeParser::parserCallback_layout(ParserNode *node) {
if (node->values.contains("padding")) {
int paddingL, paddingR, paddingT, paddingB;
- if (!parseIntegerKey(node->values["padding"].c_str(), 4, &paddingL, &paddingR, &paddingT, &paddingB))
+ if (!parseIntegerKey(node->values["padding"], 4, &paddingL, &paddingR, &paddingT, &paddingB))
return false;
_theme->getEvaluator()->addPadding(paddingL, paddingR, paddingT, paddingB);
@@ -713,7 +713,7 @@ bool ThemeParser::parserCallback_space(ParserNode *node) {
if (_theme->getEvaluator()->hasVar(node->values["size"]))
size = _theme->getEvaluator()->getVar(node->values["size"]);
- else if (!parseIntegerKey(node->values["size"].c_str(), 1, &size))
+ else if (!parseIntegerKey(node->values["size"], 1, &size))
return parserError("Invalid value for Spacing size.");
}
@@ -734,7 +734,7 @@ bool ThemeParser::parseCommonLayoutProps(ParserNode *node, const Common::String
if (node->values.contains("size")) {
int width, height;
- if (!parseIntegerKey(node->values["size"].c_str(), 2, &width, &height)) {
+ if (!parseIntegerKey(node->values["size"], 2, &width, &height)) {
Common::StringTokenizer tokenizer(node->values["size"], " ,");
Common::String wtoken, htoken;
char *parseEnd;
@@ -779,7 +779,7 @@ bool ThemeParser::parseCommonLayoutProps(ParserNode *node, const Common::String
if (node->values.contains("pos")) {
int x, y;
- if (!parseIntegerKey(node->values["pos"].c_str(), 2, &x, &y)) {
+ if (!parseIntegerKey(node->values["pos"], 2, &x, &y)) {
Common::StringTokenizer tokenizer(node->values["pos"], " ,");
Common::String xpos, ypos;
char *parseEnd;
@@ -835,7 +835,7 @@ bool ThemeParser::parseCommonLayoutProps(ParserNode *node, const Common::String
if (node->values.contains("padding")) {
int paddingL, paddingR, paddingT, paddingB;
- if (!parseIntegerKey(node->values["padding"].c_str(), 4, &paddingL, &paddingR, &paddingT, &paddingB))
+ if (!parseIntegerKey(node->values["padding"], 4, &paddingL, &paddingR, &paddingT, &paddingB))
return false;
_theme->getEvaluator()->setVar(var + "Padding.Left", paddingL);
diff --git a/gui/Tooltip.cpp b/gui/Tooltip.cpp
index 64c34688df..272fa66072 100644
--- a/gui/Tooltip.cpp
+++ b/gui/Tooltip.cpp
@@ -34,7 +34,7 @@
namespace GUI {
-Tooltip::Tooltip() :
+Tooltip::Tooltip() :
Dialog(-1, -1, -1, -1), _maxWidth(-1) {
_backgroundType = GUI::ThemeEngine::kDialogBackgroundTooltip;
@@ -69,7 +69,7 @@ bool Tooltip::tooltipModal(int x, int y) {
_h = (tooltipFont->getFontHeight() + 2) * _wrappedLines.size();
_x = MIN<int16>(g_gui.getTopDialog()->_x + x + _xdelta, g_gui.getWidth() - _w - 3);
- _y = MIN<int16>(g_gui.getTopDialog()->_y + y + _ydelta, g_gui.getHeight() - _h - 3);
+ _y = MIN<int16>(g_gui.getTopDialog()->_y + y + _ydelta, g_gui.getHeight() - _h - 3);
open();
g_gui.runLoop();
@@ -85,14 +85,14 @@ void Tooltip::drawDialog() {
for (Common::StringArray::const_iterator i = _wrappedLines.begin(); i != _wrappedLines.end(); ++i, ++num) {
g_gui.theme()->drawText(
- Common::Rect(_x + 1, _y + 1 + num * h, _x + 1 +_w, _y + 1+ (num + 1) * h), *i,
- ThemeEngine::kStateEnabled,
- Graphics::kTextAlignLeft,
- ThemeEngine::kTextInversionNone,
+ Common::Rect(_x + 1, _y + 1 + num * h, _x + 1 +_w, _y + 1+ (num + 1) * h), *i,
+ ThemeEngine::kStateEnabled,
+ Graphics::kTextAlignLeft,
+ ThemeEngine::kTextInversionNone,
0,
- false,
- ThemeEngine::kFontStyleTooltip,
- ThemeEngine::kFontColorNormal,
+ false,
+ ThemeEngine::kFontStyleTooltip,
+ ThemeEngine::kFontColorNormal,
false
);
}
diff --git a/gui/Tooltip.h b/gui/Tooltip.h
index 60f3cf3a19..02eb01d0d0 100644
--- a/gui/Tooltip.h
+++ b/gui/Tooltip.h
@@ -33,7 +33,7 @@ class Tooltip : public Dialog {
public:
Tooltip();
~Tooltip() {}
-
+
void drawDialog();
bool tooltipModal(int x, int y);
void mustClose();
@@ -44,7 +44,8 @@ protected:
int _xdelta, _ydelta;
Common::StringArray _wrappedLines;
-};
-}
+};
+
+} // End of namespace GUI
-#endif
+#endif // GUI_TOOLTIP_H
diff --git a/gui/browser.cpp b/gui/browser.cpp
index 0d95e5397b..6a9d3d05b5 100644
--- a/gui/browser.cpp
+++ b/gui/browser.cpp
@@ -66,7 +66,10 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser)
_backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain;
// Buttons
- new ButtonWidget(this, "Browser.Up", _("Go up"), _("Go to previous directory level"), kGoUpCmd);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(this, "Browser.Up", _("Go up"), _("Go to previous directory level"), kGoUpCmd);
+ else
+ new ButtonWidget(this, "Browser.Up", _c("Go up", "lowres"), _("Go to previous directory level"), kGoUpCmd);
new ButtonWidget(this, "Browser.Cancel", _("Cancel"), 0, kCloseCmd);
new ButtonWidget(this, "Browser.Choose", _("Choose"), 0, kChooseCmd);
}
diff --git a/gui/browser.h b/gui/browser.h
index 8dc7eda43a..1fef041a5a 100644
--- a/gui/browser.h
+++ b/gui/browser.h
@@ -29,10 +29,6 @@
#include "common/str.h"
#include "common/fs.h"
-#ifdef MACOSX
-#include <Carbon/Carbon.h>
-#endif
-
namespace GUI {
class ListWidget;
@@ -54,7 +50,7 @@ public:
protected:
#ifdef MACOSX
- CFStringRef _titleRef;
+ const void *_titleRef;
#else
ListWidget *_fileList;
StaticTextWidget *_currentPath;
diff --git a/gui/browser_osx.mm b/gui/browser_osx.mm
index a3a09b8ed2..ea77e16c04 100644
--- a/gui/browser_osx.mm
+++ b/gui/browser_osx.mm
@@ -22,6 +22,9 @@
* $Id$
*/
+// Disable symbol overrides so that we can use system headers
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
#include "gui/browser.h"
#include "gui/GuiManager.h"
#include "gui/ListWidget.h"
diff --git a/gui/credits.h b/gui/credits.h
index bd4ecffc9b..a2c3bd681a 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -119,6 +119,11 @@ static const char *credits[] = {
"C0""Scott Thomas",
"C0""Jordi Vilalta Prat",
"",
+"C1""Hugo",
+"C0""Arnaud Boutonn\351",
+"C0""Oystein Eftevaag",
+"C0""Eugene Sandulenko",
+"",
"C1""Kyra",
"C0""Torbj\366rn Andersson",
"C2""VQA Player",
@@ -127,6 +132,11 @@ static const char *credits[] = {
"C0""Gregory Montoir",
"C0""Johannes Schickel",
"",
+"C1""Last Express",
+"C0""Matthew Hoops",
+"C0""Jordi Vilalta Prat",
+"C0""Julien Templier",
+"",
"C1""Lure",
"C0""Paul Gilbert",
"",
@@ -181,6 +191,9 @@ static const char *credits[] = {
"C0""Filippos Karapetis",
"C0""Joost Peters",
"",
+"C1""Toon",
+"C0""Sylvain Dupont",
+"",
"C1""Touch\351",
"C0""Gregory Montoir",
"",
@@ -195,7 +208,7 @@ static const char *credits[] = {
"C1""Dreamcast",
"C0""Marcus Comstedt",
"",
-"C1""GP2X",
+"C1""GPH Devices (GP2X, GP2XWiz & Caanoo)",
"C0""John Willis",
"",
"C1""iPhone",
@@ -213,6 +226,9 @@ static const char *credits[] = {
"C1""Nintendo DS",
"C0""Neil Millstone",
"",
+"C1""OpenPandora",
+"C0""John Willis",
+"",
"C1""PocketPC / WinCE",
"C0""Nicolas Bacca",
"C2""(retired)",
@@ -544,6 +560,8 @@ static const char *credits[] = {
"C2""For the original Gobliiins ADL player",
"C0""Ivan Dubrov",
"C2""For contributing the initial version of the Gobliiins engine",
+"C0""Henrik Engqvist",
+"C2""For generously providing hosting for our buildbot, SVN repository, planet and doxygen sites as well as tons of HD space",
"C0""DOSBox Team",
"C2""For their awesome OPL2 and OPL3 emulator",
"C0""Till Kresslein",
@@ -574,5 +592,11 @@ static const char *credits[] = {
"C0""",
"C0""John Young, Colin Smythe and especially Terry Pratchett himself for sharing the source code of Discworld I & II with us.",
"C0""",
+"C0""Emilio de Paz Aragon from Alcachofa Soft for sharing the source code of Drascula: The Vampire Strikes Back with us and his generosity with freewaring the game.",
+"C0""",
+"C0""David P. Gray from Gray Design Associate for sharing the source code of the Hugo trilogy.",
+"C0""",
+"C0""Broken Sword 2.5 team for providing sources of their engine and their great support.",
+"C0""",
"",
};
diff --git a/gui/editable.cpp b/gui/editable.cpp
index 755e34e380..1ebe307bb0 100644
--- a/gui/editable.cpp
+++ b/gui/editable.cpp
@@ -48,6 +48,7 @@ void EditableWidget::init() {
_editScrollOffset = 0;
_font = ThemeEngine::kFontStyleBold;
+ _inversion = ThemeEngine::kTextInversionNone;
}
EditableWidget::~EditableWidget() {
@@ -237,7 +238,7 @@ void EditableWidget::drawCaret(bool erase) {
Common::Rect editRect = getEditRect();
int x = editRect.left;
- int y = editRect.top + 1;
+ int y = editRect.top;
x += getCaretOffset();
@@ -253,7 +254,7 @@ void EditableWidget::drawCaret(bool erase) {
if ((uint)_caretPos < _editString.size()) {
GUI::EditableWidget::String chr(_editString[_caretPos]);
int chrWidth = g_gui.getCharWidth(_editString[_caretPos], _font);
- g_gui.theme()->drawText(Common::Rect(x, y, x + chrWidth, y + editRect.height() - 2), chr, _state, Graphics::kTextAlignLeft, ThemeEngine::kTextInversionNone, 0, false, _font);
+ g_gui.theme()->drawText(Common::Rect(x, y, x + chrWidth, y + editRect.height() - 2), chr, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font);
}
}
diff --git a/gui/editable.h b/gui/editable.h
index 8ff5298511..4a2d98349e 100644
--- a/gui/editable.h
+++ b/gui/editable.h
@@ -54,6 +54,8 @@ protected:
ThemeEngine::FontStyle _font;
+ ThemeEngine::TextInversionState _inversion;
+
public:
EditableWidget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0);
EditableWidget(GuiObject *boss, const String &name, const char *tooltip = 0, uint32 cmd = 0);
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index 0a3aa80f58..b3d08267f0 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -172,11 +172,17 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
tab->addTab(_("Game"));
// GUI: Label & edit widget for the game ID
- new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:"), _("Short game identifier used for referring to savegames and running the game from the command line"));
+ if (g_system->getOverlayWidth() > 320)
+ new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:"), _("Short game identifier used for referring to savegames and running the game from the command line"));
+ else
+ new StaticTextWidget(tab, "GameOptions_Game.Id", _c("ID:", "lowres"), _("Short game identifier used for referring to savegames and running the game from the command line"));
_domainWidget = new DomainEditTextWidget(tab, "GameOptions_Game.Domain", _domain, _("Short game identifier used for referring to savegames and running the game from the command line"));
// GUI: Label & edit widget for the description
- new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:"), _("Full title of the game"));
+ if (g_system->getOverlayWidth() > 320)
+ new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:"), _("Full title of the game"));
+ else
+ new StaticTextWidget(tab, "GameOptions_Game.Name", _c("Name:", "lowres"), _("Full title of the game"));
_descriptionWidget = new EditTextWidget(tab, "GameOptions_Game.Desc", description, _("Full title of the game"));
// Language popup
@@ -276,17 +282,26 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc)
//
// 7) The Paths tab
//
- tab->addTab(_("Paths"));
+ if (g_system->getOverlayWidth() > 320)
+ tab->addTab(_("Paths"));
+ else
+ tab->addTab(_c("Paths", "lowres"));
// These buttons have to be extra wide, or the text will be truncated
// in the small version of the GUI.
// GUI: Button + Label for the game path
- new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), 0, kCmdGameBrowser);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), 0, kCmdGameBrowser);
+ else
+ new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _c("Game Path:", "lowres"), 0, kCmdGameBrowser);
_gamePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.GamepathText", gamePath);
// GUI: Button + Label for the additional path
- new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), _("Specifies path to additional data used the game"), kCmdExtraBrowser);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), _("Specifies path to additional data used the game"), kCmdExtraBrowser);
+ else
+ new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _c("Extra Path:", "lowres"), _("Specifies path to additional data used the game"), kCmdExtraBrowser);
_extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath, _("Specifies path to additional data used the game"));
// GUI: Button + Label for the save path
@@ -1044,7 +1059,7 @@ void LauncherDialog::updateButtons() {
int modifiers = g_system->getEventManager()->getModifierState();
const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0;
const bool lowRes = g_system->getOverlayWidth() <= 320;
-
+
const char *newAddButtonLabel = massAdd
? (lowRes ? _c("Mass Add...", "lowres") : _("Mass Add..."))
: (lowRes ? _c("Add Game...", "lowres") : _("Add Game..."));
diff --git a/gui/message.cpp b/gui/message.cpp
index 6406976569..06b4524eab 100644
--- a/gui/message.cpp
+++ b/gui/message.cpp
@@ -58,7 +58,11 @@ MessageDialog::MessageDialog(const Common::String &message, const char *defaultB
int maxlineWidth = g_gui.getFont().wordWrapText(message, screenW - 2 * 20, lines);
// Calculate the desired dialog size (maxing out at 300*180 for now)
- _w = maxlineWidth + 20;
+ if (altButton)
+ _w = MAX(maxlineWidth, (2 * buttonWidth) + 10) + 20;
+ else
+ _w = MAX(maxlineWidth, buttonWidth) + 20;
+
lineCount = lines.size();
_h = 16;
diff --git a/gui/options.cpp b/gui/options.cpp
index 7c7093fa95..558a89386b 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -213,14 +213,8 @@ void OptionsDialog::open() {
}
if (_multiMidiCheckbox) {
- if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device")) {
- if (_domain.equals(Common::ConfigManager::kApplicationDomain)) {
- if (!loadMusicDeviceSetting(_gmDevicePopUp, Common::String(), MT_GM))
- _gmDevicePopUp->setSelected(0);
- } else {
- _gmDevicePopUp->setSelected(0);
- }
- }
+ if (!loadMusicDeviceSetting(_gmDevicePopUp, "gm_device"))
+ _gmDevicePopUp->setSelected(0);
// Multi midi setting
_multiMidiCheckbox->setState(ConfMan.getBool("multi_midi", _domain));
@@ -244,14 +238,8 @@ void OptionsDialog::open() {
// MT-32 options
if (_mt32DevicePopUp) {
- if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device")) {
- if (_domain.equals(Common::ConfigManager::kApplicationDomain)) {
- if (!loadMusicDeviceSetting(_mt32DevicePopUp, Common::String(), MT_MT32))
- _mt32DevicePopUp->setSelected(0);
- } else {
- _mt32DevicePopUp->setSelected(0);
- }
- }
+ if (!loadMusicDeviceSetting(_mt32DevicePopUp, "mt32_device"))
+ _mt32DevicePopUp->setSelected(0);
// Native mt32 setting
_mt32Checkbox->setState(ConfMan.getBool("native_mt32", _domain));
@@ -630,7 +618,7 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr
Common::String context;
if (g_system->getOverlayWidth() <= 320)
context = "lowres";
-
+
// The GFX mode popup
_gfxPopUpDesc = new StaticTextWidget(boss, prefix + "grModePopupDesc", _("Graphics mode:"));
_gfxPopUp = new PopUpWidget(boss, prefix + "grModePopup");
@@ -663,7 +651,10 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr
void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) {
// The MIDI mode popup & a label
- _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _domain == Common::ConfigManager::kApplicationDomain ? _("Preferred Device:") : _("Music Device:"), _domain == Common::ConfigManager::kApplicationDomain ? _("Specifies preferred sound device or sound card emulator") : _("Specifies output sound device or sound card emulator"));
+ if (g_system->getOverlayWidth() > 320)
+ _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _domain == Common::ConfigManager::kApplicationDomain ? _("Preferred Device:") : _("Music Device:"), _domain == Common::ConfigManager::kApplicationDomain ? _("Specifies preferred sound device or sound card emulator") : _("Specifies output sound device or sound card emulator"));
+ else
+ _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _domain == Common::ConfigManager::kApplicationDomain ? _c("Preferred Dev.:", "lowres") : _c("Music Device:", "lowres"), _domain == Common::ConfigManager::kApplicationDomain ? _("Specifies preferred sound device or sound card emulator") : _("Specifies output sound device or sound card emulator"));
_midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup", _("Specifies output sound device or sound card emulator"));
// Populate it
@@ -676,7 +667,7 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref
const uint32 deviceGuiOption = MidiDriver::musicType2GUIO(d->getMusicType());
if ((_domain == Common::ConfigManager::kApplicationDomain && d->getMusicType() != MT_TOWNS // global dialog - skip useless FM-Towns, C64, Amiga, AppleIIGS options there
- && d->getMusicType() != MT_C64 && d->getMusicType() != MT_AMIGA && d->getMusicType() != MT_APPLEIIGS)
+ && d->getMusicType() != MT_C64 && d->getMusicType() != MT_AMIGA && d->getMusicType() != MT_APPLEIIGS && d->getMusicType() != MT_PC98)
|| (_domain != Common::ConfigManager::kApplicationDomain && !(_guioptions & allFlags)) // No flags are specified
|| (_guioptions & deviceGuiOption) // flag is present
// HACK/FIXME: For now we have to show GM devices, even when the game only has GUIO_MIDIMT32 set,
@@ -716,13 +707,25 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi
// Populate
const MusicPlugin::List p = MusicMan.getPlugins();
+ // Make sure the null device is the first one in the list to avoid undesired
+ // auto detection for users who don't have a saved setting yet.
for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) {
MusicDevices i = (**m)->getDevices();
for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) {
- if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") {
+ if (d->getMusicDriverId() == "null")
+ _gmDevicePopUp->appendEntry(_("Don't use General MIDI music"), d->getHandle());
+ }
+ }
+ // Now we add the other devices.
+ for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) {
+ MusicDevices i = (**m)->getDevices();
+ for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) {
+ if (d->getMusicType() >= MT_GM) {
if (d->getMusicType() != MT_MT32)
_gmDevicePopUp->appendEntry(d->getCompleteName(), d->getHandle());
- }
+ } else if (d->getMusicDriverId() == "auto") {
+ _gmDevicePopUp->appendEntry(_("Use first available device"), d->getHandle());
+ }
}
}
@@ -760,18 +763,29 @@ void OptionsDialog::addMT32Controls(GuiObject *boss, const Common::String &prefi
if (g_system->getOverlayWidth() > 320)
_mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer"));
else
- _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _c("True Roland MT-32 (disable GM emulation)", "lowres"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer"));
+ _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _c("True Roland MT-32 (no GM emulation)", "lowres"), _("Check if you want to use your real hardware Roland-compatible sound device connected to your computer"));
// GS Extensions setting
_enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), _("Turns off General MIDI mapping for games with Roland MT-32 soundtrack"));
const MusicPlugin::List p = MusicMan.getPlugins();
+ // Make sure the null device is the first one in the list to avoid undesired
+ // auto detection for users who don't have a saved setting yet.
+ for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) {
+ MusicDevices i = (**m)->getDevices();
+ for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) {
+ if (d->getMusicDriverId() == "null")
+ _mt32DevicePopUp->appendEntry(_("Don't use Roland MT-32 music"), d->getHandle());
+ }
+ }
+ // Now we add the other devices.
for (MusicPlugin::List::const_iterator m = p.begin(); m != p.end(); ++m) {
MusicDevices i = (**m)->getDevices();
for (MusicDevices::iterator d = i.begin(); d != i.end(); ++d) {
- if (d->getMusicType() >= MT_GM || d->getMusicDriverId() == "auto") {
+ if (d->getMusicType() >= MT_GM)
_mt32DevicePopUp->appendEntry(d->getCompleteName(), d->getHandle());
- }
+ else if (d->getMusicDriverId() == "auto")
+ _mt32DevicePopUp->appendEntry(_("Use first available device"), d->getHandle());
}
}
@@ -795,7 +809,7 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p
_subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Speech"));
_subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subtitles"));
_subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _("Both"));
-
+
_subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:"));
} else {
_subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _c("Text and Speech:", "lowres"));
@@ -805,7 +819,7 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p
_subToggleSpeechOnly = new RadiobuttonWidget(boss, prefix + "subToggleSpeechOnly", _subToggleGroup, kSubtitlesSpeech, _("Spch"), _("Speech"));
_subToggleSubOnly = new RadiobuttonWidget(boss, prefix + "subToggleSubOnly", _subToggleGroup, kSubtitlesSubs, _("Subs"), _("Subtitles"));
_subToggleSubBoth = new RadiobuttonWidget(boss, prefix + "subToggleSubBoth", _subToggleGroup, kSubtitlesBoth, _c("Both", "lowres"), _("Show subtitles and play speech"));
-
+
_subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _c("Subtitle speed:", "lowres"));
}
@@ -968,24 +982,39 @@ GlobalOptionsDialog::GlobalOptionsDialog()
//
// 5) The Paths tab
//
- tab->addTab(_("Paths"));
+ if (g_system->getOverlayWidth() > 320)
+ tab->addTab(_("Paths"));
+ else
+ tab->addTab(_c("Paths", "lowres"));
#if !( defined(__DC__) || defined(__GP32__) )
// These two buttons have to be extra wide, or the text will be
// truncated in the small version of the GUI.
// Save game path
- new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), _("Specifies where your savegames are put"), kChooseSaveDirCmd);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path:"), _("Specifies where your savegames are put"), kChooseSaveDirCmd);
+ else
+ new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _c("Save Path:", "lowres"), _("Specifies where your savegames are put"), kChooseSaveDirCmd);
_savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar", _("Specifies where your savegames are put"));
- new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), 0, kChooseThemeDirCmd);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), 0, kChooseThemeDirCmd);
+ else
+ new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _c("Theme Path:", "lowres"), 0, kChooseThemeDirCmd);
_themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _c("None", "path"));
- new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), _("Specifies path to additional data used by all games or ScummVM"), kChooseExtraDirCmd);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), _("Specifies path to additional data used by all games or ScummVM"), kChooseExtraDirCmd);
+ else
+ new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _c("Extra Path:", "lowres"), _("Specifies path to additional data used by all games or ScummVM"), kChooseExtraDirCmd);
_extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _c("None", "path"), _("Specifies path to additional data used by all games or ScummVM"));
#ifdef DYNAMIC_MODULES
- new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), 0, kChoosePluginsDirCmd);
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), 0, kChoosePluginsDirCmd);
+ else
+ new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _c("Plugins Path:", "lowres"), 0, kChoosePluginsDirCmd);
_pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _c("None", "path"));
#endif
#endif
@@ -1010,7 +1039,7 @@ GlobalOptionsDialog::GlobalOptionsDialog()
_rendererPopUp->appendEntry(_(GUI::ThemeEngine::_rendererModes[i].name), GUI::ThemeEngine::_rendererModes[i].mode);
} else {
for (uint i = 1; i < GUI::ThemeEngine::_rendererModesSize; ++i)
- _rendererPopUp->appendEntry(_c(GUI::ThemeEngine::_rendererModes[i].name, "lowres"), GUI::ThemeEngine::_rendererModes[i].mode);
+ _rendererPopUp->appendEntry(_(GUI::ThemeEngine::_rendererModes[i].shortname), GUI::ThemeEngine::_rendererModes[i].mode);
}
if (g_system->getOverlayWidth() > 320)
@@ -1263,9 +1292,21 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3
Common::String theme = browser.getSelected();
// FIXME: Actually, any changes (including the theme change) should
// only become active *after* the options dialog has closed.
+ Common::String lang = TransMan.getCurrentLanguage();
+ Common::String oldTheme = g_gui.theme()->getThemeId();
if (g_gui.loadNewTheme(theme)) {
- _curTheme->setLabel(g_gui.theme()->getThemeName());
- ConfMan.set("gui_theme", theme);
+ // If the charset has changed, it means the font were not found for the
+ // new theme. Since for the moment we do not support change of translation
+ // language without restarting, we let the user know about this.
+ if (lang != TransMan.getCurrentLanguage()) {
+ TransMan.setLanguage(lang.c_str());
+ g_gui.loadNewTheme(oldTheme);
+ MessageDialog error(_("The theme you selected does not support your current language. If you want to use this theme you need to switch to another language first."));
+ error.runModal();
+ } else {
+ _curTheme->setLabel(g_gui.theme()->getThemeName());
+ ConfMan.set("gui_theme", theme);
+ }
}
draw();
}
diff --git a/gui/saveload.cpp b/gui/saveload.cpp
index 92cea00f30..3a86c5092e 100644
--- a/gui/saveload.cpp
+++ b/gui/saveload.cpp
@@ -179,7 +179,7 @@ void SaveLoadChooser::reflowLayout() {
uint16 w, h;
if (!g_gui.xmlEval()->getWidgetData("SaveLoadChooser.Thumbnail", x, y, w, h))
- error("Error when loading position data for Save/Load Thumbnails.");
+ error("Error when loading position data for Save/Load Thumbnails");
int thumbW = kThumbnailWidth;
int thumbH = kThumbnailHeight2;
diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip
index ea7ecd733c..1023e82ff9 100644
--- a/gui/themes/scummmodern.zip
+++ b/gui/themes/scummmodern.zip
Binary files differ
diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx
index 484dd15429..51f1ce6c6f 100644
--- a/gui/themes/scummmodern/scummmodern_layout.stx
+++ b/gui/themes/scummmodern/scummmodern_layout.stx
@@ -53,7 +53,7 @@
<def var = 'Tooltip.YDelta' value = '32'/>
<widget name = 'OptionsLabel'
- size = '110, Globals.Line.Height'
+ size = '115, Globals.Line.Height'
textalign = 'right'
/>
<widget name = 'SmallLabel'
@@ -344,7 +344,7 @@
<widget name = 'auPrefGmPopup'
type = 'PopUp'
/>
- </layout>
+ </layout>
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
<widget name = 'mcFontButton'
type = 'Button'
@@ -712,7 +712,7 @@
<layout type = 'vertical' padding = '24, 24, 24, 24' center = 'true'>
<widget name = 'vcMuteCheckbox'
type = 'Checkbox'
- width = '80' <!-- FIXME: Why this is needed? -->
+ width = '120' <!-- FIXME: Why this is needed? -->
/>
</layout>
</layout>
diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
index 5998c50b60..bd7b5fd8ea 100644
--- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx
+++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
@@ -483,7 +483,7 @@
</dialog>
<dialog name = 'GameOptions' overlays = 'screen' inset = '16' shading = 'dim'>
- <layout type = 'vertical' padding = '0, 0, 0, 0' spacing = '16'>
+ <layout type = 'vertical' padding = '0, 0, 0, 0'>
<widget name = 'TabWidget'/>
<layout type = 'horizontal' padding = '8, 8, 8, 8'>
<space/>
diff --git a/gui/themes/scummtheme.py b/gui/themes/scummtheme.py
index 4a03c89799..e4e9549265 100755
--- a/gui/themes/scummtheme.py
+++ b/gui/themes/scummtheme.py
@@ -11,28 +11,28 @@ def buildTheme(themeName):
if not os.path.isdir(themeName) or not os.path.isfile(os.path.join(themeName, "THEMERC")):
print ("Invalid theme name: " + themeName)
return
-
+
zf = zipfile.ZipFile(themeName + ".zip", 'w')
-
+
print ("Building '" + themeName + "' theme:")
os.chdir(themeName)
-
+
zf.write('THEMERC', './THEMERC')
-
+
for filename in os.listdir('.'):
if os.path.isfile(filename) and not filename[0] == '.' and filename.endswith(THEME_FILE_EXTENSIONS):
zf.write(filename, './' + filename)
print (" Adding file: " + filename)
-
+
os.chdir('../')
-
+
zf.close()
def buildAllThemes():
for f in os.listdir('.'):
if os.path.isdir(os.path.join('.', f)) and not f[0] == '.':
buildTheme(f)
-
+
def parseSTX(theme_file, def_file):
comm = re.compile("<!--(.*?)-->", re.DOTALL)
head = re.compile("<\?(.*?)\?>")
@@ -40,33 +40,33 @@ def parseSTX(theme_file, def_file):
output = ""
for line in theme_file:
output += line.rstrip("\r\n\t ").lstrip() + " \n"
-
+
output = re.sub(comm, "", output)
output = re.sub(head, "", output)
output = output.replace("\t", " ").replace(" ", " ").replace("\"", "'")
output = output.replace(" = ", "=").replace(", ", ",")
-
+
for line in output.splitlines():
if line and not line.isspace():
def_file.write("\"" + line + "\"\n")
def buildDefTheme(themeName):
def_file = open("default.inc", "w")
-
+
if not os.path.isdir(themeName):
print ("Cannot open default theme dir.")
-
+
def_file.write(""" "<?xml version = '1.0'?>"\n""")
-
+
for filename in os.listdir(themeName):
filename = os.path.join(themeName, filename)
if os.path.isfile(filename) and filename.endswith(".stx"):
theme_file = open(filename, "r")
parseSTX(theme_file, def_file)
theme_file.close()
-
+
def_file.close()
-
+
def printUsage():
print ("===============================")
print ("ScummVM Theme Generation Script")
@@ -80,16 +80,16 @@ def printUsage():
print (" Creates a 'default.inc' file to embed the given theme in the source code.\n")
def main():
-
+
if len(sys.argv) == 2 and sys.argv[1] == "makeall":
buildAllThemes()
-
+
elif len(sys.argv) == 3 and sys.argv[1] == "make":
buildTheme(sys.argv[2])
-
+
elif len(sys.argv) == 3 and sys.argv[1] == "default":
buildDefTheme(sys.argv[2])
-
+
else:
printUsage()
diff --git a/gui/themes/translations.dat b/gui/themes/translations.dat
index e00de3b9f3..b057f2ba44 100644
--- a/gui/themes/translations.dat
+++ b/gui/themes/translations.dat
Binary files differ