![]() ![]() |
ARCHIV |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() |
|
Metoda | Význam |
---|---|
set_wrap_mode | metoda zalamování; možné hodnoty jsou none, char nebo word |
set_editable | false pro read-only, true pro editaci |
set_cursor_visible | viditelnost kurzoru (kurzor bychom měli schovat vždy, když používáme read-only režim) |
set_justification | zarovnání textu; možné hodnoty jsou left, right, center |
set_left_margin, set_right_margin | okraje |
set_indent | odsazení |
Existuje-li metoda s názvem set_něco, pak také často existuje metoda get_něco, která detekuje aktuální nastavení.
Objekt typu Gtk2::TextIter reprezentuje pozici v bufferu. Pozice je platná vždy jen do okamžiku, kdy se obsah bufferu (tj. text v Gtk2::TextView) změní. Protože často chceme pozice zachovat i po změně obsahu bufferu, byly vytvořeny objekty typu Gtk2::TextMark, což jsou hýbající se pozice.
Gtk2::TextBuffer je vytvořen vždy, když vytvoříme Gtk2::TextView. Samozřejmě si ale můžeme standardní cestou vytvořit TextBuffer vlastní.
$textbuffer = Gtk2::TextBuffer->new;
Podívejme se na metody, kterými lze s textem v TextBufferu manipulovat.
Metoda | Význam |
---|---|
set_text | nastaví text |
insert($textiter, $text) | vloží $text na pozici $textiter (jak víme, pozice je objekt typu Gtk2::TextIter; více o tom dále) |
insert_at_cursor | vloží text na aktuální pozici |
insert_range($kam, $zacatek, $konec) | výsek určený dle $zacatek, $konec se uloží na pozici $kam |
get_text($zacatek, $konec, $ukazat_skryte) | vrátí výsek |
get_slice($zacatek, $konec, $ukazat_skryte) | vrátí výsek, obrázky budou vráceny jako znak 0xFFFC; více o tom dále |
get_line_count, get_char_count | zjistí počet řádků, resp. znaků |
Již víme, že pozici v TextBufferu uchovává objekt Gtk2::TextIter. Podívejme se na to, jak s pozicemi pracovat. Pozici v bufferu definujeme jednou z následujících metod zavolaných nad TextBufferem.
Příkaz | Kde se vytvoří TextIter? |
---|---|
$textiter=$textbuffer->get_start_iter; | před prvním znakem |
$textiter=$textbuffer->get_end_iter; | za posledním znakem |
$textiter=$textbuffer->get_iter_at_offset(50); | před padesátým znakem |
$textiter=$textbuffer->get_iter_at_line($radek); | před prvním znakem řádku č. $radek |
$textiter=$textbuffer->get_iter_at_line_offset(5, 10); | před 10. znak na 5. řádku |
$textiter=$textbuffer->get_iter_at_mark($mark); | na pozici existujícícho Gtk2::TextMark |
($ti1,$ti2)=$buffer->get_selection_bounds; | na hranice vybrané oblasti |
Nad objekty typu Gtk2::TextIter lze pak volat obrovské množství dalších metod. Podívejme se na seznam těch, které se mohou hodit.
Metoda | Význam |
---|---|
Detekce pozice v kontextu slov a řádků | |
starts_word, ends_word, inside_word, starts_sentence, ends_sentence, inside_sentence, starts_line, ends_line, is_end, is_start, is_cursor_position | zjišťování informací o pozici |
in_range($zacatek, $konec) | jsme v daném rozmezí? |
Zjišťování absolutní pozice | |
get_offset | vrátí číslo znaku |
get_line | vrátí číslo řádku |
get_line_offset | vrátí číslo znaku na řádku |
Pohyb TextIterů | |
forward_char, backward_char, forward_word_end, backward_word_start, forward_sentence_end, backward_sentence_start, forward_line, backward_line, forward_to_line_end, forward_cursor_position, backward_cursor_position, forward_to_end | pohyb na pozici v kontextu slov a řádků |
forward_chars($kolik), backward_chars($kolik), forward_word_ends($kolik), backward_word_starts($kolik), forward_sentence_ends($kolik), backward_sentence_starts($kolik), forward_lines($kolik), backward_lines($kolik), forward_cursor_positions($kolik), backward_cursor_positions($kolik) | to samé vícenásobně |
set_offset($offset) | nastaví na danou pozici |
set_line($radek) | nastaví na daný řádek |
set_line_offset($offset_na_radku) | nastaví na pozici na aktuálním řádku |
Získávání textu z TextBufferu | |
get_char | vrátí znak |
get_text($do) | vrátí úsek textu |
get_slice($do) | vrátí úsek textu |
Detekce dalších objektů na dané pozici | |
get_marks | vrátí seznam objektů Gtk2::TextMark |
get_tags | vrátí seznam tagů, tj. objektů typu Gtk2::TextTag |
get_pixbuf | vrátí seznam objektů Gtk2::PixBuf |
get_child_anchor | vrátí seznam objektů Gtk2::TextChildAnchor |
has_tag, begins_tag, ends_tag | detekce tagů |
Hledání v textu | |
forward_search($retezec, 'text-only', $kam_az) | vrátí dvouprvkový seznam s počáteční a koncovou pozicí typu Gtk2::TextIter, hledání dopředu; druhý parametr je typu Gtk2::TextSearchFlags |
backward_search($retezec, 'text-only', $kam_az) | vrátí dvouprvkový seznam s počáteční a koncovou pozicí typu Gtk2::TextIter, hledání dozadu; druhý parametr je typu Gtk2::TextSearchFlags |
Ostatní | |
get_attributes | vrátí objekt typu Gtk2::TextAttributes |
Gtk2::TextMark je podobný jako Gtk2::TextIter, avšak zachovává pozice při změnách TextBufferu.
Podívejme se opět, jak lze vytvořit objekt typu Gtk2::TextMark.
Příkaz | Kde se vytvoří TextMark? |
---|---|
$textmark = $textbuffer->get_insert | aktuální pozice kurzoru |
$textmark = $textbuffer->get_selection_bound | druhý konec výběru (prvním koncem je pozice kurzoru) |
$textmark = $textbuffer->create_mark($nazev, $textiter, $zleva) | Gtk2::TextMark s názvem $nazev se vytvoří na pozici $textiter s tím, že při vkládání na tuto pozici se posouvá/neposouvá doleva |
TextMarky lze ručně posouvat pomocí TextIterů jedním z následujících příkazů.
$textbuffer->move_mark($mark, $kam);
$textbuffer->move_mark_by_name($nazev, $kam);
Metodou get_mark získáme objekt typu Gtk2::TextMark na základě svého názvu.
Objekty typu Gtk2::TextTag jsou dalším obsahem TextBufferů. Obsahují informace o formátování. Každý tag funguje na daných pozicích a má nějaký svůj efekt (například zvětšuje písmo na druhém řádku).
Společně s bufferem se vždy vytvoří i objekt typu Gtk2::TextTagTable. Zde je uchováván seznam tagů.
Tag vytvoříme metodou create_tag zavolanou nad TextBufferem.
$tag = $textbuffer->create_tag($nazev, %vlastnosti);
Poté jsou dvě možnosti, jak tagy aplikovat. Buď přímo nebo opět podle názvu.
$textbuffer->apply_tag($tag, $zacatek, $konec);
$textbuffer->apply_tag_by_name($nazev, $zacatek, $konec);
Stejně tak můžeme tagy odstraňovat.
$textbuffer->remove_tag($tag, $zacatek, $konec);
$textbuffer->remove_tag_by_name($nazev, $zacatek, $konec);
Vlastnosti lze nastavovat metodou set_property.
Pomocí set_priority nastavujeme pro tag prioritu mezi 0 a velikostí Gtk2::TextTagTable.
Podívejme se na hash parametrů, které ovlivňují chování tagu. Jaké všechny paramety můžeme používat?
Klíč | Význam a hodnoty |
---|---|
background, background-gdk | barva pozadí pomocí řetězce, resp, Gtk2::Gdk::Color |
foreground, foreground-gdk | barva popředí pomocí řetězce, resp, Gtk2::Gdk::Color |
background-stipple, foreground-stipple | použije se na pozadí / popředí maska (bitmapa) |
font | písmo (například Times 12) |
size, size-points | velikost písma v Pango bodech, resp. v bodech |
scale | relativní velikost písma oproti okolí |
font-desc | styl písma (jako objekt typu Gtk2::Pango::FontDescription) |
family | například Times |
underline | podtržené písmo |
style, variant, weight, stretch | hodnoty jsou v dokumentaci |
pixels-above-lines, pixels-below-lines | mezera v pixelech nad / pod řádkem |
wrap-mode | jak zalamovat (none, word, char) |
justification | left, right, center |
direction | směr toku textu (right-to-left, left-to-right) |
left-margin, right-margin | okraje |
indent | odsazení odstavce |
strikethrough | dělení |
rise | posunutí nahoru (dolů při záporném parametru) |
background-full-height | má-li tag ovlivnit celý řádek ve smyslu barvy pozadí |
Zkusíme si vytvořit nějaký tag.
$tag = $buffer->create_tag("zvyrazneny_text",
"font" => "Helvetica 30",
"underline" => PANGO_UNDERLINE_DOUBLE,
"foreground" => "darkgreen",
"background-gdk" => Gtk2::Gdk::Color->new(60, 0, 200));
$buffer->apply_tag($tag, $buffer->get_iter_at_offset(3), $buffer->get_iter_at_offset(7));
Výsledek spatříme po spuštění aplikace.
TextView s otagovaným úsekem textu
Do textového pole lze vkládat také obrázky nebo rovnou celé widgety. Obrázky reprezentované jako Gtk2::PixBuf můžeme vkládat metodou insert_pixbuf na danou pozici. Takový obrázek se bude chovat jako unicodový znak 0xFFFC.
$textbuffer->insert_pixbuf($textiter, $pixbuf)
S widgety je to trochu složitější, ale v zásadě podobné. Vytvoříme objekt typu Gtk2::TextChildAnchor na místě, kde chceme, aby byl widget. Poté na toto místo widget vložíme.
$anchor = Gtk2::TextChildAnchor->new;
$textbuffer->insert_child_anchor($iter, $anchor);
$textview->add_child_at_anchor($widget, $anchor);
Ukážeme si konkrétnější příklad - TextView, do kterého vložíme text, obrázek a tlačítko.
$textview = Gtk2::TextView->new;
$buffer = $textview->get_buffer();
$buffer->set_text("nejaky text");
$tlacitko = Gtk2::Button->new("tlacitko");
$anchor = Gtk2::TextChildAnchor->new;
$buffer->insert_child_anchor($buffer->get_start_iter, $anchor);
$textview->add_child_at_anchor($tlacitko, $anchor);
$buffer->insert_pixbuf($buffer->get_start_iter, Gtk2::Gdk::Pixbuf->new_from_file("./Ghost.png"));
Text pak můžeme samozřejmě libovolně editovat. Vložené objekty se chovají jako znaky.
TextView s widgetem a obrázkem
Ukážeme si, jak lze zachytávat pozici myši a manipulovat s textem (popřípadě tagem) na jejím aktuálním místě.
Díky signálu motion_notify_event, který je emitován při změně pozice myši nad daným widgetem můžeme vyvolat akci. Ta bude například zvýrazňovat místo, kde je aktuálně myš.
$textview->signal_connect(motion_notify_event => \&akce);
Díky metodě window_to_buffer_coords zjistíme pixelové souřadnice. Ty nám metoda get_iter_at_location převede na pozici v textu, tj. objekt typu Gtk2::TextIter. Pak není nic jednoduššího, než s danou pozicí manipulovat.
Vytvoříme tedy tag, kterým budeme zvýrazňovat aktuální znak.
my $tag = $buffer->create_tag(undef, "foreground" => "white", "background" => "black");
Aplikujeme ho. Na to ovšem musíme mít dva TextItery (potřebujeme začátek i konec tagu). Vytvoříme si tedy kopii našeho TextIteru a posuneme ho o pozici vpřed. TextIter nemá vhodný konstruktor na kopírování objektů a poradíme si tak trochu oklikou.
my $textiter2 = $buffer->get_iter_at_offset($textiter->get_offset);
$textiter->forward_char;
$buffer->apply_tag($tag, $textiter2, $textiter);
Ještě bychom měli uchovávat starý tag a mazat ho po opuštění pozice. Zavedeme si tedy proměnnou $kurzor_tag, která bude reprezentovat týž objekt jako $tag do doby, než $tag zapomeneme. Tag pak smažeme přes tabulku tagu, kterou získáme z bufferu.
my $table = $buffer->get_tag_table;
$table->remove($kurzor_tag) if defined $kurzor_tag;
Podívejme se na celý zdrojový kód naší akce.
sub akce {
my($textview, $udalost) = @_;
my $textiter = $textview->get_iter_at_location(
$textview->window_to_buffer_coords("widget",$udalost->x, $udalost->y));
my $textiter2 = $buffer->get_iter_at_offset($textiter->get_offset);
$textiter->forward_char;
my $tag = $buffer->create_tag(undef, "foreground" => "white", "background" => "black");
my $table = $buffer->get_tag_table;
$table->remove($kurzor_tag) if defined $kurzor_tag;
$buffer->apply_tag($tag, $textiter2, $textiter);
$kurzor_tag=$tag;
}
Vidíme, že na místě kurzoru se aplikoval náš tag
Nejsou žádné diskuzní příspěvky u dané položky. Příspívat do diskuze mohou pouze registrovaní uživatelé. |
28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
30.11.2022 9:32 /
Kyle McDermott
Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš
Re: zavináč
2.12.2018 23:56 /
František Kučera
Sraz
5.10.2018 17:12 /
Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
20.9.2018 10:04 /
Jan Ober
Jaký kurz a software by jste doporučili pro začínajcího kodéra?