diff --git a/lutin_edn.py b/lutin_edn.py index bcf7110..50d173e 100644 --- a/lutin_edn.py +++ b/lutin_edn.py @@ -44,7 +44,8 @@ def configure(target, my_module): ]) # Gui: my_module.add_src_file([ - 'sources/appl/Gui/BufferView.cpp', + 'sources/appl/widget/BufferList.cpp', + 'sources/appl/widget/BufferTree.cpp', 'sources/appl/Gui/TextViewer.cpp', 'sources/appl/Gui/ViewerManager.cpp', 'sources/appl/Gui/MainWindows.cpp', diff --git a/sources/appl/Buffer.hpp b/sources/appl/Buffer.hpp index faabc55..4be3816 100644 --- a/sources/appl/Buffer.hpp +++ b/sources/appl/Buffer.hpp @@ -287,7 +287,7 @@ namespace appl { }; friend class Buffer; }; - public: + public: // signals esignal::Signal<> signalIsModify; esignal::Signal<> signalIsSave; esignal::Signal<> signalSelectChange; @@ -299,7 +299,7 @@ namespace appl { DECLARE_FACTORY(Buffer); virtual ~Buffer(); private: - bool m_hasFileName; //!< when new file, the buffer has no name ==> but it might be reference with a single name ... + bool m_hasFileName; //!< When new file, the buffer has no name ==> but it might be reference with a single name ... etk::String m_fileName; //!< name of the file (with his path) public: /** diff --git a/sources/appl/BufferManager.cpp b/sources/appl/BufferManager.cpp index 720cd67..9f94cb9 100644 --- a/sources/appl/BufferManager.cpp +++ b/sources/appl/BufferManager.cpp @@ -17,7 +17,9 @@ appl::BufferManager::BufferManager() : signalNewBuffer(this, "new-buffer", ""), signalSelectFile(this, "select-buffer", ""), signalTextSelectionChange(this, "text-selection-change", ""), - signalRemoveBuffer(this, "remove-buffer", "") { + signalRemoveBuffer(this, "remove-buffer", ""), + signalSelectBuffer(this, "select-buffer-2", ""), + signalNewBuffer2(this, "new-buffer-2", "") { addObjectType("appl::BufferManager"); } @@ -36,9 +38,11 @@ ememory::SharedPtr appl::BufferManager::createNewBuffer() { m_list.pushBack(tmp); APPL_INFO("Create a new Buffer"); signalNewBuffer.emit(tmp->getFileName()); + signalNewBuffer2.emit(tmp); APPL_INFO("Create a new Buffer (done)"); APPL_INFO("select Buffer"); signalSelectFile.emit(tmp->getFileName()); + signalSelectBuffer.emit(tmp); APPL_INFO("select Buffer (done)"); return tmp; } @@ -69,6 +73,7 @@ ememory::SharedPtr appl::BufferManager::get(const etk::String& _fi m_list.pushBack(tmp); APPL_INFO("Creata a open Buffer"); signalNewBuffer.emit(tmp->getFileName()); + signalNewBuffer2.emit(tmp); APPL_INFO("Creata a open Buffer (done)"); return tmp; } @@ -100,14 +105,18 @@ ememory::SharedPtr appl::BufferManager::get(int32_t _id) { } bool appl::BufferManager::exist(const etk::String& _fileName) { + APPL_WARNING(" Check if buffer exist: '" << _fileName << "'"); for (auto &it : m_list) { if (it == null) { continue; } + APPL_WARNING(" =?= '" << it->getFileName() << "'"); if (it->getFileName() == _fileName) { + APPL_WARNING(" ==> FIND..."); return true; } } + APPL_WARNING(" ==> NOT FOUND..."); return false; } @@ -117,6 +126,7 @@ void appl::BufferManager::open(const etk::String& _fileName) { if (exist(fileName) == true) { APPL_WARNING(" the element '" << fileName << "' already exist ... just reselect it ..."); signalSelectFile.emit(fileName); + signalSelectBuffer.emit(get(fileName)); propertySetOnWidgetNamed("appl-widget-display-name", "value", etk::FSNodeGetRealName(fileName)); return; } @@ -125,6 +135,7 @@ void appl::BufferManager::open(const etk::String& _fileName) { return; } signalSelectFile.emit(fileName); + signalSelectBuffer.emit(get(fileName)); propertySetOnWidgetNamed("appl-widget-display-name", "value", etk::FSNodeGetRealName(fileName)); } @@ -154,6 +165,7 @@ void appl::BufferManager::requestDestroyFromChild(const ememory::SharedPtrgetFileName()); + signalSelectBuffer.emit(*it); propertySetOnWidgetNamed("appl-widget-display-name", "value", etk::FSNodeGetRealName((*it)->getFileName())); APPL_VERBOSE("Remove buffer select new one (done)"); return; @@ -162,11 +174,13 @@ void appl::BufferManager::requestDestroyFromChild(const ememory::SharedPtrgetFileName()); + signalSelectBuffer.emit(m_list.back()); propertySetOnWidgetNamed("appl-widget-display-name", "value", etk::FSNodeGetRealName(m_list.back()->getFileName())); APPL_VERBOSE("Remove buffer select new one (done)"); return; } signalSelectFile.emit(""); + signalSelectBuffer.emit(null); propertySetOnWidgetNamed("appl-widget-display-name", "value", "---"); m_bufferSelected = null; } diff --git a/sources/appl/BufferManager.hpp b/sources/appl/BufferManager.hpp index 8a830fd..c0946a0 100644 --- a/sources/appl/BufferManager.hpp +++ b/sources/appl/BufferManager.hpp @@ -16,15 +16,17 @@ namespace appl { using BufferManagerWeak = ememory::WeakPtr; // TODO: This is a service ... class BufferManager : public ewol::Object { - public: + public: // signals: esignal::Signal signalNewBuffer; esignal::Signal signalSelectFile; esignal::Signal<> signalTextSelectionChange; esignal::Signal> signalRemoveBuffer; + esignal::Signal> signalSelectBuffer; + esignal::Signal> signalNewBuffer2; protected: BufferManager(); public: - DECLARE_SINGLE_FACTORY(BufferManager, "???Buffer_Manager???"); + DECLARE_SINGLE_FACTORY(BufferManager, "???BufferManager???"); virtual ~BufferManager(); private: etk::Vector> m_list; // list of all buffer curently open diff --git a/sources/appl/Gui/BufferView.hpp b/sources/appl/Gui/BufferView.hpp deleted file mode 100644 index 97a205b..0000000 --- a/sources/appl/Gui/BufferView.hpp +++ /dev/null @@ -1,79 +0,0 @@ -/** @file - * @author Edouard DUPIN - * @copyright 2010, Edouard DUPIN, all right reserved - * @license GPL v3 (see license file) - */ -#pragma once - -#include -#include -#include -#include -#include - -namespace appl { - class dataBufferStruct { - public: - etk::FSNode m_bufferName; - ememory::SharedPtr m_buffer; - dataBufferStruct() { - - }; - dataBufferStruct(const etk::String& _bufferName, const ememory::SharedPtr& _buffer) : - m_bufferName(_bufferName), - m_buffer(_buffer) { - - }; - virtual ~dataBufferStruct() { }; - }; -}; - - class BufferView; - using BufferViewShared = ememory::SharedPtr; - using BufferViewWeak = ememory::WeakPtr; -class BufferView : public ewol::widget::List { - private: - ememory::SharedPtr m_bufferManager; //!< handle on the buffer manager - private: - ememory::SharedPtr m_paintingProperties; //!< element painting property - int32_t m_colorBackground1; - int32_t m_colorBackground2; - int32_t m_colorBackgroundSelect; - int32_t m_colorTextNormal; - int32_t m_colorTextModify; - private: - int32_t m_selectedIdRequested; - int32_t m_selectedID; - etk::Vector m_list; - /** - * @brief Insert the element in the alphabetic order. - * @param[in] _dataStruct element to add. - */ - void insertAlphabetic(const appl::dataBufferStruct& _dataStruct, bool _selectNewPosition = false); - protected: - // Constructeur - BufferView(); - void init() override; - public: - DECLARE_FACTORY(BufferView); - virtual ~BufferView(); - private: - bool m_openOrderMode; //!< true if the order is the opening order mode, otherwise, Alphabetic order - protected: - // function call to display the list : - etk::Color<> getBasicBG() override; - void removeAllElement(); - // Derived function - ivec2 getMatrixSize() const override; - fluorine::Variant getData(int32_t _role, const ivec2& _pos) override; - bool onItemEvent(const ewol::event::Input& _event, const ivec2& _pos, const vec2& _mousePosition) override; - private: //callback function: - void onCallbackChangeName(); - void onCallbackIsSave(); - void onCallbackIsModify(); - void onCallbackNewBuffer(const etk::String& _value); - void onCallbackselectNewFile(const etk::String& _value); - void onCallbackBufferRemoved(const ememory::SharedPtr& _buffer); - void calculateMinMaxSize() override; -}; - diff --git a/sources/appl/Gui/MainWindows.cpp b/sources/appl/Gui/MainWindows.cpp index 580d050..d30b059 100644 --- a/sources/appl/Gui/MainWindows.cpp +++ b/sources/appl/Gui/MainWindows.cpp @@ -6,7 +6,8 @@ #include #include #include -#include +#include +#include #include #include @@ -98,7 +99,8 @@ void MainWindows::init() { ewol::widget::SizerShared mySizerHori; ememory::SharedPtr myTextView; ememory::SharedPtr myTextView2; - ememory::SharedPtr myBufferView; + appl::widget::BufferListShared myBufferList; + appl::widget::BufferTreeShared myBufferTree; ewol::widget::MenuShared myMenu; // load buffer manager: @@ -113,13 +115,21 @@ void MainWindows::init() { mySizerHori->propertyName.set("plop 222222222"); mySizerHori->propertyMode.set(ewol::widget::Sizer::modeHori); mySizerVert->subWidgetAdd(mySizerHori); - myBufferView = BufferView::create(); - myBufferView->propertyName.set("plop 3333333"); - myBufferView->propertyExpand.set(bvec2(false,true)); - myBufferView->propertyFill.set(bvec2(true,true)); - //myBufferView->propertyMinSize.set(gale::Dimension(vec2(300,2), gale::distance::pixel)); - mySizerHori->subWidgetAdd(myBufferView); - + if (false) { + myBufferList = appl::widget::BufferList::create(); + myBufferList->propertyName.set("plop 3333333"); + myBufferList->propertyExpand.set(bvec2(false,true)); + myBufferList->propertyFill.set(bvec2(true,true)); + //myBufferList->propertyMinSize.set(gale::Dimension(vec2(300,2), gale::distance::pixel)); + mySizerHori->subWidgetAdd(myBufferList); + } else { + myBufferTree = appl::widget::BufferTree::create(); + myBufferTree->propertyName.set("plop 3333333"); + myBufferTree->propertyExpand.set(bvec2(false,true)); + myBufferTree->propertyFill.set(bvec2(true,true)); + myBufferTree->propertyMinSize.set(gale::Dimension(vec2(300,2), gale::distance::pixel)); + mySizerHori->subWidgetAdd(myBufferTree); + } ewol::widget::SpacerShared mySpacer = ewol::widget::Spacer::create(); mySpacer->propertyName.set("appl-Buffer-viewer-separator"); mySpacer->propertyColor.set(etk::color::black); diff --git a/sources/appl/Gui/MainWindows.hpp b/sources/appl/Gui/MainWindows.hpp index 5ee12e7..acd60cf 100644 --- a/sources/appl/Gui/MainWindows.hpp +++ b/sources/appl/Gui/MainWindows.hpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include diff --git a/sources/appl/Gui/BufferView.cpp b/sources/appl/widget/BufferList.cpp similarity index 75% rename from sources/appl/Gui/BufferView.cpp rename to sources/appl/widget/BufferList.cpp index a1fe775..ffa656e 100644 --- a/sources/appl/Gui/BufferView.cpp +++ b/sources/appl/widget/BufferList.cpp @@ -5,7 +5,7 @@ */ #include #include -#include +#include #include //#include #include @@ -28,9 +28,9 @@ static void SortElementList(etk::Vector& _list) { } } -BufferView::BufferView() : +appl::widget::BufferList::BufferList() : m_openOrderMode(false) { - addObjectType("appl::BufferView"); + addObjectType("appl::BufferList"); m_selectedID = -1; m_selectedIdRequested = -1; // load buffer manager: @@ -45,23 +45,23 @@ BufferView::BufferView() : m_colorTextModify = m_paintingProperties->request("textModify"); } -void BufferView::init() { +void appl::widget::BufferList::init() { ewol::widget::List::init(); propertyHide.set(true); propertyCanFocus.set(true); if (m_bufferManager != null) { - m_bufferManager->signalNewBuffer.connect(sharedFromThis(), &BufferView::onCallbackNewBuffer); - m_bufferManager->signalSelectFile.connect(sharedFromThis(), &BufferView::onCallbackselectNewFile); - m_bufferManager->signalRemoveBuffer.connect(sharedFromThis(), &BufferView::onCallbackBufferRemoved); + m_bufferManager->signalNewBuffer.connect(sharedFromThis(), &appl::widget::BufferList::onCallbackNewBuffer); + m_bufferManager->signalSelectFile.connect(sharedFromThis(), &appl::widget::BufferList::onCallbackselectNewFile); + m_bufferManager->signalRemoveBuffer.connect(sharedFromThis(), &appl::widget::BufferList::onCallbackBufferRemoved); } } -BufferView::~BufferView() { +appl::widget::BufferList::~BufferList() { removeAllElement(); } -void BufferView::calculateMinMaxSize() { +void appl::widget::BufferList::calculateMinMaxSize() { /*int32_t fontId = getDefaultFontId(); int32_t minWidth = ewol::getWidth(fontId, m_label); int32_t minHeight = ewol::getHeight(fontId); @@ -71,11 +71,11 @@ void BufferView::calculateMinMaxSize() { m_minSize.setValue(300, 150); } -void BufferView::removeAllElement() { +void appl::widget::BufferList::removeAllElement() { m_list.clear(); } -void BufferView::insertAlphabetic(const appl::dataBufferStruct& _dataStruct, bool _selectNewPosition) { +void appl::widget::BufferList::insertAlphabetic(const appl::dataBufferStruct& _dataStruct, bool _selectNewPosition) { // alphabetical order: for (size_t iii = 0; iii < m_list.size(); ++iii) { if (m_list[iii].m_bufferName.getNameFile().toLower() > _dataStruct.m_bufferName.getNameFile().toLower()) { @@ -92,15 +92,15 @@ void BufferView::insertAlphabetic(const appl::dataBufferStruct& _dataStruct, boo } } -void BufferView::onCallbackNewBuffer(const etk::String& _value) { +void appl::widget::BufferList::onCallbackNewBuffer(const etk::String& _value) { ememory::SharedPtr buffer = m_bufferManager->get(_value); if (buffer == null) { APPL_ERROR("event on element nor exist : " << _value); return; } - buffer->signalIsSave.connect(sharedFromThis(), &BufferView::onCallbackIsSave); - buffer->signalIsModify.connect(sharedFromThis(), &BufferView::onCallbackIsModify); - buffer->signalChangeName.connect(sharedFromThis(), &BufferView::onCallbackChangeName); + buffer->signalIsSave.connect(sharedFromThis(), &BufferList::onCallbackIsSave); + buffer->signalIsModify.connect(sharedFromThis(), &BufferList::onCallbackIsModify); + buffer->signalChangeName.connect(sharedFromThis(), &BufferList::onCallbackChangeName); appl::dataBufferStruct tmp(_value, buffer); if (m_openOrderMode == true) { m_list.pushBack(tmp); @@ -118,7 +118,7 @@ void BufferView::onCallbackNewBuffer(const etk::String& _value) { } // TODO : Review this callback with the real shared_ptr on the buffer ... -void BufferView::onCallbackselectNewFile(const etk::String& _value) { +void appl::widget::BufferList::onCallbackselectNewFile(const etk::String& _value) { m_selectedID = -1; for (size_t iii=0; iiigetFileName()) { m_list[iii].m_bufferName = m_list[iii].m_buffer->getFileName(); @@ -149,7 +149,7 @@ void BufferView::onCallbackChangeName() { markToRedraw(); } -void BufferView::onCallbackBufferRemoved(const ememory::SharedPtr& _buffer) { +void appl::widget::BufferList::onCallbackBufferRemoved(const ememory::SharedPtr& _buffer) { APPL_ERROR("request remove buffer:"); auto it = m_list.begin(); while (it != m_list.end()) { @@ -167,22 +167,22 @@ void BufferView::onCallbackBufferRemoved(const ememory::SharedPtr& } markToRedraw(); } -void BufferView::onCallbackIsSave() { +void appl::widget::BufferList::onCallbackIsSave() { markToRedraw(); } -void BufferView::onCallbackIsModify() { +void appl::widget::BufferList::onCallbackIsModify() { markToRedraw(); } -etk::Color<> BufferView::getBasicBG() { +etk::Color<> appl::widget::BufferList::getBasicBG() { return (*m_paintingProperties)[m_colorBackground1].getForeground(); } -ivec2 BufferView::getMatrixSize() const { +ivec2 appl::widget::BufferList::getMatrixSize() const { return ivec2(1,m_list.size()); } -fluorine::Variant BufferView::getData(int32_t _role, const ivec2& _pos) { +fluorine::Variant appl::widget::BufferList::getData(int32_t _role, const ivec2& _pos) { switch (_role) { case ewol::widget::ListRole::Text: return m_list[_pos.y()].m_bufferName.getNameFile();; @@ -201,12 +201,14 @@ fluorine::Variant BufferView::getData(int32_t _role, const ivec2& _pos) { return (*m_paintingProperties)[m_colorBackground1].getForeground(); } return (*m_paintingProperties)[m_colorBackground2].getForeground(); + case ewol::widget::ListRole::IsSelected: + return m_selectedID == _pos.y(); } return fluorine::Variant(); } -bool BufferView::onItemEvent(const ewol::event::Input& _event, const ivec2& _pos, const vec2& _mousePosition) { +bool appl::widget::BufferList::onItemEvent(const ewol::event::Input& _event, const ivec2& _pos, const vec2& _mousePosition) { if ( _event.getId() == 1 && _event.getStatus() == gale::key::status::pressSingle) { APPL_INFO("Event on List: " << _event << " pos=" << _pos ); @@ -214,7 +216,7 @@ bool BufferView::onItemEvent(const ewol::event::Input& _event, const ivec2& _pos && _pos.y() < (int64_t)m_list.size()) { if (m_list[_pos.y()].m_buffer != null) { if (m_bufferManager != null) { - APPL_INFO("Select file :" << m_list[_pos.y()].m_buffer->getFileName() << " in list"); + APPL_INFO("Select file: '" << m_list[_pos.y()].m_buffer->getFileName() << "' in list"); m_bufferManager->open(m_list[_pos.y()].m_buffer->getFileName()); } return true; diff --git a/sources/appl/widget/BufferList.hpp b/sources/appl/widget/BufferList.hpp new file mode 100644 index 0000000..fd395be --- /dev/null +++ b/sources/appl/widget/BufferList.hpp @@ -0,0 +1,83 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2010, Edouard DUPIN, all right reserved + * @license GPL v3 (see license file) + */ +#pragma once + +#include +#include +#include +#include +#include + +namespace appl { + class dataBufferStruct { + public: + etk::FSNode m_bufferName; + ememory::SharedPtr m_buffer; + dataBufferStruct() { + + }; + dataBufferStruct(const etk::String& _bufferName, const ememory::SharedPtr& _buffer) : + m_bufferName(_bufferName), + m_buffer(_buffer) { + + }; + virtual ~dataBufferStruct() { }; + }; +}; + +namespace appl { + namespace widget { + class BufferList; + using BufferListShared = ememory::SharedPtr; + using BufferListWeak = ememory::WeakPtr; + + class BufferList : public ewol::widget::List { + private: + ememory::SharedPtr m_bufferManager; //!< handle on the buffer manager + private: + ememory::SharedPtr m_paintingProperties; //!< element painting property + int32_t m_colorBackground1; + int32_t m_colorBackground2; + int32_t m_colorBackgroundSelect; + int32_t m_colorTextNormal; + int32_t m_colorTextModify; + private: + int32_t m_selectedIdRequested; + int32_t m_selectedID; + etk::Vector m_list; + /** + * @brief Insert the element in the alphabetic order. + * @param[in] _dataStruct element to add. + */ + void insertAlphabetic(const appl::dataBufferStruct& _dataStruct, bool _selectNewPosition = false); + protected: + // Constructeur + BufferList(); + void init() override; + public: + DECLARE_FACTORY(BufferList); + virtual ~BufferList(); + private: + bool m_openOrderMode; //!< true if the order is the opening order mode, otherwise, Alphabetic order + protected: + // function call to display the list : + etk::Color<> getBasicBG() override; + void removeAllElement(); + // Derived function + ivec2 getMatrixSize() const override; + fluorine::Variant getData(int32_t _role, const ivec2& _pos) override; + bool onItemEvent(const ewol::event::Input& _event, const ivec2& _pos, const vec2& _mousePosition) override; + private: //callback function: + void onCallbackChangeName(); + void onCallbackIsSave(); + void onCallbackIsModify(); + void onCallbackNewBuffer(const etk::String& _value); + void onCallbackselectNewFile(const etk::String& _value); + void onCallbackBufferRemoved(const ememory::SharedPtr& _buffer); + void calculateMinMaxSize() override; + }; + } +} diff --git a/sources/appl/widget/BufferTree.cpp b/sources/appl/widget/BufferTree.cpp new file mode 100644 index 0000000..8a42b88 --- /dev/null +++ b/sources/appl/widget/BufferTree.cpp @@ -0,0 +1,305 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2010, Edouard DUPIN, all right reserved + * @license GPL v3 (see license file) + */ +#include +#include +#include +#include +//#include +#include +#include + +// TODO : write it better +static void SortElementList(etk::Vector& _list) { + etk::Vector tmpList = _list; + _list.clear(); + for(size_t iii=0; iii _list[jjj].m_bufferName.getNameFile()) { + findPos = jjj+1; + } + } + //EWOL_DEBUG("position="<request("backgroung1"); + m_colorBackground2 = m_paintingProperties->request("backgroung2"); + m_colorBackgroundSelect = m_paintingProperties->request("backgroungSelected"); + m_colorTextNormal = m_paintingProperties->request("textNormal"); + m_colorTextModify = m_paintingProperties->request("textModify"); +} + +void appl::widget::BufferTree::init() { + ewol::widget::TreeView::init(); + //propertyHide.set(true); + propertyCanFocus.set(true); + if (m_bufferManager != null) { + m_bufferManager->signalNewBuffer2.connect(sharedFromThis(), &appl::widget::BufferTree::onNewBuffer); + m_bufferManager->signalSelectBuffer.connect(sharedFromThis(), &appl::widget::BufferTree::onSelectBuffer); + m_bufferManager->signalRemoveBuffer.connect(sharedFromThis(), &appl::widget::BufferTree::onRemoveBuffer); + } +} + +static etk::String getCommonPathPart(const etk::String& _left, const etk::String& _right) { + etk::String out; + for (size_t iii=0; iii < etk::min(_left.size(), _right.size()); ++iii) { + if (_left[iii] == _right[iii]) { + out += _left[iii]; + continue; + } + break; + } + return out; +} + +void appl::widget::BufferTree::updateFlatTree() { + // Brut Force Mode... + etk::String upperParent = ""; + etk::Vector tmpNewBuffer; + for (auto& it : *m_bufferManager) { + if (it == null) { + continue; + } + if (it->hasFileName() == false) { + tmpNewBuffer.pushBack(it); + continue; + } + etk::FSNode nodeName = it->getFileName(); + if (upperParent == "") { + upperParent = nodeName.getNameFolder(); + APPL_ERROR("init root: " << nodeName.getFileSystemName() << " root=" << upperParent); + continue; + } + upperParent = getCommonPathPart(upperParent, nodeName.getNameFolder()); + APPL_ERROR("Update: " << nodeName.getFileSystemName() << " " << nodeName.getNameFolder() << " root=" << upperParent); + } + // Now we have the root path... + // Need to feed all elements needed + etk::FSNode nodeRoot = upperParent; + m_tree = etk::TreeNode::create(TreeElement(upperParent, true, true)); + etk::Vector child = nodeRoot.folderGetSubList(false, true, true, false); + for (auto& it: child) { + APPL_WARNING("add element: " << *it); + if (it->getNodeType() == etk::typeNode_folder) { + auto elem = etk::TreeNode::create(TreeElement(it->getNameFile(), true, false)); + m_tree->addChild(elem); + } else { + auto elem = etk::TreeNode::create(TreeElement(it->getNameFile(), false, false)); + m_tree->addChild(elem); + } + // TODO: ETK_FREE(etk::FSNode, it); + } + + m_flatTree.setRoot(m_tree, + [&](const TreeElement& _value){ + return true; + }, + [&](const TreeElement& _value){ + return _value.m_isExpand; + }); + + markToRedraw(); +} + + + +appl::widget::BufferTree::~BufferTree() { + removeAllElement(); +} + + +void appl::widget::BufferTree::calculateMinMaxSize() { + /*int32_t fontId = getDefaultFontId(); + int32_t minWidth = ewol::getWidth(fontId, m_label); + int32_t minHeight = ewol::getHeight(fontId); + m_minSize.x = 3+minWidth; + m_minSize.y = 3+minHeight; + */ + m_minSize.setValue(300, 150); +} + +void appl::widget::BufferTree::removeAllElement() { + //m_list.clear(); +} + +void appl::widget::BufferTree::onNewBuffer(const ememory::SharedPtr& _buffer) { + updateFlatTree(); + /* + ememory::SharedPtr buffer = m_bufferManager->get(_value); + if (buffer == null) { + APPL_ERROR("event on element nor exist : " << _value); + return; + } + buffer->signalIsSave.connect(sharedFromThis(), &BufferTree::onCallbackIsSave); + buffer->signalIsModify.connect(sharedFromThis(), &BufferTree::onCallbackIsModify); + buffer->signalChangeName.connect(sharedFromThis(), &BufferTree::onCallbackChangeName); + appl::dataBufferStruct tmp(_value, buffer); + if (m_openOrderMode == true) { + m_list.pushBack(tmp); + } else { + insertAlphabetic(tmp); + } + if (m_list.size() <= 1) { + propertyHide.set(true); + propertySetOnWidgetNamed("appl-Buffer-viewer-separator", "hide", "true"); + } else { + propertyHide.set(false); + propertySetOnWidgetNamed("appl-Buffer-viewer-separator", "hide", "false"); + } + markToRedraw(); + */ +} + +void appl::widget::BufferTree::onSelectBuffer(const ememory::SharedPtr& _buffer) { + #if 1 + m_selection = _buffer; + updateFlatTree(); + #else + auto elem = m_tree.findIf([&](const TreeNode& _element) { + if (_element.getData().m_buffer == _buffer) { + return true; + } + return false; + }); + for (auto& it: elem) { + _element.getData().m_isSelected = true; + // TODO: expand all this parents... + } + updateFlatTree(); + #endif +} + +void appl::widget::BufferTree::onCallbackChangeName() { + /* + for (size_t iii = 0; iii < m_list.size(); ++iii) { + if (m_list[iii].m_bufferName != m_list[iii].m_buffer->getFileName()) { + m_list[iii].m_bufferName = m_list[iii].m_buffer->getFileName(); + if (m_openOrderMode == false) { + // re-order the fine in the correct position + appl::dataBufferStruct tmp = m_list[iii]; + m_list.erase(m_list.begin() + iii); + insertAlphabetic(tmp, ((int64_t)iii == m_selectedID)); + break; + } + } + } + */ + markToRedraw(); +} + +void appl::widget::BufferTree::onRemoveBuffer(const ememory::SharedPtr& _buffer) { + APPL_ERROR("request remove buffer:"); + auto elem = m_tree->findIf([&](const etk::TreeNode& _element) { + if (_element.getData().m_buffer == _buffer) { + return true; + } + return false; + }); + for (auto& it: elem) { + it->getData().m_isSelected = false; + it->getData().m_buffer = null; + } + markToRedraw(); +} + +void appl::widget::BufferTree::onCallbackIsSave() { + markToRedraw(); +} + +void appl::widget::BufferTree::onCallbackIsModify() { + markToRedraw(); +} + +etk::Color<> appl::widget::BufferTree::getBasicBG() { + return etk::Color<>(0xAF,0xAF,0xAF,0xFF); + return (*m_paintingProperties)[m_colorBackground1].getForeground(); +} + +ivec2 appl::widget::BufferTree::getMatrixSize() const { + return ivec2(1, m_flatTree.size()); +} + +fluorine::Variant appl::widget::BufferTree::getData(int32_t _role, const ivec2& _pos) { + auto elem = m_flatTree[_pos.y()]; + appl::TreeElement& value = elem->getData(); + switch (_role) { + case ewol::widget::ListRole::Text: + return value.m_nodeName; + case ewol::widget::ListRole::FgColor: + /*if ( m_list[_pos.y()].m_buffer != null + && m_list[_pos.y()].m_buffer->isModify() == false) { + return (*m_paintingProperties)[m_colorTextNormal].getForeground(); + } else {*/ + return (*m_paintingProperties)[m_colorTextModify].getForeground(); + //} + case ewol::widget::ListRole::BgColor: + return fluorine::Variant(); + if (_pos.y() % 2) { + return (*m_paintingProperties)[m_colorBackground1].getForeground(); + } + return (*m_paintingProperties)[m_colorBackground2].getForeground(); + case ewol::widget::ListRole::Icon: + /* + if (elem->countToRoot() == 0) { + return "{ewol}THEME:GUI:Home.svg"; + }*/ + + if (value.m_isFolder == true) { + return "{ewol}THEME:GUI:Folder.svg"; + } else { + return "{ewol}THEME:GUI:File.svg"; + } + return ""; + case ewol::widget::ListRole::DistanceToRoot: + return uint_t(elem->countToRoot()); + case ewol::widget::ListRole::HaveChild: + return elem->haveChild(); + case ewol::widget::ListRole::IsExpand: + return value.m_isExpand; + case ewol::widget::ListRole::IsSelected: + return false; + } + return fluorine::Variant(); +} + + +bool appl::widget::BufferTree::onItemEvent(const ewol::event::Input& _event, const ivec2& _pos, const vec2& _mousePosition) { + if (ewol::widget::TreeView::onItemEvent(_event, _pos, _mousePosition) == true) { + return true; + } + if ( _event.getId() == 1 + && _event.getStatus() == gale::key::status::pressSingle) { + APPL_INFO("Event on List: " << _event << " pos=" << _pos ); + /* + if( _pos.y() >= 0 + && _pos.y() < (int64_t)m_list.size()) { + if (m_list[_pos.y()].m_buffer != null) { + if (m_bufferManager != null) { + APPL_INFO("Select file: '" << m_list[_pos.y()].m_buffer->getFileName() << "' in list"); + m_bufferManager->open(m_list[_pos.y()].m_buffer->getFileName()); + } + return true; + } + } + */ + } + return false; +} + + diff --git a/sources/appl/widget/BufferTree.hpp b/sources/appl/widget/BufferTree.hpp new file mode 100644 index 0000000..5283649 --- /dev/null +++ b/sources/appl/widget/BufferTree.hpp @@ -0,0 +1,82 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2010, Edouard DUPIN, all right reserved + * @license GPL v3 (see license file) + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace appl { + class TreeElement { + public: + TreeElement(const etk::String& _nodeName, bool _isFolder = false, bool _isExpand=false): + m_nodeName(_nodeName), + m_isFolder(_isFolder), + m_buffer(null), + m_isSelected(false), + m_isExpand(_isExpand) { + + } + etk::String m_nodeName; // must be here ==> the buffer is optionnal.. + bool m_isFolder; + ememory::SharedPtr m_buffer; + bool m_isSelected = false; + bool m_isExpand = false; + }; + namespace widget { + + class BufferTree; + using BufferTreeShared = ememory::SharedPtr; + using BufferTreeWeak = ememory::WeakPtr; + + class BufferTree : public ewol::widget::TreeView { + private: + ememory::SharedPtr m_bufferManager; //!< handle on the buffer manager + private: + ememory::SharedPtr m_paintingProperties; //!< element painting property + int32_t m_colorBackground1; + int32_t m_colorBackground2; + int32_t m_colorBackgroundSelect; + int32_t m_colorTextNormal; + int32_t m_colorTextModify; + private: + int32_t m_selectedIdRequested; + int32_t m_selectedID; + void updateFlatTree(); + ememory::SharedPtr> m_tree; + etk::FlatTree m_flatTree; + ememory::SharedPtr m_selection; + protected: + // Constructeur + BufferTree(); + void init() override; + public: + DECLARE_FACTORY(BufferTree); + virtual ~BufferTree(); + private: + bool m_openOrderMode; //!< true if the order is the opening order mode, otherwise, Alphabetic order + protected: + // function call to display the list : + etk::Color<> getBasicBG() override; + void removeAllElement(); + // Derived function + ivec2 getMatrixSize() const override; + fluorine::Variant getData(int32_t _role, const ivec2& _pos) override; + bool onItemEvent(const ewol::event::Input& _event, const ivec2& _pos, const vec2& _mousePosition) override; + private: //callback function: + void onCallbackChangeName(); + void onCallbackIsSave(); + void onCallbackIsModify(); + void onNewBuffer(const ememory::SharedPtr& _buffer); + void onSelectBuffer(const ememory::SharedPtr& _buffer); + void onRemoveBuffer(const ememory::SharedPtr& _buffer); + void calculateMinMaxSize() override; + }; + } +}