Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 179

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

 return 0;

}

На рис. 16.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° buttons.c Π² дСйствии с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ GtkButton Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… часто примСняСмых Ρ‚ΠΈΠΏΠΎΠ².

Рис. 16.10


Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΌΡ‹ΡˆΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ состояниС Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ.

Данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° β€” простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΊΠ½ΠΎΠΏΠΎΠΊ GtkButton Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ² β€” ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ состояниС ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‚ΠΈΠΏΠ° GtkToggleButton, GtkCheckButton ΠΈ GtkRadioButton с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ СдинствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_toggle_button_get_active. Π­Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… прСимущСств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° β€” ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_active для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄.

GtkTreeView

К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ ΠΌΡ‹ рассмотрСли нСсколько простых Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² GTK+, Π½ΠΎ Π½Π΅ всС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой однострочныС инструмСнты для Π²Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ отобраТСния. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ограничиваСтся, ΠΈ GtkTreeView β€” яркий ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ объСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй.

GtkWidget

 +---- GtkContainer

        +---- GtkTreeView

GtkTreeView β€” Ρ‡Π»Π΅Π½ сСмСйства Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Π½ΠΎΠ²Ρ‹Ρ… для ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π° GTK+ 2, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° ΠΈΠ»ΠΈ списка Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π² элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° GtkTreeView ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ слоТныС прСдставлСния Π΄Π°Π½Π½Ρ‹Ρ…, смСшивая тСкст, Ρ€Π°ΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ ΠΈ Π΄Π°ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² GtkEntry, ΠΈ Ρ‚.Π΄.

Π‘Π°ΠΌΡ‹ΠΉ быстрый способ испытания GtkTreeView β€” запуск прилоТСния gtk-demo, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ поставляСтся вмСстС с GTK+. ДСмонстрационноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ возмоТности всСх Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² GTK+, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ GtkTreeView (рис. 16.11).

Рис. 16.11


БСмСйство GtkTreeView составляСтся ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

β–‘ GtkTreeView β€” ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° ΠΈΠ»ΠΈ списка;

β–‘ GtkTreeViewColumn β€” прСдставлСниС столбца списка ΠΈΠ»ΠΈ Π΄Π΅Ρ€Π΅Π²Π°;

β–‘ GtkCellRenderer β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΌΠΈ ячСйками;

β–‘ GtkTreeModel β€” прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²Π° ΠΈ списка. 

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅, Π° послСдний β€” МодСль. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ раздСлСния ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ ΠΈ МодСли (часто называСмая ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ шаблоном МодСль/ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅/ДСйствиС (Model/View/Controller) ΠΈΠ»ΠΈ сокращСнно MVC) Π½Π΅ свойствСнна GTK+, Π½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ удСляСтся всС большС ΠΈ большС внимания Π½Π° всСх этапах программирования.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ достоинство ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ шаблона MVC Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² возмоТности ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ Ρ€Π°Π·Π½Ρ‹Ρ… прСдставлСний Π±Π΅Π· Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΈΡ… дублирования. НапримСр, тСкстовыС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π΅ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π±Π΅Π· хранСния Π² памяти Π΄Π²ΡƒΡ… ΠΊΠΎΠΏΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

Π¨Π°Π±Π»ΠΎΠ½ MVC Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ популярСн Π² Web-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ созданиС Web-сайтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΠ»ΠΈ WAP-обозрСватСлях Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π² Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ…, просто Π·Π° счСт наличия ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… для Web-обозрСватСля ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ сбора Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, запросов ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса.

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с рассмотрСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° МодСль, прСдставлСнного Π² GTK+ двумя Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° GtkTreeStore содСрТит ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GtkListStore ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для простых Π΄Π°Π½Π½Ρ‹Ρ….

Для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkTreeStore Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСдаСтся количСство столбцов, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ всСх столбцов:

GtkWidget *store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_INT,

 G_TYPE_BOOLEAN);

Π§Ρ‚Π΅Π½ΠΈΠ΅, вставка, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структур GtkTreeIter. Π­Ρ‚ΠΈ структуры ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΡƒΠ·Π»Ρ‹ Π΄Π΅Ρ€Π΅Π²Π° (ΠΈΠ»ΠΈ строки списка) ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ большого объСма, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠΈ. Π•ΡΡ‚ΡŒ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² API для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ Π΄Π΅Ρ€Π΅Π²Π°, Π½ΠΎ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_tree_store_append.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π² модСль Π΄Π΅Ρ€Π΅Π²Π°, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку. Ѐункция gtk_tree_store_append заполняСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GtkTreeIter, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт Π½ΠΎΠ²ΡƒΡŽ строку Π² Π΄Π΅Ρ€Π΅Π²Π΅, ΠΊΠ°ΠΊ строку Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (Ссли Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅), Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΡŽΡŽ строку (Ссли Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ строки):

GtkTreeIter iter;

gtk_tree_store_append(store, &iter, NULL);

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_tree_store_set:

gtk_tree_store_set(store, &iter,

 0, "Def Leppard",

 1, 1987,

 2, TRUE, -1);

