mainwindow: add action to close (or unsplit) current text panel
4 files changed, 30 insertions(+), 0 deletions(-)

M app/hgtextpanel.cpp
M app/mainactions.h
M app/mainwindow.cpp
M app/mainwindow.h
M app/hgtextpanel.cpp +1 -0
@@ 292,6 292,7 @@ void HgTextPanel::popupContextMenuForTex
     menu->setAttribute(Qt::WA_DeleteOnClose);
     menu->addAction(actions_->toggleLogDock);
     menu->addAction(&actions_->selectOtherPanel);
+    menu->addAction(&actions_->closePanel);
     menu->addAction(&actions_->execSettingsDialog);
     menu->popup(ui_->textEdit->viewport()->mapToGlobal(pos));
 }

          
M app/mainactions.h +1 -0
@@ 12,6 12,7 @@ struct MainActions
     QAction closeRepository;
     QAction selectOtherPanel;
     QAction splitRevisionPanel;
+    QAction closePanel;
     QPointer<QAction> toggleLogDock;
 
     QAction reload;

          
M app/mainwindow.cpp +27 -0
@@ 118,6 118,11 @@ MainWindow::MainWindow(QWidget *parent)
     connect(&actions_->splitRevisionPanel, &QAction::triggered, this,
             &MainWindow::splitRevisionPanel);
 
+    actions_->closePanel.setText(tr("&Close Panel"));
+    actions_->closePanel.setShortcut(QKeySequence("Ctrl+X, 0"));
+    addAction(&actions_->closePanel);
+    connect(&actions_->closePanel, &QAction::triggered, this, &MainWindow::closeCurrentPanel);
+
     actions_->toggleLogDock = logDock_->toggleViewAction();
     actions_->toggleLogDock->setShortcut(QKeySequence("F12"));
     addAction(actions_->toggleLogDock);

          
@@ 291,6 296,28 @@ void MainWindow::splitRevisionPanel()
     textPanel_->displayRevision(changesetPanel_->currentRevision());
 }
 
+void MainWindow::closeCurrentPanel()
+{
+    auto *panel = findAncestorSplitterChild(focusWidget(), mainSplitter_);
+    if (!panel || panel == changesetPanel_)
+        return;
+    // TODO: redesign routing between changeset panel and text panel
+    if (panel == textPanel_) {
+        std::vector<HgTextPanel *> textPanels;
+        collectSplitterChildren(textPanels, mainSplitter_);
+        textPanel_ =
+            textPanels.size() > 1 ? nextInCircularList(textPanels, textPanel_.data()) : nullptr;
+        if (textPanel_) {
+            connect(changesetPanel_, &HgChangesetPanel::currentRepositoryChanged, textPanel_,
+                    &HgTextPanel::setCurrentRepository);
+            connect(changesetPanel_, &HgChangesetPanel::revisionActivated, textPanel_,
+                    &HgTextPanel::displayRevision);
+        }
+    }
+    selectOtherPanel();  // move focus out of the panel to be deleted
+    delete panel;
+}
+
 void MainWindow::popupContextMenu(const QPoint &pos)
 {
     auto *menu = new QMenu(this);

          
M app/mainwindow.h +1 -0
@@ 45,6 45,7 @@ private slots:
     void onCurrentRepositoryChanged();
     void selectOtherPanel();
     void splitRevisionPanel();
+    void closeCurrentPanel();
     void popupContextMenu(const QPoint &pos);
 
     void onLastRepositoryClosed();