Starting resize support.

This commit is contained in:
James Grogan 2022-11-14 14:57:50 +00:00
parent cea3d2c39f
commit 9ade0e2d4b
26 changed files with 197 additions and 44 deletions

View file

@ -12,7 +12,7 @@ int main(int argc, char *argv[])
// Start the gui app // Start the gui app
auto app = MediaTool(std::move(args)); auto app = MediaTool(std::move(args));
app.setUiInterfaceBackend(UiInterfaceFactory::Backend::X11_RASTER); //app.setUiInterfaceBackend(UiInterfaceFactory::Backend::X11_RASTER);
app.run(); app.run();
return 0; return 0;

View file

@ -26,22 +26,22 @@ std::unique_ptr<Color> Color::Create(const Color& color)
return std::make_unique<Color>(color); return std::make_unique<Color>(color);
} }
unsigned Color::GetR() const unsigned Color::getR() const
{ {
return mR; return mR;
} }
unsigned Color::GetG() const unsigned Color::getG() const
{ {
return mG; return mG;
} }
unsigned Color::GetB() const unsigned Color::getB() const
{ {
return mB; return mB;
} }
double Color::GetAlpha() const double Color::getAlpha() const
{ {
return mAlpha; return mAlpha;
} }

View file

@ -1,5 +1,8 @@
#pragma once #pragma once
#include <memory> #include <memory>
#include <vector>
#include <cstdint>
class Color class Color
{ {
@ -10,10 +13,10 @@ public:
static std::unique_ptr<Color> Create(unsigned r, unsigned g, unsigned b, double a = 1.0); static std::unique_ptr<Color> Create(unsigned r, unsigned g, unsigned b, double a = 1.0);
static std::unique_ptr<Color> Create(const Color& color); static std::unique_ptr<Color> Create(const Color& color);
unsigned GetR() const; unsigned getR() const;
unsigned GetG() const; unsigned getG() const;
unsigned GetB() const; unsigned getB() const;
double GetAlpha() const; double getAlpha() const;
bool operator==(const Color& rhs) const bool operator==(const Color& rhs) const
{ {
@ -28,6 +31,16 @@ public:
return !operator==(rhs); return !operator==(rhs);
} }
std::vector<double> getAsVectorDouble() const
{
return {mR/255.0, mG/255.0, mB/255.0, mAlpha/255.0};
}
uint32_t getAsUInt32() const
{
return mB + (mG<<8) + (mR<<16);
}
private: private:
unsigned mR{0}; unsigned mR{0};
unsigned mG{0}; unsigned mG{0};

View file

@ -13,7 +13,7 @@ public:
static std::unique_ptr<DrawingSurface> Create(); static std::unique_ptr<DrawingSurface> Create();
void setSize(unsigned width, unsigned height); virtual void setSize(unsigned width, unsigned height);
unsigned getWidth() const; unsigned getWidth() const;

View file

@ -21,35 +21,43 @@ void OpenGlPainter::paint(DrawingContext* context)
const auto num_mesh = context->getScene()->getNumMeshes(); const auto num_mesh = context->getScene()->getNumMeshes();
glClearColor(0.4, 0.4, 0.4, 0.4); glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); //glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
for (std::size_t idx=0; idx<num_mesh; idx++) for (std::size_t idx=0; idx<num_mesh; idx++)
{ {
auto mesh = context->getScene()->getMesh(idx); auto mesh = context->getScene()->getMesh(idx);
const auto faces = mesh->getFaceVertices(); const auto faces = mesh->getFaceVertices();
const auto colors = mesh->getFaceVectorAttributes("Color");
glColor3f(1.0, 0.0, 1.0); std::size_t counter{0};
for (const auto& face : faces) for (const auto& face : faces)
{ {
const auto r = colors[counter][0];
const auto g = colors[counter][1];
const auto b = colors[counter][2];
glColor3f(r, g, b);
glBegin(GL_TRIANGLES); glBegin(GL_TRIANGLES);
double x0 = 2.0*face[0].getX() / width - 1.0; double x0 = 2.0*face[0].getX() / width - 1.0;
double y0 = 2.0*face[0].getY() / height - 1.0; double y0 = 1.0 - 2.0*face[0].getY() / height;
double x1 = 2.0*face[1].getX() / width - 1.0; double x1 = 2.0*face[1].getX() / width - 1.0;
double y1 = 2.0*face[1].getY() / height - 1.0; double y1 = 1.0 - 2.0*face[1].getY() / height;
double x2 = 2.0*face[2].getX() / width - 1.0; double x2 = 2.0*face[2].getX() / width - 1.0;
double y2 = 2.0*face[2].getY() / height - 1.0; double y2 = 1.0 - 2.0*face[2].getY() / height;
glVertex3f(x0, y0, 0); glVertex3f(x0, y0, 0);
glVertex3f(x1, y1, 0); glVertex3f(x1, y1, 0);
glVertex3f(x2, y2, 0); glVertex3f(x2, y2, 0);
glEnd(); glEnd();
counter++;
} }
} }

View file

@ -30,9 +30,9 @@ void Image<T>::setPixelValue(unsigned idx, unsigned jdx, const Color& color)
initialize(); initialize();
} }
mData[jdx*getBytesPerRow() + idx*3] = static_cast<T>(color.GetR()); mData[jdx*getBytesPerRow() + idx*3] = static_cast<T>(color.getR());
mData[jdx*getBytesPerRow() + idx*3 + 1] = static_cast<T>(color.GetG()); mData[jdx*getBytesPerRow() + idx*3 + 1] = static_cast<T>(color.getG());
mData[jdx*getBytesPerRow() + idx*3 + 2] = static_cast<T>(color.GetB()); mData[jdx*getBytesPerRow() + idx*3 + 2] = static_cast<T>(color.getB());
} }
template<typename T> template<typename T>

