stuff-from-scratch/src/ui_elements/desktop_elements/Window.cpp
2022-12-08 08:48:18 +00:00

149 lines
2.5 KiB
C++

#include "Window.h"
#include "PaintEvent.h"
#include "MouseEvent.h"
#include "KeyboardEvent.h"
#include "Widget.h"
#include "Scene.h"
#include "TriMesh.h"
#include "RootNode.h"
#include "TransformNode.h"
#include "AbstractPainter.h"
#include "DrawingContext.h"
#include "FontsManager.h"
#include "IPlatformWindow.h"
#include "Screen.h"
#include "Image.h"
#include <iostream>
namespace mt
{
Window::Window()
: DrawingSurface(),
mWidget(Widget::Create())
{
mWidth = 800;
mHeight = 600;
mWidget->setBounds(mWidth, mHeight);
mWidget->setWindow(this);
}
Window::~Window()
{
}
std::unique_ptr<Window> Window::Create()
{
return std::make_unique<Window>();
}
void Window::setSize(unsigned width, unsigned height)
{
DrawingSurface::setSize(width, height);
mWidget->setBounds(width, height);
if (mPlatformWindow)
{
mPlatformWindow->onResize(width, height);
}
}
void Window::clearPlatformWindow()
{
mPlatformWindow.reset();
}
void Window::onMouseEvent(const MouseEvent* event)
{
mWidget->onMouseEvent(event);
}
void Window::onKeyboardEvent(const KeyboardEvent* event)
{
mWidget->onKeyboardEvent(event);
}
void Window::onPaint(const PaintEvent* event)
{
mWidget->onPaintEvent(event);
}
void Window::setWidget(WidgetPtr widget)
{
if (mWidget)
{
mWidget.reset();
}
mWidget = std::move(widget);
mWidget->setBounds(mWidth, mHeight);
mWidget->setWindow(this);
}
IPlatformWindow* Window::getPlatformWindow() const
{
if (mPlatformWindow)
{
return mPlatformWindow.get();
}
return nullptr;
}
void Window::setPlatformWindow(IPlatformWindowPtr window, FontsManager* fontsManager, DrawingMode drawingMode)
{
mPlatformWindow = std::move(window);
mDrawingContext = std::make_unique<DrawingContext>(this, fontsManager, drawingMode);
}
void Window::map()
{
if (mPlatformWindow)
{
mPlatformWindow->map();
}
}
void Window::show()
{
if (mPlatformWindow)
{
mPlatformWindow->show();
}
}
void Window::doPaint(mt::Screen* screen)
{
if (mPlatformWindow)
{
mPlatformWindow->beforePaint(screen);
if (auto scene = getScene(); scene->isEmpty())
{
scene->addNode(mWidget->getRootNode());
}
mDrawingContext->paint();
mPlatformWindow->afterPaint(screen);
}
}
void Window::clear()
{
if (mPlatformWindow)
{
mPlatformWindow->clear();
}
}
bool Window::isDirty() const
{
return mWidget->needsUpdate();
}
}