initial implementation of new extra window feeatures
This commit is contained in:
parent
e8b378da75
commit
b87b4c0b41
@ -1,33 +1,96 @@
|
|||||||
#include "extension.h"
|
#include "extension.h"
|
||||||
|
#include "defs.h"
|
||||||
#include "text.h"
|
#include "text.h"
|
||||||
#include <QMainWindow>
|
#include <QDialog>
|
||||||
|
#include <QInputDialog>
|
||||||
|
#include <QColorDialog>
|
||||||
|
#include <QMenu>
|
||||||
#include <QLayout>
|
#include <QLayout>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QCheckBox>
|
#include <QPainter>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <QSettings>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
std::mutex m;
|
std::mutex m;
|
||||||
|
|
||||||
struct : QMainWindow
|
struct : QDialog
|
||||||
{
|
{
|
||||||
QLabel* display;
|
|
||||||
void launch()
|
void launch()
|
||||||
{
|
{
|
||||||
auto centralWidget = new QWidget(this);
|
settings->beginGroup("Extra Window");
|
||||||
auto layout = new QVBoxLayout(centralWidget);
|
(new QHBoxLayout(this))->addWidget(display = new QLabel("Right click to change settings", this));
|
||||||
auto options = new QHBoxLayout(centralWidget);
|
setWindowFlags(Qt::FramelessWindowHint);
|
||||||
layout->addItem(options);
|
setAttribute(Qt::WA_TranslucentBackground);
|
||||||
layout->addWidget(display = new QLabel(centralWidget));
|
setSizeGripEnabled(true);
|
||||||
auto onTop = new QCheckBox(ALWAYS_ON_TOP, this);
|
|
||||||
options->addWidget(onTop);
|
|
||||||
connect(onTop, &QCheckBox::stateChanged, [this](int state)
|
|
||||||
{
|
|
||||||
SetWindowPos((HWND)winId(), state == Qt::Checked ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
|
||||||
});
|
|
||||||
resize(800, 600);
|
|
||||||
setCentralWidget(centralWidget);
|
|
||||||
show();
|
show();
|
||||||
|
|
||||||
|
auto setBackgroundColor = [=](QColor color)
|
||||||
|
{
|
||||||
|
if (!color.isValid()) return;
|
||||||
|
if (color.alpha() == 0) color.setAlpha(1);
|
||||||
|
bgColor = color;
|
||||||
|
repaint();
|
||||||
|
settings->setValue("BG Color", color);
|
||||||
|
};
|
||||||
|
auto setTextColor = [=](QColor color)
|
||||||
|
{
|
||||||
|
if (!color.isValid()) return;
|
||||||
|
auto newPalette = display->palette();
|
||||||
|
newPalette.setColor(QPalette::WindowText, color);
|
||||||
|
display->setPalette(newPalette);
|
||||||
|
settings->setValue("Text Color", color);
|
||||||
|
};
|
||||||
|
auto setFontSize = [=](int pt)
|
||||||
|
{
|
||||||
|
QFont newFont = display->font();
|
||||||
|
newFont.setPointSize(pt);
|
||||||
|
display->setFont(newFont);
|
||||||
|
settings->setValue("Font Size", pt);
|
||||||
|
};
|
||||||
|
auto setTopmost = [=](bool topmost)
|
||||||
|
{
|
||||||
|
SetWindowPos((HWND)winId(), topmost ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||||
|
settings->setValue("Topmost", topmost);
|
||||||
|
};
|
||||||
|
setGeometry(settings->value("Window", geometry()).toRect());
|
||||||
|
setTopmost(settings->value("Topmost", false).toBool());
|
||||||
|
setFontSize(settings->value("Font Size", 16).toInt());
|
||||||
|
setBackgroundColor(settings->value("BG Color", palette().window().color()).value<QColor>());
|
||||||
|
setTextColor(settings->value("Text Color", display->palette().windowText().color()).value<QColor>());
|
||||||
|
|
||||||
|
auto menu = new QMenu(this);
|
||||||
|
menu->addAction("Topmost", setTopmost)->setCheckable(true);
|
||||||
|
menu->addAction("BG Color", [=] { setBackgroundColor(QColorDialog::getColor(palette().window().color(), this, "BG Color", QColorDialog::ShowAlphaChannel)); });
|
||||||
|
menu->addAction("Text Color", [=] { setTextColor(QColorDialog::getColor(display->palette().windowText().color(), this, "Text Color")); });
|
||||||
|
menu->addAction("Font Size", [=] { setFontSize(QInputDialog::getInt(this, "Font Size", "", display->font().pointSize(), 0, INT_MAX, 1, nullptr, Qt::WindowCloseButtonHint)); });
|
||||||
|
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
connect(this, &QDialog::customContextMenuRequested, menu, [=](QPoint point) { menu->exec(mapToGlobal(point)); });
|
||||||
|
connect(this, &QDialog::destroyed, [=] { settings->setValue("Window", geometry()); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void paintEvent(QPaintEvent*) override
|
||||||
|
{
|
||||||
|
QPainter(this).fillRect(rect(), bgColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mousePressEvent(QMouseEvent* evt)
|
||||||
|
{
|
||||||
|
oldPos = evt->globalPos();
|
||||||
|
}
|
||||||
|
|
||||||
|
void mouseMoveEvent(QMouseEvent* evt)
|
||||||
|
{
|
||||||
|
const QPoint delta = evt->globalPos() - oldPos;
|
||||||
|
move(x() + delta.x(), y() + delta.y());
|
||||||
|
oldPos = evt->globalPos();
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor bgColor = QPalette().window().color();
|
||||||
|
QPoint oldPos;
|
||||||
|
|
||||||
|
QSettings* settings = new QSettings(CONFIG_FILE, QSettings::IniFormat, this);
|
||||||
|
QLabel* display;
|
||||||
}*window = nullptr;
|
}*window = nullptr;
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||||
@ -45,9 +108,10 @@ BOOL WINAPI DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved
|
|||||||
break;
|
break;
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
{
|
{
|
||||||
|
std::lock_guard l(m);
|
||||||
|
if (window != nullptr) window->settings->setValue("Window", window->geometry());
|
||||||
if (lpReserved == NULL) // https://blogs.msdn.microsoft.com/oldnewthing/20120105-00/?p=8683
|
if (lpReserved == NULL) // https://blogs.msdn.microsoft.com/oldnewthing/20120105-00/?p=8683
|
||||||
{
|
{
|
||||||
std::lock_guard l(m);
|
|
||||||
delete window;
|
delete window;
|
||||||
window = nullptr;
|
window = nullptr;
|
||||||
}
|
}
|
||||||
@ -61,6 +125,6 @@ bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo)
|
|||||||
{
|
{
|
||||||
std::lock_guard l(m);
|
std::lock_guard l(m);
|
||||||
if (window == nullptr || !sentenceInfo["current select"]) return false;
|
if (window == nullptr || !sentenceInfo["current select"]) return false;
|
||||||
window->display->setText(QString::fromStdWString(sentence));
|
QMetaObject::invokeMethod(window, [=] { window->display->setText(QString::fromStdWString(sentence)); });
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user