Manuale di Kommander
Manuale di Kommander
Avanti

Manuale di Kommander

Marc Britton

Tamara King

Eric Laffoon

Traduzione del documento: Samuele Kaplun
Revisione 3.2.90 (2004-05-03)

È concesso il permesso di copiare, distribuire ovvero modificare questo documento sotto i termini della GNU Free Documentation License, versione 1.1 o qualsiasi versione successiva pubblicata dalla Free Software Foundation; con nessuna sezione invariante, con nessun testo di copertina anteriore e con nessun testo di copertina posteriore. Una copia di questa licenza è inclusa nella sezione intitolata "GNU Free Documentation License".

Kommander è un insieme di strumenti che ti permettono di creare finestre di dialogo GUI dinamiche che generano, in base al loro stato, un pezzo di testo. Il pezzo di testo può essere una riga di comando per un programma, qualsiasi pezzo di codice, documenti di affari che contengono tante ripetizioni o testi di modelli e così via. Il testo generato risultante può essere eseguito come un programma a linea di comando (da qui il nome “Kommander”), scritto in un file, passato ad uno script per un'elaborazione estesa e letteralmente qualsiasi altra cosa tu possa pensare. La parte migliore di tutto ciò? Non devi scrivere una singola riga di codice!


Capitolo 1. Introduzione
Introduzione
Indietro
Avanti

Introduzione

Eric Laffoon

Traduzione del documento: Samuele Kaplun

Kommander è uno strumento di sviluppo visuale di finestre di dialogo che possono essere espanse fino a creare applicazioni dotate di finestre principali complete. L'obiettivo primario è di creare software nella maniera più efficace senza l'utilizzo di alcun linguaggio di scripting. Ciò si realizza grazie alle seguenti funzionalità:

  • I comandi speciali sono prefissati da una “@” come in @widgetText. Sono così fornite caratteristiche speciali come il valore di un widget, le funzioni, gli alias, le variabili globali e così via.

  • L'integrazione con DCOP permette alle finestre di dialogo create con Kommander di controllare ed essere controllate nella loro interazione con le altre applicazioni di KDE. È una funzionalità molto potente!

  • I segnali e gli Slot sono un po' meno intuitivi per un nuovo utente. Stiamo revisionando per il prossimo rilascio la maniera in cui vengono gestiti. Offrono un limitato modello ad eventi per quando un pulsante viene premuto od un widget viene cambiato. Sono piuttosto potenti se combinati con “Population Text”.

La caratteristica principale delle finestre di dialogo di Kommander è che puoi collegare del testo (Testo Kommander) ad un widget. Se hai, per esempio, @widget1 e @widget2 che sono delle caselle di testo puoi impostare Kommander in maniera tale che visualizzi il loro contenuto inserendo @widgetText nella loro area Testo Kommander. Potrai poi digitare "ciao" in @widget1 e "mondo" in @widget2. Un pulsante potrà poi avere la stringa "Il mio primo programma @widget1 @widget2 in Kommander". Se lanci questa finestra di dialogo da un terminale stamperà "Il mio primo programma ciao mondo in Kommander"

Con qualche speranza stai colo cominciando a scoprire un barlume del potenziale di Kommander. Kommander permette un modello di progettazione molto più rapido per semplici applicazioni perché ti costringe più a pensare al linguaggio, ma ti riporta al molto più semplice e naturale modello a concetti. Nei computer il linguaggio è un mezzo per definire concetti e in quanto tale è uno strato tra i concetti e la loro implementazione che può quindi ostacolare il progresso con tutti i suoi dettagli. Kommander cerca di minimizzare questo strato.

Kommander, inoltre, cerca di basarsi sugli standard. È costruito a partire dell'infrastruttura del Designer di Qt™ e crea dei file *.ui che rinomina in *.kmdr. Può facilmente importare qualsiasi widget di KDE e ciò può avvenire senza dover ricompilare Kommander, grazie ai plugin.

L'altro fattore significativo di Kommander è come indirizza le richieste del linguaggio. I linguaggi dei computer possono essere meravigliosi ma tendono ad avere i propri dogmi e i propri zeloti che cercano, spesso, di fornire un progresso alla progettazione GUI in un ambiente integrato di sviluppo. L'accettazione di questo tipo di IDE è ironicamente limitata dal numero di persone che vogliono adottare un nuovo linguaggio per guadagnare l'accesso alle funzionalità desiderate. È veramente poco ragionevole aspettarsi dalle persone il bisogno di passare attraverso una dozzina di linguaggi diversi per accedere ai diversi insiemi di funzionalità. Rimanendo neutrale ai linguaggi e permettendo ad una finestra di dialogo di Kommander di essere estesa utilizzando qualsiasi linguaggio di scripting, Kommander si colloca in una posizione unica per l'adozione a larga scala. Diversi linguaggi di scripting possono essere usati in una singola finestra di dialogo e altre persone possono prendere il controllo di una applicazione utilizzano un differente linguaggio rispetto a quello originale dello sviluppatore e gradualmente convertirla ed estenderla. Nuovi widget e funzionalità possono istantaneamente essere controllate da tutti i linguaggi disponibili.

Speriamo che Kommander inizi ad avere il supporto degli sviluppatori e il riconoscimento necessario per raggiungere il potenziale che vuole offre. Il nostro obiettivo finale è quello di rendere Kommander utile agli utenti principianti nell'estendere ed unire le loro applicazioni. Contemporaneamente, dovrebbe diventare un buono strumento per creare prototipi. Inoltre apre le porte alle promesse dell'open source in una nuova maniera. Sappiamo che le tutte persone possono estendere i nostri programmi GPL, ma in pratica ben poche ne hanno la capacità. Con Kommander questo numero vedrà un grandissimo incremento! Alcune applicazioni possono essere molto più logiche se pensate come applicazioni di Kommander. Lo usiamo già in quelle aree di Quanta Plus dove vogliamo permettere l'estensibilità.

Speriamo che ti diverta con Kommander. Per favore, aiutaci con la segnalazione degli errori e con finestre di dialogo di esempio, così come con qualsiasi richiesta tu possa avere. Puoi unirti alla nostra lista per utenti per aiutare lo sviluppo di applicazioni con Kommander su http://mail.kdewebdev.org/mailman/listinfo/kommander

