Redo marker selection code
This commit is contained in:
@@ -66,6 +66,18 @@ void TimelineMarker::set_color(int c)
|
||||
emit ColorChanged(color_);
|
||||
}
|
||||
|
||||
bool TimelineMarker::active()
|
||||
{
|
||||
return active_;
|
||||
}
|
||||
|
||||
void TimelineMarker::set_active(bool active)
|
||||
{
|
||||
active_ = active;
|
||||
|
||||
emit ActiveChanged(active_);
|
||||
}
|
||||
|
||||
void TimelineMarkerList::Save(QXmlStreamWriter *writer) const
|
||||
{
|
||||
foreach (TimelineMarker* marker, markers_) {
|
||||
|
||||
@@ -44,6 +44,9 @@ public:
|
||||
int color();
|
||||
void set_color(int c);
|
||||
|
||||
bool active();
|
||||
void set_active(bool active);
|
||||
|
||||
signals:
|
||||
void TimeChanged(const TimeRange& time);
|
||||
|
||||
@@ -51,6 +54,8 @@ signals:
|
||||
|
||||
void ColorChanged(int c);
|
||||
|
||||
void ActiveChanged(bool active);
|
||||
|
||||
private:
|
||||
TimeRange time_;
|
||||
|
||||
@@ -58,6 +63,8 @@ private:
|
||||
|
||||
int color_;
|
||||
|
||||
bool active_;
|
||||
|
||||
};
|
||||
|
||||
class TimelineMarkerList : public QObject
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "ui/colorcoding.h"
|
||||
#include "widget/menu/menu.h"
|
||||
#include "widget/menu/menushared.h"
|
||||
#include "widget/timeruler/seekablewidget.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
@@ -34,16 +35,18 @@ Marker::Marker(QWidget *parent) :
|
||||
marker_color_(7), //green FIXME: add default color to config
|
||||
active_(false)
|
||||
{
|
||||
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
setMinimumSize(20, 20);
|
||||
//setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
setMaximumSize(8, 20);
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
connect(this, &Marker::customContextMenuRequested, this, &Marker::ShowContextMenu);
|
||||
}
|
||||
|
||||
void Marker::set_active(bool active)
|
||||
void Marker::SetActive(bool active)
|
||||
{
|
||||
active_ = active;
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
bool Marker::active()
|
||||
@@ -91,9 +94,19 @@ void Marker::paintEvent(QPaintEvent *event)
|
||||
void Marker::mousePressEvent(QMouseEvent* e)
|
||||
{
|
||||
if (e->button() == Qt::LeftButton) {
|
||||
active_ = !active_;
|
||||
static_cast<SeekableWidget*>(parent())->SeekToScreenPoint(e->pos().x() + this->x());
|
||||
if (!active_) {
|
||||
if (e->modifiers() != Qt::ShiftModifier) {
|
||||
static_cast<SeekableWidget *>(parent())->DeselectAllMarkers();
|
||||
}
|
||||
emit ActiveChanged(true);
|
||||
} else {
|
||||
if (e->modifiers() == Qt::ShiftModifier) {
|
||||
emit ActiveChanged(false);
|
||||
}
|
||||
}
|
||||
|
||||
update();
|
||||
emit markerSelected(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,11 +35,11 @@ class Marker : public QWidget {
|
||||
public:
|
||||
Marker(QWidget* parent = nullptr);
|
||||
|
||||
void set_active(bool active);
|
||||
bool active();
|
||||
|
||||
public slots:
|
||||
void SetColor(int c);
|
||||
void SetActive(bool active);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent* event) override;
|
||||
@@ -52,6 +52,7 @@ class Marker : public QWidget {
|
||||
//void MouseDoubleClicked();
|
||||
void ColorChanged(int c);
|
||||
void markerSelected(Marker* marker);
|
||||
void ActiveChanged(bool active);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -99,6 +99,8 @@ void SeekableWidget::mousePressEvent(QMouseEvent *event)
|
||||
if (event->button() == Qt::LeftButton) {
|
||||
SeekToScreenPoint(event->pos().x());
|
||||
dragging_ = true;
|
||||
|
||||
DeselectAllMarkers();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,16 +152,23 @@ void SeekableWidget::SetScroll(int s)
|
||||
update();
|
||||
}
|
||||
|
||||
QMap<TimelineMarker *, Marker *> SeekableWidget::GetActiveMarkers() {
|
||||
QMap<TimelineMarker *, Marker *> active_markers;
|
||||
|
||||
foreach(TimelineMarker* marker, marker_map_.keys()) {
|
||||
if (marker_map_.value(marker)->active()) {
|
||||
active_markers.insert(marker, marker_map_.value(marker));
|
||||
QVector<TimelineMarker *> SeekableWidget::GetActiveTimelineMarkers() {
|
||||
QVector<TimelineMarker*> active_timelineMarkers;
|
||||
foreach (TimelineMarker *marker, timeline_points()->markers()->list()) {
|
||||
if (marker->active()) {
|
||||
active_timelineMarkers.append(marker);
|
||||
}
|
||||
}
|
||||
|
||||
return active_markers;
|
||||
return active_timelineMarkers;
|
||||
}
|
||||
|
||||
|
||||
void SeekableWidget::DeselectAllMarkers()
|
||||
{
|
||||
foreach(TimelineMarker* marker, timeline_points()->markers()->list()) {
|
||||
marker->set_active(false);
|
||||
}
|
||||
}
|
||||
|
||||
void SeekableWidget::addMarker(TimelineMarker* marker)
|
||||
@@ -168,9 +177,11 @@ void SeekableWidget::addMarker(TimelineMarker* marker)
|
||||
Marker *marker_widget = new Marker(this);
|
||||
marker_map_.insert(marker, marker_widget);
|
||||
|
||||
connect(marker_widget, &Marker::ColorChanged, marker, &TimelineMarker::set_color);
|
||||
connect(marker_widget, &Marker::ColorChanged, this, &SeekableWidget::SetMarkerColor);
|
||||
connect(marker, &TimelineMarker::ColorChanged, marker_widget, &Marker::SetColor);
|
||||
connect(marker_widget, &Marker::markerSelected, this, &SeekableWidget::markerSelected);
|
||||
|
||||
connect(marker_widget, &Marker::ActiveChanged, marker, &TimelineMarker::set_active);
|
||||
connect(marker, &TimelineMarker::ActiveChanged, marker_widget, &Marker::SetActive);
|
||||
|
||||
marker_widget->move(TimeToScreen(marker->time().in()), 20);
|
||||
marker_widget->SetColor(marker->color());
|
||||
@@ -178,6 +189,13 @@ void SeekableWidget::addMarker(TimelineMarker* marker)
|
||||
}
|
||||
}
|
||||
|
||||
void SeekableWidget::SetMarkerColor(int c)
|
||||
{
|
||||
foreach(TimelineMarker* marker, GetActiveTimelineMarkers()) {
|
||||
marker->set_color(c);
|
||||
}
|
||||
}
|
||||
|
||||
void SeekableWidget::updateMarkerPositions()
|
||||
{
|
||||
foreach (TimelineMarker* marker, marker_map_.keys()) {
|
||||
@@ -186,16 +204,6 @@ void SeekableWidget::updateMarkerPositions()
|
||||
}
|
||||
}
|
||||
|
||||
void SeekableWidget::markerSelected(Marker* marker)
|
||||
{
|
||||
foreach(Marker * marker_widget, marker_map_.values()) {
|
||||
if (marker_widget != marker) {
|
||||
marker_widget->set_active(false);
|
||||
marker_widget->update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int SeekableWidget::TimeToScreen(const rational &time) const
|
||||
{
|
||||
return qFloor(TimeToScene(time)) - scroll_;
|
||||
|
||||
@@ -55,7 +55,11 @@ public:
|
||||
|
||||
virtual void DeleteSelected(){};
|
||||
|
||||
QMap<TimelineMarker*, Marker*> GetActiveMarkers();
|
||||
QVector<TimelineMarker*> SeekableWidget::GetActiveTimelineMarkers();
|
||||
|
||||
void DeselectAllMarkers();
|
||||
|
||||
void SeekToScreenPoint(int screen);
|
||||
|
||||
public slots:
|
||||
void SetTime(const rational &r);
|
||||
@@ -66,10 +70,9 @@ public slots:
|
||||
|
||||
void updateMarkerPositions();
|
||||
|
||||
void markerSelected(Marker* marker);
|
||||
void SetMarkerColor(int c);
|
||||
|
||||
protected:
|
||||
void SeekToScreenPoint(int screen);
|
||||
|
||||
virtual void mousePressEvent(QMouseEvent *event) override;
|
||||
virtual void mouseMoveEvent(QMouseEvent *event) override;
|
||||
@@ -117,6 +120,8 @@ private:
|
||||
|
||||
QMap<TimelineMarker*, Marker*> marker_map_;
|
||||
|
||||
QMap<TimelineMarker*, Marker*> active_markers_map_;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -85,9 +85,9 @@ void TimeRuler::SetPlaybackCache(PlaybackCache *cache)
|
||||
|
||||
void TimeRuler::DeleteSelected()
|
||||
{
|
||||
foreach(TimelineMarker* marker, GetActiveMarkers().keys()) {
|
||||
foreach(TimelineMarker* marker, GetActiveTimelineMarkers()) {
|
||||
timeline_points()->markers()->RemoveMarker(marker);
|
||||
GetActiveMarkers().value(marker)->deleteLater();
|
||||
//GetActiveMarkers().value(marker)->deleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user