Portál AbcLinuxu, 8. května 2025 15:45

Dotaz: Krokování v menu

26.11.2022 21:23 Jan
Krokování v menu
Přečteno: 1136×
Odpovědět | Admin
Ahoj, chci vytvořit menu s takovým posunem, poradil by někdo jak napsat ten cyklus? Stačí k tomu jen tyto proměnné nebo je potřeba ještě nějaké další? Děkuji za pomoc.
mám proměnné
pole=array['0položka','1položka','2položka','3položka','4položka','5položka','6položka','7položka','8položka','9položka'] 
$aktualni_ID=0
$max_polozek_na_stranku=3
$celkem_polozek=10

for(i=$aktualni_ID;i=$max_polozek_na_stranku; i++ )
  if($aktualni_ID==i) 
    echo pole[i].'<<<'
  else
    echo pole[i]




Kroky směrem dolů

0položka<<<
1položka
2položka

0položka
1položka<<<
2položka

0položka
1položka
2položka<<<

1položka
2položka
3položka<<<

2položka
3položka
4položka<<<

3položka
4položka
5položka<<<

4položka
5položka
6položka<<<

5položka
6položka
7položka<<<

6položka
7položka
8položka<<<

7položka
8položka
9položka<<<

Kroky zpět (směrem nahoru)

7položka
8položka
9položka<<<

7položka
8položka<<<
9položka

7položka<<<
8položka
9položka

6položka<<<
7položka
8položka

5položka<<<
6položka
7položka

4položka<<<
5položka
6položka

3položka<<<
4položka
5položka

2položka<<<
3položka
4položka

1položka<<<
2položka
3položka

0položka<<<
1položka
2položka

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.11.2022 09:07 X
Rozbalit Rozbalit vše Re: Krokování v menu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jazyk?
27.11.2022 12:18 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Ukázka je v PHP ale bude to v Pythonu, ten je pro terminál asi lepší.
27.11.2022 13:34 X
Rozbalit Rozbalit vše Re: Krokování v menu
Pokud je to ciste pro terminal tak by mohl stacit whiptail + bash skript.
27.11.2022 14:12 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Díky za tip, ale znám, i dialog ale oba mají omezení. Dělám vlastní menu.
27.11.2022 15:17 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Krokování v menu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zbaviť sa cyklu a isť stavovým automatom, t. j.:
<?php
// (C) 2022, Dušan Kreheľ
// Licence: MIT

class MenuBox
{
	private $items=array();
	private $items_count=array();
	private $max_items=10;
	private $position=0;  /* index */
	private $box_first=0; /* index */
	
	function __construct($items, $draw_max_items)
	{
		$this->items=$items;
		$this->max_items=$draw_max_items;
		
		$this->items_count=count($items);
	}
	
	function down()
	{
		if($this->position == ($this->items_count-1))
			return;
		
		$this->position++;
		
		if(abs($this->position-$this->box_first) == $this->max_items)
			$this->box_first++;
	}
	
	function up()
	{
		if($this->position == 0)
			return;
		
		if($this->position == $this->box_first)
			$this->box_first--;
		
		$this->position--;
	}
	
	function draw()
	{
		$count_steps=$this->max_items + $this->box_first;
		for($i=$this->box_first;$i<$count_steps;$i++)
			if($i == $this->position)
				echo " \033[35m".$this->items[$i]."\033[0m\n";
			else
				echo " ".$this->items[$i]."\n";
		echo "\n";
	}
}

$items=array("A","B","C","D","E","F","G");

$box= new MenuBox($items, 4);
$box->draw();

$box->down();
$box->draw();

$box->down();
$box->draw();

$box->down();
$box->draw();

$box->down();
$box->draw();

$box->down();
$box->draw();

$box->down();
$box->draw();

echo "hore dalej\n";

$box->up();
$box->draw();

$box->up();
$box->draw();

$box->up();
$box->draw();

$box->up();
$box->draw();

$box->up();
$box->draw();

$box->up();
$box->draw();
debian.plus@protonmail.com
27.11.2022 18:51 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Děkuji, za kód, ale opravdu potřebuji jenom nějaký ten algoritmus pro nastavení proměnných OD DO pro samotný cyklus.
27.11.2022 20:13 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Krokování v menu
Máš tam výpočet starých/nových premien, ktoré potom len v cykle porovnávaš a nejak vypisuješ.
debian.plus@protonmail.com
27.11.2022 20:50 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
A když znáš jenom hodnotu proměnné $position, jak dopočítáš hodnotu proměnné $box_first? Díky
27.11.2022 21:11 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Krokování v menu
Tato hodnota je stavová. To znamená, že ju musíš pred zmenou poznať. U mňa je inicializovaná na 0 a potom sa prispôsobuje podľa posunov. Ta premenná je vlastne index, kde začína box zobrazovať tie riadky na výstupe. A v prvých posunoch dole (na začiatku vykonávania menu) sa nemení.
debian.plus@protonmail.com
27.11.2022 21:21 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Nevím zda jsem se zeptal dobře. Chci po spuštění toho mít označenou položku třeba $position=6. V mém kódu to nejde, ve tvém to taky nejde?
27.11.2022 22:13 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Krokování v menu
Nešlo, ale stačilo len dopísať procedúru set_position() a už to ide:
<?php
// (C) 2022, Dušan Kreheľ
// Licence: MIT