I più cordiali saluti dalla squadra di sviluppo di Kommander!

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Capitolo 2. Basi di Kommander
Basi di Kommander
Indietro
Avanti

Basi di Kommander

Tamara King

Eric Laffoon

Traduzione del documento: Samuele Kaplun

Concetti

Kommander è stato sviluppato in origine attorno ad un semplice concetto che si è rivelato in parte rivoluzionario tra gli strumenti di progettazione visuale. Questi strumenti permettono tipicamente di creare finestre di dialogo e, se possibile, interfacce delle finestre principali. Una interfaccia della finestra principale è chiaramente la finestra principale del programma che possiede generalmente menu, barre degli strumenti, la barra di stato e l'area dell'applicazione. Le finestre di dialogo sono finestre figlie che in genere non hanno meni e sono chiamate così perché il loro scopo è “intraprendere un dialogo” o scambiare informazioni tra te e l'applicazione principale. Gli elementi su una finestra di dialogo sono chiamati “widget” ed il tuo programma è collegato a loro. Kommander è differente perché in questo caso non è di per sé programmabile. Sfrutta il concetto di associare il testo con il widget sulla finestra di dialogo. All'inizio questo era chiamato “Testo Associato” ma ora il suo nome è “Testo di Kommander”. I widget sulle finestre di dialogo di Kommander possono includere il contenuto degli altri widget attraverso un riferimento ed un widget può far riferimento al proprio contenuto utilizzando un“Comando Speciale” che appare così: @widgetText. I comandi speciali sono comandi con un significato speciale in Kommander. Così se crei una finestra di dialogo con due LineEditWidget e chiami il primo “PrimoNome” ed il secondo “UltimoNome” puoi creare un pulsante ed impostare il suo Testo di Kommander a “Il mio nome è @PrimoNome @UltimoNome”. Dovresti impostare @widgetText nel widget del primo nome ed ultimo nome. Ricordi? Abbiamo bisogno di dire a Kommander di far riferimento al testo al loro interno. Puoi eseguire ciò da una Konsole e stamperebbe in output la stringa per te. Perciò farebbe riferimento al primo nome in questo mode: @PrimoNome -> ottieni il widget chiamato PrimoNome(@PrimoNome) -> @widgetText -> ottieni il contenuto del widget LineEdit. Quindi in questo caso @PrimoNome restituisce “Eric”: @PrimoNome -> @widgetText -> “Eric”.

Questo è il semplice nucleo di Kommander. Il suo utilizzo è la parte interessante. Prima di tutto è importante notare che, confrontato con il normale approccio ad uno strumento basato sul linguaggio, Kommander non ha bisogno di istruzioni di programmazione per definire queste operazioni. Ciò lo rende rapido per gli sviluppatori. Per l'utente finale è molto più semplice che imparare i costrutti di un linguaggio. A tutti, permette di concentrarsi sul proprio compito invece di avere materiale di riferimento eternamente in mano. All'inizio, quando si scopre uno strumento come Kommander la prima domanda è “Quale utilizzo posso trovare per questo stupendo strumento?” Come risulta evidente, manipolare stringhe è usato praticamente ovunque.

Perciò cosa può fare Kommander? Questa è la lista ridotta alle operazioni di base. Kommander può:

  1. Passare le stringhe al programma chiamante attraverso lo stdout.

  2. Richiamare programmi eseguibili.

  3. Utilizzare DCOP per interagire con i programmi KDE

Se non sei un programmatore, ecco la spiegazione in linguaggio profano. Nel primo caso, se lanci Kommander da un terminale, il terminale è il programma chiamante. C'è qui una relazione genitore-figlio. Spedire un messaggio al terminale avviene attraverso lo standard output (stdout) del programma figlio, chiamato così perché esiste anche l'error output. Ciò è interessante perché alcuni programmi come Quanta Plus utilizzano lo standard output per ricevere informazioni dai programmi che lanciano. Le finestre di dialogo di Kommander, quindi, possono stampare in output le loro stringhe di testo direttamente nell'editor di Quanta Plus se sono state chiamate da Quanta Plus. Questo significa che le finestre di dialogo di Kommander possono essere delle utili estensioni ai programmi.

Il secondo caso concerne il richiamare un eseguibile. Qualsiasi programma che giri sul tuo sistema è un eseguibile. Persino un programma script è eseguito dall'interprete dello script, perciò è anche lui tecnicamente eseguito. Kommander può eseguire comandi proprio come con il terminale, anche se lo richiami dal menu. Così, se volessi, per esempio, che apra The GIMP dovresti derivare da un pulsante la stringa “gimp” e dovresti metterlo in un comando speciale come in questo caso: @exec(gimp). Come potrai vedere si aprirà The GIMP quando lo utilizzerai. Puoi persino eseguire “ls -l” ma ne vedresti l'output solamente se tu lo lanciassi da un terminale.

Il terzo caso è in effetti molto interessante. DCOP è un'abbreviazione per Protocollo di COmunicazione del Desktop di KDE ed è molto potente. Prosegui lanciando il programma kdcop per esplorarlo. Potrai rapidamente vedere che ogni applicazione di KDE che è stata progettata secondo gli standard ha le sue azioni enumerate in DCOP e quelle ben disegnate ne hanno proprio tante. Con DCOP puoi richiedere delle informazioni di tutti i tipi così come impostare i valori dei widget e molto altro. C'è una sezione sull'utilizzo di DCOP in questo manuale. Kommander può spedire messaggi DCOP a qualsiasi programma KDE così come può essere controllato attraverso DCOP. In realtà puoi spedire messaggi DCOP dalla linea di comando a tutti i programmi KDE. Perciò qual è il grande vantaggio? Il vantaggio è che se devi eseguire una grande quantità di comandi comincerai a realizzare che la linea di comando DCOP è adeguata solamente per eseguire brevi comandi, ma può causare ritardi se richiamata per esempio in un ciclo diverse centinaia di volte. Questo è il motivo per cui Kommander ha un comando speciale @dcop, perché è quasi 1000 volte più veloce. Dato che Kommander può spedire e ricevere messaggi DCOP, DCOP può essere utilizzato per programmare come uno script Kommander. Questo è il motivo per cui esiste anche un comando speciale DCOP locale, @ldcop, che ti permette di digitare molto di meno per lanciare un comando.

