Skip to content

Commit

Permalink
smartplaylists: extend to support nested AND/OR rules (only from/to J…
Browse files Browse the repository at this point in the history
…SON)
  • Loading branch information
Montellese committed Sep 3, 2012
1 parent 8aaa44d commit a1f8346
Show file tree
Hide file tree
Showing 3 changed files with 248 additions and 111 deletions.
38 changes: 19 additions & 19 deletions xbmc/dialogs/GUIDialogSmartPlaylistEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,12 @@ bool CGUIDialogSmartPlaylistEditor::OnMessage(CGUIMessage& message)

void CGUIDialogSmartPlaylistEditor::OnRuleList(int item)
{
if (item < 0 || item >= (int)m_playlist.m_playlistRules.size()) return;
if (item < 0 || item >= (int)m_playlist.m_ruleCombination.m_rules.size()) return;

CSmartPlaylistRule rule = m_playlist.m_playlistRules[item];
CSmartPlaylistRule rule = m_playlist.m_ruleCombination.m_rules[item];

if (CGUIDialogSmartPlaylistRule::EditRule(rule,m_playlist.GetType()))
m_playlist.m_playlistRules[item] = rule;
m_playlist.m_ruleCombination.m_rules[item] = rule;

UpdateButtons();
}
Expand Down Expand Up @@ -213,7 +213,7 @@ void CGUIDialogSmartPlaylistEditor::OnMatch()
{
CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_MATCH);
OnMessage(msg);
m_playlist.m_matchAllRules = (msg.GetParam1() == 0);
m_playlist.m_ruleCombination.SetType(msg.GetParam1() == 0 ? CSmartPlaylistRuleCombination::CombinationAnd : CSmartPlaylistRuleCombination::CombinationOr);
UpdateButtons();
}

Expand Down Expand Up @@ -262,20 +262,20 @@ void CGUIDialogSmartPlaylistEditor::UpdateButtons()
SET_CONTROL_LABEL2(CONTROL_NAME, m_playlist.m_playlistName);
}

CONTROL_ENABLE_ON_CONDITION(CONTROL_RULE_REMOVE, m_playlist.m_playlistRules.size() > 0);
CONTROL_ENABLE_ON_CONDITION(CONTROL_MATCH, m_playlist.m_playlistRules.size() > 1);
CONTROL_ENABLE_ON_CONDITION(CONTROL_RULE_REMOVE, m_playlist.m_ruleCombination.m_rules.size() > 0);
CONTROL_ENABLE_ON_CONDITION(CONTROL_MATCH, m_playlist.m_ruleCombination.m_rules.size() > 1);

int currentItem = GetSelectedItem();
CGUIMessage msgReset(GUI_MSG_LABEL_RESET, GetID(), CONTROL_RULE_LIST);
OnMessage(msgReset);
m_ruleLabels->Clear();
for (unsigned int i = 0; i < m_playlist.m_playlistRules.size(); i++)
for (unsigned int i = 0; i < m_playlist.m_ruleCombination.m_rules.size(); i++)
{
CFileItemPtr item(new CFileItem("", false));
if (m_playlist.m_playlistRules[i].m_field == FieldNone)
if (m_playlist.m_ruleCombination.m_rules[i].m_field == FieldNone)
item->SetLabel(g_localizeStrings.Get(21423));
else
item->SetLabel(m_playlist.m_playlistRules[i].GetLocalizedRule(m_playlist.GetType()));
item->SetLabel(m_playlist.m_ruleCombination.m_rules[i].GetLocalizedRule(m_playlist.GetType()));
m_ruleLabels->Add(item);
}
CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_RULE_LIST, 0, 0, m_ruleLabels);
Expand Down Expand Up @@ -325,7 +325,7 @@ void CGUIDialogSmartPlaylistEditor::OnWindowLoaded()
msg.SetLabel(21426);
OnMessage(msg);
}
SendMessage(GUI_MSG_ITEM_SELECT, CONTROL_MATCH, m_playlist.m_matchAllRules ? 0 : 1);
SendMessage(GUI_MSG_ITEM_SELECT, CONTROL_MATCH, m_playlist.m_ruleCombination.GetType() == CSmartPlaylistRuleCombination::CombinationAnd ? 0 : 1);
// and now the limit spinner
{
CGUIMessage msg(GUI_MSG_LABEL_ADD, GetID(), CONTROL_LIMIT, 0);
Expand Down Expand Up @@ -434,8 +434,8 @@ void CGUIDialogSmartPlaylistEditor::HighlightItem(int item)

void CGUIDialogSmartPlaylistEditor::OnRuleRemove(int item)
{
if (item < 0 || item >= (int)m_playlist.m_playlistRules.size()) return;
m_playlist.m_playlistRules.erase(m_playlist.m_playlistRules.begin() + item);
if (item < 0 || item >= (int)m_playlist.m_ruleCombination.m_rules.size()) return;
m_playlist.m_ruleCombination.m_rules.erase(m_playlist.m_ruleCombination.m_rules.begin() + item);

UpdateButtons();
if (item >= m_ruleLabels->Size())
Expand All @@ -453,10 +453,10 @@ void CGUIDialogSmartPlaylistEditor::OnRuleAdd()
CSmartPlaylistRule rule;
if (CGUIDialogSmartPlaylistRule::EditRule(rule,m_playlist.GetType()))
{
if (m_playlist.m_playlistRules.size() == 1 && m_playlist.m_playlistRules[0].m_field == FieldNone)
m_playlist.m_playlistRules[0] = rule;
if (m_playlist.m_ruleCombination.m_rules.size() == 1 && m_playlist.m_ruleCombination.m_rules[0].m_field == FieldNone)
m_playlist.m_ruleCombination.m_rules[0] = rule;
else
m_playlist.m_playlistRules.push_back(rule);
m_playlist.m_ruleCombination.m_rules.push_back(rule);
}
UpdateButtons();
}
Expand All @@ -468,7 +468,7 @@ bool CGUIDialogSmartPlaylistEditor::NewPlaylist(const CStdString &type)

editor->m_path = "";
editor->m_playlist = CSmartPlaylist();
editor->m_playlist.m_playlistRules.push_back(CSmartPlaylistRule());
editor->m_playlist.m_ruleCombination.m_rules.push_back(CSmartPlaylistRule());
editor->m_mode = type;
editor->Initialize();
editor->DoModal(g_windowManager.GetActiveWindow());
Expand All @@ -493,13 +493,13 @@ bool CGUIDialogSmartPlaylistEditor::EditPlaylist(const CStdString &path, const C
if (!editor->m_mode.Left(5).Equals("party"))
return false; // only edit normal playlists that exist
// party mode playlists can be editted even if they don't exist
playlist.m_playlistRules.push_back(CSmartPlaylistRule());
playlist.m_ruleCombination.m_rules.push_back(CSmartPlaylistRule());
playlist.SetType(editor->m_mode == "partymusic" ? "songs" : "musicvideos");
}

editor->m_playlist = playlist;
if (editor->m_playlist.m_playlistRules.size() <= 0)
editor->m_playlist.m_playlistRules.push_back(CSmartPlaylistRule());
if (editor->m_playlist.m_ruleCombination.m_rules.size() <= 0)
editor->m_playlist.m_ruleCombination.m_rules.push_back(CSmartPlaylistRule());
editor->m_path = path;
editor->Initialize();
editor->DoModal(g_windowManager.GetActiveWindow());
Expand Down
Loading

0 comments on commit a1f8346

Please sign in to comment.