View file

@ -25,3 +25,18 @@ std::vector<unsigned> TriFace::getNodeIds() const
{ {
return {mEdge0->getNode0Id(), mEdge0->getNode1Id(), mEdge1->getNode1Id()}; return {mEdge0->getNode0Id(), mEdge0->getNode1Id(), mEdge1->getNode1Id()};
} }
void TriFace::addVectorAttribute(const std::string& tag, const std::vector<double>& values)
{
mVectorAttributes[tag] = values;
}
std::vector<double> TriFace::getVectorAttribute(const std::string& tag) const
{
auto iter = mVectorAttributes.find(tag);
if (iter != mVectorAttributes.end())
{
return iter->second;
}
return {};
}

View file

@ -2,6 +2,8 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <unordered_map>
#include <string>
class Edge; class Edge;
@ -14,8 +16,14 @@ public:
static std::unique_ptr<TriFace> Create(Edge* edge0, Edge* edge1, Edge* edge2, unsigned id=0); static std::unique_ptr<TriFace> Create(Edge* edge0, Edge* edge1, Edge* edge2, unsigned id=0);
std::vector<unsigned> getNodeIds() const; std::vector<unsigned> getNodeIds() const;
void addVectorAttribute(const std::string& tag, const std::vector<double>& values);
std::vector<double> getVectorAttribute(const std::string& tag) const;
private: private:
unsigned mId{0}; unsigned mId{0};
std::unordered_map<std::string, std::vector<double> > mVectorAttributes;
Edge* mEdge0{nullptr}; Edge* mEdge0{nullptr};
Edge* mEdge1{nullptr}; Edge* mEdge1{nullptr};
Edge* mEdge2{nullptr}; Edge* mEdge2{nullptr};

View file

@ -27,3 +27,21 @@ std::vector<std::vector<Point> > TriMesh::getFaceVertices() const
} }
return verts; return verts;
} }
std::vector<std::vector<double> > TriMesh::getFaceVectorAttributes(const std::string& tag)
{
std::vector<std::vector<double> > attribs(mFaces.size());
for(std::size_t idx=0; idx<mFaces.size(); idx++)
{
attribs[idx] = {mFaces[idx]->getVectorAttribute(tag)};
}
return attribs;
}
void TriMesh::addConstantFaceVectorAttribute(const std::string& tag, const std::vector<double>& values)
{
for (const auto& face : mFaces)
{
face->addVectorAttribute(tag, values);
}
}

