From 0022ce0265a98f78eb5d019968655df78a89eed4 Mon Sep 17 00:00:00 2001 From: Till Theato Date: Sun, 9 May 2010 17:06:25 +0000 Subject: [PATCH] Improve accessibility of geometryval (see: http://kdenlive.org/forum/effects-transitions-accessibility) svn path=/trunk/kdenlive/; revision=4426 --- src/geometryval.cpp | 335 +++++++++++++++------------------- src/geometryval.h | 19 +- src/widgets/geometryval_ui.ui | 320 +++++++++++++++++++++++++------- 3 files changed, 406 insertions(+), 268 deletions(-) diff --git a/src/geometryval.cpp b/src/geometryval.cpp index 6409cc79..2edcf86f 100644 --- a/src/geometryval.cpp +++ b/src/geometryval.cpp @@ -75,34 +75,19 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, int s buttonAdd->setToolTip(i18n("Add keyframe")); buttonDelete->setIcon(KIcon("edit-delete")); buttonDelete->setToolTip(i18n("Delete keyframe")); - + m_configMenu = new QMenu(i18n("Misc..."), this); - buttonMenu->setIcon(KIcon("system-run")); buttonMenu->setMenu(m_configMenu); - buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup); - - - m_editGeom = m_configMenu->addAction(i18n("Edit keyframe"), this, SLOT(slotGeometry())); - - m_scaleMenu = new QMenu(i18n("Resize..."), this); - m_configMenu->addMenu(m_scaleMenu); - m_scaleMenu->addAction(i18n("50%"), this, SLOT(slotResize50())); - m_scaleMenu->addAction(i18n("100%"), this, SLOT(slotResize100())); - m_scaleMenu->addAction(i18n("200%"), this, SLOT(slotResize200())); - m_scaleMenu->addAction(i18n("Original size"), this, SLOT(slotResizeOriginal())); - m_scaleMenu->addAction(i18n("Custom"), this, SLOT(slotResizeCustom())); - - m_alignMenu = new QMenu(i18n("Align..."), this); - m_configMenu->addMenu(m_alignMenu); - m_alignMenu->addAction(i18n("Center"), this, SLOT(slotAlignCenter())); - m_alignMenu->addAction(i18n("Hor. Center"), this, SLOT(slotAlignHCenter())); - m_alignMenu->addAction(i18n("Vert. Center"), this, SLOT(slotAlignVCenter())); - m_alignMenu->addAction(i18n("Right"), this, SLOT(slotAlignRight())); - m_alignMenu->addAction(i18n("Left"), this, SLOT(slotAlignLeft())); - m_alignMenu->addAction(i18n("Top"), this, SLOT(slotAlignTop())); - m_alignMenu->addAction(i18n("Bottom"), this, SLOT(slotAlignBottom())); - - + buttonMenu->setPopupMode(QToolButton::MenuButtonPopup); + + m_editOptions = m_configMenu->addAction(KIcon("system-run"), i18n("Show/Hide options")); + m_editOptions->setCheckable(true); + buttonMenu->setDefaultAction(m_editOptions); + connect(m_editOptions, SIGNAL(triggered()), this, SLOT(slotSwitchOptions())); + slotSwitchOptions(); + + m_reset = m_configMenu->addAction(KIcon("view-refresh"), i18n("Reset"), this, SLOT(slotResetPosition())); + m_syncAction = m_configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor())); m_syncAction->setCheckable(true); m_syncAction->setChecked(KdenliveSettings::transitionfollowcursor()); @@ -121,16 +106,40 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, int s connect(buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame())); connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties())); connect(m_scene, SIGNAL(doubleClickEvent()), this, SLOT(slotGeometry())); - + + buttonhcenter->setIcon(KIcon("kdenlive-align-hor")); + buttonhcenter->setToolTip(i18n("Align item horizontally")); + buttonvcenter->setIcon(KIcon("kdenlive-align-vert")); + buttonvcenter->setToolTip(i18n("Align item vertically")); + buttontop->setIcon(KIcon("kdenlive-align-top")); + buttontop->setToolTip(i18n("Align item to top")); + buttonbottom->setIcon(KIcon("kdenlive-align-bottom")); + buttonbottom->setToolTip(i18n("Align item to bottom")); + buttonright->setIcon(KIcon("kdenlive-align-right")); + buttonright->setToolTip(i18n("Align item to right")); + buttonleft->setIcon(KIcon("kdenlive-align-left")); + buttonleft->setToolTip(i18n("Align item to left")); + + connect(buttonhcenter, SIGNAL(clicked()), this, SLOT(slotAlignHCenter())); + connect(buttonvcenter, SIGNAL(clicked()), this, SLOT(slotAlignVCenter())); + connect(buttontop, SIGNAL(clicked()), this, SLOT(slotAlignTop())); + connect(buttonbottom, SIGNAL(clicked()), this, SLOT(slotAlignBottom())); + connect(buttonright, SIGNAL(clicked()), this, SLOT(slotAlignRight())); + connect(buttonleft, SIGNAL(clicked()), this, SLOT(slotAlignLeft())); + connect(spinX, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryX(int))); + connect(spinY, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryY(int))); + connect(spinWidth, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryWidth(int))); + connect(spinHeight, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryHeight(int))); + connect(spinResize, SIGNAL(valueChanged(int)), this, SLOT(slotResizeCustom(int))); + connect(buttonResize, SIGNAL(clicked()), this, SLOT(slotResizeOriginal())); + + connect(this, SIGNAL(parameterChanged()), this, SLOT(slotUpdateGeometry())); } Geometryval::~Geometryval() { m_scene->disconnect(); - delete m_scaleMenu; - delete m_alignMenu; - delete m_editGeom; delete m_syncAction; delete m_configMenu; delete m_paramRect; @@ -142,164 +151,70 @@ Geometryval::~Geometryval() } -void Geometryval::slotAlignCenter() -{ - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - m_paramRect->setPos((m_realWidth - m_paramRect->rect().width()) / 2, (m_profile.height - m_paramRect->rect().height()) / 2); - slotUpdateTransitionProperties(); -} - void Geometryval::slotAlignHCenter() { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } m_paramRect->setPos((m_realWidth - m_paramRect->rect().width()) / 2, m_paramRect->pos().y()); slotUpdateTransitionProperties(); } void Geometryval::slotAlignVCenter() { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } m_paramRect->setPos(m_paramRect->pos().x(), (m_profile.height - m_paramRect->rect().height()) / 2); slotUpdateTransitionProperties(); } void Geometryval::slotAlignTop() { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } m_paramRect->setPos(m_paramRect->pos().x(), 0); slotUpdateTransitionProperties(); } void Geometryval::slotAlignBottom() { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } m_paramRect->setPos(m_paramRect->pos().x(), m_profile.height - m_paramRect->rect().height()); slotUpdateTransitionProperties(); } void Geometryval::slotAlignLeft() { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } m_paramRect->setPos(0, m_paramRect->pos().y()); slotUpdateTransitionProperties(); } void Geometryval::slotAlignRight() { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } m_paramRect->setPos(m_realWidth - m_paramRect->rect().width(), m_paramRect->pos().y()); slotUpdateTransitionProperties(); } -void Geometryval::slotResize50() -{ - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - m_paramRect->setRect(0, 0, m_realWidth / 2, m_profile.height / 2); - slotUpdateTransitionProperties(); -} - -void Geometryval::slotResize100() -{ - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - m_paramRect->setRect(0, 0, m_realWidth, m_profile.height); - slotUpdateTransitionProperties(); -} - -void Geometryval::slotResize200() -{ - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - m_paramRect->setRect(0, 0, m_realWidth * 2, m_profile.height * 2); - slotUpdateTransitionProperties(); -} - void Geometryval::slotResizeOriginal() { - if (m_frameSize.isNull()) slotResize100(); - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } - m_paramRect->setRect(0, 0, m_frameSize.x(), m_frameSize.y()); + if (m_frameSize.isNull()) + m_paramRect->setRect(0, 0, m_realWidth, m_profile.height); + else + m_paramRect->setRect(0, 0, m_frameSize.x(), m_frameSize.y()); slotUpdateTransitionProperties(); } -void Geometryval::slotResizeCustom() +void Geometryval::slotResizeCustom(int value) { - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + if (!keyframeSelected()) return; - } - int scale = m_paramRect->rect().width() * 100 / m_realWidth; - bool ok; - scale = QInputDialog::getInteger(this, i18n("Resize..."), i18n("Scale"), scale, 1, 2147483647, 10, &ok); - if (!ok) return; - m_paramRect->setRect(0, 0, m_realWidth * scale / 100, m_profile.height * scale / 100); + m_paramRect->setRect(0, 0, m_realWidth * value / 100, m_profile.height * value / 100); slotUpdateTransitionProperties(); } @@ -336,17 +251,14 @@ void Geometryval::slotPositionChanged(int pos, bool seek) buttonDelete->setEnabled(false); widget->setEnabled(false); spinTransp->setEnabled(false); - m_scaleMenu->setEnabled(false); - m_alignMenu->setEnabled(false); - m_editGeom->setEnabled(false); + frameOptions->setEnabled(false); } else { buttonAdd->setEnabled(false); buttonDelete->setEnabled(true); widget->setEnabled(true); spinTransp->setEnabled(true); - m_scaleMenu->setEnabled(true); - m_alignMenu->setEnabled(true); - m_editGeom->setEnabled(true); + frameOptions->setEnabled(true); + slotUpdateGeometry(); } m_paramRect->setPos(item.x() * m_dar, item.y()); @@ -371,9 +283,7 @@ void Geometryval::slotDeleteFrame(int pos) buttonDelete->setEnabled(false); widget->setEnabled(false); spinTransp->setEnabled(false); - m_scaleMenu->setEnabled(false); - m_alignMenu->setEnabled(false); - m_editGeom->setEnabled(false); + frameOptions->setEnabled(false); m_helper->update(); slotPositionChanged(pos, false); updateTransitionPath(); @@ -397,9 +307,7 @@ void Geometryval::slotAddFrame(int pos) buttonDelete->setEnabled(true); widget->setEnabled(true); spinTransp->setEnabled(true); - m_scaleMenu->setEnabled(true); - m_alignMenu->setEnabled(true); - m_editGeom->setEnabled(true); + frameOptions->setEnabled(true); m_helper->update(); emit parameterChanged(); } @@ -482,6 +390,7 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame) m_paramRect->setPen(QPen(QBrush(QColor(255, 0, 0, 255)), 1.0)); m_scene->addItem(m_paramRect); slotPositionChanged(0, false); + slotUpdateGeometry(); if (!m_fixedMode) { connect(spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int))); } @@ -529,53 +438,17 @@ void Geometryval::slotUpdateTransitionProperties() emit parameterChanged(); } -void Geometryval::slotGeometry() -{ - int pos = spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - QRectF r = m_paramRect->rect().normalized(); - - QDialog d(this); - m_view.setupUi(&d); - d.setWindowTitle(i18n("Frame Geometry")); - m_view.value_x->setMaximum(10000); - m_view.value_x->setMinimum(-10000); - m_view.value_y->setMaximum(10000); - m_view.value_y->setMinimum(-10000); - m_view.value_width->setMaximum(500000); - m_view.value_width->setMinimum(1); - m_view.value_height->setMaximum(500000); - m_view.value_height->setMinimum(1); - - m_view.value_x->setValue(m_paramRect->pos().x()); - m_view.value_y->setValue(m_paramRect->pos().y()); - m_view.value_width->setValue(r.width()); - m_view.value_height->setValue(r.height()); - connect(m_view.button_reset , SIGNAL(clicked()) , this , SLOT(slotResetPosition())); - - if (d.exec() == QDialog::Accepted) { - m_paramRect->setPos(m_view.value_x->value(), m_view.value_y->value()); - m_paramRect->setRect(0, 0, m_view.value_width->value(), m_view.value_height->value()); - slotUpdateTransitionProperties(); - } -} - void Geometryval::slotResetPosition() { - m_view.value_x->setValue(0); - m_view.value_y->setValue(0); + spinX->setValue(0); + spinY->setValue(0); if (m_frameSize.isNull()) { - m_view.value_width->setValue(m_realWidth); - m_view.value_height->setValue(m_profile.height); + spinWidth->setValue(m_realWidth); + spinHeight->setValue(m_profile.height); } else { - m_view.value_width->setValue(m_frameSize.x()); - m_view.value_height->setValue(m_frameSize.y()); + spinWidth->setValue(m_frameSize.x()); + spinHeight->setValue(m_frameSize.y()); } } @@ -591,3 +464,81 @@ void Geometryval::slotKeyframeMoved(int pos) slotUpdateTransitionProperties(); } +void Geometryval::slotSwitchOptions() +{ + if (frameOptions->isHidden()) { + frameOptions->setHidden(false); + m_editOptions->setChecked(true); + } else { + frameOptions->setHidden(true); + m_editOptions->setChecked(false); + } + adjustSize(); +} + +void Geometryval::slotGeometryX(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setPos(value, spinY->value()); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotGeometryY(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setPos(spinX->value(), value); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotGeometryWidth(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setRect(0, 0, value, spinHeight->value()); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotGeometryHeight(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setRect(0, 0, spinWidth->value(), value); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotUpdateGeometry() +{ + if (!keyframeSelected()) + return; + QRectF r = m_paramRect->rect().normalized(); + + spinX->blockSignals(true); + spinY->blockSignals(true); + spinWidth->blockSignals(true); + spinHeight->blockSignals(true); + spinResize->blockSignals(true); + + spinX->setValue(m_paramRect->pos().x()); + spinY->setValue(m_paramRect->pos().y()); + spinWidth->setValue(r.width()); + spinHeight->setValue(r.height()); + spinResize->setValue(m_paramRect->rect().width() * 100 / m_realWidth); + + spinX->blockSignals(false); + spinY->blockSignals(false); + spinWidth->blockSignals(false); + spinHeight->blockSignals(false); + spinResize->blockSignals(false); +} + +bool Geometryval::keyframeSelected() +{ + Mlt::GeometryItem item; + if (m_geom->fetch(&item, spinPos->value()) || item.key() == false) return false; + return true; +} + + + diff --git a/src/geometryval.h b/src/geometryval.h index b2d90764..243a09fa 100644 --- a/src/geometryval.h +++ b/src/geometryval.h @@ -56,10 +56,9 @@ private: KeyframeHelper *m_helper; QGraphicsPathItem *m_path; QMenu *m_configMenu; - QMenu *m_scaleMenu; - QMenu *m_alignMenu; QAction *m_syncAction; - QAction *m_editGeom; + QAction *m_editOptions; + QAction *m_reset; bool m_fixedMode; QPoint m_frameSize; Ui::GeometryPosition_UI m_view; @@ -67,6 +66,7 @@ private: double m_dar; int m_startPoint; QGraphicsView *m_sceneview; + bool keyframeSelected(); public slots: void setupParam(const QDomElement, int, int); @@ -79,22 +79,23 @@ private slots: void slotAddFrame(int pos = -1); void slotUpdateTransitionProperties(); void slotTransparencyChanged(int transp); - void slotResize50(); - void slotResize100(); - void slotResize200(); - void slotResizeCustom(); + void slotResizeCustom(int value); void slotResizeOriginal(); void slotAlignRight(); void slotAlignLeft(); void slotAlignTop(); void slotAlignBottom(); - void slotAlignCenter(); void slotAlignHCenter(); void slotAlignVCenter(); void slotSyncCursor(); - void slotGeometry(); void slotResetPosition(); void slotKeyframeMoved(int); + void slotSwitchOptions(); + void slotUpdateGeometry(); + void slotGeometryX(int value); + void slotGeometryY(int value); + void slotGeometryWidth(int value); + void slotGeometryHeight(int value); signals: void parameterChanged(); diff --git a/src/widgets/geometryval_ui.ui b/src/widgets/geometryval_ui.ui index d2d96174..b8b7fe5b 100644 --- a/src/widgets/geometryval_ui.ui +++ b/src/widgets/geometryval_ui.ui @@ -1,144 +1,330 @@ - + + Geometryval - - + + 0 0 - 370 - 226 + 421 + 349 - - + + 0 - - - - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 0 - - - - + + + + 0 0 - + 0 15 - + 16777215 15 - + QFrame::NoFrame - + QFrame::Plain - - - + + + M - + Qt::NoArrow - - - + + + P - - - + + + N - - - + + + A - - - + + + D - - - + + + 100 - - - + + + Pos - - + + - - - - Qt::Horizontal + + + + Opacity - + + + + + + + 0 + 0 + + + - 40 - 20 + 300 + 150 - - - - - - Opacity + + QFrame::StyledPanel + + + QFrame::Raised + + + + 10 + 0 + 271 + 147 + + + + + + + + + ... + + + + + + + ... + + + + + + + ... + + + + + + + ... + + + + + + + ... + + + + + + + ... + + + + + + + + + + + X + + + + + + + Width + + + + + + + -10000 + + + 10000 + + + 0 + + + + + + + 1 + + + 10000 + + + + + + + Y + + + + + + + Height + + + + + + + -10000 + + + 10000 + + + + + + + 1 + + + 10000 + + + + + + + + + + + Resize: + + + + + + + % + + + 1 + + + 10000 + + + 100 + + + + + + + Original + + + + + + + - widget - keyframeWidget - buttonMenu - buttonPrevious - buttonNext - buttonAdd - buttonDelete - spinTransp - label_pos - spinPos - label_opacity + + + KIntSpinBox + QSpinBox +
knuminput.h
+
+
-- 2.39.2