Archiwum dla lipiec, 2008

[30.07.2008] Pulpit

Mały porządek przed moim wyjazdem wakacyjnym:

Własna zakładka strony w Gtk::Notebook

Efekt o którym mowa...

Efekt o którym mowa...

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 – nie zapomnij dołączyć…
//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 = close_btn.get_modifier_style();
    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();
}

Emacs vs Vi by RMS

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… ;)

FAQ: Jak pobrać rozdzielczość ekranu w gtkmm?

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 screen = Gdk::Screen::get_default(); //RefPtr na obiekt reprezentujący domyślny ekran…
    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;
}

To nie człowiek…

Jeśli ktoś jeszcze nie widział, bo filmik pojawił się spory czas temu… Filmik prezentujący możliwości polskiego syntetyzatora mowy IVONA:

Troche inaczej terminal na pulpicie…

Uzyskany efekt

Uzyskany efekt

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…

Rozmieszczanie widgetów za pomocą klasy Gtk::Table

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ę.

Konstruktor

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.

Rozmieszczenie widgetów w kontenerze

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.

Pozostałe opcje

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:

  • set_spacings – margines między komórkami dla całej tabeli
  • set_row_spacings – margines między wierszami tabeli
  • set_col_spacings – margines między kolumnami tabeli
  • set_row_spacing – margines dla wiersza row o wielości spacing
  • set_col_spacing – podobnie jak wyżej tylko odnosi się do kolumny

Linki

Death Note…

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