Song: add support for hiding duplicate tags
This commit is contained in:
1
NEWS
1
NEWS
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
));
|
));
|
||||||
|
|||||||
37
src/song.cpp
37
src/song.cpp
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user