File indexing completed on 2025-02-02 04:11:34

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #pragma once
0008 
0009 #include <memory>
0010 
0011 #include <QGraphicsView>
0012 
0013 #include "model/document.hpp"
0014 #include "item_models/property_model_full.hpp"
0015 #include "item_models/comp_filter_model.hpp"
0016 
0017 
0018 class QTreeView;
0019 class QItemSelection;
0020 
0021 namespace glaxnimate::gui {
0022 
0023 class TimelineWidget : public QGraphicsView
0024 {
0025     Q_OBJECT
0026     
0027 public:
0028     TimelineWidget(QWidget* parent = nullptr);
0029     ~TimelineWidget();
0030     
0031 //     void clear();
0032 
0033     void set_model(item_models::CompFilterModel* model, item_models::PropertyModelFull* base_model, QTreeView* expander);
0034 
0035     int row_height() const;
0036     void set_row_height(int w);
0037     int header_height() const;
0038 
0039     qreal highlighted_time() const;
0040     void set_highlighted_time(int time);
0041     void keep_highlight();
0042     
0043     void select(const QItemSelection &selected, const QItemSelection &deselected);
0044     
0045     item_models::PropertyModelBase::Item item_at(const QPoint& viewport_pos);
0046     std::pair<model::KeyframeBase*, model::KeyframeBase*> keyframe_at(const QPoint& viewport_pos);
0047 
0048     void expand(const QModelIndex& obj);
0049     void collapse(const QModelIndex& obj);
0050     void set_document(model::Document* document);
0051 
0052     /**
0053      * \brief Toggles debug prints for the line items
0054      */
0055     void toggle_debug(bool debug);
0056 
0057     /**
0058      * \brief Prints debugging info about the line items
0059      */
0060     void debug_lines() const;
0061 
0062 public Q_SLOTS:
0063     void update_timeline_start(model::FrameTime start);
0064     void update_timeline_end(model::FrameTime end);
0065     void reset_view();
0066 
0067 private Q_SLOTS:
0068     void update_comp(model::Composition* comp);
0069 
0070 private:
0071     void model_rows_added(const QModelIndex& parent, int first, int last);
0072     void model_rows_removed(const QModelIndex& parent, int first, int last);
0073     void model_rows_moved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row);
0074     void model_reset();
0075     void on_item_removed(quintptr id);
0076     void emit_clicked();
0077 
0078 protected:    
0079     void mousePressEvent(QMouseEvent * event) override;
0080     void mouseReleaseEvent(QMouseEvent * event) override;
0081     void wheelEvent(QWheelEvent * event) override;
0082     void paintEvent(QPaintEvent * event) override;
0083     void resizeEvent(QResizeEvent * event) override;
0084     void scrollContentsBy(int dx, int dy) override;
0085     void mouseMoveEvent(QMouseEvent * event) override;
0086     void leaveEvent(QEvent * event) override;
0087 #if QT_VERSION_MAJOR < 6
0088     void enterEvent(QEvent * event) override;
0089 #else
0090     void enterEvent(QEnterEvent * event) override;
0091 #endif
0092     void keyPressEvent(QKeyEvent * event) override;
0093     
0094 Q_SIGNALS:
0095     void frame_clicked(int frame);
0096     void line_clicked(quintptr id, bool selected, bool replace_selection);
0097     void scrolled(int line);
0098     
0099 private:
0100     class Private;
0101     
0102     std::unique_ptr<Private> d;
0103 };
0104 
0105 } // namespace glaxnimate::gui