Blog (76)
Komentarze (5.3k)
Recenzje (0)

Wiele interfejsów dla jednej aplikacji, podobne interfejsy dla wielu aplikacji

@nintyfanWiele interfejsów dla jednej aplikacji, podobne interfejsy dla wielu aplikacji17.09.2014 19:28

Wprowadzenie

UWAGA: Przedstawiana biblioteka jest w fazie pre-alfa. Korzystasz na własne ryzyko

Libgreattao do biblioteka szablonów UI mojego autorstwa. Można ją uważać za połączenie wxWidgets, XUL i XSLT. Jednak w niej, to nie twórca aplikacji definiuje interfejs, a zamiast niego robią to twórcy systemu i użytkownicy. Programista jedynie publikuje zestaw dostępnych funkcjonalności i określa klasę okien. Po określeniu funkcjonalności biblioteka z użyciem szablonów dla danej klasy okna tworzy interfejs. To w szablonie są zdefiniowane widżety.

Libgreattao może korzystać z wielu backendów, lecz obecnie wspierany jest tylko dla GTK+2. W przyszłości zamierzam stworzyć dla Qt5 i ncurses.

Biblioteka nie jest jeszcze bezpieczna dla wątków. Przeznaczona jest jak narazie tylko dla 64 bitowych systemów.

Instalacja

Najpierw trzeba ściągnąć bibliotekę ze strony: http://slawek.lach.art.pl/Projekty/libgreattao.xhtml. Następnie trzeba ją skompilować.

Wchodzimy do katalogu z biblioteką, a następnie wydajemy polecenia.


make
make -C Modules/common
make -C Modules/GTK+
sudo make install
make -C Demos

Użytkowanie

W katalogu Demos są proste aplikacje napisane przy użyciu libgreattao. Jak narazie funkcjonalne są tylo dwa: edytor.o i główny.o . Dla przykładu uruchomimy główny.o .


Demos/główny.o

Aplikacja wyświetla dialog zapytania, co zrobić. Akcje są podejmowane po kliknięciu przycisku, np. Exit powoduje wyjście z aplikacji.

A teraz magia.


Demos/główny.o --tao-design modern

Teraz nasze okno ma zupełnie inny interfejs. Mamy pole wyboru i przycisk ok. Akcja jest podejmowana po kliknięciu w przycisk ok na podstawie wybranego elementu z listy wyboru.

A oto kod naszej aplikacji:


#include "../main.h"
#include "../tao_domain.h"

int integer=1;
int count = 0;
void* Window;

void callback(void *mesh, void *data)
{

if (data == (void *) 0) {

  tao_release_window(Window);
  exit(0);
}
else if (data == (void *) 1) {
   if (!fork()) {
       
           execlp("Demos/przyciski.o","Demos/przyciski.o",NULL);
	   exit(1);
   }
}
else if (data == (void *) 2) {

   if (!fork()) {
           puts("2");
           execlp("Demos/przyciski2.o","Demos/przyciski2.o",NULL);
	   exit(1);
   }
}
else if (data == (void *) 3) {
   if (!fork()) {
       
           execlp("Demos/edytor.o","Demos/list.o",NULL);
     
   }
}

}

int main(int argc, char *argv[])
{
  tao_initialize("tao demo", "Super", &argc, argv);
  Window=tao_new_window("/desktop/dialogs/question_dialog");

  tao_add_handler(Window,"/message",&callback,3);

  tao_add_handler(Window,"/actions/exit",&callback,0);
  tao_add_handler(Window,"/actions/Button1",&callback,1);
  tao_add_handler(Window,"/actions/Button2",&callback,2);
  tao_add_handler(Window,"/actions/Button3",&callback,3);

  tao_set_hint(Window,"/message", HINT_DESCRIPTION, "Który program chcesz uruchomić??");
  tao_set_hint(Window,"/actions/exit", HINT_NAME, "Exit");
  tao_set_hint(Window,NULL, HINT_NAME, "Demonstrations");
  tao_add_handler(Window,"/:abort",&callback,0);

  tao_handle_events();
};

Prawda, że mało tego kodu? Jak na aplikację oferującą dwa interfejsy jest to bardzo mało kodu. W dodatku nie ma tam żadnych widżetów.

Definiowanie własnego interfejsu użytkownika

Libgreattao szuka zestawu szablonów określonego przełącznikiem --tao-design (domyślnie mWidgets) w $HOME/.tao/common/design . Jeżeli go nie znajdzie, to szuka w /usr/tao-design . W przypadku braku możliwości załadowania plików z szablonami dla naszej klasy okna szuka go w /usr/tao-design/mWidgets.

Teraz dodamy przycisk exit dla okien zapytań w zestawie szablonów modern, ale tylko dla aplikacji dostarczających akcję exit.

  1. Tworzymy katalogi $HOME/.tao/common/design/modern
  2. Kopiujemy zawartość katalogu /usr/tao-design/modern do $HOME/.tao/common/design/modern
  3. Otwieramy plik $HOME/.tao/common/design/modern/desktop/dialogs/question_dialog Plik powinien mieć zawartość, jak poniżej, po czym zapisujemy go

<root>

<label dir-for="label" path="/message" />
<label dir-for="description" path="/message" />

<custom:select>
<template path="/actions/*">
<custom:select-item>
<attr-connect name="label" function="last-dir" />
<handler>
<var name="path" action="change" function="path" />
</handler>
</custom:select-item>
</template>
</custom:select>
<hbox>
<button label="ok">
<handler>
<call var="path" />
</handler>
</button>
<template path="/actions/exit">
<button label="cancel" dir-for="label,event" />
</template>
</hbox>
</root>

W pliku mamy cztery szablony. Dwa dla funkcji /message, które pozwalają wyświetlić nazwę /message i jej opis. Jeden jest dla akcji(/actions/*) i powoduje on, że akcje będą wyświetlane w menu rozwijalnym. Jeżeli spojrzeć na definicję tej klasy okna w zestawie szablonów mWidgets, zauważymy, że były tam definiowane przyciski. W dodatku w klasie dla mWidgets przyciski były połączone z domyślnym zdarzeniem dla przycisków. Tutaj mamy dwa handlery. Jeden zapisuje nam do zmiennej ostatnio wybraną akcję, a drugi(dla przycisku ok) wywołuje ostatnio wybraną akcję na podstawie tej zmiennej. Ostatnim szablonem jest szablon dla przycisku. Przycisk ten będzie wywoływał domyśne zdarzenie dla /actions/exit po kliknięciu. Domyślnie będzie mieć labelkę cancel, lecz to programista będzie mógł zmienić, gdyż w atrybucie dir-for jest wartość label.

Interaktywna powłoka

Libgreattao pozwala na korzystanie z programów w trybie interaktywnej powłoki. Powłoka jak na razie jest bardzo prosta. Prawdę pisząc nie pozwala ona na tworzenie zmiennych.

Aby uruchomić program w trybie interaktywnej powłoki, używamy przełącznika --tao-shell-interactive.

Teraz uruchomimy nasz główny w trybie interaktywnej powłoki i wywołamy na pierwszym oknie klasy /desktop/dialogs/question_dialog akcję /actions/exit .


run /desktop/dialogs/question_dialog[1] /actions/exit

To już wszystko na dzisiaj.

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.