Skip to content

Commit

Permalink
MediaListModel completed
Browse files Browse the repository at this point in the history
  • Loading branch information
Bardia Daneshvar committed Jun 26, 2016
1 parent 17a2d3e commit 59a8194
Show file tree
Hide file tree
Showing 15 changed files with 190 additions and 39 deletions.
13 changes: 12 additions & 1 deletion plugins.qmltypes
Original file line number Diff line number Diff line change
Expand Up @@ -3355,6 +3355,13 @@ Module {
Method { name: "check"; type: "bool" }
Method { name: "stop" }
}
Component {
name: "TelegramMediaListModel"
defaultProperty: "items"
prototype: "TelegramMessageSearchModel"
exports: ["TelegramQml/MediaListModel 2.0"]
exportMetaObjectRevisions: [0]
}
Component {
name: "TelegramMembersListModel"
defaultProperty: "items"
Expand All @@ -3369,7 +3376,8 @@ Module {
"RoleUser": 258,
"RoleKickedBy": 259,
"RoleType": 260,
"RolePeer": 261
"RolePeer": 261,
"RoleStatus": 262
}
}
Enum {
Expand All @@ -3388,6 +3396,7 @@ Module {
Property { name: "currentPeer"; type: "InputPeerObject"; isPointer: true }
Property { name: "filter"; type: "int" }
Property { name: "refreshing"; type: "bool"; isReadonly: true }
Property { name: "dateConvertorMethod"; type: "QJSValue" }
}
Component {
name: "TelegramMessageFetcher"
Expand Down Expand Up @@ -3593,9 +3602,11 @@ Module {
exports: ["TelegramQml/MessageSearchModel 2.0"]
exportMetaObjectRevisions: [0]
Property { name: "keyword"; type: "string" }
Property { name: "currentPeer"; type: "InputPeerObject"; isPointer: true }
Property { name: "messageFilter"; type: "int" }
Property { name: "minimumDate"; type: "QDateTime" }
Property { name: "maximumDate"; type: "QDateTime" }
Method { name: "loadBack" }
}
Component {
name: "TelegramNotificationHandler"
Expand Down
8 changes: 4 additions & 4 deletions telegramcache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@ bool TelegramCache::writeMap(const QString &path, const QMap<QString, QVariant>
if(p->encryptMethod.isCallable()) {
QQmlEngine *engine = qmlEngine(this);
if(engine) {
QJSValue res = p->encryptMethod.call(QJSValueList()<<engine->toScriptValue<QByteArray>(data));
QJSValue res = p->encryptMethod.call(QList<QJSValue>()<<engine->toScriptValue<QByteArray>(data));
data = engine->fromScriptValue<QByteArray>(res);
}
}
Expand Down Expand Up @@ -590,7 +590,7 @@ bool TelegramCache::writeList(const QString &path, const QList<QVariant> &list)
if(p->encryptMethod.isCallable()) {
QQmlEngine *engine = qmlEngine(this);
if(engine) {
QJSValue res = p->encryptMethod.call(QJSValueList()<<engine->toScriptValue<QByteArray>(data));
QJSValue res = p->encryptMethod.call(QList<QJSValue>()<<engine->toScriptValue<QByteArray>(data));
data = engine->fromScriptValue<QByteArray>(res);
}
}
Expand All @@ -611,7 +611,7 @@ QByteArray TelegramCache::read(const QString &path) const
if(p->decryptMethod.isCallable()) {
QQmlEngine *engine = qmlEngine(this);
if(engine) {
QJSValue res = p->decryptMethod.call(QJSValueList()<<engine->toScriptValue<QByteArray>(data));
QJSValue res = p->decryptMethod.call(QList<QJSValue>()<<engine->toScriptValue<QByteArray>(data));
data = engine->fromScriptValue<QByteArray>(res);
}
}
Expand All @@ -630,7 +630,7 @@ bool TelegramCache::write(const QString &path, QByteArray data) const
if(p->encryptMethod.isCallable()) {
QQmlEngine *engine = qmlEngine(this);
if(engine) {
QJSValue res = p->encryptMethod.call(QJSValueList()<<engine->toScriptValue<QByteArray>(data));
QJSValue res = p->encryptMethod.call(QList<QJSValue>()<<engine->toScriptValue<QByteArray>(data));
data = engine->fromScriptValue<QByteArray>(res);
}
}
Expand Down
4 changes: 2 additions & 2 deletions telegramdialoglistmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1353,7 +1353,7 @@ QString TelegramDialogListModel::convertDate(const QDateTime &td) const
{
QQmlEngine *engine = qmlEngine(this);
if(p->dateConvertorMethod.isCallable() && engine)
return p->dateConvertorMethod.call(QJSValueList()<<engine->toScriptValue<QDateTime>(td)).toString();
return p->dateConvertorMethod.call(QList<QJSValue>()<<engine->toScriptValue<QDateTime>(td)).toString();
else
if(!p->dateConvertorMethod.isNull() && !p->dateConvertorMethod.isUndefined())
return p->dateConvertorMethod.toString();
Expand All @@ -1375,7 +1375,7 @@ QString TelegramDialogListModel::messageText(MessageObject *msg) const
if(p->messageTextMethod.isCallable() && engine)
{
MessageObject *tmp = new MessageObject(msg->core(), msg);
QString res = p->messageTextMethod.call(QJSValueList()<<engine->newQObject(tmp)
QString res = p->messageTextMethod.call(QList<QJSValue>()<<engine->newQObject(tmp)
<<engine->toScriptValue<int>(static_cast<int>(TelegramTools::messageType(msg)))).toString();
delete tmp;
return res;
Expand Down
23 changes: 23 additions & 0 deletions telegrammedialistmodel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "telegrammedialistmodel.h"

class TelegramMediaListModelPrivate
{
public:
};

TelegramMediaListModel::TelegramMediaListModel(QObject *parent) :
TelegramMessageSearchModel(parent)
{
p = new TelegramMediaListModelPrivate;
}

QStringList TelegramMediaListModel::requiredProperties()
{
return QStringList() << FUNCTION_NAME(engine)
<< FUNCTION_NAME(messageFilter);
}

TelegramMediaListModel::~TelegramMediaListModel()
{
delete p;
}
21 changes: 21 additions & 0 deletions telegrammedialistmodel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef TELEGRAMMEDIALISTMODEL_H
#define TELEGRAMMEDIALISTMODEL_H

#include "telegrammessagesearchmodel.h"

class TelegramMediaListModelPrivate;
class TELEGRAMQMLSHARED_EXPORT TelegramMediaListModel : public TelegramMessageSearchModel
{
Q_OBJECT

public:
TelegramMediaListModel(QObject *parent = 0);
~TelegramMediaListModel();

static QStringList requiredProperties();

private:
TelegramMediaListModelPrivate *p;
};

#endif // TELEGRAMMEDIALISTMODEL_H
44 changes: 44 additions & 0 deletions telegrammemberslistmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@

#include <QPointer>
#include <QDateTime>
#include <QJSValue>
#include <QQmlEngine>
#include <QtQml>

class TelegramChatsMemebrsListModelItem
{
Expand Down Expand Up @@ -76,6 +79,7 @@ class TelegramMembersListModelPrivate

qint64 lastRequest;
QList<TelegramChatsMemebrsListModelItem> list;
QJSValue dateConvertorMethod;
};

TelegramMembersListModel::TelegramMembersListModel(QObject *parent) :
Expand Down Expand Up @@ -131,6 +135,20 @@ bool TelegramMembersListModel::refreshing() const
return p->refreshing;
}

QJSValue TelegramMembersListModel::dateConvertorMethod() const
{
return p->dateConvertorMethod;
}

void TelegramMembersListModel::setDateConvertorMethod(const QJSValue &method)
{
if(p->dateConvertorMethod.isNull() && method.isNull())
return;

p->dateConvertorMethod = method;
Q_EMIT dateConvertorMethodChanged();
}

TelegramChatsMemebrsListModelItem TelegramMembersListModel::id(const QModelIndex &index) const
{
return p->list.at(index.row());
Expand Down Expand Up @@ -162,6 +180,11 @@ QVariant TelegramMembersListModel::data(const QModelIndex &index, int role) cons
case RoleKickedBy:
result = QVariant::fromValue<UserObject*>(item.kicker.data());
break;
case RoleStatus:
result = TelegramTools::userStatus(item.user, [this](const QDateTime &dt){
return convertDate(dt);
});
break;
case RoleType:
result = static_cast<int>(TypeUnknown);
if(item.channelClassType)
Expand Down Expand Up @@ -223,6 +246,7 @@ QHash<int, QByteArray> TelegramMembersListModel::roleNames() const
result->insert(RoleKickedBy, "kickedBy");
result->insert(RoleType, "type");
result->insert(RolePeer, "peer");
result->insert(RoleStatus, "status");

return *result;
}
Expand Down Expand Up @@ -393,6 +417,26 @@ void TelegramMembersListModel::changed(const QList<TelegramChatsMemebrsListModel
Q_EMIT countChanged();
}

QString TelegramMembersListModel::convertDate(const QDateTime &td) const
{
QQmlEngine *engine = qmlEngine(this);
if(p->dateConvertorMethod.isCallable() && engine)
return p->dateConvertorMethod.call(QList<QJSValue>()<<engine->toScriptValue<QDateTime>(td)).toString();
else
if(!p->dateConvertorMethod.isNull() && !p->dateConvertorMethod.isUndefined())
return p->dateConvertorMethod.toString();
else
{
const QDateTime &current = QDateTime::currentDateTime();
const qint64 secs = td.secsTo(current);
const int days = td.daysTo(current);
if(secs < 24*60*60)
return days? "Yesterday " + td.toString("HH:mm") : td.toString("HH:mm");
else
return td.toString("MMM dd, HH:mm");
}
}

TelegramMembersListModel::~TelegramMembersListModel()
{
delete p;
Expand Down
11 changes: 10 additions & 1 deletion telegrammemberslistmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class TELEGRAMQMLSHARED_EXPORT TelegramMembersListModel : public TelegramAbstrac
Q_PROPERTY(InputPeerObject* currentPeer READ currentPeer WRITE setCurrentPeer NOTIFY currentPeerChanged)
Q_PROPERTY(qint32 filter READ filter WRITE setFilter NOTIFY filterChanged)
Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged)
Q_PROPERTY(QJSValue dateConvertorMethod READ dateConvertorMethod WRITE setDateConvertorMethod NOTIFY dateConvertorMethodChanged)

public:
enum DataRoles {
Expand All @@ -21,7 +22,8 @@ class TELEGRAMQMLSHARED_EXPORT TelegramMembersListModel : public TelegramAbstrac
RoleUser,
RoleKickedBy,
RoleType,
RolePeer
RolePeer,
RoleStatus
};

enum Types {
Expand All @@ -47,6 +49,9 @@ class TELEGRAMQMLSHARED_EXPORT TelegramMembersListModel : public TelegramAbstrac
void setRefreshing(bool refreshing);
bool refreshing() const;

QJSValue dateConvertorMethod() const;
void setDateConvertorMethod(const QJSValue &method);

class TelegramChatsMemebrsListModelItem id(const QModelIndex &index) const;
int count() const;

Expand All @@ -59,6 +64,7 @@ class TELEGRAMQMLSHARED_EXPORT TelegramMembersListModel : public TelegramAbstrac
void currentPeerChanged();
void filterChanged();
void refreshingChanged();
void dateConvertorMethodChanged();

public Q_SLOTS:

Expand All @@ -68,6 +74,9 @@ public Q_SLOTS:

void changed(const QList<class TelegramChatsMemebrsListModelItem> &list);

protected:
QString convertDate(const QDateTime &td) const;

private:
TelegramMembersListModelPrivate *p;
};
Expand Down
2 changes: 1 addition & 1 deletion telegrammessagelistmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1037,7 +1037,7 @@ QString TelegramMessageListModel::convertDate(const QDateTime &td) const
{
QQmlEngine *engine = qmlEngine(this);
if(p->dateConvertorMethod.isCallable() && engine)
return p->dateConvertorMethod.call(QJSValueList()<<engine->toScriptValue<QDateTime>(td)).toString();
return p->dateConvertorMethod.call(QList<QJSValue>()<<engine->toScriptValue<QDateTime>(td)).toString();
else
if(!p->dateConvertorMethod.isNull() && !p->dateConvertorMethod.isUndefined())
return p->dateConvertorMethod.toString();
Expand Down
35 changes: 29 additions & 6 deletions telegrammessagesearchmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ TelegramMessageSearchModel::TelegramMessageSearchModel(QObject *parent) :
p->lastRequest = 0;
p->minDate = QDateTime::fromTime_t(0);
p->maxDate = p->minDate;
p->filter = MessagesFilter::typeInputMessagesFilterEmpty;
p->filter = MessagesFilterObject::TypeInputMessagesFilterEmpty;
}

void TelegramMessageSearchModel::setCurrentPeer(InputPeerObject *peer)
Expand Down Expand Up @@ -110,37 +110,60 @@ QDateTime TelegramMessageSearchModel::maximumDate() const
QStringList TelegramMessageSearchModel::requiredProperties()
{
return QStringList() << FUNCTION_NAME(engine)
<< FUNCTION_NAME(currentPeer)
<< FUNCTION_NAME(keyword);
}

void TelegramMessageSearchModel::loadBack()
{
getFromServer(true);
}

void TelegramMessageSearchModel::refresh()
{
clean();
if(p->keyword.isEmpty() || !mEngine || !mEngine->telegram())
getFromServer(false);
}

void TelegramMessageSearchModel::getFromServer(bool more)
{
if((p->keyword.isEmpty() && (p->filter == MessagesFilterObject::TypeInputMessagesFilterEmpty || !p->peer))
|| !mEngine || !mEngine->telegram())
return;

setRefreshing(true);
DEFINE_DIS;
Telegram::Callback<MessagesMessages> callback = [this, dis](TG_MESSAGES_GET_MESSAGES_CALLBACK){
Telegram::Callback<MessagesMessages> callback = [this, dis, more](TG_MESSAGES_GET_MESSAGES_CALLBACK){
if(!dis || p->lastRequest != msgId) return;
setRefreshing(false);
if(!error.null) {
setError(error.errorText, error.errorCode);
return;
}
setHasBackMore(false);
processOnResult(result);
processOnResult(result, more);
};

MessagesFilterObject filter;
filter.setClassType(p->filter);

Telegram *tg = mEngine->telegram();
if(p->peer)
{
int offset = more? count() : 0;
p->lastRequest = tg->messagesSearch(false, p->peer->core(), p->keyword, filter.core(), p->minDate.toTime_t(),
p->maxDate.toTime_t(), 0, 0, limit(), callback);
p->maxDate.toTime_t(), offset, 0, limit(), callback);
}
else
p->lastRequest = tg->messagesSearchGlobal(p->keyword, 0, InputPeer::null, 0, limit(), callback);
{
int offset = 0;
if(more)
{
MessageObject *msg = get(count(), RoleMessageItem).value<MessageObject*>();
if(msg) offset = msg->id();
}
p->lastRequest = tg->messagesSearchGlobal(p->keyword, 0, InputPeer::null, offset, limit(), callback);
}
}

TelegramMessageSearchModel::~TelegramMessageSearchModel()
Expand Down
4 changes: 4 additions & 0 deletions telegrammessagesearchmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class TELEGRAMQMLSHARED_EXPORT TelegramMessageSearchModel : public TelegramMessa
{
Q_OBJECT
Q_PROPERTY(QString keyword READ keyword WRITE setKeyword NOTIFY keywordChanged)
Q_PROPERTY(InputPeerObject* currentPeer READ currentPeer WRITE setCurrentPeer NOTIFY currentPeerChanged)
Q_PROPERTY(int messageFilter READ messageFilter WRITE setMessageFilter NOTIFY messageFilterChanged)
Q_PROPERTY(QDateTime minimumDate READ minimumDate WRITE setMinimumDate NOTIFY minimumDateChanged)
Q_PROPERTY(QDateTime maximumDate READ maximumDate WRITE setMaximumDate NOTIFY maximumDateChanged)
Expand Down Expand Up @@ -41,11 +42,14 @@ class TELEGRAMQMLSHARED_EXPORT TelegramMessageSearchModel : public TelegramMessa
void messageFilterChanged();
void minimumDateChanged();
void maximumDateChanged();
void currentPeerChanged();

public Q_SLOTS:
void loadBack();

protected:
virtual void refresh();
void getFromServer(bool more = false);

private:
TelegramMessageSearchModelPrivate *p;
Expand Down
Loading

0 comments on commit 59a8194

Please sign in to comment.