fabric/simpleterminal.cpp
fabric/simpleterminal.cpp
Source code
/*
* Copyright (C) 2025-2026 Matthias Klumpp <matthias@tenstral.net>
*
* Licensed under the GNU Lesser General Public License Version 3
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the license, or
* (at your option) any later version.
*
* This software 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software. If not, see <http://www.gnu.org/licenses/>.
*/
#include "simpleterminal.h"
#include <QHBoxLayout>
#include <QToolButton>
#include <QPushButton>
#include <QLineEdit>
#include <QStyle>
#include <QIcon>
#include <QApplication>
#include <qtermwidget6/qtermwidget.h>
using namespace Syntalos;
SimpleTerminal::SimpleTerminal(QWidget *parent)
: QWidget(parent)
{
setWindowIcon(QIcon(":/icons/terminal"));
setWindowTitle(QStringLiteral("Syntalos Terminal"));
auto mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
auto buttonBar = new QWidget(this);
buttonBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
auto buttonLayout = new QHBoxLayout(buttonBar);
buttonLayout->setContentsMargins(4, 4, 4, 4);
buttonLayout->setSpacing(4);
// Copy button
m_copyBtn = new QToolButton(buttonBar);
m_copyBtn->setIcon(QIcon::fromTheme("edit-copy", QApplication::style()->standardIcon(QStyle::SP_DialogYesButton)));
m_copyBtn->setToolTip(tr("Copy selected text to clipboard"));
m_copyBtn->setText(tr("Copy"));
m_copyBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
m_copyBtn->setAutoRaise(true);
connect(m_copyBtn, &QToolButton::clicked, this, &SimpleTerminal::onCopyClicked);
// Paste button
m_pasteBtn = new QToolButton(buttonBar);
m_pasteBtn->setIcon(
QIcon::fromTheme("edit-paste", QApplication::style()->standardIcon(QStyle::SP_DialogApplyButton)));
m_pasteBtn->setToolTip(tr("Paste clipboard content to terminal"));
m_pasteBtn->setText(tr("Paste"));
m_pasteBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
m_pasteBtn->setAutoRaise(true);
connect(m_pasteBtn, &QToolButton::clicked, this, &SimpleTerminal::onPasteClicked);
// Clear button
auto clearBtn = new QToolButton(buttonBar);
clearBtn->setIcon(
QIcon::fromTheme("edit-clear", QApplication::style()->standardIcon(QStyle::SP_DialogResetButton)));
clearBtn->setToolTip(tr("Clear terminal screen"));
clearBtn->setText(tr("Clear"));
clearBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
clearBtn->setAutoRaise(true);
connect(clearBtn, &QToolButton::clicked, this, &SimpleTerminal::onClearClicked);
// Search button
m_searchBtn = new QToolButton(buttonBar);
m_searchBtn->setIcon(
QIcon::fromTheme("edit-find", QApplication::style()->standardIcon(QStyle::SP_FileDialogDetailedView)));
m_searchBtn->setToolTip(tr("Search in terminal"));
m_searchBtn->setText(tr("Search"));
m_searchBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
m_searchBtn->setAutoRaise(true);
connect(m_searchBtn, &QToolButton::clicked, this, &SimpleTerminal::onSearchToggled);
buttonLayout->addWidget(m_copyBtn);
buttonLayout->addWidget(m_pasteBtn);
buttonLayout->addWidget(clearBtn);
buttonLayout->addWidget(m_searchBtn);
buttonLayout->addStretch();
mainLayout->addWidget(buttonBar, 0); // 0 stretch factor - minimum size only
// Terminal widget
m_termWidget = new QTermWidget(0, this);
m_termWidget->setColorScheme("Linux");
m_termWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
connect(m_termWidget, &QTermWidget::finished, this, &SimpleTerminal::finished);
connect(m_termWidget, &QTermWidget::activity, this, &SimpleTerminal::activity);
mainLayout->addWidget(m_termWidget, 1); // 1 stretch factor - take all remaining space
setLayout(mainLayout);
resize(800, 400);
}
SimpleTerminal::~SimpleTerminal() {}
QTermWidget *SimpleTerminal::termWidget() const
{
return m_termWidget;
}
void SimpleTerminal::sendText(const QString &text)
{
m_termWidget->sendText(text);
}
void SimpleTerminal::setWorkingDirectory(const QString &dir)
{
m_termWidget->setWorkingDirectory(dir);
}
QString SimpleTerminal::workingDirectory() const
{
return m_termWidget->workingDirectory();
}
void SimpleTerminal::setShellProgram(const QString &shellPath)
{
m_termWidget->setShellProgram(shellPath);
}
void SimpleTerminal::startShell()
{
m_termWidget->startShellProgram();
}
void SimpleTerminal::clear()
{
m_termWidget->clear();
}
void SimpleTerminal::onCopyClicked()
{
m_termWidget->copyClipboard();
}
void SimpleTerminal::onPasteClicked()
{
m_termWidget->pasteClipboard();
}
void SimpleTerminal::onClearClicked()
{
m_termWidget->clear();
}
void SimpleTerminal::onSearchToggled(bool checked)
{
m_termWidget->toggleShowSearchBar();
}
void SimpleTerminal::closeEvent(QCloseEvent *event)
{
Q_EMIT windowClosed();
QWidget::closeEvent(event);
}Updated on 2026-02-12 at 17:03:04 +0000