[DEV] better integration of the file chooser

This commit is contained in:
Edouard DUPIN 2017-02-03 22:26:32 +01:00
parent 9c8a3513a6
commit 3acf0bd148
5 changed files with 95 additions and 67 deletions

View File

@ -0,0 +1,50 @@
<popup>
<sizer mode="vert" lock="true" fill="true" expand="true">
<sizer mode="hori">
<checkbox name="[{ID}]file-shooser:show-hiden-file">
<label>_T{ShowHiddenFiles}</label>
</checkbox>
<spacer expand="true,false"/>
<button name="[{ID}]file-shooser:button-validate">
<sizer mode="hori">
<image src="{ewol}THEME:GUI:Load.edf" fill="true" size="7,7mm" distance-field="true"/>
<label name="[{ID}]file-shooser:validate-label">_T{Validate}</label>
</sizer>
</button>
<button name="[{ID}]file-shooser:button-cancel">
<sizer mode="hori">
<image src="{ewol}THEME:GUI:Remove.edf" fill="true" size="7,7mm" distance-field="true"/>
<label name="[{ID}]file-shooser:cancel-label">_T{Cancel}</label>
</sizer>
</button>
</sizer>
<sizer mode="hori">
<spacer min-size="2,2mm"/>
<ListFileSystem name="[{ID}]file-shooser:list-folder"
min-size="20,0%"
expand="false,true"
show-hidden="false"
show-file="false"
show-folder="true"
show-temporary="false"/>
<spacer min-size="2,2mm"/>
<ListFileSystem name="[{ID}]file-shooser:list-files"
expand="true,true"
show-hidden="false"
show-file="true"
show-folder="false"
show-temporary="false"/>
<spacer min-size="2,2mm"/>
</sizer>
<sizer mode="hori">
<image name="[{ID}]file-shooser:img-file" src="{ewol}THEME:GUI:File.edf" expand="false" size="8,8mm" distance-field="true"/>
<entry name="[{ID}]file-shooser:entry-file" expand="true,false" fill="true,false"/>
</sizer>
<sizer mode="hori">
<image name="[{ID}]file-shooser:img-folder" src="{ewol}THEME:GUI:Folder.edf" expand="false" size="8,8mm" distance-field="true"/>
<entry name="[{ID}]file-shooser:entry-folder" expand="true,false" fill="true,false"/>
<image name="[{ID}]file-shooser:img-home" src="{ewol}THEME:GUI:Home.edf" expand="false" size="8,8mm" distance-field="true"/>
</sizer>
<label name="[{ID}]file-shooser:title-label">_T{Title}</label>
</sizer>
</popup>

View File

