use qfontdialog for extra and main window and massive perf improvement when loading large threads

This commit is contained in:
Akash Mozumdar 2019-07-13 19:15:43 +05:30
parent f56e9ff07c
commit 6a015f04bc
5 changed files with 46 additions and 36 deletions

View File

@ -26,5 +26,6 @@ int main(int argc, char *argv[])
QDir::setCurrent(QFileInfo(S(Util::GetModuleFilename().value())).absolutePath()); QDir::setCurrent(QFileInfo(S(Util::GetModuleFilename().value())).absolutePath());
QApplication app(argc, argv); QApplication app(argc, argv);
app.setFont(QFont("MS Shell Dlg 2", 10));
return MainWindow().show(), app.exec(); return MainWindow().show(), app.exec();
} }

View File

@ -3,8 +3,10 @@
#include "defs.h" #include "defs.h"
#include "host/util.h" #include "host/util.h"
#include <shellapi.h> #include <shellapi.h>
#include <QMenu>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QFileDialog> #include <QFileDialog>
#include <QFontDialog>
extern const char* ATTACH; extern const char* ATTACH;
extern const char* LAUNCH; extern const char* LAUNCH;
@ -16,6 +18,7 @@ extern const char* SAVE_HOOKS;
extern const char* SEARCH_FOR_HOOKS; extern const char* SEARCH_FOR_HOOKS;
extern const char* SETTINGS; extern const char* SETTINGS;
extern const char* EXTENSIONS; extern const char* EXTENSIONS;
extern const char* FONT;
extern const char* SELECT_PROCESS; extern const char* SELECT_PROCESS;
extern const char* ATTACH_INFO; extern const char* ATTACH_INFO;
extern const char* SELECT_PROCESS_INFO; extern const char* SELECT_PROCESS_INFO;
@ -75,9 +78,11 @@ MainWindow::MainWindow(QWidget *parent) :
connect(ui->ttCombo, qOverload<int>(&QComboBox::activated), this, &MainWindow::ViewThread); connect(ui->ttCombo, qOverload<int>(&QComboBox::activated), this, &MainWindow::ViewThread);
connect(ui->textOutput, &QPlainTextEdit::selectionChanged, [this] { if (!(QApplication::mouseButtons() & Qt::LeftButton)) ui->textOutput->copy(); }); connect(ui->textOutput, &QPlainTextEdit::selectionChanged, [this] { if (!(QApplication::mouseButtons() & Qt::LeftButton)) ui->textOutput->copy(); });
connect(ui->textOutput, &QPlainTextEdit::customContextMenuRequested, this, &MainWindow::OutputContextMenu);
QSettings settings(CONFIG_FILE, QSettings::IniFormat); QSettings settings(CONFIG_FILE, QSettings::IniFormat);
if (settings.contains(WINDOW)) setGeometry(settings.value(WINDOW).toRect()); if (settings.contains(WINDOW)) setGeometry(settings.value(WINDOW).toRect());
if (settings.contains(FONT)) SetOutputFont(settings.value(FONT).toString());
TextThread::filterRepetition = settings.value(FILTER_REPETITION, TextThread::filterRepetition).toBool(); TextThread::filterRepetition = settings.value(FILTER_REPETITION, TextThread::filterRepetition).toBool();
autoAttach = settings.value(AUTO_ATTACH, autoAttach).toBool(); autoAttach = settings.value(AUTO_ATTACH, autoAttach).toBool();
autoAttachSavedOnly = settings.value(ATTACH_SAVED_ONLY, autoAttachSavedOnly).toBool(); autoAttachSavedOnly = settings.value(ATTACH_SAVED_ONLY, autoAttachSavedOnly).toBool();
@ -172,7 +177,7 @@ void MainWindow::ProcessDisconnected(DWORD processId)
void MainWindow::ThreadAdded(TextThread& thread) void MainWindow::ThreadAdded(TextThread& thread)
{ {
std::wstring threadCode = Util::GenerateCode(thread.hp, thread.tp.processId); std::wstring threadCode = Util::GenerateCode(thread.hp, thread.tp.processId);
QString ttString = TextThreadString(thread) + S(FormatString(L"(%s)", threadCode)); QString ttString = TextThreadString(thread) + S(FormatString(L" (%s)", threadCode));
bool savedMatch = savedThreadCtx == thread.tp.ctx && savedThreadCtx2 == thread.tp.ctx2 && savedThreadCode == threadCode; bool savedMatch = savedThreadCtx == thread.tp.ctx && savedThreadCtx2 == thread.tp.ctx2 && savedThreadCode == threadCode;
if (savedMatch) savedThreadCtx = savedThreadCtx2 = savedThreadCode[0] = 0; if (savedMatch) savedThreadCtx = savedThreadCtx2 = savedThreadCode[0] = 0;
QMetaObject::invokeMethod(this, [this, ttString, savedMatch] QMetaObject::invokeMethod(this, [this, ttString, savedMatch]
@ -206,9 +211,16 @@ bool MainWindow::SentenceReceived(TextThread& thread, std::wstring& sentence)
return true; return true;
} }
void MainWindow::OutputContextMenu(QPoint point)
{
std::unique_ptr<QMenu> menu(ui->textOutput->createStandardContextMenu());
menu->addAction(FONT, [this] { if (QString font = QFontDialog::getFont(&ok, ui->textOutput->font(), this, FONT).toString(); ok) SetOutputFont(font); });
menu->exec(ui->textOutput->mapToGlobal(point));
}
QString MainWindow::TextThreadString(TextThread& thread) QString MainWindow::TextThreadString(TextThread& thread)
{ {
return QString("%1:%2:%3:%4:%5: %6 ").arg( return QString("%1:%2:%3:%4:%5: %6").arg(
QString::number(thread.handle, 16), QString::number(thread.handle, 16),
QString::number(thread.tp.processId, 16), QString::number(thread.tp.processId, 16),
QString::number(thread.tp.addr, 16), QString::number(thread.tp.addr, 16),
@ -521,3 +533,12 @@ void MainWindow::ViewThread(int index)
ui->textOutput->setPlainText(S((current = &Host::GetThread(ParseTextThreadString(ui->ttCombo->itemText(index))))->storage->c_str())); ui->textOutput->setPlainText(S((current = &Host::GetThread(ParseTextThreadString(ui->ttCombo->itemText(index))))->storage->c_str()));
ui->textOutput->moveCursor(QTextCursor::End); ui->textOutput->moveCursor(QTextCursor::End);
} }
void MainWindow::SetOutputFont(QString fontString)
{
QFont font = ui->textOutput->font();
font.fromString(fontString);
font.setStyleStrategy(QFont::NoFontMerging);
ui->textOutput->setFont(font);
QSettings(CONFIG_FILE, QSettings::IniFormat).setValue(FONT, font.toString());
}

View File

@ -27,6 +27,7 @@ private:
void ThreadAdded(TextThread& thread); void ThreadAdded(TextThread& thread);
void ThreadRemoved(TextThread& thread); void ThreadRemoved(TextThread& thread);
bool SentenceReceived(TextThread& thread, std::wstring& sentence); bool SentenceReceived(TextThread& thread, std::wstring& sentence);
void OutputContextMenu(QPoint point);
QString TextThreadString(TextThread& thread); QString TextThreadString(TextThread& thread);
ThreadParam ParseTextThreadString(QString ttString); ThreadParam ParseTextThreadString(QString ttString);
DWORD GetSelectedProcessId(); DWORD GetSelectedProcessId();
@ -43,6 +44,7 @@ private:
void Settings(); void Settings();
void Extensions(); void Extensions();
void ViewThread(int index); void ViewThread(int index);
void SetOutputFont(QString font);
Ui::MainWindow* ui; Ui::MainWindow* ui;
ExtenWindow* extenWindow; ExtenWindow* extenWindow;

View File

@ -13,16 +13,8 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Textractor</string> <string>Textractor</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true"> <string notr="true">
QObject
{
font: 10pt &quot;MS Shell Dlg 2&quot;;
}
#textOutput
{
font: 13pt &quot;MS Shell Dlg 2&quot;;
}
QPushButton, QComboBox QPushButton, QComboBox
{ {
padding-top: 3px; padding-top: 3px;
@ -32,7 +24,7 @@
text-align: left; text-align: left;
} }
</string> </string>
</property> </property>
<widget class="QWidget" name="centralWidget"> <widget class="QWidget" name="centralWidget">
<layout class="QHBoxLayout"> <layout class="QHBoxLayout">
<item> <item>
@ -83,6 +75,15 @@
</item> </item>
<item> <item>
<widget class="QPlainTextEdit" name="textOutput"> <widget class="QPlainTextEdit" name="textOutput">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="font">
<font>
<family>Meiryo</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>

View File

@ -3,6 +3,7 @@
#include "ui_extrawindow.h" #include "ui_extrawindow.h"
#include "defs.h" #include "defs.h"
#include <QColorDialog> #include <QColorDialog>
#include <QFontDialog>
#include <QMenu> #include <QMenu>
#include <QPainter> #include <QPainter>
#include <QMouseEvent> #include <QMouseEvent>
@ -15,9 +16,6 @@ extern const char* SIZE_LOCK;
extern const char* BG_COLOR; extern const char* BG_COLOR;
extern const char* TEXT_COLOR; extern const char* TEXT_COLOR;
extern const char* FONT; extern const char* FONT;
extern const char* FONT_SIZE;
extern const char* FONT_FAMILY;
extern const char* FONT_WEIGHT;
extern const char* SAVE_SETTINGS; extern const char* SAVE_SETTINGS;
struct Window : QDialog struct Window : QDialog
@ -73,25 +71,12 @@ public:
private: private:
void RequestFont() void RequestFont()
{ {
QFont font = ui.display->font(); bool ok;
QDialog fontDialog(this, Qt::WindowCloseButtonHint); if (QFont font = QFontDialog::getFont(&ok, ui.display->font(), this, FONT); ok)
fontDialog.setWindowTitle(FONT); {
QFormLayout layout(&fontDialog); settings.setValue(FONT, font.toString());
QLineEdit fontFamily(font.family(), &fontDialog); ui.display->setFont(font);
layout.addRow(FONT_FAMILY, &fontFamily); }
QSpinBox fontSize(&fontDialog);
fontSize.setValue(font.pointSize());
layout.addRow(FONT_SIZE, &fontSize);
QSpinBox fontWeight(&fontDialog);
fontWeight.setValue(font.weight());
layout.addRow(FONT_WEIGHT, &fontWeight);
QPushButton save(SAVE_SETTINGS, &fontDialog);
layout.addWidget(&save);
connect(&save, &QPushButton::clicked, &fontDialog, &QDialog::accept);
if (!fontDialog.exec()) return;
font = QFont(fontFamily.text(), fontSize.value(), fontWeight.value());
settings.setValue(FONT, font.toString());
ui.display->setFont(font);
}; };
void setBackgroundColor(QColor color) void setBackgroundColor(QColor color)
@ -159,7 +144,7 @@ bool ProcessSentence(std::wstring& sentence, SentenceInfo sentenceInfo)
if (!sentenceInfo["current select"]) return false; if (!sentenceInfo["current select"]) return false;
QString qSentence = S(sentence); QString qSentence = S(sentence);
if (!window.settings.value(SHOW_ORIGINAL).toBool()) qSentence = qSentence.section('\n', qSentence.count('\n') / 2 + 1); if (!window.settings.value(SHOW_ORIGINAL, true).toBool()) qSentence = qSentence.section('\n', qSentence.count('\n') / 2 + 1);
QMetaObject::invokeMethod(&window, [=] { window.ui.display->setText(qSentence); }); QMetaObject::invokeMethod(&window, [=] { window.ui.display->setText(qSentence); });
return false; return false;