colobot/src/ui/screen/screen_io.cpp

266 lines
6.9 KiB
C++

/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2018, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
#include "ui/screen/screen_io.h"
#include "common/logger.h"
#include "common/restext.h"
#include "common/stringutils.h"
#include "level/player_profile.h"
#include "level/robotmain.h"
#include "level/parser/parser.h"
#include "sound/sound.h"
#include "ui/controls/button.h"
#include "ui/controls/edit.h"
#include "ui/controls/image.h"
#include "ui/controls/interface.h"
#include "ui/controls/list.h"
#include "ui/controls/window.h"
#include "ui/screen/screen_level_list.h"
#include <ctime>
#include <cstring>
namespace Ui
{
CScreenIO::CScreenIO(CScreenLevelList* screenLevelList)
: m_screenLevelList(screenLevelList)
{}
// Builds the file name by default.
void CScreenIO::IOReadName()
{
CWindow* pw;
CEdit* pe;
std::string resume;
char line[100];
std::string name;
time_t now;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return;
pe = static_cast<CEdit*>(pw->SearchControl(EVENT_INTERFACE_IONAME));
if ( pe == nullptr ) return;
resume = GetLevelCategoryDir(m_main->GetLevelCategory()) + " " + StrUtils::ToString<int>(m_main->GetLevelChap());
CLevelParser levelParser(m_main->GetLevelCategory(), m_main->GetLevelChap(), 0);
try
{
levelParser.Load();
resume = levelParser.Get("Title")->GetParam("resume")->AsString();
}
catch (CLevelParserException& e)
{
GetLogger()->Warn("%s\n", e.what());
}
time(&now);
strftime(line, 99, "%y.%m.%d %H:%M", localtime(&now));
name = StrUtils::Format("%s - %s %d", line, resume.c_str(), m_main->GetLevelRank());
pe->SetText(name);
pe->SetCursor(name.length(), 0);
m_interface->SetFocus(pe);
}
// Updates the list of games recorded on disk.
void CScreenIO::IOReadList(bool isWrite)
{
CWindow* pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if (pw == nullptr) return;
CList* pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_IOLIST));
if (pl == nullptr) return;
pl->Flush();
m_saveList.clear();
for(const SavedScene& save : m_main->GetPlayerProfile()->GetSavedSceneList())
{
pl->SetItemName(m_saveList.size(), save.name);
m_saveList.push_back(save.path);
}
// invalid index
if ( isWrite )
{
std::string nameStr;
GetResource(RES_TEXT, RT_IO_NEW, nameStr);
pl->SetItemName(m_saveList.size(), nameStr);
}
pl->SetSelect(m_saveList.size());
pl->ShowSelect(false); // shows the selected columns
for (unsigned int i = 0; i < m_saveList.size(); i++)
{
m_engine->DeleteTexture(m_saveList.at(i) + "/screen.png");
}
}
// Updates the buttons according to the selected part in the list.
void CScreenIO::IOUpdateList(bool isWrite)
{
CWindow* pw;
CList* pl;
CButton* pb;
CImage* pi;
int sel, max;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return;
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_IOLIST));
if ( pl == nullptr ) return;
pi = static_cast<CImage*>(pw->SearchControl(EVENT_INTERFACE_IOIMAGE));
if ( pi == nullptr ) return;
sel = pl->GetSelect();
max = pl->GetTotal();
if (m_saveList.size() <= static_cast<unsigned int>(sel))
return;
std::string filename = m_saveList.at(sel) + "/screen.png";
if ( isWrite )
{
if ( sel < max-1 )
{
pi->SetFilenameImage(filename.c_str());
}
else
{
pi->SetFilenameImage("");
}
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_IODELETE));
if ( pb != nullptr )
{
pb->SetState(STATE_ENABLE, sel < max-1);
}
}
else
{
pi->SetFilenameImage(filename.c_str());
}
}
// Deletes the selected scene.
void CScreenIO::IODeleteScene()
{
CWindow* pw;
CList* pl;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return;
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_IOLIST));
if ( pl == nullptr ) return;
int sel = pl->GetSelect();
if (sel < 0 || sel >= static_cast<int>(m_saveList.size())) return;
if (!m_main->GetPlayerProfile()->DeleteScene(m_saveList.at(sel)))
{
m_sound->Play(SOUND_TZOING);
return;
}
}
// clears filename only to leave letter or numbers
static std::string clearName(std::string name)
{
std::string ret;
for (int i = 0; i < static_cast<int>(name.size()); i++)
{
if (isalnum(name[i]))
{
ret += name[i];
}
}
return ret;
}
// Writes the scene.
void CScreenIO::IOWriteScene()
{
CWindow* pw;
CList* pl;
CEdit* pe;
std::string info;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return;
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_IOLIST));
if ( pl == nullptr ) return;
pe = static_cast<CEdit*>(pw->SearchControl(EVENT_INTERFACE_IONAME));
if ( pe == nullptr ) return;
int sel = pl->GetSelect();
if ( sel == -1 ) return;
info = pe->GetText(100);
m_interface->DeleteControl(EVENT_WINDOW5);
std::string dir;
if (static_cast<unsigned int>(sel) >= m_saveList.size())
{
dir = m_main->GetPlayerProfile()->GetSaveFile("save"+clearName(info));
}
else
{
dir = m_saveList.at(sel);
}
m_main->GetPlayerProfile()->SaveScene(dir, info);
}
// Reads the scene.
void CScreenIO::IOReadScene()
{
CWindow* pw;
CList* pl;
pw = static_cast<CWindow*>(m_interface->SearchControl(EVENT_WINDOW5));
if ( pw == nullptr ) return;
pl = static_cast<CList*>(pw->SearchControl(EVENT_INTERFACE_IOLIST));
if ( pl == nullptr ) return;
int sel = pl->GetSelect();
if (sel < 0 || sel >= static_cast<int>(m_saveList.size())) return;
m_main->GetPlayerProfile()->LoadScene(m_saveList.at(sel));
m_screenLevelList->SetSelection(m_main->GetLevelCategory(), m_main->GetLevelChap()-1, m_main->GetLevelRank()-1);
}
} // namespace Ui