Поля, панели, прокручиваемые окна и просмотр текста

GtkPaned

Это контейнеры, которые могут быть ориентированы вертикально или горизонтально, представляют собой два элемента, размер которых может изменяться. Размер этих двух элементов может быть изменен простым нажатием и перемещением разделяющей полосы между ними.


# #![allow(unused_variables)]
#fn main() {
let container = Paned::new(Orientation::Horizontal);
let left_widget = ...;
let right_widget = ...;
container.pack1(&left_widget, true, true);
container.pack2(&right_widget, true, true);
#}

GtkEntry

Элементы позволяют пользовательскому интерфейсу принимать строку текста как входное значение, что может быть использовано другими виджетами для выполнения некоторых действий, используя данный текст как входные данные.


# #![allow(unused_variables)]
#fn main() {
let entry = Entry::new();
entry.set_text("Some Text");
if let Some(text) = entry.get_text() {
    println!("{}", text);
}
#}

GtkTextView

Текстовые панели нужны для двух вещей:

  • способность показывать многострочный текст
  • возможность пользователю вводить многострочный текст Текстовая панель может быть настроена так, что ее содержимое нельзя редактировать, если есть такая необходимость. Также есть возможность настраивать работу с переносами текста. Текстовые панели не умеют работать с форматированным текстом, однако вполне могут быть использованы как редактор кода. Если вы хотите, чтобы текст был показан в виде HTML, смотрите GtkWebView, если же вы хотите получить редактор кода, смотрите GtkSourceView.

Заметьте, что часто бывает лучше создать и привязать GtkTextBuffer к вашему текстовому полю вручную, чтобы получить указатель на буфер, который вы можете хранить, и избежать непрямого обращения, когда вы программируете ваш пользовательский интерфейс (UI). Имея указатель на буфер, можно легко получить доступ к тексту, который содержится в текстовой панели.


# #![allow(unused_variables)]
#fn main() {
// Буфер для текстовой панели с None в качестве параметра, потому что мы не
// собираемся определять никаких текстовых тэгов для этого буфера.
let text_buffer = TextBuffer::new(None);
// После этого мы должны присвоить буфер новой текстовой панели, которая будет
// самостоятельно обновлять себя при добавлении или удалении текста из буфера.
let text_view = TextView::new_with_buffer(&text_buffer);
#}

Извлечение текста из GtkTextBuffer требует некоторой сноровки, так что мы привели пример функции, которую вы можете использовать для того, чтобы получить содержимое буфера в виде строки (String). Вы можете указать определенный участок текста, который будет извлечен из буфера.


# #![allow(unused_variables)]
#fn main() {
/// Получить все содержимое буфера в строковом представлении.
fn get_buffer(buffer: &TextBuffer) -> Option<String> {
    let start = buffer.get_start_iter();
    let end = buffer.get_end_iter();
    buffer.get_text(&start, &end, true)
}
#}

GtkScrolledWindow

Это одноэлементные контейнеры которые предоставляют прокручиваемые окна внутри них. Часто бывает удобным сочетать их вместе с текстовыми полями, которые возможно прокручивать. Это как раз то, что мы хотим сделать в этой главе.


# #![allow(unused_variables)]
#fn main() {
let scrolled_window = ScrolledWindow::new(None, None);
scrolled_window.add(&text_view);
#}