HW Zoom keys support, reworked settings window
authorNikolay Tischenko <niktischenko@gmail.com>
Sun, 28 Nov 2010 20:11:38 +0000 (02:11 +0600)
committerNikolay Tischenko <niktischenko@gmail.com>
Sun, 28 Nov 2010 20:11:38 +0000 (02:11 +0600)
12 files changed:
someplayer.pro
src/dbusadaptor.cpp
src/dbusclient.cpp [new file with mode: 0644]
src/dbusclient.h [new file with mode: 0644]
src/directoryview.cpp
src/mainwindow.cpp
src/mainwindow.h
src/playerform.cpp
src/playerform.h
src/settingsform.cpp
src/settingsform.h
src/ui/settingsform.ui

index 2e1ffbd..c671223 100644 (file)
@@ -126,7 +126,8 @@ SOURCES += src/main.cpp\
     src/directoryview.cpp \
     src/coverfinder.cpp \
     src/clickablelabel.cpp \
-    src/settingsform.cpp
+    src/settingsform.cpp \
+    src/dbusclient.cpp
 
 HEADERS  += src/mainwindow.h \
                src/player/player.h \
@@ -231,7 +232,8 @@ HEADERS  += src/mainwindow.h \
     src/directoryview.h \
     src/coverfinder.h \
     src/clickablelabel.h \
-    src/settingsform.h
+    src/settingsform.h \
+    src/dbusclient.h
 
 FORMS    += src/ui/mainwindow.ui \
     src/ui/playerform.ui \
