/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team Modifications Copyright (C) 2025 mikesolar This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "timelineandtrackview.h" #include #include namespace olive { TimelineAndTrackView::TimelineAndTrackView(Qt::Alignment vertical_alignment, QWidget *parent) : QWidget(parent) { QHBoxLayout *layout = new QHBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); splitter_ = new QSplitter(Qt::Horizontal); splitter_->setChildrenCollapsible(false); layout->addWidget(splitter_); track_view_ = new TrackView(vertical_alignment); splitter_->addWidget(track_view_); view_ = new TimelineView(vertical_alignment); splitter_->addWidget(view_); connect(view_->verticalScrollBar(), &QScrollBar::valueChanged, this, &TimelineAndTrackView::view_value_changed); connect(track_view_->verticalScrollBar(), &QScrollBar::valueChanged, this, &TimelineAndTrackView::tracks_value_changed); // Default track header width: 180px (per UI design reference) splitter_->setSizes({ 180, width() }); } TimelineAndTrackView::~TimelineAndTrackView() { // When the child views are destroyed they reset their scene, which can // push a valueChanged through these connections while this object is // already half-destroyed (Qt aborts on a slot invoked past its class's // destructor). Detach first so teardown emissions go nowhere. disconnect(view_->verticalScrollBar(), nullptr, this, nullptr); disconnect(track_view_->verticalScrollBar(), nullptr, this, nullptr); } QSplitter *TimelineAndTrackView::splitter() const { return splitter_; } TimelineView *TimelineAndTrackView::view() const { return view_; } TrackView *TimelineAndTrackView::track_view() const { return track_view_; } void TimelineAndTrackView::view_value_changed(int v) { track_view_->verticalScrollBar()->setValue( v - view_->verticalScrollBar()->minimum()); } void TimelineAndTrackView::tracks_value_changed(int v) { view_->verticalScrollBar()->setValue(view_->verticalScrollBar()->minimum() + v); } }