text outlines implemented and fix low alpha values being saved wrong
This commit is contained in:
parent
06d5242842
commit
bf2838f3fc
@ -9,6 +9,7 @@
|
||||
#include <QFontDialog>
|
||||
#include <QMenu>
|
||||
#include <QPainter>
|
||||
#include <QGraphicsEffect>
|
||||
#include <QMouseEvent>
|
||||
#include <QWheelEvent>
|
||||
|
||||
@ -21,6 +22,10 @@ extern const char* DICTIONARY;
|
||||
extern const char* DICTIONARY_INSTRUCTIONS;
|
||||
extern const char* BG_COLOR;
|
||||
extern const char* TEXT_COLOR;
|
||||
extern const char* TEXT_OUTLINE;
|
||||
extern const char* OUTLINE_COLOR;
|
||||
extern const char* OUTLINE_SIZE;
|
||||
extern const char* OUTLINE_SIZE_INFO;
|
||||
extern const char* FONT;
|
||||
extern const char* SAVE_SETTINGS;
|
||||
|
||||
@ -31,6 +36,7 @@ struct PrettyWindow : QDialog
|
||||
PrettyWindow(const char* name)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
ui.display->setGraphicsEffect(&outliner);
|
||||
setWindowFlags(Qt::FramelessWindowHint);
|
||||
setAttribute(Qt::WA_TranslucentBackground);
|
||||
|
||||
@ -39,9 +45,14 @@ struct PrettyWindow : QDialog
|
||||
if (font.fromString(settings.value(FONT, font.toString()).toString())) ui.display->setFont(font);
|
||||
setBgColor(settings.value(BG_COLOR, bgColor).value<QColor>());
|
||||
setTextColor(settings.value(TEXT_COLOR, textColor()).value<QColor>());
|
||||
outliner.color = settings.value(OUTLINE_COLOR, outliner.color).value<QColor>();
|
||||
outliner.size = settings.value(OUTLINE_SIZE, outliner.size).toDouble();
|
||||
menu.addAction(FONT, this, &PrettyWindow::RequestFont);
|
||||
menu.addAction(BG_COLOR, [this] { setBgColor(QColorDialog::getColor(bgColor, this, BG_COLOR, QColorDialog::ShowAlphaChannel)); });
|
||||
menu.addAction(TEXT_COLOR, [this] { setTextColor(QColorDialog::getColor(textColor(), this, TEXT_COLOR, QColorDialog::ShowAlphaChannel)); });
|
||||
QAction* outlineAction = menu.addAction(TEXT_OUTLINE, this, &PrettyWindow::setOutline);
|
||||
outlineAction->setCheckable(true);
|
||||
outlineAction->setChecked(outliner.size >= 0);
|
||||
connect(ui.display, &QLabel::customContextMenuRequested, [this](QPoint point) { menu.exec(mapToGlobal(point)); });
|
||||
}
|
||||
|
||||
@ -72,7 +83,7 @@ private:
|
||||
if (color.alpha() == 0) color.setAlpha(1);
|
||||
bgColor = color;
|
||||
repaint();
|
||||
settings.setValue(BG_COLOR, "#" + QString::number(color.rgba(), 16));
|
||||
settings.setValue(BG_COLOR, color.name(QColor::HexArgb));
|
||||
};
|
||||
|
||||
QColor textColor()
|
||||
@ -84,15 +95,49 @@ private:
|
||||
{
|
||||
if (!color.isValid()) return;
|
||||
ui.display->setPalette(QPalette(color, {}, {}, {}, {}, {}, {}));
|
||||
settings.setValue(TEXT_COLOR, "#" + QString::number(color.rgba(), 16));
|
||||
settings.setValue(TEXT_COLOR, color.name(QColor::HexArgb));
|
||||
};
|
||||
|
||||
void setOutline(bool enable)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
QColor color = QColorDialog::getColor(outliner.color, this, OUTLINE_COLOR, QColorDialog::ShowAlphaChannel);
|
||||
if (color.isValid()) outliner.color = color;
|
||||
outliner.size = QInputDialog::getDouble(this, OUTLINE_SIZE, OUTLINE_SIZE_INFO, 0.5, 0, INT_MAX, 2, nullptr, Qt::WindowCloseButtonHint);
|
||||
}
|
||||
else outliner.size = -1;
|
||||
settings.setValue(OUTLINE_COLOR, outliner.color.name(QColor::HexArgb));
|
||||
settings.setValue(OUTLINE_SIZE, outliner.size);
|
||||
}
|
||||
|
||||
void paintEvent(QPaintEvent*) override
|
||||
{
|
||||
QPainter(this).fillRect(rect(), bgColor);
|
||||
}
|
||||
|
||||
QColor bgColor{ palette().window().color() };
|
||||
struct : QGraphicsEffect
|
||||
{
|
||||
void draw(QPainter* painter) override
|
||||
{
|
||||
if (size < 0) return drawSource(painter);
|
||||
QPoint offset;
|
||||
QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset);
|
||||
offset.setX(offset.x() + size);
|
||||
for (auto offset2 : Array<QPointF>{ { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } })
|
||||
{
|
||||
QImage outline = pixmap.toImage();
|
||||
QPainter outlinePainter(&outline);
|
||||
outlinePainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
||||
outlinePainter.fillRect(outline.rect(), color);
|
||||
painter->drawImage(offset + offset2 * size, outline);
|
||||
}
|
||||
painter->drawPixmap(offset, pixmap);
|
||||
}
|
||||
QColor color{ Qt::black };
|
||||
double size = -1;
|
||||
} outliner;
|
||||
};
|
||||
|
||||
class ExtraWindow : public PrettyWindow
|
||||
|
4
text.cpp
4
text.cpp
@ -135,6 +135,10 @@ Only works if this extension is used directly after a translation extension)";
|
||||
const char* SIZE_LOCK = u8"Size lock";
|
||||
const char* BG_COLOR = u8"Background color";
|
||||
const char* TEXT_COLOR = u8"Text color";
|
||||
const char* TEXT_OUTLINE = u8"Text outline";
|
||||
const char* OUTLINE_COLOR = u8"Outline color";
|
||||
const char* OUTLINE_SIZE = u8"Outline size";
|
||||
const char* OUTLINE_SIZE_INFO = u8"Size in pixels (recommended to stay below 20% of the font size)";
|
||||
const char* FONT = u8"Font";
|
||||
const char* LUA_INTRO = u8R"(--[[
|
||||
ProcessSentence is called each time Textractor receives a sentence of text.
|
||||
|
Loading…
Reference in New Issue
Block a user