#pragma once #ifndef GWEN_SKINS_TEXTUREDBASE_H #define GWEN_SKINS_TEXTUREDBASE_H #include "Gwen/Skin.h" #include "Gwen/Gwen.h" #include "Gwen/Controls/Base.h" #include "Gwen/Texture.h" #include "Gwen/Skins/Texturing.h" namespace Gwen { namespace Skin { class TexturedBase : public Gwen::Skin::Base { public: Gwen::Color m_colBorderColor; Gwen::Color m_colControlOutlineLight; Gwen::Color m_colControlOutlineLighter; Gwen::Color m_colBG; Gwen::Color m_colBGDark; Gwen::Color m_colControl; Gwen::Color m_colControlBorderHighlight; Gwen::Color m_colControlDarker; Gwen::Color m_colControlOutlineNormal; Gwen::Color m_colControlBright; Gwen::Color m_colControlDark; Gwen::Color m_colHighlightBG; Gwen::Color m_colHighlightBorder; Gwen::Color m_colToolTipBackground; Gwen::Color m_colToolTipBorder; Gwen::Color m_colModal; Texture m_Texture; Texturing::Bordered m_texButton; Texturing::Bordered m_texButton_Hovered; Texturing::Bordered m_texButton_Pressed; Texturing::Bordered m_texMenu_Strip, m_texMenu_Panel, m_texMenu_Panel_Border; Texturing::Bordered m_texMenu_Hover; Texturing::Bordered m_texShadow; Texturing::Bordered m_texTextBox, m_texTextBox_Focus; Texturing::Bordered m_texTab_Control, m_texTab, m_texTab_Inactive, m_texTab_Gap, m_texTabBar; Texturing::Bordered m_texWindow, m_texWindow_Inactive; Texturing::Bordered m_texTreeBG; Texturing::Single m_Checkbox, m_Checkbox_Checked; Texturing::Single m_RadioButton, m_RadioButton_Checked; Texturing::Single m_CheckMark; Texturing::Single m_TreeMinus, m_TreePlus; virtual void Init(const TextObject& TextureName) { m_colBorderColor = Gwen::Color(80, 80, 80, 255); m_colBG = Gwen::Color(248, 248, 248, 255); m_colBGDark = Gwen::Color(235, 235, 235, 255); m_colControl = Gwen::Color(240, 240, 240, 255); m_colControlBright = Gwen::Color(255, 255, 255, 255); m_colControlDark = Gwen::Color(214, 214, 214, 255); m_colControlDarker = Gwen::Color(180, 180, 180, 255); m_colControlOutlineNormal = Gwen::Color(112, 112, 112, 255); m_colControlOutlineLight = Gwen::Color(144, 144, 144, 255); m_colControlOutlineLighter = Gwen::Color(210, 210, 210, 255); m_colHighlightBG = Gwen::Color(192, 221, 252, 255); m_colHighlightBorder = Gwen::Color(51, 153, 255, 255); m_colToolTipBackground = Gwen::Color(255, 255, 225, 255); m_colToolTipBorder = Gwen::Color(0, 0, 0, 255); m_colModal = Gwen::Color(25, 25, 25, 150); m_DefaultFont.facename = L"Microsoft Sans Serif"; m_DefaultFont.size = 11; m_Texture.Load(TextureName, GetRender()); m_texButton.Init(&m_Texture, 194, 0, 24, 24, Margin(8, 8, 8, 8)); m_texButton_Hovered.Init(&m_Texture, 194, 25, 24, 24, Margin(8, 8, 8, 8)); m_texButton_Pressed.Init(&m_Texture, 194, 50, 24, 24, Margin(8, 8, 8, 8)); m_texMenu_Strip.Init(&m_Texture, 194, 75, 62, 21, Margin(8, 8, 8, 8)); m_texMenu_Panel.Init(&m_Texture, 194, 130, 62, 32, Margin(8, 8, 8, 8)); m_texMenu_Panel_Border.Init(&m_Texture, 194, 97, 62, 32, Margin(24, 8, 8, 8)); m_texMenu_Hover.Init(&m_Texture, 219, 50, 24, 24, Margin(8, 8, 8, 8)); m_texShadow.Init(&m_Texture, 223, 0, 32, 32, Margin(8, 8, 8, 8)); m_texTextBox.Init(&m_Texture, 0, 122, 24, 24, Margin(8, 8, 8, 8)); m_texTextBox_Focus.Init(&m_Texture, 25, 122, 24, 24, Margin(8, 8, 8, 8)); m_texTab.Init(&m_Texture, 0, 97, 24, 24, Margin(8, 8, 8, 8)); m_texTab_Inactive.Init(&m_Texture, 25, 97, 24, 24, Margin(8, 8, 8, 8)); m_texTab_Control.Init(&m_Texture, 50, 97, 24, 24, Margin(8, 8, 8, 8)); m_texTab_Gap.Init(&m_Texture, 50 + 8, 97 + 8, 8, 8, Margin(8, 8, 8, 8)); m_texTabBar.Init(&m_Texture, 0, 147, 74, 16, Margin(4, 4, 4, 4)); m_texWindow.Init(&m_Texture, 0, 0, 96, 96, Margin(16, 32, 16, 16)); m_texWindow_Inactive.Init(&m_Texture, 97, 0, 96, 96, Margin(16, 32, 16, 16)); m_Checkbox.Init(&m_Texture, 75, 97, 16, 16); m_Checkbox_Checked.Init(&m_Texture, 93, 97, 16, 16); m_RadioButton.Init(&m_Texture, 110, 97, 16, 16); m_RadioButton_Checked.Init(&m_Texture, 127, 97, 16, 16); m_CheckMark.Init(&m_Texture, 145, 97, 16, 16); m_TreeMinus.Init(&m_Texture, 75, 115, 11, 11); m_TreePlus.Init(&m_Texture, 93, 115, 11, 11); m_texTreeBG.Init(&m_Texture, 0, 164, 49, 49, Margin(16, 16, 16, 16)); } virtual void DrawButton(Gwen::Controls::Base* control, bool bDepressed, bool bHovered) { if (bDepressed) m_texButton_Pressed.Draw(GetRender(), control->GetRenderBounds()); else m_texButton.Draw(GetRender(), control->GetRenderBounds()); if (bHovered) m_texButton_Hovered.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawMenuItem(Gwen::Controls::Base* control, bool bSubmenuOpen, bool bChecked) { if (bSubmenuOpen || control->IsHovered()) m_texMenu_Hover.Draw(GetRender(), control->GetRenderBounds()); if (bChecked) m_CheckMark.Draw(GetRender(), Gwen::Rect(control->GetRenderBounds().x + 2, control->GetRenderBounds().y + 2, 16, 16)); } virtual void DrawMenuStrip(Gwen::Controls::Base* control) { m_texMenu_Strip.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawMenu(Gwen::Controls::Base* control, bool bPaddingDisabled) { if (!bPaddingDisabled) { return m_texMenu_Panel_Border.Draw(GetRender(), control->GetRenderBounds()); } m_texMenu_Panel.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawShadow(Gwen::Controls::Base* control) { Gwen::Rect r = control->GetRenderBounds(); r.x -= 8; r.y -= 8; r.w += 16; r.h += 16; // m_texShadow.Draw( r ); } virtual void DrawRadioButton(Gwen::Controls::Base* control, bool bSelected, bool bDepressed) { if (bSelected) m_RadioButton_Checked.Draw(GetRender(), control->GetRenderBounds()); else m_RadioButton.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawCheckBox(Gwen::Controls::Base* control, bool bSelected, bool bDepressed) { if (bSelected) m_Checkbox_Checked.Draw(GetRender(), control->GetRenderBounds()); else m_Checkbox.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawGroupBox(Gwen::Controls::Base* control, int textStart, int textHeight, int textWidth) { Gwen::Rect rect = control->GetRenderBounds(); rect.y += textHeight * 0.5f; rect.h -= textHeight * 0.5f; Gwen::Color m_colDarker = Gwen::Color(0, 50, 60, 50); Gwen::Color m_colLighter = Gwen::Color(255, 255, 255, 150); GetRender()->SetDrawColor(m_colLighter); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1, rect.y + 1, textStart - 3, 1)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1 + textStart + textWidth, rect.y + 1, rect.w - textStart + textWidth - 2, 1)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1, (rect.y + rect.h) - 1, rect.x + rect.w - 2, 1)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1, rect.y + 1, 1, rect.h)); GetRender()->DrawFilledRect(Gwen::Rect((rect.x + rect.w) - 2, rect.y + 1, 1, rect.h - 1)); GetRender()->SetDrawColor(m_colDarker); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1, rect.y, textStart - 3, 1)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1 + textStart + textWidth, rect.y, rect.w - textStart - textWidth - 2, 1)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + 1, (rect.y + rect.h) - 1, rect.x + rect.w - 2, 1)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x, rect.y + 1, 1, rect.h - 1)); GetRender()->DrawFilledRect(Gwen::Rect((rect.x + rect.w) - 1, rect.y + 1, 1, rect.h - 1)); } virtual void DrawTextBox(Gwen::Controls::Base* control) { Gwen::Rect rect = control->GetRenderBounds(); bool bHasFocus = control->HasFocus(); if (bHasFocus) m_texTextBox_Focus.Draw(GetRender(), control->GetRenderBounds()); else m_texTextBox.Draw(GetRender(), control->GetRenderBounds()); //I dunno what this is for yet /* if ( CursorRect.w == 1 ) { if ( bHasFocus ) { GetRender()->SetDrawColor( Gwen::Color( 0, 0, 0, 200 ) ); GetRender()->DrawFilledRect( CursorRect ); } } else { if ( bHasFocus ) { GetRender()->SetDrawColor( Gwen::Color( 50, 150, 255, 250 ) ); GetRender()->DrawFilledRect( CursorRect ); } } */ } virtual void DrawTabButton(Gwen::Controls::Base* control, bool bActive) { if (bActive) m_texTab.Draw(GetRender(), control->GetRenderBounds()); else m_texTab_Inactive.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawTabControl(Gwen::Controls::Base* control, Gwen::Rect CurrentButtonRect) { m_texTab_Control.Draw(GetRender(), control->GetRenderBounds()); if (CurrentButtonRect.w > 0 && CurrentButtonRect.h > 0) m_texTab_Gap.Draw(GetRender(), CurrentButtonRect); } virtual void DrawTabTitleBar(Gwen::Controls::Base* control) { m_texTabBar.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawWindow(Gwen::Controls::Base* control, int topHeight, bool inFocus) { Gwen::Rect rect = control->GetRenderBounds(); if (inFocus) m_texWindow.Draw(GetRender(), control->GetRenderBounds()); else m_texWindow_Inactive.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawHighlight(Gwen::Controls::Base* control) { Gwen::Rect rect = control->GetRenderBounds(); GetRender()->SetDrawColor(Gwen::Color(255, 100, 255, 255)); GetRender()->DrawFilledRect(rect); } virtual void DrawScrollBar(Gwen::Controls::Base* control, bool isHorizontal, bool bDepressed) { Gwen::Rect rect = control->GetRenderBounds(); if (bDepressed) GetRender()->SetDrawColor(m_colControlDarker); else GetRender()->SetDrawColor(m_colControlBright); GetRender()->DrawFilledRect(rect); } virtual void DrawScrollBarBar(Controls::Base* control, bool bDepressed, bool isHovered, bool isHorizontal) { //TODO: something specialized DrawButton(control, bDepressed, isHovered); } virtual void DrawProgressBar(Gwen::Controls::Base* control, bool isHorizontal, float progress) { Gwen::Rect rect = control->GetRenderBounds(); Gwen::Color FillColour(0, 211, 40, 255); if (isHorizontal) { //Background GetRender()->SetDrawColor(m_colControlDark); GetRender()->DrawFilledRect(Gwen::Rect(1, 1, rect.w - 2, rect.h - 2)); //Right half GetRender()->SetDrawColor(FillColour); GetRender()->DrawFilledRect(Gwen::Rect(1, 1, rect.w * progress - 2, rect.h - 2)); GetRender()->SetDrawColor(Gwen::Color(255, 255, 255, 150)); GetRender()->DrawFilledRect(Gwen::Rect(1, 1, rect.w - 2, rect.h * 0.45f)); } else { //Background GetRender()->SetDrawColor(m_colControlDark); GetRender()->DrawFilledRect(Gwen::Rect(1, 1, rect.w - 2, rect.h - 2)); //Top half GetRender()->SetDrawColor(FillColour); GetRender()->DrawFilledRect(Gwen::Rect(1, 1 + (rect.h * (1 - progress)), rect.w - 2, rect.h * progress - 2)); GetRender()->SetDrawColor(Gwen::Color(255, 255, 255, 150)); GetRender()->DrawFilledRect(Gwen::Rect(1, 1, rect.w * 0.45f, rect.h - 2)); } GetRender()->SetDrawColor(Gwen::Color(255, 255, 255, 150)); GetRender()->DrawShavedCornerRect(Gwen::Rect(1, 1, rect.w - 2, rect.h - 2)); GetRender()->SetDrawColor(Gwen::Color(255, 255, 255, 70)); GetRender()->DrawShavedCornerRect(Gwen::Rect(2, 2, rect.w - 4, rect.h - 4)); GetRender()->SetDrawColor(m_colBorderColor); GetRender()->DrawShavedCornerRect(rect); } virtual void DrawListBox(Gwen::Controls::Base* control) { Gwen::Rect rect = control->GetRenderBounds(); GetRender()->SetDrawColor(m_colControlBright); GetRender()->DrawFilledRect(rect); GetRender()->SetDrawColor(m_colBorderColor); GetRender()->DrawLinedRect(rect); } virtual void DrawListBoxLine(Gwen::Controls::Base* control, bool bSelected) { Gwen::Rect rect = control->GetRenderBounds(); if (bSelected) { GetRender()->SetDrawColor(m_colHighlightBorder); GetRender()->DrawFilledRect(rect); } else if (control->IsHovered()) { GetRender()->SetDrawColor(m_colHighlightBG); GetRender()->DrawFilledRect(rect); } } virtual void DrawSlider(Gwen::Controls::Base* control, bool bIsHorizontal, int numNotches, int barSize) { Gwen::Rect rect = control->GetRenderBounds(); Gwen::Rect notchRect = rect; if (bIsHorizontal) { rect.y += rect.h * 0.4; rect.h -= rect.h * 0.8; } else { rect.x += rect.w * 0.4; rect.w -= rect.w * 0.8; } GetRender()->SetDrawColor(m_colBGDark); GetRender()->DrawFilledRect(rect); GetRender()->SetDrawColor(m_colControlDarker); GetRender()->DrawLinedRect(rect); } virtual void DrawComboBox(Gwen::Controls::Base* control) { DrawTextBox(control); } virtual void DrawKeyboardHighlight(Gwen::Controls::Base* control, const Gwen::Rect& r, int iOffset) { Gwen::Rect rect = r; rect.x += iOffset; rect.y += iOffset; rect.w -= iOffset * 2; rect.h -= iOffset * 2; //draw the top and bottom bool skip = true; for (int i = 0; i < rect.w * 0.5; i++) { m_Render->SetDrawColor(Gwen::Color(0, 0, 0, 255)); if (!skip) { GetRender()->DrawPixel(rect.x + (i * 2), rect.y); GetRender()->DrawPixel(rect.x + (i * 2), rect.y + rect.h - 1); } else skip = !skip; } skip = false; for (int i = 0; i < rect.h * 0.5; i++) { GetRender()->SetDrawColor(Gwen::Color(0, 0, 0, 255)); if (!skip) { GetRender()->DrawPixel(rect.x, rect.y + i * 2); GetRender()->DrawPixel(rect.x + rect.w - 1, rect.y + i * 2); } else skip = !skip; } } virtual void DrawToolTip(Gwen::Controls::Base* control) { Gwen::Rect rct = control->GetRenderBounds(); rct.x -= 3; rct.y -= 3; rct.w += 6; rct.h += 6; GetRender()->SetDrawColor(m_colToolTipBackground); GetRender()->DrawFilledRect(rct); GetRender()->SetDrawColor(m_colToolTipBorder); GetRender()->DrawLinedRect(rct); } virtual void DrawScrollButton(Gwen::Controls::Base* control, int iDirection, bool bDepressed) { DrawButton(control, bDepressed, false); m_Render->SetDrawColor(Gwen::Color(0, 0, 0, 240)); Gwen::Rect r(control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5); if (iDirection == Gwen::Pos::Top) DrawArrowUp(r); else if (iDirection == Gwen::Pos::Bottom) DrawArrowDown(r); else if (iDirection == Gwen::Pos::Left) DrawArrowLeft(r); else DrawArrowRight(r); } virtual void DrawComboBoxButton(Gwen::Controls::Base* control, bool bDepressed) { m_Render->SetDrawColor(Gwen::Color(0, 0, 0, 240)); Gwen::Rect r(control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5); DrawArrowDown(r); } virtual void DrawNumericUpDownButton(Gwen::Controls::Base* control, bool bDepressed, bool bUp) { // DrawButton( control->Width(), control->Height(), bDepressed, false, true ); m_Render->SetDrawColor(Gwen::Color(0, 0, 0, 240)); Gwen::Rect r(control->Width() / 2 - 2, control->Height() / 2 - 2, 5, 5); if (bUp) DrawArrowUp(r); else DrawArrowDown(r); } virtual void DrawStatusBar(Controls::Base* control) { DrawBackground(control); } virtual void DrawBackground(Gwen::Controls::Base* control) { Gwen::Rect rect = control->GetRenderBounds(); m_Render->SetDrawColor(m_colBGDark); m_Render->DrawFilledRect(rect); m_Render->SetDrawColor(m_colControlDarker); m_Render->DrawLinedRect(rect); } virtual void DrawTreeButton(Controls::Base* control, bool bOpen) { Gwen::Rect rect = control->GetRenderBounds(); rect.x += 2; rect.y += 2; rect.w -= 2; rect.h -= 2; if (bOpen) { m_TreeMinus.Draw(GetRender(), rect); } else m_TreePlus.Draw(GetRender(), rect); } virtual void DrawTreeControl(Controls::Base* control) { m_texTreeBG.Draw(GetRender(), control->GetRenderBounds()); } virtual void DrawPropertyRow(Controls::Base* control, int iWidth, bool bBeingEdited) { Gwen::Rect rect = control->GetRenderBounds(); if (bBeingEdited) { GetRender()->SetDrawColor(m_colHighlightBG); GetRender()->DrawFilledRect(Gwen::Rect(0, rect.y, iWidth, rect.h)); } GetRender()->SetDrawColor(m_colControlOutlineLighter); GetRender()->DrawFilledRect(Gwen::Rect(iWidth, rect.y, 1, rect.h)); rect.y += rect.h - 1; rect.h = 1; GetRender()->DrawFilledRect(rect); } virtual void DrawPropertyTreeNode(Controls::Base* control, int BorderLeft, int BorderTop) { Gwen::Rect rect = control->GetRenderBounds(); GetRender()->SetDrawColor(m_colControlOutlineLighter); GetRender()->DrawFilledRect(Gwen::Rect(rect.x, rect.y, BorderLeft, rect.h)); GetRender()->DrawFilledRect(Gwen::Rect(rect.x + BorderLeft, rect.y, rect.w - BorderLeft, BorderTop)); } void DrawTreeNode(Controls::Base* ctrl, bool bOpen, bool bSelected, int iLabelHeight, int iLabelWidth, int iHalfWay, int iLastBranch, bool bIsRoot) { if (bSelected) { GetRender()->SetDrawColor(Color(0, 150, 255, 100)); GetRender()->DrawFilledRect(Gwen::Rect(17, 0, iLabelWidth + 2, iLabelHeight - 1)); GetRender()->SetDrawColor(Color(0, 150, 255, 200)); GetRender()->DrawLinedRect(Gwen::Rect(17, 0, iLabelWidth + 2, iLabelHeight - 1)); } GetRender()->SetDrawColor(Color(0, 0, 0, 50)); if (!bIsRoot) GetRender()->DrawFilledRect(Gwen::Rect(9, iHalfWay, 16 - 9, 1)); if (!bOpen) return; GetRender()->DrawFilledRect(Gwen::Rect(14 + 8, iLabelHeight, 1, iLastBranch + iHalfWay - iLabelHeight)); } void DrawColorDisplay(Controls::Base* control, Gwen::Color color) { Gwen::Rect rect = control->GetRenderBounds(); if (color.a != 255) { GetRender()->SetDrawColor(Gwen::Color(255, 255, 255, 255)); GetRender()->DrawFilledRect(rect); GetRender()->SetDrawColor(Gwen::Color(128, 128, 128, 128)); GetRender()->DrawFilledRect(Gwen::Rect(0, 0, rect.w * 0.5, rect.h * 0.5)); GetRender()->DrawFilledRect(Gwen::Rect(rect.w * 0.5, rect.h * 0.5, rect.w * 0.5, rect.h * 0.5)); } GetRender()->SetDrawColor(color); GetRender()->DrawFilledRect(rect); GetRender()->SetDrawColor(Gwen::Color(0, 0, 0, 255)); GetRender()->DrawLinedRect(rect); } virtual void DrawModalControl(Controls::Base* control) { if (control->ShouldDrawBackground()) { Gwen::Rect rect = control->GetRenderBounds(); GetRender()->SetDrawColor(m_colModal); GetRender()->DrawFilledRect(rect); } } virtual void DrawMenuDivider(Controls::Base* control) { Gwen::Rect rect = control->GetRenderBounds(); GetRender()->SetDrawColor(m_colBGDark); GetRender()->DrawFilledRect(rect); GetRender()->SetDrawColor(m_colControlDarker); GetRender()->DrawLinedRect(rect); } }; } // namespace Skin } // namespace Gwen #endif