Mały porządek przed moim wyjazdem wakacyjnym:
- System: Ubuntu 8.04
- Środowisko: Gnome
- Tapeta: RiseNotGrass
- Motyw: Clearlooks-LemonGraphite
- Menadżer okien: emerald, motyw własnej roboty
Mały porządek przed moim wyjazdem wakacyjnym:
Domyślnie, klasa notebook jako zakładkę strony przyjmuje zwykłą etykietę tekstową, ale dzięki metodzie set_tab_label jesteśmy wstanie jako zakładkę strony wstawić dowolny widget. Przykładem praktycznego zastosowania tej metody może być np. przycisk służący do zamknięcia otwartego dokumentu w edytorze pozwalającym na prace z wieloma otwartymi dokumentami naraz (patrz gedit).
Metoda przyjmuje 2 argumenty: referencje do widgetu będącego jedną z stron dla którego chcemy zmienić zakładkę oraz referencje do widgetu mającego być nową zakładką. Proste prawa ?
Przykład ilustrujący najważniejszą cześć kodu (szkielet klasy strony notebooka i zakładki):
//Kompilacja: g++ `pkg-config gtkmm-2.4 –cflags –libs` nazwa_pliku.cpp
//#include
//Przy założeniu: using namespace Gtk;
class NotebookPage : public Bin /*Klasa bazowa dla strony */{
public:
NotebookPage();
virtual ~NotebookPage();
class PageHeader : public HBox { //Klasa reprezentująca zakładke
public:
PageHeader();
PageHeader(Glib::ustring title);
virtual ~PageHeader() {};
void set_title(Glib::ustring title) { this->title.set_text(title); };
Glib::ustring get_title() { return this->title.get_text(); };
Button* get_close_btn() { return &close_btn; }; //Zwraca widget przycisku
/* metody dla pozostałych widgetów nagówka */
protected:
Image icon; //Ikona zakładki
Label title; //Tytuł zakładki
Button close_btn; //Przycisk zamykajacy zakładke
};
protected:
void on_close_tab_clicked(); //Zdarzenie obsługi zamkniecia zakładki…
//itd.
};
NotebookPage::PageHeader::PageHeader():
icon(Stock::FILE, ICON_SIZE_MENU),
title(“Zakładka bez nazwy”)
{
close_btn.set_size_request(21, 20); //Rozmiar przycisu
//Ikona dla przycisku zamkniecia zakładki
Image *close_btn_icon = new Image(Stock::CLOSE, ICON_SIZE_MENU);
close_btn.set_image(*close_btn_icon);
//Relief przycisku tzn. obramówka wokół niego…
close_btn.set_relief(Gtk::RELIEF_NONE); //Widoczna tylko po najechaniu kursorem
//Pozycja obrazka wewnatrz przycisku, tylko jak regulowac padding wewnątrz przycisku ?
Glib::RefPtr
close_btn_rc_style->set_xthickness(0);
close_btn_rc_style->set_ythickness(0);
close_btn.modify_style(close_btn_rc_style);
//Dodajemy widgety do kontenera
pack_start(icon, PACK_SHRINK);
pack_start(title);
pack_start(close_btn);
set_size_request(-1, 18);
set_spacing(3);
show_all_children();
}
Kościół Emacs, wojny edytorowe i te sprawy by RMS. Znów stary filmik bo z 2006 roku (???) ale jeśli ktoś nie widział i niesłyszał to polecam bo warto…
Odpowiedź: Należy skorzystać z metod obiektu Gdk::Screen, get_width() oraz get_height().
Przykład:
//Program wypisujący na standardowym wyjściu rozdzielczość ekranu
//Kompilacja: g++ `pkg-config gtkmm-2.4 –cflags –libs` nazwa_pliku
#include
#include
int main(int argc, char *argv[]) {
Gtk::Main kit(argc, argv);
Glib::RefPtr
if (!screen) { //Jeśli sie cos nie powiodło…
std::cout << "Error!" << std::endl;
return -1;
}
int w = screen->get_width(); //Szerokość ekranu…
int h = screen->get_height(); //Wysokość ekranu…
std::cout << "Rozdzielczość: " << w << "x" << h << std::endl;
return 0;
}
Jeśli ktoś jeszcze nie widział, bo filmik pojawił się spory czas temu… Filmik prezentujący możliwości polskiego syntetyzatora mowy IVONA:
Terminal na pulpicie można uzyskać poprzez Tilde czy Devilspie, można również prościej za pomocą jednego z gadżetów screenlets…
Instrukcja obsługi przy założeniu że mamy zainstalowany pakiet screenlets: Ściągamy archiwum z terminalem (link z gnome-look więc mogą zdarzyć się problemy…), instalujemy za pomocą menadżera screenlets, uruchamiamy, konfigurujemy według upodobań i cieszymy się w pełni funkcjonalnym terminalem na pulpicie…
Gtk::Table jest klasą służącą upakowaniu większej ilości widgetów w “regularny wzór” a’la tabela, mającą zastosowanie w głównej mierze przy projektowaniu wszelkiego rodzaju formularzy. Postaram się krótko przedstawić filozofie upakowywania widgetów za pomocą tego kontenera oraz samą klasę.
Table (guint n_rows=1, guint n_columns=1, bool homogeneous=false)
Konstruktor domyślnie tworzy kontener o pojemności identycznej jak Gtk::Bin, a nie to jest zadaniem tego kontenera. Pierwsze 2 argumenty to liczba wierszy oraz kolumn tabeli. Zmianę rozmiaru tabeli umożliwia metoda resize.
3 argument decyduje czy przestrzeń tabeli zostanie równo podzielona na wszystkie komórki. Późniejszej zmiany tej właściwości, podobnie jak w przypadku innych kontenerów, możemy dokonać za pomocą metody set_homogeneous.
Widgety rozmieszczamy za pomocą metody attach:
attach (Widget& child, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach, AttachOptions xoptions=FILL|EXPAND, AttachOptions yoptions=FILL|EXPAND, guint xpadding=0, guint ypadding=0)
Pierwszym argument to naturalnie referencja do widgetu który chcemy dodać do tabeli. Kolejne 4 argumenty podzielone w pary określają prostokątny obszar będący miejscem przeznaczonym dla dodawanego widgetu.
Pozycja lewego, górnego rogu obszaru to para (left_attach, top_attach), a współrzędne dolnego, prawego rogu określane są przez argumenty (right_attach, bottom_attach). Przy czym należy zwrócić uwagę, szczególnie początkującym programistą, że współrzędne lewego górnego rogu tabeli to (0, 0) a nie (1, 1). Kilka przykładów pokazujących zależność między wartościami 4 omawianych argumentów, a pozyjcą i rozmiarem dodawanego widgetu w tabeli (2, 2):
Kolejno: attach(widget, 0, 1, 0, 1), attach(widget, 0, 1, 1, 2), attach(widget, 0, 2, 1, 2), attach(widget, 0, 2, 0, 2)
Kolejne 2 argumenty to flagi pozwalające decydować o dodatkowych opcjach rozmieszczenia takich jak rozszerzanie się widgetu wraz z rozszerzaniem się okna czy rozszerzenie kosztem wewnętrznego marginesu (padding). Po dokładniejsze informacje odsyłam do dokumentacji gtkmm.
Pozostałe argumenty określają wartość, wyrażoną w pikselach, wewnętrznego marginesu obszaru zajmowanego przez widget.
Ponad wyżej wymienionymi parametrami rozmieszczenia możemy również decydować o odległościach między pojedynczymi wierszami czy kolumnami. Pozwalają nam na to metody:
Ostatnio skwar, myśleć się nie chce. Poza tym już od bardzo długiego czasu nic nie oglądałem, więc na chybił trafił wybrałem coś z całej listy kreskówek… i trafiłem na ciekawe anime pod tytułem “Death Note”.
Na tyle ciekawe że obejrzałem całą serię, choć na początku myślałem sobie: “pewnie kolejna infantylna bajka, gdzie latają dziwne stworki albo chodzi ktoś z mieczem oburęcznym na magnesie w plecach i ratuje świat…”. Ha! Myliłem się… Ale o co w Death Note chodzi ? Pozwolę sobie zacytować fragment opisu z Kreskówki.fani.pl:
Death Note opowiada o młodym geniuszu Lighcie Yagamim, który znajduje upuszczony przez shinigamiego (japoński bóg śmierci) Ryuuka tajemniczy notes. Notes ten posiada niesamowite właściwości: wpisując do niego imię oraz nazwisko osoby, której twarz znamy, ta umiera w określonych przez nas okolicznościach. Light dostrzega w nim szansę oczyszczenia świata ze wszelkiego zła. Pod pseudonimem Kira (od angielskiego killer), który nadali mu jego zwolennicy, zaczyna wprowadzać swój plan w życie. Na drodze staje mu jednak tajemniczy L – legendarny geniusz, który postrzega działania Kiry jako zwykłe morderstwa.
Sprawa o tyle ciekawa że główny bohater chcąc uniknąć złapania nakręca spiralę zbrodni wokół siebie. W swoim fanatyzmie traci skrupuły nie wahając się pozbawić życia tych którzy chcą mu stanąć na drodze. Dokładnie planuje każdy swój ruch, prowadząc “grę” z L, tym ciekawszą że sam pomaga, a później dowodzi, śledztwem w swoje własnej sprawie. Manipulować otoczeniem udaje mu się przez 6 lat, dzieląc świat na pół w ocenie tego co robi. Udaje mu się nawet doprowadzić do tego że “próba złapania Kiry” karana jest śmiercią. Lecz sam w całym ciągu zdarzeń nie zauważa staje się zwykłym seryjnym mordercą…
Osobiście, cóż tu dużo mówić, nigdy nie oglądałem tak “inteligentnego” anime… Dla zainteresowanych całą serie można obejrzeć na Kreskówki.fani.pl…