#include "file_manager.h" #include "shared.h" extern PIScreen screen; FileManager::TileDir::TileDir(): TileList() { label_path = 0; selection_mode = TileList::MultiSelection; dir = PIDir::current(); resized = false; } bool FileManager::TileDir::keyEvent(PIKbdListener::KeyEvent key) { if (key.key == PIKbdListener::Return) { if (cur < entries.size_s() && cur >= 0) { //piCout << entries[cur]; if (entries[cur].isDir()) { prev_pos[dir.path()] = PIPair(cur, offset); dir.cd(entries[cur].name()); PIPair cp = prev_pos.value(dir.path()); cur = cp.first; offset = cp.second; selected.clear(); updateDir(); } } return true; } return TileList::keyEvent(key); } void FileManager::TileDir::lock() { if (screen && !resized) ((PIScreen*)screen)->lock(); } void FileManager::TileDir::unlock() { if (screen && !resized) ((PIScreen*)screen)->unlock(); } void FileManager::TileDir::updateDir() { //if (!enabled) return; entries.clear(); lock(); int pc = cur, po = offset; cur = -1; offset = 0; content.resize(1); content[0] = Row("... Reading ...", CellFormat()); unlock(); PIVector el = dir.entries(), fl, dl; if (el.isEmpty()) { PIFile::FileInfo fi; fi.path = ".."; fi.flags |= PIFile::FileInfo::DotDot | PIFile::FileInfo::Dir; entries << fi; } else { for (int i = 0; i < el.size_s(); ++i) { if (el[i].name() == ".") continue; if (el[i].name() == "..") { dl.push_front(el[i]); continue; } if (el[i].isDir()) dl << el[i]; else fl << el[i]; } entries << dl << fl; } if (label_path) { label_path->content.resize(1); label_path->content[0].first = dir.absolutePath(); } cur = pc; offset = po; buildNames(); } void FileManager::TileDir::buildNames() { //if (!enabled) return; lock(); content.clear(); PIChar t; CharFlags cf = 0; Color cc = Default; PIString fcol, scol; piForeachC (PIFile::FileInfo & e, entries) { if (e.isDir()) { t = '/'; cf = Bold; scol = " dir"; } else { if (e.perm_user.exec || e.perm_group.exec || e.perm_other.exec) { cf = Bold; cc = Green; t = '*'; } else { t = ' '; cf = 0; } scol = PIString::readableSize(e.size); } if (e.isSymbolicLink() && (t != '*')) t = '~'; scol = scol.expandRightTo(9, ' ') + "| " + e.time_modification.toString("dd.MM hh:mm:ss") + " | " + e.perm_user.toString() + " " + e.perm_group.toString() + " " + e.perm_other.toString(); fcol = t + e.name(); if (fcol.size_s() >= width - 2 - scol.size_s()) fcol = fcol.left(width - 5 - scol.size_s()) + "..."; fcol.expandRightTo(width - 1 - scol.size_s(), ' '); content << Row(fcol + scol, CellFormat(cc, Transparent, cf)); } unlock(); } void FileManager::TileDir::sizeHint(int & w, int & h) const { w = h = 4; } void FileManager::TileDir::resizeEvent(int w, int h) { resized = true; buildNames(); resized = false; } FileManager::FileManager() { setName("FileManager"); del_commit = false; CONNECTU(&screen, keyPressed, this, keyEvent) //dir.setDir("/home/peri4/Documents"); TileSimple * tl; tile_root = new PIScreenTile(); tile_root->direction = Vertical; PIScreenTile * pt = new PIScreenTile(); pt->direction = Horizontal; pt->spacing = 1; pt->back_format.color_back = Cyan; for (int i = 0; i < 2; ++i) { PIScreenTile * panel = new PIScreenTile(); TileSimple * plabel = new TileSimple(); plabel->size_policy = Fixed; plabel->maximumWidth = 1; panel->direction = Vertical; panels[i] = new TileDir(); panels[i]->name = "file panel " + PIString(i); panels[i]->label_path = plabel; panel->addTile(plabel); panel->addTile(panels[i]); panels[i]->updateDir(); pt->addTile(panel); } tile_root->addTile(pt); PIScreenTile * labels = new PIScreenTile(); labels->size_policy = Fixed; labels->direction = Horizontal; PIVector ll; ll << SSPair(" Esc", "Exit") << SSPair(" F5", "Copy") << SSPair(" F6", "Move") << SSPair(" F8", "Delete"); piForeachC (SSPair & l, ll) { tl = new TileSimple(); labels->addTile(tl); tl->content << TileSimple::Row(l.first, CellFormat(White, Transparent, Bold)); tl = new TileSimple(); labels->addTile(tl); tl->content << TileSimple::Row(l.second, CellFormat(Black, Cyan)); } tl = new TileSimple(); labels->addTile(tl); tl->size_policy = Expanding; tile_root->addTile(labels); } PIScreenTile * FileManager::tile() const { return tile_root; } void FileManager::keyEvent(PIKbdListener::KeyEvent key) { if (!tile_root->visible) return; switch (key.key) { case PIKbdListener::Esc: menuRequest(); break; default: break; } /*if (!enabled) return; if (key.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.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, Yellow | Inverse); console.addString("Path: " + dir.absolutePath(), 1, Green | Inverse | Bold); console.addString("Name", 1, Green | Inverse | Bold); console.addString(" ", 2, Yellow | Inverse); console.addString(" ", 2, Green | Inverse); console.addString(" ", 2, Green | Inverse); buildNames(); console.addString("A - select all, D - remove, R - refresh, Esc - exit", 1, Green | Inverse | Bold); finishTab();*/ }