Qt: implement simple find dialog for logs (#3941)

This commit is contained in:
Megamouse 2018-01-05 00:41:10 +01:00 committed by Ivan
parent 83b541ea9d
commit 19d181fa4c
6 changed files with 151 additions and 6 deletions

View File

@ -912,6 +912,7 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="rpcs3qt\about_dialog.cpp" />
<ClCompile Include="rpcs3qt\find_dialog.cpp" />
<ClCompile Include="rpcs3qt\gamepads_settings_dialog.cpp" />
<ClCompile Include="rpcs3qt\game_compatibility.cpp" />
<ClCompile Include="rpcs3qt\game_list_grid.cpp" />
@ -1286,6 +1287,7 @@
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'">.\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras"</Command>
</CustomBuild>
<ClInclude Include="rpcs3qt\find_dialog.h" />
<ClInclude Include="rpcs3qt\custom_table_widget_item.h" />
<ClInclude Include="rpcs3qt\gamepads_settings_dialog.h" />
<CustomBuild Include="rpcs3qt\game_compatibility.h">

View File

@ -584,6 +584,9 @@
<ClCompile Include="rpcs3qt\game_compatibility.cpp">
<Filter>Gui\game list</Filter>
</ClCompile>
<ClCompile Include="rpcs3qt\find_dialog.cpp">
<Filter>Gui\misc dialogs</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="\rpcs3qt\*.h">
@ -661,6 +664,9 @@
<ClInclude Include="evdev_joystick_handler.h">
<Filter>Io\evdev</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\find_dialog.h">
<Filter>Gui\misc dialogs</Filter>
</ClInclude>
<ClInclude Include="rpcs3qt\custom_table_widget_item.h">
<Filter>Gui\game list</Filter>
</ClInclude>

View File

@ -0,0 +1,73 @@
#include "find_dialog.h"
#include <QVBoxLayout>
find_dialog::find_dialog(QTextEdit* edit, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), m_text_edit(edit)
{
setWindowTitle(tr("Find string"));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
m_find_bar = new QLineEdit();
m_find_bar->setPlaceholderText(tr("Search..."));
m_find_first = new QPushButton(tr("First"));
m_find_last = new QPushButton(tr("Last"));
m_find_next = new QPushButton(tr("Next"));
m_find_previous = new QPushButton(tr("Previous"));
QHBoxLayout* button_layout = new QHBoxLayout();
button_layout->addWidget(m_find_first);
button_layout->addWidget(m_find_last);
button_layout->addWidget(m_find_next);
button_layout->addWidget(m_find_previous);
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(m_find_bar);
layout->addLayout(button_layout);
setLayout(layout);
connect(m_find_first, &QPushButton::pressed, this, &find_dialog::find_first);
connect(m_find_last, &QPushButton::pressed, this, &find_dialog::find_last);
connect(m_find_next, &QPushButton::pressed, this, &find_dialog::find_next);
connect(m_find_previous, &QPushButton::pressed, this, &find_dialog::find_previous);
show();
}
find_dialog::~find_dialog()
{
}
void find_dialog::find_first()
{
if (!m_text_edit || m_find_bar->text().isEmpty())
return;
m_text_edit->moveCursor(QTextCursor::Start);
m_text_edit->find(m_find_bar->text());
}
void find_dialog::find_last()
{
if (!m_text_edit || m_find_bar->text().isEmpty())
return;
m_text_edit->moveCursor(QTextCursor::End);
m_text_edit->find(m_find_bar->text(), QTextDocument::FindBackward);
}
void find_dialog::find_next()
{
if (!m_text_edit || m_find_bar->text().isEmpty())
return;
m_text_edit->find(m_find_bar->text());
}
void find_dialog::find_previous()
{
if (!m_text_edit || m_find_bar->text().isEmpty())
return;
m_text_edit->find(m_find_bar->text(), QTextDocument::FindBackward);
}

View File

@ -0,0 +1,27 @@
#pragma once
#include <QDialog>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
class find_dialog : public QDialog
{
public:
find_dialog(QTextEdit* edit, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
~find_dialog();
private:
QTextEdit* m_text_edit;
QLineEdit* m_find_bar;
QPushButton* m_find_first;
QPushButton* m_find_last;
QPushButton* m_find_next;
QPushButton* m_find_previous;
private Q_SLOTS:
void find_first();
void find_last();
void find_next();
void find_previous();
};

View File

@ -102,22 +102,24 @@ static gui_listener s_gui_listener;
log_frame::log_frame(std::shared_ptr<gui_settings> guiSettings, QWidget *parent) : QDockWidget(tr("Log"), parent), xgui_settings(guiSettings)
{
QTabWidget* tabWidget = new QTabWidget;
m_tabWidget = new QTabWidget;
m_log = new QTextEdit(tabWidget);
m_log = new QTextEdit(m_tabWidget);
m_log->setObjectName("log_frame");
m_log->setReadOnly(true);
m_log->setContextMenuPolicy(Qt::CustomContextMenu);
m_log->installEventFilter(this);
m_tty = new QTextEdit(tabWidget);
m_tty = new QTextEdit(m_tabWidget);
m_tty->setObjectName("tty_frame");
m_tty->setReadOnly(true);
m_tty->setContextMenuPolicy(Qt::CustomContextMenu);
m_tty->installEventFilter(this);
tabWidget->addTab(m_log, tr("Log"));
tabWidget->addTab(m_tty, tr("TTY"));
m_tabWidget->addTab(m_log, tr("Log"));
m_tabWidget->addTab(m_tty, tr("TTY"));
setWidget(tabWidget);
setWidget(m_tabWidget);
// Open or create TTY.log
m_tty_file.open(fs::get_config_dir() + "TTY.log", fs::read + fs::create);
@ -259,6 +261,12 @@ void log_frame::CreateAndConnectActions()
menu->exec(mapToGlobal(pos));
});
connect(m_tabWidget, &QTabWidget::currentChanged, [this](int index)
{
if (m_find_dialog)
m_find_dialog->close();
});
LoadSettings();
}
@ -435,3 +443,25 @@ void log_frame::closeEvent(QCloseEvent *event)
QDockWidget::closeEvent(event);
Q_EMIT LogFrameClosed();
}
bool log_frame::eventFilter(QObject* object, QEvent* event)
{
if (object != m_log && object != m_tty)
{
return QDockWidget::eventFilter(object, event);
}
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* e = (QKeyEvent*)event;
if (e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_F)
{
if (m_find_dialog && m_find_dialog->isVisible())
m_find_dialog->close();
m_find_dialog = std::make_unique<find_dialog>((QTextEdit*)object, this);
}
}
return QDockWidget::eventFilter(object, event);
}

View File

@ -4,6 +4,7 @@
#include "Utilities/Log.h"
#include "gui_settings.h"
#include "find_dialog.h"
#include <memory>
@ -12,6 +13,7 @@
#include <QTextEdit>
#include <QActionGroup>
#include <QTimer>
#include <QKeyEvent>
class log_frame : public QDockWidget
{
@ -31,6 +33,7 @@ Q_SIGNALS:
protected:
/** Override inherited method from Qt to allow signalling when close happened.*/
void closeEvent(QCloseEvent* event);
bool eventFilter(QObject* object, QEvent* event) override;
private Q_SLOTS:
void UpdateUI();
private:
@ -39,6 +42,10 @@ private:
void CreateAndConnectActions();
QTabWidget* m_tabWidget;
std::unique_ptr<find_dialog> m_find_dialog;
QList<QColor> m_color;
QColor m_color_stack;
QTextEdit *m_log;