/*** This file is part of pavucontrol. Copyright 2006-2008 Lennart Poettering Copyright 2009 Colin Guthrie pavucontrol is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. pavucontrol is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with pavucontrol. If not, see . ***/ #ifdef HAVE_CONFIG_H #include #endif #include "cardwidget.h" #include #include #include /*** CardWidget ***/ CardWidget::CardWidget(QWidget* parent) : QWidget(parent) { setupUi(this); connect(profileList, static_cast(&QComboBox::currentIndexChanged), this, &CardWidget::onProfileChange); connect(profileFlavorList, static_cast(&QComboBox::currentIndexChanged), this, &CardWidget::onProfileFlavorChange); } void CardWidget::prepareMenu() { int idx = 0; profileList->clear(); /* Fill the ComboBox */ for (auto k : profiles.keys()) { auto & profile = profiles[k]; auto desc = profile.getProfileName(); profileList->addItem(desc, k); if (profile.containsProfile(activeProfile)) { profileList->setCurrentIndex(idx); changeProfile(k); } ++idx; } } void CardWidget::changeProfile(const QString & name) { auto &profile = profiles[name]; auto old = profileFlavorList->currentText(); profileFlavorList->clear(); int idx = 0; for (auto & entry : profile.entries) { auto name = entry.getName(); profileFlavorList->addItem(name, entry.id); if (name == old || entry.id == activeProfile) { profileFlavorList->setCurrentIndex(idx); } ++idx; } if (profileFlavorList->currentIndex() == -1) { profileFlavorList->setCurrentIndex(0); } } void CardWidget::changeProfileFlavor(const QByteArray & id) { pa_operation* o; if (!(o = pa_context_set_card_profile_by_index(get_context(), index, id.constData(), nullptr, nullptr))) { show_error(tr("pa_context_set_card_profile_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } void CardWidget::onProfileChange(int active) { if (updating) return; if (active != -1) changeProfile(profileList->itemData(active).toString()); } void CardWidget::onProfileFlavorChange(int active) { if (updating) return; if (active != -1) changeProfileFlavor(profileFlavorList->itemData(active).toByteArray()); } QString ProfileGroup::getProfileName() { if (!name.isEmpty()) return name; // TODO QHash counts; qDebug() << "Entries" << this; for (auto n : entries) { qDebug() << n.tokens; QSet tmp = n.tokens.toSet(); //(n.tokens.begin(), n.tokens.end()); for (auto t : tmp) { counts[t]++; } } qDebug() << counts; QSet todo = counts.keys().toSet(); for (auto &pe : entries) { QMutableListIterator it(pe.tokens); while (it.hasNext()) { auto s = it.next(); if (counts[s] == entries.size()) { it.remove(); if (todo.remove(s)) { if (!name.isEmpty()) { name.append(QLatin1Char(' ')); } name.append(s); } } } } return name; } void ProfileGroup::addEntry(const char *id, const char *name) { auto *pe = new ProfileEntry; bool paren = false; const char *pos = name, *tokenStart = name; qDebug() << name << "is" << id; while (*pos != '\0') { if (!paren && isspace(*pos)) { if (pos > tokenStart) { pe->tokens.append(QString::fromUtf8(tokenStart, pos - tokenStart)); } tokenStart = pos + 1; } if (paren && *pos == ')') { pe->tokens.append(QString::fromUtf8(tokenStart, pos - tokenStart + 1)); paren = false; tokenStart = pos + 1; } if (tokenStart == pos && *pos == '(') { paren = true; } pos++; } if (pos > tokenStart) { pe->tokens.append(QString::fromUtf8(tokenStart, pos - tokenStart)); } pe->id = id; this->entries.append(*pe); delete pe; } QString ProfileEntry::getName() const { return tokens.join(QLatin1String(" ")); } bool ProfileGroup::containsProfile(const QByteArray &pro) const { for (const auto &e : this->entries) { if (e.id == pro) return true; } return false; }