summaryrefslogtreecommitdiffstatshomepage
path: root/TypeEditor.cpp
blob: 6348f120c914db3e567121c92cee1f25869e13b3 (plain) (blame)
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();
}