class MenuBox
{
	private $items=array();
	private $items_count=-1;
	private $max_items=10;
	private $position=0;
	private $box_first=0;
	
	function __construct($items, $draw_max_items)
	{
		$this->items=$items;
		$this->max_items=$draw_max_items;
		
		$this->items_count=count($items);
	}
	
	function down()
	{
		if($this->position == ($this->items_count-1))
			return;
		
		$this->position++;
		
		if(abs($this->position-$this->box_first) == $this->max_items)
			$this->box_first++;
	}
	
	function up()
	{
		if($this->position == 0)
			return;
		
		if($this->position == $this->box_first)
			$this->box_first--;
		
		$this->position--;
	}
	
	function draw()
	{
		$count_steps=$this->max_items + $this->box_first;
		for($i=$this->box_first;$i<$count_steps;$i++)
			if($i == $this->position)
				echo " \033[35m".$this->items[$i]."\033[0m\n";
			else
				echo " ".$this->items[$i]."\n";
		echo "\n";
	}
	
	function set_position($index_position, $index_box_first_line)
	{
		$this->position=$index_position;
		$this->box_first=$index_box_first_line;
	}
}

$items=array("A","B","C","D","E","F","G");

$box= new MenuBox($items, 4);
$box->set_position(2, 1);
$box->draw();

$box->down();
$box->draw();

debian.plus@protonmail.com
27.11.2022 22:31 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Ano, ale při volání metody
$box->set_position(2, 1);
tak tu hodnotu 1 musíš vypočítat ručně, ne? Myslel jsem spíš volat jen s jednou hodnotou a tu druhou by si vypočítal sám.
$box->set_position(2);
Omlouvám se, ale nevím jestli se vyjadřuji k pochopení.
28.11.2022 09:59 Ja
Rozbalit Rozbalit vše Re: Krokování v menu
Obávám se, že vždy potřebuješ dvě hodnoty - index vybrané položky a index první zobrazované položky. Pro první zobrazení může stačit index vybrané položky a index první zobrazované položky dopočítat podle ní, tak aby to vypadalo hezky, ale jakmile se tím začne uživatel pohybovat nahoru a dolů, tak musíš sledovat obě hodnoty. Výchozí první zobrazovanou položku můžeš vypočítávat třeba takhle:
first = count - lines
if sel < first:
    first = sel - (lines // 2)
if first < 0:
    first = 0
kde first je index první položky menu, count je počet položek menu, lines je počet řádek menu
#!/usr/bin/env python3

def draw(sel, lines):
    menu = ('a', 'b', 'c', 'd', 'e', 'f')
    count = len(menu)
    first = count - lines
    if sel < first:
        first = sel - (lines // 2)
    if first < 0:
        first = 0
    print('-------------')
    for line in range(lines):
        item = line + first
        print(menu[item], '<<<' if item == sel else '')

for sel in range(7):
    draw(sel, 3)

výstup je:
$ python3 menu.py
-------------
a <<<
b 
c 
-------------
a 
b <<<
c 
-------------
b 
c <<<
d 
-------------
d <<<
e 
f 
-------------
d 
e <<<
f 
-------------
d 
e 
f <<<
-------------
d 
e 
f 
29.11.2022 12:33 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Taky díky, vyřešeno jinak.
28.11.2022 12:24 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: Krokování v menu
No, ak sa chce, dá sa. To si v zadaní nešpecifikoval. Dá sa nastaviť, že ak je položka v 1/2 zoznamu, tak automatický v tom boxe bude na vrchu (alebo v strede, ak máš nepárny počet položiek v boxe) ako prvá, ináč v boxe posledná. Ale to si vieš aj sam upraviť, nie? ;)
debian.plus@protonmail.com
29.11.2022 12:32 Jan
Rozbalit Rozbalit vše Re: Krokování v menu
Díky za informaci. Napsal jsem to celý úplně znova a do seznamu ukládám vždy obě hodnoty. Výsledkem je vždy naprosto stejný výpis, jako když se krokuje od pozice 0.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.