You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.0 KiB
80 lines
2.0 KiB
/* |
|
SPDX-FileCopyrightText: 2019 João Netto <joaonetto901@gmail.com> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include "kjs_ocg_p.h" |
|
|
|
#include <kjs/kjsinterpreter.h> |
|
#include <kjs/kjsobject.h> |
|
#include <kjs/kjsprototype.h> |
|
|
|
#include <QAbstractItemModel> |
|
#include <QDebug> |
|
#include <QPair> |
|
#include <QString> |
|
|
|
using namespace Okular; |
|
|
|
static KJSPrototype *g_OCGProto; |
|
|
|
typedef QHash<QPair<int, int> *, QAbstractItemModel *> OCGCache; |
|
Q_GLOBAL_STATIC(OCGCache, g_OCGCache) |
|
|
|
// OCG.state (getter) |
|
static KJSObject OCGGetState(KJSContext *, void *object) |
|
{ |
|
QPair<int, int> *pair = reinterpret_cast<QPair<int, int> *>(object); |
|
QAbstractItemModel *model = g_OCGCache->value(pair); |
|
|
|
const QModelIndex index = model->index(pair->first, pair->second); |
|
|
|
const bool state = model->data(index, Qt::CheckStateRole).toBool(); |
|
|
|
return KJSBoolean(state); |
|
} |
|
|
|
// OCG.state (setter) |
|
static void OCGSetState(KJSContext *ctx, void *object, KJSObject value) |
|
{ |
|
QPair<int, int> *pair = reinterpret_cast<QPair<int, int> *>(object); |
|
QAbstractItemModel *model = g_OCGCache->value(pair); |
|
|
|
const QModelIndex index = model->index(pair->first, pair->second); |
|
|
|
const bool state = value.toBoolean(ctx); |
|
|
|
model->setData(index, QVariant(state ? Qt::Checked : Qt::Unchecked), Qt::CheckStateRole); |
|
} |
|
|
|
void JSOCG::initType(KJSContext *ctx) |
|
{ |
|
static bool initialized = false; |
|
if (initialized) |
|
return; |
|
initialized = true; |
|
|
|
g_OCGProto = new KJSPrototype(); |
|
|
|
g_OCGProto->defineProperty(ctx, QStringLiteral("state"), OCGGetState, OCGSetState); |
|
} |
|
|
|
KJSObject JSOCG::object(KJSContext *ctx) |
|
{ |
|
return g_OCGProto->constructObject(ctx, nullptr); |
|
} |
|
|
|
KJSObject JSOCG::wrapOCGObject(KJSContext *ctx, QAbstractItemModel *model, const int i, const int j) |
|
{ |
|
QPair<int, int> *pair = new QPair<int, int>(i, j); |
|
g_OCGCache->insert(pair, model); |
|
return g_OCGProto->constructObject(ctx, pair); |
|
} |
|
|
|
void JSOCG::clearCachedFields() |
|
{ |
|
if (g_OCGCache.exists()) { |
|
g_OCGCache->clear(); |
|
} |
|
}
|
|
|