123 lines
2.8 KiB
C++
123 lines
2.8 KiB
C++
#pragma once
|
|
|
|
/************************
|
|
*** Team Kitty, 2021 ***
|
|
*** Chroma ***
|
|
***********************/
|
|
|
|
/**
|
|
* This file contains most of the symbols required to start and run the Chroma Editor.
|
|
*
|
|
* The Editor uses a six-stage drawing system:
|
|
* - Background
|
|
* - Bars
|
|
* - Text Area
|
|
* - Text
|
|
* - Effects
|
|
*
|
|
* The dimensions are derived dynamically from the Print Info settings.
|
|
*
|
|
* The layout is as such:
|
|
* - 3% horizontal header, #BBBBBB.
|
|
* - Primary text, #000084.
|
|
* - Secondary text, #000000.
|
|
* - 97% background, #000084.
|
|
* - 15% optional banner, #00AAAA.
|
|
* - 80% text area, #BBBBBB.
|
|
* - Menus #FFFFFF.
|
|
* - Buttons #BBBBBB.
|
|
* - Drop shadow #000000.
|
|
*/
|
|
|
|
// Function pointer for menu-clicked callback.
|
|
typedef void (*MenuCallback)(void);
|
|
|
|
class Editor
|
|
{
|
|
public:
|
|
// Stores information about a single line.
|
|
struct EditorLine
|
|
{
|
|
size_t Line;
|
|
size_t Length;
|
|
char *Text;
|
|
};
|
|
|
|
// A single item in the menu.
|
|
struct MenuItem
|
|
{
|
|
size_t ParentID; // 0 for the root menu.
|
|
size_t ID;
|
|
MenuCallback Callback;
|
|
};
|
|
|
|
// The full menu that should be rendered. Can be nested.
|
|
typedef struct
|
|
{
|
|
size_t MenuSize;
|
|
struct MenuItem *Menu;
|
|
size_t ActiveMenuItem;
|
|
} EditorMenu;
|
|
|
|
struct EditorMessage
|
|
{
|
|
size_t TextLength;
|
|
char *Text;
|
|
|
|
size_t MessageWidth;
|
|
size_t MessageHeight;
|
|
};
|
|
|
|
// Provides all the context for rendering the editor.
|
|
struct EditorLayout
|
|
{
|
|
size_t ScreenWidth;
|
|
size_t ScreenHeight;
|
|
|
|
size_t HeaderHeight;
|
|
|
|
EditorMenu Menu;
|
|
|
|
size_t TextBoxX;
|
|
size_t TextBoxY;
|
|
size_t TextBoxWidth;
|
|
size_t TextBoxHeight;
|
|
|
|
bool HasMessage;
|
|
struct EditorMessage *CurrentMessage;
|
|
};
|
|
|
|
// Given the kernel's keyboard handler ID, so that it may restore it at a later point.
|
|
void StartEditor(int KernelCallbackID);
|
|
|
|
private:
|
|
// =========================== Drawing routines =========================== //
|
|
|
|
struct EditorLayout Layout;
|
|
|
|
size_t Length = 0; // How many lines?
|
|
size_t Size = 0; // How many characters?
|
|
size_t CurrentLine = 0;
|
|
size_t CurrentColumn = 0;
|
|
struct EditorLine *Lines;
|
|
// Draw everything.
|
|
void DrawEditor();
|
|
|
|
void DrawHeader();
|
|
void DrawBackground();
|
|
void DrawTextArea();
|
|
void DrawTextLine();
|
|
void DrawText();
|
|
void DrawMenus();
|
|
void DrawBoxes();
|
|
void DrawBoxShadows();
|
|
|
|
// =========================== State management ===========================
|
|
|
|
// Text editing.
|
|
void GetLine(size_t line);
|
|
void SetLine(struct EditorLine *line);
|
|
void AppendLine(struct EditorLine *line);
|
|
void AppendToLine(struct EditorLine *line, size_t textLength, char *text);
|
|
void RemoveLine(size_t line);
|
|
}; |