From f3affb3d4c464c45b429e18aa0bdb7fcd4e9fe71 Mon Sep 17 00:00:00 2001 From: smallmodel <15067410+smallmodel@users.noreply.github.com> Date: Sun, 30 Jul 2023 00:56:54 +0200 Subject: [PATCH] Implemented DontLocalize and FadeSequence from mohaas --- code/uilib/uiwidget.cpp | 158 ++++++++++++++++++++++++++++++++-------- code/uilib/uiwidget.h | 41 ++++++++++- 2 files changed, 166 insertions(+), 33 deletions(-) diff --git a/code/uilib/uiwidget.cpp b/code/uilib/uiwidget.cpp index ec37f541..57da7145 100644 --- a/code/uilib/uiwidget.cpp +++ b/code/uilib/uiwidget.cpp @@ -419,6 +419,24 @@ Event EV_Layout_AliasCache "Create an alias to the specified path and cache the resource" ); +Event EV_Layout_DontLocalize + ( + "dontlocalize", + EV_DEFAULT, + NULL, + NULL, + "Disables localization for this widget" + ); + +Event EV_Layout_FadeSequence + ( + "fadesequence", + EV_DEFAULT, + "ffff", + "delay fadein hold fadeout", + "Set up for a delay/fadein/hold/fadeout" + ); + Event EV_Layout_BGFill ( "bgfill", @@ -484,6 +502,8 @@ CLASS_DECLARATION( USignal, UIWidget, NULL ) { &EV_Widget_Disable, &UIWidget::DisableEvent }, { &EV_Widget_EnabledCvar, &UIWidget::SetEnabledCvar }, { &EV_Widget_ScaleCvar, &UIWidget::SetScaleCvar }, + { &EV_Layout_DontLocalize, &UIWidget::SetDontLocalize }, + { &EV_Layout_FadeSequence, &UIWidget::EventFadeSequence }, { NULL, NULL } }; @@ -871,6 +891,10 @@ void UIWidget::FrameInitialized ) { + if (m_fadeSequenceDelayStart || m_fadeSequenceFadeIn || m_fadeSequenceHold || m_fadeSequenceFadeOut) { + m_fadeSequenceDelayEnd = m_fadeSequenceDelayStart; + m_fadeSequenceState = fadesequence_t::SEQUENCE_FADEIN; + } } void UIWidget::DrawTitle @@ -897,8 +921,62 @@ void UIWidget::Motion t = uid.time / 1000.0; - if( m_fadetime >= 0.0 ) + if (m_fadeSequenceState != fadesequence_t::SEQUENCE_NONE) { + if (!paused->integer) { + switch (m_fadeSequenceState) + { + case fadesequence_t::SEQUENCE_STARTING: + m_alpha = 0.f; + m_fadeSequenceDelayEnd -= t - m_fadeSequenceAlpha; + if (m_fadeSequenceDelayEnd >= 0.f) { + m_fadeSequenceAlpha = t; + } else { + m_fadeSequenceState = fadesequence_t::SEQUENCE_FADEIN; + m_fadeSequenceAlpha = t; + m_fadeSequenceDelayEnd = m_fadeSequenceFadeIn; + } + break; + case fadesequence_t::SEQUENCE_FADEIN: + m_alpha = 1.f - m_fadeSequenceDelayEnd / m_fadeSequenceFadeIn; + m_fadeSequenceDelayEnd -= t - m_fadeSequenceAlpha; + if (m_fadeSequenceDelayEnd >= 0.f) { + m_fadeSequenceAlpha = t; + } else { + m_fadeSequenceState = fadesequence_t::SEQUENCE_HOLD; + m_fadeSequenceAlpha = t; + m_fadeSequenceDelayEnd = m_fadeSequenceHold; + } + break; + case fadesequence_t::SEQUENCE_HOLD: + m_alpha = 1.f; + m_fadeSequenceDelayEnd -= t - m_fadeSequenceAlpha; + if (m_fadeSequenceDelayEnd >= 0.f) { + m_fadeSequenceAlpha = t; + } else { + m_fadeSequenceState = fadesequence_t::SEQUENCE_FADEOUT; + m_fadeSequenceAlpha = t; + m_fadeSequenceDelayEnd = m_fadeSequenceFadeOut; + } + break; + case fadesequence_t::SEQUENCE_FADEOUT: + m_alpha = m_fadeSequenceDelayEnd / m_fadeSequenceFadeOut; + m_fadeSequenceDelayEnd -= (t - m_fadeSequenceAlpha); + if (m_fadeSequenceDelayEnd >= 0.f) { + m_fadeSequenceAlpha = t; + } else { + m_alpha = 0.f; + m_fadeSequenceState = fadesequence_t::SEQUENCE_NONE; + } + break; + default: + m_fadeSequenceAlpha = t; + break; + } + } else { + m_fadeSequenceAlpha = t; + } + } else if( m_fadetime >= 0.0 ) { frac = ( t - m_starttime ) / m_fadetime; m_alpha = frac; @@ -1677,35 +1755,6 @@ void UIWidget::LayoutAliasCache } } -void UIWidget::SetEnabledCvar - ( - Event *ev - ) - -{ - m_enabledCvar = ev->GetString( 1 ); -} - -void UIWidget::SetScaleCvar - ( - Event *ev - ) -{ - m_scaleCvar = uii.Cvar_Find(ev->GetString(1).c_str()); -} - -void UIWidget::SetVirtualScale(vec2_t out) -{ - out[0] = uid.vidWidth / 640.0; - out[1] = uid.vidHeight / 480.0; - - if (m_scaleCvar) - { - out[0] *= m_scaleCvar->value; - out[1] *= m_scaleCvar->value; - } -} - void UIWidget::setParent ( UIWidget *parent @@ -3030,6 +3079,55 @@ bool UIWidget::PassEventToWidget return true; } +void UIWidget::SetEnabledCvar +( + Event* ev +) + +{ + m_enabledCvar = ev->GetString(1); +} + +void UIWidget::SetScaleCvar +( + Event* ev +) +{ + m_scaleCvar = uii.Cvar_Find(ev->GetString(1).c_str()); +} + +void UIWidget::SetVirtualScale(vec2_t out) +{ + out[0] = uid.vidWidth / 640.0; + out[1] = uid.vidHeight / 480.0; + + if (m_scaleCvar) + { + out[0] *= m_scaleCvar->value; + out[1] *= m_scaleCvar->value; + } +} + +void UIWidget::SetDontLocalize(Event* ev) +{ + SetDontLocalize(); +} + +void UIWidget::EventFadeSequence(Event* ev) +{ + m_fadeSequenceDelayStart = ev->GetFloat(1); + m_fadeSequenceFadeIn = ev->GetFloat(2); + m_fadeSequenceHold = ev->GetFloat(3); + m_fadeSequenceFadeOut = ev->GetFloat(4); + m_fadeSequenceDelayEnd = m_fadeSequenceDelayStart; + m_fadeSequenceState = fadesequence_t::SEQUENCE_FADEIN; +} + +void UIWidget::SetDontLocalize() +{ + m_flags |= WF_DONTLOCALIZE; +} + CLASS_DECLARATION( UIWidget, UIWidgetContainer, NULL ) { { &EV_Layout_BGFill, &UIWidgetContainer::SetBGFill }, diff --git a/code/uilib/uiwidget.h b/code/uilib/uiwidget.h index fea22706..50a29627 100644 --- a/code/uilib/uiwidget.h +++ b/code/uilib/uiwidget.h @@ -57,6 +57,7 @@ public: #define WF_ALWAYS_BOTTOM (1<<4) #define WF_ALWAYS_TOP (1<<5) #define WF_NOPARENTADJUST (1<<6) +#define WF_DONTLOCALIZE (1<<7) // widget alignment flags #define WA_LEFT (1<<0) @@ -68,9 +69,33 @@ public: #define WA_FULL ( WA_LEFT | WA_RIGHT | WA_TOP | WA_BOTTOM | WA_CENTERX | WA_CENTERY ) typedef class UIReggedMaterial UIReggedMaterial; -typedef enum { border_none, border_3D, border_indent, border_outline } borderstyle_t; -typedef enum { D_NONE, D_FROM_LEFT, D_FROM_RIGHT, D_FROM_BOTTOM, D_FROM_TOP } direction_t; -typedef enum { MOTION_IN, MOTION_OUT } motion_t; +typedef enum { + border_none, + border_3D, + border_indent, + border_outline +} borderstyle_t; + +typedef enum { + D_NONE, + D_FROM_LEFT, + D_FROM_RIGHT, + D_FROM_BOTTOM, + D_FROM_TOP +} direction_t; + +typedef enum { + MOTION_IN, + MOTION_OUT +} motion_t; + +typedef enum { + SEQUENCE_NONE, + SEQUENCE_STARTING, + SEQUENCE_FADEIN, + SEQUENCE_HOLD, + SEQUENCE_FADEOUT +} fadesequence_t; class UIWidget : public USignal { friend class Menu; @@ -118,6 +143,13 @@ protected: float m_alpha; float m_local_alpha; float m_motiontime; + float m_fadeSequenceDelayStart; + float m_fadeSequenceFadeIn; + float m_fadeSequenceHold; + float m_fadeSequenceFadeOut; + float m_fadeSequenceDelayEnd; + float m_fadeSequenceAlpha; + int m_fadeSequenceState; str m_stopsound; str m_clicksound; int m_align; @@ -194,8 +226,11 @@ public: void LayoutAliasCache( Event *ev ); void SetEnabledCvar( Event *ev ); void SetScaleCvar( Event *ev ); + void SetDontLocalize( Event *ev ); + void EventFadeSequence( Event *ev ); void SetVirtualScale(vec2_t out); + void SetDontLocalize(); void setParent( UIWidget *parent ); class UIWidget *getParent( void ); class UIWidget *getFirstChild( void );