Song: add support for hiding duplicate tags

master
Andrzej Rybczak 10 years ago
parent 126e954528
commit 6ebf00eb5d
  1. 1
      NEWS
  2. 2
      doc/config
  3. 3
      doc/ncmpcpp.1
  4. 3
      src/settings.cpp
  5. 29
      src/song.cpp
  6. 2
      src/song.h

@ -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
)); ));

@ -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,12 +208,39 @@ 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;
if (ShowDuplicateTags)
{
for (std::string tag; !(tag = (this->*f)(idx)).empty(); ++idx) for (std::string tag; !(tag = (this->*f)(idx)).empty(); ++idx)
{ {
if (!result.empty()) if (!result.empty())
result += TagsSeparator; result += TagsSeparator;
result += tag; 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;

Loading…
Cancel
Save