diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp index a6b2c2ffca79..5771f27b2405 100644 --- a/engines/director/lingo/lingo-object.cpp +++ b/engines/director/lingo/lingo-object.cpp @@ -27,6 +27,8 @@ #include "director/cast.h" #include "director/channel.h" #include "director/castmember.h" +#include "director/movie.h" +#include "director/score.h" #include "director/window.h" #include "director/util.h" #include "director/lingo/lingo.h" @@ -984,6 +986,19 @@ Datum TextCastMember::getField(int field) { } bool TextCastMember::setField(int field, const Datum &d) { + Channel *toEdit = nullptr; + Common::Array channels = g_director->getCurrentMovie()->getScore()->_channels; + for (uint i = 0; i < channels.size(); i++) { + if (channels[i]->_sprite->_cast == this) { + toEdit = channels[i]; + break; + } + } + if (toEdit) { + Common::Rect bbox = toEdit->getBbox(); + toEdit->_widget = createWidget(bbox, toEdit, toEdit->_sprite->_spriteType); + } + switch (field) { case kTheBackColor: { @@ -1029,22 +1044,45 @@ bool TextCastMember::setField(int field, const Datum &d) { } return true; case kTheTextFont: - warning("STUB: set textFont"); - // d is STRING here - _fontId = d.asInt(); + if (!toEdit) { + warning("Channel containing this CastMember %d doesn't exist", (int) _castId); + return false; + } + ((Graphics::MacText *)toEdit->_widget)->enforceTextFont((uint16) g_director->_wm->_fontMan->getFontIdByName(d.asString())); + _ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText(); + _ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true); _modified = true; - return false; + toEdit->_widget->removeWidget(_widget); + return true; case kTheTextHeight: _lineSpacing = d.asInt(); _modified = true; return false; case kTheTextSize: - setTextSize(d.asInt()); - return false; + if (!toEdit) { + warning("Channel containing this CastMember %d doesn't exist", (int) _castId); + return false; + } + ((Graphics::MacText *)toEdit->_widget)->setTextSize(d.asInt()); + _ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText(); + _ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true); + _modified = true; + toEdit->_widget->removeWidget(_widget); + return true; case kTheTextStyle: - _textSlant = d.asInt(); + { + if (!toEdit) { + warning("Channel containing this CastMember %d doesn't exist", (int) _castId); + return false; + } + int slant = g_director->_wm->_fontMan->parseSlantFromName(d.asString()); + ((Graphics::MacText *)toEdit->_widget)->enforceTextSlant(slant); + _ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText(); + _ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true); _modified = true; - return false; + toEdit->_widget->removeWidget(_widget); + return true; + } default: break; } diff --git a/graphics/macgui/macfontmanager.cpp b/graphics/macgui/macfontmanager.cpp index 2a424bc3b90a..0eb6e01713e8 100644 --- a/graphics/macgui/macfontmanager.cpp +++ b/graphics/macgui/macfontmanager.cpp @@ -512,22 +512,24 @@ int MacFontManager::parseFontSlant(Common::String slant) { int MacFontManager::parseSlantFromName(const Common::String &name) { int slantVal = 0; - if (name.contains(" Bold")) + if (name.contains(" Bold") || name.equalsIgnoreCase("Bold")) slantVal |= kMacFontBold; - if (name.contains(" Italic")) + if (name.contains(" Italic") || name.equalsIgnoreCase("Italic")) slantVal |= kMacFontItalic; - if (name.contains(" Regular")) + if (name.contains(" Regular") || name.equalsIgnoreCase("Regular")) slantVal |= kMacFontRegular; - if (name.contains(" Underline")) + if (name.contains(" Underline") || name.equalsIgnoreCase("Underline")) slantVal |= kMacFontUnderline; - if (name.contains(" Shadow")) + if (name.contains(" Shadow") || name.equalsIgnoreCase("Shadow")) slantVal |= kMacFontShadow; - if (name.contains(" Outline")) + if (name.contains(" Outline") || name.equalsIgnoreCase("Outline")) slantVal |= kMacFontOutline; - if (name.contains(" Condense")) + if (name.contains(" Condense") || name.equalsIgnoreCase("Condense")) slantVal |= kMacFontCondense; - if (name.contains(" Extend")) + if (name.contains(" Extend") || name.equalsIgnoreCase("Extend")) slantVal |= kMacFontExtend; + if (name.contains(" Plain") || name.equalsIgnoreCase("Plain")) + slantVal = kMacFontRegular; return slantVal; } @@ -591,6 +593,11 @@ int MacFontManager::getFontIdByName(Common::String name) { if (_fontIds.contains(name)) return _fontIds[name]; + for (auto it = _fontIds.begin(); it != _fontIds.end(); it++) { + if (it->_key.equalsIgnoreCase(name)) { + return it->_value; + } + } return 1; } diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp index 5855fda541b1..740d043dfc40 100644 --- a/graphics/macgui/mactext.cpp +++ b/graphics/macgui/mactext.cpp @@ -337,6 +337,18 @@ void MacText::setColors(uint32 fg, uint32 bg) { _contentIsDirty = true; } +void MacText::enforceTextFont(uint16 fontId) { + for (uint i = 0; i < _textLines.size(); i++) { + for (uint j = 0; j < _textLines[i].chunks.size(); j++) { + _textLines[i].chunks[j].fontId = fontId; + } + } + + _fullRefresh = true; + render(); + _contentIsDirty = true; +} + void MacText::setTextSize(int textSize) { for (uint i = 0; i < _textLines.size(); i++) { for (uint j = 0; j < _textLines[i].chunks.size(); j++) { @@ -472,6 +484,22 @@ void MacText::setTextSlant(int textSlant, int start, int end) { setTextChunks(start, end, textSlant, setTextSlantCallback); } +void MacText::enforceTextSlant(int textSlant) { + for (uint i = 0; i < _textLines.size(); i++) { + for (uint j = 0; j < _textLines[i].chunks.size(); j++) { + if (textSlant) { + _textLines[i].chunks[j].textSlant |= textSlant; + } else { + _textLines[i].chunks[j].textSlant = textSlant; + } + } + } + + _fullRefresh = true; + render(); + _contentIsDirty = true; +} + // this maybe need to amend // currently, we just return the text size of first character. int MacText::getTextSize(int start, int end) { @@ -1620,6 +1648,17 @@ Common::U32String MacText::getEditedString() { return getTextChunk(_editableRow, 0, -1, -1); } +Common::U32String MacText::getPlainText() { + Common::U32String res; + for (uint i = 0; i < _textLines.size(); i++) { + for (uint j = 0; j < _textLines[i].chunks.size(); j++) { + res += _textLines[i].chunks[j].text; + } + } + + return res; +} + Common::U32String MacText::cutSelection() { if (!isCutAllowed()) return Common::U32String(); diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h index fd78e0add453..0031a619091e 100644 --- a/graphics/macgui/mactext.h +++ b/graphics/macgui/mactext.h @@ -194,6 +194,7 @@ class MacText : public MacWidget { void appendText(const Common::U32String &str, const Font *font, uint16 r = 0, uint16 g = 0, uint16 b = 0, bool skipAdd = false); int getTextFont() { return _defaultFormatting.fontId; } + void enforceTextFont(uint16 fontId); // because currently, we are counting linespacing as font height int getTextSize() { return _defaultFormatting.fontSize; } @@ -210,6 +211,7 @@ class MacText : public MacWidget { int getTextSlant(int start, int end); void setTextSlant(int textSlant, int start, int end); + void enforceTextSlant(int textSlant); // director text related-functions int getMouseChar(int x, int y); @@ -272,6 +274,7 @@ class MacText : public MacWidget { Common::U32String getEditedString(); Common::U32String getText() { return _str; } + Common::U32String getPlainText(); void setSelRange(int selStart, int selEnd);