/* =========================================================================== 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; } }