Archiwum kategorii 'gtkmm'

FAQ: Odczyt praw dosępu do pliku w giomm

Odczyt praw dostępu realizujemy, analogicznie jak w przypadku innych atrybutów pliku, poprzez metode get_attribute_boolean z klasy Gio::FileInfo przekazujać w parametrze ciąg znaków z nazwą atrybutu który nas interesuje.

W przypadku praw dostępu do pliku będzie to access::can-rename, access::can-delete, access::can-trash, access::can-read, access:can-write, access::can-execute oznaczające kolejno prawo do zmiany nazwy pliku, usunięcia, przeniesienia do kosza, odczytu z pliku, zapisu do pliku i uruchomienia. Wartość zwrócona przez tą metode odpowiada danemu prawu do pliku użytkownika który uruchomił aplikacje.

Przykład aplikacji sprawadzącej prawa dostępu do pliku z ścieżki podanej w prametrze…

#include <iostream.h>
#include <giomm.h>

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

    Gio::init ();

    if (argc <= 1) {
        std::cout << "Niepodano pliku...\n";
        return -1;
    }

    Glib::RefPtr<Gio::File> f = Gio::File::create_for_path (argv[1]);
    if (f)
    {
        Glib::RefPtr<Gio::FileInfo> info = f->query_info ();

        std::cout << "Mogę zmieniać nazwe ?    \t" << info->get_attribute_boolean ("access::can-rename") << std::endl;
        std::cout << "Mogę usunąć ?            \t" << info->get_attribute_boolean ("access::can-delete") << std::endl;
        std::cout << "Mogę przenieść do kosza ?\t" << info->get_attribute_boolean ("access::can-trash") << std::endl;
        std::cout << "Mogę odczytać zawartość ?\t" << info->get_attribute_boolean ("access::can-read") << std::endl;
        std::cout << "Mogę zapisywać do pliku ?\t" << info->get_attribute_boolean ("access:can-write") << std::endl;
        std::cout << "Mogę wykonywać plik ?    \t" << info->get_attribute_boolean ("access::can-execute") << std::endl;
    }

    return 0;
}

Kompilacja:

g++ `pkg-config giomm-2.4 –cflags –libs`

GGArchivesView v0.1

ggarchivesview_screenProgram służący do przeglądania zawartości plików archives.dat czyli plików będących archiwum wiadomości oficjalnego klienta protokołu Gadu-Gadu dla Linuksa i podobnych. Napisany w przeciągu 3 dni, w C++ przy użyciu owoców wiedzy Andrzeja Szombierskiego w postaci napisanej przez niego klasy do obsługi tego formatu (opublikowanej na licencji GPL) oraz gtkmm do budowy interfacu. Program testowany na archiwum z wersji 6 klienta Gadu-Gadu, na Ubuntu 8.04.

Instalacja:

  • Wypakowujemy i przechodzimy do katalogu z źródłem
  • ./autogen.sh
  • ./configure
  • make
  • sudo make install
  • Odpalamy: ggarchivesview

Pobierz źródła GGArchivesView v0.1

Dywan Sierpińskiego

Może przytoczę fragment Wikipedii:

Dywan Sierpińskiego to fraktal otrzymany z kwadratu za pomocą podzielenia go na dziewięć (3×3) mniejszych kwadratów, usunięcia środkowego kwadratu i ponownego rekurencyjnego zastosowania tej samej procedury do każdego z pozostałych ośmiu kwadratów.

Poniżej prezentuje owoce prac powstałych z chwilowego “natchnienia” do grafiki: program napisany przy użyciu bibliotek Gtkmm (interface) i Cairo (rysowanie) w C++ generujący krzywą (sic!) nazywaną “Dywanem Sierpińskiego” – na cześć polskiego matematyka, Wacława Sierpińskiego.

Programik powstał w jedna nockę i 1/5 przedpołudnia, z czego większość kodu to interface… Co do algorytmu plecenia dywanu to jest on autorstwa własnego, między innymi stąd ta pewna niedokładność. W planach mam dodanie kilku funkcjonalności podrzuconych mi przez pewną osobę. Poniżej prezentuje kilka screenów:

Poza sesją: Najlepsze jest to że pole tego fraktala wynosi 0…

Pobierz kod źródłowy (z chomikuj.pl)

FAQ: Pobieranie listy zarejestrowanych typów MIME w giomm

Aby pobrać listę zarejestrowanych typów MIME należy posłużyć się funckją oferowaną przez przestrzeń nazw Gio,  a mianowicie content_types_get_registered.

Przykład programu wypisującego liste typów mime na standardowe wyjście:

#include
#include

int main(int argc, char *argv[]) {
    Gio::init(); //Inicjujemy Giomm

    std::list mime_types = Gio::content_types_get_registered(); //Lista typow mime
    //Wypisujemy liste
    for (std::list::iterator iter = mime_types.begin(); iter != mime_types.end(); ++iter) {
        std::cout << *iter << std::endl; 
    }   

    return 0;
}

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();
}

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;
}

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