From efc9b0fe5eed788daaa3401ea79271687bee6e49 Mon Sep 17 00:00:00 2001 From: Bobby Lucero Date: Thu, 3 Oct 2024 23:25:22 -0400 Subject: [PATCH] Refactored text window bounds, added initial GUI art --- CMakeLists.txt | 4 +- resources/EditorFrame.png | Bin 0 -> 1203 bytes resources/GUITest.png | Bin 0 -> 3788 bytes resources/pico8.png | Bin 0 -> 5909 bytes src/Graphics/Rectangle.cpp | 9 +++++ src/Graphics/Rectangle.h | 13 ++++++ src/States/Editor/EditorState.cpp | 65 ++++++++++++++++++------------ src/States/Editor/EditorState.h | 16 +++++++- 8 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 resources/EditorFrame.png create mode 100644 resources/GUITest.png create mode 100644 resources/pico8.png create mode 100644 src/Graphics/Rectangle.cpp create mode 100644 src/Graphics/Rectangle.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 51038ba..cb86ac9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,9 @@ add_executable(Pycron src/main.cpp src/Graphics/PycronImage.h src/Graphics/PycronImage.cpp src/States/Editor/PythonTokenizer.cpp - src/States/Editor/PythonTokenizer.h) + src/States/Editor/PythonTokenizer.h + src/Graphics/Rectangle.cpp + src/Graphics/Rectangle.h) add_subdirectory(dependencies/pocketpy) # Declaring our executable diff --git a/resources/EditorFrame.png b/resources/EditorFrame.png new file mode 100644 index 0000000000000000000000000000000000000000..5e65cec1fe480ca8006a11ffc061840facca6be4 GIT binary patch literal 1203 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 literal 0 HcmV?d00001 diff --git a/src/Graphics/Rectangle.cpp b/src/Graphics/Rectangle.cpp new file mode 100644 index 0000000..5cf44ae --- /dev/null +++ b/src/Graphics/Rectangle.cpp @@ -0,0 +1,9 @@ +// +// Created by Bobby Lucero on 10/3/24. +// + +#include "Rectangle.h" + +pycron::Rectangle::Rectangle(int x, int y, int width, int height) : x(x), y(y), width(width), height(height){ + +} diff --git a/src/Graphics/Rectangle.h b/src/Graphics/Rectangle.h new file mode 100644 index 0000000..13206a3 --- /dev/null +++ b/src/Graphics/Rectangle.h @@ -0,0 +1,13 @@ +// +// Created by Bobby Lucero on 10/3/24. +// + +#pragma once +namespace pycron{ + class Rectangle { + public: + int x, y; + int width, height; + Rectangle(int x, int y, int width, int height); + }; +} diff --git a/src/States/Editor/EditorState.cpp b/src/States/Editor/EditorState.cpp index 08b162c..3cedbbb 100644 --- a/src/States/Editor/EditorState.cpp +++ b/src/States/Editor/EditorState.cpp @@ -5,10 +5,9 @@ #include #include #include -#include "EditorState.h" -#include "../../Graphics/PycronImage.h" -#include "../../Pycron.h" #include +#include "EditorState.h" + EditorState::EditorState(pkpy::VM *vm, Graphics *graphics) : m_vm(vm), m_graphics(graphics){ @@ -18,6 +17,8 @@ EditorState::EditorState(pkpy::VM *vm, Graphics *graphics) : m_vm(vm), m_graphic std::string randomSource = Pycron::loadFileToString("../python/triangles.py"); + m_editorFrame = m_graphics->loadImage("../resources/EditorFrame.png"); + m_baseBackgroundColor = 56; m_shadowColor = 28; m_baseTextColor = 42; @@ -41,17 +42,31 @@ EditorState::EditorState(pkpy::VM *vm, Graphics *graphics) : m_vm(vm), m_graphic m_cursorX = 0; m_cursorY = 0; + m_charWidth = m_leftLetterSpacing + m_graphics->GetCurrentFontWidth() + m_rightLetterSpacing; // Final size of char with spacing. If the literal width of the font is n, the final width is n + spacing. + m_charHeight = m_topLetterSpacing + m_graphics->GetCurrentFontHeight() + m_bottomLetterSpacing; + + // Hardcoded text editor element positions based on interface graphics + m_textWindowXOffset = 26; + m_textWindowYOffset = 20; + + m_textWindowWidth = 330; + m_textWindowHeight = 168; + + m_textBounds = new pycron::Rectangle(m_textWindowXOffset, m_textWindowYOffset, m_textWindowWidth, m_textWindowHeight); + m_scrollX = 0; m_scrollY = 0; m_cursorBlinkTimer = 0; m_cursorBlinkInterval = 0.5; - m_charWidth = m_leftLetterSpacing + m_graphics->GetCurrentFontWidth() + m_rightLetterSpacing; // Final size of char with spacing. If the literal width of the font is n, the final width is n + spacing. - m_charHeight = m_topLetterSpacing + m_graphics->GetCurrentFontHeight() + m_bottomLetterSpacing; - m_width = (int)(m_graphics->m_screenWidth / m_charWidth); - m_height = (int)(m_graphics->m_screenHeight / m_charHeight); + + std::cout << (int)m_charWidth << "!\n"; + + m_width = (int)(m_textBounds->width / m_charWidth); + std::cout << m_textBounds->width << " : " << (int)m_charWidth << " = " << m_width; + m_height = (int)(m_textBounds->height / m_charHeight); m_characterBuffer = std::vector(m_width * m_height); m_foregroundIndexBuffer = std::vector(m_width * m_height); @@ -69,10 +84,11 @@ EditorState::EditorState(pkpy::VM *vm, Graphics *graphics) : m_vm(vm), m_graphic EditorState::~EditorState() { delete m_pythonTokenizer; + delete m_editorFrame; + delete m_textBounds; } void EditorState::Draw() { - // Set text and color buffers if needed if(m_dirty){ Clear(); @@ -87,12 +103,6 @@ void EditorState::Draw() { if(index > m_text.size() - 1) break; - std::string lineNumber = std::to_string(index); - int size = 2; - int diff = size - (int)lineNumber.size(); - if(diff > 0) lineNumber = std::string(diff, ' ') + lineNumber; - Text(lineNumber, 0, i, i == m_cursorY ? m_lineNumberTextColor : m_commentTextColor, m_lineNumberBackgroundColor); - // Text handling auto tokens = m_pythonTokenizer->tokenizeLine(m_text[index]); @@ -119,43 +129,48 @@ void EditorState::Draw() { }else if(type == TokenType::Unknown){ color = m_baseTextColor; } - Text(tokens[j].value, size + currentPos, i, color, m_baseBackgroundColor); - currentPos += tokens[j].value.size(); + Text(tokens[j].value, currentPos, i, color, m_baseBackgroundColor); + currentPos += (int)tokens[j].value.size(); } } } - m_graphics->Clear(0); + m_graphics->Clear(57); // draw text with info from color buffers for (int i = 0; i < m_characterBuffer.size(); ++i) { - int x = (i % m_width) * m_charWidth; - int y = (i / m_width) * m_charHeight; + int x = (i % m_width) * m_charWidth + m_textBounds->x; + int y = (i / m_width) * m_charHeight + m_textBounds->y; m_graphics->Rect(x, y, m_charWidth, m_charHeight, m_backgroundIndexBuffer[i]); if(m_drawShadows) m_graphics->Char(m_characterBuffer[i], x + m_leftLetterSpacing + 1, y + m_topLetterSpacing + 1, m_shadowColor); m_graphics->Char(m_characterBuffer[i], x + m_leftLetterSpacing, y + m_topLetterSpacing, m_foregroundIndexBuffer[i]); } + // Draw the cursor if(m_cursorVisible) { - int x = (m_cursorX + 2) * m_charWidth; - int y = m_cursorY * m_charHeight; - int index = m_cursorY * m_width + (m_cursorX + 2); + int x = m_cursorX * m_charWidth + m_textBounds->x; + int y = m_cursorY * m_charHeight + m_textBounds->y; + int index = m_cursorY * m_width + m_cursorX; if(m_drawShadows) m_graphics->Rect(x, y, m_charWidth + 1, m_charHeight + 1, m_shadowColor); m_graphics->Rect(x - 1, y - 1, m_charWidth + 1, m_charHeight + 1, m_foregroundIndexBuffer[index]); -// m_graphics->Line(x - 1, y, x - 1, y + m_charHeight - 1, 63); std::string s(1, m_characterBuffer[index]); m_graphics->Text(s, x, y, m_backgroundIndexBuffer[index]); } - // Cursor blink + // Cursor blink timer TODO: probably move to an update function m_cursorBlinkTimer += GetFrameTime(); if(m_cursorBlinkTimer > m_cursorBlinkInterval){ m_cursorVisible = !m_cursorVisible; m_cursorBlinkTimer = 0.0; } + // Editor frame image + m_graphics->Img(m_editorFrame, 0, 0); + + //m_graphics->RectBorder(m_textBounds->x, m_textBounds->y, m_textBounds->width, m_textBounds->height, 23); + } void EditorState::OnEnter() { @@ -170,7 +185,7 @@ void EditorState::OnKeyPressed(int key) { if(key == KEY_LEFT && m_cursorX > 0){ m_cursorX--; } - if(key == KEY_RIGHT && m_cursorX < m_width - 1 - 2){ + if(key == KEY_RIGHT && m_cursorX < m_width - 1){ m_cursorX++; } if(key == KEY_UP){ diff --git a/src/States/Editor/EditorState.h b/src/States/Editor/EditorState.h index ab0b1d3..2a1cebf 100644 --- a/src/States/Editor/EditorState.h +++ b/src/States/Editor/EditorState.h @@ -3,7 +3,9 @@ #include #include "PythonTokenizer.h" #include "../../State.h" - +#include "../../Graphics/PycronImage.h" +#include "../../Pycron.h" +#include "../../Graphics/Rectangle.h" class PycronImage; @@ -24,6 +26,9 @@ private: Graphics* m_graphics; PythonTokenizer* m_pythonTokenizer; + // Editor images + PycronImage* m_editorFrame; + // Size of the character in pixels uint8_t m_charWidth, m_charHeight; @@ -62,6 +67,15 @@ private: float_t m_cursorBlinkTimer; float_t m_cursorBlinkInterval; + + int m_textWindowXOffset; + int m_textWindowYOffset; + + int m_textWindowWidth; + int m_textWindowHeight; + + pycron::Rectangle* m_textBounds; + int m_scrollX; int m_scrollY;