|
|
@ -0,0 +1,208 @@ |
|
|
|
/******************************************************************************************* |
|
|
|
* |
|
|
|
* raylib [core] example - clipboard text |
|
|
|
* |
|
|
|
* Example complexity rating: [★☆☆☆] 1/4 |
|
|
|
* |
|
|
|
* Example originally created with raylib 5.6-dev |
|
|
|
* |
|
|
|
* Example contributed by Robin (@RobinsAviary) and reviewed by Ramon Santamaria (@raysan5) |
|
|
|
* |
|
|
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, |
|
|
|
* BSD-like license that allows static linking with closed source software |
|
|
|
* |
|
|
|
* Copyright (c) 2025-2025 Robin (@RobinsAviary) |
|
|
|
* |
|
|
|
********************************************************************************************/ |
|
|
|
|
|
|
|
#include "raylib.h" |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------ |
|
|
|
// Program main entry point |
|
|
|
//------------------------------------------------------------------------------------ |
|
|
|
int main(void) |
|
|
|
{ |
|
|
|
// Initialization |
|
|
|
//-------------------------------------------------------------------------------------- |
|
|
|
const int screenWidth = 800; |
|
|
|
const int screenHeight = 450; |
|
|
|
|
|
|
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - clipboard text"); |
|
|
|
|
|
|
|
const char* clipboardText = NULL; |
|
|
|
|
|
|
|
// List of text the user can switch through and copy |
|
|
|
const char* copyableText[] = {"raylib is fun", "hello, clipboard!", "potato chips"}; |
|
|
|
|
|
|
|
unsigned int textIndex = 0; |
|
|
|
|
|
|
|
const char* popupText = NULL; |
|
|
|
|
|
|
|
// Initialize timers |
|
|
|
// The amount of time the pop-up text is on screen, before fading |
|
|
|
const float maxTime = 3.0f; |
|
|
|
float textTimer = 0.0f; |
|
|
|
// The length of time text is offset |
|
|
|
const float animMaxTime = 0.1f; |
|
|
|
float pasteAnim = 0.0f; |
|
|
|
float copyAnim = 0.0f; |
|
|
|
int copyAnimMult = 1; |
|
|
|
float textAnim = 0.0f; |
|
|
|
float textAlpha = 0.0f; |
|
|
|
// Offset amount for animations |
|
|
|
const int offsetAmount = -4; |
|
|
|
//-------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Main game loop |
|
|
|
while (!WindowShouldClose()) // Detect window close button or ESC key |
|
|
|
{ |
|
|
|
// Update |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Check if the user has pressed the copy/paste key combinations |
|
|
|
bool pastePressed = (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V)); |
|
|
|
bool copyPressed = (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)); |
|
|
|
|
|
|
|
// Update animation timers |
|
|
|
if (textTimer > 0) textTimer -= GetFrameTime(); |
|
|
|
if (pasteAnim > 0) pasteAnim -= GetFrameTime(); |
|
|
|
if (copyAnim > 0) copyAnim -= GetFrameTime(); |
|
|
|
if (textAnim > 0) textAnim -= GetFrameTime(); |
|
|
|
|
|
|
|
// React to the user pressing paste |
|
|
|
if (pastePressed) |
|
|
|
{ |
|
|
|
// Most operating systems hide this information until the user presses Ctrl-V on the window. |
|
|
|
|
|
|
|
// Check to see if the clipboard contains an image |
|
|
|
// This function does nothing outside of Windows, as it directly calls the Windows API |
|
|
|
Image image = GetClipboardImage(); |
|
|
|
|
|
|
|
if (IsImageValid(image)) |
|
|
|
{ |
|
|
|
// Unload the image |
|
|
|
UnloadImage(image); |
|
|
|
// Update visuals |
|
|
|
popupText = "clipboard contains image"; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Get text from the user's clipboard |
|
|
|
clipboardText = GetClipboardText(); |
|
|
|
|
|
|
|
// Update visuals |
|
|
|
popupText = "text pasted"; |
|
|
|
pasteAnim = animMaxTime; |
|
|
|
} |
|
|
|
|
|
|
|
// Reset animation values |
|
|
|
textTimer = maxTime; |
|
|
|
textAnim = animMaxTime; |
|
|
|
textAlpha = 1; |
|
|
|
} |
|
|
|
|
|
|
|
// React to the user pressing copy |
|
|
|
if (copyPressed) |
|
|
|
{ |
|
|
|
// Set the text on the user's clipboard |
|
|
|
SetClipboardText(copyableText[textIndex]); |
|
|
|
|
|
|
|
// Reset values |
|
|
|
textTimer = maxTime; |
|
|
|
textAnim = animMaxTime; |
|
|
|
copyAnim = animMaxTime; |
|
|
|
copyAnimMult = 1; |
|
|
|
textAlpha = 1; |
|
|
|
// Update the text that pops up at the bottom of the screen |
|
|
|
popupText = "text copied"; |
|
|
|
} |
|
|
|
|
|
|
|
// Switch to the next item in the list when the user presses up |
|
|
|
if (IsKeyPressed(KEY_UP)) |
|
|
|
{ |
|
|
|
// Reset animation |
|
|
|
copyAnim = animMaxTime; |
|
|
|
copyAnimMult = 1; |
|
|
|
|
|
|
|
textIndex += 1; |
|
|
|
|
|
|
|
if (textIndex >= sizeof(copyableText) / sizeof(const char*)) // Length of array |
|
|
|
{ |
|
|
|
// Loop back to the other end |
|
|
|
textIndex = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Switch to the previous item in the list when the user presses down |
|
|
|
if (IsKeyPressed(KEY_DOWN)) |
|
|
|
{ |
|
|
|
// Reset animation |
|
|
|
copyAnim = animMaxTime; |
|
|
|
copyAnimMult = -1; |
|
|
|
|
|
|
|
if (textIndex == 0) |
|
|
|
{ |
|
|
|
// Loop back to the other end |
|
|
|
textIndex = (sizeof(copyableText) / sizeof(const char*)) - 1; // Length of array minus one |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
textIndex -= 1; |
|
|
|
} |
|
|
|
} |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Draw |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
BeginDrawing(); |
|
|
|
|
|
|
|
ClearBackground(RAYWHITE); |
|
|
|
|
|
|
|
// Draw the user's pasted text, if there is any yet |
|
|
|
if (clipboardText) |
|
|
|
{ |
|
|
|
// Offset animation |
|
|
|
int offset = 0; |
|
|
|
if (pasteAnim > 0) offset = offsetAmount; |
|
|
|
|
|
|
|
// Draw the pasted text |
|
|
|
DrawText("pasted clipboard:", 10, 10 + offset, 20, DARKGREEN); |
|
|
|
DrawText(clipboardText, 10, 30 + offset, 20, DARKGRAY); |
|
|
|
} |
|
|
|
|
|
|
|
// Offset animation |
|
|
|
int textOffset = 0; |
|
|
|
if (copyAnim > 0) textOffset = offsetAmount; |
|
|
|
|
|
|
|
// Draw copyable text and controls |
|
|
|
DrawText(copyableText[textIndex], 10, 330 + (textOffset * copyAnimMult), 20, MAROON); |
|
|
|
DrawText("up/down to change string, ctrl-c to copy, ctrl-v to paste", 10, 355, 20, DARKGRAY); |
|
|
|
|
|
|
|
// Alpha / Offset animation |
|
|
|
if (textAlpha > 0) |
|
|
|
{ |
|
|
|
// Offset animation |
|
|
|
int offset = 0; |
|
|
|
if (textAnim > 0) offset = offsetAmount; |
|
|
|
// Draw pop up text |
|
|
|
DrawText(popupText, 10, 425 + offset, 20, ColorAlpha(DARKGREEN, textAlpha)); |
|
|
|
|
|
|
|
// Fade-out animation |
|
|
|
if (textTimer < 0) |
|
|
|
{ |
|
|
|
textAlpha -= GetFrameTime(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
EndDrawing(); |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
} |
|
|
|
|
|
|
|
// De-Initialization |
|
|
|
//-------------------------------------------------------------------------------------- |
|
|
|
CloseWindow(); // Close window and OpenGL context |
|
|
|
//-------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |