PanelList cpp: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
Thunder4ik (talk | contribs) m (→top: clean up, added uncategorised, deadend tags) |
||
Line 1: | Line 1: | ||
{{Dead end|date=January 2024}} | |||
<pre> | <pre> | ||
/////////// Copyright © 2007, Mark Chandler. All rights reserved. /////////// | /////////// Copyright © 2007, Mark Chandler. All rights reserved. /////////// | ||
Line 8: | Line 9: | ||
// | // | ||
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||
#include "cbase.h" | #include "cbase.h" | ||
Line 55: | Line 55: | ||
} | } | ||
int PD_PanelList::AddPanel( Panel* pPanel, bool isSelectable) | int PD_PanelList::AddPanel( Panel* pPanel, bool isSelectable) | ||
Line 61: | Line 60: | ||
return AddPanel(pPanel, NULL, isSelectable); | return AddPanel(pPanel, NULL, isSelectable); | ||
} | } | ||
int PD_PanelList::AddPanel( Panel* pPanel, char* header, bool isSelectable) | int PD_PanelList::AddPanel( Panel* pPanel, char* header, bool isSelectable) | ||
Line 78: | Line 76: | ||
} | } | ||
} | } | ||
int id = FindItemUsingIdent(pPanel->GetName()); | int id = FindItemUsingIdent(pPanel->GetName()); | ||
Line 84: | Line 81: | ||
if (id != -1) | if (id != -1) | ||
return -1; | return -1; | ||
pPanel->SetParent( this ); | pPanel->SetParent( this ); | ||
Line 103: | Line 99: | ||
ResetAllChildPos(); | ResetAllChildPos(); | ||
//Msg("Scroll bar range is: %d\n", range); | //Msg("Scroll bar range is: %d\n", range); | ||
Line 215: | Line 210: | ||
else | else | ||
tall = (count+1)*m_iMargen + heightCount + TITLEHIEGHT; | tall = (count+1)*m_iMargen + heightCount + TITLEHIEGHT; | ||
int ypos = y + m_iGroupMargen; | int ypos = y + m_iGroupMargen; | ||
Line 269: | Line 263: | ||
m_pScrollBar->SetRange(0, m_iMaxSliderVal); | m_pScrollBar->SetRange(0, m_iMaxSliderVal); | ||
} | } | ||
} | } | ||
void PD_PanelList::SetSelected( int index ) | void PD_PanelList::SetSelected( int index ) | ||
Line 299: | Line 291: | ||
updateSize(); | updateSize(); | ||
} | } | ||
void PD_PanelList::PurgeAll( void ) | void PD_PanelList::PurgeAll( void ) | ||
Line 324: | Line 315: | ||
} | } | ||
void PD_PanelList::OnSizeChanged(int newWide, int newTall) | void PD_PanelList::OnSizeChanged(int newWide, int newTall) | ||
Line 336: | Line 326: | ||
m_pScrollBar->SetRangeWindow(GetTall()-m_iMargen-m_iMargen); | m_pScrollBar->SetRangeWindow(GetTall()-m_iMargen-m_iMargen); | ||
ResetAllChildPos(); | ResetAllChildPos(); | ||
} | } | ||
void PD_PanelList::OnThink( void ) | void PD_PanelList::OnThink( void ) | ||
Line 464: | Line 452: | ||
InvalidateLayout(); | InvalidateLayout(); | ||
} | } | ||
void PD_PanelList::MoveBy( int amount, bool slider ) | void PD_PanelList::MoveBy( int amount, bool slider ) | ||
Line 555: | Line 540: | ||
return -1; | return -1; | ||
} | } | ||
int PD_PanelList::FindHeaderUsingIdent(const char *pszIdent) | int PD_PanelList::FindHeaderUsingIdent(const char *pszIdent) | ||
Line 623: | Line 607: | ||
{ | { | ||
} | } | ||
void PD_PanelList::OnMouseWheeled(int delta) | void PD_PanelList::OnMouseWheeled(int delta) | ||
Line 670: | Line 653: | ||
// Msg("Mouse clicked\n"); | // Msg("Mouse clicked\n"); | ||
//} | //} | ||
///////////////////////////////////////////////////////////////////////////////////////////////////// | ///////////////////////////////////////////////////////////////////////////////////////////////////// | ||
PD_HeaderPanel::PD_HeaderPanel(Panel *parent, const char *name) : PD_BasePanel(parent, name) | PD_HeaderPanel::PD_HeaderPanel(Panel *parent, const char *name) : PD_BasePanel(parent, name) | ||
{ | { | ||
m_pTitleBG = new vgui::ImagePanel(this, "TitleBG"); | m_pTitleBG = new vgui::ImagePanel(this, "TitleBG"); | ||
Line 689: | Line 669: | ||
m_pTitle = new vgui::Label(this, "TitleLabel", "[title]"); | m_pTitle = new vgui::Label(this, "TitleLabel", "[title]"); | ||
m_pTitle->SetMouseInputEnabled(false); | m_pTitle->SetMouseInputEnabled(false); | ||
m_bNeedsUpdate = true; | m_bNeedsUpdate = true; | ||
Line 728: | Line 707: | ||
} | } | ||
</pre> | </pre> | ||
{{Uncategorized|date=January 2024}} |
Latest revision as of 10:08, 21 January 2024