View file

@ -29,6 +29,10 @@ public:
std::vector<std::vector<Point> > getFaceVertices() const; std::vector<std::vector<Point> > getFaceVertices() const;
void addConstantFaceVectorAttribute(const std::string& tag, const std::vector<double>& values);
std::vector<std::vector<double> > getFaceVectorAttributes(const std::string& tag);
private: private:
VecNodes mNodes; VecNodes mNodes;
VecEdges mEdges; VecEdges mEdges;

View file

@ -12,6 +12,8 @@ list(APPEND ui_elements_LIB_INCLUDES
ui_events/MouseEvent.h ui_events/MouseEvent.h
ui_events/UiEvent.h ui_events/UiEvent.h
ui_events/PaintEvent.h ui_events/PaintEvent.h
ui_events/ResizeEvent.h
ui_events/ResizeEvent.cpp
widgets/Widget.cpp widgets/Widget.cpp
widgets/Button.cpp widgets/Button.cpp
widgets/Label.cpp widgets/Label.cpp

View file

@ -37,6 +37,12 @@ std::unique_ptr<Window> Window::Create()
return std::make_unique<Window>(); return std::make_unique<Window>();
} }
void Window::setSize(unsigned width, unsigned height)
{
DrawingSurface::setSize(width, height);
mWidget->setBounds(width, height);
}
void Window::clearPlatformWindow() void Window::clearPlatformWindow()
{ {
mPlatformWindow.reset(); mPlatformWindow.reset();

View file

@ -55,6 +55,8 @@ public:
void clearPlatformWindow(); void clearPlatformWindow();
void setSize(unsigned width, unsigned height) override;
private: private:
WidgetPtr mWidget {nullptr}; WidgetPtr mWidget {nullptr};
IPlatformWindowPtr mPlatformWindow {nullptr}; IPlatformWindowPtr mPlatformWindow {nullptr};

View file

@ -7,7 +7,6 @@
class PaintEvent : public UiEvent class PaintEvent : public UiEvent
{ {
public: public:
PaintEvent(); PaintEvent();
~PaintEvent(); ~PaintEvent();

View file

@ -0,0 +1,20 @@
#include "ResizeEvent.h"
ResizeEvent::ResizeEvent(unsigned width, unsigned height)
: UiEvent(),
mWidth(),
mHeight()
{
mType = UiEvent::Type::Resize;
}
ResizeEvent::~ResizeEvent()
{
}
std::unique_ptr<ResizeEvent> ResizeEvent::Create(unsigned width, unsigned height)
{
return std::make_unique<ResizeEvent>(width, height);
}

View file

@ -0,0 +1,30 @@
#pragma once
#include <memory>
#include "UiEvent.h"
class ResizeEvent : public UiEvent
{
public:
ResizeEvent(unsigned width, unsigned height);
~ResizeEvent();
static std::unique_ptr<ResizeEvent> Create(unsigned width, unsigned height);
unsigned getWidth() const
{
return mWidth;
}
unsigned getHeight() const
{
return mHeight;
}
private:
unsigned mWidth{0};
unsigned mHeight{0};
};
using ResizeEventPtr = std::unique_ptr<ResizeEvent>;

View file

@ -10,7 +10,8 @@ public:
Unknown, Unknown,
Paint, Paint,
Mouse, Mouse,
Keyboard Keyboard,
Resize
}; };
protected: protected:

View file

@ -38,5 +38,8 @@ void RectangleNode::updateMesh()
const auto rect = Rectangle(mLocation, mWidth, mHeight); const auto rect = Rectangle(mLocation, mWidth, mHeight);
auto mesh = MeshPrimitives::build(rect); auto mesh = MeshPrimitives::build(rect);
auto color = getFillColor();
mesh->addConstantFaceVectorAttribute("Color", color.getAsVectorDouble());
mMesh = std::move(mesh); mMesh = std::move(mesh);
} }

View file

