union-minui/other/DinguxCommander/src/viewer.cpp
2023-04-15 10:36:01 +02:00

219 lines
5.7 KiB
C++

#include <iostream>
#include <fstream>
#include "viewer.h"
#include "resourceManager.h"
#include "def.h"
#include "sdlutils.h"
CViewer::CViewer(const std::string &p_fileName):
CWindow(),
m_fileName(p_fileName),
m_firstLine(0),
m_image(NULL),
m_font(CResourceManager::instance().getFont())
{
// Init clip rect
m_clip.x = 0;
m_clip.y = 0;
m_clip.w = SCREEN_WIDTH - 2 * VIEWER_MARGIN;
// Create background image
m_image = SDL_utils::createImage(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_MapRGB(Globals::g_screen->format, COLOR_BG_1));
{
SDL_Rect l_rect;
l_rect.x = 0;
l_rect.y = 0;
l_rect.w = SCREEN_WIDTH;
l_rect.h = Y_LIST;
SDL_FillRect(m_image, &l_rect, SDL_MapRGB(m_image->format, COLOR_BORDER));
}
// Print title
SDL_Surface *l_surfaceTmp = SDL_utils::renderText(m_font, m_fileName, Globals::g_colorTextTitle);
if (l_surfaceTmp->w > m_image->w - 2 * VIEWER_MARGIN)
{
SDL_Rect l_rect;
l_rect.x = l_surfaceTmp->w - (m_image->w - 2 * VIEWER_MARGIN);
l_rect.y = 0;
l_rect.w = m_image->w - 2 * VIEWER_MARGIN;
l_rect.h = l_surfaceTmp->h;
SDL_utils::applySurface(VIEWER_MARGIN, Y_HEADER, l_surfaceTmp, m_image, &l_rect);
}
else
{
SDL_utils::applySurface(VIEWER_MARGIN, Y_HEADER, l_surfaceTmp, m_image);
}
m_clip.h = l_surfaceTmp->h;
SDL_FreeSurface(l_surfaceTmp);
// Read file
std::ifstream l_file(m_fileName.c_str());
if (l_file.is_open())
{
std::string l_line("");
while (std::getline(l_file, l_line))
{
m_lines.push_back(l_line);
}
l_file.close();
}
else
std::cerr << "Error: unable to open file " << m_fileName << std::endl;
INHIBIT(std::cout << "CViewer: " << m_lines.size() << " lines read" << std::endl;)
}
CViewer::~CViewer(void)
{
// Free surfaces
if (m_image != NULL)
{
SDL_FreeSurface(m_image);
m_image = NULL;
}
}
void CViewer::render(const bool p_focus) const
{
INHIBIT(std::cout << "CViewer::render fullscreen: " << isFullScreen() << " focus: " << p_focus << std::endl;)
// Draw background
SDL_utils::applySurface(0, 0, m_image, Globals::g_screen);
// Draw lines
SDL_Surface *l_surfaceTmp(NULL);
unsigned int l_i(0);
std::vector<std::string>::const_iterator l_it = m_lines.begin() + m_firstLine;
while (l_it != m_lines.end() && l_i < VIEWER_NB_LINES)
{
if (!l_it->empty())
{
l_surfaceTmp = SDL_utils::renderText(m_font, *l_it, Globals::g_colorTextNormal);
SDL_utils::applySurface(VIEWER_MARGIN, VIEWER_Y_LIST + l_i * VIEWER_LINE_HEIGHT - Y_OFFSET, l_surfaceTmp, Globals::g_screen, &m_clip);
SDL_FreeSurface(l_surfaceTmp);
}
// Next line
++l_it;
++l_i;
}
}
const bool CViewer::keyPress(const SDL_Event &p_event)
{
CWindow::keyPress(p_event);
bool l_ret(false);
switch (p_event.key.keysym.sym)
{
case MYKEY_PARENT:
case MYKEY_MENU:
m_retVal = -1;
l_ret = true;
break;
case MYKEY_UP:
l_ret = moveUp(1);
break;
case MYKEY_DOWN:
l_ret = moveDown(1);
break;
case MYKEY_PAGEUP:
l_ret = moveUp(VIEWER_NB_LINES - 1);
break;
case MYKEY_PAGEDOWN:
l_ret = moveDown(VIEWER_NB_LINES - 1);
break;
case MYKEY_LEFT:
l_ret = moveLeft();
break;
case MYKEY_RIGHT:
moveRight();
l_ret = true;
break;
default:
break;
}
return l_ret;
}
const bool CViewer::keyHold(void)
{
bool l_ret(false);
switch(m_lastPressed)
{
case MYKEY_UP:
if (tick(SDL_GetKeyState(NULL)[MYKEY_UP]))
l_ret = moveUp(1);
break;
case MYKEY_DOWN:
if (tick(SDL_GetKeyState(NULL)[MYKEY_DOWN]))
l_ret = moveDown(1);
break;
case MYKEY_PAGEUP:
if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEUP]))
l_ret = moveUp(VIEWER_NB_LINES - 1);
break;
case MYKEY_PAGEDOWN:
if (tick(SDL_GetKeyState(NULL)[MYKEY_PAGEDOWN]))
l_ret = moveDown(VIEWER_NB_LINES - 1);
break;
case MYKEY_LEFT:
if (tick(SDL_GetKeyState(NULL)[MYKEY_LEFT]))
l_ret = moveLeft();
break;
case MYKEY_RIGHT:
if (tick(SDL_GetKeyState(NULL)[MYKEY_RIGHT]))
{
moveRight();
l_ret = true;
}
break;
default:
break;
}
return l_ret;
}
const bool CViewer::isFullScreen(void) const
{
return true;
}
const bool CViewer::moveUp(const unsigned int p_step)
{
bool l_ret(false);
if (m_firstLine)
{
if (m_firstLine > p_step)
m_firstLine -= p_step;
else
m_firstLine = 0;
l_ret = true;
}
return l_ret;
}
const bool CViewer::moveDown(const unsigned int p_step)
{
bool l_ret(false);
if (m_firstLine + VIEWER_NB_LINES + 1 < m_lines.size())
{
if (m_firstLine + VIEWER_NB_LINES + 1 + p_step > m_lines.size())
m_firstLine = m_lines.size() - VIEWER_NB_LINES - 1;
else
m_firstLine += p_step;
l_ret = true;
}
return l_ret;
}
const bool CViewer::moveLeft(void)
{
bool l_ret(false);
if (m_clip.x > 0)
{
if (m_clip.x > VIEWER_X_STEP)
m_clip.x -= VIEWER_X_STEP;
else
m_clip.x = 0;
l_ret = true;
}
return l_ret;
}
void CViewer::moveRight(void)
{
m_clip.x += VIEWER_X_STEP;
}