From 97ed251a3d60047864bb9daf3c38029af51743cc Mon Sep 17 00:00:00 2001 From: AlexB Date: Tue, 19 Nov 2024 16:03:00 -0500 Subject: [PATCH] Hightlight To/From models to only map that subset (#4969) * Hightlight To/From models to only map that subset * Removed button and added Right Click (thanks Scott for the idea - I do like it more) --- .../wxsmith/xLightsImportChannelMapDialog.wxs | 151 +++++++---- xLights/xLightsImportChannelMapDialog.cpp | 235 ++++++++++++------ xLights/xLightsImportChannelMapDialog.h | 11 +- 3 files changed, 266 insertions(+), 131 deletions(-) diff --git a/xLights/wxsmith/xLightsImportChannelMapDialog.wxs b/xLights/wxsmith/xLightsImportChannelMapDialog.wxs index a801669749..12d71ab722 100644 --- a/xLights/wxsmith/xLightsImportChannelMapDialog.wxs +++ b/xLights/wxsmith/xLightsImportChannelMapDialog.wxs @@ -4,6 +4,7 @@ Map Channels 0 + 1 @@ -14,6 +15,7 @@ vertical + 500,-1 1 0 @@ -144,7 +146,8 @@ - + + wxALL|wxEXPAND @@ -188,67 +191,118 @@ - 8 - 2 + 4 + 3 - - - + + 1 + + + 3 + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL - 5 - - - - - - - - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL - 5 - - - - wxALL|wxEXPAND - 5 - - - - - - - - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 5 - - - + + 1 + + + 1 + + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxBOTTOM|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL - 5 - - - - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 5 - - - + + 1 + + + 1 + + + + + + wxTOP|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + + + + + wxBOTTOM|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + + + wxALIGN_LEFT + 5 + + - wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 5 - - - + + 3 + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL + 5 + + wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 5 @@ -261,6 +315,7 @@ + 400,-1 1 0 @@ -281,7 +336,7 @@ - wxALL|wxEXPAND + wxALL|wxEXPAND|wxFIXED_MINSIZE 5 @@ -293,7 +348,7 @@ 100,-1d - + diff --git a/xLights/xLightsImportChannelMapDialog.cpp b/xLights/xLightsImportChannelMapDialog.cpp index c105c937d2..8e7eab5c2e 100644 --- a/xLights/xLightsImportChannelMapDialog.cpp +++ b/xLights/xLightsImportChannelMapDialog.cpp @@ -450,10 +450,10 @@ const wxWindowID xLightsImportChannelMapDialog::ID_STATICTEXT2 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_TEXTCTRL2 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON3 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON4 = wxNewId(); -const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON6 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON5 = wxNewId(); -const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON1 = wxNewId(); +const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON6 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON2 = wxNewId(); +const wxWindowID xLightsImportChannelMapDialog::ID_BUTTON1 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_PANEL1 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_STATICTEXT1 = wxNewId(); const wxWindowID xLightsImportChannelMapDialog::ID_TEXTCTRL1 = wxNewId(); @@ -467,6 +467,8 @@ const long xLightsImportChannelMapDialog::ID_MNU_SELECTNONE = wxNewId(); const long xLightsImportChannelMapDialog::ID_MNU_COLLAPSEALL = wxNewId(); const long xLightsImportChannelMapDialog::ID_MNU_EXPANDALL = wxNewId(); const long xLightsImportChannelMapDialog::ID_MNU_SHOWALLMAPPED = wxNewId(); +const long xLightsImportChannelMapDialog::ID_MNU_AUTOMAPSELECTED = wxNewId(); + BEGIN_EVENT_TABLE(xLightsImportChannelMapDialog,wxDialog) //(*EventTable(xLightsImportChannelMapDialog) @@ -489,9 +491,16 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c //(*Initialize(xLightsImportChannelMapDialog) wxButton* Button01; wxButton* Button02; + wxFlexGridSizer* FlexGridSizer10; + wxFlexGridSizer* FlexGridSizer12; wxFlexGridSizer* FlexGridSizer2; wxFlexGridSizer* FlexGridSizer3; wxFlexGridSizer* FlexGridSizer4; + wxFlexGridSizer* FlexGridSizer5; + wxFlexGridSizer* FlexGridSizer6; + wxFlexGridSizer* FlexGridSizer7; + wxFlexGridSizer* FlexGridSizer8; + wxFlexGridSizer* FlexGridSizer9; Create(parent, wxID_ANY, _("Map Channels"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxFULL_REPAINT_ON_RESIZE, _T("wxID_ANY")); OldSizer = new wxFlexGridSizer(0, 1, 0, 0); @@ -500,6 +509,7 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c SplitterWindow1 = new wxSplitterWindow(this, ID_SPLITTERWINDOW1, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_LIVE_UPDATE, _T("ID_SPLITTERWINDOW1")); SplitterWindow1->SetSashGravity(0.5); Panel1 = new wxPanel(SplitterWindow1, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL1")); + Panel1->SetMinSize(wxSize(500,-1)); Sizer1 = new wxFlexGridSizer(0, 1, 0, 0); Sizer1->AddGrowableCol(0); Sizer1->AddGrowableRow(7); @@ -539,7 +549,7 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c FlexGridSizerImportMedia->Add(ButtonImportOptions, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Sizer1->Add(FlexGridSizerImportMedia, 1, wxALL|wxEXPAND, 1); TimingTrackPanel = new wxStaticBoxSizer(wxHORIZONTAL, Panel1, _("Timing Tracks")); - TimingTrackListBox = new wxCheckListBox(Panel1, ID_CHECKLISTBOX1, wxDefaultPosition, wxDefaultSize, 0, 0, wxVSCROLL, wxDefaultValidator, _T("ID_CHECKLISTBOX1")); + TimingTrackListBox = new wxCheckListBox(Panel1, ID_CHECKLISTBOX1, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_MULTIPLE|wxVSCROLL, wxDefaultValidator, _T("ID_CHECKLISTBOX1")); TimingTrackPanel->Add(TimingTrackListBox, 1, wxALL|wxEXPAND, 0); Sizer1->Add(TimingTrackPanel, 0, wxEXPAND, 0); FlexGridSizer4 = new wxFlexGridSizer(0, 2, 0, 0); @@ -553,25 +563,39 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c SizerMap->AddGrowableCol(0); SizerMap->AddGrowableRow(0); Sizer1->Add(SizerMap, 0, wxEXPAND, 0); - FlexGridSizer2 = new wxFlexGridSizer(0, 8, 0, 0); - FlexGridSizer2->AddGrowableCol(2); + FlexGridSizer2 = new wxFlexGridSizer(0, 4, 0, 0); + FlexGridSizer2->AddGrowableCol(3); + FlexGridSizer5 = new wxFlexGridSizer(0, 1, 0, 0); + FlexGridSizer7 = new wxFlexGridSizer(0, 3, 0, 0); Button_Ok = new wxButton(Panel1, ID_BUTTON3, _("Ok"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3")); - FlexGridSizer2->Add(Button_Ok, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer7->Add(Button_Ok, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Button_Cancel = new wxButton(Panel1, ID_BUTTON4, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON4")); - FlexGridSizer2->Add(Button_Cancel, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); - FlexGridSizer2->Add(-1,-1,1, wxALL|wxEXPAND, 5); - Button_UpdateAliases = new wxButton(Panel1, ID_BUTTON6, _("Update All Aliases Using Mapping"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON6")); - FlexGridSizer2->Add(Button_UpdateAliases, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer7->Add(Button_Cancel, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer5->Add(FlexGridSizer7, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer2->Add(FlexGridSizer5, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer8 = new wxFlexGridSizer(0, 1, 0, 0); + FlexGridSizer6 = new wxFlexGridSizer(0, 1, 0, 0); Button_AutoMap = new wxButton(Panel1, ID_BUTTON5, _("Auto Map"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON5")); - FlexGridSizer2->Add(Button_AutoMap, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); - FlexGridSizer2->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); - Button01 = new wxButton(Panel1, ID_BUTTON1, _("Load Map"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); - FlexGridSizer2->Add(Button01, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer6->Add(Button_AutoMap, 1, wxTOP|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + Button_UpdateAliases = new wxButton(Panel1, ID_BUTTON6, _("Update Aliases w/ Maps"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON6")); + FlexGridSizer6->Add(Button_UpdateAliases, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer8->Add(FlexGridSizer6, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer2->Add(FlexGridSizer8, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer9 = new wxFlexGridSizer(0, 1, 0, 0); + FlexGridSizer10 = new wxFlexGridSizer(0, 1, 0, 0); Button02 = new wxButton(Panel1, ID_BUTTON2, _("Save Map"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2")); - FlexGridSizer2->Add(Button02, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer10->Add(Button02, 1, wxTOP|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + Button01 = new wxButton(Panel1, ID_BUTTON1, _("Load Map"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); + FlexGridSizer10->Add(Button01, 1, wxBOTTOM|wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer9->Add(FlexGridSizer10, 1, wxALIGN_LEFT, 5); + FlexGridSizer2->Add(FlexGridSizer9, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer12 = new wxFlexGridSizer(0, 3, 0, 0); + FlexGridSizer12->Add(-1,-1,1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); + FlexGridSizer2->Add(FlexGridSizer12, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); Sizer1->Add(FlexGridSizer2, 1, wxALL|wxEXPAND, 0); Panel1->SetSizer(Sizer1); Panel2 = new wxPanel(SplitterWindow1, ID_PANEL2, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("ID_PANEL2")); + Panel2->SetMinSize(wxSize(400,-1)); Sizer2 = new wxFlexGridSizer(0, 1, 0, 0); Sizer2->AddGrowableCol(0); Sizer2->AddGrowableRow(1); @@ -580,9 +604,9 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c StaticText1 = new wxStaticText(Panel2, ID_STATICTEXT1, _("Find:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1")); FlexGridSizer3->Add(StaticText1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); TextCtrl_FindFrom = new wxTextCtrl(Panel2, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL1")); - FlexGridSizer3->Add(TextCtrl_FindFrom, 1, wxALL|wxEXPAND, 5); + FlexGridSizer3->Add(TextCtrl_FindFrom, 1, wxALL|wxEXPAND|wxFIXED_MINSIZE, 5); Sizer2->Add(FlexGridSizer3, 1, wxALL|wxEXPAND, 5); - ListCtrl_Available = new wxListCtrl(Panel2, ID_LISTCTRL1, wxDefaultPosition, wxDLG_UNIT(Panel2,wxSize(100,-1)), wxLC_REPORT|wxLC_SINGLE_SEL|wxVSCROLL, wxDefaultValidator, _T("ID_LISTCTRL1")); + ListCtrl_Available = new wxListCtrl(Panel2, ID_LISTCTRL1, wxDefaultPosition, wxDLG_UNIT(Panel2,wxSize(100,-1)), wxLC_REPORT|wxVSCROLL, wxDefaultValidator, _T("ID_LISTCTRL1")); Sizer2->Add(ListCtrl_Available, 1, wxALL|wxEXPAND, 5); Panel2->SetSizer(Sizer2); SplitterWindow1->SplitVertically(Panel1, Panel2); @@ -596,10 +620,10 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c Connect(ID_TEXTCTRL2, wxEVT_COMMAND_TEXT_UPDATED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnTextCtrl_FindToText); Connect(ID_BUTTON3, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnButton_OkClick); Connect(ID_BUTTON4, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnButton_CancelClick); - Connect(ID_BUTTON6, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnButton_UpdateAliasesClick); Connect(ID_BUTTON5, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnButton_AutoMapClick); - Connect(ID_BUTTON1, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::LoadMapping); + Connect(ID_BUTTON6, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnButton_UpdateAliasesClick); Connect(ID_BUTTON2, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::SaveMapping); + Connect(ID_BUTTON1, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::LoadMapping); Connect(ID_TEXTCTRL1, wxEVT_COMMAND_TEXT_UPDATED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnTextCtrl_FindFromText); Connect(ID_LISTCTRL1, wxEVT_COMMAND_LIST_BEGIN_DRAG, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnListCtrl_AvailableBeginDrag); Connect(ID_LISTCTRL1, wxEVT_COMMAND_LIST_ITEM_SELECTED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnListCtrl_AvailableItemSelect); @@ -609,6 +633,7 @@ xLightsImportChannelMapDialog::xLightsImportChannelMapDialog(wxWindow* parent, c //*) Connect(ID_CHECKLISTBOX1, wxEVT_CONTEXT_MENU, (wxObjectEventFunction)&xLightsImportChannelMapDialog::RightClickTimingTracks); + Connect(ID_LISTCTRL1, wxEVT_CONTEXT_MENU, (wxObjectEventFunction)&xLightsImportChannelMapDialog::RightClickModelsAvail); SetSize(800, 600); @@ -658,11 +683,19 @@ void xLightsImportChannelMapDialog::RightClickModels(wxDataViewEvent& event) mnuLayer.Append(ID_MNU_COLLAPSEALL, "Collapse All"); mnuLayer.Append(ID_MNU_EXPANDALL, "Expand All"); mnuLayer.Append(ID_MNU_SHOWALLMAPPED, "Show All Mapped Models"); + mnuLayer.Append(ID_MNU_AUTOMAPSELECTED, "Auto Map Selected"); mnuLayer.Connect(wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnPopupModels, nullptr, this); TreeListCtrl_Mapping->PopupMenu(&mnuLayer, event.GetPosition()); } } +void xLightsImportChannelMapDialog::RightClickModelsAvail(wxDataViewEvent& event) { + wxMenu mnuLayer; + mnuLayer.Append(ID_MNU_AUTOMAPSELECTED, "Auto Map Selected"); + mnuLayer.Connect(wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)&xLightsImportChannelMapDialog::OnPopupModels, nullptr, this); + PopupMenu(&mnuLayer); +} + void xLightsImportChannelMapDialog::OnPopupModels(wxCommandEvent& event) { int id = event.GetId(); @@ -672,6 +705,8 @@ void xLightsImportChannelMapDialog::OnPopupModels(wxCommandEvent& event) CollapseAll(); } else if (id == ID_MNU_SHOWALLMAPPED) { ShowAllMapped(); + } else if (id == ID_MNU_AUTOMAPSELECTED) { + OnButton_AutoMapSelClick(event); } } @@ -2305,44 +2340,60 @@ void xLightsImportChannelMapDialog::DoAutoMap( std::function&)> lambda_model, std::function&)> lambda_strand, std::function&)> lambda_node, - const std::string& extra1, const std::string& extra2, const std::string& mg) + const std::string& extra1, const std::string& extra2, const std::string& mg, const bool& select) { + bool selectMapAvail = (ListCtrl_Available->GetSelectedItemCount() != 0) && select; + bool selectMapTarget = (TreeListCtrl_Mapping->GetSelectedItemsCount() != 0) && select; + bool modelMapped = 0; + wxDataViewItemArray targetSelectedItems; + TreeListCtrl_Mapping->GetSelections(targetSelectedItems); for (unsigned int i = 0; i < _dataModel->GetChildCount(); ++i) { auto model = _dataModel->GetNthChild(i); if (model != nullptr) { + bool isTargetSelected = false; + auto index = (wxDataViewItem)model; + for (const wxDataViewItem& selectedItem : targetSelectedItems) { + isTargetSelected = (index.GetID() == selectedItem.GetID() ? true : false); + if (isTargetSelected) break; + } - auto aliases = model->GetAliases(); - - if ((model->IsGroup() && (mg == "B" || mg == "G")) || (!model->IsGroup() && (mg == "B" || mg == "M"))) { - for (int j = 0; j < ListCtrl_Available->GetItemCount(); ++j) { - wxString const availName = ListCtrl_Available->GetItemText(j).Trim(true).Trim(false).Lower(); - if (availName.Contains("/")) { - wxArrayString const parts = wxSplit(availName, '/'); - if (lambda_model(model->_model, parts[0], extra1, extra2, aliases)) { - // matched the model name ... need to look at strands and submodels - for (unsigned int k = 0; k < model->GetChildCount(); ++k) { - auto strand = model->GetNthChild(k); - if (strand != nullptr) { - if (lambda_strand(strand->_strand, parts[1], extra1, extra2, aliases)) { - // matched to the strand level - if (parts.size() == 2) { - if (strand->_mapping.empty()) { - strand->_mapping = ListCtrl_Available->GetItemText(j); - strand->_mappingExists = true; - } - } else { - // need to map the node level - for (unsigned int m = 0; m < strand->GetChildCount(); ++m) { - auto node = strand->GetNthChild(m); - if (node != nullptr) { - if (node->_mapping.empty()) { - if (lambda_node(node->_node, parts[2], extra1, extra2, aliases)) { - // matched to the node level - if (parts.size() == 3) { - node->_mapping = ListCtrl_Available->GetItemText(j); - node->_mappingExists = true; - } else { - wxASSERT(false); + if ((selectMapTarget && isTargetSelected) || !selectMapTarget) { + auto aliases = model->GetAliases(); + if ((model->IsGroup() && (mg == "B" || mg == "G")) || (!model->IsGroup() && (mg == "B" || mg == "M"))) { + for (int j = 0; j < ListCtrl_Available->GetItemCount(); ++j) { + bool isSourceSelected = ListCtrl_Available->GetItemState(j, wxLIST_STATE_SELECTED) == wxLIST_STATE_SELECTED; + if ((selectMapAvail && isSourceSelected) || !selectMapAvail) { + wxString const availName = ListCtrl_Available->GetItemText(j).Trim(true).Trim(false).Lower(); + if (availName.Contains("/")) { + wxArrayString const parts = wxSplit(availName, '/'); + if (lambda_model(model->_model, parts[0], extra1, extra2, aliases)) { + // matched the model name ... need to look at strands and submodels + for (unsigned int k = 0; k < model->GetChildCount(); ++k) { + auto strand = model->GetNthChild(k); + if (strand != nullptr) { + if (lambda_strand(strand->_strand, parts[1], extra1, extra2, aliases)) { + // matched to the strand level + if (parts.size() == 2) { + if (strand->_mapping.empty()) { + strand->_mapping = ListCtrl_Available->GetItemText(j); + strand->_mappingExists = true; + modelMapped = 1; + } + } else { + // need to map the node level + for (unsigned int m = 0; m < strand->GetChildCount(); ++m) { + auto node = strand->GetNthChild(m); + if (node != nullptr) { + if (node->_mapping.empty()) { + if (lambda_node(node->_node, parts[2], extra1, extra2, aliases)) { + // matched to the node level + if (parts.size() == 3) { + node->_mapping = ListCtrl_Available->GetItemText(j); + node->_mappingExists = true; + } else { + wxASSERT(false); + } + } } } } @@ -2351,29 +2402,31 @@ void xLightsImportChannelMapDialog::DoAutoMap( } } } + } else { // match model to model + if (model->_mapping.empty() && lambda_model(model->_model, availName, extra1, extra2, aliases)) { + model->_mapping = ListCtrl_Available->GetItemText(j); + model->_mappingExists = true; + } } - } - } else { // match model to model - if (model->_mapping.empty() && lambda_model(model->_model, availName, extra1, extra2, aliases)) { - model->_mapping = ListCtrl_Available->GetItemText(j); - model->_mappingExists = true; - } - } - } - if (model->_mapping.empty()) { - for (int j = 0; j < ListCtrl_Available->GetItemCount(); ++j) { - wxString const availName = ListCtrl_Available->GetItemText(j).Trim(true).Trim(false).Lower(); - for (unsigned int k = 0; k < model->GetChildCount(); ++k) { - auto m = xlights->GetModel(model->_model); - auto sm = model->GetNthChild(k); - auto sm2 = m->GetSubModel(sm->_strand); - if (sm2 != nullptr) { - auto smAliases = sm2->GetAliases(); - if (sm != nullptr) { - if (model->_mapping.empty()) { - if (lambda_model(sm->_strand, availName, extra1, extra2, smAliases)) { - sm->_mapping = ListCtrl_Available->GetItemText(j); - sm->_mappingExists = true; + if (model->_mapping.empty()) { + for (int j = 0; j < ListCtrl_Available->GetItemCount(); ++j) { + if ((selectMapAvail && isSourceSelected) || !selectMapAvail) { + wxString const availName = ListCtrl_Available->GetItemText(j).Trim(true).Trim(false).Lower(); + for (unsigned int k = 0; k < model->GetChildCount(); ++k) { + auto m = xlights->GetModel(model->_model); + auto sm = model->GetNthChild(k); + auto sm2 = m->GetSubModel(sm->_strand); + if (sm2 != nullptr) { + auto smAliases = sm2->GetAliases(); + if (sm != nullptr) { + if (model->_mapping.empty()) { + if (lambda_model(sm->_strand, availName, extra1, extra2, smAliases)) { + sm->_mapping = ListCtrl_Available->GetItemText(j); + sm->_mappingExists = true; + } + } + } + } } } } @@ -2381,10 +2434,10 @@ void xLightsImportChannelMapDialog::DoAutoMap( } } } + } else { + static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); + logger_base.warn("xLightsImportTreeModel::OnButton_AutoMapClick: Weird ... model %d was nullptr", i); } - } else { - static log4cpp::Category& logger_base = log4cpp::Category::getInstance(std::string("log_base")); - logger_base.warn("xLightsImportTreeModel::OnButton_AutoMapClick: Weird ... model %d was nullptr", i); } } } @@ -2393,8 +2446,8 @@ void xLightsImportChannelMapDialog::OnButton_AutoMapClick(wxCommandEvent& event) { if (_dataModel == nullptr) return; - DoAutoMap(norm, norm, norm, "", "", "B"); - DoAutoMap(aggressive, aggressive, aggressive, "", "", "B"); + DoAutoMap(norm, norm, norm, "", "", "B", false); + DoAutoMap(aggressive, aggressive, aggressive, "", "", "B", false); auto maphints = xlights->CurrentDir + wxFileName::GetPathSeparator() + "maphints"; if (wxDir::Exists(maphints)) { @@ -2411,6 +2464,28 @@ void xLightsImportChannelMapDialog::OnButton_AutoMapClick(wxCommandEvent& event) MarkUsed(); } +void xLightsImportChannelMapDialog::OnButton_AutoMapSelClick(wxCommandEvent& event) { + if (_dataModel == nullptr) + return; + + DoAutoMap(norm, norm, norm, "", "", "B", true); + DoAutoMap(aggressive, aggressive, aggressive, "", "", "B", true); + + auto maphints = xlights->CurrentDir + wxFileName::GetPathSeparator() + "maphints"; + if (wxDir::Exists(maphints)) { + wxArrayString files; + GetAllFilesInDir(maphints, files, "*.xmaphint"); + for (auto& filename : files) { + if (FileExists(filename)) { + loadMapHintsFile(filename); + } + } + } + + TreeListCtrl_Mapping->Refresh(); + MarkUsed(); +} + void xLightsImportChannelMapDialog::OnListCtrl_AvailableItemActivated(wxListEvent& event) { if (TreeListCtrl_Mapping->GetSelectedItemsCount() == 0) return; @@ -2566,7 +2641,7 @@ void xLightsImportChannelMapDialog::loadMapHintsFile(wxString const& filename) { auto fromModel = n->GetAttribute("FromModel"); auto applyTo = n->GetAttribute("ApplyTo", "B"); if (toRegex != "" && fromModel != "") { - DoAutoMap(regex, regex, norm, toRegex, fromModel, applyTo); + DoAutoMap(regex, regex, norm, toRegex, fromModel, applyTo, false); } } } diff --git a/xLights/xLightsImportChannelMapDialog.h b/xLights/xLightsImportChannelMapDialog.h index 57441b0d7a..0cec276014 100644 --- a/xLights/xLightsImportChannelMapDialog.h +++ b/xLights/xLightsImportChannelMapDialog.h @@ -456,10 +456,10 @@ class xLightsImportChannelMapDialog: public wxDialog static const wxWindowID ID_TEXTCTRL2; static const wxWindowID ID_BUTTON3; static const wxWindowID ID_BUTTON4; - static const wxWindowID ID_BUTTON6; static const wxWindowID ID_BUTTON5; - static const wxWindowID ID_BUTTON1; + static const wxWindowID ID_BUTTON6; static const wxWindowID ID_BUTTON2; + static const wxWindowID ID_BUTTON1; static const wxWindowID ID_PANEL1; static const wxWindowID ID_STATICTEXT1; static const wxWindowID ID_TEXTCTRL1; @@ -473,6 +473,8 @@ class xLightsImportChannelMapDialog: public wxDialog static const long ID_MNU_COLLAPSEALL; static const long ID_MNU_EXPANDALL; static const long ID_MNU_SHOWALLMAPPED; + static const long ID_MNU_AUTOMAPSELECTED; + static const long ID_MNU_AUTOMAPSELECTED_AVAIL; private: wxString FindTab(wxString &line); @@ -489,6 +491,7 @@ class xLightsImportChannelMapDialog: public wxDialog void OnListCtrl_AvailableColumnClick(wxListEvent& event); void OnCheckBox_MapCCRStrandClick(wxCommandEvent& event); void OnButton_AutoMapClick(wxCommandEvent& event); + void OnButton_AutoMapSelClick(wxCommandEvent& event); void OnListCtrl_AvailableItemActivated(wxListEvent& event); void OnButtonImportOptionsClick(wxCommandEvent& event); void OnCheckBoxImportMediaClick(wxCommandEvent& event); @@ -496,10 +499,12 @@ class xLightsImportChannelMapDialog: public wxDialog void OnTextCtrl_FindToText(wxCommandEvent& event); void OnButton_UpdateAliasesClick(wxCommandEvent& event); void OnClose(wxCloseEvent& event); + void OnInit(wxInitDialogEvent& event); //*) void RightClickTimingTracks(wxContextMenuEvent& event); void RightClickModels(wxDataViewEvent& event); + void RightClickModelsAvail(wxDataViewEvent& event); void CollapseAll(); void ExpandAll(); void ShowAllMapped(); @@ -515,7 +520,7 @@ class xLightsImportChannelMapDialog: public wxDialog std::function& aliases)> lambda_model, std::function& aliases)> lambda_strand, std::function& aliases)> lambda_node, - const std::string& extra1, const std::string& extra2, const std::string& mg); + const std::string& extra1, const std::string& extra2, const std::string& mg, const bool& select); void LoadXMapMapping(wxString const& filename, bool hideWarnings);