Sono questi tutti i concetti centrali di Kommander? No, ma dovrebbero aiutarti a comprendere il senso di come funziona così che quello che viene spiegato non ti sembri una lingua straniera. Ce n'è ancora qualcuno. I segnali e gli slot sono il mezzo attraverso cui Kommander gestisce gli eventi. Un evento in un programma significa in parole povere che “qualcosa è accaduto”, come la creazione di un widget o la modifica del suo testo. Questi cambiamenti “emettono segnali” e tu puoi connettere questi segnali ad uno slot ricevente che farà qualcosa quando l'evento accadrà. Uno degli utilizzi in Kommander è il fratello di Kommander Text, “Population Text”. Population Text popolerà un widget quando verrà chiamato. Proprio come in Kommander Text, Population Text può contenere stringhe o script.

Tutto questo dovrebbe fornirti i concetti di base per cominciare ad utilizzare Kommander. Cerchiamo di mantenere basso il numero di comandi Speciali e utilizziamo molto DCOP. L'idea è quella di mantenere la potenza di Kommander la più consistente e snella possibile. Scoprirai di potere incorporare qualsiasi linguaggio script in Kommander ovunque tu ne abbia bisogno e persino più linguaggi in una sola finestra di dialogo. Il resto delle informazioni in questo documento assumono che tu sia familiare con i concetti ed i termini presentati qui. Gli esempi ed i tutorial sono inoltre molto utili per comprendere che cosa possa essere fatto con Kommander.

L'Editor
L'Editor

L'Editor

Tamara King

Traduzione del documento: Samuele Kaplun

L'editor è basato su Qt™ Designer, uno strumento per disegnare ed implementare interfacce utente create da Trolltech. Abbiamo modificato Qt™ Designer nei seguenti punti:

  • La sua interfaccia è molto più semplice

  • Costruito sui nostri widget

  • Aggiunta la capacità di impostare il Testo Kommander

  • Diverse altre modifiche superficiali

Se siete familiari con Qt™ Designer, l'utilizzo di Kommander Editor sarà banale.

Finestra principale



  1. Le barre degli strumenti contengono diversi pulsanti che forniscono un rapido accesso a diverse funzioni.

  2. La Panoramica dei File mostra tutti i file. Utilizza il campo di ricerca per passare rapidamente da un file all'altro.

  3. L'Esploratore di Oggetti fornisce una panoramica delle relazioni tra i widget in un modulo. È utile per selezionare i widget di un modulo con uno schema complesso.

  4. Nell'Editor di Proprietà si può modificare il comportamento e l'aspetto di un widget.

  5. Nell'Editor di Finestre di Dialogo puoi creare e modificare finestre di dialogo.

Il menu File

File->Nuovo (Ctrl+N)

Crea una nuova finestra di dialogo

File->Apri (Ctrl+O)

Sfoglia il file system per aprire una finestra di dialogo esistente

File->Chiudi

Chiude la finestra di dialogo attiva

File->Salva (Ctrl+S)

Salva la finestra di dialogo attiva

File->Salva con nome

Salva la finestra di dialogo attiva con un nuovo nome

File->Salva tutti

Salva tutte le finestre di dialogo aperte

File->File aperti recentemente

Lista rapida di parte degli ultimi file che hai aperto. Questa lista cambierà ogni volta che apri un file che non si trova al suo interno, facendo uscire per prima il più vecchio.

File->Esci

Chiude Kommander

Il menu Modifica

Modifica->Annulla (Ctrl+Z)

Annulla l'ultima azione effettuata.

Edit->Rifai (Ctrl+Y)

Ripete l'ultima azione annullata.

Modifica->Taglia (Ctrl+X)

Taglia l'elemento corrente e depone il suo contenuto nella clipboard.

Modifica->Copia (Ctrl+C)

Copia l'elemento corrente nella clipboard.

Modifica->Incolla (Ctrl+V)

Incolla il contenuto della clipboard alla posizione attuale del cursore.

Modifica->Elimina (Del)

Elimina l'elemento corrente.

Modifica->Seleziona tutto (Ctrl+A)

Seleziona tutti gli elementi della finestra di dialogo corrente.

Modifica->Controlla i tasti acceleratori (Alt+R)

Verifica che tutti i tasti acceleratori siano usati solo una volta.

Modifica->Oggetti script (Alt+S)

Modifica->Slot...

Visualizza una finestra per la modifica e la creazione degli slot e delle funzioni.

Modifica->Connessioni

Visualizza la finestra di dialogo di visualizzazione e modifica delle connessioni.

Modifica->Impostazioni modulo...

Visualizza la finestra di dialogo delle impostazioni del modulo.

Modifica->Preferenze...

Visualizza le preferenze della finestra di dialogo.

Il menu Strumenti

Strumenti->Puntatore (F2)

Strumenti->Connetti segnale/slot (F3)

Strumenti->Ordine delle schede (F4)

Strumenti->Kommander
Strumenti->Kommander->Label

Strumenti->Kommander->PixmapLabel

Strumenti->Kommander->ListView

Strumenti->Kommander->ListBox

Strumenti->Kommander->SubDialog

Strumenti->Kommander->TabWidget

Strumenti->Kommander->LineEdit

Strumenti->Kommander->ExecButton

Strumenti->Kommander->CloseButton

Strumenti->Kommander->FileSelector

Strumenti->Kommander->TextEdit

Strumenti->Kommander->RadioButton

Strumenti->Kommander->ButtonGroup

Strumenti->Kommander->GroupBox

Strumenti->Kommander->CheckBox

Strumenti->Kommander->ComboBox

Strumenti->Kommander->SpinBoxInt

Strumenti->Kommander->RichTextEditor

Strumenti->Kommander->TreeWidget

Strumenti->Kommander->Unknown

