diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2014-10-06 15:03:54 +0200 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2014-10-06 15:03:54 +0200 |
| commit | 529f38bd8878b6b1bea2b5457031ce936aab8d80 (patch) | |
| tree | 1193caefcad12f6a36f818048e4547e60add4398 /libcommuni/examples/quick/qml/MessageFormatter.qml | |
| parent | 3b58b5536935adff242928ed9f30e1c0262fbd7c (diff) | |
| download | manager-529f38bd8878b6b1bea2b5457031ce936aab8d80.tar.gz manager-529f38bd8878b6b1bea2b5457031ce936aab8d80.zip | |
addedd communi
Diffstat (limited to 'libcommuni/examples/quick/qml/MessageFormatter.qml')
| -rw-r--r-- | libcommuni/examples/quick/qml/MessageFormatter.qml | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/libcommuni/examples/quick/qml/MessageFormatter.qml b/libcommuni/examples/quick/qml/MessageFormatter.qml new file mode 100644 index 0000000..754ca1c --- /dev/null +++ b/libcommuni/examples/quick/qml/MessageFormatter.qml @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import Communi 3.0 + +QtObject { + id: root + + property IrcTextFormat textFormat: IrcTextFormat { + id: textFormat + + palette.gray: "#606060" + palette.lightGray: "#808080" + + // http://ethanschoonover.com/solarized + palette.blue: "#268bd2" + palette.green: "#859900" + palette.red: "#dc322f" + palette.brown: "#cb4b16" + palette.purple: "#6c71c4" + palette.orange: "#cb4b16" + palette.yellow: "#b58900" + palette.lightGreen: "#859900" + palette.cyan: "#2aa198" + palette.lightCyan: "#2aa198" + palette.lightBlue: "#268bd2" + palette.pink: "#6c71c4" + } + + function formatMessage(message) { + var formatted + switch (message.type) { + case IrcMessage.Invite: formatted = formatInviteMessage(message); break + case IrcMessage.Join: formatted = formatJoinMessage(message); break + case IrcMessage.Kick: formatted = formatKickMessage(message); break + case IrcMessage.Mode: formatted = formatModeMessage(message); break + case IrcMessage.Names: formatted = formatNamesMessage(message); break + case IrcMessage.Nick: formatted = formatNickMessage(message); break + case IrcMessage.Notice: formatted = formatNoticeMessage(message); break + case IrcMessage.Numeric: formatted = formatNumericMessage(message); break + case IrcMessage.Part: formatted = formatPartMessage(message); break + case IrcMessage.Private: formatted = formatPrivateMessage(message); break + case IrcMessage.Quit: formatted = formatQuitMessage(message); break + case IrcMessage.Topic: formatted = formatTopicMessage(message); break + } + return formatText(formatted, message.timeStamp) + } + + function formatText(text, timeStamp) { + if (text) { + switch (text[0]) { + case '!': text = qsTr("<font color='gray'>%1</font>").arg(text); break; + case '[': text = qsTr("<font color='brown'>%1</font>").arg(text); break; + case '*': text = qsTr("<font color='darkmagenta'>%1</font>").arg(text); break; + case '?': text = qsTr("<font color='brown'>%1</font>").arg(text); break; + default: break; + } + + return qsTr("<font color='gray'>[%1]</font> %2").arg(Qt.formatTime(timeStamp, "hh:mm:ss")).arg(text) + } + } + + function formatInviteMessage(message) { + var sender = formatName(message.nick) + return qsTr("! %1 invited to %3").arg(sender).arg(message.channel) + } + + function formatJoinMessage(message) { + var sender = formatName(message.nick) + return qsTr("! %1 joined %2").arg(sender).arg(message.channel) + } + + function formatKickMessage(message) { + var sender = formatName(message.nick) + var user = formatName(message.user) + if (message.reason.length) + return qsTr("! %1 kicked %2 (%3)").arg(sender).arg(user).arg(message.reason) + return qsTr("! %1 kicked %2").arg(sender).arg(user) + } + + function formatModeMessage(message) { + var sender = formatName(message.nick) + if (message.reply) + return qsTr("! %1 mode is %2 %3").arg(message.target).arg(message.mode).arg(message.argument) + return qsTr("! %1 sets mode %2 %3").arg(sender).arg(message.mode).arg(message.argument) + } + + function formatNamesMessage(message) { + return qsTr("! %1 has %2 users").arg(message.channel).arg(message.names.length) + } + + function formatNickMessage(message) { + var sender = formatName(message.nick) + var nick = formatName(message.newNick) + return qsTr("! %1 changed nick to %2").arg(sender).arg(nick) + } + + function formatNoticeMessage(message) { + var sender = formatName(message.nick) + var content = formatHtml(message.content) + return qsTr("[%1] %2").arg(sender).arg(content) + } + + function formatNumericMessage(message) { + switch (message.code) { + case Irc.RPL_TOPIC: + case Irc.RPL_TOPICWHOTIME: + case Irc.RPL_CHANNEL_URL: + case Irc.RPL_NAMREPLY: + case Irc.RPL_ENDOFNAMES: + return // ignore + default: + return qsTr("[%1] %2").arg(message.code).arg(message.parameters.slice(1).join(" ")) + } + } + + function formatPartMessage(message) { + var sender = formatName(message.nick) + if (message.reason.length) + return qsTr("! %1 parted %2 (%3)").arg(sender).arg(message.channel).arg(formatHtml(message.reason)) + return qsTr("! %1 parted %2").arg(sender).arg(message.channel) + } + + function formatPrivateMessage(message) { + var sender = formatName(message.nick) + var content = formatHtml(message.content) + if (message.action) + return qsTr("* %1 %2").arg(sender).arg(content) + if (message.request) + return qsTr("! %1 requested %2").arg(sender).arg(content.split(" ")[0].toLowerCase()) + return qsTr("<%1> %2").arg(sender).arg(content) + } + + function formatQuitMessage(message) { + var sender = formatName(message.nick) + if (message.reason.length) + return qsTr("! %1 has quit (%2)").arg(sender).arg(formatHtml(message.reason)) + return qsTr("! %1 has quit").arg(sender) + } + + function formatTopicMessage(message) { + var sender = formatName(message.nick) + var topic = formatHtml(message.topic) + var channel = message.channel + if (message.reply) + return qsTr("! %1 topic is \"%2\"").arg(channel).arg(topic) + return qsTr("! %1 sets topic \"%2\" on %3").arg(sender).arg(topic).arg(channel) + } + + function formatHtml(message) { + return textFormat.toHtml(message) + } + + function formatName(name) { + var color = hslToRgb((hashCode(name) % 359)/359, 0.5, 0.25) + var r = ("0" + Math.round(Math.abs(color[0])).toString(16)).substr(-2) + var g = ("0" + Math.round(Math.abs(color[1])).toString(16)).substr(-2) + var b = ("0" + Math.round(Math.abs(color[2])).toString(16)).substr(-2) + return qsTr("<b><font color='#%1'>%2</font></b>").arg(r+g+b).arg(name); + } + + function hashCode(str) { + var hash = 0; + if (str.length == 0) return hash; + for (var i = 0; i < str.length; i++) { + var chr = str.charCodeAt(i); + hash = ((hash<<5)-hash)+chr; + hash = hash & hash; // Convert to 32bit integer + } + return hash; + } + + /** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param Number h The hue + * @param Number s The saturation + * @param Number l The lightness + * @return Array The RGB representation + */ + function hslToRgb(h, s, l){ + var r, g, b; + + function hue2rgb(p, q, t){ + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s == 0){ + r = g = b = l; // achromatic + }else{ + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return [r * 255, g * 255, b * 255]; + } +} |
