mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00

This fixes UI elements being tiny on high resolutions like 4K. Now most UI elements will scale automatically with resolutions above 1920x1080.
457 lines
8.6 KiB
C++
457 lines
8.6 KiB
C++
/*
|
|
===========================================================================
|
|
Copyright (C) 2023 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"
|
|
|
|
CLASS_DECLARATION( UIWidget, UIChildSpaceWidget, NULL )
|
|
{
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
UIChildSpaceWidget::UIChildSpaceWidget()
|
|
{
|
|
}
|
|
|
|
qboolean UIChildSpaceWidget::KeyEvent
|
|
(
|
|
int key,
|
|
unsigned int time
|
|
)
|
|
|
|
{
|
|
if (m_parent)
|
|
{
|
|
//
|
|
// Transmit the key event to the parent
|
|
//
|
|
return m_parent->KeyEvent(key, 0);
|
|
}
|
|
|
|
return qfalse;
|
|
}
|
|
|
|
CLASS_DECLARATION( UIWidget, UIFloatingWindow, NULL )
|
|
{
|
|
{ &W_LeftMouseDown, &UIFloatingWindow::Pressed },
|
|
{ &W_LeftMouseDragged, &UIFloatingWindow::Dragged },
|
|
{ &W_LeftMouseUp, &UIFloatingWindow::Released },
|
|
{ &UIFloatingWindow::W_ClosePressed, &UIFloatingWindow::ClosePressed },
|
|
{ &UIFloatingWindow::W_MinimizePressed, &UIFloatingWindow::MinimizePressed },
|
|
{ &W_SizeChanged, &UIFloatingWindow::SizeChanged },
|
|
{ &W_Activated, &UIFloatingWindow::OnActivated },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
Event UIFloatingWindow::W_ClosePressed
|
|
(
|
|
"floatingwindow_close_pressed",
|
|
EV_DEFAULT,
|
|
NULL,
|
|
NULL,
|
|
"Signal that the window was closed"
|
|
);
|
|
Event UIFloatingWindow::W_MinimizePressed
|
|
(
|
|
"floatingwindow_minimize_pressed",
|
|
EV_DEFAULT,
|
|
NULL,
|
|
NULL,
|
|
"Signal that the window was minimized"
|
|
);
|
|
|
|
UIFloatingWindow::UIFloatingWindow()
|
|
{
|
|
m_clickpoint = UIPoint2D(-20.0, -20.0);
|
|
m_isPressed = false;
|
|
m_minimized = false;
|
|
m_canactivate = true;
|
|
m_clicktime = -20000;
|
|
// create buttons that compose a window
|
|
m_closeButton = new UIButton();
|
|
m_minimizeButton = new UIButton();
|
|
m_childspace = new UIChildSpaceWidget();
|
|
}
|
|
|
|
UIFloatingWindow::~UIFloatingWindow()
|
|
{
|
|
}
|
|
|
|
void UIFloatingWindow::FrameInitialized
|
|
(
|
|
void
|
|
)
|
|
|
|
{
|
|
FrameInitialized(true);
|
|
}
|
|
|
|
void UIFloatingWindow::FrameInitialized
|
|
(
|
|
bool bHasDragBar
|
|
)
|
|
|
|
{
|
|
//
|
|
// Initialize the close button
|
|
//
|
|
m_closeButton->InitFrame(
|
|
this,
|
|
m_frame.size.width - 18.0 * getHighResScale()[0],
|
|
2.0,
|
|
16.0 * getHighResScale()[0],
|
|
16.0 * getHighResScale()[1],
|
|
-1,
|
|
"marlett"
|
|
);
|
|
|
|
m_closeButton->setTitle("r");
|
|
m_closeButton->setName("closebutton");
|
|
|
|
//
|
|
// Initialize the minimize button
|
|
//
|
|
m_minimizeButton->InitFrame(
|
|
this,
|
|
m_frame.size.width - 36.0 * getHighResScale()[0],
|
|
2.0,
|
|
16.0 * getHighResScale()[0],
|
|
16.0 * getHighResScale()[1],
|
|
-1,
|
|
"marlett"
|
|
);
|
|
m_minimizeButton->setTitle("0");
|
|
m_minimizeButton->setName("minimizebutton");
|
|
|
|
m_closeButton->Connect(this, W_Button_Pressed, UIFloatingWindow::W_ClosePressed);
|
|
m_minimizeButton->Connect(this, W_Button_Pressed, UIFloatingWindow::W_MinimizePressed);
|
|
//
|
|
// Size event
|
|
//
|
|
Connect(this, W_SizeChanged, W_SizeChanged);
|
|
Connect(this, W_Activated, W_Activated);
|
|
|
|
//
|
|
// Child space
|
|
//
|
|
if (bHasDragBar)
|
|
{
|
|
m_childspace->InitFrame(
|
|
this,
|
|
UIRect2D(2.0, 20.0 * getHighResScale()[1], m_frame.size.width - 4.0, m_frame.size.height - 22.0 * getHighResScale()[1]),
|
|
0,
|
|
"verdana-12"
|
|
);
|
|
}
|
|
else
|
|
{
|
|
m_childspace->InitFrame(
|
|
this,
|
|
UIRect2D(UIPoint2D(0, 0), m_frame.size),
|
|
0,
|
|
"verdana-12"
|
|
);
|
|
}
|
|
|
|
m_childspace->setTitle("Child space");
|
|
m_childspace->AllowActivate(true);
|
|
}
|
|
|
|
void UIFloatingWindow::ClosePressed
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
PostEvent(EV_Remove, 0.0);
|
|
}
|
|
|
|
void UIFloatingWindow::MinimizePressed
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
UISize2D size = getSize();
|
|
|
|
if (!m_minimized)
|
|
{
|
|
m_minimized = true;
|
|
// save the hold height
|
|
// so the window can be restored later
|
|
m_restoredHeight = size.height;
|
|
size.height = 20.0 * getHighResScale()[1];
|
|
m_minimizeButton->setTitle("1");
|
|
}
|
|
else
|
|
{
|
|
m_minimized = false;
|
|
size.height = m_restoredHeight;
|
|
m_minimizeButton->setTitle("0");
|
|
}
|
|
|
|
setSize(size);
|
|
uWinMan.ActivateControl(this);
|
|
}
|
|
|
|
void UIFloatingWindow::Pressed
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
UIPoint2D p = MouseEventToClientPoint(ev);
|
|
|
|
m_clickOffset.x = p.x;
|
|
m_clickOffset.y = p.y;
|
|
|
|
if (uid.time - 500 >= m_clicktime) {
|
|
m_clicktime = uid.time;
|
|
}
|
|
else
|
|
{
|
|
if (fabs(m_clickpoint.x - m_clickOffset.x) > 2.0 || fabs(m_clickpoint.y - m_clickOffset.y) > 2.0) {
|
|
m_clicktime = uid.time;
|
|
} else {
|
|
ProcessEvent(W_MinimizePressed);
|
|
m_clicktime = -20000;
|
|
}
|
|
}
|
|
|
|
m_clickpoint = m_clickOffset;
|
|
if (m_clickOffset.y < 18.0)
|
|
{
|
|
uWinMan.setFirstResponder(this);
|
|
m_isPressed = true;
|
|
}
|
|
}
|
|
|
|
void UIFloatingWindow::Released
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
if (!m_isPressed) {
|
|
return;
|
|
}
|
|
|
|
uWinMan.setFirstResponder(NULL);
|
|
m_isPressed = false;
|
|
OnActivated(NULL);
|
|
}
|
|
|
|
void UIFloatingWindow::Dragged
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
if (!m_isPressed) {
|
|
return;
|
|
}
|
|
|
|
UIPoint2D point = MouseEventToClientPoint(ev);
|
|
UIPoint2D newpos;
|
|
|
|
newpos.x = point.x - m_clickOffset.x;
|
|
newpos.y = point.y - m_clickOffset.y;
|
|
newpos.x += m_frame.pos.x;
|
|
newpos.y += m_frame.pos.y;
|
|
|
|
setFrame(UIRect2D(newpos, getSize()));
|
|
}
|
|
|
|
void UIFloatingWindow::SizeChanged
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
UIRect2D childRect;
|
|
childRect.pos.x = 2.0;
|
|
childRect.pos.y = 20.0 * getHighResScale()[1];
|
|
childRect.size.width = m_frame.size.width - 4.0 * getHighResScale()[0];
|
|
childRect.size.height = m_frame.size.height - 22.0 * getHighResScale()[1];
|
|
|
|
if (childRect.size.width <= 0.0 || childRect.size.height <= 0.0) {
|
|
return;
|
|
}
|
|
|
|
m_childspace->setFrame(childRect);
|
|
m_closeButton->setFrame(UIRect2D(m_frame.size.width - 18.0 * getHighResScale()[0], 2.0, 16.0 * getHighResScale()[0], 16.0 * getHighResScale()[1]));
|
|
m_minimizeButton->setFrame(UIRect2D(m_frame.size.width - 36.0 * getHighResScale()[0], 2.0, 16.0 * getHighResScale()[0], 16.0 * getHighResScale()[1]));
|
|
}
|
|
|
|
void UIFloatingWindow::OnActivated
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
UIWidget* next;
|
|
|
|
if (!IsActive()) {
|
|
return;
|
|
}
|
|
|
|
for (next = m_childspace->getFirstChild(); next; next = m_childspace->getNextChild(next))
|
|
{
|
|
if (next->CanActivate())
|
|
{
|
|
uWinMan.ActivateControl(next);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void UIFloatingWindow::OnDeactivated
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
PostEvent(EV_Remove, 0.0);
|
|
}
|
|
|
|
void UIFloatingWindow::Create
|
|
(
|
|
UIWidget *parent,
|
|
const UIRect2D& rect,
|
|
const char *title,
|
|
const UColor& bgColor,
|
|
const UColor& fgColor
|
|
)
|
|
|
|
{
|
|
m_titleColor = bgColor;
|
|
m_textColor = fgColor;
|
|
setTitle(title);
|
|
// actually create the window
|
|
InitFrame(parent, rect.pos.x, rect.pos.y, rect.size.width, rect.size.height, 0, "verdana-14");
|
|
}
|
|
|
|
void UIFloatingWindow::Draw
|
|
(
|
|
void
|
|
)
|
|
|
|
{
|
|
UColor titleBar;
|
|
UColor textColor;
|
|
UBorderColor titleBorder;
|
|
UBorderColor windowBorder;
|
|
|
|
if (IsThisOrChildActive())
|
|
{
|
|
UColor newColor;
|
|
|
|
titleBar = m_titleColor;
|
|
textColor = m_textColor;
|
|
|
|
UColorHSV tmp(titleBar);
|
|
tmp.s *= 0.75;
|
|
tmp.v *= 1.333;
|
|
newColor = tmp;
|
|
|
|
titleBorder.dark = newColor;
|
|
titleBorder.reallydark = newColor;
|
|
titleBorder.light = newColor;
|
|
|
|
}
|
|
else
|
|
{
|
|
UColor newColor(0.1125, 0.147, 0.2085, 1.0);
|
|
|
|
titleBar = newColor;
|
|
textColor = UBlack;
|
|
|
|
titleBorder.CreateSolidBorder(newColor, DARK);
|
|
titleBorder.reallydark = newColor;
|
|
titleBorder.light = newColor;
|
|
}
|
|
|
|
UColor newColor(0.15, 0.196, 0.278, 1.0);
|
|
newColor.ScaleColor(0.666f);
|
|
|
|
windowBorder.dark = newColor;
|
|
windowBorder.reallydark = newColor;
|
|
windowBorder.light = newColor;
|
|
|
|
setForegroundColor(textColor);
|
|
m_closeButton->setForegroundColor(textColor);
|
|
m_closeButton->setBackgroundColor(titleBar, true);
|
|
m_minimizeButton->setForegroundColor(textColor);
|
|
m_minimizeButton->setBackgroundColor(titleBar, true);
|
|
|
|
if (!IsMinimized())
|
|
{
|
|
DrawBoxWithSolidBorder(
|
|
getClientFrame(),
|
|
UColor(0.15, 0.195, 0.278, 1.0),
|
|
UColor(0.075, 0.097, 0.139, 1.0),
|
|
2,
|
|
2,
|
|
1.0
|
|
);
|
|
}
|
|
|
|
const float maxTitleBarHeight = 20 * getHighResScale()[1];
|
|
|
|
DrawBox(
|
|
0.0,
|
|
0.0,
|
|
m_frame.size.width,
|
|
m_frame.size.height > maxTitleBarHeight ? maxTitleBarHeight : m_frame.size.height,
|
|
titleBar,
|
|
1.0
|
|
);
|
|
|
|
Draw3DBox(
|
|
0.0,
|
|
0.0,
|
|
m_frame.size.width,
|
|
m_frame.size.height > maxTitleBarHeight ? maxTitleBarHeight : m_frame.size.height,
|
|
false,
|
|
titleBorder,
|
|
1.0
|
|
);
|
|
|
|
DrawTitle(3.0, 3.0);
|
|
}
|
|
|
|
UIChildSpaceWidget *UIFloatingWindow::getChildSpace
|
|
(
|
|
void
|
|
)
|
|
|
|
{
|
|
return m_childspace;
|
|
}
|
|
|
|
bool UIFloatingWindow::IsMinimized
|
|
(
|
|
void
|
|
)
|
|
|
|
{
|
|
return m_minimized;
|
|
}
|