Strumenti->Kommander->Wizard

Strumenti->Personalizzati
Strumenti->Personalizzati->Modifica oggetti personalizzati

Il Menu Schema

Schema->Ridimensiona (Ctrl+J)

Schema->Disponi orizzontalmente (Ctrl+H)

Schema->Disponi verticalmente (Ctrl+L)

Schema->Disponi in una griglia (Ctrl+G)

Schema->Disponi orizzontalmente (nel divisore)

Schema->Disponi verticalmente (nel divisore)

Schema->Rompi lo schema (Ctrl+B)

Schema->Aggiungi Spacer

Il Menu Avvia

Avvia->Avvia finestra di dialogo (Ctrl+R)

Avvia la finestra di dialogo corrente.

Il Menu Finestra

Finestra->Chiudi (Ctrl+F4)

Chiude la finestra di dialogo corrente.

Finestra->Chiudi tutto

Chiude tutte le finestre di dialogo.

Finestra->Successivo (Ctrl+F6)

Finestra->Precedente (Ctrl+Shift+F6)

Finestra->Affianca

Finestra->Cascata

Finestra->Viste
Finestra->Viste->Panoramica dei file

Finestra->Viste->Esploratore di oggetti

Finestra->Viste->Editor di proprietà/gestore di segnali

Finestra->Viste->Allinea

Finestra->Barre degli strumenti
Finestra->Barre degli strumenti->File

Finestra->Barre degli strumenti->Modifica

Finestra->Barre degli strumenti->Schema

Finestra->Barre degli strumenti->Strumenti

Finestra->Barre degli strumenti->Kommander

Finestra->Barre degli strumenti->Personalizzati

Finestra->Barre degli strumenti->Aiuto

Finestra->Barre degli strumenti->Allinea

Il menu Aiuto

Aiuto->Indice... (F1)

Invoca il sistema di aiuto di KDE direttamente alle pagine del manuale di Kommander (questo documento).

Aiuto->Che cos'è? (Shift+F1)

Cambia il cursore del mouse in una freccia e un punto di domanda. Se fai clic su un oggetto all'interno di Kommander si aprirà una finestra di aiuto (se ne esiste una per quel particolare oggetto) che spiega la funzione dell'oggetto in questione.

Aiuto->Segnala un bug...

Apre la finestra di segnalazione dei bug dove puoi segnalare un bug oppure esprimere un “desiderio”.

Aiuto->Informazioni su Kommander

Mostra informazioni sulla versione e sull'autore.

Aiuto->Informazioni su KDE

Mostra la versione di KDE e altre informazioni di base.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

L'Esecutore
L'Esecutore

L'Esecutore

L'esecutore, chiamato kmdr-executor, lancia gli script di Kommander. Carica il file .kmdr e costruisce dinamicamente una finestra di dialogo completamente funzionante.

L'Esecutore per i Programmatori

Gli sviluppatori C++ possono facilmente utilizzare la classe KmdrDialogInstace nei loro programmi C++ così che la funzionalità di esecuzione sia inclusa nelle loro applicazioni rendendo inutile il bisogno di lanciare un programma esecutore esterno. Per finestre di dialogo standard il carico della creazione delle finestre di dialogo è minimo ma la creazione dell'applicazione KDE potrebbe ritardare la finestra di dialogo per circa un secondo.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Creare una Finestra di Dialogo
Creare una Finestra di Dialogo

Creare una Finestra di Dialogo



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Capitolo 3. Guida ai Comandi
Guida ai Comandi
Indietro
Avanti

Guida ai Comandi

Traduzione del documento: Samuele Kaplun

Widget

Traduzione del documento: Samuele Kaplun

I widget sono i mattoni che costituiscono una finestra di dialogo di Kommander. Sono come qualsiasi altro widget nelle librerie Qt™ e KDE eccetto il fatto che possiedono alcune funzionalità aggiuntive che gli permettono di mantenere delle “associazioni di testo”. Il testo viene associato ad uno stato del widget o al suo slot di popolamento. Il numero di stati dipende dal widget. Se un widget possiede un singolo stato, quello stato è chiamato default.

Widget di testo bla bla

La finestra di dialogo possiede due stati speciali per il testo di Kommander: Initiate e Destroy. Questi vengono eseguiti quando la finestra di dialogo viene inizializzata e quando viene distrutta. Essi proteggono da quelli che vengono chiamati problemi di “corsa” durante l'apertura e significano che non devi richiedere nessuna speciale procedura alla chiusura per gestire le operazioni ausiliarie.

ButtonGroup

Un contenitore per organizzare pulsanti in un gruppo. Si può impostare un titolo opzionale utilizzando la proprietà title. La cornice può essere regolata tramite la proprietà lineWidth. Il gruppo di pulsanti può essere impostato in modalità esclusiva impostando a vero la proprietà exclusive. Ciò significa che quando si fa clic su un pulsante alternato tutti gli altri pulsanti alternati saranno deselezionati con l'eccezione dei pulsanti radio che sono sempre mutuamente esclusivi anche quando il gruppo è non-esclusivo. I pulsanti radio possono essere impostati a non-esclusivi utilizzando la proprietà radioButtonExclusive. (Non sono al momento sicuro che questa proprietà funzioni.)

ButtonGroup possiede un unico stato, default.

Il testo del widget di un ButtonGroup è l'associazione di tutti i testi dei pulsanti nell'ordine in cui appaiono all'interno del GruppoDiPulsanti.

CheckBox

Un pulsante che può essere marcato o meno. Può inoltre essere semi-marcato se la proprietà tristate è impostata a vero. L'etichetta associata alla CheckBox è impostata tramite la proprietà text. Attivando la proprietà checked la CheckBox sarà inizialmente marcata.

Una CheckBox ha 3 stati: checked, semichecked e unchecked.

Il testo del widget di una CheckBox è il valore della proprietà text.

CloseButton

Un pulsante che, al clic del mouse, esegue la proprio associazione di testo e quindi chiude la finestra di dialogo. L'etichetta del pulsante viene impostata con la proprietà text. L'output dell'associazione di testo sarà stampata sullo stdout se la proprietà writeStdout è vera. Il pulsante può essere l'azione di default della finestra di dialogo se la proprietà default è impostata a vero.

