From: caballero Date: Wed, 20 May 2009 15:00:31 +0000 (+0000) Subject: Added field edition capability. X-Git-Tag: EED.02Oct2009~60 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=d87a9f8f86d472c5ecaed70fa83f1e8a1024a450;p=creaImageIO.git Added field edition capability. --- diff --git a/src2/CMakeLists.txt b/src2/CMakeLists.txt index 68ff6fe..0ced6db 100644 --- a/src2/CMakeLists.txt +++ b/src2/CMakeLists.txt @@ -50,6 +50,7 @@ SET( SRCS creaImageIOWxGimmickTools creaImageIOWxCustomizeConfigPanel creaImageIOWxListenerPanel + creaImageIOWxEditFieldsPanel # BlockScopeWxApp diff --git a/src2/creaImageIOGimmick.cpp b/src2/creaImageIOGimmick.cpp index 3aae8a8..e54d1bf 100644 --- a/src2/creaImageIOGimmick.cpp +++ b/src2/creaImageIOGimmick.cpp @@ -391,6 +391,17 @@ namespace creaImageIO mImageAdder.DeleteDriveFromOtherDB(drive); } + //======================================================================== + void Gimmick::EditField(tree::Node* node, const std::string& d, const std::string& name, const std::string& key, const std::string& val) + { + TreeHandler * handler=GetTreeHandler(d); + mImageAdder.SetCurrentDatabase(d); + mImageAdder.SetTreeHandler(handler); + mImageAdder.EditField(node,name,key,val); + } + //======================================================================== + + ///////////////////////////////////////////////////////////////////////// // add DB from Settings file // // @param : - // diff --git a/src2/creaImageIOGimmick.h b/src2/creaImageIOGimmick.h index 09423fe..b8e2ee8 100644 --- a/src2/creaImageIOGimmick.h +++ b/src2/creaImageIOGimmick.h @@ -136,9 +136,12 @@ namespace creaImageIO ///Updates the settings file void UpdateSetting(const std::string& name, const std::string& value); - // add DB from Settings file + /// add DB from Settings file void addDBSettings(); + ///Edits the field described by the name and key provided with the value given + void EditField(tree::Node* node, const std::string& d, const std::string& name, const std::string& key, const std::string& val); + /// const std::string& GetHomeDirectory(); const std::string& GetUserSettingsDirectory(); diff --git a/src2/creaImageIOGimmickView.h b/src2/creaImageIOGimmickView.h index 4621dbd..bc160c5 100644 --- a/src2/creaImageIOGimmickView.h +++ b/src2/creaImageIOGimmickView.h @@ -86,6 +86,10 @@ namespace creaImageIO ///Copies selected files virtual void CopyFiles(const std::vector& filenames) { GimmickError("INTERNAL ERROR : CopyFiles not implemented"); } + + ///Edits the fields of a given node + virtual void CreateEditFieldsDialog(tree::Node* node, std::vector names, std::vector keys) + { GimmickError("INTERNAL ERROR : EditFields not implemented"); } ///Validates the dimension compliance of the images with the maximum and minimum given, and between their sizes bool ValidateSelected (tree::Node* sel, int min_dim, int max_dim); diff --git a/src2/creaImageIOTreeAttributeDescriptor.h b/src2/creaImageIOTreeAttributeDescriptor.h index ad4d7bf..68f0da9 100644 --- a/src2/creaImageIOTreeAttributeDescriptor.h +++ b/src2/creaImageIOTreeAttributeDescriptor.h @@ -24,6 +24,8 @@ namespace creaImageIO static const unsigned int IDENTIFIER; /// The attribute enters in label constitution (for printing) static const unsigned int LABEL; + /// The attribute can be edited + static const unsigned int EDITABLE; /// Types /// The attribute is of numeric type diff --git a/src2/creaImageIOTreeDescriptor.cpp b/src2/creaImageIOTreeDescriptor.cpp index 0d77286..c1dca8e 100644 --- a/src2/creaImageIOTreeDescriptor.cpp +++ b/src2/creaImageIOTreeDescriptor.cpp @@ -19,6 +19,8 @@ namespace creaImageIO const unsigned int AttributeDescriptor::PRIVATE = 1; /// The attribute enters in unique identifier constitution const unsigned int AttributeDescriptor::IDENTIFIER = 2; + /// The attribute can be edited + const unsigned int AttributeDescriptor::EDITABLE = 3; const unsigned int AttributeDescriptor::LABEL = 4; //================================================================== diff --git a/src2/creaImageIOTreeHandlerImageAdder.cpp b/src2/creaImageIOTreeHandlerImageAdder.cpp index 471c785..16008be 100644 --- a/src2/creaImageIOTreeHandlerImageAdder.cpp +++ b/src2/creaImageIOTreeHandlerImageAdder.cpp @@ -577,5 +577,12 @@ namespace creaImageIO mSynchronizer->RemoveEntries("IGNORED_FILES", "PATH", "LIKE", drive+"%"); } + //======================================================================= + void TreeHandlerImageAdder::EditField(tree::Node* node, const std::string& name, const std::string& key, const std::string& val) + { + node->SetAttribute(key,val); + mTreeHandler->SetAttribute(node,key,val); + } + } diff --git a/src2/creaImageIOTreeHandlerImageAdder.h b/src2/creaImageIOTreeHandlerImageAdder.h index 53cff0b..2fe9efd 100644 --- a/src2/creaImageIOTreeHandlerImageAdder.h +++ b/src2/creaImageIOTreeHandlerImageAdder.h @@ -140,6 +140,9 @@ namespace creaImageIO void DeleteDriveFromMainDB(const std::string& drive); ///Deletes the drive with the given name (use for maintenance and timestamp databases) void DeleteDriveFromOtherDB(const std::string& drive); + ///Edits the given field and sets the new parameters + void EditField(tree::Node* node, const std::string& name, const std::string& key, const std::string& val); + //==================================================================== diff --git a/src2/creaImageIOWxEditFieldsPanel.cpp b/src2/creaImageIOWxEditFieldsPanel.cpp new file mode 100644 index 0000000..aa48137 --- /dev/null +++ b/src2/creaImageIOWxEditFieldsPanel.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +//using namespace tree; +namespace creaImageIO +{ + const int ID_COMBO = 140; + // CTor + WxEditFieldsPanel::WxEditFieldsPanel(wxWindow *parent, wxDialog* dial, WxGimmickView* view, tree::Node* nod, + const std::vector name, + const std::vector key) + : wxPanel( parent, + -1, wxDefaultPosition, + wxDefaultSize, + wxRESIZE_BORDER | + wxSYSTEM_MENU | + wxCLOSE_BOX | + wxMAXIMIZE_BOX | + wxMINIMIZE_BOX | + wxCAPTION + ), + dialog(dial), + node (nod), + names(name), + keys(key), + mView(view) + { + GimmickDebugMessage(1,"WxCustomizeConfigPanel::WxCustomizeConfigPanel" + <::const_iterator it; + for(it=names.begin();it!=names.end();++it) + { + as.Add(*it); + } + attributes=new wxComboBox(this, ID_COMBO,names.front(),wxPoint(110, 10),wxDefaultSize,as); + std::string val=node->GetAttribute(keys[0]); + if(val.compare("")==0){val="?";} + + wxStaticText * av=new wxStaticText(this,-1,_T(" Actual Value: "), wxPoint(5,40)); + actualVal=new wxStaticText(this,-1,_T(val), wxPoint(110,40)); + + wxStaticText * nv=new wxStaticText(this,-1,_T(" New Value: "), wxPoint(5,70)); + newVal=new wxTextCtrl(this, wxID_ANY, _T(val), wxPoint(110,70), wxSize(220,20)); + + wxButton *save = new wxButton(this,wxID_ANY,_T("Save Changes"), wxPoint(5,100) ); + Connect( save->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxEditFieldsPanel::OnEdit ); + + Layout(); + } + + /// Destructor + WxEditFieldsPanel::~WxEditFieldsPanel() + { + GimmickDebugMessage(1,"WxEditFieldsPanel::~WxEditFieldsPanel" + <GetValue()); + mView->OnFieldsEdited(node,names[attributes->GetSelection()],keys[attributes->GetSelection()],val); + dialog->Destroy(); + } + + void WxEditFieldsPanel::OnComboChange(wxCommandEvent& event) + { + std::string val=node->GetAttribute(keys[attributes->GetSelection()]); + if(val.compare("")==0){val="?";} + actualVal->SetLabel(crea::std2wx(val)); + newVal->SetValue(crea::std2wx(val)); + } + +//====================================================================== +BEGIN_EVENT_TABLE(WxEditFieldsPanel, wxPanel) +EVT_COMBOBOX (ID_COMBO,WxEditFieldsPanel::OnComboChange) +END_EVENT_TABLE() +//====================================================================== + +} // EO namespace creaImageIO + + + + diff --git a/src2/creaImageIOWxEditFieldsPanel.h b/src2/creaImageIOWxEditFieldsPanel.h new file mode 100644 index 0000000..eca344d --- /dev/null +++ b/src2/creaImageIOWxEditFieldsPanel.h @@ -0,0 +1,54 @@ +#ifndef __creaImageIOWxEditFieldsPanel_h_INCLUDED__ +#define __creaImageIOWxEditFieldsPanel_h_INCLUDED__ + +#ifdef USE_WXWIDGETS +#include +#include + + +namespace creaImageIO +{ + /** + * \ingroup GUI + */ + //===================================================================== + //===================================================================== + class WxEditFieldsPanel : public wxPanel + { + public: + WxEditFieldsPanel(); + WxEditFieldsPanel(wxWindow *parent, + wxDialog* dial, + WxGimmickView* view, + tree::Node* nod, + const std::vector name, + const std::vector key); + + ~WxEditFieldsPanel(); + ///Saves the configuration + void OnEdit(wxCommandEvent& event); + void OnComboChange(wxCommandEvent& event); + + private : + tree::Node* node; + std::vector names; + std::vector keys; + wxDialog* dialog; + WxGimmickView* mView; + wxComboBox* attributes; + wxStaticText * actualVal; + wxTextCtrl* newVal; + + DECLARE_EVENT_TABLE() + + + }; // class WxEditFieldsPanel + //===================================================================== + + +} // EO namespace creaImageIO + + +#endif // USE_WIDGETS +// EOF +#endif \ No newline at end of file diff --git a/src2/creaImageIOWxGimmickView.cpp b/src2/creaImageIOWxGimmickView.cpp index 53b0342..a900d0d 100644 --- a/src2/creaImageIOWxGimmickView.cpp +++ b/src2/creaImageIOWxGimmickView.cpp @@ -3,6 +3,7 @@ #include #include #include +#include using namespace crea; // Icons @@ -878,6 +879,24 @@ namespace creaImageIO mListener->Pause(); } + //======================================================================== + void WxGimmickView::CreateEditFieldsDialog(tree::Node* node, std::vector names, std::vector keys) + { + wxDialog* dial= new wxDialog (this,-1,_T("Edit Fields for node "+node->GetLabel()),wxDefaultPosition, wxSize(350,155)); + wxBoxSizer *siz = new wxBoxSizer(wxVERTICAL); + WxEditFieldsPanel* ef = new WxEditFieldsPanel(dial, dial, this, node, names, keys); + + siz->Add( ef,1,wxGROW ,0); + dial->SetSizer(siz); + dial->ShowModal(); + } + + //======================================================================== + void WxGimmickView::OnFieldsEdited(tree::Node* node, const std::string& name, const std::string& key, const std::string& val) + { + mGimmick->EditField(node, crea::wx2std(mNotebook->GetPageText(mNotebook->GetSelection())), name, key, val); + UpdateTreeViewLevel(crea::wx2std(mNotebook->GetPageText(mNotebook->GetSelection())),1); + } //================================================= /// AddProgress Gimmick callback diff --git a/src2/creaImageIOWxGimmickView.h b/src2/creaImageIOWxGimmickView.h index d6df0f6..f4dcb2d 100644 --- a/src2/creaImageIOWxGimmickView.h +++ b/src2/creaImageIOWxGimmickView.h @@ -89,6 +89,10 @@ namespace creaImageIO ///Stops the listening thread on the CD/DVD drive void StopListeningThread(); + + ///Called upon when a field has been edited + void OnFieldsEdited(tree::Node* node, const std::string& name, const std::string& key, const std::string& val); + protected: @@ -154,12 +158,15 @@ namespace creaImageIO /// Called upon to refresh the viewer once there are no actions to be done void OnInternalIdle(); - // callback to add a database + /// callback to add a database void OnAddDB(wxCommandEvent& event); - //Create a DB from an Attributes Descriptor files + ///Create a DB from an Attributes Descriptor files void OnCreateDB(wxCommandEvent& event); + ///Edits the fields of a given node + void CreateEditFieldsDialog(tree::Node* node, std::vector names, std::vector keys); + /// Progress dialog wxProgressDialog* mProgressDialog; ///The selection's maximum dimension diff --git a/src2/creaImageIOWxTreeView.cpp b/src2/creaImageIOWxTreeView.cpp index 58ddc63..ef99f28 100644 --- a/src2/creaImageIOWxTreeView.cpp +++ b/src2/creaImageIOWxTreeView.cpp @@ -695,9 +695,8 @@ namespace creaImageIO } long* ptr=0; int flag; - long itemId=GetCtrl(level)->HitTest(wxPoint(clientpt.x,clientpt.y-8),flag,ptr); - tree::Node* node=((ItemData*)GetCtrl(level)->GetItemData(itemId))->node; - std::cout<GetLabel()<HitTest(wxPoint(0,clientpt.y-8),flag,ptr); PopupMenu(menuItem, clientpt); } @@ -837,9 +836,24 @@ namespace creaImageIO //================================================================ void WxTreeView::OnEditField(wxCommandEvent& event) { - - - + if(mLastRightSelected!=-1) + { + tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node; + tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a; + std::vector names; + std::vector keys; + for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin(); + a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end(); + ++a) + { + if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE) + { + names.push_back(a->GetName()); + keys.push_back(a->GetKey()); + } + } + GetGimmickView()->CreateEditFieldsDialog(node,names,keys); + } } //================================================================ diff --git a/src2/creaImageIOWxTreeView.h b/src2/creaImageIOWxTreeView.h index 465d704..d6290c8 100644 --- a/src2/creaImageIOWxTreeView.h +++ b/src2/creaImageIOWxTreeView.h @@ -132,8 +132,14 @@ namespace creaImageIO /// Currently Selected Column int mColumnSelected; - ///The last selected item on the list + ///The last selected item on the list (left click) long mLastSelected; + + ///The last selected item on the list (right click) + long mLastRightSelected; + + ///The last selected level (by right click) + int mLastRightLevel; ///The color map typedef std::map ColorMap; typedef std::pair NodeColorPair; @@ -153,6 +159,7 @@ namespace creaImageIO int mAnonymizingID; int mLocalCopyID; int mEditFieldID; + // If set to true then OnSelectedChanged returns immediately. // Used to do avoid useless process during multiple selections // or sorting