НомСр столбца ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ -1. ПозТС Π²Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ enum для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€Π° столбцов Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π΅Ρ‚Π²ΡŒ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ строкС (Π΄ΠΎΡ‡Π΅Ρ€Π½ΡŽΡŽ строку), Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅, Π²Ρ‹Π·Π²Π°Π² снова Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_tree_store_append ΠΈ ΡƒΠΊΠ°Π·Π°Π² Π½Π° этот Ρ€Π°Π· Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° строку Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня:

GtkTreeIter child;

gtk_tree_store_append(store, &child, &iter);

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… GtkTreeStore ΠΈ функциях ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkListStore см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ API, Π° ΠΌΡ‹ ΠΏΠΎΠΉΠ΄Π΅ΠΌ дальшС ΠΈ рассмотрим ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° GtkTreeView.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkTreeView β€” сама простота: Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π² конструктор Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° модСль Ρ‚ΠΈΠΏΠ° GtkTreeStore ΠΈΠ»ΠΈ GtkListStore:

GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));

БСйчас самоС врСмя Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ для отобраТСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ столбца слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ GtkCellRenderer ΠΈ источник Π΄Π°Π½Π½Ρ‹Ρ…. МоТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… столбцов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок Π²Ρ‹Π²ΠΎΠ΄Π° столбцов.

GtkCellRenderer β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° прорисовку ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки Π½Π° экранС, ΠΈ сущСствуСт Ρ‚Ρ€ΠΈ подкласса, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π΄Π΅Π»ΠΎ с тСкстовыми ячСйками, ячСйками пиксСльной Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ ячСйками ΠΊΠ½ΠΎΠΏΠΎΠΊ-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ:

β–‘ GtkCellRendererText;

β–‘ GtkCellRendererPixBuf;

β–‘ GtkCellRendererToggle.

Π’ вашСм ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ тСкстовоС прСдставлСниС ячССк, GtkCellRendererText.

GtkCellRenderer* renderer = gtk_cell_renderer_text_new();

gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),

 "This is the column title", renderer, "text", 0, NULL);

Π’Ρ‹ создаСтС прСдставлСниС ячСйки ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ вставки столбца. Π­Ρ‚Π° функция позволяСт сразу Π·Π°Π΄Π°Ρ‚ΡŒ свойства GtkCellRendererText, пСрСдавая Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ NULL ΠΏΠ°Ρ€Ρ‹ "ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅". Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½Ρ‹ прСдставлСниС Π΄Π΅Ρ€Π΅Π²Π°, Π½ΠΎΠΌΠ΅Ρ€ столбца, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ столбца, прСдставлСниС ячСйки ΠΈ Π΅Π³ΠΎ свойства. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ "text", ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π½ΠΎΠΌΠ΅Ρ€ столбца источника Π΄Π°Π½Π½Ρ‹Ρ…. Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkCellRendererText ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅, ΡˆΡ€ΠΈΡ„Ρ‚, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ‚.Π΄.

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 16.7, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ шаги, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.7. ИспользованиС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° GtkTreeView

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π½Π°Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» tree.с.

1. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ enum для обозначСния столбцов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Π½ΠΈΡ… ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ. ΠžΠ±Ρ‰Π΅Π΅ количСство столбцов ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ N_COLUMNS:

#include <gtk/gtk.h>


enum {

 COLUMN_TITLE, COLUMN_ARTIST, COLUMN_CATALOGUE, N_COLUMNS

};


void closeApp(GtkWidget *window, gpointer data) {

 gtk_main_quit();

}


int main(int argc, char *argv[]) {

 GtkWidget *window;

 GtkTreeStore *store;

 GtkWidget *view;

 GtkTreeIter parent_iter, child_iter;

 GtkCellRenderer *renderer;

 gtk_init(&argc, &argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

 g_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(сloseApp), NULL);

2. Π”Π°Π»Π΅Π΅ Π²Ρ‹ создаСтС модСль Π΄Π΅Ρ€Π΅Π²Π°, пСрСдавая количСство столбцов ΠΈ Ρ‚ΠΈΠΏ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…:

 store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,

  G_TYPE_STRING);

3. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап β€” вставка Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ строк Π² Π΄Π΅Ρ€Π΅Π²ΠΎ:

 gtk_tree_store_append(store, &parent_iter, NULL);

 gtk_tree_store_set(store, &parent_iter,

  COLUMN_TITLE, "Dark Side of the Moon",

  COLUMN_ARTIST, "Pink Floyd",

  COLUMN_CATALOGUE, "B000024D4P", -1);

 gtk_tree_store_append(store, &child_iter, &parent_iter);

 gtk_tree_store_set (store, &child_iter,

  COLUMN_TITLE, "Speak to Me", -1);

 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));

4. ΠΠ°ΠΊΠΎΠ½Π΅Ρ†, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ столбцы Π² прСдставлСниС, задавая источники Π΄Π°Π½Π½Ρ‹Ρ… для Π½ΠΈΡ… ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ: