Redo marker selection code

This commit is contained in:
Thomas Wilshaw
2021-10-22 22:15:51 +01:00
parent 853dbc0066
commit d8101869b9
7 changed files with 76 additions and 30 deletions
+12
View File
@@ -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_) {
+7
View File
@@ -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
+18 -5
View File
@@ -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);
}
}
+2 -1
View File
@@ -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:
+27 -19
View File
@@ -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_;
+8 -3
View File
@@ -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_;
};
}
+2 -2
View File
@@ -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();
}
}