LibreWeb-Browser/src/mainwindow.cc

124 lines
3.5 KiB
C++

#include "mainwindow.h"
#include "scene.h"
#include "md-parser.h"
#include "qt-renderer.h"
#include <chrono>
#include <iostream>
#ifdef LEGACY_CXX
#include <experimental/filesystem>
namespace n_fs = ::std::experimental::filesystem;
#else
#include <filesystem>
namespace n_fs = ::std::filesystem;
#endif
#include <QVBoxLayout>
#include <QMenuBar>
#include <QMainWindow>
#include <QWidget>
#include <QTextEdit>
#include <QSizePolicy>
#include <QGraphicsView>
#include <QRectF>
#include <QGraphicsTextItem>
MainWindow::MainWindow()
{
resize(600, 400);
setWindowTitle("Browser");
QMenu *fileMenu = new QMenu("File");
fileMenu->addAction("Open...");
fileMenu->addAction("New...");
fileMenu->addAction("Exit");
menuBar()->addMenu(fileMenu);
QWidget *centralWidget = new QWidget;
setCentralWidget(centralWidget);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->setContentsMargins(5, 5, 5, 5);
scene = new Scene(this);
view = new QGraphicsView(scene);
//view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
view->setAlignment(Qt::Alignment::enum_type::AlignTop|Qt::Alignment::enum_type::AlignLeft);
layout->addWidget(view);
// We will not use TextEdit, it does only support HTML (and markdown, but we don't want to use the built-in parser).
// Instead, we can try QPainter in Qt or use a 2D engine (using ttf, glyphs atlas, render bitmap text).
textEdit = new QTextEdit();
textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
layout->addWidget(textEdit);
// Setup parser & renderer
setupParser();
}
void MainWindow::setupParser()
{
parser = new Parser();
renderer = new QtRenderer();
renderer->setScene(scene);
std::string exePath = n_fs::current_path().string();
std::string htmlOutput = "";
std::string filePath = exePath.append("/../../test.md");
printf("Path: %s\n", filePath.c_str());
cmark_node *root_node = parser->parseFile(filePath);
if (root_node != NULL) {
htmlOutput = parser->renderHTML(root_node);
typedef std::chrono::high_resolution_clock Time;
typedef std::chrono::milliseconds ms;
typedef std::chrono::duration<float> fsec;
auto t0 = Time::now();
// Render AST to scene
renderer->renderDocument(root_node);
auto t1 = Time::now();
fsec fs = t1 - t0;
ms d = std::chrono::duration_cast<ms>(fs);
std::cout << "My render: " << d.count() << " ms" << std::endl;
cmark_node_free(root_node);
}
setOutputToTextEdit(QString::fromStdString(htmlOutput));
}
/**
* Can be used for resizing the scene
void MainWindow::resizeEvent(QResizeEvent *) {
QRectF bounds = scene->itemsBoundingRect();
bounds.setWidth(bounds.width()*0.9); // to tighten-up margins
bounds.setHeight(bounds.height()*0.9); // same as above
view->fitInView(bounds, Qt::KeepAspectRatio);
view->centerOn(0, 0);
}*/
/**
* Example of adding text (plaintext or html) to text edit
*/
void MainWindow::setOutputToTextEdit(const QString& text)
{
typedef std::chrono::high_resolution_clock Time;
typedef std::chrono::milliseconds ms;
typedef std::chrono::duration<float> fsec;
auto htmlStart = Time::now();
textEdit->setHtml(text);
auto htmlEnd = Time::now();
fsec diff = htmlEnd - htmlStart;
ms htmlDuration = std::chrono::duration_cast<ms>(diff);
std::cout << "HTML: " << htmlDuration.count() << " ms" << std::endl;
}