#include "file_manager.h" #include "shared.h" FileManager::FileManager() { setName("FileManager"); offset = cur = height = 0; enabled = del_commit = false; CONNECTU(&console, keyPressed, this, keyEvent) dir = PIDir::current(); //dir.setDir("/home/peri4/Documents"); dir.setDir("/home/peri4"); updateDir(); } void FileManager::keyEvent(char key) { if (!enabled) return; if (key == 'D') { if (cur >= files.size_s() || cur < 0) return; if (del_commit) { piForeachC (PIString & f, selected) { PIFile::remove(dir.absolutePath() + PIDir::separator + f); //piCout << "remove" << (dir.absolutePath() + PIDir::separator + f); } selected.clear(); updateDir(); console.clearCustomStatus(); del_commit = false; } else { if (selected.isEmpty()) selected << files[cur].path; console.addCustomStatus("Delete " + PIString(selected.size_s()) + " file, are you sure? D as yes"); del_commit = true; } updateConsole(); return; } console.clearCustomStatus(); del_commit = false; PIStringList nsel; switch (key) { case PIKbdListener::UpArrow: cur--; if (cur < 0) cur = 0; if (cur - offset < 3) offset--; if (offset < 0) offset = 0; updateConsole(); break; case PIKbdListener::Space: if (cur < 0 || cur >= files.size_s()) return; if (selected.contains(files[cur].path)) selected.removeOne(files[cur].path); else selected << files[cur].path; case PIKbdListener::DownArrow: cur++; if (cur >= files.size_s()) cur = files.size_s() - 1; if (cur - offset >= height - 3) offset++; if (offset >= files.size_s() - height) offset = files.size_s() - height; updateConsole(); //piCout << offset << files.size_s() << height; break; case PIKbdListener::Home: cur = offset = 0; updateConsole(); break; case PIKbdListener::End: cur = files.size_s() - 1; offset = files.size_s() - height; updateConsole(); //piCout << offset << files.size_s() << height; break; case PIKbdListener::Return: if (cur < files.size_s() && cur >= 0) { piCout << files[cur]; if (files[cur].isDir()) { prev_pos[dir.path()] = cur; prev_off[dir.path()] = offset; dir.cd(files[cur].name()); cur = prev_pos.value(dir.path(), 0); offset = prev_off.value(dir.path(), 0); selected.clear(); updateDir(); updateConsole(); } } break; case 'A': selected.clear(); piForeach (PIFile::FileInfo & e, files) selected << e.path; updateConsole(); break; case 'R': updateDir(); piForeach (PIFile::FileInfo & e, files) if (selected.contains(e.path)) nsel << e.path; selected = nsel; updateConsole(); break; case PIKbdListener::Esc: //selected.clear(); //updateConsole(); menuRequest(); break; default: break; } } void FileManager::updateConsole() { if (!enabled) return; startTab(2); console.addString("File manager", 1, PIConsole::Yellow | PIConsole::Inverse); console.addString("Path: " + dir.absolutePath(), 1, PIConsole::Green | PIConsole::Inverse | PIConsole::Bold); console.addString("Name", 1, PIConsole::Green | PIConsole::Inverse | PIConsole::Bold); console.addString(" ", 2, PIConsole::Yellow | PIConsole::Inverse); console.addString(" ", 2, PIConsole::Green | PIConsole::Inverse); console.addString(" ", 2, PIConsole::Green | PIConsole::Inverse); buildNames(); console.addString("A - select all, D - remove, R - refresh, Esc - exit", 1, PIConsole::Green | PIConsole::Inverse | PIConsole::Bold); finishTab(); } void FileManager::buildNames() { if (!enabled) return; height = console.windowHeight() - 10; int is = piClampi(offset, 0, piMaxi(0, files.size_s() - 1)), ie = piClampi(offset + height, 0, files.size_s()); console.addString((is > 0) ? (PIString(" /\\ ").repeat(console.windowWidth() / 8)) : " ", 1, PIConsole::Green | PIConsole::Bold); console.addString(" ", 2); PIChar t; PIConsole::FormatFlags f = 0; PIString scol; piCout << cur; for (int i = is; i < ie; ++i) { if (files[i].isDir()) { t = '/'; f = PIConsole::Bold; scol = " dir"; } else { if (files[i].perm_user.exec || files[i].perm_group.exec || files[i].perm_other.exec) { f = PIConsole::Green | PIConsole::Bold; t = '*'; } else { t = ' '; f = 0; } scol = PIString::readableSize(files[i].size); } if (files[i].isSymbolicLink() && (t != '*')) t = '~'; scol = scol.expandRightTo(9, ' ') + "| " + files[i].time_modification.toString("dd.MM hh:mm:ss") + " | " + files[i].perm_user.toString() + " " + files[i].perm_group.toString() + " " + files[i].perm_other.toString(); if (i == cur) f |= PIConsole::BackBlue; if (selected.contains(files[i].path)) f |= PIConsole::Yellow | PIConsole::Bold; console.addString(t + files[i].name(), 1, f); console.addString(scol, 2, f); } console.addString((ie < files.size_s()) ? (PIString(" \\/ ").repeat(console.windowWidth() / 8)) : " ", 1, PIConsole::Green | PIConsole::Bold); console.addString(" ", 2); } void FileManager::updateDir() { if (!enabled) return; files.clear(); PIVector el = dir.entries(), fl, dl; for (int i = 0; i < el.size_s(); ++i) { if (el[i].path == ".") continue; if (el[i].path == "..") { dl.push_front(el[i]); continue; } if (el[i].isDir()) dl << el[i]; else fl << el[i]; } files << dl << fl; if (cur >= files.size_s()) cur = files.size_s() - 1; if (offset >= files.size_s() - height) offset = files.size_s() - height; if (cur < 0) cur = 0; if (offset < 0) offset = 0; }