Skip to content

Commit

Permalink
#6 Update key event for TreeControl & ListBox
Browse files Browse the repository at this point in the history
  • Loading branch information
ducphamhong committed Nov 20, 2020
1 parent 799b3c3 commit a8beba7
Show file tree
Hide file tree
Showing 8 changed files with 339 additions and 1 deletion.
166 changes: 166 additions & 0 deletions Projects/Editor/Source/GUI/Controls/CListBox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,172 @@ namespace Skylicht
}
}
}

bool CListBox::onKeyUp(bool down)
{
if (down)
{
CListRowItem *lastItem = NULL;
for (CBase *child : m_innerPanel->Children)
{
CListRowItem *item = dynamic_cast<CListRowItem*>(child);
if (item != NULL)
{
if (item->getToggle() == true)
{
if (lastItem != NULL && !lastItem->isDisabled())
{
if (OnSelected != nullptr)
OnSelected(lastItem);

if (OnSelectChange != nullptr)
OnSelectChange(lastItem);

lastItem->setToggle(true);
item->setToggle(false);

scrollToItem(lastItem);
return true;
}
else
{
return true;
}
}
}
lastItem = item;
}
}

return true;
}

bool CListBox::onKeyDown(bool down)
{
if (down)
{
CListRowItem *lastItem = NULL;
for (CBase *child : m_innerPanel->Children)
{
CListRowItem *item = dynamic_cast<CListRowItem*>(child);
if (item != NULL)
{
if (lastItem != NULL && !item->isDisabled())
{
if (OnSelected != nullptr)
OnSelected(item);

if (OnSelectChange != nullptr)
OnSelectChange(item);

item->setToggle(true);
lastItem->setToggle(false);

scrollToItem(item);
return true;
}
else if (item->getToggle() == true)
{
lastItem = item;
}
}
}
}
return true;
}

bool CListBox::onKeyHome(bool down)
{
if (down)
{
CListRowItem *firstItem = NULL;
CListRowItem *currentSelectItem = NULL;

for (CBase *child : m_innerPanel->Children)
{
CListRowItem *item = dynamic_cast<CListRowItem*>(child);
if (item != NULL)
{
if (firstItem == NULL && !item->isDisabled())
firstItem = item;

if (item->getToggle() == true)
{
currentSelectItem = item;
break;
}
}
}

if (currentSelectItem != NULL &&
firstItem != NULL &&
currentSelectItem != firstItem)
{
if (OnSelected != nullptr)
OnSelected(firstItem);

if (OnSelectChange != nullptr)
OnSelectChange(firstItem);

firstItem->setToggle(true);
currentSelectItem->setToggle(false);

scrollToItem(firstItem);
}
}
return true;
}

bool CListBox::onKeyEnd(bool down)
{
if (down)
{
CListRowItem *lastItem = NULL;
CListRowItem *currentSelectItem = NULL;

for (CBase *child : m_innerPanel->Children)
{
CListRowItem *item = dynamic_cast<CListRowItem*>(child);
if (item != NULL)
{
if (item->getToggle() == true)
{
currentSelectItem = item;
break;
}
}
}

List::reverse_iterator i = m_innerPanel->Children.rbegin(), end = m_innerPanel->Children.rend();
while (i != end)
{
CListRowItem *item = dynamic_cast<CListRowItem*>(*i);
if (item != NULL && !item->isDisabled())
{
lastItem = item;
break;
}
++i;
}

if (currentSelectItem != NULL &&
lastItem != NULL &&
currentSelectItem != lastItem)
{
if (OnSelected != nullptr)
OnSelected(lastItem);

if (OnSelectChange != nullptr)
OnSelectChange(lastItem);

lastItem->setToggle(true);
currentSelectItem->setToggle(false);

scrollToItem(lastItem);
}
}
return true;
}
}
}
}
10 changes: 9 additions & 1 deletion Projects/Editor/Source/GUI/Controls/CListBox.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,15 @@ namespace Skylicht

CListRowItem* getItemByTagValue(int value);

void unSelectAll();
void unSelectAll();

virtual bool onKeyUp(bool down);

virtual bool onKeyDown(bool down);

virtual bool onKeyHome(bool down);

virtual bool onKeyEnd(bool down);

public:

Expand Down
16 changes: 16 additions & 0 deletions Projects/Editor/Source/GUI/Controls/CScrollControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,22 @@ namespace Skylicht
invalidate();
}

void CScrollControl::scrollToItem(CBase *item)
{
SPoint p = canvasPosToLocal(item->localPosToCanvas());

if (p.Y < 0)
{
scrollVerticalOffset(p.Y);
}
else if (p.Y + item->height() > height())
{
scrollVerticalOffset(p.Y + item->height() - height());
}

updateScrollBar();
}

void CScrollControl::showScrollBar(bool h, bool v)
{
m_vertical->setHidden(!v);
Expand Down
2 changes: 2 additions & 0 deletions Projects/Editor/Source/GUI/Controls/CScrollControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ namespace Skylicht

virtual void onScrollBarH(CBase *base);

void scrollToItem(CBase *item);

void showScrollBar(bool h, bool v);

void enableScroll(bool h, bool v);
Expand Down
60 changes: 60 additions & 0 deletions Projects/Editor/Source/GUI/Controls/CTreeControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,66 @@ namespace Skylicht
}
}
}

bool CTreeControl::onKeyUp(bool down)
{
return true;
}

bool CTreeControl::onKeyDown(bool down)
{
return true;
}

bool CTreeControl::onKeyHome(bool down)
{
if (down)
{
for (CBase *c : m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
if (node && !node->isDisabled())
{
deselectAll();
node->setSelected(true);
m_scrollControl->scrollToItem(node->getTextItem());
return true;
}
}
}

return true;
}

bool CTreeControl::onKeyEnd(bool down)
{
if (down)
{
List::reverse_iterator i = m_innerPanel->Children.rbegin(), end = m_innerPanel->Children.rend();

while (i != end)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(*i);
if (node && !node->isDisabled())
{
CTreeNode *child = node->selectLastChild();
if (child != NULL)
{
m_scrollControl->scrollToItem(child->getTextItem());
}
else
{
deselectAll();
node->setSelected(true);
m_scrollControl->scrollToItem(node->getTextItem());
}
return true;
}
++i;
}
}
return true;
}
}
}
}
8 changes: 8 additions & 0 deletions Projects/Editor/Source/GUI/Controls/CTreeControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,14 @@ namespace Skylicht
virtual void onNodeClick(CBase *base);

virtual void deselectAll();

virtual bool onKeyUp(bool down);

virtual bool onKeyDown(bool down);

virtual bool onKeyHome(bool down);

virtual bool onKeyEnd(bool down);
};
}
}
Expand Down
64 changes: 64 additions & 0 deletions Projects/Editor/Source/GUI/Controls/CTreeNode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,70 @@ namespace Skylicht

}

CTreeNode* CTreeNode::selectFirstChild()
{
if (m_expand == false)
return NULL;

if (m_innerPanel->Children.size() == 0)
return NULL;

for (CBase *c : m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
if (node && !node->isDisabled())
{
CTreeNode *child = node->selectFirstChild();

if (child == NULL)
{
m_root->deselectAll();
node->setSelected(true);
return node;
}
else
{
return child;
}
}
}

return NULL;
}

CTreeNode* CTreeNode::selectLastChild()
{
if (m_expand == false)
return NULL;

if (m_innerPanel->Children.size() == 0)
return NULL;

List::reverse_iterator i = m_innerPanel->Children.rbegin(), end = m_innerPanel->Children.rend();
while (i != end)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(*i);
if (node && !node->isDisabled())
{
CTreeNode *child = node->selectLastChild();

if (child == NULL)
{
m_root->deselectAll();
node->setSelected(true);
return node;
}
else
{
return child;
}
}
++i;
}

return NULL;
}

void CTreeNode::setSelected(bool b)
{
if (m_selected == b)
Expand Down
Loading

0 comments on commit a8beba7

Please sign in to comment.