/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // Original file Copyright Crytek GMBH or its affiliates, used under license. #include "StdAfx.h" #include "NumberCtrl.h" #include "Util/EditorUtils.h" #include "UserMessageDefines.h" #include QNumberCtrl::QNumberCtrl(QWidget* parent) : QDoubleSpinBox(parent) , m_bMouseDown(false) , m_bDragged(false) , m_bUndoEnabled(false) , m_prevValue(0) { connect(this, &QAbstractSpinBox::editingFinished, this, &QNumberCtrl::onEditingFinished); } void QNumberCtrl::changeEvent(QEvent* event) { if (event->type() == QEvent::EnabledChange) { setButtonSymbols(isEnabled() ? UpDownArrows : NoButtons); } QDoubleSpinBox::changeEvent(event); } void QNumberCtrl::SetRange(double newMin, double newMax) { // Avoid setting this value if its close to the current value, because otherwise qt will pump events into the queue to redraw/etc. if ( (!AZ::IsClose(this->minimum(), newMin, DBL_EPSILON)) || (!AZ::IsClose(this->maximum(), newMax, DBL_EPSILON)) ) { setRange(newMin, newMax); } } void QNumberCtrl::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { emit mousePressed(); m_bMouseDown = true; m_bDragged = false; m_mousePos = event->pos(); if (m_bUndoEnabled && !CUndo::IsRecording()) { GetIEditor()->BeginUndo(); } emit dragStarted(); grabMouse(); } QDoubleSpinBox::mousePressEvent(event); } void QNumberCtrl::mouseReleaseEvent(QMouseEvent* event) { QDoubleSpinBox::mouseReleaseEvent(event); if (event->button() == Qt::LeftButton) { m_bMouseDown = m_bDragged = false; emit valueUpdated(); emit valueChanged(); if (m_bUndoEnabled && CUndo::IsRecording()) { GetIEditor()->AcceptUndo(m_undoText); } emit dragFinished(); releaseMouse(); m_prevValue = value(); emit mouseReleased(); } } void QNumberCtrl::mouseMoveEvent(QMouseEvent* event) { QDoubleSpinBox::mousePressEvent(event); if (m_bMouseDown) { m_bDragged = true; int dy = event->pos().y() - m_mousePos.y(); setValue(value() - singleStep() * dy); emit valueUpdated(); m_mousePos = event->pos(); } } void QNumberCtrl::EnableUndo(const QString& undoText) { m_undoText = undoText; m_bUndoEnabled = true; } void QNumberCtrl::focusInEvent(QFocusEvent* event) { m_prevValue = value(); QDoubleSpinBox::focusInEvent(event); } void QNumberCtrl::onEditingFinished() { bool undo = m_bUndoEnabled && !CUndo::IsRecording() && m_prevValue != value(); if (undo) { GetIEditor()->BeginUndo(); } emit valueUpdated(); emit valueChanged(); if (undo) { GetIEditor()->AcceptUndo(m_undoText); } m_prevValue = value(); } #include