ewol/ewol/widget/ListFileSystem.cpp

275 lines
8.2 KiB
C++

/** @file
* @author Edouard DUPIN
* @copyright 2011, Edouard DUPIN, all right reserved
* @license MPL v2.0 (see license file)
*/
#include <ewol/widget/ListFileSystem.hpp>
#include <etk/tool.hpp>
#include <etk/os/FSNode.hpp>
#include <etk/typeInfo.hpp>
ETK_DECLARE_TYPE(ewol::widget::ListFileSystem);
ewol::widget::ListFileSystem::ListFileSystem() :
signalFileSelect(this, "file-select", ""),
signalFileValidate(this, "file-validate", ""),
signalFolderSelect(this, "folder-select", ""),
signalFolderValidate(this, "folder-validate", ""),
propertyPath(this, "path",
"/",
"Path to display",
&ewol::widget::ListFileSystem::onChangePropertyPath),
propertyFile(this, "select",
"",
"selection af a specific file",
&ewol::widget::ListFileSystem::onChangePropertyFile),
propertyShowFile(this, "show-file",
true,
"display files",
&ewol::widget::ListFileSystem::onChangePropertyShowFile),
propertyShowFolder(this, "show-folder",
true,
"display folders",
&ewol::widget::ListFileSystem::onChangePropertyShowFolder),
propertyShowHidden(this, "show-hidden",
true,
"Show the hidden element (file, folder, ...)",
&ewol::widget::ListFileSystem::onChangePropertyShowHidden),
propertyFilter(this, "filter",
"",
"regex to filter files ...",
&ewol::widget::ListFileSystem::onChangePropertyFilter),
m_selectedLine(-1) {
addObjectType("ewol::widget::ListFileSystem");
#if defined(__TARGET_OS__Windows)
propertyPath.setDirectCheck("c:/");
#endif
m_colorProperty = ewol::resource::ColorFile::create("{ewol}THEME:COLOR:ListFileSystem.json");
if (m_colorProperty != nullptr) {
m_colorIdText = m_colorProperty->request("text");
m_colorIdBackground1 = m_colorProperty->request("background1");
m_colorIdBackground2 = m_colorProperty->request("background2");
m_colorIdBackgroundSelected = m_colorProperty->request("selected");
}
setMouseLimit(1);
}
ewol::widget::ListFileSystem::~ListFileSystem() {
clearList();
}
void ewol::widget::ListFileSystem::clearList() {
for (auto &it : m_list) {
if (it != nullptr) {
ETK_DELETE(etk::FSNode, it);
it = nullptr;
}
}
}
etk::Color<> ewol::widget::ListFileSystem::getBasicBG() {
return m_colorProperty->get(m_colorIdBackground1);
}
void ewol::widget::ListFileSystem::regenerateView() {
clearList();
m_selectedLine = -1;
m_list.clear();
m_originScrooled.setValue(0,0);
etk::FSNode tmpFolder(*propertyPath);
// get the list:
m_list = tmpFolder.folderGetSubList(*propertyShowHidden, *propertyShowFolder, *propertyShowFile, *propertyFilter);
// request a redraw ...
markToRedraw();
}
etk::String ewol::widget::ListFileSystem::getSelect() const {
etk::String tmpVal = "";
if (m_selectedLine >= 0) {
if (m_list[m_selectedLine] != nullptr) {
tmpVal = m_list[m_selectedLine]->getNameFile();
}
}
return tmpVal;
}
// select the specific file
void ewol::widget::ListFileSystem::setSelect(const etk::String& _data) {
// remove selected line
m_selectedLine = -1;
// search the coresponding file :
for (size_t iii=0; iii<m_list.size(); ++iii) {
if (m_list[iii] != nullptr) {
if (m_list[iii]->getNameFile() == _data) {
// we find the line :
m_selectedLine = iii;
break;
}
}
}
markToRedraw();
}
uint32_t ewol::widget::ListFileSystem::getNuberOfColomn() {
return 1;
}
bool ewol::widget::ListFileSystem::getTitle(int32_t _colomn, etk::String &_myTitle, etk::Color<>& _fg, etk::Color<>& _bg) {
_myTitle = "title";
return true;
}
uint32_t ewol::widget::ListFileSystem::getNuberOfRaw() {
int32_t offset = 0;
if (*propertyShowFolder == true) {
if (propertyPath.get() == "/") {
offset = 1;
} else {
offset = 2;
}
}
return m_list.size() + offset;
}
bool ewol::widget::ListFileSystem::getElement(int32_t _colomn, int32_t _raw, etk::String& _myTextToWrite, etk::Color<>& _fg, etk::Color<>& _bg) {
int32_t offset = 0;
if (*propertyShowFolder == true) {
if (*propertyPath == "/") {
offset = 1;
} else {
offset = 2;
}
if (_raw == 0) {
_myTextToWrite = ".";
} else if ( _raw == 1
&& propertyPath.get() != "/") {
_myTextToWrite = "..";
}
}
if( _raw-offset >= 0
&& _raw-offset < (int32_t)m_list.size()
&& m_list[_raw-offset] != nullptr) {
_myTextToWrite = m_list[_raw-offset]->getNameFile();
EWOL_VERBOSE("get filename for : '" << *m_list[_raw-offset] << ":'" << _myTextToWrite << "'");
}
_fg = m_colorProperty->get(m_colorIdText);
if (_raw % 2) {
_bg = m_colorProperty->get(m_colorIdBackground1);
} else {
_bg = m_colorProperty->get(m_colorIdBackground2);
}
if (m_selectedLine == _raw) {
_bg = m_colorProperty->get(m_colorIdBackgroundSelected);
}
return true;
};
bool ewol::widget::ListFileSystem::onItemEvent(int32_t _IdInput,
enum gale::key::status _typeEvent,
int32_t _colomn,
int32_t _raw,
float _x,
float _y) {
int32_t offset = 0;
if (*propertyShowFolder == true) {
if (*propertyPath == "/") {
offset = 1;
} else {
offset = 2;
}
}
if (_typeEvent == gale::key::status::pressSingle) {
EWOL_VERBOSE("Event on List : IdInput=" << _IdInput << " colomn=" << _colomn << " raw=" << _raw );
if (1 == _IdInput) {
int32_t previousRaw = m_selectedLine;
if (_raw > (int32_t)m_list.size()+offset ) {
m_selectedLine = -1;
} else {
m_selectedLine = _raw;
}
if (previousRaw != m_selectedLine) {
if( *propertyShowFolder == true
&& m_selectedLine == 0) {
// "." folder
signalFolderSelect.emit(".");
} else if ( *propertyShowFolder == true
&& m_selectedLine == 1) {
// ".." folder
signalFolderSelect.emit("..");
} else if( m_selectedLine-offset >= 0
&& m_selectedLine-offset < (int32_t)m_list.size()
&& nullptr != m_list[m_selectedLine-offset] ) {
// generate event extern :
switch(m_list[m_selectedLine-offset]->getNodeType()) {
case etk::typeNode_file :
signalFileSelect.emit(m_list[m_selectedLine-offset]->getNameFile());
break;
case etk::typeNode_folder :
signalFolderSelect.emit(m_list[m_selectedLine-offset]->getNameFile());
break;
default:
EWOL_ERROR("Can not generate event on an unknow type");
break;
}
}
} else {
if( *propertyShowFolder == true
&& m_selectedLine == 0) {
// "." folder
signalFolderValidate.emit(".");
} else if ( *propertyShowFolder == true
&& m_selectedLine == 1) {
// ".." folder
signalFolderValidate.emit("..");
} else if( m_selectedLine-offset >= 0
&& m_selectedLine-offset < (int32_t)m_list.size()
&& nullptr != m_list[m_selectedLine-offset] ) {
switch(m_list[m_selectedLine-offset]->getNodeType()) {
case etk::typeNode_file :
signalFileValidate.emit(m_list[m_selectedLine-offset]->getNameFile());
break;
case etk::typeNode_folder :
signalFolderValidate.emit(m_list[m_selectedLine-offset]->getNameFile());
break;
default:
EWOL_ERROR("Can not generate event on an unknow type");
break;
}
}
}
// need to regenerate the display of the list :
markToRedraw();
return true;
}
}
return false;
}
void ewol::widget::ListFileSystem::onChangePropertyPath() {
regenerateView();
}
void ewol::widget::ListFileSystem::onChangePropertyFile() {
setSelect(propertyFile);
}
void ewol::widget::ListFileSystem::onChangePropertyShowFile() {
regenerateView();
}
void ewol::widget::ListFileSystem::onChangePropertyShowFolder() {
regenerateView();
}
void ewol::widget::ListFileSystem::onChangePropertyShowHidden() {
regenerateView();
}
void ewol::widget::ListFileSystem::onChangePropertyFilter() {
regenerateView();
}