Implement abstract logger (#2174)
* AbstractLogger base implementation Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Switch most system notifications to AbstractLogger Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Make CLI parser use AbstractLogger Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix annoying QPainter warning in QtColorWidgets Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Remove obsolete TODOs Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Fix failing windows build Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com> * Add missing #include <cassert> Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>
This commit is contained in:
@@ -231,7 +231,11 @@ void ColorWheel::mouseReleaseEvent(QMouseEvent *ev)
|
||||
|
||||
void ColorWheel::resizeEvent(QResizeEvent *)
|
||||
{
|
||||
p->render_ring();
|
||||
static bool skipFirst = true;
|
||||
// Skip the first time in order to prevent QPainter warning messages
|
||||
if (!skipFirst)
|
||||
p->render_ring();
|
||||
skipFirst = false;
|
||||
p->render_inner_selector();
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
|
||||
|
||||
#include "commandlineparser.h"
|
||||
#include "abstractlogger.h"
|
||||
#include "src/utils/globalvalues.h"
|
||||
#include <QApplication>
|
||||
#include <QTextStream>
|
||||
@@ -12,8 +13,9 @@ CommandLineParser::CommandLineParser()
|
||||
|
||||
namespace {
|
||||
|
||||
QTextStream out(stdout);
|
||||
QTextStream err(stderr);
|
||||
AbstractLogger out =
|
||||
AbstractLogger::info(AbstractLogger::Stderr).enableMessageHeader(false);
|
||||
AbstractLogger err = AbstractLogger::error(AbstractLogger::Stderr);
|
||||
|
||||
auto versionOption =
|
||||
CommandOption({ "v", "version" },
|
||||
@@ -97,7 +99,7 @@ bool CommandLineParser::processArgs(const QStringList& args,
|
||||
--actualIt;
|
||||
} else {
|
||||
ok = false;
|
||||
out << QStringLiteral("'%1' is not a valid argument.").arg(argument);
|
||||
err << QStringLiteral("'%1' is not a valid argument.").arg(argument);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
@@ -119,7 +121,7 @@ bool CommandLineParser::processOptions(const QStringList& args,
|
||||
bool isDoubleDashed = arg.startsWith(QLatin1String("--"));
|
||||
ok = isDoubleDashed ? arg.length() > 3 : arg.length() == 2;
|
||||
if (!ok) {
|
||||
out << QStringLiteral("the option %1 has a wrong format.").arg(arg);
|
||||
err << QStringLiteral("the option %1 has a wrong format.").arg(arg);
|
||||
return ok;
|
||||
}
|
||||
arg = isDoubleDashed ? arg.remove(0, 2) : arg.remove(0, 1);
|
||||
@@ -137,7 +139,7 @@ bool CommandLineParser::processOptions(const QStringList& args,
|
||||
if (argName.isEmpty()) {
|
||||
argName = qApp->applicationName();
|
||||
}
|
||||
out << QStringLiteral("the option '%1' is not a valid option "
|
||||
err << QStringLiteral("the option '%1' is not a valid option "
|
||||
"for the argument '%2'.")
|
||||
.arg(arg)
|
||||
.arg(argName);
|
||||
@@ -148,7 +150,7 @@ bool CommandLineParser::processOptions(const QStringList& args,
|
||||
CommandOption option = *optionIt;
|
||||
bool requiresValue = !(option.valueName().isEmpty());
|
||||
if (!requiresValue && equalsPos != -1) {
|
||||
out << QStringLiteral("the option '%1' contains a '=' and it doesn't "
|
||||
err << QStringLiteral("the option '%1' contains a '=' and it doesn't "
|
||||
"require a value.")
|
||||
.arg(arg);
|
||||
ok = false;
|
||||
@@ -158,7 +160,7 @@ bool CommandLineParser::processOptions(const QStringList& args,
|
||||
if (actualIt + 1 != args.cend()) {
|
||||
++actualIt;
|
||||
} else {
|
||||
out << QStringLiteral("Expected value after the option '%1'.")
|
||||
err << QStringLiteral("Expected value after the option '%1'.")
|
||||
.arg(arg);
|
||||
ok = false;
|
||||
return ok;
|
||||
@@ -169,10 +171,10 @@ bool CommandLineParser::processOptions(const QStringList& args,
|
||||
if (requiresValue) {
|
||||
ok = option.checkValue(valueStr);
|
||||
if (!ok) {
|
||||
QString err = option.errorMsg();
|
||||
if (!err.endsWith(QLatin1String(".")))
|
||||
err += QLatin1String(".");
|
||||
out << err;
|
||||
QString msg = option.errorMsg();
|
||||
if (!msg.endsWith(QLatin1String(".")))
|
||||
msg += QLatin1String(".");
|
||||
err << msg;
|
||||
return ok;
|
||||
}
|
||||
option.setValue(valueStr);
|
||||
@@ -196,7 +198,7 @@ bool CommandLineParser::parse(const QStringList& args)
|
||||
printVersion();
|
||||
m_foundOptions << versionOption;
|
||||
} else {
|
||||
out << "Invalid arguments after the version option.";
|
||||
err << "Invalid arguments after the version option.";
|
||||
ok = false;
|
||||
}
|
||||
return ok;
|
||||
@@ -214,7 +216,9 @@ bool CommandLineParser::parse(const QStringList& args)
|
||||
}
|
||||
}
|
||||
if (!ok && !m_generalErrorMessage.isEmpty()) {
|
||||
out << QStringLiteral(" %1\n").arg(m_generalErrorMessage);
|
||||
err.enableMessageHeader(false);
|
||||
err << m_generalErrorMessage;
|
||||
err.enableMessageHeader(true);
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
@@ -306,7 +310,7 @@ QString CommandLineParser::value(const CommandOption& option) const
|
||||
|
||||
void CommandLineParser::printVersion()
|
||||
{
|
||||
out << GlobalValues::versionInfo() << QStringLiteral("\n");
|
||||
out << GlobalValues::versionInfo();
|
||||
}
|
||||
|
||||
void CommandLineParser::printHelp(QStringList args, const Node* node)
|
||||
@@ -397,7 +401,7 @@ bool CommandLineParser::processIfOptionIsHelp(
|
||||
printHelp(args, actualNode);
|
||||
actualIt++;
|
||||
} else {
|
||||
out << "Invalid arguments after the help option.";
|
||||
err << "Invalid arguments after the help option.";
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
|
||||
|
||||
#include "configwindow.h"
|
||||
#include "abstractlogger.h"
|
||||
#include "src/config/filenameeditor.h"
|
||||
#include "src/config/generalconf.h"
|
||||
#include "src/config/shortcutswidget.h"
|
||||
@@ -161,7 +162,7 @@ void ConfigWindow::initErrorIndicator(QWidget* tab, QWidget* widget)
|
||||
connect(btnShowErrors, &QPushButton::clicked, this, [this]() {
|
||||
// Generate error log message
|
||||
QString str;
|
||||
QTextStream stream(&str);
|
||||
AbstractLogger stream(str, AbstractLogger::Error);
|
||||
ConfigHandler().checkForErrors(&stream);
|
||||
|
||||
// Set up dialog
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "external/QHotkey/QHotkey"
|
||||
#endif
|
||||
|
||||
#include "abstractlogger.h"
|
||||
#include "pinwidget.h"
|
||||
#include "screenshotsaver.h"
|
||||
#include "src/config/configwindow.h"
|
||||
@@ -18,14 +19,12 @@
|
||||
#include "src/utils/globalvalues.h"
|
||||
#include "src/utils/history.h"
|
||||
#include "src/utils/screengrabber.h"
|
||||
#include "src/utils/systemnotification.h"
|
||||
#include "src/widgets/capture/capturetoolbutton.h"
|
||||
#include "src/widgets/capture/capturewidget.h"
|
||||
#include "src/widgets/capturelauncher.h"
|
||||
#include "src/widgets/historywidget.h"
|
||||
#include "src/widgets/imguploaddialog.h"
|
||||
#include "src/widgets/infowindow.h"
|
||||
#include "src/widgets/notificationwidget.h"
|
||||
#include <QAction>
|
||||
#include <QApplication>
|
||||
#include <QBuffer>
|
||||
@@ -604,8 +603,8 @@ void Controller::exportCapture(QPixmap capture,
|
||||
if (tasks & CR::PIN) {
|
||||
FlameshotDaemon::createPin(capture, selection);
|
||||
if (mode == CR::SCREEN_MODE || mode == CR::FULLSCREEN_MODE) {
|
||||
SystemNotification().sendMessage(
|
||||
QObject::tr("Full screen screenshot pinned to screen"));
|
||||
AbstractLogger::info()
|
||||
<< QObject::tr("Full screen screenshot pinned to screen");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -626,9 +625,8 @@ void Controller::exportCapture(QPixmap capture,
|
||||
widget, &ImgUploaderBase::uploadOk, [=](const QUrl& url) {
|
||||
if (ConfigHandler().copyAndCloseAfterUpload()) {
|
||||
if (!(tasks & CR::COPY)) {
|
||||
SystemNotification().sendMessage(
|
||||
QObject::tr("URL copied to clipboard."));
|
||||
|
||||
AbstractLogger::info()
|
||||
<< QObject::tr("URL copied to clipboard.");
|
||||
QApplication::clipboard()->setText(url.toString());
|
||||
widget->close();
|
||||
} else {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "flameshotdaemon.h"
|
||||
|
||||
#include "abstractlogger.h"
|
||||
#include "confighandler.h"
|
||||
#include "controller.h"
|
||||
#include "pinwidget.h"
|
||||
#include "screenshotsaver.h"
|
||||
#include "systemnotification.h"
|
||||
#include <QApplication>
|
||||
#include <QClipboard>
|
||||
#include <QDBusConnection>
|
||||
@@ -228,7 +228,7 @@ void FlameshotDaemon::attachTextToClipboard(QString text, QString notification)
|
||||
m_clipboardSignalBlocked = true;
|
||||
clipboard->setText(text);
|
||||
if (!notification.isEmpty()) {
|
||||
SystemNotification().sendMessage(notification);
|
||||
AbstractLogger::info() << notification;
|
||||
}
|
||||
clipboard->blockSignals(false);
|
||||
}
|
||||
@@ -246,7 +246,7 @@ QDBusMessage FlameshotDaemon::createMethodCall(QString method)
|
||||
void FlameshotDaemon::checkDBusConnection(const QDBusConnection& connection)
|
||||
{
|
||||
if (!connection.isConnected()) {
|
||||
SystemNotification().sendMessage(tr("Unable to connect via DBus"));
|
||||
AbstractLogger::error() << tr("Unable to connect via DBus");
|
||||
qApp->exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
23
src/main.cpp
23
src/main.cpp
@@ -7,6 +7,7 @@
|
||||
#include "QtSolutions/qtsingleapplication.h"
|
||||
#endif
|
||||
|
||||
#include "abstractlogger.h"
|
||||
#include "src/cli/commandlineparser.h"
|
||||
#include "src/config/styleoverride.h"
|
||||
#include "src/core/capturerequest.h"
|
||||
@@ -15,7 +16,6 @@
|
||||
#include "src/utils/confighandler.h"
|
||||
#include "src/utils/filenamehandler.h"
|
||||
#include "src/utils/pathinfo.h"
|
||||
#include "src/utils/systemnotification.h"
|
||||
#include "src/utils/valuehandler.h"
|
||||
#include <QApplication>
|
||||
#include <QDir>
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "spdlog/spdlog.h"
|
||||
|
||||
#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX)
|
||||
#include "abstractlogger.h"
|
||||
#include "src/core/flameshotdbusadapter.h"
|
||||
#include <QApplication>
|
||||
#include <QDBusConnection>
|
||||
@@ -59,9 +60,7 @@ void requestCaptureAndWait(const CaptureRequest& req)
|
||||
}
|
||||
});
|
||||
QObject::connect(controller, &Controller::captureFailed, []() {
|
||||
// TODO use abstract logger
|
||||
// TODO do we have to do more stuff here?
|
||||
QTextStream(stderr) << "screenshot aborted\n";
|
||||
AbstractLogger::info() << "Screenshot aborted.";
|
||||
qApp->exit(1);
|
||||
});
|
||||
qApp->exec();
|
||||
@@ -137,8 +136,8 @@ int main(int argc, char* argv[])
|
||||
new FlameshotDBusAdapter(c);
|
||||
QDBusConnection dbus = QDBusConnection::sessionBus();
|
||||
if (!dbus.isConnected()) {
|
||||
SystemNotification().sendMessage(
|
||||
QObject::tr("Unable to connect via DBus"));
|
||||
AbstractLogger::error()
|
||||
<< QObject::tr("Unable to connect via DBus");
|
||||
}
|
||||
dbus.registerObject(QStringLiteral("/"), c);
|
||||
dbus.registerService(QStringLiteral("org.flameshot.Flameshot"));
|
||||
@@ -240,14 +239,15 @@ int main(int argc, char* argv[])
|
||||
"You may need to escape the '#' sign as in '\\#FFF'");
|
||||
|
||||
const QString delayErr =
|
||||
QObject::tr("Invalid delay, it must be higher than 0");
|
||||
QObject::tr("Invalid delay, it must be a number greater than 0");
|
||||
const QString numberErr =
|
||||
QObject::tr("Invalid screen number, it must be non negative");
|
||||
const QString regionErr = QObject::tr(
|
||||
"Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'.");
|
||||
auto numericChecker = [](const QString& delayValue) -> bool {
|
||||
int value = delayValue.toInt();
|
||||
return value >= 0;
|
||||
bool ok;
|
||||
int value = delayValue.toInt(&ok);
|
||||
return ok && value >= 0;
|
||||
};
|
||||
auto regionChecker = [](const QString& region) -> bool {
|
||||
Region valueHandler;
|
||||
@@ -262,8 +262,7 @@ int main(int argc, char* argv[])
|
||||
if (fileInfo.isDir() || fileInfo.dir().exists()) {
|
||||
return true;
|
||||
} else {
|
||||
SystemNotification().sendMessage(
|
||||
QObject::tr(pathErr.toLatin1().data()));
|
||||
AbstractLogger::error() << QObject::tr(pathErr.toLatin1().data());
|
||||
return false;
|
||||
}
|
||||
};
|
||||
@@ -500,7 +499,7 @@ int main(int argc, char* argv[])
|
||||
bool someFlagSet =
|
||||
(filename || tray || mainColor || contrastColor || check);
|
||||
if (check) {
|
||||
QTextStream err(stderr);
|
||||
AbstractLogger err = AbstractLogger::error(AbstractLogger::Stderr);
|
||||
bool ok = ConfigHandler(true).checkForErrors(&err);
|
||||
if (ok) {
|
||||
err << QStringLiteral("No errors detected.\n");
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# Required to generate MOC
|
||||
target_sources(
|
||||
flameshot
|
||||
PRIVATE filenamehandler.h
|
||||
PRIVATE abstractlogger.h
|
||||
filenamehandler.h
|
||||
screengrabber.h
|
||||
systemnotification.h
|
||||
valuehandler.h
|
||||
@@ -11,7 +12,8 @@ target_sources(
|
||||
|
||||
target_sources(
|
||||
flameshot
|
||||
PRIVATE filenamehandler.cpp
|
||||
PRIVATE abstractlogger.cpp
|
||||
filenamehandler.cpp
|
||||
screengrabber.cpp
|
||||
confighandler.cpp
|
||||
systemnotification.cpp
|
||||
|
||||
132
src/utils/abstractlogger.cpp
Normal file
132
src/utils/abstractlogger.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
#include "abstractlogger.h"
|
||||
#include "systemnotification.h"
|
||||
#include <cassert>
|
||||
|
||||
#include <QFileInfo>
|
||||
|
||||
AbstractLogger::AbstractLogger(Channel channel, int targets)
|
||||
: m_defaultChannel(channel)
|
||||
, m_targets(targets)
|
||||
{
|
||||
if (targets & LogFile) {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct an AbstractLogger with output to a string.
|
||||
* @param additionalChannels Optional additional targets to output to.
|
||||
*/
|
||||
AbstractLogger::AbstractLogger(QString& str,
|
||||
Channel channel,
|
||||
int additionalChannels)
|
||||
: AbstractLogger(channel, additionalChannels)
|
||||
{
|
||||
m_textStreams << new QTextStream(&str);
|
||||
}
|
||||
|
||||
AbstractLogger::~AbstractLogger()
|
||||
{
|
||||
qDeleteAll(m_textStreams);
|
||||
}
|
||||
|
||||
AbstractLogger AbstractLogger::info(int targets)
|
||||
{
|
||||
return AbstractLogger(Info, targets);
|
||||
}
|
||||
|
||||
AbstractLogger AbstractLogger::warning(int targets)
|
||||
{
|
||||
return AbstractLogger(Warning, targets);
|
||||
}
|
||||
|
||||
AbstractLogger AbstractLogger::error(int targets)
|
||||
{
|
||||
return AbstractLogger(Error, targets);
|
||||
}
|
||||
|
||||
AbstractLogger& AbstractLogger::sendMessage(QString msg, Channel channel)
|
||||
{
|
||||
if (m_targets & Notification) {
|
||||
SystemNotification().sendMessage(
|
||||
msg, messageHeader(channel, Notification), m_notificationPath);
|
||||
}
|
||||
if (!m_textStreams.isEmpty()) {
|
||||
foreach (auto* stream, m_textStreams) {
|
||||
*stream << messageHeader(channel, String) << msg << "\n";
|
||||
}
|
||||
}
|
||||
if (m_targets & LogFile) {
|
||||
// TODO
|
||||
}
|
||||
if (m_targets & Stderr) {
|
||||
QTextStream stream(stderr);
|
||||
stream << messageHeader(channel, Stderr) << msg << "\n";
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Send a message to the default channel of this logger.
|
||||
* @param msg
|
||||
* @return
|
||||
*/
|
||||
AbstractLogger& AbstractLogger::operator<<(QString msg)
|
||||
{
|
||||
sendMessage(msg, m_defaultChannel);
|
||||
return *this;
|
||||
}
|
||||
|
||||
AbstractLogger& AbstractLogger::addOutputString(QString& str)
|
||||
{
|
||||
m_textStreams << new QTextStream(&str);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Attach a path to a notification so it can be dragged and dropped.
|
||||
*/
|
||||
AbstractLogger& AbstractLogger::attachNotificationPath(QString path)
|
||||
{
|
||||
if (m_targets & Notification) {
|
||||
m_notificationPath = path;
|
||||
} else {
|
||||
assert("Cannot attach notification path to a logger without a "
|
||||
"notification channel.");
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enable/disable message header (e.g. "flameshot: info:").
|
||||
*/
|
||||
AbstractLogger& AbstractLogger::enableMessageHeader(bool enable)
|
||||
{
|
||||
m_enableMessageHeader = enable;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Generate a message header for the given channel and target.
|
||||
*/
|
||||
QString AbstractLogger::messageHeader(Channel channel, Target target)
|
||||
{
|
||||
if (!m_enableMessageHeader) {
|
||||
return "";
|
||||
}
|
||||
QString messageChannel;
|
||||
if (channel == Info) {
|
||||
messageChannel = "info";
|
||||
} else if (channel == Warning) {
|
||||
messageChannel = "warning";
|
||||
} else if (channel == Error) {
|
||||
messageChannel = "error";
|
||||
}
|
||||
|
||||
if (target == Notification) {
|
||||
messageChannel[0] = messageChannel[0].toUpper();
|
||||
return "Flameshot " + messageChannel;
|
||||
} else {
|
||||
return "flameshot: " + messageChannel + ": ";
|
||||
}
|
||||
}
|
||||
53
src/utils/abstractlogger.h
Normal file
53
src/utils/abstractlogger.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
#include <QString>
|
||||
#include <QTextStream>
|
||||
|
||||
/**
|
||||
* @brief A class that allows you to log events to where they need to go.
|
||||
*/
|
||||
class AbstractLogger
|
||||
{
|
||||
public:
|
||||
enum Target
|
||||
{
|
||||
Notification = 0x01,
|
||||
Stderr = 0x02,
|
||||
LogFile = 0x08,
|
||||
String = 0x10,
|
||||
Default = Notification | LogFile | Stderr,
|
||||
};
|
||||
|
||||
enum Channel
|
||||
{
|
||||
Info,
|
||||
Warning,
|
||||
Error
|
||||
};
|
||||
|
||||
AbstractLogger(Channel channel = Info, int targets = Default);
|
||||
AbstractLogger(QString& str,
|
||||
Channel channel,
|
||||
int additionalTargets = String);
|
||||
~AbstractLogger();
|
||||
|
||||
// Convenience functions
|
||||
static AbstractLogger info(int targets = Default);
|
||||
static AbstractLogger warning(int targets = Default);
|
||||
static AbstractLogger error(int targets = Default);
|
||||
|
||||
AbstractLogger& sendMessage(QString msg, Channel channel);
|
||||
AbstractLogger& operator<<(QString msg);
|
||||
AbstractLogger& addOutputString(QString& str);
|
||||
AbstractLogger& attachNotificationPath(QString path);
|
||||
AbstractLogger& enableMessageHeader(bool enable);
|
||||
|
||||
private:
|
||||
QString messageHeader(Channel type, Target channel);
|
||||
|
||||
int m_targets;
|
||||
Channel m_defaultChannel;
|
||||
QList<QTextStream*> m_textStreams;
|
||||
QString m_notificationPath;
|
||||
bool m_enableMessageHeader = true;
|
||||
};
|
||||
@@ -2,8 +2,8 @@
|
||||
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
|
||||
|
||||
#include "confighandler.h"
|
||||
#include "abstractlogger.h"
|
||||
#include "src/tools/capturetool.h"
|
||||
#include "systemnotification.h"
|
||||
#include "valuehandler.h"
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <QMap>
|
||||
#include <QSharedPointer>
|
||||
#include <QStandardPaths>
|
||||
#include <QTextStream>
|
||||
#include <QVector>
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
@@ -510,7 +509,7 @@ QSet<QString> ConfigHandler::keysFromGroup(const QString& group) const
|
||||
|
||||
// ERROR HANDLING
|
||||
|
||||
bool ConfigHandler::checkForErrors(QTextStream* log) const
|
||||
bool ConfigHandler::checkForErrors(AbstractLogger* log) const
|
||||
{
|
||||
return checkUnrecognizedSettings(log) & checkShortcutConflicts(log) &
|
||||
checkSemantics(log);
|
||||
@@ -538,7 +537,7 @@ void ConfigHandler::cleanUnusedKeys(const QString& group,
|
||||
* `recognizedGeneralOptions` or `recognizedShortcutNames` depending on the
|
||||
* group the option belongs to.
|
||||
*/
|
||||
bool ConfigHandler::checkUnrecognizedSettings(QTextStream* log) const
|
||||
bool ConfigHandler::checkUnrecognizedSettings(AbstractLogger* log) const
|
||||
{
|
||||
// sort the config keys by group
|
||||
QSet<QString> generalKeys = keysFromGroup(CONFIG_GROUP_GENERAL),
|
||||
@@ -595,7 +594,7 @@ bool ConfigHandler::checkUnrecognizedSettings(QTextStream* log) const
|
||||
* is the flameshot default (not because the user explicitly configured it), and
|
||||
* action B uses the same shortcut.
|
||||
*/
|
||||
bool ConfigHandler::checkShortcutConflicts(QTextStream* log) const
|
||||
bool ConfigHandler::checkShortcutConflicts(AbstractLogger* log) const
|
||||
{
|
||||
bool ok = true;
|
||||
m_settings.beginGroup(CONFIG_GROUP_SHORTCUTS);
|
||||
@@ -637,7 +636,7 @@ bool ConfigHandler::checkShortcutConflicts(QTextStream* log) const
|
||||
* @brief Check each config value semantically.
|
||||
* @return Whether the config passes this check.
|
||||
*/
|
||||
bool ConfigHandler::checkSemantics(QTextStream* log) const
|
||||
bool ConfigHandler::checkSemantics(AbstractLogger* log) const
|
||||
{
|
||||
QStringList allKeys = m_settings.allKeys();
|
||||
bool ok = true;
|
||||
@@ -698,12 +697,12 @@ void ConfigHandler::setErrorState(bool error) const
|
||||
// Notify user every time m_hasError changes
|
||||
if (!hadError && m_hasError) {
|
||||
QString msg = errorMessage();
|
||||
SystemNotification().sendMessage(msg);
|
||||
AbstractLogger::error() << msg;
|
||||
emit getInstance()->error();
|
||||
} else if (hadError && !m_hasError) {
|
||||
auto msg =
|
||||
tr("You have successfully resolved the configuration error.");
|
||||
SystemNotification().sendMessage(msg);
|
||||
AbstractLogger::info() << msg;
|
||||
emit getInstance()->errorResolved();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ class ValueHandler;
|
||||
template<class T>
|
||||
class QSharedPointer;
|
||||
class QTextStream;
|
||||
class AbstractLogger;
|
||||
|
||||
/**
|
||||
* Declare and implement a getter for a config option. `KEY` is the option key
|
||||
@@ -141,10 +142,10 @@ public:
|
||||
QSet<QString> keysFromGroup(const QString& group) const;
|
||||
|
||||
// ERROR HANDLING
|
||||
bool checkForErrors(QTextStream* log = nullptr) const;
|
||||
bool checkUnrecognizedSettings(QTextStream* log = nullptr) const;
|
||||
bool checkShortcutConflicts(QTextStream* log = nullptr) const;
|
||||
bool checkSemantics(QTextStream* log = nullptr) const;
|
||||
bool checkForErrors(AbstractLogger* log = nullptr) const;
|
||||
bool checkUnrecognizedSettings(AbstractLogger* log = nullptr) const;
|
||||
bool checkShortcutConflicts(AbstractLogger* log = nullptr) const;
|
||||
bool checkSemantics(AbstractLogger* log = nullptr) const;
|
||||
void checkAndHandleError() const;
|
||||
void setErrorState(bool error) const;
|
||||
bool hasError() const;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
|
||||
|
||||
#include "screengrabber.h"
|
||||
#include "abstractlogger.h"
|
||||
#include "src/core/qguiappcurrentscreen.h"
|
||||
#include "src/utils/filenamehandler.h"
|
||||
#include "src/utils/systemnotification.h"
|
||||
@@ -124,7 +125,7 @@ QPixmap ScreenGrabber::grabEntireDesktop(bool& ok)
|
||||
break;
|
||||
}
|
||||
if (!ok) {
|
||||
SystemNotification().sendMessage(tr("Unable to capture screen"));
|
||||
AbstractLogger::error() << tr("Unable to capture screen");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
|
||||
|
||||
#include "screenshotsaver.h"
|
||||
#include "abstractlogger.h"
|
||||
#include "src/core/controller.h"
|
||||
#include "src/core/flameshotdaemon.h"
|
||||
#include "src/utils/confighandler.h"
|
||||
#include "src/utils/filenamehandler.h"
|
||||
#include "src/utils/globalvalues.h"
|
||||
#include "src/utils/systemnotification.h"
|
||||
#include "utils/desktopinfo.h"
|
||||
#include <QApplication>
|
||||
#include <QBuffer>
|
||||
@@ -43,8 +43,8 @@ void ScreenshotSaver::saveToClipboardMime(const QPixmap& capture,
|
||||
mimeData->setData("image/" + imageType, array);
|
||||
QApplication::clipboard()->setMimeData(mimeData);
|
||||
} else {
|
||||
SystemNotification().sendMessage(
|
||||
QObject::tr("Error while saving to clipboard"));
|
||||
AbstractLogger::error()
|
||||
<< QObject::tr("Error while saving to clipboard");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,8 +60,7 @@ void ScreenshotSaver::saveToClipboard(const QPixmap& capture)
|
||||
ConfigHandler().savePath(),
|
||||
QObject::tr("Capture saved to clipboard."));
|
||||
} else {
|
||||
SystemNotification().sendMessage(
|
||||
QObject::tr("Capture saved to clipboard."));
|
||||
AbstractLogger() << QObject::tr("Capture saved to clipboard.");
|
||||
}
|
||||
if (ConfigHandler().useJpgForClipboard()) {
|
||||
// FIXME - it doesn't work on MacOS
|
||||
@@ -97,15 +96,18 @@ bool ScreenshotSaver::saveToFilesystem(const QPixmap& capture,
|
||||
|
||||
if (ok) {
|
||||
saveMessage += QObject::tr("Capture saved as ") + completePath;
|
||||
AbstractLogger::info().attachNotificationPath(notificationPath)
|
||||
<< saveMessage;
|
||||
} else {
|
||||
saveMessage += QObject::tr("Error trying to save as ") + completePath;
|
||||
if (file.error() != QFile::NoError) {
|
||||
saveMessage += ": " + file.errorString();
|
||||
}
|
||||
notificationPath = "";
|
||||
AbstractLogger::error().attachNotificationPath(notificationPath)
|
||||
<< saveMessage;
|
||||
}
|
||||
|
||||
SystemNotification().sendMessage(saveMessage, notificationPath);
|
||||
return ok;
|
||||
}
|
||||
|
||||
@@ -185,7 +187,7 @@ bool ScreenshotSaver::saveToFilesystemGUI(const QPixmap& capture)
|
||||
ConfigHandler().setSavePath(pathNoFile);
|
||||
|
||||
QString msg = QObject::tr("Capture saved as ") + savePath;
|
||||
SystemNotification().sendMessage(msg, savePath);
|
||||
AbstractLogger().attachNotificationPath(savePath) << msg;
|
||||
|
||||
if (config.copyPathAfterSave()) {
|
||||
FlameshotDaemon::copyToClipboard(
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
// <http://www.gnu.org/licenses/old-licenses/library.txt>
|
||||
|
||||
#include "capturewidget.h"
|
||||
#include "abstractlogger.h"
|
||||
#include "copytool.h"
|
||||
#include "src/core/controller.h"
|
||||
#include "src/core/qguiappcurrentscreen.h"
|
||||
@@ -100,7 +101,7 @@ CaptureWidget::CaptureWidget(const CaptureRequest& req,
|
||||
bool ok = true;
|
||||
m_context.screenshot = ScreenGrabber().grabEntireDesktop(ok);
|
||||
if (!ok) {
|
||||
SystemNotification().sendMessage(tr("Unable to capture screen"));
|
||||
AbstractLogger::error() << tr("Unable to capture screen");
|
||||
this->close();
|
||||
}
|
||||
m_context.origScreenshot = m_context.screenshot;
|
||||
|
||||
Reference in New Issue
Block a user