#include #include #include "commander.h" #include "resourceManager.h" #include "sdlutils.h" #include "def.h" #include "dialog.h" #include "fileutils.h" #include "viewer.h" #include "keyboard.h" #define X_LEFT 1 #define X_RIGHT 162 CCommander::CCommander(const std::string &p_pathL, const std::string &p_pathR): CWindow::CWindow(), m_panelLeft(p_pathL, X_LEFT), m_panelRight(p_pathR, X_RIGHT), m_panelSource(NULL), m_panelTarget(NULL), m_background(CResourceManager::instance().getSurface(CResourceManager::T_SURFACE_BG)) { m_panelSource = &m_panelLeft; m_panelTarget = &m_panelRight; } CCommander::~CCommander(void) { } void CCommander::render(const bool p_focus) const { INHIBIT(std::cout << "CCommander::render fullscreen: " << isFullScreen() << " focus: " << p_focus << std::endl;) // Draw background image SDL_utils::applySurface(0, 0, m_background, Globals::g_screen); // Draw panels m_panelLeft.render(p_focus && (m_panelSource == &m_panelLeft)); m_panelRight.render(p_focus && (m_panelSource == &m_panelRight)); } const bool CCommander::keyPress(const SDL_Event &p_event) { CWindow::keyPress(p_event); bool l_ret(false); switch (p_event.key.keysym.sym) { case MYKEY_SYSTEM: case MYKEY_MENU: if (openSystemMenu()) m_panelSource->refresh(); l_ret = true; break; case MYKEY_UP: l_ret = m_panelSource->moveCursorUp(1); break; case MYKEY_DOWN: l_ret = m_panelSource->moveCursorDown(1); break; case MYKEY_PAGEUP: l_ret = m_panelSource->moveCursorUp(NB_VISIBLE_LINES - 1); break; case MYKEY_PAGEDOWN: l_ret = m_panelSource->moveCursorDown(NB_VISIBLE_LINES - 1); break; case MYKEY_LEFT: if (m_panelSource == &m_panelRight) { m_panelSource = &m_panelLeft; m_panelTarget = &m_panelRight; l_ret = true; } break; case MYKEY_RIGHT: if (m_panelSource == &m_panelLeft) { m_panelSource = &m_panelRight; m_panelTarget = &m_panelLeft; l_ret = true; } break; case MYKEY_OPEN: if (m_panelSource->isDirectoryHighlighted()) { // It's a dir => open it l_ret = m_panelSource->open(); } else { // It's a file => open execute menu openExecuteMenu(); l_ret = true; } break; case MYKEY_PARENT: l_ret = m_panelSource->goToParentDir(); break; case MYKEY_OPERATION: // If there's no file in the select list, add current file if (m_panelSource->getSelectList().empty() && m_panelSource->getHighlightedItem() != "..") m_panelSource->addToSelectList(false); if (!m_panelSource->getSelectList().empty()) { if (openCopyMenu()) { // Refresh file lists m_panelSource->refresh(); m_panelTarget->refresh(); } else { if (m_panelSource->getSelectList().size() == 1 && (*m_panelSource->getSelectList().begin()) == m_panelSource->getHighlightedIndex()) m_panelSource->selectNone(); } l_ret = true; } break; case MYKEY_SELECT: l_ret = m_panelSource->addToSelectList(true); break; case MYKEY_TRANSFER: if (m_panelSource->isDirectoryHighlighted() && m_panelSource->getHighlightedItem() != "..") l_ret = m_panelTarget->open(m_panelSource->getHighlightedItemFull()); else l_ret = m_panelTarget->open(m_panelSource->getCurrentPath()); break; default: break; } return l_ret; } const bool CCommander::keyHold(void) { bool l_ret(false); switch(m_lastPressed) { case MYKEY_UP: if (tick(SDL_GetKeyState(NULL)[MYKEY_UP])) l_ret = m_panelSource->moveCursorUp(1); break; case MYKEY_DOWN: if (tick(SDL_GetKeyState(NULL)[MYKEY_DOWN])) l_ret = m_panelSource->moveCursorDown(1); break; case MYKEY_PAGEUP: if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEUP])) l_ret = m_panelSource->moveCursorUp(NB_VISIBLE_LINES - 1); break; case MYKEY_PAGEDOWN: if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEDOWN])) l_ret = m_panelSource->moveCursorDown(NB_VISIBLE_LINES - 1); break; case MYKEY_SELECT: if (tick(SDL_GetKeyState(NULL)[MYKEY_SELECT])) l_ret = m_panelSource->addToSelectList(true); break; default: break; } return l_ret; } const bool CCommander::openCopyMenu(void) const { bool l_ret(false); int l_dialogRetVal(0); bool l_rename(false); // List of selected files std::vector l_list; m_panelSource->getSelectList(l_list); // The rename option appears only if one item is selected l_rename = (l_list.size() == 1); { bool l_loop(false); std::ostringstream l_stream; l_stream << l_list.size() << " selected:"; // File operation dialog CDialog l_dialog(l_stream.str(), 0, Y_LIST + m_panelSource->getHighlightedIndexRelative() * LINE_HEIGHT); l_dialog.addOption(m_panelSource == &m_panelLeft ? "Copy >" : "< Copy"); l_dialog.addOption(m_panelSource == &m_panelLeft ? "Move >" : "< Move"); if (l_rename) l_dialog.addOption("Rename"); l_dialog.addOption("Delete"); l_dialog.addOption("Disk used"); l_dialog.init(); do { l_loop = false; l_dialogRetVal = l_dialog.execute(); if (l_dialogRetVal == 3 + l_rename) { CDialog l_dialog2("", l_dialog.getX() + l_dialog.getImage()->w - DIALOG_BORDER, l_dialog.getY() + DIALOG_BORDER + (l_dialog.getHighlightedIndex() + 1) * LINE_HEIGHT); l_dialog2.addOption("Yes"); l_dialog2.addOption("No"); l_dialog2.init(); if (l_dialog2.execute() != 1) l_loop = true; } } while (l_loop); } // Perform operation switch (l_dialogRetVal) { case 1: // Copy File_utils::copyFile(l_list, m_panelTarget->getCurrentPath()); l_ret = true; break; case 2: // Move File_utils::moveFile(l_list, m_panelTarget->getCurrentPath()); l_ret = true; break; case 3: if (l_rename) { // Rename CKeyboard l_keyboard(m_panelSource->getHighlightedItem()); if (l_keyboard.execute() == 1 && !l_keyboard.getInputText().empty() && l_keyboard.getInputText() != m_panelSource->getHighlightedItem()) { File_utils::renameFile(m_panelSource->getHighlightedItemFull(), m_panelSource->getCurrentPath() + (m_panelSource->getCurrentPath() == "/" ? "" : "/") + l_keyboard.getInputText()); l_ret = true; } } else { // Delete File_utils::removeFile(l_list); l_ret = true; } break; case 4: if (l_rename) { // Delete File_utils::removeFile(l_list); l_ret = true; } else // Disk used File_utils::diskUsed(l_list); break; case 5: if (l_rename) // Disk used File_utils::diskUsed(l_list); break; default: break; } return l_ret; } const bool CCommander::openSystemMenu(void) { bool l_ret(false); int l_dialogRetVal(0); // Selection dialog { CDialog l_dialog("System:", 0, Y_LIST + m_panelSource->getHighlightedIndexRelative() * LINE_HEIGHT); l_dialog.addOption("Select all"); l_dialog.addOption("Select none"); l_dialog.addOption("New directory"); l_dialog.addOption("Disk info"); l_dialog.addOption("Quit"); l_dialog.init(); l_dialogRetVal = l_dialog.execute(); } switch (l_dialogRetVal) { case 1: // Select all m_panelSource->selectAll(); break; case 2: // Select none m_panelSource->selectNone(); break; case 3: // New dir { CKeyboard l_keyboard(""); if (l_keyboard.execute() == 1 && !l_keyboard.getInputText().empty()) { File_utils::makeDirectory(m_panelSource->getCurrentPath() + (m_panelSource->getCurrentPath() == "/" ? "" : "/") + l_keyboard.getInputText()); l_ret = true; } } break; case 4: // Disk info File_utils::diskInfo(); break; case 5: // Quit m_retVal = -1; break; default: break; } return l_ret; } void CCommander::openExecuteMenu(void) const { int l_dialogRetVal(0); // Dialog { CDialog l_dialog(m_panelSource->getHighlightedItem() + ":", 0, Y_LIST + m_panelSource->getHighlightedIndexRelative() * LINE_HEIGHT); l_dialog.addOption("View"); l_dialog.addOption("Execute"); l_dialog.init(); l_dialogRetVal = l_dialog.execute(); } // Perform operation switch (l_dialogRetVal) { case 1: // View { // Check size const std::string l_file(m_panelSource->getHighlightedItemFull()); INHIBIT(std::cout << "File size: " << File_utils::getFileSize(l_file) << std::endl;) if (File_utils::getFileSize(l_file) > VIEWER_SIZE_MAX) { // File is too big to be viewed! CDialog l_dialog("Error:", 0, 0); l_dialog.addLabel("File is too big!"); l_dialog.addOption("OK"); l_dialog.init(); l_dialog.execute(); } else { CViewer l_viewer(m_panelSource->getHighlightedItemFull()); l_viewer.execute(); } } break; case 2: // Execute File_utils::executeFile(m_panelSource->getHighlightedItemFull()); break; default: break; } } const bool CCommander::isFullScreen(void) const { return true; }