1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include "TypeEditor.h"
#include "DocumentItem.h"
#include "NotesItem.h"
#include "DocumentBuffer.h"
#include "Instructions.h"
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QTimer>
#include <QBrush>
#include <QColor>
#include <QFont>
#include <QDockWidget>
#include <QToolButton>
#include <QApplication>
#include <QMessageBox>
#include <QCloseEvent>
#include <QSettings>
#include <QDebug>
TypeEditor::TypeEditor(const QString &secondText, bool notes, const QString &title, QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("Author - Type Editor"));
setUnifiedTitleAndToolBarOnMac(true);
QGraphicsScene *scene = new QGraphicsScene;
m_view = new QGraphicsView(scene);
m_view->setBackgroundBrush(QBrush(Qt::black));
m_view->setFrameStyle(0);
m_doc = new DocumentItem(50, 45);
scene->addItem(m_doc);
if (notes) {
NotesItem *notes = new NotesItem(secondText, m_doc->boundingRect().size());
scene->addItem(notes);
notes->setPos(-notes->boundingRect().width() / 2 - 10, 0);
} else {
DocumentItem *firstDraft = new DocumentItem(50, 45);
firstDraft->setEditable(false);
firstDraft->setText(secondText);
scene->addItem(firstDraft);
firstDraft->setPos(-firstDraft->boundingRect().width() / 2 - 10, 0);
}
m_doc->setPos(m_doc->boundingRect().width() / 2 + 10, 0);
m_view->setSceneRect(m_view->sceneRect().adjusted(-20, -20, 20, 20));
QGraphicsSimpleTextItem *titleText = scene->addSimpleText(title, QFont("CMU Typewriter Text Variable Width", 14, 1, true));
titleText->setBrush(QBrush(QColor(200, 200, 200)));
titleText->setPos(scene->sceneRect().width() / 2 - titleText->boundingRect().width() / 2, -25);
setCentralWidget(m_view);
QDockWidget *instructionFloater = new QDockWidget(tr("Instructions"));
instructionFloater->setWidget(new Instructions(notes ? 2 : 3, false));
addDockWidget(Qt::RightDockWidgetArea, instructionFloater);
connect(instructionFloater, SIGNAL(visibilityChanged(bool)), this, SLOT(fitToWidth()));
connect(instructionFloater, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(fitToWidth()));
m_doneButton = new QToolButton(this);
m_doneButton->setIcon(QIcon(QLatin1String(":/next.png")));
m_doneButton->setText(tr("Next"));
m_doneButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
QFont font;
font.setFamily("CMU Typewriter Text Variable Width");
font.setPixelSize(18);
font.setBold(true);
m_doneButton->setFont(font);
m_doneButton->setIconSize(QSize(64, 64));
m_doneButton->resize(75, 90);
connect(m_doneButton, SIGNAL(clicked()), this, SIGNAL(finished()));
QTimer::singleShot(0, this, SLOT(fitToWidth()));
}
void TypeEditor::fitToWidth()
{
if (qobject_cast<QDockWidget*>(sender())) {
QTimer::singleShot(5, this, SLOT(fitToWidth()));
return;
}
m_doneButton->move(width() - m_doneButton->width() - 10, height() - m_doneButton->height() - 10);
m_view->fitInView(m_view->sceneRect(), Qt::KeepAspectRatio);
m_view->focusWidget();
m_doc->setFocus();
}
void TypeEditor::resizeEvent(QResizeEvent *event)
{
fitToWidth();
QMainWindow::resizeEvent(event);
}
void TypeEditor::closeEvent(QCloseEvent *event)
{
if (QMessageBox::question(this, tr("Quit?"), tr("You are still writing. Are you sure you'd like to quit?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes)
QApplication::quit();
else
event->ignore();
}
QString TypeEditor::result() const
{
return m_doc->buffer().topDocument();
}
void TypeEditor::saveState(const QString &key) const
{
QSettings s;
s.setValue(key.arg(QLatin1String("buffer")), m_doc->buffer().toVariant());
s.setValue(key.arg(QLatin1String("text")), m_doc->buffer().topDocument());
const QPair<int, int> location = m_doc->cursorLocation();
s.setValue(key.arg(QLatin1String("row")), location.first);
s.setValue(key.arg(QLatin1String("col")), location.second);
s.setValue(key.arg(QLatin1String("scrollTop")), m_doc->scrollTop());
}
void TypeEditor::restoreState(const QString &key, bool fromText)
{
QSettings s;
if (fromText)
m_doc->setText(s.value(key.arg(QLatin1String("text"))).toString());
else {
m_doc->setBuffer(DocumentBuffer::fromVariant(s.value(key.arg(QLatin1String("buffer")))));
m_doc->setCursorLocation(qMakePair(s.value(key.arg(QLatin1String("row"))).toInt(), s.value(key.arg(QLatin1String("col"))).toInt()));
}
m_doc->setScrollTop(s.value(key.arg(QLatin1String("scrollTop"))).toInt());
}
void TypeEditor::finish()
{
emit finished();
}
|