diff --git a/include/EventManager.hpp b/include/EventManager.hpp index 869282e..d68fdf6 100644 --- a/include/EventManager.hpp +++ b/include/EventManager.hpp @@ -32,6 +32,16 @@ class EventManager void CallbackHome(); void CallbackHelp(); void CallbackSort(); + void CallbackUnits(); + + /// Computes the visibility of the selected line and scrolls the element list if needed. + void ScrollList(); + + /// Sorts the elements of the current node according to the sorting method currently selected. + void SortNodeElements(); + + /// Updates the screen based on the current state. + void UpdateScreen(); void DebugPrintState(); @@ -43,6 +53,7 @@ class EventManager int currentLine; // size descending, 1 -> name ascending + bool SI_units; //GetChildrenCount()) - currentLine = (currentLine - 1) % currentNode->GetChildrenCount(); - DebugPrintState(); + currentLine = ((currentLine - 1) < 0) ? (currentNode->GetChildrenCount() - 1) : ((currentLine - 1) % currentNode->GetChildrenCount()); + ScrollList(); + UpdateScreen(); } void EventManager::CallbackArrowDown() { - std::cout << "CallbackArrowDown\n";// DEBUG if(currentNode == NULL) return; if(currentNode->GetChildrenCount()) currentLine = (currentLine + 1) % currentNode->GetChildrenCount(); - DebugPrintState(); + ScrollList(); + UpdateScreen(); } void EventManager::CallbackArrowLeft() { - std::cout << "CallbackArrowLeft\n";// DEBUG if(currentNode == NULL) return; CallbackBackspace(); } void EventManager::CallbackArrowRight() { - std::cout << "CallbackArrowRight\n";// DEBUG if(currentNode == NULL) return; CallbackEnter(); } void EventManager::CallbackEnter() { - std::cout << "CallbackEnter\n";// DEBUG if(currentNode == NULL) return; if((size_t)currentLine < currentNode->GetChildrenCount()) if(currentNode->GetChild(currentLine).IsFolder()) { currentNode = ¤tNode->GetChild(currentLine); + SortNodeElements(); topLine = 0; currentLine = 0; } - DebugPrintState(); + UpdateScreen(); } void EventManager::CallbackBackspace() { - std::cout << "CallbackBackspace\n";// DEBUG if(currentNode == NULL) return; // Go up one level if(currentNode->GetParent() != NULL) @@ -158,38 +161,70 @@ void EventManager::CallbackBackspace() topLine = 0; currentLine = 0; } - DebugPrintState(); + UpdateScreen(); } void EventManager::CallbackHome() { - std::cout << "CallbackHome\n";// DEBUG if(currentNode == NULL) return; // Set the current node to be the root node (go back "home"). currentNode = &rootNode; topLine = 0; currentLine = 0; - DebugPrintState(); + UpdateScreen(); } void EventManager::CallbackHelp() { - std::cout << "CallbackHelp\n";// DEBUG if(currentNode == NULL) return; - - DebugPrintState(); + + UpdateScreen(); } void EventManager::CallbackSort() { - std::cout << "CallbackSort\n";// DEBUG if(currentNode == NULL) return; sortType = (sortType + 1) % 2;// Cycle through all the sort types. + SortNodeElements(); + UpdateScreen(); +} + +void EventManager::CallbackUnits() +{ + if(currentNode == NULL) return; + SI_units ^= true;// Invert the SI_units flag. + UpdateScreen(); +} + +void EventManager::ScrollList() +{ + /*if(currentNode == NULL) return; + if(currentNode->GetChildrenCount()) + { + // compute visibility of selected line and scroll if needed + PRINT_VAR(2 + currentLine - topLine); + PRINT_VAR(display.Rows()-1); + if((2 + currentLine - topLine) >= (display.Rows()-1)) + topLine = currentLine - (display.Rows() - 2);// DOES NOT WORK. WORK IN PROGRESS. + }//*/ +} + +void EventManager::SortNodeElements() +{ + if(currentNode == NULL) return; if(sortType == 0) currentNode->SortBySizeDesc(); else if(sortType == 1) currentNode->SortByNameAsc(); - DebugPrintState(); +} + +void EventManager::UpdateScreen() +{ + //DebugPrintState(); return;// DEBUG + Display::ClearScreen(); + display.DisplayTreeNode(*currentNode, topLine, SI_units); + display.HighlightLine(2 + topLine + currentLine, true); + display.DrawScreenLines(); } void EventManager::DebugPrintState() diff --git a/src/main.cpp b/src/main.cpp index 51a84f5..019911d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ using std::cout; using std::cerr; using std::endl; -#define D_UNIT_TESTS +//#define D_UNIT_TESTS #include @@ -82,7 +82,12 @@ int main(int argc, char *argv[]) tree.PrintTree(maxDepth, true); // Interactive mode : the user can navigate through the tree structure. - // else + else + { + tree.BuildParentLinks(); + EventManager eventManager(display, tree); + eventManager.MainEventLoop(); + } return 0; } diff --git a/src/test.cpp b/src/test.cpp index 5feef46..fc99363 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -203,7 +203,7 @@ void runTests(int argc, char *argv[]) Display display; TreeNodeDiskUsage tree(rootpath); tree.BuildTree(false); - tree.SortBySizeDesc(); + tree.SortBySizeDesc(true); display.DisplayTreeNode(tree, 0, true); //Display::ClearScreen(); display.DrawScreenLines();