build: Merge submodules into repo

This commit is contained in:
robshape 2023-04-15 10:36:01 +02:00
parent 540a30f719
commit 4c64279f90
422 changed files with 106715 additions and 8 deletions

View file

@ -0,0 +1,353 @@
#include <iostream>
#include <sstream>
#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<std::string> 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;
}