@ -67,6 +67,13 @@ void DesktopManager::onUiEvent(UiEventUPtr eventUPtr)
mModified = true; mModified = true;
break; break;
} }
case (UiEvent::Type::Resize):
{
auto resize_event = dynamic_cast<const ResizeEvent*>(event);
mWindowManager->onResizeEvent(resize_event);
//mModified = true;
break;
}
case (UiEvent::Type::Mouse): case (UiEvent::Type::Mouse):
{ {
auto mouseEvent = dynamic_cast<const MouseEvent*>(event); auto mouseEvent = dynamic_cast<const MouseEvent*>(event);

View file

@ -26,6 +26,11 @@ void WindowManager::onMouseEvent(const MouseEvent* event)
getMainWindow()->onMouseEvent(event); getMainWindow()->onMouseEvent(event);
} }
void WindowManager::onResizeEvent(const ResizeEvent* event)
{
getMainWindow()->setSize(event->getWidth(), event->getHeight());
}
void WindowManager::onKeyboardEvent(const KeyboardEvent* event) void WindowManager::onKeyboardEvent(const KeyboardEvent* event)
{ {
getMainWindow()->onKeyboardEvent(event); getMainWindow()->onKeyboardEvent(event);

View file

@ -6,6 +6,7 @@
#include "Window.h" #include "Window.h"
#include "PaintEvent.h" #include "PaintEvent.h"
#include "MouseEvent.h" #include "MouseEvent.h"
#include "ResizeEvent.h"
#include "KeyboardEvent.h" #include "KeyboardEvent.h"
class WindowManager class WindowManager
@ -27,6 +28,8 @@ public:
void onKeyboardEvent(const KeyboardEvent* event); void onKeyboardEvent(const KeyboardEvent* event);
void onResizeEvent(const ResizeEvent* event);
void clearPlatformWindows(); void clearPlatformWindows();
std::size_t getNumWindows() const std::size_t getNumWindows() const

View file

@ -9,11 +9,13 @@ XcbGlInterface::XcbGlInterface(Display* display, int default_screen)
mContext(), mContext(),
mConfig() mConfig()
{ {
MLOG_INFO("Creating XcbGlInterface");
setupContext(default_screen); setupContext(default_screen);
} }
XcbGlInterface::~XcbGlInterface() XcbGlInterface::~XcbGlInterface()
{ {
MLOG_INFO("Destroying XcbGlInterface");
destroyContext(); destroyContext();
} }

View file

@ -7,17 +7,20 @@
#include <xcb/xcb.h> #include <xcb/xcb.h>
#include "PaintEvent.h" #include "PaintEvent.h"
#include "ResizeEvent.h"
#include "Screen.h" #include "Screen.h"
#include "XcbScreen.h" #include "XcbScreen.h"
#include "Color.h"
#include "UiEvent.h" #include "UiEvent.h"
#include "VisualLayer.h" #include "VisualLayer.h"
#include "XcbKeyboard.h" #include "XcbKeyboard.h"
#include "XcbWindow.h" #include "XcbWindow.h"
#include "XcbLayerInterface.h"
#include "XcbEventInterface.h" #include "XcbEventInterface.h"
#include "XcbGlInterface.h" #include "XcbGlInterface.h"
#include "FileLogger.h" #include "FileLogger.h"
#include <iostream>
XcbInterface::XcbInterface(DesktopManager* desktopManager, bool useHardware) XcbInterface::XcbInterface(DesktopManager* desktopManager, bool useHardware)
: AbstractUIInterface(desktopManager, useHardware), : AbstractUIInterface(desktopManager, useHardware),
@ -120,7 +123,8 @@ void XcbInterface::createGraphicsContext()
auto gc = xcb_generate_id(mConnection); auto gc = xcb_generate_id(mConnection);
xcb_drawable_t window = xcb_screen->GetNativeScreen()->root; xcb_drawable_t window = xcb_screen->GetNativeScreen()->root;
uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
uint32_t values[2] = {XcbLayerInterface::getColor(240, 240, 240), 0}; auto color = Color(240, 240, 240);
uint32_t values[2] = {color.getAsUInt32(), 0};
xcb_create_gc(mConnection, gc, window, mask, values); xcb_create_gc(mConnection, gc, window, mask, values);
xcb_screen->SetGraphicsContext(gc); xcb_screen->SetGraphicsContext(gc);
} }
@ -140,7 +144,8 @@ uint32_t XcbInterface::getEventMask()
return XCB_EVENT_MASK_KEY_RELEASE | return XCB_EVENT_MASK_KEY_RELEASE |
XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_PRESS |
XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_RELEASE |
XCB_EVENT_MASK_EXPOSURE; XCB_EVENT_MASK_EXPOSURE |
XCB_EVENT_MASK_RESIZE_REDIRECT;
} }
void XcbInterface::addWindow(mt::Window* window) void XcbInterface::addWindow(mt::Window* window)
@ -205,6 +210,23 @@ void XcbInterface::loop()
mDesktopManager->onUiEvent(std::move(ui_event)); mDesktopManager->onUiEvent(std::move(ui_event));
break; break;
} }
case XCB_RESIZE_REQUEST:
{
auto resize = (xcb_resize_request_event_t*) event;
int width = 1;
int height = 1;
if (resize->width > 0)
{
width = resize->width;
}
if (resize->height > 0)
{
height = resize->height;
}
auto ui_event = std::make_unique<ResizeEvent>(width, height);
mDesktopManager->onUiEvent(std::move(ui_event));
break;
}
default: default:
/* Unknown event type, ignore it */ /* Unknown event type, ignore it */
break; break;

