Files
seer/src/SeerEditorWidgetSource.cpp
T

292 lines
11 KiB
C++
Raw Normal View History

2022-07-03 12:54:56 -05:00
#include "SeerEditorWidgetSource.h"
2021-09-01 13:58:59 -05:00
#include <QtGui/QColor>
#include <QtGui/QPainter>
#include <QtGui/QTextBlock>
#include <QtGui/QFont>
#include <QtGui/QIcon>
#include <QtGui/QRadialGradient>
#include <QtWidgets/QScrollBar>
#include <QtWidgets/QFileDialog>
2021-09-01 13:58:59 -05:00
#include <QtWidgets/QMenu>
#include <QAction>
2021-09-01 13:58:59 -05:00
#include <QtGui/QTextCursor>
#include <QtGui/QPalette>
#include <QtCore/QList>
#include <QtCore/QString>
#include <QtCore/QTextStream>
#include <QtCore/QFile>
#include <QtCore/QDebug>
2022-07-03 12:54:56 -05:00
SeerEditorWidgetSource::SeerEditorWidgetSource(QWidget* parent) : QWidget(parent) {
2021-09-01 13:58:59 -05:00
// Construct the UI.
setupUi(this);
// Set the widgets.
2022-07-09 15:32:13 -05:00
sourceArea()->show();
2022-06-26 11:04:25 -05:00
searchTextLineEdit->enableReturnPressedOnClear();
2021-09-01 13:58:59 -05:00
2022-02-24 16:38:12 -06:00
showSearchBar(false); // Hide the search bar. ctrl+F to show it again.
showAlternateBar(false); // Hide the alternate bar. ctrl+O to show it again.
showReloadBar(false); // Hide the reload file bar. Automatically shown if file gets updated.
2022-02-24 16:38:12 -06:00
setSearchMatchCase(true); // Search with case sensitivity.
2021-09-01 13:58:59 -05:00
_textSearchShortcut = new QShortcut(QKeySequence(tr("Ctrl+F")), this);
_textSearchNextShortcut = new QShortcut(QKeySequence(tr("Ctrl+G")), this);
_textSearchPrevShortcut = new QShortcut(QKeySequence(tr("Ctrl+Shift+G")), this);
_textSearchReloadShortcut = new QShortcut(QKeySequence(tr("Ctrl+R")), this);
_alternateDirShortcut = new QShortcut(QKeySequence(tr("Ctrl+O")), this);
2022-02-24 17:54:31 -06:00
setKeySettings(SeerKeySettings::populate());
2022-02-24 16:53:27 -06:00
2021-09-01 13:58:59 -05:00
// Connect things.
2022-07-03 12:54:56 -05:00
QObject::connect(searchTextLineEdit, &QLineEdit::returnPressed, this, &SeerEditorWidgetSource::handleSearchTextLineEdit);
#if QT_VERSION >= 0x060900
QObject::connect(matchCaseCheckBox, &QCheckBox::checkStateChanged, this, &SeerEditorWidgetSource::handleSearchTextLineEdit);
#else
2022-07-03 12:54:56 -05:00
QObject::connect(matchCaseCheckBox, &QCheckBox::stateChanged, this, &SeerEditorWidgetSource::handleSearchTextLineEdit);
#endif
2022-07-03 12:54:56 -05:00
QObject::connect(searchDownToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleSearchDownToolButton);
QObject::connect(searchUpToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleSearchUpToolButton);
QObject::connect(searchLineNumberLineEdit, &QLineEdit::returnPressed, this, &SeerEditorWidgetSource::handleSearchLineNumberLineEdit);
QObject::connect(searchReloadToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleReloadToolButton);
2022-07-03 12:54:56 -05:00
QObject::connect(searchCloseToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleSearchCloseToolButton);
QObject::connect(alternateCloseToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleAlternateCloseToolButton);
QObject::connect(alternateFileOpenToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleAlternateFileOpenToolButton);
QObject::connect(alternateLineEdit, &QLineEdit::returnPressed, this, &SeerEditorWidgetSource::handleAlternateLineEdit);
QObject::connect(reloadToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleReloadToolButton);
QObject::connect(reloadCloseToolButton, &QToolButton::clicked, this, &SeerEditorWidgetSource::handleReloadCloseToolButton);
2022-07-03 12:54:56 -05:00
QObject::connect(sourceWidget, &SeerEditorWidgetSourceArea::showSearchBar, this, &SeerEditorWidgetSource::showSearchBar);
QObject::connect(sourceWidget, &SeerEditorWidgetSourceArea::showAlternateBar, this, &SeerEditorWidgetSource::showAlternateBar);
QObject::connect(sourceWidget, &SeerEditorWidgetSourceArea::showReloadBar, this, &SeerEditorWidgetSource::showReloadBar);
2022-07-03 12:54:56 -05:00
QObject::connect(_textSearchShortcut, &QShortcut::activated, this, &SeerEditorWidgetSource::handleTextSearchShortcut);
QObject::connect(_textSearchNextShortcut, &QShortcut::activated, this, &SeerEditorWidgetSource::handleSearchDownToolButton);
QObject::connect(_textSearchPrevShortcut, &QShortcut::activated, this, &SeerEditorWidgetSource::handleSearchUpToolButton);
QObject::connect(_textSearchReloadShortcut, &QShortcut::activated, this, &SeerEditorWidgetSource::handleReloadToolButton);
2022-07-03 12:54:56 -05:00
QObject::connect(_alternateDirShortcut, &QShortcut::activated, this, &SeerEditorWidgetSource::handleAlternateDirectoryShortcut);
2021-09-01 13:58:59 -05:00
}
2022-07-03 12:54:56 -05:00
SeerEditorWidgetSource::~SeerEditorWidgetSource () {
2021-09-01 13:58:59 -05:00
}
2022-07-03 12:54:56 -05:00
SeerEditorWidgetSourceArea* SeerEditorWidgetSource::sourceArea () {
2022-10-15 10:36:43 -05:00
2021-09-01 13:58:59 -05:00
return sourceWidget;
}
2022-07-03 12:54:56 -05:00
bool SeerEditorWidgetSource::isSearchBarShown () const {
2021-09-01 13:58:59 -05:00
2022-10-15 10:36:43 -05:00
return searchBarWidget->isVisible();
2021-09-01 13:58:59 -05:00
}
2022-07-03 12:54:56 -05:00
bool SeerEditorWidgetSource::searchMatchCase () const {
2021-09-01 13:58:59 -05:00
2022-02-24 16:38:12 -06:00
return matchCaseCheckBox->isChecked();
2021-09-01 13:58:59 -05:00
}
2022-07-03 12:54:56 -05:00
bool SeerEditorWidgetSource::isAlternateBarShown () const {
2021-09-01 13:58:59 -05:00
2022-10-15 10:36:43 -05:00
return alternateBarWidget->isVisible();
2021-09-01 13:58:59 -05:00
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::setKeySettings (const SeerKeySettings& settings) {
2022-02-24 17:54:31 -06:00
_keySettings = settings;
if (_keySettings.has("SearchText") == true) {
_textSearchShortcut->setKey(_keySettings.get("SearchText")._sequence);
}
if (_keySettings.has("SearchTextNext") == true) {
_textSearchNextShortcut->setKey(_keySettings.get("SearchTextNext")._sequence);
}
if (_keySettings.has("SearchTextPrev") == true) {
_textSearchPrevShortcut->setKey(_keySettings.get("SearchTextPrev")._sequence);
}
2022-02-24 17:54:31 -06:00
if (_keySettings.has("AlternateDir") == true) {
_alternateDirShortcut->setKey(_keySettings.get("AlternateDir")._sequence);
}
}
2022-07-03 12:54:56 -05:00
const SeerKeySettings& SeerEditorWidgetSource::keySettings () const {
2022-02-24 17:54:31 -06:00
return _keySettings;
}
2021-09-01 13:58:59 -05:00
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::showSearchBar (bool flag) {
2021-09-01 13:58:59 -05:00
2022-10-15 10:36:43 -05:00
searchBarWidget->setVisible(flag);
2021-09-01 13:58:59 -05:00
// If 'show', give the searchTextLineEdit the focus.
if (flag) {
searchTextLineEdit->setFocus(Qt::MouseFocusReason);
}
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::setSearchMatchCase (bool flag) {
2021-12-13 19:57:37 -06:00
2022-02-24 16:38:12 -06:00
matchCaseCheckBox->setChecked(flag);
2021-12-13 19:57:37 -06:00
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::showAlternateBar (bool flag) {
2021-12-13 19:57:37 -06:00
2022-10-15 10:36:43 -05:00
alternateBarWidget->setVisible(flag);
2021-12-13 19:57:37 -06:00
if (flag) {
originalLineEdit->setText(sourceArea()->fullname()); // Set the original text.
rememberAlternateCheckBox->setChecked(true); // Set the default remember setting.
alternateLineEdit->setFocus(Qt::MouseFocusReason); // If 'show', give the alternateLineEdit the focus.
2021-12-13 19:57:37 -06:00
}
}
void SeerEditorWidgetSource::showReloadBar (bool flag) {
reloadBarWidget->setVisible(flag);
reloadBarWidget->setStyleSheet("QWidget { background-color : #00AA00; color : #FFFF00; }");
if (flag) {
reloadFilenameLabel->setText("The file \"" + sourceArea()->file() + "\" has changed on disk.");
reloadToolButton->setFocus(Qt::MouseFocusReason); // If 'show', give the reload button the focus.
}else{
reloadFilenameLabel->setText("");
}
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleSearchLineNumberLineEdit () {
2021-12-13 19:57:37 -06:00
2022-02-24 16:38:12 -06:00
QString str = searchLineNumberLineEdit->text();
2021-12-13 19:57:37 -06:00
2022-02-24 16:38:12 -06:00
if (str == "") {
return;
2021-12-13 19:57:37 -06:00
}
2022-02-24 16:38:12 -06:00
int lineno = str.toInt();
if (lineno < 1) {
return;
}
searchLineNumberLineEdit->clear();
sourceArea()->scrollToLine(lineno);
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleSearchTextLineEdit () {
2022-02-24 16:38:12 -06:00
QString str = searchTextLineEdit->text();
2022-02-27 13:17:11 -06:00
matchesLabel->setText("");
2022-02-24 16:38:12 -06:00
if (str == "") {
2022-02-27 13:17:11 -06:00
sourceArea()->clearFindText();
2022-02-24 16:38:12 -06:00
return;
}
2022-04-28 20:20:37 -05:00
int nMatches = sourceArea()->findText(str, (searchMatchCase() ? QTextDocument::FindCaseSensitively : QTextDocument::FindFlags()));
2022-02-27 13:17:11 -06:00
matchesLabel->setText(QString("(%1)").arg(nMatches));
2022-02-24 16:38:12 -06:00
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleSearchDownToolButton () {
2022-02-24 16:38:12 -06:00
QString str = searchTextLineEdit->text();
if (str == "") {
return;
}
2022-04-28 20:20:37 -05:00
sourceArea()->find(str, (searchMatchCase() ? QTextDocument::FindCaseSensitively : QTextDocument::FindFlags()));
2022-02-24 16:38:12 -06:00
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleSearchUpToolButton () {
2022-02-24 16:38:12 -06:00
QString str = searchTextLineEdit->text();
if (str == "") {
return;
}
2022-04-28 20:20:37 -05:00
sourceArea()->find(str, (searchMatchCase() ? QTextDocument::FindCaseSensitively : QTextDocument::FindFlags()) | QTextDocument::FindBackward);
2021-12-13 19:57:37 -06:00
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleSearchCloseToolButton () {
2021-09-01 13:58:59 -05:00
showSearchBar(false);
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleAlternateCloseToolButton () {
showAlternateBar(false);
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleAlternateFileOpenToolButton () {
//qDebug() << "fullname =" << sourceArea()->fullname();
//qDebug() << "file =" << sourceArea()->file();
QString filename = QFileDialog::getOpenFileName(this, "Locate File", sourceArea()->fullname(), QString("File (%1)").arg(sourceArea()->file()), nullptr, QFileDialog::DontUseNativeDialog);
//qDebug() << "location =" << filename;
//qDebug() << "directory=" << QFileInfo(filename).absolutePath();
if (filename != "") {
alternateLineEdit->setText(QFileInfo(filename).absolutePath());
}
handleAlternateLineEdit();
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleAlternateLineEdit () {
showAlternateBar(false);
// Get the base path.
QString dirname = alternateLineEdit->text();
if (dirname == "") {
return;
}
//qDebug() << "alternate dirname=" << dirname;
// Attempt to open the file.
sourceArea()->open(sourceArea()->fullname(), sourceArea()->file(), dirname);
// Add to global alternate list.
if (rememberAlternateCheckBox->isChecked()) {
emit addAlternateDirectory(dirname);
}
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleTextSearchShortcut () {
2022-02-24 16:53:27 -06:00
if (isSearchBarShown() == true) {
showSearchBar(false);
}else{
showSearchBar(true);
}
}
2022-07-03 12:54:56 -05:00
void SeerEditorWidgetSource::handleAlternateDirectoryShortcut () {
2022-02-24 16:53:27 -06:00
if (isAlternateBarShown() == true) {
showAlternateBar(false);
}else{
showAlternateBar(true);
}
}
void SeerEditorWidgetSource::handleReloadToolButton () {
showReloadBar(false);
sourceArea()->reload();
}
void SeerEditorWidgetSource::handleReloadCloseToolButton () {
showReloadBar(false);
}