Files
seer/src/SeerMacroToolButton.cpp
T
2026-01-11 17:03:40 -06:00

171 lines
3.8 KiB
C++

// SPDX-FileCopyrightText: 2026 Ernie Pasveer <epasveer@att.net>
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "SeerMacroToolButton.h"
#include "SeerMacroEditorDialog.h"
#include <QtWidgets/QMenu>
#include <QtWidgets/QMessageBox>
#include <QtGui/QMouseEvent>
#include <QtGui/QShortcut>
#include <QtCore/QTimer>
#include <QtCore/QSettings>
#include <QtCore/QFileInfo>
#include <QtCore/QDir>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
SeerMacroToolButton::SeerMacroToolButton(QWidget* parent) : QToolButton(parent) {
_holdTimer = new QTimer(this);
_holdTimer->setSingleShot(true);
_holdTimer->setInterval(500); // 500ms hold time
// Create the menu
_menu = new QMenu(this);
_menu->addAction("Edit Macro", this, &SeerMacroToolButton::handleEditMacro);
connect(_holdTimer, &QTimer::timeout, this, &SeerMacroToolButton::handleHoldTriggered);
}
void SeerMacroToolButton::setMacroName (const QString& name) {
// Set the macro name. If it's "", nullify our state.
_macroName = name;
if (_macroName == "") {
_macroFileName = "";
return;
}
// Add combination shortcut for re-open closed file (Ctrl + Shift + T)
QShortcut* shortcut = new QShortcut(QKeySequence(QString("Ctrl+Shift+")+_macroName[1]), this);
QObject::connect(shortcut, &QShortcut::activated, this, &QToolButton::click);
// Create the macro filename where the macro is to be written.
QSettings settings;
QFileInfo fileInfo(settings.fileName());
_macroFileName = fileInfo.absolutePath() + "/macros/" + _macroName + ".macro";
// Read settings now we have a proper macro name.
readMacro();
}
const QString& SeerMacroToolButton::macroName () const {
return _macroName;
}
const QString& SeerMacroToolButton::macroFileName () const {
return _macroFileName;
}
void SeerMacroToolButton::setCommands (const QStringList& commands) {
_commands = commands;
}
const QStringList& SeerMacroToolButton::commands () const {
return _commands;
}
void SeerMacroToolButton::writeMacro () {
// No macro filename, don't save.
if (macroFileName() == "") {
return;
}
// Get the absolute path of the filename.
QFileInfo fileInfo(macroFileName());
QString path = fileInfo.absolutePath();
// Create the directory.
QDir().mkpath(path);
// Create the macro file and write the lines to it.
QFile file(macroFileName());
if (file.open(QFile::WriteOnly|QFile::Text|QFile::Truncate)) {
QTextStream out(&file);
for (const QString& line : commands()) {
out << line << "\n";
}
file.close();
}
}
void SeerMacroToolButton::readMacro () {
if (macroFileName() == "") {
return;
}
QFile file(macroFileName());
if (file.open(QFile::ReadOnly|QFile::Text)) {
QStringList lines;
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
lines.append(line);
}
file.close();
setCommands(lines);
}
}
void SeerMacroToolButton::mousePressEvent (QMouseEvent* event) {
QToolButton::mousePressEvent(event);
_pressPos = event->pos();
_holdTimer->start();
}
void SeerMacroToolButton::mouseReleaseEvent (QMouseEvent* event) {
QToolButton::mouseReleaseEvent(event);
_holdTimer->stop();
}
void SeerMacroToolButton::handleHoldTriggered () {
// Show menu at button position
QPoint globalPos = mapToGlobal(QPoint(0, height()));
_menu->exec(globalPos);
// Reset button to unpressed state
setDown(false);
}
void SeerMacroToolButton::handleEditMacro () {
SeerMacroEditorDialog dlg;
dlg.setMacroName(macroName());
dlg.setCommands(commands());
if (dlg.exec()) {
setCommands(dlg.commands());
writeMacro();
}
}