php-school / cli-menu

🖥 Build beautiful PHP CLI menus. Simple yet Powerful. Expressive DSL.
http://www.phpschool.io
MIT License
1.94k stars 106 forks source link

Don't work setWidth() for MenuStyle #263

Closed zhdanov closed 11 months ago

zhdanov commented 1 year ago

Hello,

$style = (new MenuStyle())->setWidth(200)->setBg('black')->setFg('white');

Colors works. Width not works.

mikeymike commented 1 year ago

Hey @zhdanov, thanks for the report.

Could you supply an example that shows how you're using this?

We have some code examples in the src, examples/basic-centered.php is one which alters the width which I've played with to also alter colour etc like above but I couldn't recreate a scenario which didn't alter the width.

Thanks!

zhdanov commented 1 year ago

Hey @mikeymike , sure:

<?php
require __DIR__.'/vendor/autoload.php';

use PhpSchool\CliMenu\Builder\CliMenuBuilder;
use PhpSchool\CliMenu\CliMenu;
use PhpSchool\CliMenu\MenuStyle;

$builder = new CliMenuBuilder;

$itemCallable = function ($menu) {
    $style = (new MenuStyle())->setWidth(200)->setBg('black')->setFg('white');

    $result = $menu->askText($style)
        ->setPromptText('Title')
        ->setPlaceholderText('Placeholder')
        ->ask();
};  

$builder->addSubMenu('Item 1', function (CliMenuBuilder $b) use ($itemCallable) {
    $b->setTitle('Menu > Item 1');

    $b->addItem('Sub item', function (CliMenu $menu) use ($itemCallable) {
        $itemCallable($menu);
    }); 
});

$menu = $builder->build();

$menu->open();
mikeymike commented 1 year ago

Hey @zhdanov I've had a quick look over this and you're totally right the dialogues don't currently utilise the width set by the style. Instead, these are calculated dynamically based on the parents width, the dialogues content and the dialogue padding styles.

Using setPaddingLeftRight instead of setWidth may be a suitable solution to your problem. I'm going to keep this issue open though as we may want to use width if it's been specifically set and then fallback to dynamic if it's not set.

Thanks again for the report!

zhdanov commented 1 year ago

Hey @mikeymike thanks! setPaddingLeftRight() works fine!