View file

@ -6,20 +6,10 @@
#include <memory> #include <memory>
uint32_t XcbLayerInterface::getColor(const Color* color) void XcbLayerInterface::modifyGcColor(xcb_connection_t* connection, xcb_gcontext_t gc, const Color& color)
{
return XcbLayerInterface::getColor(color->GetR(), color->GetG(), color->GetB());
}
uint32_t XcbLayerInterface::getColor(int r, int g, int b)
{
return b + (g<<8) + (r<<16);
}
void XcbLayerInterface::modifyGcColor(xcb_connection_t* connection, xcb_gcontext_t gc, const Color* color)
{ {
uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
uint32_t values[2] = {XcbLayerInterface::getColor(color), 0}; uint32_t values[2] = {color.getAsUInt32(), 0};
xcb_change_gc(connection, gc, mask, values); xcb_change_gc(connection, gc, mask, values);
} }

View file

@ -8,11 +8,7 @@ class VisualLayer;
class XcbLayerInterface class XcbLayerInterface
{ {
public: public:
static uint32_t getColor(const Color* color); static void modifyGcColor(xcb_connection_t* connection, xcb_gcontext_t gc, const Color& color);
static uint32_t getColor(int r, int g, int b);
static void modifyGcColor(xcb_connection_t* connection, xcb_gcontext_t gc, const Color* color);
static void addLayer(xcb_connection_t* connection, xcb_screen_t* screen, xcb_window_t window, xcb_gcontext_t gc, VisualLayer* layer); static void addLayer(xcb_connection_t* connection, xcb_screen_t* screen, xcb_window_t window, xcb_gcontext_t gc, VisualLayer* layer);
}; };

View file

@ -1,6 +1,5 @@
#include "XcbTextInterface.h" #include "XcbTextInterface.h"
#include "XcbLayerInterface.h"
#include "VisualLayer.h" #include "VisualLayer.h"
#include "Color.h" #include "Color.h"
@ -16,7 +15,7 @@ xcb_gcontext_t XcbTextInterface::GetFontGC(xcb_connection_t *connection,
/* create graphics context */ /* create graphics context */
xcb_gcontext_t gc = xcb_generate_id(connection); xcb_gcontext_t gc = xcb_generate_id(connection);
uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT; uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND | XCB_GC_FONT;
auto fillColor = XcbLayerInterface::getColor(&textElement->getFillColor()); auto fillColor = textElement->getFillColor().getAsUInt32();
uint32_t value_list[3] = {screen->black_pixel, fillColor, font }; uint32_t value_list[3] = {screen->black_pixel, fillColor, font };
xcb_create_gc(connection, gc, window, mask, value_list); xcb_create_gc(connection, gc, window, mask, value_list);