#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
#pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
#include "qtcanvas.h"
#include <cassert>
#include <sstream>
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <QPainter>
#include "canvas.h"
#include "dotmatrixtext.h"
#include "trace.h"
#pragma GCC diagnostic pop
ribi::QtCanvas::QtCanvas()
: m_signal_on_destroy{},
m_active_canvas{nullptr},
m_image{},
m_image_canvas{},
m_smart_canvas{},
m_text_canvas{}
{
}
ribi::QtCanvas::QtCanvas(const boost::shared_ptr<ribi::Canvas> canvas)
: m_signal_on_destroy{},
m_active_canvas{nullptr},
m_image{},
m_image_canvas{},
m_smart_canvas{canvas},
m_text_canvas{}
{
assert(canvas);
SetCanvas(canvas);
assert(m_active_canvas);
}
ribi::QtCanvas::~QtCanvas() noexcept
{
if (m_active_canvas)
{
m_active_canvas->m_signal_changed.disconnect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1
)
);
}
m_signal_on_destroy();
}
void ribi::QtCanvas::keyPressEvent(QKeyEvent* event)
{
if (event->key() == Qt::Key_Escape)
{
m_signal_on_destroy();
close();
return;
}
QWidget::keyPressEvent(event);
}
void ribi::QtCanvas::keyReleaseEvent(QKeyEvent* event)
{
QWidget::keyReleaseEvent(event);
}
void ribi::QtCanvas::paintEvent(QPaintEvent *)
{
if (!m_active_canvas)
{
return;
}
std::vector<std::string> text;
for (std::string line: m_active_canvas->ToStrings()) { text.push_back(line); }
DotMatrixText t(text,1,DotMatrixText::ColorSystem::inverted);
m_image = t.CreateImage();
QPainter painter(this);
painter.drawPixmap(rect(),QPixmap::fromImage(*m_image.get()));
//painter.drawImage(rect(),*m_image.get());
}
void ribi::QtCanvas::SetCanvas(const boost::shared_ptr<Canvas> canvas)
{
assert(canvas);
if (canvas == m_smart_canvas) { return; }
//Disconnect current Canvas
if (m_active_canvas)
{
m_active_canvas->m_signal_changed.disconnect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1
)
);
}
//Use new Canvas
m_smart_canvas = canvas;
//Connect new Canvas
m_active_canvas->m_signal_changed.connect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1)
);
//Set minimum size
{
std::vector<std::string> text;
for (std::string line: m_active_canvas->ToStrings()) { text.push_back(line); }
DotMatrixText t(text,1);
setMinimumSize(
t.GetMatrixHeight(),
t.GetMatrixWidth()
);
}
m_active_canvas = m_smart_canvas.get();
ShowCanvas(m_active_canvas);
}
void ribi::QtCanvas::SetImageCanvas(const ImageCanvas& canvas)
{
if (canvas == m_image_canvas) { return; }
//Disconnect current Canvas
if (m_active_canvas)
{
m_active_canvas->m_signal_changed.disconnect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1
)
);
}
//Use new Canvas
m_image_canvas = canvas;
m_active_canvas = &m_image_canvas;
//Connect new Canvas
m_active_canvas->m_signal_changed.connect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1
)
);
//Set minimum size
{
std::vector<std::string> text;
for (std::string line: m_active_canvas->ToStrings()) { text.push_back(line); }
DotMatrixText t(text,1);
setMinimumSize(
t.GetMatrixHeight(),
t.GetMatrixWidth()
);
}
m_active_canvas = m_smart_canvas.get();
ShowCanvas(m_active_canvas);
}
void ribi::QtCanvas::SetTextCanvas(const TextCanvas& canvas)
{
if (canvas == m_text_canvas) { return; }
//Disconnect current Canvas
if (m_active_canvas)
{
m_active_canvas->m_signal_changed.disconnect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1
)
);
}
//Use new Canvas
m_text_canvas = canvas;
m_active_canvas = &m_text_canvas;
//Connect new Canvas
m_active_canvas->m_signal_changed.connect(
boost::bind(
&ribi::QtCanvas::ShowCanvas,this,
boost::lambda::_1
)
);
//Set minimum size
{
std::vector<std::string> text;
for (std::string line: m_active_canvas->ToStrings()) { text.push_back(line); }
DotMatrixText t(text,1);
setMinimumSize(
t.GetMatrixHeight(),
t.GetMatrixWidth()
);
}
m_active_canvas = m_smart_canvas.get();
ShowCanvas(m_active_canvas);
}
void ribi::QtCanvas::ShowCanvas(const Canvas * const)
{
repaint();
}
|