Remove the individual provider buttons from the global search widget and replace them with one settings button instead. Also tweak the appearance of the tooltip

This commit is contained in:
David Sansome 2011-11-05 16:57:33 +00:00
parent af59c517b7
commit dc05c101a3
7 changed files with 73 additions and 214 deletions

View File

@ -99,7 +99,7 @@ void GlobalSearchSettingsPage::AddProviderItem(GlobalSearch* engine,
if (!logged_in) {
item->setData(0, Qt::CheckStateRole, Qt::Unchecked);
item->setIcon(1, warning_icon_);
item->setText(1, tr("Not logged in"));
item->setText(1, tr("Not logged in") + " ");
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
} else if (enabled) {
item->setData(0, Qt::CheckStateRole, Qt::Checked);

View File

@ -31,7 +31,7 @@
const qreal GlobalSearchTooltip::kBorderRadius = 8.0;
const qreal GlobalSearchTooltip::kTotalBorderWidth = 4.0;
const qreal GlobalSearchTooltip::kOuterBorderWidth = 1.0;
const qreal GlobalSearchTooltip::kOuterBorderWidth = 0.5;
const qreal GlobalSearchTooltip::kArrowWidth = 10.0;
const qreal GlobalSearchTooltip::kArrowHeight = 10.0;
@ -177,7 +177,7 @@ bool GlobalSearchTooltip::event(QEvent* e) {
void GlobalSearchTooltip::paintEvent(QPaintEvent*) {
QPainter p(this);
const QColor outer_color = Qt::black;
const QColor outer_color(0, 0, 0, 192);
const QColor inner_color = palette().color(QPalette::Highlight);
const QColor center_color = palette().color(QPalette::Base);
@ -189,6 +189,7 @@ void GlobalSearchTooltip::paintEvent(QPaintEvent*) {
kTotalBorderWidth/2, kTotalBorderWidth/2));
// Draw the border
p.setCompositionMode(QPainter::CompositionMode_Source);
p.setRenderHint(QPainter::Antialiasing);
p.setPen(QPen(outer_color, kTotalBorderWidth));
p.drawRoundedRect(area, kBorderRadius, kBorderRadius);
@ -211,14 +212,15 @@ void GlobalSearchTooltip::paintEvent(QPaintEvent*) {
inner_border_width/2, inner_border_width/2));
// Inner border
p.setCompositionMode(QPainter::CompositionMode_SourceOver);
p.setBrush(center_color);
p.setPen(QPen(inner_color, inner_border_width));
p.drawRoundedRect(inner_area, kBorderRadius, kBorderRadius);
// Inner arrow
arrow[0].setY(arrow[0].y() + kOuterBorderWidth);
arrow[1].setX(arrow[1].x() + kOuterBorderWidth + 1);
arrow[2].setY(arrow[2].y() - kOuterBorderWidth);
arrow[0].setY(arrow[0].y() + kOuterBorderWidth + 0.5);
arrow[1].setX(arrow[1].x() + kOuterBorderWidth + 1.5);
arrow[2].setY(arrow[2].y() - kOuterBorderWidth - 0.5);
p.setBrush(inner_color);
p.setPen(inner_color);

View File

@ -117,6 +117,9 @@ GlobalSearchWidget::GlobalSearchWidget(QWidget* parent)
StyleSheetLoader* style_loader = new StyleSheetLoader(this);
style_loader->SetStyleSheet(this, ":globalsearch.css");
// Icons
ui_->settings->setIcon(IconLoader::Load("configure"));
swap_models_timer_->setSingleShot(true);
swap_models_timer_->setInterval(kSwapModelsTimeoutMsec);
@ -125,6 +128,7 @@ GlobalSearchWidget::GlobalSearchWidget(QWidget* parent)
connect(view_->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
SLOT(UpdateTooltip()));
connect(swap_models_timer_, SIGNAL(timeout()), SLOT(SwapModels()));
connect(ui_->settings, SIGNAL(clicked()), SLOT(SettingsClicked()));
}
GlobalSearchWidget::~GlobalSearchWidget() {
@ -144,18 +148,6 @@ void GlobalSearchWidget::Init(GlobalSearch* engine) {
connect(engine_, SIGNAL(TracksLoaded(int,MimeData*)), SLOT(TracksLoaded(int,MimeData*)),
Qt::QueuedConnection);
connect(engine_, SIGNAL(ProviderAdded(const SearchProvider*)),
SLOT(ProviderAdded(const SearchProvider*)));
connect(engine_, SIGNAL(ProviderRemoved(const SearchProvider*)),
SLOT(ProviderRemoved(const SearchProvider*)));
connect(engine_, SIGNAL(ProviderToggled(const SearchProvider*,bool)),
SLOT(ProviderToggled(const SearchProvider*,bool)));
// Take all the ProviderAdded signals we missed.
foreach (const SearchProvider* provider, engine_->providers()) {
ProviderAdded(provider);
}
view_->setStyle(new PlaylistProxyStyle(style()));
// The style helper's base color doesn't get initialised until after the
@ -325,10 +317,6 @@ bool GlobalSearchWidget::eventFilter(QObject* o, QEvent* e) {
if (o == view_)
return EventFilterPopup(o, e);
QToolButton* button = qobject_cast<QToolButton*>(o);
if (button && provider_buttons_.right.count(button))
return EventFilterProviderButton(button, e);
return QWidget::eventFilter(o, e);
}
@ -472,28 +460,6 @@ bool GlobalSearchWidget::EventFilterPopup(QObject*, QEvent* e) {
return false;
}
bool GlobalSearchWidget::EventFilterProviderButton(QToolButton* button, QEvent* e) {
switch (e->type()) {
case QEvent::Enter:
QToolTip::showText(button->mapToGlobal(button->rect().bottomLeft()),
button->toolTip(), button);
break;
case QEvent::Leave:
QToolTip::hideText();
break;
case QEvent::ToolTip:
// Ignore normal tooltip events.
return true;
default:
break;
}
return false;
}
void GlobalSearchWidget::LazyLoadArt(const QModelIndex& proxy_index) {
if (!proxy_index.isValid() || proxy_index.data(Role_LazyLoadingArt).isValid()) {
return;
@ -692,97 +658,6 @@ void GlobalSearchWidget::UpdateTooltip() {
tooltip_->ShowAt(view_->mapToGlobal(popup_pos));
}
void GlobalSearchWidget::ProviderAdded(const SearchProvider* provider) {
if (provider_buttons_.left.count(provider)) {
qLog(Error) << "Tried to add the same provider twice:"
<< provider->name() << provider->id();
return;
}
// Create a button for the provider.
QToolButton* button = new QToolButton(this);
button->setToolTip(tr("Show results from %1").arg(provider->name()));
button->setCheckable(true);
button->setChecked(engine_->is_provider_enabled(provider));
button->installEventFilter(this);
// Make the "Off" icon state greyed out, semi transparent and blurred.
QImage disabled_image = provider->icon().pixmap(
button->iconSize(), QIcon::Disabled).toImage();
QImage off_image = QImage(disabled_image.size(), QImage::Format_ARGB32);
off_image.fill(Qt::transparent);
QPainter p(&off_image);
p.setOpacity(0.5);
qt_blurImage(&p, disabled_image, 3.0, true, false);
p.end();
QIcon icon;
icon.addPixmap(provider->icon().pixmap(button->iconSize(), QIcon::Normal),
QIcon::Normal, QIcon::On);
icon.addPixmap(QPixmap::fromImage(off_image), QIcon::Normal, QIcon::Off);
button->setIcon(icon);
connect(button, SIGNAL(toggled(bool)), SLOT(ProviderButtonToggled(bool)));
// Find the appropriate insertion point.
bool inserted = false;
for (int i = 0; i < ui_->provider_layout->count(); ++i) {
QToolButton* item_button = static_cast<QToolButton*>(
ui_->provider_layout->itemAt(i)->widget());
if (!item_button) {
continue;
}
const QString& name = provider_buttons_.right.find(item_button)->second->name();
if (provider->name() < name) {
ui_->provider_layout->insertWidget(i, button);
inserted = true;
break;
}
}
if (!inserted) {
// Insert it at the end but before the spacer.
ui_->provider_layout->insertWidget(ui_->provider_layout->count() - 1, button);
}
provider_buttons_.insert(ProviderButton(provider, button));
}
void GlobalSearchWidget::ProviderRemoved(const SearchProvider* provider) {
if (!provider_buttons_.left.count(provider)) {
qLog(Error) << "Tried to remove a provider that hadn't been added yet:"
<< provider->name() << provider->id();
return;
}
ProviderButtonMap::left_const_iterator it = provider_buttons_.left.find(provider);
delete it->second;
provider_buttons_.left.erase(provider);
}
void GlobalSearchWidget::ProviderButtonToggled(bool on) {
QToolButton* button = qobject_cast<QToolButton*>(sender());
if (!button)
return;
const SearchProvider* provider = provider_buttons_.right.find(button)->second;
if (!provider)
return;
if (!engine_->SetProviderEnabled(provider, on)) {
// If we were not able to change provider state, toggle back provider button
button->toggle();
}
}
void GlobalSearchWidget::ProviderToggled(const SearchProvider* provider, bool on) {
QToolButton* button = provider_buttons_.left.find(provider)->second;
if (!button)
return;
button->setChecked(on);
void GlobalSearchWidget::SettingsClicked() {
emit OpenSettingsAtPage(SettingsDialog::Page_GlobalSearch);
}

View File

@ -19,6 +19,7 @@
#define GLOBALSEARCHWIDGET_H
#include "searchprovider.h"
#include "ui/settingsdialog.h"
#include <QScopedPointer>
#include <QWidget>
@ -70,6 +71,7 @@ public slots:
signals:
void AddToPlaylist(QMimeData* data);
void OpenSettingsAtPage(SettingsDialog::Page page);
protected:
void resizeEvent(QResizeEvent* e);
@ -89,17 +91,13 @@ private slots:
void AddAndQueueCurrent();
void ReplaceCurrent();
void ReplaceAndPlayCurrent();
void SettingsClicked();
void HidePopup();
void UpdateTooltip();
void SwapModels();
void ProviderAdded(const SearchProvider* provider);
void ProviderRemoved(const SearchProvider* provider);
void ProviderButtonToggled(bool on);
void ProviderToggled(const SearchProvider* provider, bool on);
private:
// Return values from CanCombineResults
enum CombineAction {
@ -114,7 +112,6 @@ private:
bool EventFilterSearchWidget(QObject* o, QEvent* e);
bool EventFilterPopup(QObject* o, QEvent* e);
bool EventFilterProviderButton(QToolButton* button, QEvent* e);
void LoadTracks(QAction* trigger);
@ -161,10 +158,6 @@ private:
QAction* replace_;
QAction* replace_and_play_;
QList<QAction*> actions_;
typedef boost::bimap<const SearchProvider*, QToolButton*> ProviderButtonMap;
typedef ProviderButtonMap::value_type ProviderButton;
ProviderButtonMap provider_buttons_;
};
#endif // GLOBALSEARCHWIDGET_H

View File

@ -7,13 +7,13 @@
<x>0</x>
<y>0</y>
<width>522</width>
<height>101</height>
<height>53</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="LineEdit" name="search">
<property name="hint" stdset="0">
@ -22,24 +22,17 @@
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="provider_layout">
<property name="spacing">
<number>0</number>
<widget class="QToolButton" name="settings">
<property name="iconSize">
<size>
<width>16</width>
<height>16</height>
</size>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>

View File

@ -347,7 +347,7 @@ msgstr ""
msgid "Add directory..."
msgstr ""
#: ui/mainwindow.cpp:1574
#: ui/mainwindow.cpp:1575
msgid "Add file"
msgstr ""
@ -359,7 +359,7 @@ msgstr ""
msgid "Add files to transcode"
msgstr ""
#: ui/mainwindow.cpp:1599
#: ui/mainwindow.cpp:1600
msgid "Add folder"
msgstr ""
@ -427,7 +427,7 @@ msgstr ""
msgid "Add stream..."
msgstr ""
#: ui/mainwindow.cpp:1403
#: ui/mainwindow.cpp:1404
msgid "Add to another playlist"
msgstr ""
@ -642,7 +642,7 @@ msgstr ""
msgid "Artist"
msgstr ""
#: ui/mainwindow.cpp:270
#: ui/mainwindow.cpp:271
msgid "Artist info"
msgstr ""
@ -825,7 +825,7 @@ msgstr ""
msgid "Change the language"
msgstr ""
#: ui/mainwindow.cpp:610
#: ui/mainwindow.cpp:611
msgid "Check for updates..."
msgstr ""
@ -1003,7 +1003,7 @@ msgstr ""
msgid "Configure Spotify..."
msgstr ""
#: ui/mainwindow.cpp:504
#: ui/mainwindow.cpp:505
msgid "Configure library..."
msgstr ""
@ -1036,12 +1036,12 @@ msgstr ""
msgid "Convert any music that the device can't play"
msgstr ""
#: library/libraryview.cpp:258 ui/mainwindow.cpp:537
#: library/libraryview.cpp:258 ui/mainwindow.cpp:538
#: widgets/fileviewlist.cpp:43
msgid "Copy to device..."
msgstr ""
#: devices/deviceview.cpp:223 ui/mainwindow.cpp:534
#: devices/deviceview.cpp:223 ui/mainwindow.cpp:535
#: widgets/fileviewlist.cpp:38
msgid "Copy to library..."
msgstr ""
@ -1257,7 +1257,7 @@ msgid "Delete Grooveshark playlist"
msgstr ""
#: devices/deviceview.cpp:393 library/libraryview.cpp:450
#: ui/mainwindow.cpp:1837 widgets/fileview.cpp:185
#: ui/mainwindow.cpp:1838 widgets/fileview.cpp:185
msgid "Delete files"
msgstr ""
@ -1265,7 +1265,7 @@ msgstr ""
msgid "Delete from device..."
msgstr ""
#: library/libraryview.cpp:260 ui/mainwindow.cpp:538
#: library/libraryview.cpp:260 ui/mainwindow.cpp:539
#: widgets/fileviewlist.cpp:44
msgid "Delete from disk..."
msgstr ""
@ -1286,11 +1286,11 @@ msgstr ""
msgid "Deleting files"
msgstr ""
#: ui/mainwindow.cpp:1348
#: ui/mainwindow.cpp:1349
msgid "Dequeue selected tracks"
msgstr ""
#: ui/mainwindow.cpp:1346
#: ui/mainwindow.cpp:1347
msgid "Dequeue track"
msgstr ""
@ -1318,7 +1318,7 @@ msgstr ""
msgid "Device properties..."
msgstr ""
#: ui/mainwindow.cpp:267
#: ui/mainwindow.cpp:268
msgid "Devices"
msgstr ""
@ -1472,7 +1472,7 @@ msgstr ""
msgid "Edit smart playlist..."
msgstr ""
#: ui/mainwindow.cpp:1381
#: ui/mainwindow.cpp:1382
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1579,8 +1579,8 @@ msgid "Equivalent to --log-levels *:3"
msgstr ""
#: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:444
#: ui/edittagdialog.cpp:719 ui/mainwindow.cpp:1805 ui/mainwindow.cpp:1910
#: ui/mainwindow.cpp:2128
#: ui/edittagdialog.cpp:719 ui/mainwindow.cpp:1806 ui/mainwindow.cpp:1911
#: ui/mainwindow.cpp:2129
msgid "Error"
msgstr ""
@ -1733,7 +1733,7 @@ msgstr ""
msgid "Filename"
msgstr ""
#: ui/mainwindow.cpp:265
#: ui/mainwindow.cpp:266
msgid "Files"
msgstr ""
@ -1796,7 +1796,7 @@ msgid ""
"to rescan all the songs again next time you connect it."
msgstr ""
#: ../bin/src/ui_globalsearchwidget.h:64
#: ../bin/src/ui_globalsearchwidget.h:59
#: ../bin/src/ui_icecastfilterwidget.h:74
#: ../bin/src/ui_internetviewcontainer.h:70
#: ../bin/src/ui_libraryfilterwidget.h:114
@ -1878,7 +1878,7 @@ msgstr ""
msgid "Global Search"
msgstr ""
#: ../bin/src/ui_globalsearchwidget.h:65
#: ../bin/src/ui_globalsearchwidget.h:60
msgid "Global search"
msgstr ""
@ -2071,7 +2071,7 @@ msgstr ""
msgid "Installed"
msgstr ""
#: ui/mainwindow.cpp:266
#: ui/mainwindow.cpp:267
msgid "Internet"
msgstr ""
@ -2267,7 +2267,7 @@ msgstr ""
msgid "Length"
msgstr ""
#: ui/mainwindow.cpp:241 ui/mainwindow.cpp:264
#: ui/mainwindow.cpp:241 ui/mainwindow.cpp:265
msgid "Library"
msgstr ""
@ -2275,7 +2275,7 @@ msgstr ""
msgid "Library advanced grouping"
msgstr ""
#: ui/mainwindow.cpp:2030
#: ui/mainwindow.cpp:2031
msgid "Library rescan notice"
msgstr ""
@ -2526,7 +2526,7 @@ msgstr ""
msgid "Move down"
msgstr ""
#: ui/mainwindow.cpp:535 widgets/fileviewlist.cpp:40
#: ui/mainwindow.cpp:536 widgets/fileviewlist.cpp:40
msgid "Move to library..."
msgstr ""
@ -2621,7 +2621,7 @@ msgstr ""
msgid "Never start playing"
msgstr ""
#: ui/mainwindow.cpp:1420 ../bin/src/ui_mainwindow.h:680
#: ui/mainwindow.cpp:1421 ../bin/src/ui_mainwindow.h:680
msgid "New playlist"
msgstr ""
@ -2672,7 +2672,7 @@ msgstr ""
msgid "None"
msgstr ""
#: library/libraryview.cpp:445 ui/mainwindow.cpp:1806 ui/mainwindow.cpp:1911
#: library/libraryview.cpp:445 ui/mainwindow.cpp:1807 ui/mainwindow.cpp:1912
msgid "None of the selected songs were suitable for copying to a device"
msgstr ""
@ -2813,7 +2813,7 @@ msgstr ""
msgid "Organise Files"
msgstr ""
#: library/libraryview.cpp:256 ui/mainwindow.cpp:536
#: library/libraryview.cpp:256 ui/mainwindow.cpp:537
msgid "Organise files..."
msgstr ""
@ -2864,7 +2864,7 @@ msgstr ""
msgid "Password Protected"
msgstr ""
#: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:885 ui/mainwindow.cpp:1271
#: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:886 ui/mainwindow.cpp:1272
#: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106
msgid "Pause"
msgstr ""
@ -2881,8 +2881,8 @@ msgstr ""
msgid "Plain sidebar"
msgstr ""
#: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:519 ui/mainwindow.cpp:853
#: ui/mainwindow.cpp:872 ui/mainwindow.cpp:1274 ui/qtsystemtrayicon.cpp:166
#: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:520 ui/mainwindow.cpp:854
#: ui/mainwindow.cpp:873 ui/mainwindow.cpp:1275 ui/qtsystemtrayicon.cpp:166
#: ui/qtsystemtrayicon.cpp:192 wiimotedev/wiimotesettingspage.cpp:101
#: ../bin/src/ui_mainwindow.h:631
msgid "Play"
@ -3090,12 +3090,12 @@ msgstr ""
msgid "Queue Manager"
msgstr ""
#: ui/mainwindow.cpp:1352
#: ui/mainwindow.cpp:1353
msgid "Queue selected tracks"
msgstr ""
#: globalsearch/globalsearchwidget.cpp:97 library/libraryview.cpp:244
#: ui/mainwindow.cpp:1350
#: ui/mainwindow.cpp:1351
msgid "Queue track"
msgstr ""
@ -3448,7 +3448,7 @@ msgstr ""
msgid "Service offline"
msgstr ""
#: ui/mainwindow.cpp:1379
#: ui/mainwindow.cpp:1380
#, qt-format
msgid "Set %1 to \"%2\"..."
msgstr ""
@ -3524,7 +3524,7 @@ msgstr ""
msgid "Show above status bar"
msgstr ""
#: ui/mainwindow.cpp:492
#: ui/mainwindow.cpp:493
msgid "Show all songs"
msgstr ""
@ -3544,7 +3544,7 @@ msgstr ""
msgid "Show fullsize..."
msgstr ""
#: library/libraryview.cpp:268 ui/mainwindow.cpp:539
#: library/libraryview.cpp:268 ui/mainwindow.cpp:540
msgid "Show in file browser..."
msgstr ""
@ -3552,19 +3552,14 @@ msgstr ""
msgid "Show in various artists"
msgstr ""
#: ui/mainwindow.cpp:493
#: ui/mainwindow.cpp:494
msgid "Show only duplicates"
msgstr ""
#: ui/mainwindow.cpp:494
#: ui/mainwindow.cpp:495
msgid "Show only untagged"
msgstr ""
#: globalsearch/globalsearchwidget.cpp:704
#, qt-format
msgid "Show results from %1"
msgstr ""
#: ../bin/src/ui_lastfmsettingspage.h:151
msgid "Show the \"love\" and \"ban\" buttons"
msgstr ""
@ -3657,7 +3652,7 @@ msgstr ""
msgid "Song Information"
msgstr ""
#: ui/mainwindow.cpp:269
#: ui/mainwindow.cpp:270
msgid "Song info"
msgstr ""
@ -3753,7 +3748,7 @@ msgstr ""
msgid "Stop after"
msgstr ""
#: ui/mainwindow.cpp:521 ../bin/src/ui_mainwindow.h:639
#: ui/mainwindow.cpp:522 ../bin/src/ui_mainwindow.h:639
msgid "Stop after this track"
msgstr ""
@ -3879,7 +3874,7 @@ msgstr ""
msgid "The site you requested is not an image!"
msgstr ""
#: ui/mainwindow.cpp:2023
#: ui/mainwindow.cpp:2024
msgid ""
"The version of Clementine you've just updated to requires a full library "
"rescan because of the new features listed below:"
@ -3901,7 +3896,7 @@ msgid ""
"deleted:"
msgstr ""
#: library/libraryview.cpp:451 ui/mainwindow.cpp:1838 widgets/fileview.cpp:186
#: library/libraryview.cpp:451 ui/mainwindow.cpp:1839 widgets/fileview.cpp:186
msgid ""
"These files will be deleted from disk, are you sure you want to continue?"
msgstr ""
@ -4006,7 +4001,7 @@ msgstr ""
msgid "Toggle fullscreen"
msgstr ""
#: ui/mainwindow.cpp:1354
#: ui/mainwindow.cpp:1355
msgid "Toggle queue status"
msgstr ""
@ -4329,7 +4324,7 @@ msgstr ""
msgid "Windows Media audio"
msgstr ""
#: ui/mainwindow.cpp:2028
#: ui/mainwindow.cpp:2029
msgid "Would you like to run a full rescan right now?"
msgstr ""
@ -4448,7 +4443,7 @@ msgstr ""
msgid "Your Magnatune credentials were incorrect"
msgstr ""
#: ui/edittagdialog.cpp:719 ui/mainwindow.cpp:2128
#: ui/edittagdialog.cpp:719 ui/mainwindow.cpp:2129
msgid ""
"Your gstreamer installation is missing the 'ofa' plugin. This is required "
"for automatic tag fetching. Try installing the 'gstreamer-plugins-bad' "

View File

@ -259,6 +259,7 @@ MainWindow::MainWindow(
ui_->global_search->Init(global_search);
connect(ui_->global_search, SIGNAL(AddToPlaylist(QMimeData*)), SLOT(AddToPlaylist(QMimeData*)));
connect(ui_->global_search, SIGNAL(OpenSettingsAtPage(SettingsDialog::Page)), SLOT(OpenSettingsDialogAtPage(SettingsDialog::Page)));
// Add tabs to the fancy tab widget
ui_->tabs->AddTab(library_view_, IconLoader::Load("folder-sound"), tr("Library"));