Format codes 0x12 and 0x16 toggle the swap of foreground and
background colors. In the current implementation, the color
swap only applies to custom colors, i.e. mIRC colors and hex
colors. Normal text is not affected.
Since this is not a styleable property, remove support for it
from the stylesheet parser.
fmtType |= FormatType::Italic;
else if (condValue == "underline")
fmtType |= FormatType::Underline;
fmtType |= FormatType::Italic;
else if (condValue == "underline")
fmtType |= FormatType::Underline;
- else if (condValue == "reverse")
- fmtType |= FormatType::Reverse;
else {
qWarning() << Q_FUNC_INFO << tr("Invalid format name: %1").arg(condValue);
return invalid;
else {
qWarning() << Q_FUNC_INFO << tr("Invalid format name: %1").arg(condValue);
return invalid;
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <vector>
#include <QApplication>
#include <vector>
#include <QApplication>
_formatCodes["%B"] = FormatType::Bold;
_formatCodes["%S"] = FormatType::Italic;
_formatCodes["%U"] = FormatType::Underline;
_formatCodes["%B"] = FormatType::Bold;
_formatCodes["%S"] = FormatType::Italic;
_formatCodes["%U"] = FormatType::Underline;
- _formatCodes["%R"] = FormatType::Reverse;
_formatCodes["%DN"] = FormatType::Nick;
_formatCodes["%DH"] = FormatType::Hostmask;
_formatCodes["%DN"] = FormatType::Nick;
_formatCodes["%DH"] = FormatType::Hostmask;
}
Format curfmt{baseFormat, {}, {}};
}
Format curfmt{baseFormat, {}, {}};
+ QChar fgChar{'f'}; // character to indicate foreground color, changed when reversing
int pos = 0; quint16 length = 0;
for (;;) {
int pos = 0; quint16 length = 0;
for (;;) {
quint32 color = 10 * s[pos+4].digitValue() + s[pos+5].digitValue();
// Color values 0-15 are traditional mIRC colors, defined in the stylesheet and thus going through the format engine
// Larger color values are hardcoded and applied separately (cf. https://modern.ircdocs.horse/formatting.html#colors-16-98)
quint32 color = 10 * s[pos+4].digitValue() + s[pos+5].digitValue();
// Color values 0-15 are traditional mIRC colors, defined in the stylesheet and thus going through the format engine
// Larger color values are hardcoded and applied separately (cf. https://modern.ircdocs.horse/formatting.html#colors-16-98)
+ if (s[pos+3] == fgChar) {
if (color < 16) {
// Traditional mIRC color, defined in the stylesheet
curfmt.type &= 0xf0ffffff;
if (color < 16) {
// Traditional mIRC color, defined in the stylesheet
curfmt.type &= 0xf0ffffff;
}
else if (s[pos+1] == 'D' && s[pos+2] == 'h') { // Hex color
QColor color{s.mid(pos+4, 7)};
}
else if (s[pos+1] == 'D' && s[pos+2] == 'h') { // Hex color
QColor color{s.mid(pos+4, 7)};
+ if (s[pos+3] == fgChar) {
curfmt.type &= 0xf0bfffff; // mask out mIRC foreground color
curfmt.foreground = std::move(color);
}
curfmt.type &= 0xf0bfffff; // mask out mIRC foreground color
curfmt.foreground = std::move(color);
}
curfmt.type &= 0x000000ff; // we keep message type-specific formatting
curfmt.foreground = QColor{};
curfmt.background = QColor{};
curfmt.type &= 0x000000ff; // we keep message type-specific formatting
curfmt.foreground = QColor{};
curfmt.background = QColor{};
- else if (s[pos+1] == 'R') { // reverse
- // TODO: implement reverse formatting
-
+ else if (s[pos+1] == 'R') { // Reverse colors
+ fgChar = (fgChar == 'f' ? 'b' : 'f');
+ quint32 orig = static_cast<quint32>(curfmt.type & 0xffc00000);
+ curfmt.type &= 0x003fffff;
+ curfmt.type |= (orig & 0x00400000) <<1;
+ curfmt.type |= (orig & 0x0f000000) <<4;
+ curfmt.type |= (orig & 0x00800000) >>1;
+ curfmt.type |= (orig & 0xf0000000) >>4;
+ std::swap(curfmt.foreground, curfmt.background);
length = 2;
}
else { // all others are toggles
length = 2;
}
else { // all others are toggles
Bold = 0x00000100,
Italic = 0x00000200,
Underline = 0x00000400,
Bold = 0x00000100,
Italic = 0x00000200,
Underline = 0x00000400,
// Individual parts of a message
Timestamp = 0x00001000,
// Individual parts of a message
Timestamp = 0x00001000,