This article has no
links to other VDC articles. Please help improve this article by adding links
that are relevant to the context within the existing text.
January 2024


January 2024
/////////// Copyright © 2007, Mark Chandler. All rights reserved. /////////// // // Description: // // // Mark Chandler 2007 admin@lodle.net // //////////////////////////////////////////////////////////////////////////////// #include "cbase.h" #include "pd_panel_list.h" //////////////////////////////////////////////////////////////////////////////// // Constructor //////////////////////////////////////////////////////////////////////////////// PD_PanelList::PD_PanelList(Panel *parent, const char *name) : Panel(parent, name) { this->SetPaintBackgroundEnabled( false ); this->SetPaintBackgroundType( 0 ); this->SetPaintBorderEnabled(true); this->SetKeyBoardInputEnabled( true ); m_pScrollBar = new vgui::ScrollBar( this, "Scrollbar", true); m_pScrollBar->AddActionSignalTarget(this); m_pSelImage = new PD_BasePanel( this, "SelectImage"); m_iMargen = 5; m_iGroupMargen = 20; m_iSelected =-1; m_iHeight = 20; m_iMaxSliderVal = 0; m_pSelImage->SetVisible( false ); m_pSelImage->bgColor = new Color(50, 100, 255, 125) ; m_pSelImage->SetZPos(100); m_pSelImage->AddActionSignalTarget(this); updateSize(); m_bHeaderDisabled = false; m_bShowSelected = true; m_bFixedSize = true; m_bRejectSliderMove = false; m_bPaintBg = true; } //////////////////////////////////////////////////////////////////////////////// // Destructor //////////////////////////////////////////////////////////////////////////////// PD_PanelList::~PD_PanelList() { } int PD_PanelList::AddPanel( Panel* pPanel, bool isSelectable) { return AddPanel(pPanel, NULL, isSelectable); } int PD_PanelList::AddPanel( Panel* pPanel, char* header, bool isSelectable) { int headId = -1; if (header!=NULL) { headId = FindHeaderUsingIdent(header); if (headId == -1) //if header doesnt exsist make it { vgui::Panel* pPanel=new PD_HeaderPanel(this, header); pPanel->SetZPos(25); headId = m_pHeaderList.AddToTail(pPanel); } } int id = FindItemUsingIdent(pPanel->GetName()); if (id != -1) return -1; pPanel->SetParent( this ); pPanel->SetVisible(true); pPanel->SetPaintBackgroundEnabled( true ); pPanel->SetPaintBackgroundType( 0 ); pPanel->SetPaintBorderEnabled(true); pPanel->AddActionSignalTarget(this); pPanel->SetZPos(50); panelInfo* newPanel= new panelInfo; newPanel->iHeader = headId; newPanel->pPanel = pPanel; newPanel->isSelectable = isSelectable; int index = m_pPanelList.AddToTail( newPanel ); ResetAllChildPos(); //Msg("Scroll bar range is: %d\n", range); return index; } void PD_PanelList::ResetAllChildPos( ) { m_iSelected = 0; if (m_bHeaderDisabled) { int heightCount = 0; int iLastHeight=0; for(int i = 0; i < m_pPanelList.Count();i++) { vgui::Panel *pItem = m_pPanelList[i]->pPanel; int x,y; int tall=0; if (i <= 0) { if (m_bFixedSize) y=-1*(m_iHeight + m_iMargen); else y=-1*m_iMargen; } else { m_pPanelList[i-1]->pPanel->GetPos(x,y); } int ypos=y + m_iMargen +m_iMargen; if (m_bFixedSize) { ypos += m_iHeight; tall = m_iHeight; } else { ypos += iLastHeight; tall = m_pPanelList[i]->pPanel->GetTall(); iLastHeight = tall; heightCount += tall; } pItem->SetBounds(m_iMargen, ypos, GetWide()-m_iMargen-m_iMargen-m_pScrollBar->GetWide(), tall); } for(int i = 0; i < m_pHeaderList.Count();i++) { m_pHeaderList[i]->SetVisible(false); } if (m_bFixedSize) m_iMaxSliderVal = m_pPanelList.Count()*m_iHeight+m_pPanelList.Count()*m_iMargen+m_iMargen; else m_iMaxSliderVal = heightCount + m_pPanelList.Count()*m_iMargen + m_iMargen; m_pScrollBar->SetRange(0, m_iMaxSliderVal); } else { int maxGroups = m_pHeaderList.Count(); //Msg("maxGroups is %d\n", maxGroups); if (maxGroups==0) return; for (int i=0; i<maxGroups; i++) { //Msg("I is %d\n", i); int count=0; int heightCount=0; for (int j=0; j<m_pPanelList.Count(); j++ ) { //Msg("%d: [%d] == [%d]\n",j, m_pPanelList[j]->iHeader , i); if (m_pPanelList[j]->iHeader == i) { heightCount += m_pPanelList[j]->pPanel->GetTall(); count++; } } //Msg("I is %d, Count is %d\n", i, count); int x,y; if (i <= 0) { x=0; y=-1*m_iGroupMargen + m_iMargen; } else { m_pHeaderList[i-1]->GetPos(x,y); y += m_pHeaderList[i-1]->GetTall(); } //Msg("I is %d\n", i); int tall =0; if (m_bFixedSize) tall = (count+1)*m_iMargen + count*m_iHeight + TITLEHIEGHT; else tall = (count+1)*m_iMargen + heightCount + TITLEHIEGHT; int ypos = y + m_iGroupMargen; if (m_pHeaderList[i]) { m_pHeaderList[i]->SetVisible(true); m_pHeaderList[i]->SetBounds(m_iMargen, ypos, GetWide()-(m_iMargen*2)-m_pScrollBar->GetWide(), tall); } int lastypos =0; int iLastHeight=0; if (m_bFixedSize) lastypos = ypos + -1*(m_iHeight) + TITLEHIEGHT; else lastypos = ypos + TITLEHIEGHT; for (int j=0; j<m_pPanelList.Count(); j++ ) { if (m_pPanelList[j]->iHeader == i) { vgui::Panel *pItem = m_pPanelList[j]->pPanel; int ypos = 0; if (m_bFixedSize) ypos = lastypos + m_iMargen + m_iHeight; else ypos = lastypos + m_iMargen + iLastHeight; lastypos = ypos; if (m_bFixedSize) pItem->SetBounds(m_iMargen*2, ypos, GetWide()-(m_iMargen*4)-m_pScrollBar->GetWide(), m_iHeight); else { iLastHeight = pItem->GetTall(); pItem->SetBounds(m_iMargen*2, ypos, GetWide()-(m_iMargen*4)-m_pScrollBar->GetWide(), iLastHeight); } } } } m_iMaxSliderVal = 0; for (int i=0; i<maxGroups; i++) { m_iMaxSliderVal+=m_pHeaderList[i]->GetTall(); } m_iMaxSliderVal+=m_iGroupMargen; m_pScrollBar->SetRange(0, m_iMaxSliderVal); } } void PD_PanelList::SetSelected( int index ) { if (index >= 0 && index < m_pPanelList.Count() && m_pPanelList[index]->isSelectable == true) m_iSelected = index; } void PD_PanelList::SetMargen( int amount ) { if (this->IsProportional()) m_iMargen = scheme()->GetProportionalScaledValue(amount); else m_iMargen = amount; updateSize(); } void PD_PanelList::SetHeight( int amount ) { if (this->IsProportional()) m_iHeight = scheme()->GetProportionalScaledValue(amount); else m_iHeight = amount; updateSize(); } void PD_PanelList::PurgeAll( void ) { for (int x=0; x<m_pPanelList.Count(); x++) { delete m_pPanelList[x]->pPanel; } //for (int x=0; x<m_pHeaderList.Count(); x++) //{ // delete m_pHeaderList[x]; //} m_pPanelList.PurgeAndDeleteElements(); m_pHeaderList.PurgeAndDeleteElements(); m_iSelected =-1; m_pScrollBar->SetRange(0,0); m_iMaxSliderVal = 0; } void PD_PanelList::Reset() { } void PD_PanelList::OnSizeChanged(int newWide, int newTall) { m_pScrollBar->SetBounds(newWide-m_pScrollBar->GetWide(), 0, m_pScrollBar->GetWide(), newTall); for(int i = 0; i < m_pPanelList.Count();i++) { m_pPanelList[i]->pPanel->SetWide(newWide-m_iMargen-m_iMargen-m_pScrollBar->GetWide()); } m_pScrollBar->SetRangeWindow(GetTall()-m_iMargen-m_iMargen); ResetAllChildPos(); } void PD_PanelList::OnThink( void ) { Update(); BaseClass::OnThink(); } void PD_PanelList::OnCommand(char* command) { //Msg("Panel List Command: %s\n", command); if (strcmp(command,"UpdatePos")==0) { ResetAllChildPos(); } else if ( GetVParent() ) { KeyValues *msg = new KeyValues("Command"); msg->SetString("command", command); PostActionSignal( msg ); }; } void PD_PanelList::OnRequestUpdate(const char* PanelName) { ResetAllChildPos(); //OnItemClicked( PanelName ); } void PD_PanelList::Update( void ) { if (!m_pPanelList.Count()) return; int range = m_pPanelList.Count()*m_iHeight+m_pPanelList.Count()*m_iMargen+m_iMargen; if (range < GetTall()) m_pScrollBar->SetEnabled( false ); else m_pScrollBar->SetEnabled(true); } void PD_PanelList::OnSliderMoved(int value) { if (m_bRejectSliderMove) { m_bRejectSliderMove=false; return; } //Msg("Moving to: %d [%d] [%d]\n", value, m_iMaxSliderVal, GetTall()); if (value < 0) value = 0; if (value > m_iMaxSliderVal) value = m_iMaxSliderVal; int x,y; if (m_bHeaderDisabled == true) m_pPanelList[0]->pPanel->GetPos(x, y); else m_pHeaderList[0]->GetPos(x, y); int ammount = -1*(value+(y-m_iMargen)); //stops an loop happning where moveby updates slider and makes it move again. m_bRejectSliderMove = true; MoveBy(ammount, true ); } void PD_PanelList::ResetSelected() { if (m_iSelected != -1 && m_bShowSelected) { int x,y; m_pPanelList[m_iSelected]->pPanel->GetPos(x,y); m_pSelImage->SetVisible( true ); int tall=m_iMargen+m_iMargen; if (m_bFixedSize) tall += m_iHeight; else tall += m_pPanelList[m_iSelected]->pPanel->GetTall(); m_pSelImage->SetBounds(m_iMargen, y-m_iMargen, GetWide()-m_pScrollBar->GetWide()-m_iMargen-m_iMargen, tall); } else { m_pSelImage->SetVisible( false ); } } void PD_PanelList::UpdateSelected() { // make sure selected is allways shown if (m_iSelected != -1) { int x,y; m_pPanelList[m_iSelected]->pPanel->GetPos(x,y); if (m_bFixedSize) { if (y+m_iHeight > GetTall()) MoveBy( -1 *((y+m_iHeight+m_iMargen) - GetTall())); } else { int tall = m_pPanelList[m_iSelected]->pPanel->GetTall(); //Msg("Im %d tall\n", tall); if (y+tall+m_iMargen > GetTall()) MoveBy( -1 *((y+tall+m_iMargen) - GetTall())); } if (y < 0) MoveBy( -y + m_iMargen ); } ResetSelected(); InvalidateLayout(); } void PD_PanelList::MoveBy( int amount, bool slider ) { int x,y; for (int i=0; i<m_pPanelList.Count(); i++) { m_pPanelList[i]->pPanel->GetPos(x, y); m_pPanelList[i]->pPanel->SetPos(x, y+amount); } for (int i=0; i<m_pHeaderList.Count(); i++) { m_pHeaderList[i]->GetPos(x, y); m_pHeaderList[i]->SetPos(x, y+amount); } if (!slider) { m_pPanelList[0]->pPanel->GetPos(x, y); m_pScrollBar->SetValue(abs(y-m_iMargen)); } ResetSelected(); InvalidateLayout(); } #define BORDERWIDTH 1 void PD_PanelList::Paint() { BaseClass::Paint(); PaintBorder(); } void PD_PanelList::PaintBackground() { if (!m_bPaintBg) return; int wide, tall; GetSize(wide, tall); vgui::surface()->DrawSetColor(Color(120,120,120,255)); vgui::surface()->DrawFilledRect(0, 0, wide, tall); } void PD_PanelList::PaintBorder() { int wide, tall; GetSize(wide, tall); int sw = m_pScrollBar->GetWide(); surface()->DrawSetColor( Color(0,200,255,255) ); ////draw top surface()->DrawFilledRect(BORDERWIDTH, 0, wide-sw, BORDERWIDTH); //draw bottom surface()->DrawFilledRect(BORDERWIDTH, tall-BORDERWIDTH, wide-sw, tall); //draw left surface()->DrawFilledRect(0, 0, BORDERWIDTH, tall); //draw right //surface()->DrawFilledRect(wide-BORDERWIDTH-BORDERINSTEP, captionHeight+1, wide-BORDERINSTEP, tall); } void PD_PanelList::updateSize( void ) { OnSizeChanged(GetWide(), GetTall()); } int PD_PanelList::FindItemUsingIdent(const char *pszIdent) { for(int i = 0; i < m_pPanelList.Count();i++) { vgui::Panel *pItem = m_pPanelList[i]->pPanel; if(pItem == NULL) continue; if(strcmp(pszIdent,pItem->GetName())==0) return i; //Msg("Comparing: [%s], [%s]\n", pszIdent,pItem->GetName()); } return -1; } int PD_PanelList::FindHeaderUsingIdent(const char *pszIdent) { for(int i = 0; i < m_pHeaderList.Count();i++) { vgui::Panel *pItem = m_pHeaderList[i]; //headerInfo* pItem = m_pHeaderList[i]; if(pItem == NULL) continue; if(strcmp(pszIdent,pItem->GetName())==0) return i; //Msg("Comparing: [%s], [%s]\n", pszIdent,pItem->GetName()); } return -1; } void PD_PanelList::PrintLoc() { for(int i = 0; i < m_pPanelList.Count();i++) { int x,y; m_pPanelList[i]->pPanel->GetPos(x,y); Msg("Panel %d, X:%d, Y:%d\n",i,x,y); } } void PD_PanelList::OnKeyCodeTyped(KeyCode code) { //Msg("KeyCode %d\n", code); if ( code == KEY_W || code == KEY_UP) { if (m_pPanelList.Count() > 0) { if (m_iSelected == -1) SetSelected(0); if (m_iSelected != 0) SetSelected(m_iSelected-1); } else { m_iSelected=-1; } UpdateSelected(); } else if ( code == KEY_S || code == KEY_DOWN) { if (m_pPanelList.Count() > 0) { if (m_iSelected < m_pPanelList.Count()-1) SetSelected(m_iSelected+1); } else { m_iSelected=-1; } UpdateSelected(); } //ShowSelected(); } void PD_PanelList::OnCursorMoved( int x, int y) { } void PD_PanelList::OnMouseWheeled(int delta) { delta*=-1; if (m_pPanelList.Count() > 0) { if (m_iSelected == -1) m_iSelected = 0; else if ((m_iSelected + delta) >= 0 && (m_iSelected +delta) < m_pPanelList.Count()) SetSelected(m_iSelected+delta); } else { m_iSelected=-1; } UpdateSelected(); } void PD_PanelList::OnSetSelected(const char* name) { OnItemClicked(name); } void PD_PanelList::OnItemClicked(const char* name) { int id = FindItemUsingIdent( name ); SetSelected(id); UpdateSelected(); } void PD_PanelList::OnItemDoubleClicked(const char* name) { //SetSelected(FindItemUsingIdent(name)); KeyValues *msg = new KeyValues("Command"); msg->SetString("command", "Select"); PostActionSignal( msg ); //PostActionSignal(new KeyValues("ItemDoubleClick","name", this->GetName())); } //void PD_PanelList::OnMouseDoublePressed(MouseCode code) //{ // Msg("Mouse clicked\n"); //} ///////////////////////////////////////////////////////////////////////////////////////////////////// PD_HeaderPanel::PD_HeaderPanel(Panel *parent, const char *name) : PD_BasePanel(parent, name) { m_pTitleBG = new vgui::ImagePanel(this, "TitleBG"); m_pTitleBG->SetFillColor(Color(255,255,0,255)); m_pTitleBG->SetShouldScaleImage( true ); m_pBodyBG = new vgui::ImagePanel(this, "BodyBG"); m_pBodyBG->SetFillColor(Color(255,0,255,0)); m_pBodyBG->SetVisible( false ); m_pTitle = new vgui::Label(this, "TitleLabel", "[title]"); m_pTitle->SetMouseInputEnabled(false); m_bNeedsUpdate = true; Q_strncpy(m_szTitle,"NULL NAME", 256); OnSizeChanged(GetWide(), GetTall()); } void PD_HeaderPanel::OnThink( void ) { if (m_bNeedsUpdate) { m_pTitleBG->SetImage( HEADERIMG ); m_pTitle->SetText(GetName()); //m_pTitle->SetFgColor(Color(0,0,0,255)); m_bNeedsUpdate = false; } } void PD_HeaderPanel::PaintBackground() { return; //int wide, tall; //GetSize(wide, tall); //vgui::surface()->DrawSetColor(Color(120,120,120,255)); //vgui::surface()->DrawFilledRect(0, 0, wide, tall); } void PD_HeaderPanel::OnSizeChanged(int newWide, int newTall) { m_pTitle->SetBounds( 10, 0, newWide, TITLEHIEGHT); m_pTitleBG->SetBounds(0,0,newWide, TITLEHIEGHT); m_pBodyBG->SetBounds(0,TITLEHIEGHT,newWide, newTall-TITLEHIEGHT); }

This article has not been added to any content
categories. Please help out by
adding categories.
January 2024


January 2024