From eee9b84bf483431b69b8e420d4e01935afd9c7ef Mon Sep 17 00:00:00 2001 From: caballero Date: Fri, 27 Mar 2009 15:40:47 +0000 Subject: [PATCH] Added pop up menus and tweaked the filter algorithm --- src2/creaImageIOWxGimmickView.cpp | 5 +- src2/creaImageIOWxTreeView.cpp | 174 ++++++++++++++++++++++-------- src2/creaImageIOWxTreeView.h | 15 +++ src2/creaImageIOWxViewer.cpp | 2 +- 4 files changed, 148 insertions(+), 48 deletions(-) diff --git a/src2/creaImageIOWxGimmickView.cpp b/src2/creaImageIOWxGimmickView.cpp index ba41e35..0b10592 100644 --- a/src2/creaImageIOWxGimmickView.cpp +++ b/src2/creaImageIOWxGimmickView.cpp @@ -518,7 +518,10 @@ namespace creaImageIO } // GimmickMessage(1,"WxGimmickView : Refresh viewer"<StartPlayer(); - mViewer->RefreshIfNecessary(); + if(mViewer) + { + mViewer->RefreshIfNecessary(); + } } //================================================== diff --git a/src2/creaImageIOWxTreeView.cpp b/src2/creaImageIOWxTreeView.cpp index b01b40f..5cd3825 100644 --- a/src2/creaImageIOWxTreeView.cpp +++ b/src2/creaImageIOWxTreeView.cpp @@ -82,7 +82,7 @@ namespace creaImageIO // Global sizer wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL); - int ctrl_style = wxLC_REPORT | /*wxLC_VRULES |*/ wxLC_EDIT_LABELS; + int ctrl_style = wxLC_REPORT | wxLC_VRULES; int col_style = wxLIST_FORMAT_LEFT; // Creating the ListCtrl for the levels > 0 (not for Root level) @@ -147,6 +147,21 @@ namespace creaImageIO mLevelList.push_back(level); } +#if wxUSE_MENUS + + menu =new wxMenu; + wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending")); + wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending")); + wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter")); + mAscendingID=m1->GetId(); + mDescendingID=m2->GetId(); + mFilterID=m3->GetId(); + Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) ); + Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) ); + Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) ); + +#endif // wxUSE_MENUS + /// Initialize the first level splitter @@ -156,7 +171,7 @@ namespace creaImageIO mDirection=true; mSelectionMade=false; mProcess=true; - CreateColorPalette(); + //CreateColorPalette(); UpdateLevel(1); SetSizer( sizer ); @@ -296,70 +311,74 @@ namespace creaImageIO GetCtrl(l)->DeleteAllItems(); std::vector::iterator i; + //Adds the first item (filter) - GetCtrl(l)->InsertItem(0, _T("Filter:")); - for (i=sel.begin(); i!=sel.end(); ++i) + + for (i=sel.begin(); i!=sel.end(); ++i) { GimmickDebugMessage(2, "adding children of '" <<(*i)->GetLabel() - <<"'"<InsertItem(0, _T("hELLO")); GetTreeHandler()->LoadChildren(*i,1); tree::Node::ChildrenListType::reverse_iterator j; for (j = (*i)->GetChildrenList().rbegin(); j!= (*i)->GetChildrenList().rend(); ++j) { - wxListItem item; - item.SetMask(wxLIST_MASK_STATE | + wxListItem* item= new wxListItem; + item->SetMask(wxLIST_MASK_STATE | wxLIST_MASK_TEXT | // wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | // wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT ); - + ItemData* data = new ItemData; data->node = *j; - item.SetId(_id); + item->SetId(_id); data->id = _id; - item.SetData(data); + item->SetData(data); _id++; - long id=GetCtrl(l)->InsertItem(item); + //Setting first column (number of children) std::ostringstream oss; int n= GetTreeHandler()->GetNumberOfChildren(*j); oss << n; std::string s(oss.str()); - item.SetText( crea::std2wx(s)); + item->SetText( crea::std2wx(s)); - item.SetColumn(0); - GetCtrl(l)->SetItem(item); + item->SetColumn(0); + GetCtrl(l)->InsertItem(*item); + //GetCtrl(l)->SetItem(item); //Setting other attributes for (int k=1; kGetColumnCount(); k++) { - std::string val = (*j)->GetAttribute(mLevelList[l].key[k-1]); + std::string val = (*j)->GetAttribute(mLevelList[l].key[k-1]); if (val.size()==0) val = "?"; - item.SetText( crea::std2wx(val)); - item.SetColumn(k); - GetCtrl(l)->SetItem(item); - } + item->SetText( crea::std2wx(val)); + item->SetColumn(k); + GetCtrl(l)->SetItem(*item); + GetCtrl(l)->RefreshItem(*item); + } + } + GetCtrl(l)->DeleteItem(0); } GetCtrl(l)->Show(); - if (levelEditLabel(event.m_itemIndex); } - } + }*/ } @@ -463,11 +483,11 @@ namespace creaImageIO mProcess=false; } - if(item!=0) - { + /*if(item!=0) + {*/ GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT); - } + //} } @@ -475,29 +495,92 @@ namespace creaImageIO } //================================================================ - //================================================================ + void WxTreeView::OnColClick(wxListEvent& event) - { - //Obtain the column name and the level that needs to be organized + { mColumnSelected=event.m_col; - GimmickDebugMessage(1, - " Column selected: " <GetColumnWidth(mColumnSelected)); + wxPoint screenpt = ClientToScreen(clientpt); if(mColumnSelected!=0) { - wxObject* ctrl = event.GetEventObject(); + PopupMenu(menu, clientpt); + } + + } + //================================================================ + void WxTreeView::OnPopupFilter(wxCommandEvent& event) + { + wxBusyCursor busy; + GimmickDebugMessage(7, + "WxTreeView::OnEndLabelEdit" + <GetNextItem(it, + wxLIST_NEXT_ALL); + if ( it == -1 ) + break; + + long adr = GetCtrl(level)->GetItemData(it); + tree::Node* nod = ((ItemData*)adr)->node; + att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected-1]); + + if(att.find(filter)>900) + { + GetCtrl(level)->DeleteItem(it); + } + + } + GetGimmickView()->ClearSelection(); + } + //================================================================ + + //================================================================ + void WxTreeView::OnPopupSort(wxCommandEvent& event) + { wxBusyCursor busy; - + unsigned int level = 0; + for (level = 0; levelDeleteItem(0); + //GetCtrl(level)->DeleteItem(0); //Sets the data for the items to be sorted std::string att; unsigned int ty=0; @@ -507,6 +590,7 @@ namespace creaImageIO //Gets current item data long adr = GetCtrl(level)->GetItemData(i); + //Extracts the node and the type of attribute tree::Node* nod = ((ItemData*)adr)->node; if(i==0) @@ -539,7 +623,6 @@ namespace creaImageIO GetCtrl(level)->SortItems(CompareFunctionStrings, 0); } - mDirection=false; } else { @@ -551,7 +634,6 @@ namespace creaImageIO { GetCtrl(level)->SortItems(CompareFunctionStrings, 1); } - mDirection=true; } //Resets original data @@ -600,7 +682,7 @@ namespace creaImageIO | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT); } - GetCtrl(level)->InsertItem(0,_T("Filter:")); + //GetCtrl(level)->InsertItem(0,_T("Filter:")); } } @@ -838,7 +920,7 @@ namespace creaImageIO } //================================================================ - BEGIN_EVENT_TABLE(WxTreeView, wxPanel) + BEGIN_EVENT_TABLE(WxTreeView, wxPanel) /* EVT_SIZE(MyFrame::OnSize) @@ -897,9 +979,9 @@ BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl) EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown) EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated) EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused) - - EVT_LIST_COL_RIGHT_CLICK(LIST_CTRL, MyListCtrl::OnColRightClick) - */ +*/ + EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick) + EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick) /* EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag) diff --git a/src2/creaImageIOWxTreeView.h b/src2/creaImageIOWxTreeView.h index bf13312..dbd0162 100644 --- a/src2/creaImageIOWxTreeView.h +++ b/src2/creaImageIOWxTreeView.h @@ -48,6 +48,13 @@ namespace creaImageIO /// Callback when first item edition ends void OnEndLabelEdit(wxListEvent& event); + /// Callback when the user needs the items sorted + void OnPopupSort(wxCommandEvent& event); + + ///Callback when the user need the items filtered + void OnPopupFilter(wxCommandEvent& event); + + private: /// The struct holding the data for one level /// Holds the wx control and other data @@ -85,6 +92,9 @@ namespace creaImageIO void CreateColorPalette(); ///Selects the lowest level (images) void SelectLowerLevel(); + ///Sorts items + void OnSort(int level); + /// Currently Selected Column @@ -107,6 +117,11 @@ namespace creaImageIO ///Boolean declaring if the last level selection has been made bool mSelectionMade; bool mProcess; + wxMenu* menu; + wxObject* senderCtrl; + int mAscendingID; + int mDescendingID; + int mFilterID; DECLARE_EVENT_TABLE() }; diff --git a/src2/creaImageIOWxViewer.cpp b/src2/creaImageIOWxViewer.cpp index ab18933..cf7c3a6 100644 --- a/src2/creaImageIOWxViewer.cpp +++ b/src2/creaImageIOWxViewer.cpp @@ -229,7 +229,7 @@ namespace creaImageIO void WxViewer::StopPlayer() { wxMutexLocker lock(mMutex); - if (mPlayer==0) return; + if (mPlayer==0 ) return; mPlayer->Delete(); mPlayer=0; } -- 2.46.1