From feb7d5762dfd695946d59d47f8f72da0ec6d62de Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:14:40 -0800 Subject: [PATCH] viewer: allow resizing while text gizmo is active --- app/node/gizmo/text.cpp | 12 +++++ app/node/gizmo/text.h | 15 ++----- app/widget/viewer/viewerdisplay.cpp | 70 +++++++++++++++++++---------- app/widget/viewer/viewerdisplay.h | 2 + 4 files changed, 64 insertions(+), 35 deletions(-) diff --git a/app/node/gizmo/text.cpp b/app/node/gizmo/text.cpp index 6d6816948..7b966ee40 100644 --- a/app/node/gizmo/text.cpp +++ b/app/node/gizmo/text.cpp @@ -32,6 +32,12 @@ TextGizmo::TextGizmo(QObject *parent) } +void TextGizmo::SetRect(const QRectF &r) +{ + rect_ = r; + emit RectChanged(rect_); +} + void TextGizmo::UpdateInputHtml(const QString &s, const rational &time) { if (input_.IsValid()) { @@ -41,4 +47,10 @@ void TextGizmo::UpdateInputHtml(const QString &s, const rational &time) } } +void TextGizmo::SetVerticalAlignment(Qt::Alignment va) +{ + valign_ = va; + emit VerticalAlignmentChanged(valign_); +} + } diff --git a/app/node/gizmo/text.h b/app/node/gizmo/text.h index 5c3218671..df2aca92a 100644 --- a/app/node/gizmo/text.h +++ b/app/node/gizmo/text.h @@ -33,7 +33,7 @@ public: explicit TextGizmo(QObject *parent = nullptr); const QRectF &GetRect() const { return rect_; } - void SetRect(const QRectF &r) { rect_ = r; } + void SetRect(const QRectF &r); const QString &GetHtml() const { return text_; } void SetHtml(const QString &t) { text_ = t; } @@ -42,21 +42,14 @@ public: void UpdateInputHtml(const QString &s, const rational &time); - Qt::Alignment GetVerticalAlignment() const - { - return valign_; - } - - void SetVerticalAlignment(Qt::Alignment va) - { - valign_ = va; - emit VerticalAlignmentChanged(valign_); - } + Qt::Alignment GetVerticalAlignment() const { return valign_; } + void SetVerticalAlignment(Qt::Alignment va); signals: void Activated(); void Deactivated(); void VerticalAlignmentChanged(Qt::Alignment va); + void RectChanged(const QRectF &r); private: QRectF rect_; diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 0fcb70e40..399391597 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -677,6 +677,10 @@ QTransform ViewerDisplayWidget::GenerateGizmoTransform(NodeTraverser >, const NodeGizmo *ViewerDisplayWidget::TryGizmoPress(const NodeValueRow &row, const QPointF &p) { + if (!gizmos_) { + return nullptr; + } + for (auto it=gizmos_->GetGizmos().crbegin(); it!=gizmos_->GetGizmos().crend(); it++) { NodeGizmo *gizmo = *it; if (gizmo->IsVisible()) { @@ -705,6 +709,7 @@ NodeGizmo *ViewerDisplayWidget::TryGizmoPress(const NodeValueRow &row, const QPo void ViewerDisplayWidget::OpenTextGizmo(TextGizmo *text, QMouseEvent *event) { active_text_gizmo_ = text; + connect(active_text_gizmo_, &TextGizmo::RectChanged, this, &ViewerDisplayWidget::UpdateActiveTextGizmoSize); text_transform_ = GenerateGizmoTransform(); text_transform_inverted_ = text_transform_.inverted(); @@ -736,9 +741,7 @@ void ViewerDisplayWidget::OpenTextGizmo(TextGizmo *text, QMouseEvent *event) connect(text_edit_, &ViewerTextEditor::destroyed, this, &ViewerDisplayWidget::TextEditDestroyed); // Set text editor's size to logical size - QRectF text_rect = text->GetRect(); - text_edit_pos_ = text_rect.topLeft(); - text_edit_->setGeometry(text_rect.toRect()); + QRectF text_rect = UpdateActiveTextGizmoSize(); // Emit text gizmo activation signal emit text->Activated(); @@ -808,9 +811,9 @@ bool ViewerDisplayWidget::OnMousePress(QMouseEvent *event) return true; - } else if (text_edit_) { + } else if (text_edit_ && ForwardMouseEventToTextEdit(event, true)) { - return ForwardMouseEventToTextEdit(event, true); + return true; } else if (event->button() == Qt::LeftButton) { @@ -821,8 +824,7 @@ bool ViewerDisplayWidget::OnMousePress(QMouseEvent *event) add_band_end_ = add_band_start_; add_band_ = true; - } else if (gizmos_ - && (current_gizmo_ = TryGizmoPress(gizmo_db_, gizmo_last_draw_transform_inverted_.map(event->pos())))) { + } else if ((current_gizmo_ = TryGizmoPress(gizmo_db_, gizmo_last_draw_transform_inverted_.map(event->pos())))) { // Handle gizmo click gizmo_start_drag_ = event->pos(); @@ -856,18 +858,9 @@ bool ViewerDisplayWidget::OnMouseMove(QMouseEvent *event) return true; - } else if (text_edit_) { + } else if (text_edit_ && ForwardMouseEventToTextEdit(event)) { - if (event->buttons() == Qt::NoButton) { - QPointF mapped = text_transform_inverted_.map(event->pos()) - text_edit_pos_; - if (mapped.x() >= 0 && mapped.y() >= 0 && mapped.x() < text_edit_->width() && mapped.y() < text_edit_->height()) { - inner_widget()->setCursor(Qt::IBeamCursor); - } else { - inner_widget()->unsetCursor(); - } - } - - return ForwardMouseEventToTextEdit(event); + return true; } else if (add_band_) { @@ -927,9 +920,9 @@ bool ViewerDisplayWidget::OnMouseRelease(QMouseEvent *e) return true; - } else if (text_edit_) { + } else if (text_edit_ && ForwardMouseEventToTextEdit(e)) { - return ForwardMouseEventToTextEdit(e); + return true; } else if (add_band_) { @@ -964,8 +957,8 @@ bool ViewerDisplayWidget::OnMouseRelease(QMouseEvent *e) bool ViewerDisplayWidget::OnMouseDoubleClick(QMouseEvent *event) { - if (text_edit_) { - return ForwardMouseEventToTextEdit(event); + if (text_edit_ && ForwardMouseEventToTextEdit(event)) { + return true; } else if (event->button() == Qt::LeftButton && gizmos_) { QPointF ptr = TransformViewerSpaceToBufferSpace(event->pos()); foreach (NodeGizmo *g, gizmos_->GetGizmos()) { @@ -1148,13 +1141,31 @@ void ViewerDisplayWidget::ForwardDragEventToTextEdit(T *e) bool ViewerDisplayWidget::ForwardMouseEventToTextEdit(QMouseEvent *event, bool check_if_outside) { + if (current_gizmo_) { + return false; + } + // Transform screen mouse coords to world mouse coords QPointF local_pos = GetVirtualPosForTextEdit(event->pos()); + if (event->type() == QEvent::MouseMove && event->buttons() == Qt::NoButton) { + QPointF mapped = text_transform_inverted_.map(event->pos()) - text_edit_pos_; + if (mapped.x() >= 0 && mapped.y() >= 0 && mapped.x() < text_edit_->width() && mapped.y() < text_edit_->height()) { + inner_widget()->setCursor(Qt::IBeamCursor); + } else { + inner_widget()->unsetCursor(); + } + } + if (check_if_outside) { if (local_pos.x() < 0 || local_pos.x() >= text_edit_->width() || local_pos.y() < 0 || local_pos.y() >= text_edit_->height()) { - CloseTextEditor(); - return true; + // Allow clicking other gizmos so the user can resize while the text editor is active + if ((current_gizmo_ = TryGizmoPress(gizmo_db_, gizmo_last_draw_transform_inverted_.map(event->pos())))) { + return false; + } else { + CloseTextEditor(); + return true; + } } } @@ -1191,6 +1202,9 @@ void ViewerDisplayWidget::CloseTextEditor() { text_edit_->deleteLater(); text_edit_ = nullptr; + + disconnect(active_text_gizmo_, &TextGizmo::RectChanged, this, &ViewerDisplayWidget::UpdateActiveTextGizmoSize); + active_text_gizmo_ = nullptr; } void ViewerDisplayWidget::GenerateGizmoTransforms() @@ -1382,4 +1396,12 @@ void ViewerDisplayWidget::FocusChanged(QWidget *old, QWidget *now) } } +QRectF ViewerDisplayWidget::UpdateActiveTextGizmoSize() +{ + QRectF text_rect = active_text_gizmo_->GetRect(); + text_edit_pos_ = text_rect.topLeft(); + text_edit_->setGeometry(text_rect.toRect()); + return text_rect; +} + } diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 2672b1b67..5ffcd2c4f 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -438,6 +438,8 @@ private slots: void FocusChanged(QWidget *old, QWidget *now); + QRectF UpdateActiveTextGizmoSize(); + };