Il CloseButton possiede un unico stato, default.

Non c'è alcuna associazione del testo del widget in un CloseButton.

ComboBox

Una ComboBox è un widget di selezione che combina un pulsante ed un menu a cascata. Mostra la selezione corrente dell'utente da una lista di opzioni in uno spazio minimale. Gli elementi sono aggiunti alla lista utilizzando la finestra di edit. Se la proprietà editable è vera l'utente può inserire stringhe arbitrarie.

Una ComboBox possiede un unico stato, default.

Il testo del widget di una ComboBox è il testo dell'elemento selezionato.

ExecButton

Un pulsante che esegue, quando premuto, la sua associazione di testo. L'etichetta sul pulsante viene impostata tramite la proprietà text. L'output dell'associazione di testo viene stampato sullo stdout se la proprietà writeStdout è attiva. Il pulsante può rappresentare l'azione predefinita di una finestra di dialogo se la proprietà default è attiva.

Un ExecButton possiede un unico stato, default.

Non c'è un'associazione di testo del widget in un ExecButton.

FileChooser

Il widget FileChooser combina una LineEdit con un pulsante che, se premuto, presenterà all'utente una finestra di dialogo per la selezione di file/cartelle. Il file/cartella selezionata viene memorizzato nella LineEdit. Il tipo di FileChooser viene impostato con la proprietà selectionType. I tipi disponibili sono Open, Save e Directory. Si possono selezionare file/cartelle multiple se la proprietà selectionOpenMultiple è impostata a vero. Si può impostare una didascalia per il FileChooser con la proprietà selectionCaption. Questa verrà visualizzata come il titolo della finestra di dialogo. Se non viene specificata alcuna didascalia, verrà visualizzato come titolo il tipo di selezione. I file visualizzati nella finestra di dialogo possono essere limitati tramite la proprietà selectionFilter.

Un FileChooser possiede un unico stato, default.

