Skip to content

Commit

Permalink
Fixed muc nick coloring in asynchronous webengine
Browse files Browse the repository at this point in the history
  • Loading branch information
Ri0n committed Apr 22, 2017
1 parent 251eecb commit 736dd55
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 21 deletions.
1 change: 1 addition & 0 deletions src/chatview_webkit.cpp
Expand Up @@ -571,6 +571,7 @@ void ChatView::dispatchMessage(const MessageView &mv)
if (mv.type() == MessageView::MUCJoin) {
Jid j = d->jid_.withResource(mv.nick());
vm["avatar"] = ChatViewJSObject::avatarUrl(d->account_->avatarFactory()->userHashes(j).avatar);
vm["nickcolor"] = getMucNickColor(mv.nick(), mv.isLocal());
}
auto it = vm.find(QLatin1String("usertext"));
if (it != vm.end()) {
Expand Down
23 changes: 19 additions & 4 deletions src/chatviewtheme.cpp
Expand Up @@ -74,7 +74,7 @@ class ChatViewThemePrivate : public QSharedData
#else
QStringList scripts;
#endif
std::function<void(bool)> loadCallback;
QList<std::function<void(bool)>> loadCallback;

#ifndef QT_WEBENGINEWIDGETS_LIB
QVariant evaluateFromFile(const QString fileName, QWebFrame *frame)
Expand Down Expand Up @@ -153,13 +153,19 @@ public slots:
void finishThemeLoading()
{
qDebug("%s theme is successfully loaded", qPrintable(theme->id()));
theme->cvtd->loadCallback(true);
for (auto &cb : theme->cvtd->loadCallback) {
cb(true);
}
theme->setState(Theme::Loaded);
}

void errorThemeLoading(const QString &error)
{
_loadError = error;
theme->cvtd->loadCallback(false);
for (auto &cb : theme->cvtd->loadCallback) {
cb(false);
}
theme->setState(Theme::NotLoaded);
}

void setHtml(const QString &h)
Expand Down Expand Up @@ -438,8 +444,17 @@ bool ChatViewTheme::load(std::function<void(bool)> loadCallback)
return false;
}

if (state() == Loaded) {
loadCallback(true);
return true;
}
cvtd->loadCallback.push_back(loadCallback);
if (state() == Loading) {
return true;
}

qDebug("Starting loading \"%s\" theme at \"%s\"", qPrintable(id()), qPrintable(filePath()));
cvtd->loadCallback = loadCallback;
setState(Loading);
if (cvtd->jsUtil.isNull())
cvtd->jsLoader.reset(new ChatViewJSLoader(this));
cvtd->jsUtil.reset(new ChatViewThemeJSUtil(this));
Expand Down
9 changes: 5 additions & 4 deletions src/groupchatdlg.cpp
Expand Up @@ -1547,6 +1547,7 @@ void GCMainDlg::presence(const QString &nick, const Status &s)
//contact joining
//ui_.log->updateAvatar(jid().withResource(nick), isSelf? ChatViewCommon::LocalParty: ChatViewCommon::Participant);

MessageView mv(MessageView::MUCJoin);
if ((!d->connecting || options_->getOption("options.ui.muc.show-initial-joins").toBool()) && options_->getOption("options.muc.show-joins").toBool() ) {
QString message = tr("%1 has joined the room");
if ( options_->getOption("options.muc.show-role-affiliation").toBool() ) {
Expand All @@ -1573,15 +1574,15 @@ void GCMainDlg::presence(const QString &nick, const Status &s)
message += tr(" and now is %1").arg(status2txt(s.type()));
}

MessageView mv = MessageView::mucJoinMessage(nick, (int)s.type(), message, s.status(), s.priority());
mv = MessageView::mucJoinMessage(nick, (int)s.type(), message, s.status(), s.priority());
mv.setStatusChangeHidden(!showStatusChanges);
appendSysMsg(mv);
} else {
MessageView mv = MessageView::mucJoinMessage(nick, (int)s.type(), QString(), s.status(), s.priority());
mv = MessageView::mucJoinMessage(nick, (int)s.type(), QString(), s.status(), s.priority());
mv.setStatusChangeHidden();
mv.setJoinLeaveHidden();
appendSysMsg(mv);
}
mv.setLocal(isSelf); // hack
appendSysMsg(mv);
}
else {
// Status change
Expand Down
14 changes: 14 additions & 0 deletions src/theme.cpp
Expand Up @@ -39,6 +39,7 @@ class ThemePrivate : public QSharedData
{
public:
PsiThemeProvider *provider;
Theme::State state = Theme::NotLoaded;

// metadata
QString id, name, version, description, creation, homeUrl;
Expand Down Expand Up @@ -99,6 +100,14 @@ bool Theme::isValid() const
return d;
}

Theme::State Theme::state() const
{
if (!d) {
return Invalid;
}
return d->state;
}

bool Theme::load()
{
return false;
Expand Down Expand Up @@ -299,6 +308,11 @@ QString Theme::title() const
return d->name.isEmpty()? d->id : d->name;
}

void Theme::setState(Theme::State state)
{
d->state = state;
}

//=================================================
// Reource Loader
//=================================================
Expand Down
10 changes: 10 additions & 0 deletions src/theme.h
Expand Up @@ -55,13 +55,20 @@ class Theme
virtual bool fileExists(const QString &fileName) = 0;
};

