diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ddbc7c44c..36ac028b5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,6 +13,7 @@ set(CLEMENTINE-SOURCES analyzers/analyzerbase.cpp fht.cpp analyzers/blockanalyzer.cpp + analyzers/analyzercontainer.cpp sliderwidget.cpp playlistview.cpp librarywatcher.cpp @@ -104,6 +105,10 @@ set(CLEMENTINE-MOC-HEADERS m3uparser.h playlistsequence.h xspfparser.h + analyzers/analyzercontainer.h + analyzers/baranalyzer.h + analyzers/blockanalyzer.h + analyzers/analyzerbase.h ) # UI files diff --git a/src/analyzers/analyzerbase.h b/src/analyzers/analyzerbase.h index e402171e9..d79b8de06 100644 --- a/src/analyzers/analyzerbase.h +++ b/src/analyzers/analyzerbase.h @@ -36,14 +36,17 @@ typedef std::vector Scope; class Base : public QWidget { + Q_OBJECT + public: + ~Base() { delete m_fht; } + uint timeout() const { return m_timeout; } void set_engine(EngineBase* engine) { m_engine = engine; } protected: Base( QWidget*, uint timeout, uint scopeSize = 7 ); - ~Base() { delete m_fht; } void hideEvent(QHideEvent *); void showEvent(QShowEvent *); diff --git a/src/analyzers/analyzercontainer.cpp b/src/analyzers/analyzercontainer.cpp new file mode 100644 index 000000000..fe9b4600d --- /dev/null +++ b/src/analyzers/analyzercontainer.cpp @@ -0,0 +1,91 @@ +#include "analyzercontainer.h" +#include "baranalyzer.h" +#include "blockanalyzer.h" + +#include +#include +#include + +const char* AnalyzerContainer::kSettingsGroup = "Analyzer"; + +AnalyzerContainer::AnalyzerContainer(QWidget *parent) + : QWidget(parent), + context_menu_(new QMenu(this)), + group_(new QActionGroup(this)), + mapper_(new QSignalMapper(this)), + current_analyzer_(NULL), + engine_(NULL) +{ + QHBoxLayout* layout = new QHBoxLayout(this); + setLayout(layout); + layout->setContentsMargins(0, 0, 0, 0); + + AddAnalyzerType(); + AddAnalyzerType(); + connect(mapper_, SIGNAL(mapped(int)), SLOT(ChangeAnalyzer(int))); + + context_menu_->addSeparator(); + + disable_action_ = + context_menu_->addAction(tr("No analyzer"), this, SLOT(DisableAnalyzer())); + disable_action_->setCheckable(true); + group_->addAction(disable_action_); + + Load(); +} + +void AnalyzerContainer::contextMenuEvent(QContextMenuEvent* e) { + context_menu_->popup(e->globalPos()); +} + +void AnalyzerContainer::set_engine(EngineBase *engine) { + if (current_analyzer_) + current_analyzer_->set_engine(engine); + engine_ = engine; +} + +void AnalyzerContainer::DisableAnalyzer() { + delete current_analyzer_; + current_analyzer_ = NULL; + + Save(); +} + +void AnalyzerContainer::ChangeAnalyzer(int id) { + delete current_analyzer_; + current_analyzer_ = qobject_cast( + analyzer_types_[id]->newInstance(Q_ARG(QWidget*, this))); + current_analyzer_->set_engine(engine_); + + layout()->addWidget(current_analyzer_); + + Save(); +} + +void AnalyzerContainer::Load() { + QSettings s; + s.beginGroup(kSettingsGroup); + + QString type = s.value("type", "BlockAnalyzer").toString(); + if (type.isEmpty()) { + DisableAnalyzer(); + disable_action_->setChecked(true); + } else { + for (int i=0 ; iclassName()) { + ChangeAnalyzer(i); + actions_[i]->setChecked(true); + break; + } + } + } +} + +void AnalyzerContainer::Save() { + QSettings s; + s.beginGroup(kSettingsGroup); + + s.setValue("type", current_analyzer_ ? + current_analyzer_->metaObject()->className() : + QVariant()); +} diff --git a/src/analyzers/analyzercontainer.h b/src/analyzers/analyzercontainer.h new file mode 100644 index 000000000..7831050be --- /dev/null +++ b/src/analyzers/analyzercontainer.h @@ -0,0 +1,60 @@ +#ifndef ANALYZERCONTAINER_H +#define ANALYZERCONTAINER_H + +#include +#include +#include + +#include "analyzerbase.h" +#include "engine_fwd.h" + +class AnalyzerContainer : public QWidget { + Q_OBJECT + +public: + AnalyzerContainer(QWidget* parent); + + void set_engine(EngineBase* engine); + + static const char* kSettingsGroup; + +protected: + void contextMenuEvent(QContextMenuEvent *); + +private slots: + void ChangeAnalyzer(int id); + void DisableAnalyzer(); + +private: + void Load(); + void Save(); + template + void AddAnalyzerType(); + +private: + QMenu* context_menu_; + QActionGroup* group_; + QSignalMapper* mapper_; + + QList analyzer_types_; + QList actions_; + QAction* disable_action_; + + Analyzer::Base* current_analyzer_; + EngineBase* engine_; +}; + +template + void AnalyzerContainer::AddAnalyzerType() { + int id = analyzer_types_.count(); + analyzer_types_ << &T::staticMetaObject; + + QAction* action = context_menu_->addAction(tr(T::kName), mapper_, SLOT(map())); + group_->addAction(action); + mapper_->setMapping(action, id); + action->setCheckable(true); + actions_ << action; +} + +#endif + diff --git a/src/analyzers/baranalyzer.cpp b/src/analyzers/baranalyzer.cpp index b323b4256..70ddf628b 100644 --- a/src/analyzers/baranalyzer.cpp +++ b/src/analyzers/baranalyzer.cpp @@ -16,6 +16,8 @@ #include #include +const char* BarAnalyzer::kName = QT_TR_NOOP("Bar analyzer"); + BarAnalyzer::BarAnalyzer( QWidget *parent ) : Analyzer::Base( parent, 12, 8 ) diff --git a/src/analyzers/baranalyzer.h b/src/analyzers/baranalyzer.h index 2bb73dd2c..b51c7275c 100644 --- a/src/analyzers/baranalyzer.h +++ b/src/analyzers/baranalyzer.h @@ -13,8 +13,9 @@ typedef std::vector aroofMemVec; class BarAnalyzer : public Analyzer::Base { + Q_OBJECT public: - BarAnalyzer( QWidget* ); + Q_INVOKABLE BarAnalyzer( QWidget* ); void init(); virtual void analyze( QPainter& p, const Scope& ); @@ -34,6 +35,8 @@ class BarAnalyzer : public Analyzer::Base static const uint NUM_ROOFS = 16; static const uint COLUMN_WIDTH = 4; + static const char* kName; + protected: QPixmap m_pixRoof[NUM_ROOFS]; //vector m_roofMem[BAND_COUNT]; diff --git a/src/analyzers/blockanalyzer.cpp b/src/analyzers/blockanalyzer.cpp index 96f458db3..53375924f 100644 --- a/src/analyzers/blockanalyzer.cpp +++ b/src/analyzers/blockanalyzer.cpp @@ -21,6 +21,8 @@ const uint BlockAnalyzer::MIN_COLUMNS = 32; //arbituary const uint BlockAnalyzer::MAX_COLUMNS = 256; //must be 2**n const uint BlockAnalyzer::FADE_SIZE = 90; +const char* BlockAnalyzer::kName = QT_TR_NOOP("Block analyzer"); + BlockAnalyzer::BlockAnalyzer( QWidget *parent ) : Analyzer::Base( parent, 20, 9 ) , m_columns( 0 ) //uint diff --git a/src/analyzers/blockanalyzer.h b/src/analyzers/blockanalyzer.h index f934960f8..7f4e06205 100644 --- a/src/analyzers/blockanalyzer.h +++ b/src/analyzers/blockanalyzer.h @@ -19,8 +19,9 @@ class QPalette; class BlockAnalyzer : public Analyzer::Base { + Q_OBJECT public: - BlockAnalyzer( QWidget* ); + Q_INVOKABLE BlockAnalyzer( QWidget* ); ~BlockAnalyzer(); static const uint HEIGHT; @@ -30,6 +31,8 @@ public: static const uint MAX_COLUMNS; static const uint FADE_SIZE; + static const char* kName; + protected: virtual void transform( Scope& ); virtual void analyze( QPainter& p, const Scope& ); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 956051d5d..f4e69d3e1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 319930325..154d2f783 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -215,7 +215,7 @@ - + 100 @@ -747,12 +747,6 @@ QLineEdit
lineedit.h
- - BlockAnalyzer - QWidget -
analyzers/blockanalyzer.h
- 1 -
Amarok::VolumeSlider QSlider @@ -779,6 +773,12 @@ QTreeView
radioview.h
+ + AnalyzerContainer + QWidget +
analyzers/analyzercontainer.h
+ 1 +