mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-07 05:53:59 -07:00
Change to JournalWidget
This commit is contained in:
parent
4d26bc9f82
commit
a601a99817
5 changed files with 181 additions and 20 deletions
|
|
@ -180,6 +180,8 @@ set(cockatrice_SOURCES
|
||||||
src/interface/widgets/deck_editor/deck_list_style_proxy.cpp
|
src/interface/widgets/deck_editor/deck_list_style_proxy.cpp
|
||||||
src/interface/widgets/deck_editor/deck_state_manager.cpp
|
src/interface/widgets/deck_editor/deck_state_manager.cpp
|
||||||
src/interface/widgets/deck_editor/printing_disabled_info_widget.cpp
|
src/interface/widgets/deck_editor/printing_disabled_info_widget.cpp
|
||||||
|
src/interface/widgets/game/journal_widget.cpp
|
||||||
|
src/interface/widgets/game/journal_widget.h
|
||||||
src/interface/widgets/general/background_sources.cpp
|
src/interface/widgets/general/background_sources.cpp
|
||||||
src/interface/widgets/general/display/background_plate_widget.cpp
|
src/interface/widgets/general/display/background_plate_widget.cpp
|
||||||
src/interface/widgets/general/display/banner_widget.cpp
|
src/interface/widgets/general/display/banner_widget.cpp
|
||||||
|
|
|
||||||
104
cockatrice/src/interface/widgets/game/journal_widget.cpp
Normal file
104
cockatrice/src/interface/widgets/game/journal_widget.cpp
Normal file
|
|
@ -0,0 +1,104 @@
|
||||||
|
#include "journal_widget.h"
|
||||||
|
|
||||||
|
#include "../../../client/settings/cache_settings.h"
|
||||||
|
|
||||||
|
#include <QLayout>
|
||||||
|
#include <QPlainTextEdit>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
static const QString BACKUP_FILE_NAME = "journal.txt";
|
||||||
|
|
||||||
|
JournalRestoreWidget::JournalRestoreWidget(QWidget *parent) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QVBoxLayout(this);
|
||||||
|
layout->setSpacing(3);
|
||||||
|
layout->setAlignment(Qt::AlignCenter);
|
||||||
|
setLayout(layout);
|
||||||
|
|
||||||
|
textLabel = new QLabel(this);
|
||||||
|
restoreButton = new QPushButton(this);
|
||||||
|
discardButton = new QPushButton(this);
|
||||||
|
|
||||||
|
layout->addWidget(textLabel);
|
||||||
|
layout->addWidget(restoreButton);
|
||||||
|
layout->addWidget(discardButton);
|
||||||
|
|
||||||
|
connect(restoreButton, &QPushButton::clicked, this, &JournalRestoreWidget::restorePushed);
|
||||||
|
connect(discardButton, &QPushButton::clicked, this, &JournalRestoreWidget::discardPushed);
|
||||||
|
|
||||||
|
connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &JournalRestoreWidget::retranslateUi);
|
||||||
|
|
||||||
|
retranslateUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JournalRestoreWidget::retranslateUi()
|
||||||
|
{
|
||||||
|
textLabel->setText(tr("Previous journal text detected."));
|
||||||
|
restoreButton->setText(tr("Restore"));
|
||||||
|
discardButton->setText(tr("Discard"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static QString getJournalBackupPath()
|
||||||
|
{
|
||||||
|
return SettingsCache::instance().getDataPath() + "/" + BACKUP_FILE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool hasSavedBackupText()
|
||||||
|
{
|
||||||
|
QFileInfo fileInfo = QFileInfo(getJournalBackupPath());
|
||||||
|
return fileInfo.size() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
JournalWidget::JournalWidget(QWidget *parent) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QHBoxLayout(this);
|
||||||
|
layout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
setLayout(layout);
|
||||||
|
|
||||||
|
textEdit = new QPlainTextEdit(this);
|
||||||
|
restoreWidget = new JournalRestoreWidget(this);
|
||||||
|
|
||||||
|
layout->addWidget(textEdit);
|
||||||
|
layout->addWidget(restoreWidget);
|
||||||
|
|
||||||
|
showRestorePrompt(hasSavedBackupText());
|
||||||
|
|
||||||
|
connect(restoreWidget, &JournalRestoreWidget::discardPushed, this, [this] { showRestorePrompt(false); });
|
||||||
|
connect(restoreWidget, &JournalRestoreWidget::restorePushed, this, [this] {
|
||||||
|
restoreText();
|
||||||
|
showRestorePrompt(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Debounce setup
|
||||||
|
debounceTimer.setSingleShot(true);
|
||||||
|
connect(&debounceTimer, &QTimer::timeout, this, &JournalWidget::backupText);
|
||||||
|
connect(textEdit, &QPlainTextEdit::textChanged, this, [this] { debounceTimer.start(300); });
|
||||||
|
}
|
||||||
|
|
||||||
|
void JournalWidget::showRestorePrompt(bool show)
|
||||||
|
{
|
||||||
|
restoreWidget->setVisible(show);
|
||||||
|
textEdit->setVisible(!show);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JournalWidget::backupText()
|
||||||
|
{
|
||||||
|
QFile file(getJournalBackupPath());
|
||||||
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString text = textEdit->toPlainText();
|
||||||
|
file.write(text.toUtf8());
|
||||||
|
}
|
||||||
|
|
||||||
|
void JournalWidget::restoreText()
|
||||||
|
{
|
||||||
|
QFile file(getJournalBackupPath());
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray byteArray = file.readAll();
|
||||||
|
textEdit->setPlainText(QString::fromUtf8(byteArray));
|
||||||
|
}
|
||||||
51
cockatrice/src/interface/widgets/game/journal_widget.h
Normal file
51
cockatrice/src/interface/widgets/game/journal_widget.h
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
#ifndef COCKATRICE_JOURNAL_WIDGET_H
|
||||||
|
#define COCKATRICE_JOURNAL_WIDGET_H
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <qplaintextedit.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The widget that is used to show the journal restore prompt.
|
||||||
|
*/
|
||||||
|
class JournalRestoreWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
QLabel *textLabel;
|
||||||
|
QPushButton *restoreButton;
|
||||||
|
QPushButton *discardButton;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit JournalRestoreWidget(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
void retranslateUi();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void restorePushed();
|
||||||
|
void discardPushed();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The widget used in the Journal dock in the game tab.
|
||||||
|
*/
|
||||||
|
class JournalWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
QPlainTextEdit *textEdit;
|
||||||
|
JournalRestoreWidget *restoreWidget;
|
||||||
|
QTimer debounceTimer;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit JournalWidget(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void showRestorePrompt(bool show);
|
||||||
|
void backupText();
|
||||||
|
void restoreText();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COCKATRICE_JOURNAL_WIDGET_H
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
#include "../interface/card_picture_loader/card_picture_loader.h"
|
#include "../interface/card_picture_loader/card_picture_loader.h"
|
||||||
#include "../interface/widgets/cards/card_info_frame_widget.h"
|
#include "../interface/widgets/cards/card_info_frame_widget.h"
|
||||||
#include "../interface/widgets/dialogs/dlg_create_game.h"
|
#include "../interface/widgets/dialogs/dlg_create_game.h"
|
||||||
|
#include "../interface/widgets/game/journal_widget.h"
|
||||||
#include "../interface/widgets/server/user/user_list_manager.h"
|
#include "../interface/widgets/server/user/user_list_manager.h"
|
||||||
#include "../interface/widgets/utility/line_edit_completer.h"
|
#include "../interface/widgets/utility/line_edit_completer.h"
|
||||||
#include "../interface/window_main.h"
|
#include "../interface/window_main.h"
|
||||||
|
|
@ -52,7 +53,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
|
||||||
|
|
||||||
createCardInfoDock(true);
|
createCardInfoDock(true);
|
||||||
createPlayerListDock(true);
|
createPlayerListDock(true);
|
||||||
createNotesDock(true);
|
createJournalDock(true);
|
||||||
createMessageDock(true);
|
createMessageDock(true);
|
||||||
createPlayAreaWidget(true);
|
createPlayAreaWidget(true);
|
||||||
createDeckViewContainerWidget(true);
|
createDeckViewContainerWidget(true);
|
||||||
|
|
@ -60,7 +61,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
|
||||||
|
|
||||||
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
|
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
|
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, notesDock);
|
addDockWidget(Qt::RightDockWidgetArea, journalDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
|
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
|
||||||
addDockWidget(Qt::BottomDockWidgetArea, replayDock);
|
addDockWidget(Qt::BottomDockWidgetArea, replayDock);
|
||||||
|
|
||||||
|
|
@ -98,7 +99,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
|
||||||
|
|
||||||
createCardInfoDock();
|
createCardInfoDock();
|
||||||
createPlayerListDock();
|
createPlayerListDock();
|
||||||
createNotesDock();
|
createJournalDock();
|
||||||
createMessageDock();
|
createMessageDock();
|
||||||
createPlayAreaWidget();
|
createPlayAreaWidget();
|
||||||
createDeckViewContainerWidget();
|
createDeckViewContainerWidget();
|
||||||
|
|
@ -106,7 +107,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
|
||||||
|
|
||||||
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
|
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
|
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, notesDock);
|
addDockWidget(Qt::RightDockWidgetArea, journalDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
|
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
|
||||||
|
|
||||||
mainWidget = new QStackedWidget(this);
|
mainWidget = new QStackedWidget(this);
|
||||||
|
|
@ -283,7 +284,7 @@ void TabGame::retranslateUi()
|
||||||
|
|
||||||
updatePlayerListDockTitle();
|
updatePlayerListDockTitle();
|
||||||
cardInfoDock->setWindowTitle(tr("Card Info") + (cardInfoDock->isWindow() ? tabText : QString()));
|
cardInfoDock->setWindowTitle(tr("Card Info") + (cardInfoDock->isWindow() ? tabText : QString()));
|
||||||
notesDock->setWindowTitle(tr("Notes") + (notesDock->isWindow() ? tabText : QString()));
|
journalDock->setWindowTitle(tr("Journal") + (journalDock->isWindow() ? tabText : QString()));
|
||||||
messageLayoutDock->setWindowTitle(tr("Messages") + (messageLayoutDock->isWindow() ? tabText : QString()));
|
messageLayoutDock->setWindowTitle(tr("Messages") + (messageLayoutDock->isWindow() ? tabText : QString()));
|
||||||
if (replayDock)
|
if (replayDock)
|
||||||
replayDock->setWindowTitle(tr("Replay Timeline") + (replayDock->isWindow() ? tabText : QString()));
|
replayDock->setWindowTitle(tr("Replay Timeline") + (replayDock->isWindow() ? tabText : QString()));
|
||||||
|
|
@ -347,7 +348,7 @@ void TabGame::retranslateUi()
|
||||||
|
|
||||||
dockToActions[cardInfoDock].menu->setTitle(tr("Card Info"));
|
dockToActions[cardInfoDock].menu->setTitle(tr("Card Info"));
|
||||||
dockToActions[messageLayoutDock].menu->setTitle(tr("Messages"));
|
dockToActions[messageLayoutDock].menu->setTitle(tr("Messages"));
|
||||||
dockToActions[notesDock].menu->setTitle(tr("Notes"));
|
dockToActions[journalDock].menu->setTitle(tr("Journal"));
|
||||||
dockToActions[playerListDock].menu->setTitle(tr("Player List"));
|
dockToActions[playerListDock].menu->setTitle(tr("Player List"));
|
||||||
|
|
||||||
if (replayDock) {
|
if (replayDock) {
|
||||||
|
|
@ -1042,7 +1043,7 @@ void TabGame::createViewMenuItems()
|
||||||
registerDockWidget(viewMenu, cardInfoDock, {250, 360});
|
registerDockWidget(viewMenu, cardInfoDock, {250, 360});
|
||||||
registerDockWidget(viewMenu, messageLayoutDock, {250, 200});
|
registerDockWidget(viewMenu, messageLayoutDock, {250, 200});
|
||||||
registerDockWidget(viewMenu, playerListDock, {250, 50});
|
registerDockWidget(viewMenu, playerListDock, {250, 50});
|
||||||
registerDockWidget(viewMenu, notesDock, {250, 50});
|
registerDockWidget(viewMenu, journalDock, {250, 50});
|
||||||
|
|
||||||
if (replayDock) {
|
if (replayDock) {
|
||||||
registerDockWidget(viewMenu, replayDock, {900, 100});
|
registerDockWidget(viewMenu, replayDock, {900, 100});
|
||||||
|
|
@ -1132,17 +1133,17 @@ void TabGame::actResetLayout()
|
||||||
{
|
{
|
||||||
cardInfoDock->setVisible(true);
|
cardInfoDock->setVisible(true);
|
||||||
playerListDock->setVisible(true);
|
playerListDock->setVisible(true);
|
||||||
notesDock->setVisible(false);
|
journalDock->setVisible(false);
|
||||||
messageLayoutDock->setVisible(true);
|
messageLayoutDock->setVisible(true);
|
||||||
|
|
||||||
cardInfoDock->setFloating(false);
|
cardInfoDock->setFloating(false);
|
||||||
playerListDock->setFloating(false);
|
playerListDock->setFloating(false);
|
||||||
notesDock->setFloating(false);
|
journalDock->setFloating(false);
|
||||||
messageLayoutDock->setFloating(false);
|
messageLayoutDock->setFloating(false);
|
||||||
|
|
||||||
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
|
addDockWidget(Qt::RightDockWidgetArea, cardInfoDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
|
addDockWidget(Qt::RightDockWidgetArea, playerListDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, notesDock);
|
addDockWidget(Qt::RightDockWidgetArea, journalDock);
|
||||||
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
|
addDockWidget(Qt::RightDockWidgetArea, messageLayoutDock);
|
||||||
|
|
||||||
if (replayDock) {
|
if (replayDock) {
|
||||||
|
|
@ -1251,19 +1252,20 @@ void TabGame::createPlayerListDock(bool bReplay)
|
||||||
playerListDock->setFloating(false);
|
playerListDock->setFloating(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabGame::createNotesDock(bool bReplay)
|
void TabGame::createJournalDock(bool bReplay)
|
||||||
{
|
{
|
||||||
Q_UNUSED(bReplay);
|
Q_UNUSED(bReplay);
|
||||||
|
|
||||||
auto textEdit = new QPlainTextEdit(this);
|
journalWidget = new JournalWidget(this);
|
||||||
notesDock = new QDockWidget(this);
|
|
||||||
notesDock->setObjectName("notesDock");
|
journalDock = new QDockWidget(this);
|
||||||
notesDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable |
|
journalDock->setObjectName("journalDock");
|
||||||
|
journalDock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable |
|
||||||
QDockWidget::DockWidgetMovable);
|
QDockWidget::DockWidgetMovable);
|
||||||
notesDock->setWidget(textEdit);
|
journalDock->setWidget(journalWidget);
|
||||||
|
|
||||||
// Prevent text from autofocusing if there are no other focusable widgets (such as when loading replay)
|
// Prevent text from autofocusing if there are no other focusable widgets (such as when loading replay)
|
||||||
QTimer::singleShot(1, textEdit, &QWidget::clearFocus);
|
QTimer::singleShot(1, journalWidget, &QWidget::clearFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabGame::createMessageDock(bool bReplay)
|
void TabGame::createMessageDock(bool bReplay)
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#include <QLoggingCategory>
|
#include <QLoggingCategory>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
|
class JournalWidget;
|
||||||
class ServerInfo_PlayerProperties;
|
class ServerInfo_PlayerProperties;
|
||||||
class TabbedDeckViewContainer;
|
class TabbedDeckViewContainer;
|
||||||
inline Q_LOGGING_CATEGORY(TabGameLog, "tab_game");
|
inline Q_LOGGING_CATEGORY(TabGameLog, "tab_game");
|
||||||
|
|
@ -66,6 +67,7 @@ private:
|
||||||
|
|
||||||
CardInfoFrameWidget *cardInfoFrameWidget;
|
CardInfoFrameWidget *cardInfoFrameWidget;
|
||||||
PlayerListWidget *playerListWidget;
|
PlayerListWidget *playerListWidget;
|
||||||
|
JournalWidget *journalWidget;
|
||||||
QLabel *timeElapsedLabel;
|
QLabel *timeElapsedLabel;
|
||||||
MessageLogWidget *messageLog;
|
MessageLogWidget *messageLog;
|
||||||
QLabel *sayLabel;
|
QLabel *sayLabel;
|
||||||
|
|
@ -76,7 +78,7 @@ private:
|
||||||
QMap<int, TabbedDeckViewContainer *> deckViewContainers;
|
QMap<int, TabbedDeckViewContainer *> deckViewContainers;
|
||||||
QVBoxLayout *deckViewContainerLayout;
|
QVBoxLayout *deckViewContainerLayout;
|
||||||
QWidget *gamePlayAreaWidget, *deckViewContainerWidget;
|
QWidget *gamePlayAreaWidget, *deckViewContainerWidget;
|
||||||
QDockWidget *cardInfoDock, *playerListDock, *notesDock, *messageLayoutDock, *replayDock;
|
QDockWidget *cardInfoDock, *playerListDock, *journalDock, *messageLayoutDock, *replayDock;
|
||||||
QAction *playersSeparator;
|
QAction *playersSeparator;
|
||||||
QMenu *gameMenu, *viewMenu;
|
QMenu *gameMenu, *viewMenu;
|
||||||
TearOffMenu *phasesMenu;
|
TearOffMenu *phasesMenu;
|
||||||
|
|
@ -121,7 +123,7 @@ private:
|
||||||
void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize);
|
void registerDockWidget(QMenu *_viewMenu, QDockWidget *widget, const QSize &defaultSize);
|
||||||
void createCardInfoDock(bool bReplay = false);
|
void createCardInfoDock(bool bReplay = false);
|
||||||
void createPlayerListDock(bool bReplay = false);
|
void createPlayerListDock(bool bReplay = false);
|
||||||
void createNotesDock(bool bReplay = false);
|
void createJournalDock(bool bReplay = false);
|
||||||
void createMessageDock(bool bReplay = false);
|
void createMessageDock(bool bReplay = false);
|
||||||
void createPlayAreaWidget(bool bReplay = false);
|
void createPlayAreaWidget(bool bReplay = false);
|
||||||
void createDeckViewContainerWidget(bool bReplay = false);
|
void createDeckViewContainerWidget(bool bReplay = false);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue