openmohaa/code/uilib/uistatus.cpp
smallmodel e6848a3ab0
Fix the window sizer losing focus when rapidly dragging the mouse
This would lead to annoyances when trying to resize the window as the window sizer would lose focus
2024-12-20 20:13:05 +01:00

295 lines
5.4 KiB
C++

/*
===========================================================================
Copyright (C) 2015-2024 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code 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 2 of the License,
or (at your option) any later version.
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
#include "ui_local.h"
#include "../qcommon/localization.h"
CLASS_DECLARATION( UIWidget, UIWindowSizer, NULL )
{
{ &W_LeftMouseDown, &UIWindowSizer::MouseDown },
{ &W_LeftMouseUp, &UIWindowSizer::MouseUp },
{ &W_LeftMouseDragged, &UIWindowSizer::MouseDragged },
{ NULL, NULL }
};
UIWindowSizer::UIWindowSizer()
{
m_draggingwidget = NULL;
m_mouseState = M_NONE;
// Added in OPM
// So this can be made as the first responder
m_canactivate = true;
}
UIWindowSizer::UIWindowSizer(UIWidget* w)
: UIWindowSizer()
{
m_draggingwidget = w;
}
void UIWindowSizer::Draw
(
void
)
{
m_font->setColor(UWhite);
m_font->Print(0, 0, "o", -1, getVirtualScale());
m_font->setColor(UBlack);
m_font->Print(0, 0, "p", -1, getVirtualScale());
}
void UIWindowSizer::FrameInitialized
(
void
)
{
setFont("marlett");
}
void UIWindowSizer::MouseDown
(
Event *ev
)
{
m_screenDragPoint.x = ev->GetFloat(1);
m_screenDragPoint.y = ev->GetFloat(2);
m_mouseState = M_DRAGGING;
uWinMan.setFirstResponder(this);
}
void UIWindowSizer::MouseUp
(
Event *ev
)
{
if (uWinMan.getFirstResponder() == this) {
uWinMan.setFirstResponder(NULL);
}
m_mouseState = M_NONE;
}
void UIWindowSizer::MouseDragged
(
Event *ev
)
{
UIPoint2D newpoint, delta;
UISize2D newsize;
if (m_mouseState != M_DRAGGING) {
return;
}
newpoint.x = ev->GetFloat(1);
newpoint.y = ev->GetFloat(2);
delta = UIPoint2D(newpoint.x - m_screenDragPoint.x, newpoint.y - m_screenDragPoint.y);
if (delta.x || delta.y)
{
m_screenDragPoint = newpoint;
newsize = m_draggingwidget->getSize();
newsize.width += delta.x;
newsize.height += delta.y;
if (newsize.width < 32) newsize.width = 32;
if (newsize.height < 16) newsize.height = 16;
m_draggingwidget->setSize(newsize);
}
}
void UIWindowSizer::setDraggingWidget
(
UIWidget *w
)
{
m_draggingwidget = w;
}
UIWidget *UIWindowSizer::getDraggingWidget
(
void
)
{
return m_draggingwidget;
}
CLASS_DECLARATION( UIWidget, UIStatusBar, NULL )
{
{ &W_RealignWidget, &UIStatusBar::ParentSized },
{ &W_SizeChanged, &UIStatusBar::SelfSized },
{ NULL, NULL }
};
UIStatusBar::UIStatusBar()
{
m_sizeenabled = NULL;
m_created = false;
m_sizer = NULL;
m_align.alignment = WND_ALIGN_NONE;
m_iFontAlignmentHorizontal = FONT_JUSTHORZ_LEFT;
}
UIStatusBar::UIStatusBar
(
alignment_t align,
float height
)
: UIStatusBar() // Fixed in OPM:
// original builds didn't call this ctor,
// so statusbar text got center-justified due to
// m_iFontAlignmentHorizontal defaulting to FONT_JUSTHORZ_CENTER (0)
{
AlignBar(align, height);
}
void UIStatusBar::FrameInitialized
(
void
)
{
m_created = true;
Connect(this, W_SizeChanged, W_SizeChanged);
if (m_parent) {
m_parent->Connect(this, W_SizeChanged, W_RealignWidget);
}
SelfSized(NULL);
ParentSized(NULL);
}
void UIStatusBar::Draw
(
void
)
{
if (m_align.alignment == WND_ALIGN_BOTTOM) {
DrawBox(0.0, 0.0, m_frame.size.width, 1.0, m_border_color.dark, 1.0);
}
m_font->setColor(m_foreground_color);
m_font->PrintJustified(
getClientFrame(),
m_iFontAlignmentHorizontal,
m_iFontAlignmentVertical,
Sys_LV_CL_ConvertString(m_title.c_str()),
getVirtualScale()
);
if (m_sizer)
{
m_sizer->setForegroundColor(m_foreground_color);
m_sizer->setBackgroundColor(m_background_color, true);
m_sizer->setBackgroundAlpha(m_local_alpha);
}
}
void UIStatusBar::AlignBar
(
alignment_t align,
float height
)
{
m_align.alignment = align;
m_align.dist = height;
}
void UIStatusBar::DontAlignBar
(
void
)
{
m_align.alignment = WND_ALIGN_NONE;
}
void UIStatusBar::EnableSizeBox
(
UIWidget *which
)
{
m_sizeenabled = which;
if (m_created) {
SelfSized(NULL);
}
}
void UIStatusBar::ParentSized
(
Event *ev
)
{
if (m_align.alignment == WND_ALIGN_BOTTOM)
{
UISize2D parentSize = m_parent->getSize();
setFrame(UIRect2D(0.0, parentSize.height - m_align.dist, parentSize.width, m_align.dist));
}
}
void UIStatusBar::SelfSized
(
Event *ev
)
{
if (m_sizeenabled)
{
if (!m_sizer) {
m_sizer = new UIWindowSizer(m_sizeenabled);
m_sizer->InitFrame(this, 0, 0, 16.0 * getHighResScale()[0], 16.0 * getHighResScale()[1], 0);
} else if (m_sizer->getDraggingWidget() != m_sizeenabled) {
m_sizer->setDraggingWidget(m_sizeenabled);
}
UISize2D sizerFrame = m_sizer->getSize();
m_sizer->setFrame(UIRect2D(
UIPoint2D(m_frame.size.width - sizerFrame.width, m_frame.size.height - sizerFrame.height),
sizerFrame
));
}
else if (m_sizer)
{
delete m_sizer;
m_sizer = NULL;
}
}