mirror of
git://git.savannah.nongnu.org/eliot.git
synced 2025-01-23 19:58:44 +01:00
Add a "Print preview" menu entry
This commit is contained in:
parent
6f2ee6f9ff
commit
0ea56cc442
4 changed files with 174 additions and 144 deletions
|
@ -7,6 +7,7 @@
|
||||||
<file>images/go-next.png</file>
|
<file>images/go-next.png</file>
|
||||||
<file>images/go-last.png</file>
|
<file>images/go-last.png</file>
|
||||||
<file>images/go-jump.png</file>
|
<file>images/go-jump.png</file>
|
||||||
|
<file>images/print-preview.png</file>
|
||||||
<file>images/printer.png</file>
|
<file>images/printer.png</file>
|
||||||
<file>images/preferences.png</file>
|
<file>images/preferences.png</file>
|
||||||
<file>images/playlist_16px.png</file>
|
<file>images/playlist_16px.png</file>
|
||||||
|
|
BIN
qt/images/print-preview.png
Normal file
BIN
qt/images/print-preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
|
@ -26,6 +26,7 @@
|
||||||
#include <QtGui/QFileDialog>
|
#include <QtGui/QFileDialog>
|
||||||
#include <QtGui/QDockWidget>
|
#include <QtGui/QDockWidget>
|
||||||
#include <QtGui/QCloseEvent>
|
#include <QtGui/QCloseEvent>
|
||||||
|
#include <QtGui/QPrintPreviewDialog>
|
||||||
#include <QtGui/QPrintDialog>
|
#include <QtGui/QPrintDialog>
|
||||||
#include <QtGui/QPrinter>
|
#include <QtGui/QPrinter>
|
||||||
#include <QtGui/QPainter>
|
#include <QtGui/QPainter>
|
||||||
|
@ -376,6 +377,7 @@ void MainWindow::updateForGame(PublicGame *iGame)
|
||||||
if (iGame == NULL)
|
if (iGame == NULL)
|
||||||
{
|
{
|
||||||
m_actionGameSaveAs->setEnabled(false);
|
m_actionGameSaveAs->setEnabled(false);
|
||||||
|
m_actionGamePrintPreview->setEnabled(false);
|
||||||
m_actionGamePrint->setEnabled(false);
|
m_actionGamePrint->setEnabled(false);
|
||||||
m_actionHistoryFirstTurn->setEnabled(false);
|
m_actionHistoryFirstTurn->setEnabled(false);
|
||||||
m_actionHistoryPrevTurn->setEnabled(false);
|
m_actionHistoryPrevTurn->setEnabled(false);
|
||||||
|
@ -412,6 +414,7 @@ void MainWindow::updateForGame(PublicGame *iGame)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
m_actionGamePrintPreview->setEnabled(true);
|
||||||
m_actionGamePrint->setEnabled(true);
|
m_actionGamePrint->setEnabled(true);
|
||||||
m_actionGameSaveAs->setEnabled(true);
|
m_actionGameSaveAs->setEnabled(true);
|
||||||
m_actionSettingsDefineTables->setEnabled(iGame->getMode() == PublicGame::kARBITRATION);
|
m_actionSettingsDefineTables->setEnabled(iGame->getMode() == PublicGame::kARBITRATION);
|
||||||
|
@ -801,6 +804,9 @@ void MainWindow::createMenu()
|
||||||
m_actionGameSaveAs = addMenuAction(menuFile, _q("&Save as..."), _q("Ctrl+S"),
|
m_actionGameSaveAs = addMenuAction(menuFile, _q("&Save as..."), _q("Ctrl+S"),
|
||||||
_q("Save the current game"), SLOT(onGameSaveAs()));
|
_q("Save the current game"), SLOT(onGameSaveAs()));
|
||||||
menuFile->addSeparator();
|
menuFile->addSeparator();
|
||||||
|
m_actionGamePrintPreview = addMenuAction(menuFile, _q("&Print preview..."), QString(""),
|
||||||
|
_q("Print preview"), SLOT(onGamePrintPreview()),
|
||||||
|
false, QIcon(":/images/print-preview.png"));
|
||||||
m_actionGamePrint = addMenuAction(menuFile, _q("&Print..."), _q("Ctrl+P"),
|
m_actionGamePrint = addMenuAction(menuFile, _q("&Print..."), _q("Ctrl+P"),
|
||||||
_q("Print the current game"), SLOT(onGamePrint()),
|
_q("Print the current game"), SLOT(onGamePrint()),
|
||||||
false, QIcon(":/images/printer.png"));
|
false, QIcon(":/images/printer.png"));
|
||||||
|
@ -1014,152 +1020,169 @@ void MainWindow::onGamePrint()
|
||||||
|
|
||||||
QPrinter printer(QPrinter::HighResolution);
|
QPrinter printer(QPrinter::HighResolution);
|
||||||
QPrintDialog printDialog(&printer, this);
|
QPrintDialog printDialog(&printer, this);
|
||||||
if (printDialog.exec() == QDialog::Accepted)
|
if (printDialog.exec() != QDialog::Accepted)
|
||||||
|
return;
|
||||||
|
|
||||||
|
LOG_INFO("Printing game");
|
||||||
|
print(&printer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::onGamePrintPreview()
|
||||||
|
{
|
||||||
|
LOG_INFO("Print preview");
|
||||||
|
QPrintPreviewDialog previewDialog;
|
||||||
|
QObject::connect(&previewDialog, SIGNAL(paintRequested(QPrinter *)),
|
||||||
|
this, SLOT(print(QPrinter*)));
|
||||||
|
previewDialog.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::print(QPrinter *printer)
|
||||||
|
{
|
||||||
|
ASSERT(m_game != NULL, "No game in progress");
|
||||||
|
|
||||||
|
QPainter painter(printer);
|
||||||
|
const History &history = m_game->getHistory();
|
||||||
|
|
||||||
|
// Printing parameters (XXX: these could be configurable by the users)
|
||||||
|
// Number of pixels virtually present on the page width. The bigger
|
||||||
|
// this number, the smaller the print result
|
||||||
|
static const int TOTAL_WIDTH = 700;
|
||||||
|
// Distance between 2 horizontal lines
|
||||||
|
static const int LINE_HEIGHT = 16;
|
||||||
|
// Font size, in pixels
|
||||||
|
static const int FONT_SIZE = 10;
|
||||||
|
// Width of the pen used to draw the grid lines
|
||||||
|
static const int PEN_WIDTH = 1;
|
||||||
|
// Offset of the text from the previous vertical line, in pixels
|
||||||
|
static const int TEXT_OFFSET = 10;
|
||||||
|
// Indicate whether the rack and the solution should be aligned
|
||||||
|
static const bool SHOULD_ALIGN = false;
|
||||||
|
// Columns widths
|
||||||
|
static const int colWidths[] = { 30, 120, 120, 35, 35 };
|
||||||
|
// Columns titles
|
||||||
|
static const char *colTitles[] = { _("N."), _("RACK"), _("SOLUTION"), _("REF"), _("PTS") };
|
||||||
|
|
||||||
|
static const unsigned int nbCols = sizeof(colWidths) / sizeof(int);
|
||||||
|
const unsigned int nbRows = history.getSize() + (SHOULD_ALIGN ? 1 : 2);
|
||||||
|
|
||||||
|
double scale = printer->pageRect().width() / double(TOTAL_WIDTH);
|
||||||
|
painter.scale(scale, scale);
|
||||||
|
|
||||||
|
QPen pen(painter.pen());
|
||||||
|
pen.setWidth(PEN_WIDTH);
|
||||||
|
painter.setPen(pen);
|
||||||
|
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(FONT_SIZE);
|
||||||
|
painter.setFont(font);
|
||||||
|
|
||||||
|
int maxRight = 0;
|
||||||
|
for (unsigned int i = 0; i < nbCols; ++i)
|
||||||
|
maxRight += colWidths[i];
|
||||||
|
int maxBottom = LINE_HEIGHT * (nbRows + 1);
|
||||||
|
|
||||||
|
// Draw the horizontal lines
|
||||||
|
for (unsigned int i = 0; i <= nbRows + 1; ++i)
|
||||||
|
painter.drawLine(0, LINE_HEIGHT * i, maxRight, LINE_HEIGHT * i);
|
||||||
|
|
||||||
|
// Draw the vertical lines
|
||||||
|
painter.drawLine(0, 0, 0, maxBottom);
|
||||||
|
int curWidth = 0;
|
||||||
|
for (unsigned int i = 0; i < nbCols; ++i)
|
||||||
{
|
{
|
||||||
LOG_INFO("Printing game");
|
curWidth += colWidths[i];
|
||||||
|
painter.drawLine(curWidth, 0, curWidth, maxBottom);
|
||||||
QPainter painter(&printer);
|
|
||||||
const History &history = m_game->getHistory();
|
|
||||||
|
|
||||||
// Printing parameters (XXX: these could be configurable by the users)
|
|
||||||
// Number of pixels virtually present on the page width. The bigger
|
|
||||||
// this number, the smaller the print result
|
|
||||||
static const int TOTAL_WIDTH = 700;
|
|
||||||
// Distance between 2 horizontal lines
|
|
||||||
static const int LINE_HEIGHT = 16;
|
|
||||||
// Font size, in pixels
|
|
||||||
static const int FONT_SIZE = 10;
|
|
||||||
// Width of the pen used to draw the grid lines
|
|
||||||
static const int PEN_WIDTH = 1;
|
|
||||||
// Offset of the text from the previous vertical line, in pixels
|
|
||||||
static const int TEXT_OFFSET = 10;
|
|
||||||
// Indicate whether the rack and the solution should be aligned
|
|
||||||
static const bool SHOULD_ALIGN = false;
|
|
||||||
// Columns widths
|
|
||||||
static const int colWidths[] = { 30, 120, 120, 35, 35 };
|
|
||||||
// Columns titles
|
|
||||||
static const char *colTitles[] = { _("N."), _("RACK"), _("SOLUTION"), _("REF"), _("PTS") };
|
|
||||||
|
|
||||||
static const unsigned int nbCols = sizeof(colWidths) / sizeof(int);
|
|
||||||
const unsigned int nbRows = history.getSize() + (SHOULD_ALIGN ? 1 : 2);
|
|
||||||
|
|
||||||
double scale = printer.pageRect().width() / double(TOTAL_WIDTH);
|
|
||||||
painter.scale(scale, scale);
|
|
||||||
|
|
||||||
QPen pen(painter.pen());
|
|
||||||
pen.setWidth(PEN_WIDTH);
|
|
||||||
painter.setPen(pen);
|
|
||||||
|
|
||||||
QFont font;
|
|
||||||
font.setPixelSize(FONT_SIZE);
|
|
||||||
painter.setFont(font);
|
|
||||||
|
|
||||||
int maxRight = 0;
|
|
||||||
for (unsigned int i = 0; i < nbCols; ++i)
|
|
||||||
maxRight += colWidths[i];
|
|
||||||
int maxBottom = LINE_HEIGHT * (nbRows + 1);
|
|
||||||
|
|
||||||
// Draw the horizontal lines
|
|
||||||
for (unsigned int i = 0; i <= nbRows + 1; ++i)
|
|
||||||
painter.drawLine(0, LINE_HEIGHT * i, maxRight, LINE_HEIGHT * i);
|
|
||||||
|
|
||||||
// Draw the vertical lines
|
|
||||||
painter.drawLine(0, 0, 0, maxBottom);
|
|
||||||
int curWidth = 0;
|
|
||||||
for (unsigned int i = 0; i < nbCols; ++i)
|
|
||||||
{
|
|
||||||
curWidth += colWidths[i];
|
|
||||||
painter.drawLine(curWidth, 0, curWidth, maxBottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the titles
|
|
||||||
QFontMetrics fm = painter.fontMetrics();
|
|
||||||
int textHeight = fm.boundingRect('A').height();
|
|
||||||
curWidth = 0;
|
|
||||||
int curHeight = (LINE_HEIGHT + textHeight + 1) / 2;
|
|
||||||
for (unsigned int i = 0; i < nbCols; ++i)
|
|
||||||
{
|
|
||||||
int textWidth = fm.width(colTitles[i]);
|
|
||||||
painter.drawText(curWidth + (colWidths[i] - textWidth) / 2,
|
|
||||||
curHeight, colTitles[i]);
|
|
||||||
curWidth += colWidths[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the history of the game
|
|
||||||
int score = 0;
|
|
||||||
int nextHeight;
|
|
||||||
if (SHOULD_ALIGN)
|
|
||||||
nextHeight = curHeight;
|
|
||||||
else
|
|
||||||
nextHeight = curHeight + LINE_HEIGHT;
|
|
||||||
for (unsigned int i = 0; i < history.getSize(); ++i)
|
|
||||||
{
|
|
||||||
const TurnData &t = history.getTurn(i);
|
|
||||||
const Move &m = t.getMove();
|
|
||||||
|
|
||||||
curWidth = TEXT_OFFSET;
|
|
||||||
curHeight += LINE_HEIGHT;
|
|
||||||
nextHeight += LINE_HEIGHT;
|
|
||||||
|
|
||||||
// Turn number
|
|
||||||
painter.drawText(curWidth, curHeight, QString("%1").arg(i + 1));
|
|
||||||
curWidth += colWidths[0];
|
|
||||||
|
|
||||||
// Rack
|
|
||||||
painter.drawText(curWidth, curHeight,
|
|
||||||
qfw(t.getPlayedRack().toString()));
|
|
||||||
curWidth += colWidths[1];
|
|
||||||
|
|
||||||
// Word and coordinates
|
|
||||||
if (m.isValid())
|
|
||||||
{
|
|
||||||
const Round &r = m.getRound();
|
|
||||||
painter.drawText(curWidth, nextHeight, qfw(r.getWord()));
|
|
||||||
curWidth += colWidths[2];
|
|
||||||
painter.drawText(curWidth, nextHeight,
|
|
||||||
qfw(r.getCoord().toString()));
|
|
||||||
curWidth += colWidths[3];
|
|
||||||
}
|
|
||||||
else if (m.isInvalid())
|
|
||||||
{
|
|
||||||
painter.drawText(curWidth, nextHeight,
|
|
||||||
"<" + qfw(m.getBadWord()) + ">");
|
|
||||||
curWidth += colWidths[2];
|
|
||||||
painter.drawText(curWidth, nextHeight, qfw(m.getBadCoord()));
|
|
||||||
curWidth += colWidths[3];
|
|
||||||
}
|
|
||||||
else if (m.isNull())
|
|
||||||
{
|
|
||||||
painter.drawText(curWidth, nextHeight, _q("(NO MOVE)"));
|
|
||||||
curWidth += colWidths[2];
|
|
||||||
curWidth += colWidths[3];
|
|
||||||
}
|
|
||||||
else if (m.isPass())
|
|
||||||
{
|
|
||||||
painter.drawText(curWidth, nextHeight, _q("(PASS)"));
|
|
||||||
curWidth += colWidths[2];
|
|
||||||
curWidth += colWidths[3];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
painter.drawText(curWidth, nextHeight,
|
|
||||||
"[-" + qfw(m.getChangedLetters()) + "]");
|
|
||||||
curWidth += colWidths[2];
|
|
||||||
curWidth += colWidths[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Score
|
|
||||||
painter.drawText(curWidth, nextHeight,
|
|
||||||
QString("%1").arg(m.getScore()));
|
|
||||||
score += m.getScore();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Total score
|
|
||||||
nextHeight += LINE_HEIGHT;
|
|
||||||
painter.drawText(curWidth, nextHeight, QString("%1").arg(score));
|
|
||||||
|
|
||||||
LOG_INFO("Game printed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw the titles
|
||||||
|
QFontMetrics fm = painter.fontMetrics();
|
||||||
|
int textHeight = fm.boundingRect('A').height();
|
||||||
|
curWidth = 0;
|
||||||
|
int curHeight = (LINE_HEIGHT + textHeight + 1) / 2;
|
||||||
|
for (unsigned int i = 0; i < nbCols; ++i)
|
||||||
|
{
|
||||||
|
int textWidth = fm.width(colTitles[i]);
|
||||||
|
painter.drawText(curWidth + (colWidths[i] - textWidth) / 2,
|
||||||
|
curHeight, colTitles[i]);
|
||||||
|
curWidth += colWidths[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the history of the game
|
||||||
|
int score = 0;
|
||||||
|
int nextHeight;
|
||||||
|
if (SHOULD_ALIGN)
|
||||||
|
nextHeight = curHeight;
|
||||||
|
else
|
||||||
|
nextHeight = curHeight + LINE_HEIGHT;
|
||||||
|
for (unsigned int i = 0; i < history.getSize(); ++i)
|
||||||
|
{
|
||||||
|
const TurnData &t = history.getTurn(i);
|
||||||
|
const Move &m = t.getMove();
|
||||||
|
|
||||||
|
curWidth = TEXT_OFFSET;
|
||||||
|
curHeight += LINE_HEIGHT;
|
||||||
|
nextHeight += LINE_HEIGHT;
|
||||||
|
|
||||||
|
// Turn number
|
||||||
|
painter.drawText(curWidth, curHeight, QString("%1").arg(i + 1));
|
||||||
|
curWidth += colWidths[0];
|
||||||
|
|
||||||
|
// Rack
|
||||||
|
painter.drawText(curWidth, curHeight,
|
||||||
|
qfw(t.getPlayedRack().toString()));
|
||||||
|
curWidth += colWidths[1];
|
||||||
|
|
||||||
|
// Word and coordinates
|
||||||
|
if (m.isValid())
|
||||||
|
{
|
||||||
|
const Round &r = m.getRound();
|
||||||
|
painter.drawText(curWidth, nextHeight, qfw(r.getWord()));
|
||||||
|
curWidth += colWidths[2];
|
||||||
|
painter.drawText(curWidth, nextHeight,
|
||||||
|
qfw(r.getCoord().toString()));
|
||||||
|
curWidth += colWidths[3];
|
||||||
|
}
|
||||||
|
else if (m.isInvalid())
|
||||||
|
{
|
||||||
|
painter.drawText(curWidth, nextHeight,
|
||||||
|
"<" + qfw(m.getBadWord()) + ">");
|
||||||
|
curWidth += colWidths[2];
|
||||||
|
painter.drawText(curWidth, nextHeight, qfw(m.getBadCoord()));
|
||||||
|
curWidth += colWidths[3];
|
||||||
|
}
|
||||||
|
else if (m.isNull())
|
||||||
|
{
|
||||||
|
painter.drawText(curWidth, nextHeight, _q("(NO MOVE)"));
|
||||||
|
curWidth += colWidths[2];
|
||||||
|
curWidth += colWidths[3];
|
||||||
|
}
|
||||||
|
else if (m.isPass())
|
||||||
|
{
|
||||||
|
painter.drawText(curWidth, nextHeight, _q("(PASS)"));
|
||||||
|
curWidth += colWidths[2];
|
||||||
|
curWidth += colWidths[3];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
painter.drawText(curWidth, nextHeight,
|
||||||
|
"[-" + qfw(m.getChangedLetters()) + "]");
|
||||||
|
curWidth += colWidths[2];
|
||||||
|
curWidth += colWidths[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Score
|
||||||
|
painter.drawText(curWidth, nextHeight,
|
||||||
|
QString("%1").arg(m.getScore()));
|
||||||
|
score += m.getScore();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Total score
|
||||||
|
nextHeight += LINE_HEIGHT;
|
||||||
|
painter.drawText(curWidth, nextHeight, QString("%1").arg(score));
|
||||||
|
|
||||||
|
LOG_INFO("Game printed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ class AuxWindow;
|
||||||
class TimerModel;
|
class TimerModel;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class QAction;
|
class QAction;
|
||||||
|
class QPrinter;
|
||||||
|
|
||||||
class MainWindow: public QMainWindow
|
class MainWindow: public QMainWindow
|
||||||
{
|
{
|
||||||
|
@ -75,6 +76,7 @@ private slots:
|
||||||
void onGameLoad();
|
void onGameLoad();
|
||||||
void onGameLoadAutoSave();
|
void onGameLoadAutoSave();
|
||||||
void onGameSaveAs();
|
void onGameSaveAs();
|
||||||
|
void onGamePrintPreview();
|
||||||
void onGamePrint();
|
void onGamePrint();
|
||||||
void onGameQuit();
|
void onGameQuit();
|
||||||
void onSettingsChooseDic();
|
void onSettingsChooseDic();
|
||||||
|
@ -97,6 +99,9 @@ private slots:
|
||||||
void onHistoryLastTurn();
|
void onHistoryLastTurn();
|
||||||
void onHistoryReplayTurn();
|
void onHistoryReplayTurn();
|
||||||
|
|
||||||
|
/// Print the game using the given printer
|
||||||
|
void print(QPrinter *printer);
|
||||||
|
|
||||||
/// Simply emit a beep with the system speakers
|
/// Simply emit a beep with the system speakers
|
||||||
void beep();
|
void beep();
|
||||||
|
|
||||||
|
@ -158,6 +163,7 @@ private:
|
||||||
ScoreWidget *m_scoresWidget;
|
ScoreWidget *m_scoresWidget;
|
||||||
|
|
||||||
/// Actions enabled or disabled depending on the game state
|
/// Actions enabled or disabled depending on the game state
|
||||||
|
QAction *m_actionGamePrintPreview;
|
||||||
QAction *m_actionGamePrint;
|
QAction *m_actionGamePrint;
|
||||||
QAction *m_actionGameSaveAs;
|
QAction *m_actionGameSaveAs;
|
||||||
QAction *m_actionHistoryPrevTurn;
|
QAction *m_actionHistoryPrevTurn;
|
||||||
|
|
Loading…
Add table
Reference in a new issue