summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Controls/ScrollerThumb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Authoring/Studio/Controls/ScrollerThumb.cpp')
-rw-r--r--src/Authoring/Studio/Controls/ScrollerThumb.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/Authoring/Studio/Controls/ScrollerThumb.cpp b/src/Authoring/Studio/Controls/ScrollerThumb.cpp
new file mode 100644
index 00000000..a7fedbca
--- /dev/null
+++ b/src/Authoring/Studio/Controls/ScrollerThumb.cpp
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2002 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Prefix
+//==============================================================================
+#include "stdafx.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "ScrollerThumb.h"
+#include "ScrollerBar.h"
+#include "Renderer.h"
+#include "StudioPreferences.h"
+
+//==============================================================================
+// Static variables
+//==============================================================================
+const long CScrollerThumb::MIN_LENGTH = 32;
+
+//=============================================================================
+/**
+ * Constructor
+ * @param inScrollerBar the scroller bar this is operating on.
+ */
+CScrollerThumb::CScrollerThumb(IScrollerBar *inScrollerBar)
+ : m_MouseDown(false)
+{
+ m_ScrollerBar = inScrollerBar;
+}
+
+//=============================================================================
+/**
+ * Destructor
+ */
+CScrollerThumb::~CScrollerThumb()
+{
+}
+
+//=============================================================================
+/**
+ * Draw this scroller bar.
+ * @param inRenderer the renderer this is to draw to.
+ */
+void CScrollerThumb::Draw(CRenderer *inRenderer)
+{
+ if (IsEnabled()) {
+ CPt theSize = GetSize();
+ CRct theRect(theSize);
+
+ // Draw the thumb
+ inRenderer->FillSolidRect(theRect, CStudioPreferences::GetScrollThumbBGColor());
+ // Draw the highlight
+ inRenderer->Draw3dRect(CRct(theRect.position.x + 1, theRect.position.y + 1,
+ theRect.size.x - 1, theRect.size.y - 1),
+ CStudioPreferences::GetScrollThumbHighlightColor(),
+ CStudioPreferences::GetScrollThumbBGColor());
+ // Draw the black border
+ inRenderer->Draw3dRect(theRect, CStudioPreferences::GetScrollThumbShadowColor(),
+ CStudioPreferences::GetScrollThumbShadowColor());
+
+ // Draw the 3 lines in the middle of the control, depending on orientation
+ if (m_ScrollerBar->GetOrientation() == CScrollerBar::VERTICAL) {
+ // Draw the light lines
+ inRenderer->PushPen(CStudioPreferences::GetScrollThumbGripHighlightColor());
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 3, theSize.y / 2 - 5));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 2, theSize.y / 2 - 5));
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 3, theSize.y / 2 - 2));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 2, theSize.y / 2 - 2));
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 3, theSize.y / 2 + 1));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 2, theSize.y / 2 + 1));
+ inRenderer->PopPen();
+ // Draw the dark lines
+ inRenderer->PushPen(CStudioPreferences::GetScrollThumbGripShadowColor());
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 2, theSize.y / 2 - 4));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 3, theSize.y / 2 - 4));
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 2, theSize.y / 2 - 1));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 3, theSize.y / 2 - 1));
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 2, theSize.y / 2 + 2));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 3, theSize.y / 2 + 2));
+ inRenderer->PopPen();
+ } else {
+ // Draw the light lines
+ inRenderer->PushPen(CStudioPreferences::GetScrollThumbGripHighlightColor());
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 4, theSize.y / 2 - 3));
+ inRenderer->LineTo(CPt(theSize.x / 2 - 4, theSize.y / 2 + 2));
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 1, theSize.y / 2 - 3));
+ inRenderer->LineTo(CPt(theSize.x / 2 - 1, theSize.y / 2 + 2));
+ inRenderer->MoveTo(CPt(theSize.x / 2 + 2, theSize.y / 2 - 3));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 2, theSize.y / 2 + 2));
+ inRenderer->PopPen();
+
+ // Draw the dark lines
+ inRenderer->PushPen(CStudioPreferences::GetScrollThumbGripShadowColor());
+ inRenderer->MoveTo(CPt(theSize.x / 2 - 3, theSize.y / 2 - 2));
+ inRenderer->LineTo(CPt(theSize.x / 2 - 3, theSize.y / 2 + 3));
+ inRenderer->MoveTo(CPt(theSize.x / 2, theSize.y / 2 - 2));
+ inRenderer->LineTo(CPt(theSize.x / 2, theSize.y / 2 + 3));
+ inRenderer->MoveTo(CPt(theSize.x / 2 + 3, theSize.y / 2 - 2));
+ inRenderer->LineTo(CPt(theSize.x / 2 + 3, theSize.y / 2 + 3));
+ inRenderer->PopPen();
+ }
+ }
+}
+
+//=============================================================================
+/**
+ * Listener for the OnMouseDown to allow dragging.
+ * Begins dragging of the control.
+ */
+bool CScrollerThumb::OnMouseDown(CPt inPoint, Qt::KeyboardModifiers inFlags)
+{
+ if (!CControl::OnMouseDown(inPoint, inFlags)) {
+ m_MouseDown = true;
+ m_MouseDownPoint = inPoint;
+
+ Invalidate();
+ }
+
+ return true;
+}
+
+//=============================================================================
+/**
+ * Ends dragging of the control.
+ */
+void CScrollerThumb::OnMouseUp(CPt inPoint, Qt::KeyboardModifiers inFlags)
+{
+ CControl::OnMouseUp(inPoint, inFlags);
+ m_MouseDown = false;
+
+ Invalidate();
+}
+
+//=============================================================================
+/**
+ * Used for dragging the control.
+ */
+void CScrollerThumb::OnMouseMove(CPt inPoint, Qt::KeyboardModifiers inFlags)
+{
+ CControl::OnMouseMove(inPoint, inFlags);
+
+ // Only care if the mouse is down.
+ if (m_MouseDown) {
+ long theBarPos = m_ScrollerBar->GetBarPosition();
+
+ // Adjust the position based on which way we are being dragged.
+ if (m_ScrollerBar->GetOrientation() == CScrollerBar::VERTICAL) {
+ theBarPos += inPoint.y - m_MouseDownPoint.y;
+ } else {
+ theBarPos += inPoint.x - m_MouseDownPoint.x;
+ }
+
+ // Update the position.
+ m_ScrollerBar->SetBarPosition(theBarPos);
+ }
+}
+
+//=============================================================================
+/**
+ * Get the minimum size that this scroller thumb is allowed to be.
+ * @return the minimum size that this scroller thumb is allowed to be.
+ */
+CPt CScrollerThumb::GetMinimumSize()
+{
+ if (m_ScrollerBar->GetOrientation() == CScrollerBar::HORIZONTAL)
+ return CPt(MIN_LENGTH, 0);
+ else
+ return CPt(0, MIN_LENGTH);
+}