Song: add support for hiding duplicate tags

This commit is contained in:
Andrzej Rybczak
2016-10-30 19:01:11 +01:00
parent 126e954528
commit 6ebf00eb5d
6 changed files with 44 additions and 4 deletions

1
NEWS
View File

@@ -1,5 +1,6 @@
ncmpcpp-0.8 (????-??-??) ncmpcpp-0.8 (????-??-??)
* Configuration variable 'execute_on_player_state_change' was added. * Configuration variable 'execute_on_player_state_change' was added.
* Support for controlling whether ncmpcpp should display multiple tags as-is or make an effort to hide duplicate values (show_duplicate_tags configuration variable, enabled by default).
ncmpcpp-0.7.5 (2016-08-17) ncmpcpp-0.7.5 (2016-08-17)
* Action chains can be now used for seeking. * Action chains can be now used for seeking.

View File

@@ -316,6 +316,8 @@
# #
#discard_colors_if_item_is_selected = yes #discard_colors_if_item_is_selected = yes
# #
#show_duplicate_tags = true
#
#incremental_seeking = yes #incremental_seeking = yes
# #
#seek_time = 1 #seek_time = 1

View File

@@ -184,6 +184,9 @@ Default display mode for Playlist editor.
.B discard_colors_if_item_is_selected = yes/no .B discard_colors_if_item_is_selected = yes/no
Indicates whether custom colors of tags have to be discarded if item is selected or not. Indicates whether custom colors of tags have to be discarded if item is selected or not.
.TP .TP
.B show_duplicate_tags = yes/no
Indicates whether ncmpcpp should display multiple tags as-is or remove duplicates.
.TP
.B incremental_seeking = yes/no .B incremental_seeking = yes/no
If enabled, seek time will increment by one each second of seeking. If enabled, seek time will increment by one each second of seeking.
.TP .TP

View File

@@ -405,6 +405,9 @@ bool Configuration::read(const std::vector<std::string> &config_paths, bool igno
p.add("discard_colors_if_item_is_selected", yes_no( p.add("discard_colors_if_item_is_selected", yes_no(
discard_colors_if_item_is_selected, true discard_colors_if_item_is_selected, true
)); ));
p.add("show_duplicate_tags", yes_no(
MPD::Song::ShowDuplicateTags, true
));
p.add("incremental_seeking", yes_no( p.add("incremental_seeking", yes_no(
incremental_seeking, true incremental_seeking, true
)); ));

View File

@@ -46,6 +46,8 @@ namespace MPD {
std::string Song::TagsSeparator = " | "; std::string Song::TagsSeparator = " | ";
bool Song::ShowDuplicateTags = true;
std::string Song::get(mpd_tag_type type, unsigned idx) const std::string Song::get(mpd_tag_type type, unsigned idx) const
{ {
std::string result; std::string result;
@@ -206,11 +208,38 @@ std::string MPD::Song::getTags(GetFunction f) const
assert(m_song); assert(m_song);
unsigned idx = 0; unsigned idx = 0;
std::string result; std::string result;
for (std::string tag; !(tag = (this->*f)(idx)).empty(); ++idx) if (ShowDuplicateTags)
{ {
if (!result.empty()) for (std::string tag; !(tag = (this->*f)(idx)).empty(); ++idx)
result += TagsSeparator; {
result += tag; if (!result.empty())
result += TagsSeparator;
result += tag;
}
}
else
{
bool already_present;
// This is O(n^2), but it doesn't really matter as a list of tags will have
// at most 2 or 3 items the vast majority of time.
for (std::string tag; !(tag = (this->*f)(idx)).empty(); ++idx)
{
already_present = false;
for (unsigned i = 0; i < idx; ++i)
{
if ((this->*f)(i) == tag)
{
already_present = true;
break;
}
}
if (!already_present)
{
if (idx > 0)
result += TagsSeparator;
result += tag;
}
}
} }
return result; return result;
} }

View File

@@ -103,6 +103,8 @@ struct Song
static std::string TagsSeparator; static std::string TagsSeparator;
static bool ShowDuplicateTags;
private: private:
std::shared_ptr<mpd_song> m_song; std::shared_ptr<mpd_song> m_song;
size_t m_hash; size_t m_hash;