Line number detail if > 999, click to set cursor pos, page scrolling (using shift for now, will change)
This commit is contained in:
parent
2b23a6a7f1
commit
cf74541678
Binary file not shown.
@ -151,7 +151,3 @@ class Particles(Scene):
|
|||||||
# triangle(mouseX, mouseY, x2, y2, x3, y3, 9)
|
# triangle(mouseX, mouseY, x2, y2, x3, y3, 9)
|
||||||
|
|
||||||
# lineTri(mouseX, mouseY, x2, y2, x3, y3, 8)
|
# lineTri(mouseX, mouseY, x2, y2, x3, y3, 8)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
resources/LineNumberDetailCenter.png
Normal file
BIN
resources/LineNumberDetailCenter.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 91 B |
BIN
resources/LineNumberDetailLeft.png
Normal file
BIN
resources/LineNumberDetailLeft.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 117 B |
BIN
resources/LineNumberDetailRight.png
Normal file
BIN
resources/LineNumberDetailRight.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 114 B |
@ -58,6 +58,12 @@ void Pycron::StartGameLoop() {
|
|||||||
m_stateManager->OnKeyPressed(key);
|
m_stateManager->OnKeyPressed(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int button = MouseButton::MOUSE_BUTTON_LEFT; button < MouseButton::MOUSE_BUTTON_BACK; ++button) {
|
||||||
|
if(IsMouseButtonPressed(button)){
|
||||||
|
m_stateManager->OnMousePressed(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,5 +13,6 @@ public:
|
|||||||
virtual void OnExit() = 0;
|
virtual void OnExit() = 0;
|
||||||
virtual void OnKeyPressed(int key) = 0;
|
virtual void OnKeyPressed(int key) = 0;
|
||||||
virtual void OnCharPressed(char character) = 0;
|
virtual void OnCharPressed(char character) = 0;
|
||||||
|
virtual void OnMousePressed(int button) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -15,7 +15,6 @@ StateManager::~StateManager() {
|
|||||||
m_currentState = nullptr;
|
m_currentState = nullptr;
|
||||||
delete m_gameState;
|
delete m_gameState;
|
||||||
delete m_editorState;
|
delete m_editorState;
|
||||||
delete m_graphics;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -75,3 +74,7 @@ void StateManager::OnCharPressed(char c) {
|
|||||||
m_currentState->OnCharPressed(c);
|
m_currentState->OnCharPressed(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StateManager::OnMousePressed(int button) {
|
||||||
|
m_currentState->OnMousePressed(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,7 @@ public:
|
|||||||
|
|
||||||
void OnKeyPressed(int key);
|
void OnKeyPressed(int key);
|
||||||
void OnCharPressed(char c);
|
void OnCharPressed(char c);
|
||||||
|
void OnMousePressed(int button);
|
||||||
|
|
||||||
void RequestLoadGame();
|
void RequestLoadGame();
|
||||||
void RequestRunGame();
|
void RequestRunGame();
|
||||||
|
|||||||
@ -7,15 +7,19 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <raylib.h>
|
#include <raylib.h>
|
||||||
#include "EditorState.h"
|
#include "EditorState.h"
|
||||||
|
#include "../../Utilities.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EditorState::EditorState(pkpy::VM *vm, Graphics *graphics) : m_vm(vm), m_graphics(graphics){
|
EditorState::EditorState(pkpy::VM *vm, Graphics *graphics) : m_vm(vm), m_graphics(graphics){
|
||||||
m_pythonTokenizer = new PythonTokenizer();
|
m_pythonTokenizer = new PythonTokenizer();
|
||||||
|
|
||||||
std::string randomSource = Pycron::loadFileToString("../python/main.py");
|
std::string randomSource = Pycron::loadFileToString("../python/particles.py");
|
||||||
|
|
||||||
m_editorFrame = m_graphics->loadImage("../resources/EditorFrame.png");
|
m_editorFrame = m_graphics->loadImage("../resources/EditorFrame.png");
|
||||||
|
m_LineNumberDetailLeft = m_graphics->loadImage("../resources/LineNumberDetailLeft.png");
|
||||||
|
m_LineNumberDetailCenter = m_graphics->loadImage("../resources/LineNumberDetailCenter.png");
|
||||||
|
m_LineNumberDetailRight = m_graphics->loadImage("../resources/LineNumberDetailRight.png");
|
||||||
|
|
||||||
m_baseBackgroundColor = 56;
|
m_baseBackgroundColor = 56;
|
||||||
m_shadowColor = 28;
|
m_shadowColor = 28;
|
||||||
@ -89,6 +93,9 @@ void EditorState::Draw() {
|
|||||||
if(m_dirty){
|
if(m_dirty){
|
||||||
Clear();
|
Clear();
|
||||||
m_dirty = false;
|
m_dirty = false;
|
||||||
|
|
||||||
|
int cursorPos = m_scrollY + m_cursorY;
|
||||||
|
|
||||||
for (int i = 0; i < m_height; ++i) {
|
for (int i = 0; i < m_height; ++i) {
|
||||||
|
|
||||||
int index = i + m_scrollY;
|
int index = i + m_scrollY;
|
||||||
@ -99,6 +106,23 @@ void EditorState::Draw() {
|
|||||||
auto tokens = m_pythonTokenizer->tokenizeLine(m_text[index]);
|
auto tokens = m_pythonTokenizer->tokenizeLine(m_text[index]);
|
||||||
|
|
||||||
int currentPos = 0;
|
int currentPos = 0;
|
||||||
|
if(index == cursorPos){
|
||||||
|
std::string lineNumber = std::to_string(cursorPos);
|
||||||
|
int offset = std::max((int)lineNumber.size() - 3, 0);
|
||||||
|
bool collision = false;
|
||||||
|
for (int j = 0; j < offset; ++j) {
|
||||||
|
if(m_text[index].size() < offset) break;
|
||||||
|
if(m_text[index][j] != ' '){
|
||||||
|
collision = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!collision) offset = 0;
|
||||||
|
currentPos = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (int j = 0; j < tokens.size(); ++j) {
|
for (int j = 0; j < tokens.size(); ++j) {
|
||||||
int color = m_baseTextColor;
|
int color = m_baseTextColor;
|
||||||
TokenType type = tokens[j].type;
|
TokenType type = tokens[j].type;
|
||||||
@ -141,9 +165,25 @@ void EditorState::Draw() {
|
|||||||
|
|
||||||
// Draw the cursor
|
// Draw the cursor
|
||||||
if(m_cursorVisible) {
|
if(m_cursorVisible) {
|
||||||
int x = m_cursorX * m_charWidth + m_textBounds->x;
|
int currentLine = m_scrollY + m_cursorY;
|
||||||
|
std::string lineNumber = std::to_string(currentLine);
|
||||||
|
int offset = std::max((int)lineNumber.size() - 3, 0);
|
||||||
|
|
||||||
|
bool collision = false;
|
||||||
|
for (int i = 0; i < offset; ++i) {
|
||||||
|
if(m_text[currentLine].size() < offset) break;
|
||||||
|
if(m_text[currentLine][i] != ' '){
|
||||||
|
collision = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!collision) offset = 0;
|
||||||
|
|
||||||
|
int x = (m_cursorX + offset) * m_charWidth + m_textBounds->x;
|
||||||
int y = m_cursorY * m_charHeight + m_textBounds->y;
|
int y = m_cursorY * m_charHeight + m_textBounds->y;
|
||||||
int index = m_cursorY * m_width + m_cursorX;
|
|
||||||
|
int index = m_cursorY * m_width + (m_cursorX + offset);
|
||||||
|
|
||||||
if(m_drawShadows) m_graphics->Rect(x, y, m_charWidth + 1, m_charHeight + 1, m_shadowColor);
|
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->Rect(x - 1, y - 1, m_charWidth + 1, m_charHeight + 1, m_foregroundIndexBuffer[index]);
|
||||||
@ -157,18 +197,50 @@ void EditorState::Draw() {
|
|||||||
m_cursorVisible = !m_cursorVisible;
|
m_cursorVisible = !m_cursorVisible;
|
||||||
m_cursorBlinkTimer = 0.0;
|
m_cursorBlinkTimer = 0.0;
|
||||||
}
|
}
|
||||||
|
// Editor frame image
|
||||||
|
m_graphics->Img(m_editorFrame, 0, 0);
|
||||||
|
|
||||||
// Line Numbers
|
// Line Numbers
|
||||||
for (int i = 0; i < m_height; ++i) {
|
for (int i = 0; i < m_height; ++i) {
|
||||||
std::string lineNumber = std::to_string(i + m_scrollY);
|
int lineNum = i + m_scrollY + 1;
|
||||||
int delta = 3 - (int)lineNumber.size();
|
std::string lineNumber = std::to_string(lineNum);
|
||||||
|
int delta = std::max(0, 3 - (int)lineNumber.size());
|
||||||
lineNumber = std::string(delta, ' ') + lineNumber;
|
lineNumber = std::string(delta, ' ') + lineNumber;
|
||||||
|
lineNumber = lineNumber.substr(lineNumber.size() - 3);
|
||||||
|
|
||||||
int highlight = i == m_cursorY ? m_lineNumberTextColor : m_commentTextColor;
|
int highlight = i == m_cursorY ? m_lineNumberTextColor : m_commentTextColor;
|
||||||
|
|
||||||
|
if(lineNum > 999){
|
||||||
|
lineNumber[0] = ' ';
|
||||||
|
int dotX = m_lineNumberWindowXOffset;
|
||||||
|
int dotY = m_lineNumberWindowYOffset + (i * m_charHeight) + m_graphics->GetCurrentFontHeight() - 1;
|
||||||
|
m_graphics->Pixel(dotX, dotY, highlight);
|
||||||
|
m_graphics->Pixel(dotX + 2, dotY, highlight);
|
||||||
|
m_graphics->Pixel(dotX + 4, dotY, highlight);
|
||||||
|
}
|
||||||
|
|
||||||
m_graphics->Text(lineNumber, m_lineNumberWindowXOffset, m_lineNumberWindowYOffset + (i * m_charHeight), highlight);
|
m_graphics->Text(lineNumber, m_lineNumberWindowXOffset, m_lineNumberWindowYOffset + (i * m_charHeight), highlight);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Editor frame image
|
// Line Number Detail
|
||||||
m_graphics->Img(m_editorFrame, 0, 0);
|
if(m_scrollY + 1 + m_cursorY > 999){
|
||||||
|
int lineNum = m_scrollY + 1 + m_cursorY;
|
||||||
|
std::string lineNumber = std::to_string(lineNum);
|
||||||
|
|
||||||
|
int lineNumberDetailXOffset = 3;
|
||||||
|
int lineNumberDetailYOffset = 3;
|
||||||
|
|
||||||
|
int yOffset = m_lineNumberWindowYOffset - lineNumberDetailYOffset + (m_cursorY * (m_graphics->GetCurrentFontHeight() + 1));
|
||||||
|
|
||||||
|
m_graphics->Img(m_LineNumberDetailLeft, m_lineNumberWindowXOffset - lineNumberDetailXOffset, yOffset);
|
||||||
|
for (int i = 0; i < lineNumber.size(); ++i) {
|
||||||
|
int offset = m_lineNumberWindowXOffset + (i * 6);
|
||||||
|
m_graphics->Img(m_LineNumberDetailCenter, offset, yOffset);
|
||||||
|
}
|
||||||
|
m_graphics->Img(m_LineNumberDetailRight, m_lineNumberWindowXOffset + (lineNumber.size() * 6), yOffset);
|
||||||
|
m_graphics->Text(lineNumber, m_lineNumberWindowXOffset, yOffset + lineNumberDetailYOffset, m_lineNumberTextColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//m_graphics->RectBorder(m_textBounds->x, m_textBounds->y, m_textBounds->width, m_textBounds->height, 23);
|
//m_graphics->RectBorder(m_textBounds->x, m_textBounds->y, m_textBounds->width, m_textBounds->height, 23);
|
||||||
|
|
||||||
@ -190,30 +262,48 @@ void EditorState::OnKeyPressed(int key) {
|
|||||||
m_cursorX++;
|
m_cursorX++;
|
||||||
}
|
}
|
||||||
if(key == KEY_UP){
|
if(key == KEY_UP){
|
||||||
if( m_cursorY > 0)
|
if(IsKeyDown(KEY_LEFT_SHIFT)){
|
||||||
{
|
m_scrollY -= m_height;
|
||||||
m_cursorY--;
|
bool success = m_scrollY > 0;
|
||||||
}
|
if(!success && m_cursorY > 0) m_cursorY--;
|
||||||
else
|
}else{
|
||||||
{
|
if( m_cursorY > 0)
|
||||||
if(m_scrollY > 0)
|
{
|
||||||
|
m_cursorY--;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
m_scrollY--;
|
m_scrollY--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(m_scrollY < 0){
|
||||||
|
m_scrollY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(key == KEY_DOWN )
|
if(key == KEY_DOWN )
|
||||||
{
|
{
|
||||||
if(m_cursorY < std::min(m_height - 1, static_cast<int>(m_text.size()) - 1))
|
if(IsKeyDown(KEY_LEFT_SHIFT)){
|
||||||
{
|
m_scrollY += m_height;
|
||||||
m_cursorY++;
|
bool success = m_scrollY + m_height <= m_text.size() - 1;
|
||||||
}
|
if(!success && m_cursorY < std::min(m_height - 1, static_cast<int>(m_text.size()) - 1)) m_cursorY++;
|
||||||
else
|
}else{
|
||||||
{
|
if(m_cursorY < std::min(m_height - 1, static_cast<int>(m_text.size()) - 1))
|
||||||
if(m_scrollY + m_height < m_text.size())
|
{
|
||||||
|
m_cursorY++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
m_scrollY++;
|
m_scrollY++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(m_scrollY + m_height > m_text.size() - 1){
|
||||||
|
m_scrollY = m_text.size() - 1 - m_height;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -229,6 +319,27 @@ void EditorState::OnCharPressed(char character){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EditorState::OnMousePressed(int button) {
|
||||||
|
int x = m_graphics->mouseX();
|
||||||
|
int y = m_graphics->mouseY();
|
||||||
|
|
||||||
|
if(Utilities::RectContainsPoint(m_textBounds, x, y)){
|
||||||
|
x -= m_textWindowXOffset;
|
||||||
|
y -= m_textWindowYOffset;
|
||||||
|
|
||||||
|
x /= m_charWidth;
|
||||||
|
y /= m_charHeight;
|
||||||
|
|
||||||
|
m_cursorX = x;
|
||||||
|
m_cursorY = y;
|
||||||
|
|
||||||
|
m_cursorVisible = true;
|
||||||
|
m_cursorBlinkTimer = 0;
|
||||||
|
m_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void EditorState::Clear() {
|
void EditorState::Clear() {
|
||||||
for (int i = 0; i < m_width * m_height; ++i) {
|
for (int i = 0; i < m_width * m_height; ++i) {
|
||||||
m_characterBuffer[i] = ' ';
|
m_characterBuffer[i] = ' ';
|
||||||
@ -237,6 +348,7 @@ void EditorState::Clear() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EditorState::Text(const std::string &text, int x, int y, int fg, int bg) {
|
void EditorState::Text(const std::string &text, int x, int y, int fg, int bg) {
|
||||||
for (int i = 0; i < text.size(); ++i) {
|
for (int i = 0; i < text.size(); ++i) {
|
||||||
int charX = x + i;
|
int charX = x + i;
|
||||||
@ -254,7 +366,6 @@ void EditorState::Text(const std::string &text, int x, int y, int fg, int bg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EditorState::LoadStringToBuffer(const std::string &text) {
|
void EditorState::LoadStringToBuffer(const std::string &text) {
|
||||||
m_text.clear();
|
m_text.clear();
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,7 @@ public:
|
|||||||
void OnExit() override;
|
void OnExit() override;
|
||||||
void OnKeyPressed(int key) override;
|
void OnKeyPressed(int key) override;
|
||||||
void OnCharPressed(char character) override;
|
void OnCharPressed(char character) override;
|
||||||
|
void OnMousePressed(int button) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
pkpy::VM* m_vm;
|
pkpy::VM* m_vm;
|
||||||
@ -29,6 +30,10 @@ private:
|
|||||||
// Editor images
|
// Editor images
|
||||||
PycronImage* m_editorFrame;
|
PycronImage* m_editorFrame;
|
||||||
|
|
||||||
|
PycronImage* m_LineNumberDetailLeft;
|
||||||
|
PycronImage* m_LineNumberDetailCenter;
|
||||||
|
PycronImage* m_LineNumberDetailRight;
|
||||||
|
|
||||||
// Size of the character in pixels
|
// Size of the character in pixels
|
||||||
uint8_t m_charWidth, m_charHeight;
|
uint8_t m_charWidth, m_charHeight;
|
||||||
|
|
||||||
|
|||||||
@ -102,3 +102,7 @@ void GameState::OnCharPressed(char character) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameState::OnMousePressed(int button) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -16,6 +16,7 @@ public:
|
|||||||
void OnExit() override;
|
void OnExit() override;
|
||||||
void OnKeyPressed(int key) override;
|
void OnKeyPressed(int key) override;
|
||||||
void OnCharPressed(char character) override;
|
void OnCharPressed(char character) override;
|
||||||
|
void OnMousePressed(int button) override;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "Utilities.h"
|
#include "Utilities.h"
|
||||||
|
|
||||||
namespace Utilities {
|
namespace Utilities {
|
||||||
Color ColorFromHex(int hexValue) {
|
Color ColorFromHex(int hexValue) {
|
||||||
// Extract red, green, blue, and alpha components from the hexadecimal value
|
// Extract red, green, blue, and alpha components from the hexadecimal value
|
||||||
@ -18,4 +19,8 @@ namespace Utilities {
|
|||||||
// Create and return the color
|
// Create and return the color
|
||||||
return ColorFromNormalized({ rf, gf, bf, 1.0f }); // Alpha is set to 1.0 (fully opaque)
|
return ColorFromNormalized({ rf, gf, bf, 1.0f }); // Alpha is set to 1.0 (fully opaque)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RectContainsPoint(pycron::Rectangle* r, int x, int y){
|
||||||
|
return x >= r->x && x <= r->x + r->width && y >= r->y && y <= r->y + r->height;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
#include "Utilities.h"
|
||||||
|
#include "Graphics/Rectangle.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Utilities {
|
namespace Utilities {
|
||||||
Color ColorFromHex(int hexValue);
|
Color ColorFromHex(int hexValue);
|
||||||
|
bool RectContainsPoint(pycron::Rectangle* r, int x, int y);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user