Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/app/GUI/Dialogs/dialogsinterfaceimpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,13 @@ void DialogsInterfaceImpl::showExpressionDialog(QrealAnimator* const target) con
dialog->show();
}

void DialogsInterfaceImpl::showExpressionDialog(QStringAnimator* const target) const {
const auto parent = MainWindow::sGetInstance();
const auto dialog = new ExpressionDialog(target, parent);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
}

void DialogsInterfaceImpl::showApplyExpressionDialog(QrealAnimator* const target) const {
const auto parent = MainWindow::sGetInstance();
const auto dialog = new ApplyExpressionDialog(target, parent);
Expand Down
1 change: 1 addition & 0 deletions src/app/GUI/Dialogs/dialogsinterfaceimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class DialogsInterfaceImpl : public DialogsInterface {
stdsptr<ShaderEffectCreator> execShaderChooser(
const QString& name, const ShaderOptions& options) const;
void showExpressionDialog(QrealAnimator* const target) const;
void showExpressionDialog(QStringAnimator* const target) const;
void showApplyExpressionDialog(QrealAnimator* const target) const;
void showDurationSettingsDialog(DurationRectangle* const target) const;
/*bool execAnimationToPaint(const AnimationBox* const src,
Expand Down
61 changes: 52 additions & 9 deletions src/app/GUI/Expressions/expressiondialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
#include <Qsci/qscilexerjavascript.h>
#include <Qsci/qsciapis.h>

#include "Animators/qrealanimator.h"
#include "Animators/qstringanimator.h"
#include "Expressions/expression.h"
#include "Boxes/boundingbox.h"
#include "Private/document.h"
Expand Down Expand Up @@ -318,16 +320,57 @@ void addBasicDefs(QsciAPIs* const target)
}
}

ExpressionDialog::TargetOps ExpressionDialog::makeOps(QrealAnimator* const target) {
return ExpressionDialog::TargetOps{
target,
target->prp_getName(),
Expression::sQrealAnimatorTester,
[target]() { return target->getExpressionBindingsString(); },
[target]() { return target->getExpressionDefinitionsString(); },
[target]() { return target->getExpressionScriptString(); },
[target](const qsptr<Expression>& expr) { target->setExpression(expr); },
[target](const qsptr<Expression>& expr) { target->setExpressionAction(expr); }
};
}

ExpressionDialog::TargetOps ExpressionDialog::makeOps(QStringAnimator* const target) {
return ExpressionDialog::TargetOps{
target,
target->prp_getName(),
Expression::sQStringAnimatorTester,
[target]() { return target->getExpressionBindingsString(); },
[target]() { return target->getExpressionDefinitionsString(); },
[target]() { return target->getExpressionScriptString(); },
[target](const qsptr<Expression>& expr) { target->setExpression(expr); },
[target](const qsptr<Expression>& expr) { target->setExpressionAction(expr); }
};
}

ExpressionDialog::ExpressionDialog(QrealAnimator* const target,
QWidget * const parent)
: ExpressionDialog(makeOps(target), parent) {}

ExpressionDialog::ExpressionDialog(QStringAnimator* const target,
QWidget * const parent)
: ExpressionDialog(makeOps(target), parent) {}

ExpressionDialog::ExpressionDialog(const TargetOps& ops,
QWidget * const parent)
: Friction::Ui::Dialog(parent)
, mTarget(target)
, mContext(ops.context)
, mTargetName(ops.name)
, mResultTester(ops.tester)
, mGetBindings(ops.getBindings)
, mGetDefinitions(ops.getDefinitions)
, mGetScript(ops.getScript)
, mSetExpression(ops.setExpression)
, mSetExpressionAction(ops.setExpressionAction)
, mTab(nullptr)
, mTabEditor(0)
, mPresetsCombo(nullptr)
, mSettings(eSettings::sInstance)
{
setWindowTitle(tr("Expression %1").arg(target->prp_getName()));
setWindowTitle(tr("Expression %1").arg(mTargetName));

const auto windowLayout = new QVBoxLayout(this);
setLayout(windowLayout);
Expand Down Expand Up @@ -368,7 +411,7 @@ ExpressionDialog::ExpressionDialog(QrealAnimator* const target,
tabLayout->addWidget(mDefinitionsButon);
mainLayout->addLayout(tabLayout);

mBindings = new ExpressionEditor(target, this);
mBindings = new ExpressionEditor(mContext, mGetBindings(), this);
connect(mBindings, &ExpressionEditor::textChanged,
this, [this]() {
mBindingsChanged = true;
Expand Down Expand Up @@ -396,7 +439,7 @@ ExpressionDialog::ExpressionDialog(QrealAnimator* const target,

mDefinitions->setLexer(mDefsLexer);
mDefinitions->setAutoCompletionSource(QsciScintilla::AcsAll);
mDefinitions->setText(target->getExpressionDefinitionsString());
mDefinitions->setText(mGetDefinitions());
connect(mDefinitions, &QsciScintilla::textChanged, this, [this]() {
mDefinitions->autoCompleteFromAll();
mDefinitionsChanged = true;
Expand Down Expand Up @@ -424,7 +467,7 @@ ExpressionDialog::ExpressionDialog(QrealAnimator* const target,

mScript->setLexer(mScriptLexer);
mScript->setAutoCompletionSource(QsciScintilla::AcsAll);
mScript->setText(target->getExpressionScriptString());
mScript->setText(mGetScript());
connect(mScript, &QsciScintilla::textChanged,
mScript, &QsciScintilla::autoCompleteFromAll);
mainLayout->addWidget(mScript, 2);
Expand Down Expand Up @@ -594,7 +637,7 @@ bool ExpressionDialog::getBindings(PropertyBindingMap& bindings)
try {
bindings = PropertyBindingParser::parseBindings(bindingsStr,
nullptr,
mTarget);
mContext);
mBindingsButton->setIcon(QIcon());
return true;
} catch (const std::exception& e) {
Expand Down Expand Up @@ -648,7 +691,7 @@ bool ExpressionDialog::apply(const bool action)
QJSValue eEvaluate;
try {
Expression::sAddScriptTo(scriptStr, bindings, *engine, eEvaluate,
Expression::sQrealAnimatorTester);
mResultTester);
} catch (const std::exception& e) {
mScriptError->setText(e.what());
mBindingsButton->setIcon(mRedDotIcon);
Expand All @@ -662,9 +705,9 @@ bool ExpressionDialog::apply(const bool action)
std::move(eEvaluate));
if (expr && !expr->isValid()) { expr = nullptr; }
if (action) {
mTarget->setExpressionAction(expr);
mSetExpressionAction(expr);
} else {
mTarget->setExpression(expr);
mSetExpression(expr);
}
} catch (const std::exception& e) {
return false;
Expand Down
34 changes: 33 additions & 1 deletion src/app/GUI/Expressions/expressiondialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,20 @@
#include <QComboBox>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <functional>

#include "conncontext.h"
#include "dialogs/dialog.h"
#include "Private/esettings.h"
#include "smartPointers/selfref.h"

class QrealAnimator;
class QStringAnimator;
class ExpressionEditor;
class PropertyBindingBase;
class Property;
class QJSValue;
class Expression;

class JSLexer;
class JSEditor;
Expand All @@ -53,8 +59,27 @@ class ExpressionDialog : public Friction::Ui::Dialog
public:
ExpressionDialog(QrealAnimator* const target,
QWidget * const parent = nullptr);
ExpressionDialog(QStringAnimator* const target,
QWidget * const parent = nullptr);

private:
using ResultTester = std::function<void(const QJSValue&)>;
using ExpressionSetter = std::function<void(const qsptr<Expression>&)>;
struct TargetOps {
Property* context = nullptr;
QString name;
ResultTester tester;
std::function<QString()> getBindings;
std::function<QString()> getDefinitions;
std::function<QString()> getScript;
ExpressionSetter setExpression;
ExpressionSetter setExpressionAction;
};

ExpressionDialog(const TargetOps& ops, QWidget* const parent);
static TargetOps makeOps(QrealAnimator* const target);
static TargetOps makeOps(QStringAnimator* const target);

using PropertyBindingMap = std::map<QString, QSharedPointer<PropertyBindingBase>>;
bool getBindings(PropertyBindingMap& bindings);
void updateScriptBindings();
Expand All @@ -76,7 +101,14 @@ class ExpressionDialog : public Friction::Ui::Dialog
Friction::Core::ExpressionPresets::Expr *expr,
const bool &showId = true);

QrealAnimator* const mTarget;
Property* const mContext;
const QString mTargetName;
const ResultTester mResultTester;
const std::function<QString()> mGetBindings;
const std::function<QString()> mGetDefinitions;
const std::function<QString()> mGetScript;
const ExpressionSetter mSetExpression;
const ExpressionSetter mSetExpressionAction;

QTabWidget *mTab;
int mTabEditor;
Expand Down
7 changes: 1 addition & 6 deletions src/app/GUI/Expressions/expressioneditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,7 @@
#include "expressionhighlighter.h"
#include "themesupport.h"

ExpressionEditor::ExpressionEditor(QrealAnimator * const target,
QWidget * const parent) :
ExpressionEditor(target, target->getExpressionBindingsString(), parent) {}

ExpressionEditor::ExpressionEditor(QrealAnimator * const target,
ExpressionEditor::ExpressionEditor(Property * const target,
const QString &text,
QWidget * const parent)
: QTextEdit(parent)
Expand Down Expand Up @@ -197,4 +193,3 @@ QString ExpressionEditor::textUnderCursor() const {
}
return result;
}

7 changes: 2 additions & 5 deletions src/app/GUI/Expressions/expressioneditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#include <QAbstractItemView>

#include "GUI/global.h"
#include "Animators/qrealanimator.h"
#include "Properties/property.h"

class ExpressionHighlighter;

Expand All @@ -42,10 +42,7 @@ class ExpressionEditor : public QTextEdit
Q_OBJECT

public:
ExpressionEditor(QrealAnimator* const target,
QWidget* const parent);

ExpressionEditor(QrealAnimator* const target,
ExpressionEditor(Property* const target,
const QString& text, QWidget* const parent);

void setCompleterList(const QStringList& values);
Expand Down
2 changes: 1 addition & 1 deletion src/app/GUI/Expressions/expressionhighlighter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#include "expressioneditor.h"

ExpressionHighlighter::ExpressionHighlighter(
QrealAnimator * const target,
Property * const target,
ExpressionEditor * const editor,
QTextDocument *parent) :
QSyntaxHighlighter(parent),
Expand Down
6 changes: 3 additions & 3 deletions src/app/GUI/Expressions/expressionhighlighter.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,13 @@

#include <QSyntaxHighlighter>

#include "Animators/qrealanimator.h"
#include "Properties/property.h"

class ExpressionEditor;

class ExpressionHighlighter : public QSyntaxHighlighter {
public:
ExpressionHighlighter(QrealAnimator* const target,
ExpressionHighlighter(Property* const target,
ExpressionEditor* const editor,
QTextDocument *parent);

Expand Down Expand Up @@ -68,7 +68,7 @@ class ExpressionHighlighter : public QSyntaxHighlighter {
QStringList mBaseComplete;
QStringList mBaseVarsComplete;

QrealAnimator* const mTarget;
Property* const mTarget;
ComplexAnimator* const mSearchCtxt;
ExpressionEditor* const mEditor;
};
Expand Down
Loading