/** @file * @author Edouard DUPIN * @copyright 2011, Edouard DUPIN, all right reserved * @license MPL v2.0 (see license file) */ #include #include #include #include #include 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", etk::Path("/"), "Path to display", ewol::widget::ListFileSystem::onChangePropertyPath), propertyFile(this, "select", etk::Path(), "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), this.selectedLine(-1) { addObjectType("ewol::widget::ListFileSystem"); #if defined(__TARGET_OS__Windows) propertyPath.setDirectCheck("c:/"); #endif this.colorProperty = ewol::resource::ColorFile::create("THEME_COLOR:///ListFileSystem.json?lib=ewol"); if (this.colorProperty != null) { this.colorIdText = this.colorProperty.request("text"); this.colorIdBackground1 = this.colorProperty.request("background1"); this.colorIdBackground2 = this.colorProperty.request("background2"); this.colorIdBackgroundSelected = this.colorProperty.request("selected"); } setMouseLimit(2); } ewol::widget::ListFileSystem::~ListFileSystem() { clearList(); } void ewol::widget::ListFileSystem::clearList() { this.list.clear(); } etk::Color<> ewol::widget::ListFileSystem::getBasicBG() { return this.colorProperty.get(this.colorIdBackground1); } static boolean localSort( etk::Path _left, etk::Path _right) { return _left.getString().toUpper() <= _right.getString().toUpper(); } void ewol::widget::ListFileSystem::regenerateView() { clearList(); this.selectedLine = -1; this.list.clear(); this.originScrooled.setValue(0,0); uint flags = 0; if (*propertyShowHidden == true) { flags |= etk::path::LIST_HIDDEN; } if (*propertyShowFolder == true) { flags |= etk::path::LIST_FOLDER; } if (*propertyShowFile == true) { flags |= etk::path::LIST_FILE; } this.list = etk::path::list(*propertyPath, flags); Log.error("Lsit of element: " + this.list.size() ); // Sort the list: etk::algorithm::quickSort(this.list, localSort); // request a redraw ... markToRedraw(); } etk::Path ewol::widget::ListFileSystem::getSelect() { String tmpVal = ""; if (this.selectedLine >= 0) { tmpVal = this.list[this.selectedLine].getFileName(); } return tmpVal; } // select the specific file void ewol::widget::ListFileSystem::setSelect( etk::Path _data) { // remove selected line this.selectedLine = -1; // search the coresponding file : for (int iii=0; iii= 0 LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM _pos.y()-offset < (int)this.list.size()) { Log.verbose("get filename for : '" + this.list[_pos.y()-offset] + ":'" + this.list[_pos.y()-offset].getFileName() + "'"); return this.list[_pos.y()-offset].getFileName(); } } return "+>>"; case ListRole::FgColor: return this.colorProperty.get(this.colorIdText); case ListRole::BgColor: if (this.selectedLine == _pos.y()) { return this.colorProperty.get(this.colorIdBackgroundSelected); } if (_pos.y() % 2) { return this.colorProperty.get(this.colorIdBackground1); } return this.colorProperty.get(this.colorIdBackground2); } return fluorine::Variant(); } boolean ewol::widget::ListFileSystem::onItemEvent( ewol::event::Input _event, Vector2i _pos, Vector2f _mousePosition) { int offset = 0; if (*propertyShowFolder == true) { if (*propertyPath == "/") { offset = 1; } else { offset = 2; } } if ( _event.getStatus() == KeyStatus::pressSingle || _event.getStatus() == KeyStatus::pressDouble) { Log.verbose("Event on List : IdInput=" + _event.getId() + " _pos=" + _pos ); if (1 == _event.getId()) { if (_pos.y() > (int)this.list.size()+offset ) { this.selectedLine = -1; } else { this.selectedLine = _pos.y(); } if( *propertyShowFolder == true LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.selectedLine == 0) { // "." folder if (_event.getStatus() == KeyStatus::pressSingle) { signalFolderSelect.emit(*propertyPath); } else { signalFolderValidate.emit(*propertyPath); } } else if ( *propertyShowFolder == true LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.selectedLine == 1) { // ".." folder if (_event.getStatus() == KeyStatus::pressSingle) { signalFolderSelect.emit(propertyPath.getParent()); } else { signalFolderValidate.emit(propertyPath.getParent()); } } else if( this.selectedLine-offset >= 0 LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.selectedLine-offset < (int)this.list.size() ) { // generate event extern: if(etk::path::isDirectory(this.list[this.selectedLine-offset])) { if (_event.getStatus() == KeyStatus::pressSingle) { signalFolderSelect.emit(this.list[this.selectedLine-offset]); } else { signalFolderValidate.emit(this.list[this.selectedLine-offset]); } } else { if (_event.getStatus() == KeyStatus::pressSingle) { signalFileSelect.emit(this.list[this.selectedLine-offset]); } else { signalFileValidate.emit(this.list[this.selectedLine-offset]); } } } // need to regenerate the display of the list : markToRedraw(); return true; } } return false; } void ewol::widget::ListFileSystem::onChangePropertyPath() { Log.warning("Change Path: " + *propertyPath + " selected File=" + *propertyFile);; 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(); }