LINUX.ORG.RU

Gtk: многострочное поле ввода

 


0

1

Казалось бы, где это видано, чтоб в тулките не было компонента (элемента, объекта) «многострочное поле ввода текста»?

А вот в gtk3 нет компонента именно под эту задачу ( по крайней мере – не вижу )

Может можно как-то GtkEntry сделать многострочным?

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

Как вообще решается эта проблема? Кастомизировать стили для ТекстВью? Ну тупо же.

Вот код-демонстрация, он, правда, на vala, но то – для краткости, думаю, тут все понятно:

//  to compile valac --pkg gtk+-3.0  lor_example.vala 

using Gtk;

public class lor_example : Window {

  private Entry entry;
  private TextView text_view;
  private Box vbox;

  public lor_example() {
    this.window_position = WindowPosition.CENTER;
    this.destroy.connect( Gtk.main_quit );
    set_default_size( 400, 400 );

    vbox = new Box( Orientation.VERTICAL, 10 );

    entry = new Entry();
    vbox.add( entry );

    text_view = new TextView();
    vbox.add( text_view );

    add( vbox );
  }

  public static int main( string[] args ) {
    Gtk.init( ref args );

    var window = new lor_example();
    window.show_all();

    Gtk.main();
    return 0;
  }
}

Просто чтоб вы могли посмотреть как оно выглядит

★★★★★

Ответ на: комментарий от nvl

А у меня от избыточного формализма и переусложнения на ровном месте глаза вытекают

Можешь пояснить какая польза будет, если я весь пример напишу используя вот эти вот твои «бест практисы»?

pihter ★★★★★
() автор топика
Ответ на: комментарий от nvl

ну, благодаря тебе, я поборол лень и викинул нафиг это ООП-нинужно из примера. Теперь я имею право на змеиную нотацию! :)

// to compile: valac --pkg gtk+-3.0 lor_example.vala 

using Gtk;

void main( string[] args ) {
  Gtk.init( ref args );

  var window = new Window();

  window.window_position = WindowPosition.CENTER;
  window.destroy.connect( Gtk.main_quit );
  window.set_default_size( 400, 400 );

  var vbox = new Box( Orientation.VERTICAL, 10 );

  var entry = new Entry();
  vbox.add( entry );

  var text_view = new TextView();
  vbox.add( text_view );

  window.add( vbox );

  window.show_all();

  Gtk.main();
}
pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

Это не бест практис, а правильное именование. В данном хэлловорде это не существенно, но тем не менее, на ровном месте запутываешь код. Если создал окно, так назови его окном: LorExampleWindow, а лучше через неймспейс: LorExample.Window

Ты бы хоть скришнот поиложил и написал бы что по твоему не так и как ты хочешь чтоб было. «Глаза вытикают» - по твому, всем все понятно?

nvl ★★★
()
Ответ на: комментарий от nvl

В данном хэлловорде это не существенно

зис

но тем не менее

тем не менее – что? Надо все равно писать «правильно», даже если это несущественно?

Код только для меня, а я верблюжатину не люблю: мне приятнее змеиная, я должен что-ли себе соль на рану сыпать ради вселенской «правильности»?

Ну и это (рекомендации разработчиков валы по именованию переменных) – не святое писание, я все еще волен делать как мне нравится.

Если создал окно, так назови его окном: LorExampleWindow, а лучше через неймспейс: LorExample.Window

Вот ты серьезно? Отдельный неймспейс под одну переменную в тридцатистрочной программе?

У меня есть коллеги, они все делают «правильно», но чем это правильнее, чем мое неправильное и какая от этого польза, объяснить в большинстве случаев, не могут: просто, мол, так положено, так ПРАВИЛЬНО. Для меня это – загадка. Я могу понять (и согласиться), когда большой проект, когда много людей, когда есть явные соглашения про код-стайл, но в роботов-то зачем превращаться? Здесь явно не тот случай.

Ты бы хоть скришнот поиложил и написал бы что по твоему не так и как ты хочешь чтоб было. «Глаза вытикают» - по твому, всем все понятно?

Ну так я код в качестве иллюстрации и приложил. Он же собирается одной строчкой, в нем предельно все понятно. Кто с ГТК работал – явно видит насквозь прям по коду, даже без компиляции.

