openDecal/Native/Inject/BarLayer.cpp
erik d1442e3747 Initial commit: Complete open-source Decal rebuild
All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:27:56 +01:00

1128 lines
No EOL
28 KiB
C++

// BarLayer.cpp : Implementation of cBarLayer
#include "stdafx.h"
#include "Inject.h"
#include "BarLayer.h"
#include "Manager.h"
#include "SimpleBar.h"
/////////////////////////////////////////////////////////////////////////////
// cBarLayer
// Drakier: Added constants for Panel and Radar size
const int RADAR_SIZE = 110;
const int PANEL_SIZE = 308;
const int VITALS_SIZE = 28;
const int CHATBAR_SIZE = 101;
const int CHATBAR_MAX_SIZE = 259;
const int LOOT_SIZE = 101;
const int BUTTON_SIZE = 16;
const int MINBAR_SIZE = 20;
int MAXBAR_SIZE = 100;
// Drakier: Added constants for docking position
const int DOCK_TOP = 0;
const int DOCK_LEFT = 1;
const int DOCK_RIGHT = 2;
enum eChildID
{
eBtnForwards = 1,
eBtnBackwards = 2,
ePager = 3,
eBtnMinMax = 4,
eBtnDockCycle = 5,
eChildBarFirst = 1000
};
cBarLayer::cBarLayer() : m_nBarStartPos( 0 ), m_nBarDock( DOCK_TOP ), m_nScreenWidth( 0 ), m_nScreenHeight( 0 ), m_nBarLength( 0 ), m_nPosition( 0 ), m_nDragging( 0 ), m_nMinMax( eStateMax )
{
}
void cBarLayer::onCreate()
{
//::MessageBox( NULL, _T( "cBarLayer::onCreate" ), _T( "Inject.dll" ), MB_OK );
m_pSite->get_PluginSite( &m_pPlugin );
if (!cManager::_p->m_bContainer)
m_pPlugin->get_Hooks( &m_pHooks );
_ASSERTE( m_pPlugin.p != NULL );
m_pPlugin->LoadBitmapPortal( 0x06001115, &m_pBackground );
_ASSERTE( m_pBackground.p != NULL );
RegKey key;
key.Create( HKEY_LOCAL_MACHINE, _T( "SOFTWARE\\Decal" ) );
DWORD dwAlpha = 255, dwRadarDraw = 1, dwBarDocked = 0;
m_bRadarDraw = true;
m_bDocked = false;
if( key.QueryDWORDValue( "BarAlpha", dwAlpha ) == ERROR_SUCCESS )
m_pSite->put_Alpha( dwAlpha );
if( key.QueryDWORDValue( "BarRadarDraw", dwRadarDraw ) == ERROR_SUCCESS )
m_bRadarDraw = dwRadarDraw ? true : false;
if( key.QueryDWORDValue( "BarDocked", dwBarDocked ) == ERROR_SUCCESS )
m_bDocked = (dwBarDocked == 1) ? true : false;
if( key.QueryDWORDValue( "BarState", m_nMinMax ) != ERROR_SUCCESS )
m_nMinMax = eStateMax;
// Drakier: get the bar start pos or default to left
if( key.QueryDWORDValue( "BarStart", (DWORD &)m_nBarStartPos ) != ERROR_SUCCESS )
m_nBarStartPos = 0;
// Drakier: get the bar length or default to 250 px
if( key.QueryDWORDValue( "BarLength", (DWORD &)m_nBarLength ) != ERROR_SUCCESS )
m_nBarLength = 250;
// Drakier: get the bar dock setting (top/left/right) [default to top]
if( key.QueryDWORDValue( "BarDock", (DWORD &)m_nBarDock ) != ERROR_SUCCESS )
m_nBarDock = DOCK_TOP;
// Drakier: TESTING for Min/Max Side Dock
//if (m_nBarDock != DOCK_TOP)
//m_nMinMax = eStateMin;
// Ok, first create the 4 background controls
LayerParams lpChild;
lpChild.render = eRenderClipped;
//= { eBtnMinMax, { 12, 3, 28, 19 }, eRenderClipped };
{
lpChild.ID = eBtnMinMax;
CComPtr< ILayer > pUnk;
HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) );
_ASSERTE( SUCCEEDED( hRes ) );
m_pSite->CreateChild( &lpChild, pUnk );
pUnk->QueryInterface( &m_pBtnMinMax );
_ASSERTE( m_pBtnMinMax.p != NULL );
m_pBtnMinMax->SetImages( 0, 0x0600113C, 0x0600113C );
ICommandEventsImpl< BUTTON_MINMAX, cBarLayer >::advise( m_pBtnMinMax );
m_pBtnMinMax->put_Matte( RGB( 0, 0, 0 ) );
}
{
lpChild.ID = eBtnDockCycle;
CComPtr< ILayer > pUnk;
HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) );
_ASSERTE( SUCCEEDED( hRes ) );
m_pSite->CreateChild( &lpChild, pUnk );
pUnk->QueryInterface( & m_pBtnDockCycle );
_ASSERTE ( m_pBtnDockCycle.p != NULL );
m_pBtnDockCycle->SetImages( 0, 0x0600129A, 0x0600129B );
ICommandEventsImpl< BUTTON_DOCKCYCLE, cBarLayer >::advise( m_pBtnDockCycle );
m_pBtnDockCycle->put_Matte( RGB( 0, 0, 0 ) );
}
{
lpChild.ID = eBtnForwards;
CComPtr< ILayer > pUnk;
HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) );
_ASSERTE( SUCCEEDED( hRes ) );
m_pSite->CreateChild( &lpChild, pUnk );
pUnk->QueryInterface( &m_pBtnForwards );
_ASSERTE( m_pBtnForwards.p != NULL );
// Drakier: Bar Dock
if (m_nBarDock != DOCK_TOP)
m_pBtnForwards->SetImages( 0, 0x0600125E, 0x0600125F );
else
m_pBtnForwards->SetImages( 0, 0x06001298, 0x06001299 );
ICommandEventsImpl< BUTTON_FORWARD, cBarLayer >::advise( m_pBtnForwards );
m_pBtnForwards->put_Matte( RGB( 0, 0, 0 ) );
}
{
lpChild.ID = eBtnBackwards;
CComPtr< ILayer > pUnk;
HRESULT hRes = ::CoCreateInstance( CLSID_Button, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) );
_ASSERTE( SUCCEEDED( hRes ) );
m_pSite->CreateChild( &lpChild, pUnk );
pUnk->QueryInterface( &m_pBtnBackwards );
_ASSERTE( m_pBtnBackwards.p != NULL );
// Drakier: Bar Dock
if (m_nBarDock != DOCK_TOP)
m_pBtnBackwards->SetImages( 0, 0x06001261, 0x06001262 );
else
m_pBtnBackwards->SetImages( 0, 0x06001295, 0x06001296 );
ICommandEventsImpl< BUTTON_BACK, cBarLayer >::advise( m_pBtnBackwards );
m_pBtnBackwards->put_Matte( RGB( 0, 0, 0 ) );
}
{
lpChild.ID = ePager;
CComPtr< ILayer > pUnk;
HRESULT hRes = ::CoCreateInstance( CLSID_Pager, NULL, CLSCTX_INPROC_SERVER, IID_ILayer, reinterpret_cast< void ** >( &pUnk ) );
_ASSERTE( SUCCEEDED( hRes ) );
m_pSite->CreateChild( &lpChild, pUnk );
pUnk->QueryInterface( &m_pPager );
_ASSERTE( m_pPager.p != NULL );
IPagerEventsImpl< PAGER_CLIENT, cBarLayer >::advise( m_pPager );
}
m_pSite->put_Transparent( VARIANT_FALSE );
if( m_nMinMax == eStateMin )
m_pBtnMinMax->SetImages( 0, 0x0600113C, 0x0600113C );
else
m_pBtnMinMax->SetImages( 0, 0x0600113B, 0x0600113B );
//::MessageBox( NULL, _T( "Here" ), _T( "[Inject.dll] cBarLayer::onCreate" ), MB_OK );
}
void cBarLayer::onDestroy()
{
m_pHooks.Release();
m_pPlugin.Release();
m_pBtnForwards.Release();
m_pBtnBackwards.Release();
m_pBackground.Release();
m_pPager.Release();
}
STDMETHODIMP cBarLayer::Render(ICanvas *pCanvas)
{
_ASSERTE( pCanvas != NULL );
SIZE sz;
m_pPlugin->GetScreenSize( &sz );
if ( sz.cx <= 1024 )
MAXBAR_SIZE = 80;
else
MAXBAR_SIZE = 100;
ClipParams p;
pCanvas->GetClipParams( &p );
m_pBackground->PatBlt( pCanvas, &p.window, &p.org );
if (m_nBarDock == DOCK_TOP) // if we are top docked
{
RECT dragBarRect;
dragBarRect.left = 3;
dragBarRect.top = 4;
dragBarRect.right = 4;
dragBarRect.bottom = 19;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
dragBarRect.left += 1;
dragBarRect.right += 1;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
dragBarRect.left += 2;
dragBarRect.right += 2;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
dragBarRect.left += 1;
dragBarRect.right += 1;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
// Drakier: draw the right-hand grab bars
dragBarRect.left = m_nBarLength - 4;
dragBarRect.top = 4;
dragBarRect.right = m_nBarLength - 3;
dragBarRect.bottom = 19;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
dragBarRect.left -= 1;
dragBarRect.right -= 1;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
dragBarRect.left -= 2;
dragBarRect.right -= 2;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
dragBarRect.left -= 1;
dragBarRect.right -= 1;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
}
else // draw on the sides
{
RECT dragBarRect;
dragBarRect.top = 3;
dragBarRect.left = 4;
dragBarRect.bottom = 4;
if (m_nMinMax == eStateMin) // Minimized
dragBarRect.right = MINBAR_SIZE - 4;
else // Maximized
dragBarRect.right = MAXBAR_SIZE - 4;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
dragBarRect.top += 1;
dragBarRect.bottom += 1;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
dragBarRect.top += 2;
dragBarRect.bottom += 2;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
dragBarRect.top += 1;
dragBarRect.bottom += 1;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
// Drakier: draw the right-hand grab bars
dragBarRect.top = m_nBarLength - 4;
dragBarRect.left = 4;
dragBarRect.bottom = m_nBarLength - 3;
if (m_nMinMax == eStateMin) // Minimized
dragBarRect.right = MINBAR_SIZE - 4;
else // Maximized
dragBarRect.right = MAXBAR_SIZE - 4;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
dragBarRect.top -= 1;
dragBarRect.bottom -= 1;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
dragBarRect.top -= 2;
dragBarRect.bottom -= 2;
pCanvas->Fill(&dragBarRect, RGB(165, 82, 57));
dragBarRect.top -= 1;
dragBarRect.bottom -= 1;
pCanvas->Fill(&dragBarRect, RGB(214, 173, 140));
}
_ASSERTMEM( _CrtCheckMemory( ) );
return S_OK;
}
#define ENUM_REFORMAT 1
class cBarEnumFormat
{
public:
long nCursor;
};
STDMETHODIMP cBarLayer::Reformat()
{
_ASSERTE( m_pSite.p != NULL );
//::MessageBox( NULL, _T( "cBarLayer::reformat" ), _T( "Inject.dll" ), MB_OK );
SIZE sz;
m_pPlugin->GetScreenSize( &sz );
long lX = sz.cx, lY = sz.cy;
HRESULT hW = S_FALSE, hH = S_FALSE;
// Drakier: if we are not in the container, get the 3D Area
if ( !cManager::_p->m_bContainer )
{
hH = m_pHooks->get_Area3DHeight( &lY );
hW = m_pHooks->get_Area3DWidth( &lX );
}
// Drakier: if we are in the container, or the 3D area's are NULL
if ( (cManager::_p->m_bContainer) || (hW != S_OK) || (hH != S_OK) )
{
m_nScreenWidth = sz.cx - PANEL_SIZE;
m_nScreenHeight = sz.cy;
}
else // Drakier: If everything comes out right and we are not in container
{
if( (hW == S_OK) && (lX > 200) && (lX < 2000) )
m_nScreenWidth = lX;
if( (hH == S_OK) && (lY > 200) && (lY < 2000) )
m_nScreenHeight = lY;
}
// Drakier: set up the bar position
// Drakier: make sure bar isn't off of left side of screen
// and that the bar length is at least 112 px
if (m_nBarStartPos < 0)
m_nBarStartPos = 0;
if (m_nBarLength < 112)
m_nBarLength = 250;
// Drakier: the right edge of the 3D area is (m_nScreenWidth)
// If you include the radar (110) it is (m_nScreenWidth - RADAR_SIZE)
// Drakier: need 2 of these sections. One for top dock and one for side dock
// Drakier: TOP DOCK
if (m_nBarDock == DOCK_TOP)
{
// make sure bar isn't off RIGHT side of screen
if (m_nBarLength > m_nScreenWidth )
m_nBarLength = m_nScreenWidth;
// Drakier: adjust bar start position so its not offscreen
if (m_nBarStartPos > m_nScreenWidth )
m_nBarStartPos = m_nScreenWidth - m_nBarLength;
// Drakier: Adjust for Panel
if ((m_nBarStartPos + m_nBarLength) > m_nScreenWidth )
m_nBarLength = m_nScreenWidth - m_nBarStartPos;
// Drakier: Adjust for Radar
if ( (!m_bRadarDraw) && ((m_nBarStartPos + m_nBarLength) > (m_nScreenWidth - RADAR_SIZE)) )
m_nBarLength = m_nScreenWidth - RADAR_SIZE - m_nBarStartPos;
}
else
{
// Drakier: SIDE DOCK
// Check the Right Side if Radar is on!
if ( ( !m_bRadarDraw ) && ( m_nBarDock == DOCK_RIGHT ) && ( m_nBarStartPos < RADAR_SIZE ) )
m_nBarStartPos = RADAR_SIZE;
if ( cManager::_p->m_bContainer ) // Drakier: In container (use CONST sizes)
{
// Drakier: make sure bar isn't off BOTTOM of screen
if (m_nBarLength > (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) )
m_nBarLength = (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE));
// Drakier: adjust bar start position so its not offscreen
if (m_nBarStartPos > (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) )
m_nBarStartPos = (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) - m_nBarLength;
// Drakier: Adjust for Panels
if ((m_nBarStartPos + m_nBarLength) > (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) )
m_nBarLength = (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE)) - m_nBarStartPos;
}
else // Drakier: Not in container
{
// Drakier: make sure bar isn't off BOTTOM of screen
if (m_nBarLength > m_nScreenHeight )
m_nBarLength = m_nScreenHeight;
// Drakier: Adjust for Panels
if ((m_nBarStartPos + m_nBarLength) > m_nScreenHeight )
m_nBarLength = m_nScreenHeight - m_nBarStartPos;
// Drakier: adjust bar start position so its not offscreen
if (m_nBarStartPos > m_nScreenHeight)
m_nBarStartPos = m_nScreenHeight - m_nBarLength;
// Drakier: if Docked (within 10 px) then stretch to fit
if ( m_bDocked )
m_nBarLength = m_nScreenHeight - m_nBarStartPos;
}
}
// Drakier: Draw the bar
RECT rc;
if (m_nBarDock == DOCK_LEFT) // Left Dock
{
rc.left = 0;
rc.top = m_nBarStartPos;
rc.bottom = m_nBarStartPos + m_nBarLength;
if (m_nMinMax == eStateMin) // Minimized
rc.right = MINBAR_SIZE;
else // Maximized
rc.right = MAXBAR_SIZE;
}
else if (m_nBarDock == DOCK_RIGHT) // Right Dock
{
if (m_nMinMax == eStateMin) // Minimized
rc.left = m_nScreenWidth - MINBAR_SIZE;
else // Maximized
rc.left = m_nScreenWidth - MAXBAR_SIZE;
rc.top = m_nBarStartPos;
rc.right = m_nScreenWidth;
rc.bottom = m_nBarStartPos + m_nBarLength;
}
else // Top Dock
{
rc.left = m_nBarStartPos;
rc.top = 0;
rc.right = m_nBarStartPos + m_nBarLength;
rc.bottom = 23;
}
m_pSite->put_Position( &rc );
// Now do the MinMax button
// { 12, 3, 28, 19 }
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if ( (m_nBarDock == DOCK_LEFT) || (m_nMinMax == eStateMin) )
{
rc.left = 3;
rc.top = 12;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
else // Right Dock
{
rc.left = MAXBAR_SIZE - ( BUTTON_SIZE + 3 );
rc.top = 12;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
}
else // Top Dock
{
rc.left = 12;
rc.top = 3;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
CComPtr< ILayerSite > pMinMaxSite;
m_pSite->get_Child( eBtnMinMax, ePositionByID, &pMinMaxSite );
pMinMaxSite->put_Position( &rc );
// Now do the dock cycle
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if (m_nMinMax == eStateMin) // minimized
{
rc.left = 3;
rc.top = m_nBarLength - 28;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
else
{
if (m_nBarDock == DOCK_LEFT)
{
rc.left = MAXBAR_SIZE - ( BUTTON_SIZE + 3 );
rc.top = 12;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
else
{
rc.left = 3;
rc.top = 12;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
}
}
else // Top Dock
{
rc.left = m_nBarLength - 28;
rc.top = 3;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
CComPtr< ILayerSite > pDockCycleSite;
m_pSite->get_Child( eBtnDockCycle, ePositionByID, &pDockCycleSite );
pDockCycleSite->put_Position( &rc );
// Now the pager
CComPtr< ILayerSite > pPagerSite;
m_pSite->get_Child( ePager, ePositionByID, &pPagerSite );
m_offsets.clear();
long nChildren;
long nOffset = 0;
long nDesired;
pPagerSite->get_ChildCount( &nChildren );
for( long nChild = 0; nChild < nChildren; ++ nChild )
{
ViewParams pParams;
CComPtr< ILayerSite > pChildSite;
pPagerSite->get_Child( nChild, ePositionByIndex, &pChildSite );
long nChildID;
pChildSite->get_ID( &nChildID );
if( nChildID < eChildBarFirst )
continue;
CComPtr< ISimpleBar > pBarNative;
pChildSite->GetSink( IID_ISimpleBar, reinterpret_cast< void ** >( &pBarNative ) );
pBarNative->get_Params(&pParams);
pParams.state = m_nMinMax;
pBarNative->put_Params(&pParams);
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if (m_nMinMax == eStateMin) // Minimized
{
rc.right = MINBAR_SIZE - 2;
}
else // Maximized
{
rc.right = MAXBAR_SIZE - 2;
}
nDesired = 20; // Button Height
rc.left = 0;
rc.top = nOffset;
rc.bottom = nOffset + nDesired;
}
else // Top Dock
{
// We always give bars their desired size (Width)
pBarNative->get_RenderWidth( &nDesired );
rc.left = nOffset;
rc.top = 0;
rc.right = nOffset + nDesired;
rc.bottom = 21;
}
pChildSite->put_Position( &rc );
m_offsets.push_back( nOffset );
nOffset += nDesired + 2;
}
// Calc ViewSlots for SideDock Maximized Up/Down Visibility
long nTotalBtnHeight;
// nOffset is total button height
nTotalBtnHeight = nOffset;
bool showPosBtns;
//showPosBtns = (nTotalBtnHeight > m_nBarLength);
if (m_nBarDock != DOCK_TOP) // Side Dock
{
rc.left = 1;
if (m_nMinMax == eStateMin) // minimized
{
showPosBtns = ( nTotalBtnHeight > ( m_nBarLength - 58 ) ); // Viewable Height
if ( showPosBtns )
{
rc.top = 50;
rc.bottom = m_nBarLength - 48;
}
else
{
rc.top = 30;
rc.bottom = m_nBarLength - 28;
}
rc.right = MINBAR_SIZE - 1;
}
else // maximized
{
showPosBtns = ( nTotalBtnHeight > ( m_nBarLength - 44 ) ); // Viewable Height
rc.top = 30;
rc.right = MAXBAR_SIZE - 1;
rc.bottom = m_nBarLength - 12;
}
}
else // Top Dock
{
showPosBtns = ( nTotalBtnHeight > ( m_nBarLength - 58 ) ); //Max Viewable Width
if ( showPosBtns )
{
rc.left = 50;
rc.right = m_nBarLength - 48;
}
else
{
rc.left = 30;
rc.right = m_nBarLength - 28;
}
rc.top = 1;
rc.bottom = 22;
}
pPagerSite->put_Position( &rc );
// Now do the backwards
if ( showPosBtns )
{
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if (m_nMinMax == eStateMin) // minimized
{
rc.left = 3;
rc.top = 30;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
else
{
rc.top = 12;
rc.left = (MAXBAR_SIZE / 2) - 17;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
}
else // Top Dock
{
rc.left = 30;
rc.top = 3;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
}
else
{
rc.left = -30;
rc.top = -30;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
CComPtr< ILayerSite > pBackwardsSite;
m_pSite->get_Child( eBtnBackwards, ePositionByID, &pBackwardsSite );
pBackwardsSite->put_Position( &rc );
// Drakier: this is a change because of the new LENGTH system
// Now do the forwards
if ( showPosBtns )
{
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if (m_nMinMax == eStateMin) // minimized
{
rc.left = 3;
rc.top = m_nBarLength - 46;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
else
{
rc.top = 12;
rc.left = (MAXBAR_SIZE / 2) + 1;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
}
else // Top Dock
{
rc.left = m_nBarLength - 46;
rc.top = 3;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
}
else
{
rc.left = -30;
rc.top = -30;
rc.right = rc.left + BUTTON_SIZE;
rc.bottom = rc.top + BUTTON_SIZE;
}
CComPtr< ILayerSite > pFwdSite;
m_pSite->get_Child( eBtnForwards, ePositionByID, &pFwdSite );
pFwdSite->put_Position( &rc );
/* Drakier: Testing if un-needed
// Check if the position is wrong now
if( m_nPosition >= m_offsets.size() )
m_nPosition = m_offsets.size() - 1;
*/
if ( !showPosBtns )
m_nPosition = 0;
POINT pt = { ( m_nPosition <= 0 ) ? 0 : m_offsets[ m_nPosition ], 0 };
if (m_nBarDock != DOCK_TOP) // Side Dock
{
pt.x = 0;
pt.y = ( m_nPosition <= 0 ) ? 0 : m_offsets[ m_nPosition ];
}
else // Top Dock
{
pt.x = ( m_nPosition <= 0 ) ? 0 : m_offsets[ m_nPosition ];
pt.y = 0;
}
m_pPager->ScrollTo( &pt );
m_pSite->Invalidate();
return S_OK;
}
VARIANT_BOOL cBarLayer::onClientGetNextPosition(long nID, long nCommand, long *pnX, long *pnY)
{
switch( nCommand )
{
case eBtnForwards:
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if( !m_bLocked && ( m_offsets.size() > 0 ) && ( ( m_nPosition + 1 ) < m_offsets.size() ) )
{
m_bLocked = TRUE;
m_nPosition++;
*pnX = 0;
*pnY = m_offsets[ m_nPosition ];
return VARIANT_TRUE;
}
}
else // Top Dock
{
if( !m_bLocked && ( m_offsets.size() > 0 ) && ( ( m_nPosition + 1 ) < m_offsets.size() ) )
{
//m_bLocked = TRUE;
m_nPosition++;
*pnX = m_offsets[ m_nPosition ];
*pnY = 0;
return VARIANT_TRUE;
}
}
break;
case eBtnBackwards:
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if( !m_bLocked && m_nPosition > 0 )
{
m_bLocked = TRUE;
m_nPosition--;
*pnX = 0;
*pnY = m_offsets[ m_nPosition ];
return VARIANT_TRUE;
}
}
else // Top Dock
{
if( !m_bLocked && m_nPosition > 0 )
{
//m_bLocked = TRUE;
m_nPosition--;
*pnX = m_offsets[ m_nPosition ];
*pnY = 0;
return VARIANT_TRUE;
}
}
break;
default:
// Unknown command
_ASSERT( FALSE );
}
// Unknown command or over/underflow - end paging
return VARIANT_FALSE;
}
STDMETHODIMP cBarLayer::AddBar(long nViewID, ViewParams *pParams)
{
_ASSERTE( pParams != NULL );
_ASSERTE( pParams->label != NULL );
CComObject< cSimpleBar > *pNewBar;
CComObject< cSimpleBar >::CreateInstance( &pNewBar );
pNewBar->put_Params( pParams );
CComPtr< ILayerSite > pPagerSite;
m_pSite->get_Child( ePager, ePositionByID, &pPagerSite );
LayerParams p = { nViewID, { 0, 0, 0, 0 }, eRenderClipped };
pPagerSite->CreateChild( &p, pNewBar );
m_pSite->Reformat();
return S_OK;
}
STDMETHODIMP cBarLayer::RemoveBar(long nViewID)
{
CComPtr< ILayerSite > pPagerSite;
m_pSite->get_Child( ePager, ePositionByID, &pPagerSite );
CComPtr< ILayerSite > pBarSite;
HRESULT hRes = pPagerSite->get_Child( nViewID, ePositionByID, &pBarSite );
if( FAILED( hRes ) )
// Probably not found
return hRes;
m_pSite->Reformat();
return pBarSite->Destroy();
}
STDMETHODIMP cBarLayer::get_Bar(long nViewID, ViewParams *pVal)
{
CComPtr< ILayerSite > pPagerSite;
m_pSite->get_Child( ePager, ePositionByID, &pPagerSite );
CComPtr< ILayerSite > pBarSite;
HRESULT hRes = pPagerSite->get_Child( nViewID, ePositionByID, &pBarSite );
if( FAILED( hRes ) )
// Probably not found
return hRes;
CComPtr< ISimpleBar > pSimpleBar;
pBarSite->GetSink( IID_ISimpleBar, reinterpret_cast< void ** >( &pSimpleBar ) );
pSimpleBar->get_Params( pVal );
return S_OK;
}
STDMETHODIMP cBarLayer::put_Bar(long nViewID, ViewParams *newVal)
{
CComPtr< ILayerSite > pPagerSite;
m_pSite->get_Child( ePager, ePositionByID, &pPagerSite );
CComPtr< ILayerSite > pBarSite;
HRESULT hRes = pPagerSite->get_Child( nViewID, ePositionByID, &pBarSite );
if( FAILED( hRes ) )
// Probably not found
return hRes;
CComPtr< ISimpleBar > pSimpleBar;
pBarSite->GetSink( IID_ISimpleBar, reinterpret_cast< void ** >( &pSimpleBar ) );
pSimpleBar->put_Params( newVal );
m_pSite->Reformat();
return S_OK;
}
void __stdcall cBarLayer::onMinMaxHit(long nID) {
RegKey key;
if (m_nMinMax == eStateMax)
{
m_nMinMax = eStateMin;
m_pBtnMinMax->SetImages(0, 0x0600113C, 0x0600113C);
}
else
{
m_nMinMax = eStateMax;
m_pBtnMinMax->SetImages(0, 0x0600113B, 0x0600113B);
}
key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal"));
key.SetDWORDValue("BarState", m_nMinMax);
Reformat();
}
void __stdcall cBarLayer::onDockCycleHit(long nID) {
RegKey key;
key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal"));
m_nBarDock = (m_nBarDock + 1) % 3;
if (m_nBarDock != DOCK_TOP)
{
m_pBtnForwards->SetImages( 0, 0x0600125E, 0x0600125F );
m_pBtnBackwards->SetImages( 0, 0x06001261, 0x06001262 );
//m_nMinMax = eStateMin;
if( key.QueryDWORDValue( "BarState", m_nMinMax ) != ERROR_SUCCESS )
m_nMinMax = eStateMax;
}
else
{
m_pBtnForwards->SetImages( 0, 0x06001298, 0x06001299 );
m_pBtnBackwards->SetImages( 0, 0x06001295, 0x06001296 );
if( key.QueryDWORDValue( "BarState", m_nMinMax ) != ERROR_SUCCESS )
m_nMinMax = eStateMax;
}
key.SetDWORDValue("BarDock", m_nBarDock);
m_pPager->FinishCommand;
Reformat();
}
STDMETHODIMP cBarLayer::MouseEvent(long nMsg, long wParam, long lParam) {
switch (nMsg)
{
case WM_LBUTTONDOWN:
RECT rSize;
m_pSite->get_Position(&rSize);
POINTS pt;
pt = MAKEPOINTS(lParam);
if( !cManager::_p->m_bContainer )
pt.y -= 28;
if (m_nBarDock != DOCK_TOP) // Side Dock
{
m_bDocked = FALSE;
// Drakier: Grabbing the Top drag bar
if (pt.x >= rSize.left && pt.x <= rSize.right && pt.y >= rSize.top + 1 && pt.y <= rSize.top + 8)
{
m_nDragging = -1;
m_DeltaY = pt.y;
}
// Drakier: Grabbing the right drag bar
if (pt.x >= rSize.left && pt.x <= rSize.right && pt.y >= rSize.bottom - 8 && pt.y <= rSize.bottom - 1)
{
m_nDragging = 1;
m_DeltaY = pt.y;
}
}
else // Top Dock
{
// Drakier: Grabbing the left drag bar
if (pt.y >= rSize.top && pt.y <= rSize.bottom && pt.x >= rSize.left + 1 && pt.x <= rSize.left + 8)
{
m_nDragging = -1;
m_DeltaX = pt.x;
}
// Drakier: Grabbing the right drag bar
if (pt.y >= rSize.top && pt.y <= rSize.bottom && pt.x >= rSize.right - 8 && pt.x <= rSize.right - 1)
{
m_nDragging = 1;
m_DeltaX = pt.x;
}
}
break;
case WM_LBUTTONUP:
if( m_nDragging == -1 || m_nDragging == 1 )
{
m_nDragging = 0;
RegKey key;
key.Create(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Decal"));
// Drakier: For the new bar system
key.SetDWORDValue("BarStart", (DWORD)m_nBarStartPos);
key.SetDWORDValue("BarLength", (DWORD)m_nBarLength);
if ( m_nBarDock != DOCK_TOP ) // Drakier: Side Docked
{
// Drakier: should we keep the decal bar STUCK to bottom of screen?
if ( (m_nBarStartPos + m_nBarLength) > (m_nScreenHeight - 10) )
m_bDocked = TRUE;
else
m_bDocked = FALSE;
key.SetDWORDValue("BarDocked", (DWORD)m_bDocked);
Reformat();
}
}
break;
case WM_MOUSEMOVE:
if (m_nBarDock != DOCK_TOP) // Side Dock
{
if ( m_nDragging == -1 ) // Drakier: Drag Up
{
POINTS pt;
pt = MAKEPOINTS(lParam);
if( !cManager::_p->m_bContainer )
pt.y -= 28;
if ( !m_bRadarDraw ) // Drakier: Radar On?
{
if ( ((m_nBarLength - (pt.y - m_DeltaY)) > 112 ) && (((pt.y - m_DeltaY) + m_nBarStartPos) >= 0) && (((pt.y - m_DeltaY) + m_nBarStartPos) >= (RADAR_SIZE)) )
{
m_nBarStartPos += pt.y - m_DeltaY;
m_nBarLength += (-1) * (pt.y - m_DeltaY);
m_DeltaY = pt.y;
}
}
else
{
if ( ((m_nBarLength - (pt.y - m_DeltaY)) > 112 ) && (((pt.y - m_DeltaY) + m_nBarStartPos) >= 0) )
{
m_nBarStartPos += pt.y - m_DeltaY;
m_nBarLength += (-1) * (pt.y - m_DeltaY);
m_DeltaY = pt.y;
}
}
Reformat( );
}
else if ( m_nDragging == 1 ) // Drakier: Drag Down
{
POINTS pt;
pt = MAKEPOINTS(lParam);
if( !cManager::_p->m_bContainer )
pt.y -= 28;
if ( cManager::_p->m_bContainer )
{
if ( ((pt.y - m_DeltaY + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.y - m_DeltaY) <= (m_nScreenHeight - (VITALS_SIZE + CHATBAR_SIZE + LOOT_SIZE))) )
{
m_nBarLength += pt.y - m_DeltaY;
m_DeltaY = pt.y;
}
}
else
{
if ( ((pt.y - m_DeltaY + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.y - m_DeltaY) <= m_nScreenHeight) )
{
m_nBarLength += pt.y - m_DeltaY;
m_DeltaY = pt.y;
}
}
Reformat( );
}
}
else // Top Dock
{
if ( m_nDragging == -1 ) // Drakier: Drag Left
{
POINTS pt;
pt = MAKEPOINTS(lParam);
if( !cManager::_p->m_bContainer )
pt.y -= 28;
if ( ((m_nBarLength - (pt.x - m_DeltaX)) > 112 ) && (((pt.x - m_DeltaX) + m_nBarStartPos) >= 0) )
{
m_nBarStartPos += pt.x - m_DeltaX;
m_nBarLength += (-1) * (pt.x - m_DeltaX);
m_DeltaX = pt.x;
}
Reformat( );
}
else if ( m_nDragging == 1 ) // Drakier: Drag Right
{
POINTS pt;
pt = MAKEPOINTS(lParam);
if( !cManager::_p->m_bContainer )
pt.y -= 28;
if ( !m_bRadarDraw ) // Drakier: Radar on?
{
//if ( ((pt.x - m_DeltaX + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.x - m_DeltaX) <= (*m_p3DW - RADAR_SIZE)) )
if ( ((pt.x - m_DeltaX + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.x - m_DeltaX) <= (m_nScreenWidth - RADAR_SIZE)) )
{
m_nBarLength += pt.x - m_DeltaX;
m_DeltaX = pt.x;
}
}
else // Drakier: Radar off!
{
if ( ((pt.x - m_DeltaX + m_nBarLength) >= 112) && ((m_nBarStartPos + m_nBarLength + pt.x - m_DeltaX) <= m_nScreenWidth) )
{
m_nBarLength += pt.x - m_DeltaX;
m_DeltaX = pt.x;
}
}
Reformat( );
}
}
break;
}
return S_OK;
}