Il testo del widget di un FileChooser è il testo contenuto nella LineEdit (il file scelto dall'utente).

GroupBox

Un widget contenitore di altri widget. La cornice può essere regolata con la proprietà lineWidth. Si può aggiungere un titolo impostando la proprietà title.

Un GroupBox possiede un unico stato, default.

Il testo del widget di un GroupBox è l'associazione del testo di ognuno dei widget che contiene. Le associazioni saranno nell'ordine in cui i widget appaiono all'interno del BoxGruppo.

LineEdit

Un widget LineEdit è un editor di testo su una singola riga. Permette all'utente di inserire e modificare una singola linea di testo. Il testo iniziale dell'editor può essere impostato tramite la proprietà text. Il widget può essere a sola lettura agendo sulla proprietà readOnly. Esistono tre modalità per questo widget: Normal, NoEcho e Password. La modalità viene impostata tramite la proprietà echoMode.

Una LineEdit possiede un unico stato, default.

Il testo del widget di una LineEdit è il testo contenuto nell'editor.

ListBox

Un widget ListBox fornisce una lista di elementi selezionabili. Normalmente solamente un solo elemento o nessuno possono essere selezionati. Questo comportamento può essere cambiato con la proprietà selectionMode. Si aggiungono elementi alla ListBox utilizzando la finestra di edit.

Una ListBox possiede un unico stato, default.

Il testo del widget di una ListBox è l'insieme degli elementi nella ListBox. Per sapere quali sono gli elementi correntemente selezionati utilizza @selectWidgetText.

ListView

Questo widget è adesso attivato in Kommander. È funzionalmente identico al widget Albero, quindi puoi fare riferimento a quest ultimo per ulteriori informazioni.

PixmapLabel

Un widget semplice che contiene un'immagine o un'etichetta di testo. La pixmap da visualizzare viene impostata nella proprietà pixmap. Il testo viene impostato tramite la proprietà text. Solo una di queste proprietà può essere impostata contemporaneamente (Così credo: non sono, al momento, in grado di impostarle entrambe tramite l'editor). Se scaledContent è impostata a vero l'immagine verrà ridimensionata per adattarsi alle dimensioni del widget. Il formato del testo può essere impostato tramite la proprietà textFormat.

Questo widget non è abilitato in Kommander e non possiede quindi nessuno stato o testo del widget.

RadioButton

Un pulsante che può essere marcato o meno, utilizzato di solito in un ButtonGroup per avere scelte mutuamente esclusive. Si può impostare un'etichetta associata al pulsante tramite la proprietà text. Si può imporre che il pulsante venga inizialmente marcato impostando la proprietà checked a vero. Se più di un RadioButton in un ButtonGroup ha la proprietà checked impostata a vero, allora solamente l'ultimo pulsante marcato lo sarà.

Un RadioButton possiede due stati: checked e unchecked.

Non c'è un testo del widget associato ad un RadioButton.

RichTextEditor

Questo widget è un editor di testo che permette una formattazione del testo semplificata.

RichTextEditor possiede un unico stato, default.

Il testo del widget di un RichTextEditor è il testo contenuto nell'editor in formato testo arricchito. @selectedWidgetText restituisce il testo selezionato.

SpinBoxInt

Un widget che permette all'utente di modificare un valore intero sia agendo sulle frecce in su e in giù che inserendo un valore nella casella. Si possono impostare i valori minimo e massimo del widget tramite le proprietà minValue e maxValue. La proprietà specialValueText viene utilizzata per impostare un valore di testo che sarà visualizzato al posto del valore minimo.

Questo widget possiede un unico stato, default.

Il testo del widget di una SpinBoxInt è l'intero correntemente visualizzato.

SubDialog

Un pulsante che, quando premuto, esegue un'altra finestra di dialogo di Kommander. La finestra di dialogo da eseguire viene impostata nella proprietà kmdrFile. Se la proprietà default è impostata a vero, la finestra di dialogo verrà eseguita se viene premuto invio quando la finestra di dialogo possiede il focus. Penso che puoi utilizzarla anche come un contenitore. Dovrò provare a sperimentare un po' di più.

Una SubDialog possiede un unico stato, default.

Il testo del widget di una SubDialog è il testo associato alla finestra di dialogo da eseguire.

Nota

Questo widget era progettato per contenere la finestra di dialogo, funzionalità che è stata deprecata dal nuovo concetto di progetto. Dovremmo mantenerla con @dialog() con il suo testo di Kommander o rimuoverla? Così com è, non va bene.

TabWidget

Un widget che fornisce molteplici schede ognuna delle quali può contenere altri widget.

TextEdit

Un semplice editor multi-riga.

TextLabel

Un semplice widget che contiene un pezzo di testo. Questo widget ti permette anche di impostare una pixmap. OK, l'editor dice che sono entrambe QLabel. Perché abbiamo 2 widget che sembrano essere la stessa cosa ma con nomi differenti? - La correzione è pianificata in A7.

Sino ad Alpha 6 questo widget è parzialmente abilitato e può essere impostato tramite chiamate DCOP esterne.

TreeWidget

Un widget che rappresenta una lista sotto forma di una struttura ad albero. Questo widget è, ora, dalla versione Alpha 6, completamente funzionale e permette l'aggiunta e la rimozione di elementi. Puoi aggiungere elementi figlio e dati multi-colonna. Il limite corrente è che non si possono modificare le colonne. Per aggiungere un figlio utilizza “/” come separatore. Per aggiungere dati su colonna utilizza il carattere escape “\t” tra le colonne.

Comandi Speciali e Variabili Globali Integrate
Comandi Speciali e Variabili Globali Integrate

Comandi Speciali e Variabili Globali Integrate

Traduzione del documento: Samuele Kaplun

I comandi speciali sono funzioni che vengono processate da Kommander. Sappi che fino a quando Kommander non avrà un parser completo tutti i comandi speciali saranno eseguiti prima che venga eseguito lo script. In molti casi questo non è un problema, ma talvolta sì.

@dcop(appId, oggetto, funzione, argomenti)

Esegue una chiamata a DCOP. @dcop(“kmail”, “KMailIface”, “checkMail()”, “”)

@dcopid

L'id DCOP del processo (kmdr-executor-@pid)

@dialog(finestra_di_dialogo[,parametri])

Richiama la finestra di dialogo di Kommander specificata. Le finestre di dialogo sono ricercate nella cartella delle finestre di dialogo e nella cartella corrente - in quest'ordine. Ciò mette in sospeso la chiamata all'esecutore ed imposta la cartella predefinita a quella in cui si trova l'applicazione di Kommander. I parametri possono essere passati nell'usuale maniera Unix o puoi passare dei parametri per nome come in “variabile=valore”. Puoi infine recuperare i parametri passati nell'ambiente globale. @global(variabile) ritornerebbe “valore”.

@env(variabileDiAmbiente)

Viene espanso alla variabile d'ambiente specificata. @env(PWD) viene espanso a $PWD. Ricorda che “$” è parte della sintassi shell e non dovrebbe essere utilizzato.

@exec(comando)

restituisce l'output dell'esecuzione del comando specificato. @exec(ls -l).

@execBegin ... @execEnd

come in @exec, ma supporta gli script shebang (cioè che cominciano, ad esempio, con #!/bin/sh) e su più righe. Questo è utile in diversi linguaggi di scripting sia dichiarandoli o utilizzando una shebang.

  • @execBegin(php)

  • @execBegin#!/usr/bin/php

Il primo utilizza il nome dell'eseguibile PHP. Kommander cerca nel PATH php e se non lo trova verifica se è registrato con Kommander in una posizione al di fuori del tuo path. Se non è così notifica all'utente che non può essere trovato. Il secondo esempio utilizza la classica “shebang” che può portare sia benefici che alcuni problemi. È utile ad esempio, se possiedi una copia beta di PHP5 in /usr/local/bin che non deve essere trovata perché il percorso di ricerca è /usr/bin. Se, però, distribuisce la finestra di dialogo a qualcuno che ha messo PHP in /usr/local/bin questo non verrà trovato quando verrà usata la shebang. Perciò utilizzate le shebang con cautela. È invece raccomandato indicare l'eseguibile se condividete i file.

@global(variabile)

viene espanso nel valore della variabile globale specificata.

@null

Restituisce null. Ora che Kommander verifica i widget vuoti durante l'esecuzione questo comando preverrà la segnalazione errata di errori nel caso della non impostazione dello stato di un widget.

@parentPid

Il PID del processo genitore.

@pid

Il PID del processo.

@readSetting(chiave, valorePredefinito)

legge un valore da kommanderrc

@selectedWidgetText

il contenuto selezionato di un widget che può visualizzare più di un valore, come i widget lista

@setGlobal(variabile, valore)

Imposta la variabile globale al valore specificato.

@widgetText

il contenuto di un widget

@writeSetting(chiave, valore)

scrive il valore in kommanderrc

Gruppo delle Funzioni per Array

@Array.values(array)

Restituisce una lista separata da EOL di tutti i valori contenuti nell'array. Può essere utilizzato per scorrere attraverso l'array.

@Array.keys(array)

Restituisce un elenco separato da fine riga (EOL) di tutte le chiavi del vettore.

@Array.setValue(array, chiave, valore)

Imposta una chiave ed un valore per un elemento di un array. Se l'array non esiste, viene creato.

@Array.clear(array)

Rimuove tutti gli elementi dal vettore.

@Array.count(array)

Restituisce il numero di elementi nel vettore.

@Array.value(array,chiave)

Restituisce il valore associato alla chiave indicata.

@Array.remove(array,chiave)

Rimuove l'elemento con la chiave indicata dall'array.

@Array.fromString(array,stringa)

Aggiunge tutti gli elementi nella stringa nell'array. La stringa dovrebbe essere nel formato chiave\tvalore\n."

@Array.toString(array,stringa)

Restituisce tutti gli elementi nell'array nel formato chiave\t\n."

Gruppo di Funzioni per File

@File.read(file)

Restituisce il contenuto del file indicato.

@File.write(filestringa)

Scrive la stringa data su un file.

@File.append(filestringa)

Aggiunge la stringa data alla fine del file.

Gruppo di Funzioni per Stringhe

@String.length(stringa)

Restituisce il numero di caratteri nella stringa.

@String.contains(stringa,sottostringa)

Controlla se la stringa contiene la sottostringa data.

@String.find(stringa)

Restituisce la posizione di una sottostringa nella stringa, o -1 se non trovata."

Nota

Questo comando avrà un altro parametro intero opzionale indicante la posizione iniziale da cui cercare nella versione Alpha 6.

@String.left(stringa, int)

Restituisce i primi n caratteri della stringa.

@String.right(stringa, int)

Restituisce gli ultimi n caratteri della stringa.

@String.mid(stringa, int inizio, int fine)

Restituisce una sottostringa della stringa, iniziando dalla posizione data.

@String.remove(stringa, sottostringa)

Rimuove tutte le occorrenze di una data sottostringa.

@String.replace(stringa, sottostringa_trova, sottostringa_sostituisci)

Sostituisce tutte le occorrenze di una data sottostringa con un'altra fornita.

@String.upper(stringa)

Converte la stringa in maiuscolo.

@String.lower(stringa)

Converte la stringa in minuscolo.

@String.compare(stringa, stringa)

Confronta due stringhe. Restituisce 0 se sono uguali, -1 se la prima è più bassa, 1 se la prima è più alta

@String.isEmpty(stringa)

Controlla se la stringa è vuota.

@String.isNumber(stringa)

Controlla se la stringa è un numero valido.

Variabili Globali Integrate

L'accesso alle variabili globali integrate è analogo alle variabili globali regolari con @global.

@global(_KDDIR)

La cartella in cui si trova la finestra di dialogo corrente.

@global(_NAME)

Il nome della finestra di dialogo



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Funzioni DCOP
Funzioni DCOP

Funzioni DCOP

Traduzione del documento: Samuele Kaplun

DCOP può essere richiamato in Kommander in diversi modi. Il primo metodo è attraverso la console

dcop kmdr-executor-@pid KommanderIf changeWidgetText myWidget “new text

Si presume che tu ti trovi in un file Kommander ed hai accesso al comando speciale @pid che contiene l'ID del processo. Nella pratica è più semplice sostituire “kmdr-executor-@pid” con @dcopid. Per modificare la finestra di Kommander, puoi, comunque, utilizzare questa sintassi (ovviamente senza i comandi speciali) dalla linea di comando o da qualsiasi altro script esterno.

Dato che Kommander non possiede un analizzatore completo nel sua fase Alpha, usare il comando DCOP interno, molto più rapido, dalla finestra di un'altra applicazione (la console DCOP è molto lenta) è più complicato perché devi fornire molte informazioni, incluso un prototipo della chiamata. La chiamata di prima diventerebbe:

@dcop(@dcopid, KommanderIf, “enableWidget(QString, bool)”, Widget, true)

Al momento in cui questo manuale è stato scritto dovresti sapere che annidare chiamate DCOP all'interno di strutture di linguaggi di script (come bash) impone l'utilizzo dei metodi di chiamata da console. Se utilizzi il DCOP interno tutti i comandi speciali di Kommander saranno eseguiti prima dello script.

Esiste una nuova modalità semplificata di utilizzare DCOP all'interno di Kommander utilizzando una sintassi ad oggetti. Supponiamo che tu voglia cambiare il testo in un widget chiamato @LineEdit1. Si scriverebbe così.

@LineEdit1.changeWidgetText(New text)

Come puoi vedere la nuova sintassi è molto semplice quanto consistente visivamente con i gruppi di funzioni. Tutti comandi DCOP referenziati qui utilizzeranno la nuova sintassi ad oggetti indicata prima. Per favore, nota che se stai facendo riferimento ad un widget che utilizza DCOP da un'alta finestra o da un'altra applicazione, il primo parametro sarà sempre il nome del widget. Sono qui elencate tutte le funzioni a partire dal secondo parametro.

DCOP per Variabili Globali

global(QString nomeVariabile)

Restituisce il valore della variabile globale specificata. Quando uno script viene lanciato all'interno di una finestra di Kommander qualsiasi variabile (non globale) impostata in quello script cesserà di esistere una volta terminato lo script e perciò non sarà più disponibile ai processi degli altri script o in una nuova istanza del processo chiamante. Nel “contesto” globale la variabile esisterà per ogni processo od ogni finestra fino al momento in cui quella viene chiusa. Puoi modificare queste variabili in ogni momento con una nuova chiamata a @setGlobal.

setGlobal(QString nomeVariabile, QString valore)

Crea una variabile che è globale per la finestra del processo e le assegna un valore. Questo valore può essere recuperato con global(QString nomeVariabile) o reimpostato.

DCOP per tutti i Widget

changeWidgetText(QString testo)

Questo comando dovrebbe venir rinominato in setWidgetText ed il suo nome verrà probabilmente deprecato. Esso rimuove il testo visualizzato nel widget sostituendolo con il testo fornito.

enableWidget(bool abilita)

Abilita o disabilita un widget.

associatedText

Restituisce il testo associato al particolare widget. Questo non è lo stesso di quello visualizzato. Verrebbe altrimenti utilizzato con “@widgetText” o con il testo e/o script utilizzato per arrivare al valore visualizzato.

setAssociatedText(QString testo)

Imposta la stringa predefinita di Testo di Kommander. Questa è tipicamente impostata a “@widgetText” per visualizzare ciò che viene inserito nel widget. È raro che tu ne abbia bisogno, in ogni caso c'è. Viene applicato a tutti i widget che contengono informazioni.

DCOP per i Widget ListBox e ComboBox

addListItem(QString elemento, int indice)

Aggiunge un elemento ad un widget ListBox all'indice specificato. L'indice della lista comincia da zero. Per aggiungere alla fine della lista utilizzare -1.

addListItems(QStringList elementi, int indice)

Aggiunge una lista di stringhe in una sola volta. La lista dovrebbe essere delimitata da EOL (\n - a-capo). Questo comando è comodo perché puoi facilmente utilizzare bash per procurarti la lista. Utilizzando, ad esempio, @exec(ls -l ~/projects | grep kmdr) al posto degli elementi, restituirà l'elenco dei file di Kommander nella cartella dei tuoi progetti. L'indice della lista comincia da zero. Utilizza -1 per aggiungere alla fine della lista.

addUniqueItem(QString elemento)

addUniqueItem aggiungerà un elemento alla fine della lista solo se non è già presente.

clearList

Rimuove tutti gli elementi.

removeListItem(int indice)

Rimuove tutti gli elementi a partire dall'indice specificato.

item(int indice)

Restituisce il testo dell'elemento all'indice specificato.

setCurrentListItem(int indice)

Imposta l'elemento corrente (o selezionato) all'indice specificato. Si applica ai widget ListBox e ComboBox.

DCOP per i Widget CheckBox e RadioButton

setChecked(QString nomeWidget, bool attivato)

Attiva/disattiva i widget CheckBox o RadioButton.

DCOP per i Widget TabWidget

setCurrentTab(QString nomeWidget, int indice)

Seleziona la linguetta del TabWidget in base all'indice. L'indice comincia da 0.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Capitolo 4. Estendere Kommander
Estendere Kommander
Indietro
Avanti

Estendere Kommander

Traduzione del documento: Samuele Kaplun

Creare i Widget di Kommander

Con Kommander puoi creare nuovi widget non basati su Kommander stesso in maniera semplice. L'approccio è quello di derivare la tua nuova classe di Kommander dal widget Qt™/KDE che desideri integrare in Kommander assieme alla classe KommanderWidget. Fare l'override dei metodi di questa classe dà al widget di Kommander le proprie funzionalità.

La maggior parte del codice di un widget di Kommander è solo codice modello. Perciò puoi usare la finestra di dialogo widgetgenerator.kmdr di Kommander per generare la maggior parte del codice del widget di Kommander per te. Tutto quello che devi fare è riempire le parti importanti relative al tuo widget come qualsiasi informazione di stato, testo del widget, ecc.

Per esempio, supponiamo di voler creare un nuovo widget di tipo casella di testo per Kommander basato sul widget KLineEdit di KDE. Utilizzando la finestra di dialogo di generazione dei widget, otteniamo qualcosa di simile a quanto contenuto in questo file header:

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Capitolo 5. Esercitazioni
Esercitazioni
Indietro
Avanti

Esercitazioni

Traduzione del documento: Samuele Kaplun

Usare l'Editor

Questo potrebbe andare nella sezione dell'editor.

Globali
Globali

Globali

Mostra come utilizzare le chiamate DCOP global e setGlobal per fornire le variabili globali agli script



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

DCOP
DCOP

DCOP

Mostra come utilizzare sia le chiamate DCOP locali che esterne per comunicare con applicazioni esterne.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Slot
Slot

Slot

Mostra come utilizzare le connessioni/slot per gestire gli eventi. Sia gli slot di popolamento che standard sono utilizzati.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Impostazioni
Impostazioni

Impostazioni

Mostra come utilizzare le funzioni @readSetting e @writeSetting per scrivere/ripristinare il contenuto dei widget. Mostra, inoltre, come utilizzare lo slot populate() per inizializzare il contenuto dei widget.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Aggiungi
Aggiungi

Aggiungi

Mostra come puoi aggiungere del testo in TextEdit e come puoi utilizzarlo per visualizzare del testo formattato.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Linea di comando
Linea di comando

Linea di comando

Mostra come puoi passare dei parametri alla finestra di dialogo di Kommander attraverso la linea di comando. Mostra, inoltre, come modificare la lista contenuto ed il pulsante testo.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Inizializza
Inizializza

Inizializza

Mostra come utilizzare la “inizializzazione” per “distruggere” gli script di finestre di dialogo principale per inizializzare e memorizzare delle impostazioni.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Capitolo 6. Domande e risposte
Domande e risposte
Indietro
Avanti

Domande e risposte

Traduzione del documento: Samuele Kaplun

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Capitolo 7. Riconoscimenti e licenza
Riconoscimenti e licenza
Indietro
Avanti

Riconoscimenti e licenza

Tamara King

Traduzione del documento: Samuele Kaplun

La squadra di Sviluppo di Kommander

Britton, Marc

Sviluppo e documentazione

King, Tamara

Documentazione

Laffoon, Eric

Manager del progetto e documentazione

Mantia, András

Sviluppatore

Rudolf, Michal

Sviluppatore

Kommander © 2004 la squadra di Sviluppo di Kommander.

Manuale dell'Utente di Kommander © 2004 la squadra di Sviluppo di Kommander.

Samuele Kaplun

Questa documentazione è concessa in licenza sotto i termini della GNU Free Documentation License.

Questo programma è concesso in licenza sotto i termini della GNU General Public License.

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Appendice A. Installazione
Installazione
Indietro
Avanti

Appendice A. Installazione

Come procurarsi Kommander

Kommander fa parte del progetto KDE http://www.kde.org/.

Puoi trovare Kommander nel pacchetto kdewebdev all'indirizzo ftp://ftp.kde.org/pub/kde/, il sito FTP principale del progetto KDE.

Requisiti
Requisiti

Requisiti



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Compilazione ed installazione
Compilazione ed installazione

Compilazione ed installazione

Per compilare e installare Kommander sul tuo sistema, immetti i seguenti comandi nella directory di base della distribuzione di Kommander:

% ./configure
% make
% make install

Dato che Kommander usa autoconf e automake, non dovresti incontrare dei problemi per compilarlo. Se si verificasse qualche problema, per piacere segnalalo alle mailing list di KDE.



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Configurazione
Configurazione

Configurazione



Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Indietro
Avanti
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Glossario
Glossario
Indietro

Glossario

Parole chiave

Associazioni di Testo

Un pezzo di testo che è associato o collegato allo stato particolare di un widget.

Testo del Widget

Testo associato ad un widget. Questo è rappresentato in Kommander con il comando speciale @widgetText. Il testo del widget varia a seconda del widget.

Indietro
Partenza


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team

Avanti
 


Would you like to make a comment or contribute an update to this page?
Send feedback to the KDE Docs Team