Make markers movable
This commit is contained in:
@@ -35,7 +35,8 @@ namespace olive {
|
||||
|
||||
Marker::Marker(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
active_(false)
|
||||
active_(false),
|
||||
dragging_(false)
|
||||
{
|
||||
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
resize(7, 14);
|
||||
@@ -129,6 +130,36 @@ void Marker::mousePressEvent(QMouseEvent* e)
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
click_position_ = e->globalPos();
|
||||
marker_start_x_ = x();
|
||||
}
|
||||
|
||||
void Marker::mouseMoveEvent(QMouseEvent* e)
|
||||
{
|
||||
if (active_) {
|
||||
dragging_ = true;
|
||||
|
||||
QPoint old_pos = mapToGlobal(pos());
|
||||
|
||||
int new_pos = marker_start_x_ + e->globalPos().x() - click_position_.x();
|
||||
|
||||
if (new_pos > -3 && new_pos < static_cast<SeekableWidget *>(parent())->width() - 3) {
|
||||
this->move(new_pos-2, this->pos().y());
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Marker::mouseReleaseEvent(QMouseEvent* e)
|
||||
{
|
||||
if (dragging_) {
|
||||
rational time = static_cast<SeekableWidget *>(parent())->SceneToTime(this->x()+4);
|
||||
time = time < 0.0 ? 0.0 : time;
|
||||
emit TimeChanged(TimeRange(time, time));
|
||||
|
||||
dragging_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
void Marker::ShowContextMenu()
|
||||
@@ -181,4 +212,9 @@ void Marker::SetName(QString s)
|
||||
update();
|
||||
}
|
||||
|
||||
void Marker::SetTime(TimeRange time)
|
||||
{
|
||||
move(static_cast<SeekableWidget *>(parent())->TimeToScene(time.in())-2, y());
|
||||
}
|
||||
|
||||
} // namespace olive
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <QPushButton>
|
||||
|
||||
#include "common/define.h"
|
||||
#include "common/timerange.h"
|
||||
#include "widget/colorlabelmenu/colorlabelmenu.h"
|
||||
|
||||
namespace olive {
|
||||
@@ -43,11 +44,13 @@ class Marker : public QWidget {
|
||||
void SetColor(int c);
|
||||
void SetActive(bool active);
|
||||
void SetName(QString s);
|
||||
void SetTime(TimeRange t);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent* event) override;
|
||||
virtual void mousePressEvent(QMouseEvent* event) override;
|
||||
//virtual void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
virtual void mouseMoveEvent(QMouseEvent* event) override;
|
||||
virtual void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
//virtual void mouseDoubleClickEvent(QMouseEvent* event) override;
|
||||
|
||||
signals:
|
||||
@@ -57,6 +60,7 @@ class Marker : public QWidget {
|
||||
void markerSelected(Marker* marker);
|
||||
void ActiveChanged(bool active);
|
||||
void NameChanged(QString name);
|
||||
void TimeChanged(TimeRange time);
|
||||
|
||||
private:
|
||||
|
||||
@@ -66,6 +70,12 @@ class Marker : public QWidget {
|
||||
|
||||
QString name_;
|
||||
|
||||
QPointF click_position_;
|
||||
|
||||
int marker_start_x_;
|
||||
|
||||
bool dragging_;
|
||||
|
||||
private slots:
|
||||
void ShowContextMenu();
|
||||
};
|
||||
|
||||
@@ -213,6 +213,9 @@ void SeekableWidget::addMarker(TimelineMarker* marker)
|
||||
connect(marker_widget, &Marker::NameChanged, marker, &TimelineMarker::set_name);
|
||||
connect(marker, &TimelineMarker::NameChanged, marker_widget, &Marker::SetName);
|
||||
|
||||
connect(marker_widget, &Marker::TimeChanged, marker, &TimelineMarker::set_time);
|
||||
connect(marker, &TimelineMarker::TimeChanged, marker_widget, &Marker::SetTime);
|
||||
|
||||
marker_widget->move(TimeToScreen(marker->time().in())-2, text_height_);
|
||||
marker_widget->SetColor(marker->color());
|
||||
marker_widget->SetName(marker->name());
|
||||
|
||||
Reference in New Issue
Block a user