Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/gui/CList.cpp
Show All 39 Lines | CList::CList() | ||||
AddSetting(GUIST_CStrW, "sound_selected"); | AddSetting(GUIST_CStrW, "sound_selected"); | ||||
AddSetting(GUIST_CGUISpriteInstance, "sprite"); | AddSetting(GUIST_CGUISpriteInstance, "sprite"); | ||||
AddSetting(GUIST_CGUISpriteInstance, "sprite_selectarea"); | AddSetting(GUIST_CGUISpriteInstance, "sprite_selectarea"); | ||||
AddSetting(GUIST_int, "cell_id"); | AddSetting(GUIST_int, "cell_id"); | ||||
AddSetting(GUIST_EAlign, "text_align"); | AddSetting(GUIST_EAlign, "text_align"); | ||||
AddSetting(GUIST_CColor, "textcolor"); | AddSetting(GUIST_CColor, "textcolor"); | ||||
AddSetting(GUIST_CColor, "textcolor_selected"); | AddSetting(GUIST_CColor, "textcolor_selected"); | ||||
AddSetting(GUIST_int, "selected"); // Index selected. -1 is none. | AddSetting(GUIST_int, "selected"); // Index selected. -1 is none. | ||||
AddSetting(GUIST_int, "hovered"); | |||||
AddSetting(GUIST_CStrW, "tooltip"); | AddSetting(GUIST_CStrW, "tooltip"); | ||||
AddSetting(GUIST_CStr, "tooltip_style"); | AddSetting(GUIST_CStr, "tooltip_style"); | ||||
// Each list item has both a name (in 'list') and an associated data string (in 'list_data') | // Each list item has both a name (in 'list') and an associated data string (in 'list_data') | ||||
AddSetting(GUIST_CGUIList, "list"); | AddSetting(GUIST_CGUIList, "list"); | ||||
AddSetting(GUIST_CGUIList, "list_data"); // TODO: this should be a list of raw strings, not of CGUIStrings | AddSetting(GUIST_CGUIList, "list_data"); // TODO: this should be a list of raw strings, not of CGUIStrings | ||||
GUI<bool>::SetSetting(this, "scrollbar", false); | GUI<bool>::SetSetting(this, "scrollbar", false); | ||||
// Nothing is selected as default. | |||||
GUI<int>::SetSetting(this, "selected", -1); | GUI<int>::SetSetting(this, "selected", -1); | ||||
GUI<int>::SetSetting(this, "hovered", -1); | |||||
// Add scroll-bar | // Add scroll-bar | ||||
CGUIScrollBarVertical* bar = new CGUIScrollBarVertical(); | CGUIScrollBarVertical* bar = new CGUIScrollBarVertical(); | ||||
bar->SetRightAligned(true); | bar->SetRightAligned(true); | ||||
AddScrollBar(bar); | AddScrollBar(bar); | ||||
} | } | ||||
CList::~CList() | CList::~CList() | ||||
▲ Show 20 Lines • Show All 123 Lines • ▼ Show 20 Lines | case GUIM_MOUSE_PRESS_LEFT: | ||||
if (!enabled) | if (!enabled) | ||||
{ | { | ||||
CStrW soundPath; | CStrW soundPath; | ||||
if (g_SoundManager && GUI<CStrW>::GetSetting(this, "sound_disabled", soundPath) == PSRETURN_OK && !soundPath.empty()) | if (g_SoundManager && GUI<CStrW>::GetSetting(this, "sound_disabled", soundPath) == PSRETURN_OK && !soundPath.empty()) | ||||
g_SoundManager->PlayAsUI(soundPath.c_str(), false); | g_SoundManager->PlayAsUI(soundPath.c_str(), false); | ||||
break; | break; | ||||
} | } | ||||
bool scrollbar; | int hovered = GetHoveredItem(); | ||||
CGUIList* pList; | if (hovered == -1) | ||||
GUI<bool>::GetSetting(this, "scrollbar", scrollbar); | break; | ||||
GUI<CGUIList>::GetSettingPointer(this, "list", pList); | GUI<int>::SetSetting(this, "selected", hovered); | ||||
float scroll = 0.f; | |||||
if (scrollbar) | |||||
scroll = GetScrollBar(0).GetPos(); | |||||
CRect rect = GetListRect(); | |||||
CPos mouse = GetMousePos(); | |||||
mouse.y += scroll; | |||||
int set = -1; | |||||
for (int i = 0; i < (int)pList->m_Items.size(); ++i) | |||||
{ | |||||
if (mouse.y >= rect.top + m_ItemsYPositions[i] && | |||||
mouse.y < rect.top + m_ItemsYPositions[i+1] && | |||||
// mouse is not over scroll-bar | |||||
(!scrollbar || !GetScrollBar(0).IsVisible() || | |||||
mouse.x < GetScrollBar(0).GetOuterRect().left || | |||||
mouse.x > GetScrollBar(0).GetOuterRect().right)) | |||||
{ | |||||
set = i; | |||||
} | |||||
} | |||||
if (set != -1) | |||||
{ | |||||
GUI<int>::SetSetting(this, "selected", set); | |||||
UpdateAutoScroll(); | UpdateAutoScroll(); | ||||
CStrW soundPath; | CStrW soundPath; | ||||
if (g_SoundManager && GUI<CStrW>::GetSetting(this, "sound_selected", soundPath) == PSRETURN_OK && !soundPath.empty()) | if (g_SoundManager && GUI<CStrW>::GetSetting(this, "sound_selected", soundPath) == PSRETURN_OK && !soundPath.empty()) | ||||
g_SoundManager->PlayAsUI(soundPath.c_str(), false); | g_SoundManager->PlayAsUI(soundPath.c_str(), false); | ||||
if (timer_Time() - m_LastItemClickTime < SELECT_DBLCLICK_RATE && set == m_PrevSelectedItem) | if (timer_Time() - m_LastItemClickTime < SELECT_DBLCLICK_RATE && hovered == m_PrevSelectedItem) | ||||
this->SendEvent(GUIM_MOUSE_DBLCLICK_LEFT_ITEM, "mouseleftdoubleclickitem"); | this->SendEvent(GUIM_MOUSE_DBLCLICK_LEFT_ITEM, "mouseleftdoubleclickitem"); | ||||
m_LastItemClickTime = timer_Time(); | m_LastItemClickTime = timer_Time(); | ||||
m_PrevSelectedItem = set; | m_PrevSelectedItem = hovered; | ||||
break; | |||||
} | |||||
case GUIM_MOUSE_LEAVE: | |||||
{ | |||||
int hoveredSetting = -1; | |||||
GUI<int>::GetSetting(this, "hovered", hoveredSetting); | |||||
if (hoveredSetting == -1) | |||||
break; | |||||
GUI<int>::SetSetting(this, "hovered", -1); | |||||
ScriptEvent("hoverchange"); | |||||
break; | |||||
} | } | ||||
case GUIM_MOUSE_OVER: | |||||
{ | |||||
int hoveredSetting = -1; | |||||
GUI<int>::GetSetting(this, "hovered", hoveredSetting); | |||||
int hovered = GetHoveredItem(); | |||||
if (hovered == hoveredSetting) | |||||
break; | |||||
GUI<int>::SetSetting(this, "hovered", hovered); | |||||
ScriptEvent("hoverchange"); | |||||
break; | break; | ||||
} | } | ||||
case GUIM_LOAD: | case GUIM_LOAD: | ||||
{ | { | ||||
CStr scrollbar_style; | CStr scrollbar_style; | ||||
GUI<CStr>::GetSetting(this, "scrollbar_style", scrollbar_style); | GUI<CStr>::GetSetting(this, "scrollbar_style", scrollbar_style); | ||||
GetScrollBar(0).SetScrollBarStyle(scrollbar_style); | GetScrollBar(0).SetScrollBarStyle(scrollbar_style); | ||||
▲ Show 20 Lines • Show All 266 Lines • ▼ Show 20 Lines | return; // this means, if it wants to align both up and down at the same time | ||||
// this will have precedence. | // this will have precedence. | ||||
} | } | ||||
// Check lower boundary | // Check lower boundary | ||||
CRect rect = GetListRect(); | CRect rect = GetListRect(); | ||||
if (m_ItemsYPositions[selected+1]-rect.GetHeight() > scroll) | if (m_ItemsYPositions[selected+1]-rect.GetHeight() > scroll) | ||||
GetScrollBar(0).SetPos(m_ItemsYPositions[selected+1]-rect.GetHeight()); | GetScrollBar(0).SetPos(m_ItemsYPositions[selected+1]-rect.GetHeight()); | ||||
} | } | ||||
int CList::GetHoveredItem() | |||||
{ | |||||
bool scrollbar; | |||||
CGUIList* pList; | |||||
GUI<bool>::GetSetting(this, "scrollbar", scrollbar); | |||||
GUI<CGUIList>::GetSettingPointer(this, "list", pList); | |||||
float scroll = 0.f; | |||||
if (scrollbar) | |||||
scroll = GetScrollBar(0).GetPos(); | |||||
CRect rect = GetListRect(); | |||||
CPos mouse = GetMousePos(); | |||||
mouse.y += scroll; | |||||
// Mouse is over scrollbar | |||||
if (scrollbar && GetScrollBar(0).IsVisible() && | |||||
mouse.x >= GetScrollBar(0).GetOuterRect().left && | |||||
mouse.x <= GetScrollBar(0).GetOuterRect().right) | |||||
return -1; | |||||
for (size_t i = 0; i < pList->m_Items.size(); ++i) | |||||
if (mouse.y >= rect.top + m_ItemsYPositions[i] && | |||||
mouse.y < rect.top + m_ItemsYPositions[i + 1]) | |||||
return i; | |||||
return -1; | |||||
} |
Wildfire Games · Phabricator