diff --git a/debugger/framestack/framestackwidget.cpp b/debugger/framestack/framestackwidget.cpp --- a/debugger/framestack/framestackwidget.cpp +++ b/debugger/framestack/framestackwidget.cpp @@ -254,8 +254,7 @@ void FramestackWidget::sessionStateChanged(KDevelop::IDebugSession::DebuggerState state) { bool enable = state == IDebugSession::PausedState || state == IDebugSession::StoppedState; - m_framesTreeView->setEnabled(enable); - m_threadsListView->setEnabled(enable); + setEnabled(enable); } } diff --git a/sublime/idealbuttonbarwidget.h b/sublime/idealbuttonbarwidget.h --- a/sublime/idealbuttonbarwidget.h +++ b/sublime/idealbuttonbarwidget.h @@ -27,6 +27,7 @@ #include class IdealToolButton; +class ToolViewAction; class QAction; namespace Sublime { @@ -44,7 +45,7 @@ IdealButtonBarWidget(Qt::DockWidgetArea area, IdealController *controller, Sublime::MainWindow *parent); - QAction* addWidget(const QString& title, IdealDockWidget *widget, + QAction* addWidget(IdealDockWidget *widget, Area* area, View *view); void removeAction(QAction* action); @@ -76,8 +77,6 @@ private: Qt::DockWidgetArea _area; IdealController *_controller; - QHash _buttons; - QHash _widgets; QWidget *_corner; bool _showState; }; diff --git a/sublime/idealbuttonbarwidget.cpp b/sublime/idealbuttonbarwidget.cpp --- a/sublime/idealbuttonbarwidget.cpp +++ b/sublime/idealbuttonbarwidget.cpp @@ -37,6 +37,61 @@ using namespace Sublime; +class ToolViewAction : public QAction +{ +public: + ToolViewAction(IdealDockWidget *dock, QObject* parent) : QAction(parent), m_dock(dock) + { + setCheckable(true); + + const QString title = dock->view()->document()->title(); + setIcon(dock->windowIcon()); + setToolTip(i18n("Toggle '%1' tool view.", title)); + setText(title); + + //restore toolview shortcut config + KConfigGroup config = KSharedConfig::openConfig()->group("UI"); + QStringList shortcutStrings = config.readEntry(QStringLiteral("Shortcut for %1").arg(title), QStringList()); + setShortcuts({ QKeySequence::fromString(shortcutStrings.value(0)), QKeySequence::fromString(shortcutStrings.value(1)) }); + + dock->setWindowTitle(title); + dock->view()->widget()->installEventFilter(this); + refreshText(); + } + + IdealDockWidget *dockWidget() const + { + Q_ASSERT(m_dock); + return m_dock; + } + + IdealToolButton* button() { return m_button; } + void setButton(IdealToolButton* button) { + m_button = button; + refreshText(); + } + +private: + bool eventFilter(QObject * watched, QEvent * event) override + { + if (watched == m_dock->view()->widget() && event->type() == QEvent::EnabledChange) { + refreshText(); + } + + return QObject::eventFilter(watched, event); + } + + void refreshText() + { + const auto widget = m_dock->view()->widget(); + const QString title = m_dock->view()->document()->title(); + setText(widget->isEnabled() ? title : QStringLiteral("(%1)").arg(title)); + } + + QPointer m_dock; + QPointer m_button; +}; + IdealButtonBarWidget::IdealButtonBarWidget(Qt::DockWidgetArea area, IdealController *controller, Sublime::MainWindow *parent) : QWidget(parent) @@ -69,31 +124,19 @@ (void) new IdealButtonBarLayout(orientation(), this); } -QAction* IdealButtonBarWidget::addWidget(const QString& title, IdealDockWidget *dock, +QAction* IdealButtonBarWidget::addWidget(IdealDockWidget *dock, Area *area, View *view) { - QAction* action = new QAction(this); - action->setCheckable(true); - action->setText(title); - action->setIcon(dock->windowIcon()); - - //restore toolview shortcut config - KConfigGroup config = KSharedConfig::openConfig()->group("UI"); - QList shortcuts; - QStringList shortcutStrings = config.readEntry(QStringLiteral("Shortcut for %1").arg(view->document()->title()), QStringList()); - shortcuts << QKeySequence::fromString(shortcutStrings.value(0)) << QKeySequence::fromString(shortcutStrings.value(1)); - action->setShortcuts(shortcuts); - if (_area == Qt::BottomDockWidgetArea || _area == Qt::TopDockWidgetArea) dock->setFeatures( dock->features() | IdealDockWidget::DockWidgetVerticalTitleBar ); dock->setArea(area); dock->setView(view); dock->setDockWidgetArea(_area); - _widgets[action] = dock; - bool wasEmpty = actions().isEmpty(); + + auto action = new ToolViewAction(dock, this); addAction(action); if(wasEmpty) @@ -106,10 +149,10 @@ return _corner; } -void IdealButtonBarWidget::removeAction(QAction * action) +void IdealButtonBarWidget::removeAction(QAction * widgetAction) { - _widgets.remove(action); - delete _buttons.take(action); + auto action = dynamic_cast(widgetAction); + delete action->button(); delete action; } @@ -157,12 +200,11 @@ showWidget(action, checked); } -void IdealButtonBarWidget::showWidget(QAction *widgetAction, bool checked) +void IdealButtonBarWidget::showWidget(QAction *action, bool checked) { - IdealDockWidget *widget = _widgets.value(widgetAction); - Q_ASSERT(widget); + auto widgetAction = dynamic_cast(action); - IdealToolButton* button = _buttons.value(widgetAction); + IdealToolButton* button = widgetAction->button(); Q_ASSERT(button); if (checked) { @@ -178,56 +220,51 @@ } } - _controller->lastDockWidget[_area] = widget; + _controller->lastDockWidget[_area] = widgetAction->dockWidget(); } - _controller->showDockWidget(widget, checked); + _controller->showDockWidget(widgetAction->dockWidget(), checked); widgetAction->setChecked(checked); button->setChecked(checked); } void IdealButtonBarWidget::actionEvent(QActionEvent *event) { - QAction *action = qobject_cast(event->action()); - if (! action) + auto action = dynamic_cast(event->action()); + if (!action) return; switch (event->type()) { case QEvent::ActionAdded: { bool wasEmpty = isEmpty(); - if (! _buttons.contains(action)) { + if (!action->button()) { IdealToolButton *button = new IdealToolButton(_area); //apol: here we set the usual width of a button for the vertical toolbars as the minimumWidth //this is done because otherwise when we remove all the buttons and re-add new ones we get all //the screen flickering. This is solved by not defaulting to a smaller width when it's empty int w = button->sizeHint().width(); if(orientation()==Qt::Vertical && w>minimumWidth()) setMinimumWidth(w); - _buttons.insert(action, button); + action->setButton(button); + button->setDefaultAction(action); - button->setText(action->text()); - button->setToolTip(i18n("Toggle '%1' tool view.", action->text())); - button->setIcon(action->icon()); - button->setShortcut(QKeySequence()); - button->setChecked(action->isChecked()); - - Q_ASSERT(_widgets.contains(action)); - _widgets[action]->setWindowTitle(action->text()); + Q_ASSERT(action->dockWidget()); layout()->addWidget(button); connect(action, &QAction::toggled, this, static_cast(&IdealButtonBarWidget::showWidget)); connect(button, &IdealToolButton::clicked, this, &IdealButtonBarWidget::buttonPressed); connect(button, &IdealToolButton::customContextMenuRequested, - _widgets[action], &IdealDockWidget::contextMenuRequested); + action->dockWidget(), &IdealDockWidget::contextMenuRequested); if ( wasEmpty ) { emit emptyChanged(); } } } break; case QEvent::ActionRemoved: { - if (IdealToolButton *button = _buttons.value(action)) { + IdealToolButton *button = action->button(); + if (button) { for (int index = 0; index < layout()->count(); ++index) { if (QLayoutItem *item = layout()->itemAt(index)) { if (item->widget() == button) { @@ -243,30 +280,26 @@ } } break; - case QEvent::ActionChanged: { - if (IdealToolButton *button = _buttons.value(action)) { - button->setText(action->text()); - button->setIcon(action->icon()); - button->setShortcut(QKeySequence()); - Q_ASSERT(_widgets.contains(action)); - } - } break; - default: break; } } -IdealDockWidget * IdealButtonBarWidget::widgetForAction(QAction *action) const +IdealDockWidget * IdealButtonBarWidget::widgetForAction(QAction *_action) const { - return _widgets.value(action); + return dynamic_cast(_action)->dockWidget(); } void IdealButtonBarWidget::buttonPressed(bool state) { auto button = qobject_cast(sender()); Q_ASSERT(button); - auto action = _buttons.key(button); + ToolViewAction* action = nullptr; + foreach(QAction* a, actions()) { + auto tva = dynamic_cast(a); + if (tva && tva->button() == button) + action = tva; + } Q_ASSERT(action); const bool forceGrouping = QApplication::keyboardModifiers().testFlag(Qt::ControlModifier); diff --git a/sublime/idealcontroller.cpp b/sublime/idealcontroller.cpp --- a/sublime/idealcontroller.cpp +++ b/sublime/idealcontroller.cpp @@ -123,9 +123,7 @@ dock->setFocusProxy(dock->widget()); if (IdealButtonBarWidget* bar = barForDockArea(area)) { - QAction* action = bar->addWidget( - view->document()->title(), dock, - static_cast(parent())->area(), view); + QAction* action = bar->addWidget(dock, static_cast(parent())->area(), view); m_dockwidget_to_action[dock] = m_view_to_action[view] = action; m_docks->addAction(action); @@ -167,9 +165,7 @@ docks.insert(dock); if (IdealButtonBarWidget* bar = barForDockArea(area)) { - QAction* action = bar->addWidget( - view->document()->title(), dock, - static_cast(parent())->area(), view); + QAction* action = bar->addWidget(dock, static_cast(parent())->area(), view); m_dockwidget_to_action[dock] = m_view_to_action[view] = action; // at this point the dockwidget is visible (user dragged it)