Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

Finish implementing geometry param type with reusable GeometryWidget

parent a5fbf0b4
......@@ -84,10 +84,10 @@ void AssetPanel::showTransition(int tid, std::shared_ptr<AssetParameterModel> tr
QString transitionName = TransitionsRepository::get()->getName(transitionId);
m_assetTitle->setText(i18n("Properties of transition %1", transitionName));
m_transitionWidget->setVisible(true);
m_transitionWidget->setModel(transitionModel, QPair<int, int>(-1, -1), true);
m_transitionWidget->setModel(transitionModel, QPair<int, int>(-1, -1), QSize(), true);
}
void AssetPanel::showEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel> effectsModel, QPair<int, int> range)
void AssetPanel::showEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel> effectsModel, QPair<int, int> range, QSize frameSize)
{
clear();
if (effectsModel == nullptr) {
......@@ -98,7 +98,7 @@ void AssetPanel::showEffectStack(const QString &clipName, std::shared_ptr<Effect
m_splitButton->setVisible(true);
m_switchBuiltStack->setVisible(true);
m_effectStackWidget->setVisible(true);
m_effectStackWidget->setModel(effectsModel, range);
m_effectStackWidget->setModel(effectsModel, range, frameSize);
}
void AssetPanel::clearAssetPanel(int itemId)
......
......@@ -53,7 +53,7 @@ public:
void showTransition(int tid, std::shared_ptr<AssetParameterModel> transition_model);
/* @brief Shows the parameters of the given effect stack model */
void showEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel> effectsModel, QPair<int, int> range);
void showEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel> effectsModel, QPair<int, int> range, QSize frameSize);
/* @brief Clear the panel so that it doesn't display anything */
void clear();
......
......@@ -42,7 +42,7 @@ AssetParameterView::AssetParameterView(QWidget *parent)
setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
}
void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, bool addSpacer)
void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, QSize frameSize, bool addSpacer)
{
qDebug() << "set model " << model.get();
unsetModel();
......@@ -59,7 +59,7 @@ void AssetParameterView::setModel(const std::shared_ptr<AssetParameterModel> &mo
// TODO refac
// animWidget->addParameter(index);
} else {
auto w = AbstractParamWidget::construct(model, index, range, this);
auto w = AbstractParamWidget::construct(model, index, range, frameSize, this);
if (type == ParamType::Geometry || type == ParamType::Animated || type == ParamType::RestrictedAnim || type == ParamType::AnimatedRect) {
animWidget = static_cast<AnimationWidget *>(w);
}
......
......@@ -44,7 +44,7 @@ public:
AssetParameterView(QWidget *parent = nullptr);
/** Sets the model to be displayed by current view */
virtual void setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, bool addSpacer = false);
virtual void setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, QSize frameSize, bool addSpacer = false);
/** Set the widget to display no model (this yield ownership on the smart-ptr)*/
void unsetModel();
......
......@@ -59,8 +59,7 @@ AbstractParamWidget::AbstractParamWidget(std::shared_ptr<AssetParameterModel> mo
{
}
AbstractParamWidget *AbstractParamWidget::construct(const std::shared_ptr<AssetParameterModel> &model, QModelIndex index, QPair<int, int> range,
QWidget *parent)
AbstractParamWidget *AbstractParamWidget::construct(const std::shared_ptr<AssetParameterModel> &model, QModelIndex index, QPair<int, int> range, QSize frameSize, QWidget *parent)
{
// We retrieve the parameter type
auto type = model->data(index, AssetParameterModel::TypeRole).value<ParamType>();
......@@ -84,7 +83,7 @@ AbstractParamWidget *AbstractParamWidget::construct(const std::shared_ptr<AssetP
widget = new KeyframeWidget(model, index, parent);
break;
case ParamType::Geometry:
widget = new GeometryEditWidget(model, index, range, parent);
widget = new GeometryEditWidget(model, index, range, frameSize, parent);
break;
case ParamType::Animated:
case ParamType::RestrictedAnim:
......
......@@ -46,7 +46,7 @@ public:
@param range For timeline clips, the in/out point in playlist
@param parent parent widget
*/
static AbstractParamWidget *construct(const std::shared_ptr<AssetParameterModel> &model, QModelIndex index, QPair<int, int> range, QWidget *parent);
static AbstractParamWidget *construct(const std::shared_ptr<AssetParameterModel> &model, QModelIndex index, QPair<int, int> range, QSize frameSize, QWidget *parent);
signals:
/** @brief Signal sent when the parameters hold by the widgets are modified
......
......@@ -32,23 +32,23 @@
#include <QLabel>
#include <QSlider>
GeometryEditWidget::GeometryEditWidget(std::shared_ptr<AssetParameterModel> model, QModelIndex index, QPair<int, int> range, QWidget *parent)
GeometryEditWidget::GeometryEditWidget(std::shared_ptr<AssetParameterModel> model, QModelIndex index, QPair<int, int> range, QSize frameSize, QWidget *parent)
: AbstractParamWidget(std::move(model), index, parent)
, m_min(range.first)
, m_max(range.second)
, m_active(false)
{
auto *layout = new QVBoxLayout(this);
QString comment = m_model->data(m_index, AssetParameterModel::CommentRole).toString();
const QString value = m_model->data(m_index, AssetParameterModel::ValueRole).toString();
m_geom = new GeometryWidget(QRect(100, 100, 500, 500), false, this);
const QString value = m_model->data(m_index, AssetParameterModel::ValueRole).toString().simplified();
QRect rect;
QStringList vals = value.split(QLatin1Char(' '));
if (vals.count() == 4) {
rect = QRect(vals.at(0).toInt(), vals.at(1).toInt(), vals.at(2).toInt(), vals.at(3).toInt());
}
m_geom = new GeometryWidget(pCore->getMonitor(m_model->monitorId), range, rect, frameSize, false, this);
m_geom->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred));
/*QString name = m_model->data(m_index, AssetParameterModel::NameRole).toString();
QLabel *label = new QLabel(name, this);
layout->addWidget(label);*/
layout->addWidget(m_geom);
m_monitor = pCore->getMonitor(m_model->monitorId);
connect(m_monitor, &Monitor::seekPosition, this, &GeometryEditWidget::monitorSeek, Qt::UniqueConnection);
// emit the signal of the base class when appropriate
connect(this->m_geom, &GeometryWidget::valueChanged, [this](const QString val) {
......@@ -63,8 +63,7 @@ GeometryEditWidget::~GeometryEditWidget()
void GeometryEditWidget::slotSetRange(QPair <int, int> range)
{
m_min = range.first;
m_max = range.second;
m_geom->slotSetRange(range);
}
void GeometryEditWidget::slotRefresh()
......@@ -84,40 +83,4 @@ void GeometryEditWidget::slotShowComment(bool show)
Q_UNUSED(show);
}
void GeometryEditWidget::monitorSeek(int pos)
{
// Update monitor scene for geometry params
if (pos >= m_min && pos < m_max) {
connectMonitor(true);
m_monitor->slotShowEffectScene(MonitorSceneGeometry);
m_monitor->setEffectKeyframe(true);
} else {
connectMonitor(false);
m_monitor->slotShowEffectScene(MonitorSceneDefault);
}
}
void GeometryEditWidget::connectMonitor(bool activate)
{
if (m_active == activate) {
return;
}
m_active = activate;
if (activate) {
connect(m_monitor, &Monitor::effectChanged, m_geom, &GeometryWidget::slotUpdateGeometryRect, Qt::UniqueConnection);
/*double ratio = (double)m_spinWidth->value() / m_spinHeight->value();
if (m_frameSize.width() != m_monitorSize.width() || m_frameSize.height() != m_monitorSize.height()) {
// Source frame size different than project frame size, enable original size option accordingly
bool isOriginalSize =
qAbs((double)m_frameSize.width() / m_frameSize.height() - ratio) < qAbs((double)m_monitorSize.width() / m_monitorSize.height() - ratio);
if (isOriginalSize) {
m_originalSize->blockSignals(true);
m_originalSize->setChecked(true);
m_originalSize->blockSignals(false);
}
}*/
} else {
disconnect(m_monitor, &Monitor::effectChanged, m_geom, &GeometryWidget::slotUpdateGeometryRect);
}
}
......@@ -30,7 +30,6 @@
class QSlider;
class GeometryWidget;
class Monitor;
/*@brief This class is used to display a parameter with time value */
class GeometryEditWidget : public AbstractParamWidget
......@@ -38,7 +37,7 @@ class GeometryEditWidget : public AbstractParamWidget
Q_OBJECT
public:
/** @brief Sets up the parameter's GUI.*/
explicit GeometryEditWidget(std::shared_ptr<AssetParameterModel> model, QModelIndex index, QPair<int, int> range, QWidget *parent = nullptr);
explicit GeometryEditWidget(std::shared_ptr<AssetParameterModel> model, QModelIndex index, QPair<int, int> range, QSize frameSize, QWidget *parent = nullptr);
~GeometryEditWidget();
public slots:
......@@ -56,15 +55,6 @@ public slots:
private:
GeometryWidget *m_geom;
int m_min;
int m_max;
bool m_active;
Monitor *m_monitor;
void connectMonitor(bool activate);
private slots:
/** @brief monitor seek pos changed. */
void monitorSeek(int pos);
signals:
void valueChanged();
......
......@@ -1439,7 +1439,7 @@ void Bin::selectProxyModel(const QModelIndex &id)
emit findInTimeline(QString());
emit requestClipShow(nullptr);
// clear effect stack
emit requestShowEffectStack(QString(), nullptr, QPair<int, int>());
emit requestShowEffectStack(QString(), nullptr, QPair<int, int>(), QSize());
// Display black bg in clip monitor
emit openClip(std::shared_ptr<ProjectClip>());
}
......@@ -2411,18 +2411,18 @@ void Bin::editMasterEffect(std::shared_ptr<AbstractProjectItem> clip)
if (clip) {
if (clip->itemType() == AbstractProjectItem::ClipItem) {
std::shared_ptr<ProjectClip>clp = std::static_pointer_cast<ProjectClip>(clip);
emit requestShowEffectStack(clp->clipName(), clp->m_effectStack, QPair<int, int>(0, clp->frameDuration()));
emit requestShowEffectStack(clp->clipName(), clp->m_effectStack, QPair<int, int>(0, clp->frameDuration()), clp->getFrameSize());
return;
}
if (clip->itemType() == AbstractProjectItem::SubClipItem) {
if (auto ptr = clip->parentItem().lock()) {
std::shared_ptr<ProjectClip>clp = std::static_pointer_cast<ProjectClip>(ptr);
emit requestShowEffectStack(clp->clipName(), clp->m_effectStack, QPair<int, int>(0, clp->frameDuration()));
emit requestShowEffectStack(clp->clipName(), clp->m_effectStack, QPair<int, int>(0, clp->frameDuration()), clp->getFrameSize());
}
return;
}
}
emit requestShowEffectStack(QString(), nullptr, QPair<int, int>());
emit requestShowEffectStack(QString(), nullptr, QPair<int, int>(), QSize());
}
void Bin::slotGotFocus()
......@@ -3412,7 +3412,7 @@ void Bin::setCurrent(std::shared_ptr<AbstractProjectItem> item)
case AbstractProjectItem::ClipItem: {
openProducer(std::static_pointer_cast<ProjectClip>(item));
std::shared_ptr<ProjectClip>clp = std::static_pointer_cast<ProjectClip>(item);
emit requestShowEffectStack(clp->clipName(), clp->m_effectStack, QPair<int, int>(0, clp->frameDuration()));
emit requestShowEffectStack(clp->clipName(), clp->m_effectStack, QPair<int, int>(0, clp->frameDuration()), clp->getFrameSize());
break;
}
case AbstractProjectItem::SubClipItem: {
......
......@@ -520,7 +520,7 @@ signals:
/** @brief Trigger timecode format refresh where needed. */
void refreshTimeCode();
/** @brief Request display of effect stack for a Bin clip. */
void requestShowEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QPair<int, int> range);
void requestShowEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QPair<int, int> range, QSize frameSize);
/** @brief Request that the given clip is displayed in the clip monitor */
void requestClipShow(std::shared_ptr<ProjectClip>);
void displayBinMessage(const QString &, KMessageWidget::MessageType);
......
......@@ -52,7 +52,7 @@
#include <KRecentDirs>
#include <klocalizedstring.h>
CollapsibleEffectView::CollapsibleEffectView(std::shared_ptr<EffectItemModel> effectModel, QPair<int, int> range, QImage icon, QWidget *parent)
CollapsibleEffectView::CollapsibleEffectView(std::shared_ptr<EffectItemModel> effectModel, QPair<int, int> range, QSize frameSize, QImage icon, QWidget *parent)
: AbstractCollapsibleWidget(parent)
/* , m_effect(effect)
, m_itemInfo(info)
......@@ -131,7 +131,7 @@ CollapsibleEffectView::CollapsibleEffectView(std::shared_ptr<EffectItemModel> ef
title->setText(effectName);
m_view = new AssetParameterView(this);
m_view->setModel(std::static_pointer_cast<AssetParameterModel>(effectModel), range);
m_view->setModel(std::static_pointer_cast<AssetParameterModel>(effectModel), range, frameSize);
connect(m_view, &AssetParameterView::seekToPos, this, &AbstractCollapsibleWidget::seekToPos);
QVBoxLayout *lay = new QVBoxLayout(widgetFrame);
lay->setContentsMargins(0, 0, 0, 0);
......
......@@ -45,7 +45,7 @@ class CollapsibleEffectView : public AbstractCollapsibleWidget
Q_OBJECT
public:
explicit CollapsibleEffectView(std::shared_ptr<EffectItemModel> effectModel, QPair<int, int> range, QImage icon, QWidget *parent = nullptr);
explicit CollapsibleEffectView(std::shared_ptr<EffectItemModel> effectModel, QPair<int, int> range, QSize frameSize, QImage icon, QWidget *parent = nullptr);
~CollapsibleEffectView();
QLabel *title;
......
......@@ -150,12 +150,13 @@ void EffectStackView::dropEvent(QDropEvent *event)
}
}
void EffectStackView::setModel(std::shared_ptr<EffectStackModel> model, QPair<int, int> range)
void EffectStackView::setModel(std::shared_ptr<EffectStackModel> model, QPair<int, int> range, const QSize frameSize)
{
qDebug()<<"MUTEX LOCK!!!!!!!!!!!! setmodel";
m_mutex.lock();
unsetModel();
m_model = model;
m_sourceFrameSize = frameSize;
m_effectsTree->setModel(m_model.get());
m_effectsTree->setItemDelegateForColumn(0, new WidgetDelegate(this));
m_effectsTree->setColumnHidden(1, true);
......@@ -189,7 +190,7 @@ void EffectStackView::loadEffects(QPair<int, int> range, int start, int end)
}
std::shared_ptr<EffectItemModel> effectModel = std::static_pointer_cast<EffectItemModel>(item);
QImage effectIcon = m_thumbnailer->requestImage(effectModel->getAssetId(), &size, QSize(QStyle::PM_SmallIconSize, QStyle::PM_SmallIconSize));
CollapsibleEffectView *view = new CollapsibleEffectView(effectModel, range, effectIcon, this);
CollapsibleEffectView *view = new CollapsibleEffectView(effectModel, range, m_sourceFrameSize, effectIcon, this);
qDebug() << "__ADDING EFFECT: " << effectModel->filter().get("id") << ", ACT: " << active;
if (i == active) {
view->slotActivateEffect(m_model->getIndexFromItem(effectModel));
......
......@@ -58,7 +58,7 @@ class EffectStackView : public QWidget
public:
EffectStackView(AssetPanel *parent);
virtual ~EffectStackView();
void setModel(std::shared_ptr<EffectStackModel> model, QPair<int, int> range);
void setModel(std::shared_ptr<EffectStackModel> model, QPair<int, int> range, const QSize frameSize);
void unsetModel(bool reset = true);
void setRange(int in, int out);
ObjectId stackOwner() const;
......@@ -75,7 +75,12 @@ private:
std::shared_ptr<EffectStackModel> m_model;
std::vector<CollapsibleEffectView *> m_widgets;
AssetIconProvider *m_thumbnailer;
/** @brief the in/out point of the clip in timeline
*/
QPair<int, int> m_range;
/** @brief the frame size of the original clip this effect is applied on
*/
QSize m_sourceFrameSize;
const QString getStyleSheet();
void loadEffects(QPair<int, int> range, int start = 0, int end = -1);
......
......@@ -494,6 +494,22 @@ ClipType ClipController::clipType() const
return m_clipType;
}
const QSize ClipController::getFrameSize() const
{
if (m_masterProducer == nullptr) {
return QSize();
}
int width = m_masterProducer->get_int("meta.media.width");
if (width == 0) {
width = m_masterProducer->get_int("width");
}
int height = m_masterProducer->get_int("meta.media.height");
if (height == 0) {
height = m_masterProducer->get_int("height");
}
return QSize(width, height);
}
QPixmap ClipController::pixmap(int framePosition, int width, int height)
{
m_masterProducer->seek(framePosition);
......
......@@ -125,7 +125,7 @@ public:
QString videoCodecProperty(const QString &property) const;
const QString codec(bool audioCodec) const;
const QString getClipHash() const;
const QSize getFrameSize() const;
/** @brief Returns the clip duration as a string like 00:00:02:01. */
const QString getStringDuration();
......
......@@ -171,6 +171,15 @@ int ClipModel::getIntProperty(const QString &name) const
return service()->get_int(name.toUtf8().constData());
}
QSize ClipModel::getFrameSize() const
{
READ_LOCK();
if (service()->parent().is_valid()) {
return QSize(service()->parent().get_int("meta.media.width"), service()->parent().get_int("meta.media.height"));
}
return QSize(service()->get_int("meta.media.width"), service()->get_int("meta.media.height"));
}
double ClipModel::getDoubleProperty(const QString &name) const
{
READ_LOCK();
......
......@@ -72,6 +72,7 @@ public:
const QString getProperty(const QString &name) const override;
int getIntProperty(const QString &name) const;
double getDoubleProperty(const QString &name) const;
QSize getFrameSize() const;
/* @brief returns the length of the item on the timeline
*/
......
......@@ -204,6 +204,14 @@ int TimelineModel::getClipPlaytime(int clipId) const
return playtime;
}
QSize TimelineModel::getClipFrameSize(int clipId) const
{
READ_LOCK();
Q_ASSERT(isClip(clipId));
const auto clip = m_allClips.at(clipId);
return clip->getFrameSize();
}
int TimelineModel::getTrackClipsCount(int trackId) const
{
READ_LOCK();
......
......@@ -214,6 +214,10 @@ public:
*/
int getClipPlaytime(int clipId) const;
/* @brief Returns the duration of a clip
@param clipId Id of the clip to test
*/
QSize getClipFrameSize(int clipId) const;
/* @brief Returns the number of clips in a given track
@param trackId Id of the track to test
*/
......
......@@ -500,7 +500,7 @@ void TimelineController::showAsset(int id)
QModelIndex clipIx = m_model->makeClipIndexFromID(id);
QString clipName = m_model->data(clipIx, Qt::DisplayRole).toString();
emit showClipEffectStack(clipName, m_model->getClipEffectStackModel(id),
QPair<int, int>(m_model->getClipPosition(id), m_model->getClipPosition(id) + m_model->getClipPlaytime(id)));
QPair<int, int>(m_model->getClipPosition(id), m_model->getClipPosition(id) + m_model->getClipPlaytime(id)), m_model->getClipFrameSize(id));
}
}
......
......@@ -344,7 +344,7 @@ signals:
void zoneMoved(const QPoint &zone);
/* @brief Requests that a given parameter model is displayed in the asset panel */
void showTransitionModel(int tid, std::shared_ptr<AssetParameterModel>);
void showClipEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QPair<int, int> range);
void showClipEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QPair<int, int> range, QSize frameSize);
/* @brief notify of chunks change
*/
void dirtyChunksChanged();
......
......@@ -72,7 +72,7 @@ signals:
/* @brief Requests that a given parameter model is displayed in the asset panel */
void showTransitionModel(int tid, std::shared_ptr<AssetParameterModel>);
/* @brief Requests that a given effectstack model is displayed in the asset panel */
void showClipEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QPair<int, int>);
void showClipEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QPair<int, int>, QSize);
private:
TimelineWidget *m_mainTimeline;
......
......@@ -36,7 +36,7 @@ TransitionStackView::TransitionStackView(QWidget *parent)
{
}
void TransitionStackView::setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, bool addSpacer)
void TransitionStackView::setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, QSize frameSize, bool addSpacer)
{
QHBoxLayout *lay = new QHBoxLayout;
m_trackBox = new QComboBox(this);
......@@ -46,7 +46,7 @@ void TransitionStackView::setModel(const std::shared_ptr<AssetParameterModel> &m
i.next();
m_trackBox->addItem(i.value(), i.key());
}
AssetParameterView::setModel(model, range, addSpacer);
AssetParameterView::setModel(model, range, frameSize, addSpacer);
int aTrack = pCore->getCompositionATrack(m_model->getOwnerId().second);
m_trackBox->setCurrentIndex(m_trackBox->findData(aTrack));
......
......@@ -32,7 +32,7 @@ class TransitionStackView : public AssetParameterView
public:
TransitionStackView(QWidget *parent = nullptr);
void setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, bool addSpacer = false);
void setModel(const std::shared_ptr<AssetParameterModel> &model, QPair<int, int> range, QSize frameSize, bool addSpacer = false);
private slots:
void updateTrack(int newTrack);
......
This diff is collapsed.
......@@ -29,6 +29,7 @@ class QAction;
class QMenu;
class KSelectAction;
class DragValue;
class Monitor;
/**
* @brief A widget for modifying numbers by dragging, using the mouse wheel or entering them with the keyboard.
......@@ -41,30 +42,35 @@ class GeometryWidget : public QWidget
public:
/**
* @brief Default constructor.
* @param label The label that will be displayed in the progress bar
* @param defaultValue The default value
* @param decimals The number of decimals for the parameter. 0 means it is an integer
* @param min The minimum value
* @param max The maximum value
* @param id Used to identify this widget. If this parameter is set, "Show in Timeline" will be available in context menu.
* @param suffix The suffix that will be displayed in the spinbox (for example '%')
* @param showSlider If disabled, user can still drag on the label but no progress bar is shown
* @param monitor The monitor attached to this stack
* @param range The in / out points of the clip, useful to desactivate monitor scene when out of bounds
* @param rect The default geometry value
* @param frameSize The frame size of the original source video
* @param useRatioLock When true, width/height will keep the profile's aspect ratio on resize
*/
explicit GeometryWidget(const QRect &rect, bool useRatioLock, QWidget *parent = nullptr);
explicit GeometryWidget(Monitor *monitor, QPair<int, int> range, const QRect &rect, const QSize frameSize, bool useRatioLock, QWidget *parent = nullptr);
private:
int m_min;
int m_max;
bool m_active;
Monitor *m_monitor;
void connectMonitor(bool activate);
DragValue *m_spinX;
DragValue *m_spinY;
DragValue *m_spinWidth;
DragValue *m_spinHeight;
DragValue *m_spinSize;
QSize m_defaultSize;
QSize m_sourceSize;
QAction *m_originalSize;
QAction *m_lockRatio;
const QString getValue() const;
void adjustSizeValue();
public slots:
void slotUpdateGeometryRect(const QRect r);
void slotSetRange(QPair<int, int>);
private slots:
void slotAdjustRectKeyframeValue();
......@@ -89,10 +95,11 @@ private slots:
void slotLockRatio();
void slotAdjustRectHeight();
void slotAdjustRectWidth();
/** @brief monitor seek pos changed. */
void monitorSeek(int pos);
signals:
void valueChanged(const QString val);
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment