Closed ujjwall-R closed 7 months ago
#include <ncurses.h>
#include <bits/stdc++.h>
class DreeNode
{
public:
std::string name;
std::vector<DreeNode *> children;
DreeNode(std::string str) { name = str; }
};
class DreeNavigate
{
public:
void dfs(DreeNode *node, long long depth, long long currentDepth, bool isLastChild, long long mask);
void navigateTree(DreeNode *root);
void printTree(DreeNode *root, long long depth);
private:
long long selectedDepth;
};
void DreeNavigate::dfs(DreeNode *node, long long depth, long long currentDepth, bool isLastChild, long long mask)
{
for (long long i = 0; i < currentDepth; i++)
{
if (((mask >> i) & 1ll) == 0ll)
addch(ACS_VLINE); // '│'
else
printw(" ");
}
if (isLastChild)
addch(ACS_LLCORNER); // '└'
else
addch(ACS_LTEE); // '├'
addch(ACS_HLINE); // '─'
addch(ACS_HLINE); // '─'
if (currentDepth == selectedDepth)
attron(A_STANDOUT); // Highlight the selected depth
addstr(node->name.c_str());
if (currentDepth == selectedDepth)
attroff(A_STANDOUT);
printw("\n");
for (size_t i = 0; i < node->children.size(); i++)
{
DreeNode *child = node->children[i];
if (i == node->children.size() - 1)
{
mask = mask | (1ll << (currentDepth + 1));
}
dfs(child, depth, currentDepth + 1, i == node->children.size() - 1, mask);
}
}
void DreeNavigate::navigateTree(DreeNode *root)
{
int ch;
selectedDepth = 0;
printTree(root, 3);
while ((ch = getch()) != 10) // 10 is the ASCII code for Enter key
{
switch (ch)
{
case KEY_UP:
selectedDepth = std::max(0ll, selectedDepth - 1);
break;
case KEY_DOWN:
selectedDepth = std::min(3ll, selectedDepth + 1); // Assuming the maximum depth is 3
break;
}
clear();
printTree(root, 3);
}
}
void DreeNavigate::printTree(DreeNode *root, long long depth)
{
dfs(root, depth, 0, true, 0);
refresh();
}
int main()
{
// Initialize ncurses
initscr();
// Enable special characters (like line-drawing characters)
keypad(stdscr, TRUE);
raw();
// Create an instance of DreeNavigate and call the navigateTree function
DreeNavigate dreeNavigator;
DreeNode *root = new DreeNode("root");
root->name = "Root";
root->children.push_back(new DreeNode("eg"));
root->children.push_back(new DreeNode("eg1"));
root->children[0]->children.push_back(new DreeNode("pg"));
dreeNavigator.navigateTree(root);
// Clean up and close ncurses
endwin();
return 0;
}
Refer the below code.