@ -17,19 +17,29 @@ ewol::widget::Composer::Composer() :
// nothing to do ... // nothing to do ...
} }
static ewol::WidgetShared composerGenerate(bool _modeFile, const std::string& _data) { static ewol::WidgetShared composerGenerate(bool _modeFile, const std::string& _data, uint64_t _id) {
ewol::widget::Manager& widgetManager = ewol::getContext().getWidgetManager(); ewol::widget::Manager& widgetManager = ewol::getContext().getWidgetManager();
if (_data == "") { if (_data == "") {
return nullptr; return nullptr;
} }
exml::Document doc; exml::Document doc;
if (_modeFile == true) { if (_modeFile == true) {
if (doc.load(_data) == false) { std::string tmpData = etk::FSNodeReadAllData(_data);
// replace all elements:
if (_id != 0) {
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
}
if (doc.parse(tmpData) == false) {
EWOL_ERROR(" can not load file XML : " << _data); EWOL_ERROR(" can not load file XML : " << _data);
return nullptr; return nullptr;
} }
} else { } else {
if (doc.parse(_data) == false) { std::string tmpData = _data;
// replace all elements:
if (_id != 0) {
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
}
if (doc.parse(tmpData) == false) {
EWOL_ERROR(" can not load file XML string..."); EWOL_ERROR(" can not load file XML string...");
return nullptr; return nullptr;
} }
@ -64,21 +74,26 @@ static ewol::WidgetShared composerGenerate(bool _modeFile, const std::string& _d
return tmpWidget; return tmpWidget;
} }
ewol::WidgetShared ewol::widget::composerGenerateFile(const std::string& _data) { ewol::WidgetShared ewol::widget::composerGenerateFile(const std::string& _data, uint64_t _id) {
return composerGenerate(true, _data); return composerGenerate(true, _data, _id);
} }
ewol::WidgetShared ewol::widget::composerGenerateString(const std::string& _data) { ewol::WidgetShared ewol::widget::composerGenerateString(const std::string& _data, uint64_t _id) {
return composerGenerate(false, _data); return composerGenerate(false, _data, _id);
} }
ewol::widget::Composer::~Composer() { ewol::widget::Composer::~Composer() {
} }
bool ewol::widget::Composer::loadFromFile(const std::string& _fileName) { bool ewol::widget::Composer::loadFromFile(const std::string& _fileName, uint64_t _id) {
exml::Document doc; exml::Document doc;
if (doc.load(_fileName) == false) { std::string tmpData = etk::FSNodeReadAllData(_fileName);
// replace all elements:
if (_id != 0) {
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
}
if (doc.parse(tmpData) == false) {
EWOL_ERROR(" can not load file XML : " << _fileName); EWOL_ERROR(" can not load file XML : " << _fileName);
return false; return false;
} }
@ -101,9 +116,14 @@ bool ewol::widget::Composer::loadFromFile(const std::string& _fileName) {
return true; return true;
} }
bool ewol::widget::Composer::loadFromString(const std::string& _composerXmlString) { bool ewol::widget::Composer::loadFromString(const std::string& _composerXmlString, uint64_t _id) {
exml::Document doc; exml::Document doc;
if (doc.parse(_composerXmlString) == false) { std::string tmpData = _composerXmlString;
// replace all elements:
if (_id != 0) {
tmpData = etk::replace(tmpData, "{ID}", etk::to_string(_id));
}
if (doc.parse(tmpData) == false) {
EWOL_ERROR(" can not load file XML string..."); EWOL_ERROR(" can not load file XML string...");
return false; return false;
} }

View File

@ -35,21 +35,23 @@ namespace ewol {
/** /**
* @brief load a composition with a file * @brief load a composition with a file
* @param[in] _fileName Name of the file * @param[in] _fileName Name of the file
* @param[in] _id Unique ID that is used in replacing the balise "{ID}" inside the File (do nothing if == 0)
* @return true == > all done OK * @return true == > all done OK
* @return false == > some error occured * @return false == > some error occured
*/ */
bool loadFromFile(const std::string& _fileName); bool loadFromFile(const std::string& _fileName, uint64_t _id=0);
/** /**
* @brief load a composition with a file * @brief load a composition with a file
* @param[in] _composerXmlString xml to parse directly * @param[in] _composerXmlString xml to parse directly
* @param[in] _id Unique ID that is used in replacing the balise "{ID}" inside the String (do nothing if == 0)
* @return true == > all done OK * @return true == > all done OK
* @return false == > some error occured * @return false == > some error occured
*/ */
bool loadFromString(const std::string& _composerXmlString); bool loadFromString(const std::string& _composerXmlString, uint64_t _id=0);
private: private:
void requestDestroyFromChild(const ewol::ObjectShared& _child) override; void requestDestroyFromChild(const ewol::ObjectShared& _child) override;
}; };
ewol::WidgetShared composerGenerateString(const std::string& _data = ""); ewol::WidgetShared composerGenerateString(const std::string& _data = "", uint64_t _id=0);
ewol::WidgetShared composerGenerateFile(const std::string& _data = ""); ewol::WidgetShared composerGenerateFile(const std::string& _data = "", uint64_t _id=0);
}; };
}; };

View File

@ -56,58 +56,13 @@ ewol::widget::FileChooser::FileChooser() :
void ewol::widget::FileChooser::init() { void ewol::widget::FileChooser::init() {
ewol::widget::Composer::init(); ewol::widget::Composer::init();
std::string myDescription = std::string("") // Load file with replacing the "{ID}" with the local ID of the widget ==> obtain unique ID
+ "<popup >\n" loadFromFile("{ewol}DATA:ewol-gui-file-chooser.xml", getId());
+ " <sizer mode='vert' lock='true' fill='true' expand='true'>\n" // Basic replacement of labels
+ " <sizer mode='hori'>\n" propertySetOnWidgetNamed("[" + etk::to_string(getId()) + "]file-shooser:title-label", "value", propertyLabelTitle);
+ " <checkbox name='[" + etk::to_string(getId()) + "]file-shooser:show-hiden-file'>\n" propertySetOnWidgetNamed("[" + etk::to_string(getId()) + "]file-shooser:validate-label", "value", propertyLabelValidate);
+ " <label>_T{ShowHiddenFiles}</label>\n" propertySetOnWidgetNamed("[" + etk::to_string(getId()) + "]file-shooser:cancel-label", "value", propertyLabelCancel);
+ " </checkbox>\n"
+ " <spacer expand='true,false'/>\n"
+ " <button name='[" + etk::to_string(getId()) + "]file-shooser:button-validate'>\n"
+ " <sizer mode='hori'>\n"
+ " <image src='{ewol}THEME:GUI:Load.edf' fill='true' size='7,7mm' distance-field='true'/>\n"
+ " <label name='[" + etk::to_string(getId()) + "]file-shooser:validate-label'>" + *propertyLabelValidate + "</label>\n"
+ " </sizer>\n"
+ " </button>\n"
+ " <button name='[" + etk::to_string(getId()) + "]file-shooser:button-cancel'>\n"
+ " <sizer mode='hori'>\n"
+ " <image src='{ewol}THEME:GUI:Remove.edf' fill='true' size='7,7mm' distance-field='true'/>\n"
+ " <label name='[" + etk::to_string(getId()) + "]file-shooser:cancel-label'>" + *propertyLabelCancel + "</label>\n"
+ " </sizer>\n"
+ " </button>\n"
+ " </sizer>\n"
+ " <sizer mode='hori'>\n"
+ " <spacer min-size='2,2mm'/>\n"
+ " <ListFileSystem name='[" + etk::to_string(getId()) + "]file-shooser:list-folder'\n"
+ " min-size='20,0%'\n"
+ " expand='false,true'\n"
+ " show-hidden='false'\n"
+ " show-file='false'\n"
+ " show-folder='true'\n"
+ " show-temporary='false'/>\n"
+ " <spacer min-size='2,2mm'/>\n"
+ " <ListFileSystem name='[" + etk::to_string(getId()) + "]file-shooser:list-files'\n"
+ " expand='true,true'\n"
+ " show-hidden='false'\n"
+ " show-file='true'\n"
+ " show-folder='false'\n"
+ " show-temporary='false'/>\n"
+ " <spacer min-size='2,2mm'/>\n"
+ " </sizer>\n"
+ " <sizer mode='hori'>\n"
+ " <image name='[" + etk::to_string(getId()) + "]file-shooser:img-file' src='{ewol}THEME:GUI:File.edf' expand='false' size='8,8mm' distance-field='true'/>\n"
+ " <entry name='[" + etk::to_string(getId()) + "]file-shooser:entry-file' expand='true,false' fill='true,false'/>\n"
+ " </sizer>\n"
+ " <sizer mode='hori'>\n"
+ " <image name='[" + etk::to_string(getId()) + "]file-shooser:img-folder' src='{ewol}THEME:GUI:Folder.edf' expand='false' size='8,8mm' distance-field='true'/>\n"
+ " <entry name='[" + etk::to_string(getId()) + "]file-shooser:entry-folder' expand='true,false' fill='true,false'/>\n"
+ " <image name='[" + etk::to_string(getId()) + "]file-shooser:img-home' src='{ewol}THEME:GUI:Home.edf' expand='false' size='8,8mm' distance-field='true'/>\n"
+ " </sizer>\n"
+ " <label name='[" + etk::to_string(getId()) + "]file-shooser:title-label'>" + *propertyLabelTitle + "</label>\n"
+ " </sizer>\n"
+ "</popup>";
loadFromString(myDescription);
subBind(ewol::widget::CheckBox, "[" + etk::to_string(getId()) + "]file-shooser:show-hiden-file", signalValue, sharedFromThis(), &ewol::widget::FileChooser::onCallbackHidenFileChangeChangeValue); subBind(ewol::widget::CheckBox, "[" + etk::to_string(getId()) + "]file-shooser:show-hiden-file", signalValue, sharedFromThis(), &ewol::widget::FileChooser::onCallbackHidenFileChangeChangeValue);
subBind(ewol::widget::Button, "[" + etk::to_string(getId()) + "]file-shooser:button-validate", signalPressed, sharedFromThis(), &ewol::widget::FileChooser::onCallbackListValidate); subBind(ewol::widget::Button, "[" + etk::to_string(getId()) + "]file-shooser:button-validate", signalPressed, sharedFromThis(), &ewol::widget::FileChooser::onCallbackListValidate);
subBind(ewol::widget::Button, "[" + etk::to_string(getId()) + "]file-shooser:button-cancel", signalPressed, sharedFromThis(), &ewol::widget::FileChooser::onCallbackButtonCancelPressed); subBind(ewol::widget::Button, "[" + etk::to_string(getId()) + "]file-shooser:button-cancel", signalPressed, sharedFromThis(), &ewol::widget::FileChooser::onCallbackButtonCancelPressed);

View File

@ -236,6 +236,7 @@ def configure(target, my_module):
my_module.copy_path('data/texturedDF.*','') my_module.copy_path('data/texturedDF.*','')
my_module.copy_path('data/fontDistanceField/*','fontDistanceField') my_module.copy_path('data/fontDistanceField/*','fontDistanceField')
my_module.copy_path('data/translate/*','translate/ewol') my_module.copy_path('data/translate/*','translate/ewol')
my_module.copy_path('data/ewol-gui-*.xml')
# name of the dependency # name of the dependency
my_module.add_depend([ my_module.add_depend([