click handle

This commit is contained in:
Thomas Peterson 2025-10-23 09:09:07 +02:00
parent 5700809299
commit f3dd92d85b
3 changed files with 50 additions and 11 deletions

View File

@ -3,8 +3,8 @@
require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../vendor/autoload.php';
use PHPNative\Framework\Application; use PHPNative\Framework\Application;
use PHPNative\Ui\Widget\Container;
use PHPNative\Ui\Widget\Button; use PHPNative\Ui\Widget\Button;
use PHPNative\Ui\Widget\Container;
use PHPNative\Ui\Widget\Label; use PHPNative\Ui\Widget\Label;
// Check PHP version // Check PHP version
@ -20,42 +20,54 @@ $mainContainer = new Container(style: 'p-10 bg-gray-100');
// Title // Title
$title = new Label( $title = new Label(
text: 'Button Sizing Example', text: 'Button Sizing Example',
style: 'text-xl text-black' style: 'text-xl text-black',
); );
$mainContainer->addComponent($title); $mainContainer->addComponent($title);
// Button with m-10 p-10, should be: 12 (text) + 10 (padding-top) + 10 (padding-bottom) = 32px height // Button with m-10 p-10, should be: 12 (text) + 10 (padding-top) + 10 (padding-bottom) = 32px height
$button1 = new Button( $button1 = new Button(
text: 'Click Me', text: 'Click Me',
style: 'm-10 p-10 bg-blue-500 rounded-lg' style: 'm-10 p-10 bg-blue-500 rounded-lg',
); );
$mainContainer->addComponent($button1); $mainContainer->addComponent($button1);
// Button with different padding // Button with different padding
$button2 = new Button( $button2 = new Button(
text: 'Another Button', text: 'Another Button',
style: 'm-5 p-15 bg-green-500 rounded-lg' style: 'm-5 p-15 bg-green-500 rounded-lg',
onClick: function () {
echo 'test2';
},
); );
$mainContainer->addComponent($button2); $mainContainer->addComponent($button2);
// Button with no padding // Button with no padding
$button3 = new Button( $button3 = new Button(
text: 'No Padding', text: 'No Padding',
style: 'm-10 bg-red-500 rounded-lg' style: 'm-10 bg-red-500 rounded-lg',
); );
$mainContainer->addComponent($button3); $mainContainer->addComponent($button3);
// Container with multiple labels (should stack) // Container with multiple labels (should stack)
$labelContainer = new Container(style: 'm-10 p-10 bg-white rounded-lg'); $labelContainer = new Container(style: 'm-10 p-10 bg-white rounded-lg');
$labelContainer->addComponent(new Label(text: 'Label 1', style: 'text-black')); $labelContainer->addComponent(new Label(
$labelContainer->addComponent(new Label(text: 'Label 2', style: 'text-black')); text: 'Label 1',
$labelContainer->addComponent(new Label(text: 'Label 3', style: 'text-black')); style: 'text-black',
));
$labelContainer->addComponent(new Label(
text: 'Label 2',
style: 'text-black',
));
$labelContainer->addComponent(new Label(
text: 'Label 3',
style: 'text-black',
));
$mainContainer->addComponent($labelContainer); $mainContainer->addComponent($labelContainer);
// Info text // Info text
$info = new Label( $info = new Label(
text: 'Containers should auto-size to their content', text: 'Containers should auto-size to their content',
style: 'text-black m-10' style: 'text-black m-10',
); );
$mainContainer->addComponent($info); $mainContainer->addComponent($info);

View File

@ -133,7 +133,6 @@ class Application
case RGFW_mouseButtonPressed: case RGFW_mouseButtonPressed:
$button = $event['button'] ?? 0; $button = $event['button'] ?? 0;
// Propagate click to root component // Propagate click to root component
if ($this->rootComponent) { if ($this->rootComponent) {
$this->rootComponent->handleMouseClick($this->mouseX, $this->mouseY, $button); $this->rootComponent->handleMouseClick($this->mouseX, $this->mouseY, $button);

View File

@ -7,20 +7,23 @@ use PHPNative\Framework\TextRenderer;
class Button extends Container class Button extends Container
{ {
private Label $label; private Label $label;
private $onClick = null;
public function __construct( public function __construct(
public string $text = '', public string $text = '',
public string $style = '', public string $style = '',
null|callable $onClick = null,
) { ) {
parent::__construct($style); parent::__construct($style);
// Create label inside button // Create label inside button
$this->label = new Label( $this->label = new Label(
text: $text, text: $text,
style: '' style: '',
); );
$this->addComponent($this->label); $this->addComponent($this->label);
$this->onClick = $onClick;
} }
public function setText(string $text): void public function setText(string $text): void
@ -33,4 +36,29 @@ class Button extends Container
{ {
return $this->text; return $this->text;
} }
public function setOnClick(callable $onClick): void
{
$this->onClick = $onClick;
}
public function handleMouseClick(float $mouseX, float $mouseY, int $button): bool
{
// Check if click is within button bounds
if (
$mouseX >= $this->viewport->x &&
$mouseX <= ($this->viewport->x + $this->viewport->width) &&
$mouseY >= $this->viewport->y &&
$mouseY <= ($this->viewport->y + $this->viewport->height)
) {
// Call onClick callback if set
if ($this->onClick !== null) {
($this->onClick)();
}
return true;
}
// Propagate to parent if click was outside button
return parent::handleMouseClick($mouseX, $mouseY, $button);
}
} }