Хочу чтоб мнгогострочное поле ввода выглядело по стилю так же как и однострочное. Мне кажется, я просто делаю что-то не так, не может быть чтоб так тупо в гтк по-умолчанию было. Ну например, в моей теме, у меня на машине, все элементы немного скруглены по углам: и окно и кнопки и интри. А TextView – строго прямоугольный, по крайней мере, по дефолту. Это у всех так? Это зачем так?

pihter ★★★★★
() автор топика

Ни в коем случае не кастомизировать стиль отдельных элементов! Это забота пользователя и темы. Если что-то не устраивает - просто переключись на другую тему. Вот например тут они достаточно похожи https://ibb.co/ctxbKd6

TextView и не должен выглядеть идентично Entry. Если главное что требуется от Entry - чтобы он выделялся среди батонов и основной части окна, то TextView должен быть в первую очередь читабелен, а во вторую красимым, компактным и что-то там еще.

hargard ★★
()
Ответ на: комментарий от hargard

Ни в коем случае не кастомизировать стиль отдельных элементов!

Да понятно, что – чушь

Если что-то не устраивает - просто переключись на другую тему.

Программу-то люди будут использовать, я что-ли должен заставлять их тему менять?

TextView и не должен выглядеть идентично Entry. Если главное что требуется от Entry - чтобы он выделялся среди батонов и основной части окна, то TextView должен быть в первую очередь читабелен, а во вторую красимым, компактным и что-то там еще.

Окей, а как мне заиметь многострочное поле ввода текста? Ну вот типа того, в котором я сейчас сообщение набираю?

Или то, что все элементы имеют скруглдения по углам и паддинги, кроме тексвью – это так и задумано автором темы и я напрасно кипишую? Просто оставить по-умолчанию?

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

Программу-то люди будут использовать, я что-ли должен заставлять их тему менять?

Сами разберутся :) А то будет как долбаными полосами прокрутки в notepadqq

Или то, что все элементы имеют скруглдения по углам и паддинги, кроме тексвью – это так и задумано автором темы и я напрасно кипишую? Просто оставить по-умолчанию?

Именно. Отсутствие сгругленности могу легко оправдать тем, что TextView часто впихивается в box или другой группирующий виджет с нулевым или даже отрицательным отступом, от чего он будет обрезаным.

hargard ★★
()
Ответ на: комментарий от pihter

Создай свой класс MyMultiLineEntry и будет у тебя все элементы немного скруглены по углам: и окно и кнопки и интри. Код в качестве иллюстрации:

using Gtk;

public class lor_example : Window {

  private Entry entry;
  private TextView text_view;
  private Box tbox;
  private Box vbox;

  public lor_example() {
    this.window_position = WindowPosition.CENTER;
    this.destroy.connect( Gtk.main_quit );
    set_default_size( 400, 400 );

    vbox = new Box( Orientation.VERTICAL, 10 );

    entry = new Entry();
    vbox.add( entry );

    text_view = new TextView();
    text_view.set_margin_start(6);
    text_view.set_margin_end(6);
    text_view.set_margin_top(5);
    text_view.set_margin_bottom(5);
    tbox = new Box( Orientation.VERTICAL, 10 );
    tbox.add( text_view );
    vbox.add( tbox );
    add( vbox );
    StyleContext ctx = tbox.get_style_context ();
    ctx.add_class("my-text-view");
  }

  public static int main( string[] args ) {
    Gtk.init( ref args );
    var p = new CssProvider ();
    try {
      p.load_from_data (".my-text-view { border-color: @theme_selected_bg_color; border-style: solid; border-width: 2px; border-radius: 5px;}");
    } catch (Error e) {}
    StyleContext.add_provider_for_screen (Gdk.Screen.get_default (),
                                          p,
                                          STYLE_PROVIDER_PRIORITY_USER);

    var window = new lor_example();
    window.show_all();

    Gtk.main();
    return 0;
  }
}
nvl ★★★
()
Ответ на: комментарий от nvl

О, спасибо!

Интересно, это только у меня такое поведение, что скругление сразу не растягивается на несколько строк, а если свернуть-развернуть – растягивается?

pihter ★★★★★
() автор топика