diff --git a/src/analyzers/analyzercontainer.cpp b/src/analyzers/analyzercontainer.cpp index a3603aa72..e4f42616e 100644 --- a/src/analyzers/analyzercontainer.cpp +++ b/src/analyzers/analyzercontainer.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include const char* AnalyzerContainer::kSettingsGroup = "Analyzer"; @@ -33,6 +34,9 @@ AnalyzerContainer::AnalyzerContainer(QWidget *parent) context_menu_(new QMenu(this)), group_(new QActionGroup(this)), mapper_(new QSignalMapper(this)), + visualisation_action_(NULL), + double_click_timer_(new QTimer(this)), + ignore_next_click_(false), current_analyzer_(NULL), engine_(NULL) { @@ -46,23 +50,54 @@ AnalyzerContainer::AnalyzerContainer(QWidget *parent) 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_); + context_menu_->addSeparator(); + // Visualisation action gets added in SetActions + + double_click_timer_->setSingleShot(true); + double_click_timer_->setInterval(250); + connect(double_click_timer_, SIGNAL(timeout()), SLOT(ShowPopupMenu())); + Load(); } -void AnalyzerContainer::mouseReleaseEvent(QMouseEvent* e) { - if (e->button() == Qt::LeftButton || e->button() == Qt::RightButton) - context_menu_->popup(e->globalPos()); +void AnalyzerContainer::SetActions(QAction* visualisation) { + visualisation_action_ = visualisation; + context_menu_->addAction(visualisation_action_); } -void AnalyzerContainer::set_engine(EngineBase *engine) { +void AnalyzerContainer::mouseReleaseEvent(QMouseEvent* e) { + if (e->button() == Qt::LeftButton) { + if (ignore_next_click_) { + ignore_next_click_ = false; + } else { + // Might be the first click in a double click, so wait a while before + // actually doing anything + double_click_timer_->start(); + last_click_pos_ = e->globalPos(); + } + } else if (e->button() == Qt::RightButton) { + context_menu_->popup(e->globalPos()); + } +} + +void AnalyzerContainer::ShowPopupMenu() { + context_menu_->popup(last_click_pos_); +} + +void AnalyzerContainer::mouseDoubleClickEvent(QMouseEvent *) { + double_click_timer_->stop(); + ignore_next_click_ = true; + + if (visualisation_action_) + visualisation_action_->trigger(); +} + +void AnalyzerContainer::SetEngine(EngineBase *engine) { if (current_analyzer_) current_analyzer_->set_engine(engine); engine_ = engine; diff --git a/src/analyzers/analyzercontainer.h b/src/analyzers/analyzercontainer.h index ee4d60d19..93549fbbc 100644 --- a/src/analyzers/analyzercontainer.h +++ b/src/analyzers/analyzercontainer.h @@ -30,16 +30,19 @@ class AnalyzerContainer : public QWidget { public: AnalyzerContainer(QWidget* parent); - void set_engine(EngineBase* engine); + void SetEngine(EngineBase* engine); + void SetActions(QAction* visualisation); static const char* kSettingsGroup; protected: void mouseReleaseEvent(QMouseEvent *); + void mouseDoubleClickEvent(QMouseEvent *); private slots: void ChangeAnalyzer(int id); void DisableAnalyzer(); + void ShowPopupMenu(); private: void Load(); @@ -56,6 +59,11 @@ private: QList actions_; QAction* disable_action_; + QAction* visualisation_action_; + QTimer* double_click_timer_; + QPoint last_click_pos_; + bool ignore_next_click_; + Analyzer::Base* current_analyzer_; EngineBase* engine_; }; diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 63541a0ea..f7fe1eee9 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -444,7 +444,8 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg connect(add_stream_dialog_.get(), SIGNAL(accepted()), SLOT(AddStreamAccepted())); // Analyzer - ui_->analyzer->set_engine(player_->GetEngine()); + ui_->analyzer->SetEngine(player_->GetEngine()); + ui_->analyzer->SetActions(ui_->action_visualisations); // Equalizer connect(equalizer_.get(), SIGNAL(ParametersChanged(int,QList)),