index 8286441..ac341e0 100644 (file)
@@ -111,7 +111,7 @@ void DBusAdaptop::processBTSignal(QString event, QString state) {
                                toggle();
                        } else if (state == "connection") {
                                SomePlayer::Storage::Config config;
-                               if (config.getValue("playback/hpautopause").toString() != "yes") {
+                               if (config.getValue("hw/hpautopause").toString() != "yes") {
                                        return;
                                }
                                bool present = QDBusInterface ("org.freedesktop.Hal",
diff --git a/src/dbusclient.cpp b/src/dbusclient.cpp
new file mode 100644 (file)
index 0000000..06aaf01
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * SomePlayer - An alternate music player for Maemo 5
+ * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "dbusclient.h"
+#include <QDebug>
+
+DBusClient::DBusClient(QObject *parent) :
+               QObject(parent)
+{
+       _timer.setInterval(60000);
+       _timer.setSingleShot(false);
+       //dbus-send  --system --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_keypad_off_pause
+       _unpause_keys_message = QDBusMessage::createMethodCall("com.nokia.mce",
+                                                              "/com/nokia/mce/request",
+                                                              "com.nokia.mce.request",
+                                                              "req_keypad_off_pause");
+
+       //signal sender=:1.13 -> dest=(null destination) serial=4373 path=/com/nokia/mce/signal; interface=com.nokia.mce.signal; member=display_status_ind
+       //string "off"
+       QDBusConnection::systemBus().connect(QString(), QString(),
+                                            "com.nokia.mce.signal", "display_status_ind", this, SLOT(_display_handler(QString)));
+       //signal sender=:1.46 -> dest=(null destination) serial=2966 path=/com/nokia/tklock/signal; interface=com.nokia.tklock.signal; member=mm_key_press
+       //uint32 74
+       //uint32 65476
+       QDBusConnection::systemBus().connect(QString(), QString(),
+                                            "com.nokia.tklock.signal", "mm_key_press", this, SLOT(_zoom_keys_handler(quint32,quint32)));
+
+}
+
+void DBusClient::enableKeys() {
+       connect(&_timer, SIGNAL(timeout()), this, SLOT(_unpause_keys()));
+       _unpause_keys();
+       _timer.start();
+}
+
+void DBusClient::disableKeys() {
+       disconnect(&_timer, SIGNAL(timeout()), this, SLOT(_unpause_keys()));
+       _timer.stop();
+}
+
+void DBusClient::_unpause_keys() {
+       QDBusConnection::systemBus().call(_unpause_keys_message);
+}
+
+void DBusClient::_display_handler(QString state) {
+       emit displayStateChanged(state == "on");
+}
+
+void DBusClient::_zoom_keys_handler(quint32 code, quint32 /*ignored*/) {
+       emit zoomKeyPressed(code);
+}
diff --git a/src/dbusclient.h b/src/dbusclient.h
new file mode 100644 (file)
index 0000000..4cae67f
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * SomePlayer - An alternate music player for Maemo 5
+ * Copyright (C) 2010 Nikolay (somebody) Tischenko <niktischenko@gmail.com>
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef DBUSCLIENT_H
+#define DBUSCLIENT_H
+
+#include <QObject>
+#include <QtDBus/QtDBus>
+#include <QTimer>
+#include <QTime>
+
+#define MM_KEY_UP (73)
+#define MM_KEY_DOWN (74)
+
+class DBusClient : public QObject
+{
+       Q_OBJECT
+public:
+       explicit DBusClient(QObject *parent = 0);
+signals:
+       void displayStateChanged(bool);
+       void zoomKeyPressed(quint32);
+public slots:
+       void enableKeys();
+       void disableKeys();
+private slots:
+       void _unpause_keys();
+       void _display_handler(QString);
+       void _zoom_keys_handler(quint32, quint32);
+private:
+       QTimer _timer;
+       QDBusMessage _unpause_keys_message;
+};
+
+#endif // DBUSCLIENT_H
index 36d6fe6..4e347ed 100644 (file)
@@ -119,7 +119,6 @@ void DirectoryView::readDir(QString path, QString pathToScroll) {
        int row = _directories.indexOf(pathToScroll);
        if (row >= 0 && row < _model->rowCount()) {
                QModelIndex id = _model->index(row, 1);
-               qWarning() << "scroll to " << id.row() << id.column() << id.data().toString();
                ui->dirView->scrollTo(id, QAbstractItemView::PositionAtCenter);
        }
 }
@@ -140,7 +139,6 @@ void DirectoryView::_process_click(QModelIndex index) {
                if (index.row() < _directories.count()) {
                        _current_dir = _directories.at(index.row());
                        readDir(_current_dir);
-                       qWarning() << "pushed: " << _current_dir;
                        _nav_history.push(_current_dir);
                        return;
                }
index 93aa57d..ddc1a3e 100644 (file)
@@ -25,6 +25,7 @@
 #include <QFile>
 #include <QDesktopWidget>
 #include <QTranslator>
+#include <QKeyEvent>
 
 #include "player/player.h"
 
 #include "equalizerdialog.h"
 #include "saveplaylistdialog.h"
 #include "settingsform.h"
+#include <QtGui/QX11Info>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+
 
 using namespace SomePlayer::DataObjects;
 using namespace SomePlayer::Storage;
@@ -41,6 +46,7 @@ MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
 {
+       _display_unlocked = true; // in most cases
        Config config;
        _library = new Library(config.applicationDir(), config.applicationDir());
        _translator = new QTranslator(this);
@@ -90,6 +96,8 @@ MainWindow::MainWindow(QWidget *parent) :
        connect(_settings_form, SIGNAL(orientationChanged()), this, SLOT(_change_orientation()));
        connect(_settings_form, SIGNAL(translationChanged()), this, SLOT(updateTranslations()));
        connect(_settings_form, SIGNAL(trackColorChanged()), _player_form, SLOT(updateTrackColor()));
+       connect(_settings_form, SIGNAL(hwZoomPolicyChanged()), this, SLOT(_hw_zoom_policy_changed()));
+       connect(&_dbus_client, SIGNAL(displayStateChanged(bool)), this, SLOT(_set_display_state(bool)));
        _player_form->reload(true);
        QString mode = config.getValue("ui/orientation").toString();
        if (mode == "landscape") {
@@ -121,6 +129,7 @@ MainWindow::MainWindow(QWidget *parent) :
        _player_form->checkGradient();
        _library_form->checkGradient();
        _directory_form->checkGradient();
+       _hw_zoom_policy_changed();
        setWindowTitle("SomePlayer");
 }
 
@@ -337,3 +346,36 @@ void MainWindow::updateTranslations() {
        _directory_form->updateTranslations();
        _settings_form->updateTranslations();
 }
+
+void MainWindow::_hw_zoom_policy_changed() {
+       Config config;
+       QString state = config.getValue("hw/zoomkeys").toString();
+       if (state == "enabled") {
+               _dbus_client.enableKeys();
+               connect(&_dbus_client, SIGNAL(zoomKeyPressed(quint32)), this, SLOT(_zoom_key_pressed(quint32)));
+       } else {
+               _dbus_client.disableKeys();
+               disconnect(&_dbus_client, SIGNAL(zoomKeyPressed(quint32)), this, SLOT(_zoom_key_pressed(quint32)));
+       }
+}
+
+void MainWindow::_set_display_state(bool state) {
+       _display_unlocked = state;
+}
+
+void MainWindow::_zoom_key_pressed(quint32 code) {
+       if (_display_unlocked) {
+               return;
+       }
+       Config config;
+       QString behavior = config.getValue("hw/zoom_action").toString();
+       if (code == MM_KEY_DOWN) {
+               if (behavior == "track") {
+                       _player_form->prev();
+               }
+       } else if (code == MM_KEY_UP) {
+               if (behavior == "track") {
+                       _player_form->next();
+               }
+       }
+}
index 4e20950..cc405f1 100644 (file)
@@ -31,6 +31,7 @@
 #include "directoryview.h"
 #include "settingsform.h"
 #include "library.h"
+#include "dbusclient.h"
 #include <QTimer>
 
 namespace Ui {
@@ -73,6 +74,9 @@ private slots:
        void _fullscreen(bool);
        void _add_tracks(QList<Track>);
        void _change_orientation();
+       void _hw_zoom_policy_changed();
+       void _set_display_state(bool);
+       void _zoom_key_pressed(quint32);
 private:
        PlayerForm *_player_form;
        LibraryForm *_library_form;
@@ -85,6 +89,8 @@ private:
        ManageLibraryForm *_manage_library_form;
        int _timeout_interval;
        QTranslator *_translator;
+       DBusClient _dbus_client;
+       bool _display_unlocked;
 };
 
 #endif // MAINWINDOW_H
index 3da0d9f..ae91db2 100644 (file)
@@ -755,3 +755,11 @@ void PlayerForm::updateTrackColor() {
        ui->playlistView->hide();
        ui->playlistView->show();
 }
+
+void PlayerForm::next() {
+       _player->next();
+}
+
+void PlayerForm::prev() {
+       _player->prev();
+}
index 430cf07..a081ace 100644 (file)
@@ -81,6 +81,8 @@ public slots:
        void updateIcons();
        void checkGradient();
        void play(Track);
+       void next();
+       void prev();
        void showCountdown(QString);
        void hideCountdown();
        void updateTranslations();
index 2d5978b..7baf60e 100644 (file)
@@ -47,6 +47,10 @@ SettingsForm::SettingsForm(QWidget *parent) :
        ui->engLangButton->setChecked(true);
        ui->cBlueButton->setChecked(true);
        ui->pauseHPNoButton->setChecked(true);
+       ui->hwKeysBox->setChecked(false);
+       ui->hwkeysLabel->setEnabled(false);
+       ui->hwTControlButton->setEnabled(false);
+       ui->hwVolumeButton->setEnabled(false);
        if (albumSorting == "alphabet") {
                ui->albumsSortAButton->setChecked(true);
        }
@@ -82,9 +86,24 @@ SettingsForm::SettingsForm(QWidget *parent) :
        } else if (track_color == "light") {
                ui->cLightButton->setChecked(true);
        }
-       if (config.getValue("playback/hpautopause").toString() == "yes") {
+       if (config.getValue("hw/hpautopause").toString() == "yes") {
                ui->pauseHPYesButton->setChecked(true);
        }
+       if (config.getValue("hw/zoomkeys").toString() == "enabled") {
+               ui->hwKeysBox->setChecked(true);
+               ui->hwkeysLabel->setEnabled(true);
+               ui->hwTControlButton->setEnabled(true);
+               ui->hwVolumeButton->setEnabled(true);
+       }
+       QString behavior = config.getValue("hw/zoom_action").toString();
+       if (behavior == "volume") {
+               ui->hwVolumeButton->setChecked(true);
+       } else if (behavior == "track") {
+               ui->hwTControlButton->setChecked(true);
+       } else {
+               ui->hwVolumeButton->setChecked(true);
+               config.setValue("hw/zoom_action", "volume");
+       }
        if (!QFile::exists(QString(_APPLICATION_PATH_)+"/someplayer_ru.qm")) {
                ui->langBox->hide();
        } // refactor this when more translations will be added
@@ -111,6 +130,13 @@ SettingsForm::SettingsForm(QWidget *parent) :
        connect (ui->cYellowButton, SIGNAL(toggled(bool)), this, SLOT(_set_color_yellow(bool)));
        connect (ui->pauseHPNoButton, SIGNAL(toggled(bool)), this, SLOT(_set_pause_hp_no(bool)));
        connect (ui->pauseHPYesButton, SIGNAL(toggled(bool)), this, SLOT(_set_pause_hp_yes(bool)));
+       connect (ui->hwKeysBox, SIGNAL(toggled(bool)), this, SLOT(_toggle_hw_settings(bool)));
+       connect (ui->hwVolumeButton, SIGNAL(toggled(bool)), this, SLOT(_set_hw_volume_control(bool)));
+       connect (ui->hwTControlButton, SIGNAL(toggled(bool)), this, SLOT(_set_hw_track_control(bool)));
+       connect (ui->uiButton, SIGNAL(clicked()), this, SLOT(_toggle_view_ui()));
+       connect (ui->hwButton, SIGNAL(clicked()), this, SLOT(_toggle_view_hw()));
+       connect (ui->libraryButton, SIGNAL(clicked()), this, SLOT(_toggle_view_lib()));
+       _toggle_view_ui();
        setAttribute(Qt::WA_Maemo5StackedWindow);
        setWindowFlags(Qt::Window | windowFlags());
 }
@@ -270,13 +296,55 @@ void SettingsForm::_set_lang_ru(bool checked) {
 void SettingsForm::_set_pause_hp_no(bool checked) {
        if (!checked) return;
        Config config;
-       config.setValue("playback/hpautopause", "no");
+       config.setValue("hw/hpautopause", "no");
 }
 
 void SettingsForm::_set_pause_hp_yes(bool checked) {
        if (!checked) return;
        Config config;
-       config.setValue("playback/hpautopause", "yes");
+       config.setValue("hw/hpautopause", "yes");
+}
+
+void SettingsForm::_toggle_hw_settings(bool checked) {
+       Config config;
+       config.setValue("hw/zoomkeys", checked ? "enabled" : "disabled");
+       ui->hwkeysLabel->setEnabled(checked);
+       ui->hwTControlButton->setEnabled(checked);
+       ui->hwVolumeButton->setEnabled(checked);
+       emit hwZoomPolicyChanged();
+}
+
+void SettingsForm::_set_hw_track_control(bool checked) {
+       if (!checked) return;
+       Config config;
+       config.setValue("hw/zoom_action", "track");
+}
+
+void SettingsForm::_set_hw_volume_control(bool checked) {
+       if (!checked) return;
+       Config config;
+       config.setValue("hw/zoom_action", "volume");
+}
+
+void SettingsForm::_toggle_view_ui() {
+       ui->hwButton->setChecked(false);
+       ui->libraryButton->setChecked(false);
+       ui->uiButton->setChecked(true);
+       ui->stackedWidget->setCurrentIndex(0);
+}
+
+void SettingsForm::_toggle_view_lib() {
+       ui->hwButton->setChecked(false);
+       ui->uiButton->setChecked(false);
+       ui->libraryButton->setChecked(true);
+       ui->stackedWidget->setCurrentIndex(1);
+}
+
+void SettingsForm::_toggle_view_hw() {
+       ui->uiButton->setChecked(false);
+       ui->libraryButton->setChecked(false);
+       ui->hwButton->setChecked(true);
+       ui->stackedWidget->setCurrentIndex(2);
 }
 
 void SettingsForm::updateTranslations() {
index 1ade75d..bdd07d8 100644 (file)
@@ -47,6 +47,7 @@ signals:
        void libraryOptionsChanged();
        void translationChanged();
        void trackColorChanged();
+       void hwZoomPolicyChanged();
 
 private:
        Ui::SettingsForm *ui;
@@ -75,6 +76,12 @@ private slots:
        void _set_color_dark(bool);
        void _set_pause_hp_yes(bool);
        void _set_pause_hp_no(bool);
+       void _toggle_hw_settings(bool);
+       void _set_hw_volume_control(bool);
+       void _set_hw_track_control(bool);
+       void _toggle_view_ui();
+       void _toggle_view_lib();
+       void _toggle_view_hw();
 };
 
 #endif // SETTINGSFORM_H
index d434d76..a1cf6e0 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>800</width>
-    <height>480</height>
+    <width>596</width>
+    <height>377</height>
    </rect>
   </property>
   <property name="windowTitle">
     <number>0</number>
    </property>
    <item>
-    <widget class="QScrollArea" name="scrollArea">
-     <property name="horizontalScrollBarPolicy">
-      <enum>Qt::ScrollBarAlwaysOff</enum>
-     </property>
-     <property name="widgetResizable">
-      <bool>true</bool>
+    <layout class="QHBoxLayout" name="horizontalLayout_5">
+     <item>
+      <widget class="QPushButton" name="uiButton">
+       <property name="text">
+        <string>UI</string>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+       <property name="flat">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="libraryButton">
+       <property name="text">
+        <string>Library</string>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+       <property name="flat">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="hwButton">
+       <property name="text">
+        <string>Hardware</string>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+       <property name="flat">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QStackedWidget" name="stackedWidget">
+     <property name="currentIndex">
+      <number>2</number>
      </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>-97</y>
-        <width>780</width>
-        <height>474</height>
-       </rect>
-      </property>
-      <layout class="QVBoxLayout" name="verticalLayout_6">
-       <item>
-        <widget class="QGroupBox" name="groupBox">
-         <property name="title">
-          <string/>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_2">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="margin">
-           <number>0</number>
-          </property>
-          <item>
-           <widget class="QLabel" name="label">
-            <property name="text">
-             <string>Icons theme:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item>
-             <widget class="QRadioButton" name="iconsWButton">
-              <property name="text">
-               <string>White</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="iconstBButton">
-              <property name="text">
-               <string>Black</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="groupBox_4">
-         <property name="title">
-          <string/>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_7">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="margin">
-           <number>0</number>
-          </property>
-          <item>
-           <widget class="QLabel" name="label_5">
-            <property name="text">
-             <string>Use gradient in portrait mode:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_6">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item>
-             <widget class="QRadioButton" name="gradientYButton">
-              <property name="text">
-               <string>Yes</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="gradientNButton">
-              <property name="text">
-               <string>No</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
+     <widget class="QWidget" name="stackedWidgetPage1" native="true">
+      <layout class="QVBoxLayout" name="verticalLayout_13">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
        <item>
-        <widget class="QGroupBox" name="groupBox_6">
-         <property name="title">
-          <string/>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_10">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="margin">
-           <number>0</number>
-          </property>
-          <item>
-           <widget class="QLabel" name="label_7">
-            <property name="text">
-             <string>Active track color:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QGridLayout" name="cButtonsLayout" rowstretch="0,0">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item row="0" column="0">
-             <widget class="QRadioButton" name="cBlueButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(100, 150, 220)</string>
-              </property>
-              <property name="text">
-               <string>blue</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="1">
-             <widget class="QRadioButton" name="cMagentaButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(150, 80, 150);</string>
-              </property>
-              <property name="text">
-               <string>magenta</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="2">
-             <widget class="QRadioButton" name="cRedButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(220, 100, 100);</string>
-              </property>
-              <property name="text">
-               <string>red</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="3">
-             <widget class="QRadioButton" name="cYellowButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(220, 220, 100);</string>
-              </property>
-              <property name="text">
-               <string>yellow</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="0">
-             <widget class="QRadioButton" name="cWhiteButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(255, 255, 255);</string>
-              </property>
-              <property name="text">
-               <string>white</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="1">
-             <widget class="QRadioButton" name="cBlackButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(0,0,0);</string>
-              </property>
-              <property name="text">
-               <string>black</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="2">
-             <widget class="QRadioButton" name="cLightButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(200, 200, 200);</string>
-              </property>
-              <property name="text">
-               <string>light</string>
-              </property>
-             </widget>
-            </item>
-            <item row="1" column="3">
-             <widget class="QRadioButton" name="cDarkButton">
-              <property name="styleSheet">
-               <string notr="true">color: rgb(70, 70, 70);</string>
-              </property>
-              <property name="text">
-               <string>dark</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="albumSortingGroupBox">
-         <property name="enabled">
+        <widget class="QScrollArea" name="scrollArea_2">
+         <property name="widgetResizable">
           <bool>true</bool>
          </property>
-         <property name="title">
-          <string/>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <property name="spacing">
-           <number>6</number>
+         <widget class="QWidget" name="scrollAreaWidgetContents_3">
+          <property name="geometry">
+           <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>592</width>
+            <height>346</height>
+           </rect>
           </property>
-          <property name="margin">
-           <number>0</number>
-          </property>
-          <item>
-           <widget class="QLabel" name="label_2">
-            <property name="text">
-             <string>Sort album:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_3">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item>
-             <widget class="QRadioButton" name="albumsSortAButton">
-              <property name="text">
-               <string>Alphabetical</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="albumsSortDButton">
-              <property name="text">
-               <string>By date</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="groupBox_3">
-         <property name="title">
-          <string/>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_5">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="margin">
-           <number>0</number>
-          </property>
-          <item>
-           <widget class="QLabel" name="label_4">
-            <property name="text">
-             <string>Orientation:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QGridLayout" name="orientationGridLayout">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item row="0" column="0">
-             <widget class="QRadioButton" name="orientationLButton">
-              <property name="text">
-               <string>Landscape</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="1">
-             <widget class="QRadioButton" name="orientationPButton">
-              <property name="text">
-               <string>Portrait</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="2">
-             <widget class="QRadioButton" name="orientationAButton">
-              <property name="text">
-               <string>Auto</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
+          <layout class="QVBoxLayout" name="verticalLayout_12">
+           <property name="spacing">
+            <number>12</number>
+           </property>
+           <property name="margin">
+            <number>0</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="groupBox">
+             <property name="title">
+              <string>Icons theme:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_2">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item>
+                 <widget class="QRadioButton" name="iconsWButton">
+                  <property name="text">
+                   <string>White</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="iconstBButton">
+                  <property name="text">
+                   <string>Black</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_4">
+             <property name="title">
+              <string>Use gradient in portrait mode:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_7">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_6">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item>
+                 <widget class="QRadioButton" name="gradientYButton">
+                  <property name="text">
+                   <string>Yes</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="gradientNButton">
+                  <property name="text">
+                   <string>No</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_6">
+             <property name="title">
+              <string>Active track color:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_10">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QGridLayout" name="cButtonsLayout" rowstretch="0,0">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item row="0" column="0">
+                 <widget class="QRadioButton" name="cBlueButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(100, 150, 220)</string>
+                  </property>
+                  <property name="text">
+                   <string>blue</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="1">
+                 <widget class="QRadioButton" name="cMagentaButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(150, 80, 150);</string>
+                  </property>
+                  <property name="text">
+                   <string>magenta</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="2">
+                 <widget class="QRadioButton" name="cRedButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(220, 100, 100);</string>
+                  </property>
+                  <property name="text">
+                   <string>red</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="3">
+                 <widget class="QRadioButton" name="cYellowButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(220, 220, 100);</string>
+                  </property>
+                  <property name="text">
+                   <string>yellow</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="1" column="0">
+                 <widget class="QRadioButton" name="cWhiteButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(255, 255, 255);</string>
+                  </property>
+                  <property name="text">
+                   <string>white</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="1" column="1">
+                 <widget class="QRadioButton" name="cBlackButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(0,0,0);</string>
+                  </property>
+                  <property name="text">
+                   <string>black</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="1" column="2">
+                 <widget class="QRadioButton" name="cLightButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(200, 200, 200);</string>
+                  </property>
+                  <property name="text">
+                   <string>light</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="1" column="3">
+                 <widget class="QRadioButton" name="cDarkButton">
+                  <property name="styleSheet">
+                   <string notr="true">color: rgb(70, 70, 70);</string>
+                  </property>
+                  <property name="text">
+                   <string>dark</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_3">
+             <property name="title">
+              <string>Orientation:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_5">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QGridLayout" name="orientationGridLayout">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item row="0" column="0">
+                 <widget class="QRadioButton" name="orientationLButton">
+                  <property name="text">
+                   <string>Landscape</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="1">
+                 <widget class="QRadioButton" name="orientationPButton">
+                  <property name="text">
+                   <string>Portrait</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="2">
+                 <widget class="QRadioButton" name="orientationAButton">
+                  <property name="text">
+                   <string>Auto</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="langBox">
+             <property name="title">
+              <string>Language:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_8">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_7">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item>
+                 <widget class="QRadioButton" name="engLangButton">
+                  <property name="text">
+                   <string>English</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="ruLangButton">
+                  <property name="text">
+                   <string>Russian</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <spacer name="verticalSpacer">
+                <property name="orientation">
+                 <enum>Qt::Vertical</enum>
+                </property>
+                <property name="sizeHint" stdset="0">
+                 <size>
+                  <width>20</width>
+                  <height>40</height>
+                 </size>
+                </property>
+               </spacer>
+              </item>
+             </layout>
+            </widget>
+           </item>
+          </layout>
+         </widget>
         </widget>
        </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="stackedWidgetPage2" native="true">
+      <layout class="QVBoxLayout" name="verticalLayout_15">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
        <item>
-        <widget class="QGroupBox" name="groupBox_2">
-         <property name="title">
-          <string/>
+        <widget class="QScrollArea" name="scrollArea_3">
+         <property name="widgetResizable">
+          <bool>true</bool>
          </property>
-         <layout class="QVBoxLayout" name="verticalLayout_4">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="margin">
-           <number>0</number>
+         <widget class="QWidget" name="scrollAreaWidgetContents_4">
+          <property name="geometry">
+           <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>592</width>
+            <height>346</height>
+           </rect>
           </property>
-          <item>
-           <widget class="QLabel" name="label_3">
-            <property name="text">
-             <string>Show track lenght in library view:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_4">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item>
-             <widget class="QRadioButton" name="showTrackLenghtYButton">
-              <property name="text">
-               <string>Yes</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="showTrackLenghtNButton">
-              <property name="text">
-               <string>No</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
+          <layout class="QVBoxLayout" name="verticalLayout_14">
+           <property name="spacing">
+            <number>12</number>
+           </property>
+           <property name="margin">
+            <number>0</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="albumSortingGroupBox">
+             <property name="enabled">
+              <bool>true</bool>
+             </property>
+             <property name="title">
+              <string>Sort album:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_3">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_3">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item>
+                 <widget class="QRadioButton" name="albumsSortAButton">
+                  <property name="text">
+                   <string>Alphabetical</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="albumsSortDButton">
+                  <property name="text">
+                   <string>By date</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_2">
+             <property name="title">
+              <string>Show track lenght in library view:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_4">
+              <property name="spacing">
+               <number>6</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_4">
+                <property name="spacing">
+                 <number>0</number>
+                </property>
+                <item>
+                 <widget class="QRadioButton" name="showTrackLenghtYButton">
+                  <property name="text">
+                   <string>Yes</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="showTrackLenghtNButton">
+                  <property name="text">
+                   <string>No</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <spacer name="verticalSpacer_2">
+             <property name="orientation">
+              <enum>Qt::Vertical</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>20</width>
+               <height>40</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </widget>
         </widget>
        </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="stackedWidgetPage3" native="true">
+      <layout class="QVBoxLayout" name="verticalLayout_17">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
        <item>
-        <widget class="QGroupBox" name="langBox">
-         <property name="title">
-          <string/>
+        <widget class="QScrollArea" name="scrollArea_4">
+         <property name="widgetResizable">
+          <bool>true</bool>
          </property>
-         <layout class="QVBoxLayout" name="verticalLayout_8">
-          <property name="spacing">
-           <number>6</number>
-          </property>
-          <property name="margin">
-           <number>0</number>
+         <widget class="QWidget" name="scrollAreaWidgetContents_5">
+          <property name="geometry">
+           <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>592</width>
+            <height>346</height>
+           </rect>
           </property>
-          <item>
-           <widget class="QLabel" name="label_6">
-            <property name="text">
-             <string>Language:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_7">
-            <property name="spacing">
-             <number>0</number>
-            </property>
-            <item>
-             <widget class="QRadioButton" name="engLangButton">
-              <property name="text">
-               <string>English</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="ruLangButton">
-              <property name="text">
-               <string>Russian</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <widget class="QGroupBox" name="groupBox_5">
-         <property name="title">
-          <string/>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_9">
-          <item>
-           <widget class="QLabel" name="label_8">
-            <property name="text">
-             <string>Pause when headphones unplugged:</string>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_2">
-            <item>
-             <widget class="QRadioButton" name="pauseHPYesButton">
-              <property name="text">
-               <string>Yes</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <widget class="QRadioButton" name="pauseHPNoButton">
-              <property name="text">
-               <string>No</string>
-              </property>
-             </widget>
-            </item>
-           </layout>
-          </item>
-         </layout>
+          <layout class="QVBoxLayout" name="verticalLayout_16">
+           <property name="spacing">
+            <number>12</number>
+           </property>
+           <property name="margin">
+            <number>0</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="groupBox_5">
+             <property name="title">
+              <string>Pause when headphones unplugged:</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_9">
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_2">
+                <item>
+                 <widget class="QRadioButton" name="pauseHPYesButton">
+                  <property name="text">
+                   <string>Yes</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="pauseHPNoButton">
+                  <property name="text">
+                   <string>No</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="hwKeysBox">
+             <property name="title">
+              <string>Use hardware keys</string>
+             </property>
+             <property name="checkable">
+              <bool>true</bool>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_11">
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>9</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <widget class="QLabel" name="hwkeysLabel">
+                <property name="text">
+                 <string>Zoom keys control:</string>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_8">
+                <item>
+                 <widget class="QRadioButton" name="hwVolumeButton">
+                  <property name="text">
+                   <string>Volume</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QRadioButton" name="hwTControlButton">
+                  <property name="text">
+                   <string>Tracks</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <spacer name="verticalSpacer_3">
+             <property name="orientation">
+              <enum>Qt::Vertical</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>20</width>
+               <height>40</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </widget>
         </widget>
        </item>
       </layout>
      </widget>
     </widget>
    </item>
-   <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>0</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
   </layout>
  </widget>
  <resources/>