enum State {
Invalid,
NotLoaded,
Loading,
Loaded
};

Theme();
Theme(PsiThemeProvider *provider);
Theme(const Theme &other);
Theme &operator=(const Theme &other);
virtual ~Theme();
bool isValid() const;
State state() const;

virtual bool exists() = 0;
virtual bool load(); // synchronous load
Expand Down Expand Up @@ -95,6 +102,9 @@ class Theme

virtual QString title() const;
virtual QByteArray screenshot() = 0; // this hack must be replaced with something widget based
protected:
void setState(State state);

private:
friend class ThemePrivate;
QExplicitlySharedDataPointer<ThemePrivate> d;
Expand Down
5 changes: 5 additions & 0 deletions src/themeserver.cpp
Expand Up @@ -2,6 +2,7 @@
#include <QTcpServer>

#include "themeserver.h"
#include "psiiconset.h"


ThemeServer::ThemeServer(QObject *parent) :
Expand Down Expand Up @@ -35,6 +36,10 @@ ThemeServer::ThemeServer(QObject *parent) :
return;
}
}
} else if (path.startsWith(QLatin1Literal("/favicon.ico"))) {
res->setStatusCode(qhttp::ESTATUS_OK);
res->end(IconsetFactory::icon(QLatin1String("psi/logo_16")).raw());
return;
}


Expand Down
2 changes: 1 addition & 1 deletion themes/chatview/psi/classic/index.html
Expand Up @@ -132,7 +132,7 @@
sentrec : function() {return shared.cdata.spooled?"infmsg":
(shared.cdata.local?"sent":"received");},
nickcolor : function() {
return shared.session.mucNickColor(shared.cdata.sender, shared.cdata.local);
return util.nickColor(shared.cdata.sender);
},
icon : function() {
var icon = "";
Expand Down
26 changes: 14 additions & 12 deletions themes/chatview/util.js
Expand Up @@ -5,7 +5,7 @@ function initPsiTheme() {
server.console("Util is initilizing");
var htmlSource = document.createElement("div"); //manages appendHtml
var async = (typeof QWebChannel != 'undefined');
var avatarsMap = {};
var usersMap = {};

var chat = {
async : async,
Expand Down Expand Up @@ -168,7 +168,13 @@ function initPsiTheme() {
},

avatarForNick : function(nick) {
return avatarsMap[nick];
var u = usersMap[nick];
return u && u.avatar;
},

nickColor : function(nick) {
var u = usersMap[nick];
return u && u.nickcolor;
},

replaceableMessage : function(msgId, text) {
Expand Down Expand Up @@ -343,21 +349,17 @@ function initPsiTheme() {
receiveObject : function(data) {
if (data.type == "message") {
if (data.mtype == "join") {
avatarsMap[data.sender] = data.avatar; // can be null.
usersMap[data.sender] = {avatar:data.avatar, nickcolor:data.nickcolor};
if (data.nopartjoin) return;
} else if (data.mtype == "join") {
delete avatarsMap[data.sender];
} else if (data.mtype == "part") {
delete usersMap[data.sender];
if (data.nopartjoin) return;
} else if (data.mtype == "newnick") {
avatarsMap[data.newnick] = avatarsMap[data.sender];
delete avatarsMap[data.sender];
usersMap[data.newnick] = usersMap[data.sender];
delete usersMap[data.sender];
}
} else if (data.type == "avatar") {
if (data.avatar) {
avatarsMap[data.sender] = data.avatar;
} else {
delete avatarsMap[data.sender];
}
usersMap[data.sender].avatar = data.avatar;
}

chat.adapter.receiveObject(data)
Expand Down

0 comments on commit 736dd55

Please sign in to comment.