Changeset b26dc16dcf in tspsg


Ignore:
Timestamp:
Sep 10, 2012, 10:40:06 AM (12 years ago)
Author:
Oleksii Serdiuk
Branches:
appveyor, imgbot, master, readme
Children:
f48433245d
Parents:
bf92f16303
git-author:
Oleksii Serdiuk <contacts@…> (09/10/12 10:40:06)
git-committer:
Oleksii Serdiuk <contacts@…> (09/10/12 13:33:32)
Message:

Some refactoring for the things to come...

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/globals.h

    rbf92f16303 rb26dc16dcf  
    138138}
    139139
     140/*!
     141 * \brief Converts \a in into Base64 format with lines wrapped at 64 characters.
     142 * \param in A byte array to be converted.
     143 * \return Converted byte array.
     144 */
     145inline QByteArray toWrappedBase64(const QByteArray &in)
     146{
     147    QByteArray out, base64(in.toBase64());
     148    for (int i = 0; i <= base64.size() - 64; i += 64) {
     149        out.append(QByteArray::fromRawData(base64.data() + i, 64)).append('\n');
     150    }
     151    if (int rest = base64.size() % 64)
     152        out.append(QByteArray::fromRawData(base64.data() + base64.size() - rest, rest));
     153    return out;
     154}
     155
    140156#ifndef HANDHELD
    141157/*!
  • src/mainwindow.cpp

    rbf92f16303 rb26dc16dcf  
    283283    }
    284284#endif
     285    QByteArray imgdata;
     286    bool embed = settings->value("Output/EmbedGraphIntoHTML", DEF_EMBED_GRAPH_INTO_HTML).toBool();
    285287    if (selectedFile.endsWith(".htm", Qt::CaseInsensitive) || selectedFile.endsWith(".html", Qt::CaseInsensitive)) {
    286 QFile file(selectedFile);
    287         if (!file.open(QFile::WriteOnly)) {
     288        QFile file(selectedFile);
     289        if (!file.open(QFile::WriteOnly | QFile::Text)) {
    288290            QApplication::restoreOverrideCursor();
    289291            QMessageBox::critical(this, tr("Solution Save"), tr("Unable to save the solution.\nError: %1").arg(file.errorString()));
    290292            return;
    291293        }
    292 QFileInfo fi(selectedFile);
    293 QString format = settings->value("Output/GraphImageFormat", DEF_GRAPH_IMAGE_FORMAT).toString();
     294
     295        QString html = solutionText->document()->toHtml("UTF-8");
     296        html.replace(QRegExp("font-family:([^;]*);"),
     297                     "font-family:\\1, 'DejaVu Sans Mono', 'Courier New', Courier, monospace;");
     298        html.replace(QRegExp("<style ([^>]*)>"), QString("<style \\1>\n"
     299                                                         "body { color: %1 }\n"
     300                                                         "td { border-style: solid; border-width: 1px; border-color: %2; }")
     301                     .arg(settings->value("Output/Colors/Font", DEF_TEXT_COLOR).toString(),
     302                          settings->value("Output/Colors/TableBorder", DEF_TABLE_COLOR).toString()));
     303
     304        QFileInfo fi(selectedFile);
     305        QString format = settings->value("Output/GraphImageFormat", DEF_GRAPH_IMAGE_FORMAT).toString();
    294306#if !defined(NOSVG)
    295307        if (!QImageWriter::supportedImageFormats().contains(format.toAscii()) && (format != "svg")) {
     
    300312            settings->remove("Output/GraphImageFormat");
    301313        }
    302 QString html = solutionText->document()->toHtml("UTF-8");
    303 
    304         html.replace(QRegExp("font-family:([^;]*);"), "font-family:\\1, 'DejaVu Sans Mono', 'Courier New', Courier, monospace;");
    305         html.replace(QRegExp("<style ([^>]*)>"), QString("<style \\1>\n"
    306                                                          "body { color: %1 }\n"
    307                                                          "td { border-style: solid; border-width: 1px; border-color: %2; }")
    308                      .arg(settings->value("Output/Colors/Font", DEF_TEXT_COLOR).toString(),
    309                           settings->value("Output/Colors/TableBorder", DEF_TABLE_COLOR).toString()));
    310314
    311315        if (!graph.isNull()) {
    312             QString img =  fi.completeBaseName() + "." + format;
    313             bool embed = settings->value("Output/EmbedGraphIntoHTML", DEF_EMBED_GRAPH_INTO_HTML).toBool();
    314             QByteArray data;
    315             QBuffer buf(&data);
    316             if (!embed) {
    317                 html.replace(QRegExp("<img\\s+src=\"tspsg://graph.pic\""), QString("<img src=\"%1\" alt=\"%2\"").arg(img, tr("Solution Graph")));
     316            imgdata = generateImage(format);
     317            if (imgdata.isEmpty()) {
     318                return;
    318319            }
    319 
    320             // Saving solution graph in SVG or supported raster format (depending on settings and SVG support)
    321 #if !defined(NOSVG)
    322             if (format == "svg") {
    323                 QSvgGenerator svg;
    324                 svg.setSize(QSize(graph.width() + 2, graph.height() + 2));
    325                 svg.setResolution(graph.logicalDpiX());
    326                 svg.setFileName(fi.path() + "/" + img);
    327                 svg.setTitle(tr("Solution Graph"));
    328                 svg.setDescription(tr("Generated with %1").arg(QCoreApplication::applicationName()));
    329                 QPainter p;
    330                 p.begin(&svg);
    331                 p.drawPicture(1, 1, graph);
    332                 p.end();
     320            if (embed) {
     321                QString fmt = format;
     322                if (format == "svg")
     323                    fmt.append("+xml");
     324                html.replace(QRegExp("<img\\s+src=\"tspsg://graph.pic\""),
     325                             QString("<img src=\"data:image/%1;base64,%2\" alt=\"%3\"")
     326                             .arg(fmt, toWrappedBase64(imgdata), tr("Solution Graph")));
    333327            } else {
    334 #endif // NOSVG
    335                 QImage i(graph.width() + 2, graph.height() + 2, QImage::Format_ARGB32);
    336                 i.fill(0x00FFFFFF);
    337                 QPainter p;
    338                 p.begin(&i);
    339                 p.drawPicture(1, 1, graph);
    340                 p.end();
    341                 QImageWriter pic;
    342                 if (embed) {
    343                     pic.setDevice(&buf);
    344                     pic.setFormat(format.toAscii());
    345                 } else {
    346                     pic.setFileName(fi.path() + "/" + img);
    347                 }
    348                 if (pic.supportsOption(QImageIOHandler::Description)) {
    349                     pic.setText("Title", "Solution Graph");
    350                     pic.setText("Software", QCoreApplication::applicationName());
    351                 }
    352                 if (format == "png")
    353                     pic.setQuality(5);
    354                 else if (format == "jpeg")
    355                     pic.setQuality(80);
    356                 if (!pic.write(i)) {
    357                     QApplication::restoreOverrideCursor();
    358                     QMessageBox::critical(this, tr("Solution Save"), tr("Unable to save the solution graph.\nError: %1").arg(pic.errorString()));
    359                     return;
    360                 }
    361 #if !defined(NOSVG)
     328                html.replace(QRegExp("<img\\s+src=\"tspsg://graph.pic\""),
     329                             QString("<img src=\"%1\" alt=\"%2\"")
     330                             .arg(fi.completeBaseName() + "." + format, tr("Solution Graph")));
    362331            }
    363 #endif // NOSVG
    364             if (embed) {
    365                 html.replace(QRegExp("<img\\s+src=\"tspsg://graph.pic\""), QString("<img src=\"data:image/%1;base64,%2\" alt=\"%3\"").arg(format, data.toBase64(), tr("Solution Graph")));
    366             }
    367         }
     332        }
     333
    368334        // Saving solution text as HTML
    369335QTextStream ts(&file);
    370336        ts.setCodec(QTextCodec::codecForName("UTF-8"));
    371         ts << html;
     337        ts << html << endl;
    372338        file.close();
     339        if (!embed) {
     340            QFile img(fi.path() + "/" + fi.completeBaseName() + "." + format);
     341            if (!img.open(QFile::WriteOnly)) {
     342                QApplication::restoreOverrideCursor();
     343                QMessageBox::critical(this, tr("Solution Save"), tr("Unable to save the solution graph.\nError: %1").arg(img.errorString()));
     344                return;
     345            }
     346            if (img.write(imgdata) != imgdata.size()) {
     347                QApplication::restoreOverrideCursor();
     348                QMessageBox::critical(this, tr("Solution Save"), tr("Unable to save the solution graph.\nError: %1").arg(img.errorString()));
     349            }
     350            img.close();
     351        }
    373352    } else {
    374353QTextDocumentWriter dw(selectedFile);
     
    12781257}
    12791258
     1259QByteArray MainWindow::generateImage(const QString &format)
     1260{
     1261    if (graph.isNull())
     1262        return QByteArray();
     1263
     1264    QByteArray data;
     1265    QBuffer buf(&data);
     1266    // Saving solution graph in SVG or supported raster format (depending on settings and SVG support)
     1267#if !defined(NOSVG)
     1268    if (format == "svg") {
     1269        QSvgGenerator svg;
     1270        svg.setSize(QSize(graph.width() + 2, graph.height() + 2));
     1271        svg.setResolution(graph.logicalDpiX());
     1272        svg.setOutputDevice(&buf);
     1273        svg.setTitle(tr("Solution Graph"));
     1274        svg.setDescription(tr("Generated with %1").arg(QCoreApplication::applicationName()));
     1275        QPainter p;
     1276        p.begin(&svg);
     1277        p.drawPicture(1, 1, graph);
     1278        p.end();
     1279    } else {
     1280#endif // NOSVG
     1281        QImage i(graph.width() + 2, graph.height() + 2, QImage::Format_ARGB32);
     1282        i.fill(0x00FFFFFF);
     1283        QPainter p;
     1284        p.begin(&i);
     1285        p.drawPicture(1, 1, graph);
     1286        p.end();
     1287        QImageWriter pic;
     1288        pic.setDevice(&buf);
     1289        pic.setFormat(format.toAscii());
     1290        if (pic.supportsOption(QImageIOHandler::Description)) {
     1291            pic.setText("Title", "Solution Graph");
     1292            pic.setText("Software", QCoreApplication::applicationName());
     1293        }
     1294        if (format == "png")
     1295            pic.setQuality(5);
     1296        else if (format == "jpeg")
     1297            pic.setQuality(80);
     1298        if (!pic.write(i)) {
     1299            QApplication::restoreOverrideCursor();
     1300            QMessageBox::critical(this, tr("Solution Save"), tr("Unable to save the solution graph.\nError: %1").arg(pic.errorString()));
     1301            return QByteArray();
     1302        }
     1303#if !defined(NOSVG)
     1304    }
     1305#endif // NOSVG
     1306    return data;
     1307}
     1308
    12801309void MainWindow::initDocStyleSheet()
    12811310{
  • src/mainwindow.h

    rbf92f16303 rb26dc16dcf  
    145145    void drawNode(QPainter &pic, int nstep, bool left = false, SStep *step = NULL);
    146146    void dropEvent(QDropEvent *ev);
     147    QByteArray generateImage(const QString &format);
    147148    void initDocStyleSheet();
    148149    void loadLangList();
Note: See TracChangeset for help on using the changeset viewer.