git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/libraries/pykdeextensions@1097589 283d02a7-25f6-0310-bc7c-ecb5cbfe19dav3.5.13-sru
commit
a7af74e757
@ -0,0 +1,27 @@
|
|||||||
|
* Monday September 19th 2005 Simon Edwards <simon@simonzone.com>
|
||||||
|
- 0.4 release. Development version.
|
||||||
|
- KIO-slave support added/integrated from David Boddie's work.
|
||||||
|
- fix for libtool (Ismail Dönmez).
|
||||||
|
|
||||||
|
* Saturday August 6th 2005 Simon Edwards <simon@simonzone.com>
|
||||||
|
- 0.3.1 release. Development version.
|
||||||
|
- Fixed bug for broken application links in the bin directory.
|
||||||
|
- Fixed bug for kcontrol modules not being able to find the application's
|
||||||
|
installation directory.
|
||||||
|
- Fixed another bug/incompatibility in the kcontrol module support that
|
||||||
|
broke embedding on SIP 4.2+.
|
||||||
|
|
||||||
|
* Wednesday June 21st 2005 Simon Edwards <simon@simonzone.com>
|
||||||
|
- 0.3 release. Development version.
|
||||||
|
- 64bit awareness when building libraries added.
|
||||||
|
- Files for installation in the program's KDE application data directory
|
||||||
|
are now specified with the 'application_data' parameter for setup().
|
||||||
|
- kde-prefix option added to setup.py scripts.
|
||||||
|
|
||||||
|
* Thursday June 9th 2005 Simon Edwards <simon@simonzone.com>
|
||||||
|
- 0.2 release. Development version.
|
||||||
|
- Now includes libpythonize (needed for Kcontrol modules)
|
||||||
|
- Support for building and install kcontrol modules.
|
||||||
|
|
||||||
|
* Saturday May 14th 2005 Simon Edwards <simon@simonzone.com>
|
||||||
|
- 0.1 release. Development version
|
@ -0,0 +1,43 @@
|
|||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
This software uses the Python language's distutils system for installation.
|
||||||
|
A detailed guide for users and system administrators to using distutils to
|
||||||
|
install software can be found here:
|
||||||
|
|
||||||
|
http://docs.python.org/inst/inst.html
|
||||||
|
|
||||||
|
The simplest way to install this software is to run the following command as
|
||||||
|
the root user:
|
||||||
|
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
The setup.py script will automatically detect the directories to use for
|
||||||
|
documentation, binaries and other software files.
|
||||||
|
|
||||||
|
|
||||||
|
Uninstallation
|
||||||
|
==============
|
||||||
|
During installation setup.py creates list of files and directories that
|
||||||
|
were installed in a file called install_log.txt.
|
||||||
|
|
||||||
|
python setup.py uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Installing into an alternate root
|
||||||
|
=================================
|
||||||
|
For packaging purposes it is often very useful to be able to install all files
|
||||||
|
relative not to the usual root directory (/) but into an alternative
|
||||||
|
directory.
|
||||||
|
|
||||||
|
python setup.py install --root=/tmp/alternativeroot/
|
||||||
|
|
||||||
|
|
||||||
|
Operation Controls
|
||||||
|
==================
|
||||||
|
--verbose
|
||||||
|
Print more information about what setup.py is doing.
|
||||||
|
|
||||||
|
--help
|
||||||
|
Print a summary of the options to setup.py, and exit.
|
@ -0,0 +1,6 @@
|
|||||||
|
recursive-include doc *.docbook *.png
|
||||||
|
graft app_templates
|
||||||
|
prune app_templates/.svn
|
||||||
|
include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
|
||||||
|
global-include *.desktop *.py *.cpp *.h
|
||||||
|
global-exclude *~ .svn *.pyc
|
@ -0,0 +1,10 @@
|
|||||||
|
Metadata-Version: 1.0
|
||||||
|
Name: pykdeextensions
|
||||||
|
Version: 0.4.0
|
||||||
|
Summary: UNKNOWN
|
||||||
|
Home-page: http://www.simonzone.com/software/pykdeextensions/
|
||||||
|
Author: Simon Edwards
|
||||||
|
Author-email: simon@simonzone.com
|
||||||
|
License: LGPL
|
||||||
|
Description: UNKNOWN
|
||||||
|
Platform: UNKNOWN
|
@ -0,0 +1,14 @@
|
|||||||
|
PyKDE Extensions
|
||||||
|
================
|
||||||
|
PyKDE Extensions is a collection of software and Python packages to support
|
||||||
|
the creation and installation of KDE applications.
|
||||||
|
|
||||||
|
Read the INSTALL file for more information about how to install this.
|
||||||
|
|
||||||
|
This software is on the web at:
|
||||||
|
|
||||||
|
http://www.simonzone.com/software/pykdeextensions/
|
||||||
|
|
||||||
|
cheers,
|
||||||
|
|
||||||
|
Simon Edwards <simon@simonzone.com>
|
@ -0,0 +1 @@
|
|||||||
|
$AUTHOR$ <$EMAIL$>
|
@ -0,0 +1,43 @@
|
|||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
This software uses the Python language's distutils system for installation.
|
||||||
|
A detailed guide for users and system administrators to using distutils to
|
||||||
|
install software can be found here:
|
||||||
|
|
||||||
|
http://docs.python.org/inst/inst.html
|
||||||
|
|
||||||
|
The simplest way to install this software is to run the following command as
|
||||||
|
the root user:
|
||||||
|
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
The setup.py script will automatically detect the directories to use for
|
||||||
|
documentation, binaries and other software files.
|
||||||
|
|
||||||
|
|
||||||
|
Uninstallation
|
||||||
|
==============
|
||||||
|
During installation setup.py creates list of files and directories that
|
||||||
|
were installed in a file called install_log.txt.
|
||||||
|
|
||||||
|
python setup.py uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Installing into an alternate root
|
||||||
|
=================================
|
||||||
|
For packaging purposes it is often very useful to be able to install all files
|
||||||
|
relative not to the usual root directory (/) but into an alternative
|
||||||
|
directory.
|
||||||
|
|
||||||
|
python setup.py install --root=/tmp/alternativeroot/
|
||||||
|
|
||||||
|
|
||||||
|
Operation Controls
|
||||||
|
==================
|
||||||
|
--verbose
|
||||||
|
Print more information about what setup.py is doing.
|
||||||
|
|
||||||
|
--help
|
||||||
|
Print a summary of the options to setup.py, and exit.
|
@ -0,0 +1,6 @@
|
|||||||
|
recursive-include doc *.docbook *.png
|
||||||
|
recursive-include po *.po *.pot
|
||||||
|
include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
|
||||||
|
global-include *.desktop *.py *.ui *.png *.lsm
|
||||||
|
global-exclude *~ .svn
|
||||||
|
global-exclude *~ .cvs
|
@ -0,0 +1,555 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
|
||||||
|
<!ENTITY appname "<application>MyApplicaition 0.1</application>">
|
||||||
|
<!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
|
||||||
|
<!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
|
||||||
|
<!ENTITY % addindex "IGNORE">
|
||||||
|
<!ENTITY % English "INCLUDE"><!-- change language only here -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not define any other entities; instead, use the entities
|
||||||
|
from kde-genent.entities and $LANG/user.entities. -->
|
||||||
|
]>
|
||||||
|
<!-- kdoctemplate v0.8 October 1 1999
|
||||||
|
Minor update to "Credits and Licenses" section on August 24, 2000
|
||||||
|
Removed "Revision history" section on 22 January 2001
|
||||||
|
Changed to Installation/Help menu entities 18 October 2001
|
||||||
|
Other minor cleanup and changes 18 October 2001 -->
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This template was designed by: David Rugge davidrugge@mindspring.com
|
||||||
|
with lots of help from: Eric Bischoff ebisch@cybercable.tm.fr
|
||||||
|
and Frederik Fouvry fouvry@sfs.nphil.uni-tuebingen.de
|
||||||
|
of the KDE DocBook team.
|
||||||
|
|
||||||
|
You may freely use this template for writing any sort of KDE documentation.
|
||||||
|
If you have any changes or improvements, please let us know.
|
||||||
|
|
||||||
|
Remember:
|
||||||
|
- in XML, the case of the <tags> and attributes is relevant ;
|
||||||
|
- also, quote all attributes.
|
||||||
|
|
||||||
|
Please don't forget to remove all these comments in your final documentation,
|
||||||
|
thanks ;-).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- ................................................................ -->
|
||||||
|
|
||||||
|
<!-- The language must NOT be changed here. -->
|
||||||
|
|
||||||
|
<book lang="&language;">
|
||||||
|
|
||||||
|
<!-- This header contains all of the meta-information for the document such
|
||||||
|
as Authors, publish date, the abstract, and Keywords -->
|
||||||
|
|
||||||
|
<bookinfo>
|
||||||
|
<title>The &appname; Handbook</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname></firstname>
|
||||||
|
<othername></othername>
|
||||||
|
<surname>%{AUTHOR}</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address><email>%{EMAIL}</email></address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>1999</year>
|
||||||
|
<year>%{YEAR}</year>
|
||||||
|
<holder>%{AUTHOR}</holder>
|
||||||
|
</copyright>
|
||||||
|
<!-- Translators: put here the copyright notice of the translation -->
|
||||||
|
<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
|
||||||
|
and in the FDL itself on how to use it. -->
|
||||||
|
<legalnotice>&FDLNotice;</legalnotice>
|
||||||
|
|
||||||
|
<!-- Date and version information of the documentation
|
||||||
|
Don't forget to include this last date and this last revision number, we
|
||||||
|
need them for translation coordination !
|
||||||
|
Please respect the format of the date (YYYY-MM-DD) and of the version
|
||||||
|
(V.MM.LL), it could be used by automation scripts.
|
||||||
|
Do NOT change these in the translation. -->
|
||||||
|
|
||||||
|
<date>2001-10-18</date>
|
||||||
|
<releaseinfo>%{VERSION}</releaseinfo>
|
||||||
|
|
||||||
|
<!-- Abstract about this handbook -->
|
||||||
|
|
||||||
|
<abstract>
|
||||||
|
<para>
|
||||||
|
&appname; is an application specially designed to do nothing you would
|
||||||
|
ever want.
|
||||||
|
</para>
|
||||||
|
</abstract>
|
||||||
|
|
||||||
|
<!-- This is a set of Keywords for indexing by search engines.
|
||||||
|
Please at least include KDE, the KDE package it is in, the name
|
||||||
|
of your application, and a few relevant keywords. -->
|
||||||
|
|
||||||
|
<keywordset>
|
||||||
|
<keyword>KDE</keyword>
|
||||||
|
<keyword>%{APPNAME}</keyword>
|
||||||
|
<keyword>nothing</keyword>
|
||||||
|
<keyword>nothing else</keyword>
|
||||||
|
</keywordset>
|
||||||
|
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<!-- The contents of the documentation begin here. Label
|
||||||
|
each chapter so with the id attribute. This is necessary for two reasons: it
|
||||||
|
allows you to easily reference the chapter from other chapters of your
|
||||||
|
document, and if there is no ID, the name of the generated HTML files will vary
|
||||||
|
from time to time making it hard to manage for maintainers and for the CVS
|
||||||
|
system. Any chapter labelled (OPTIONAL) may be left out at the author's
|
||||||
|
discretion. Other chapters should not be left out in order to maintain a
|
||||||
|
consistent documentation style across all KDE apps. -->
|
||||||
|
|
||||||
|
<chapter id="introduction">
|
||||||
|
<title>Introduction</title>
|
||||||
|
|
||||||
|
<!-- The introduction chapter contains a brief introduction for the
|
||||||
|
application that explains what it does and where to report
|
||||||
|
problems. Basically a long version of the abstract. Don't include a
|
||||||
|
revision history. (see installation appendix comment) -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; is a program that lets you do absolutely nothing. Please report
|
||||||
|
any problems or feature requests to the &kde; mailing lists.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="using-appname">
|
||||||
|
<title>Using &appname;</title>
|
||||||
|
|
||||||
|
<!-- This chapter should tell the user how to use your app. You should use as
|
||||||
|
many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
|
||||||
|
your application. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
|
||||||
|
<!-- Note that all graphics should be in .png format. Use no gifs because of
|
||||||
|
patent issues. -->
|
||||||
|
|
||||||
|
<screenshot>
|
||||||
|
<screeninfo>Here's a screenshot of &appname;</screeninfo>
|
||||||
|
<mediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Screenshot</phrase>
|
||||||
|
</textobject>
|
||||||
|
</mediaobject>
|
||||||
|
</screenshot>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<sect1 id="appname-features">
|
||||||
|
<title>More &appname; features</title>
|
||||||
|
|
||||||
|
<para>It slices! It dices! and it comes with a free toaster!</para>
|
||||||
|
<para>
|
||||||
|
The Squiggle Tool <guiicon><inlinemediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Squiggle</phrase>
|
||||||
|
</textobject>
|
||||||
|
</inlinemediaobject></guiicon> is used to draw squiggly lines all over
|
||||||
|
the &appname; main window. It's not a bug, it's a feature!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="commands">
|
||||||
|
<title>Command Reference</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
|
||||||
|
application windows and their menubar and toolbar commands for easy reference.
|
||||||
|
Also include any keys that have a special function but have no equivalent in the
|
||||||
|
menus or toolbars. This may not be necessary for small apps or apps with no tool
|
||||||
|
or menu bars. -->
|
||||||
|
|
||||||
|
<sect1 id="appname-mainwindow">
|
||||||
|
<title>The main &appname; window</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The File Menu</title>
|
||||||
|
<para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>New</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Creates a new document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Save</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Saves the document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Quit</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Quits</action> &appname;</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The <guimenu>Help</guimenu> Menu</title>
|
||||||
|
|
||||||
|
<!-- Assuming you have a standard help menu (help, what's this, about -->
|
||||||
|
<!-- &appname;, about KDE) then the documentation is already written. -->
|
||||||
|
<!-- The following entity is valid anywhere that a variablelist is -->
|
||||||
|
<!-- valid. -->
|
||||||
|
|
||||||
|
&help.menu.documentation;
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="developers">
|
||||||
|
<title>Developer's Guide to &appname;</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
|
||||||
|
used for apps that use plugins or that provide their own scripting hooks
|
||||||
|
and/or development libraries. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Programming &appname; plugins is a joy to behold. Just read through the next
|
||||||
|
66 pages of API's to learn how!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
|
||||||
|
should consult the docbook reference for further details. The example below was
|
||||||
|
taken from that reference and shortened a bit for readability. -->
|
||||||
|
|
||||||
|
<refentry id="re-1007-unmanagechildren-1">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>XtUnmanageChildren</refentrytitle>
|
||||||
|
<refmiscinfo>Xt - Geometry Management</refmiscinfo>
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>XtUnmanageChildren
|
||||||
|
</refname>
|
||||||
|
<refpurpose>remove a list of children from a parent widget's managed
|
||||||
|
list.
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
|
||||||
|
</refpurpose>
|
||||||
|
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<refsynopsisdivinfo>
|
||||||
|
<date>4 March 1996</date>
|
||||||
|
</refsynopsisdivinfo>
|
||||||
|
<synopsis>
|
||||||
|
void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
|
||||||
|
WidgetList <replaceable class="parameter">children</replaceable>;
|
||||||
|
Cardinal <replaceable class="parameter">num_children</replaceable>;
|
||||||
|
</synopsis>
|
||||||
|
|
||||||
|
<refsect2 id="r2-1007-unmanagechildren-1">
|
||||||
|
<title>Inputs</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies an array of child widgets. Each child must be of
|
||||||
|
class RectObj or any subclass thereof.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">num_children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect2></refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-1">
|
||||||
|
<title>Description
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
|
||||||
|
and removes them from their parent's geometry management.
|
||||||
|
The widgets will disappear from the screen, and (depending
|
||||||
|
on its parent) may no longer have screen space allocated for
|
||||||
|
them.
|
||||||
|
</para>
|
||||||
|
<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
|
||||||
|
the same parent.
|
||||||
|
</para>
|
||||||
|
<para>See the “Algorithm” section below for full details of the
|
||||||
|
widget unmanagement procedure.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-2">
|
||||||
|
<title>Usage</title>
|
||||||
|
<para>Unmanaging widgets is the usual method for temporarily
|
||||||
|
making them invisible. They can be re-managed with
|
||||||
|
<function>XtManageChildren()</function>.
|
||||||
|
</para>
|
||||||
|
<para>You can unmap a widget, but leave it under geometry
|
||||||
|
management by calling <function>XtUnmapWidget()</function>. You can
|
||||||
|
destroy a widget's window without destroying the widget by
|
||||||
|
calling <function>XtUnrealizeWidget()</function>. You can destroy a
|
||||||
|
widget completely with <function>XtDestroyWidget()</function>.
|
||||||
|
</para>
|
||||||
|
<para>If you are only going to unmanage a single widget, it is
|
||||||
|
more convenient to call <function>XtUnmanageChild()</function>. It is
|
||||||
|
often more convenient to call <function>XtUnmanageChild()</function>
|
||||||
|
several times than it is to declare and initialize an array
|
||||||
|
of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
|
||||||
|
<function>XtUnmanageChildren()</function> is more efficient, however,
|
||||||
|
because it only calls the parent's <function>change_managed()</function>
|
||||||
|
method once.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-3">
|
||||||
|
<title>Algorithm
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> performs the following:
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Ignores the child if it already is unmanaged or is being
|
||||||
|
destroyed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Otherwise, if the child is realized, it makes it nonvisible
|
||||||
|
by unmapping it.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-4">
|
||||||
|
<title>Structures</title>
|
||||||
|
<para>The <type>WidgetList</type> type is simply an array of widgets:
|
||||||
|
</para>
|
||||||
|
<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
|
||||||
|
</screen>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="faq">
|
||||||
|
<title>Questions and Answers</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL but recommended) This chapter should include all of the silly
|
||||||
|
(and not-so-silly) newbie questions that fill up your mailbox. This chapter
|
||||||
|
should be reserved for BRIEF questions and answers! If one question uses more
|
||||||
|
than a page or so then it should probably be part of the
|
||||||
|
"Using this Application" chapter instead. You should use links to
|
||||||
|
cross-reference questions to the parts of your documentation that answer them.
|
||||||
|
This is also a great place to provide pointers to other FAQ's if your users
|
||||||
|
must do some complicated configuration on other programs in order for your
|
||||||
|
application work. -->
|
||||||
|
|
||||||
|
&reporting.bugs;
|
||||||
|
&updating.documentation;
|
||||||
|
|
||||||
|
<qandaset id="faqlist">
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>My Mouse doesn't work. How do I quit &appname;?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You silly goose! Check out the <link linkend="commands">Commands
|
||||||
|
Section</link> for the answer.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>Why can't I twiddle my documents?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You can only twiddle your documents if you have the foobar.lib
|
||||||
|
installed.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
</qandaset>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="credits">
|
||||||
|
|
||||||
|
<!-- Include credits for the programmers, documentation writers, and
|
||||||
|
contributors here. The license for your software should then be included below
|
||||||
|
the credits with a reference to the appropriate license file included in the KDE
|
||||||
|
distribution. -->
|
||||||
|
|
||||||
|
<title>Credits and License</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname;
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Contributors:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Konqui the KDE Dragon <email>konqui@kde.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem><para>Tux the Linux Penguin <email>tux@linux.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
|
||||||
|
|
||||||
|
&underFDL; <!-- FDL: do not remove -->
|
||||||
|
|
||||||
|
<!-- Determine which license your application is licensed under,
|
||||||
|
and delete all the remaining licenses below:
|
||||||
|
|
||||||
|
(NOTE: All documentation are licensed under the FDL,
|
||||||
|
regardless of what license the application uses) -->
|
||||||
|
|
||||||
|
&underGPL; <!-- GPL License -->
|
||||||
|
&underBSDLicense; <!-- BSD License -->
|
||||||
|
&underArtisticLicense; <!-- BSD Artistic License -->
|
||||||
|
&underX11License; <!-- X11 License -->
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<appendix id="installation">
|
||||||
|
<title>Installation</title>
|
||||||
|
|
||||||
|
<sect1 id="getting-appname">
|
||||||
|
<title>How to obtain &appname;</title>
|
||||||
|
|
||||||
|
<!-- This first entity contains boiler plate for applications that are
|
||||||
|
part of KDE CVS. You should remove it if you are releasing your
|
||||||
|
application -->
|
||||||
|
|
||||||
|
&install.intro.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="requirements">
|
||||||
|
<title>Requirements</title>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
List any special requirements for your application here. This should include:
|
||||||
|
.Libraries or other software that is not included in kdesupport,
|
||||||
|
kdelibs, or kdebase.
|
||||||
|
.Hardware requirements like amount of RAM, disk space, graphics card
|
||||||
|
capabilities, screen resolution, special expansion cards, etc.
|
||||||
|
.Operating systems the app will run on. If your app is designed only for a
|
||||||
|
specific OS, (you wrote a graphical LILO configurator for example) put this
|
||||||
|
information here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
|
||||||
|
required in order to support the advanced &appname; features. &appname; uses
|
||||||
|
about 5 megs of memory to run, but this may vary depending on your
|
||||||
|
platform and configuration.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
All required libraries as well as &appname; itself can be found
|
||||||
|
on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- For a list of updates, you may refer to the application web site
|
||||||
|
or the ChangeLog file, or ... -->
|
||||||
|
<para>
|
||||||
|
You can find a list of changes at <ulink
|
||||||
|
url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="compilation">
|
||||||
|
<title>Compilation and Installation</title>
|
||||||
|
|
||||||
|
<!-- This entity contains the boilerplate text for standard -->
|
||||||
|
<!-- compilation instructions. If your application requires any -->
|
||||||
|
<!-- special handling, remove it, and replace with your own text. -->
|
||||||
|
|
||||||
|
&install.compile.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="configuration">
|
||||||
|
<title>Configuration</title>
|
||||||
|
|
||||||
|
<para>Don't forget to tell your system to start the <filename>dtd</filename>
|
||||||
|
dicer-toaster daemon first, or &appname; won't work !</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</appendix>
|
||||||
|
|
||||||
|
&documentation.index;
|
||||||
|
</book>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-general-insert-case:lower
|
||||||
|
sgml-indent-step:0
|
||||||
|
sgml-indent-data:nil
|
||||||
|
End:
|
||||||
|
|
||||||
|
vim:tabstop=2:shiftwidth=2:expandtab
|
||||||
|
-->
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
.pot and .pot translation files should be placed here.
|
@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# setup - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : YOUR@EMAIL.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import kdedistutils
|
||||||
|
|
||||||
|
kdedistutils.setup(name="kcontrol_module",
|
||||||
|
version="0.1.0",
|
||||||
|
author="AUTHOR",
|
||||||
|
author_email="YOUR@EMAIL.com",
|
||||||
|
url="http://www.TESTAPP.com/",
|
||||||
|
min_kde_version = "3.0.0",
|
||||||
|
min_qt_version = "3.0.0",
|
||||||
|
license = "GPL",
|
||||||
|
application_data = ['src/kcontrol_module.py','src/KcontrolModuleWidgetUI.ui'],
|
||||||
|
executable_links = [('kcontrol_module','kcontrol_module.py')],
|
||||||
|
docbooks = [ ('doc/en','en') ],
|
||||||
|
i18n = ('po',['src']),
|
||||||
|
kcontrol_modules = [ ('src/kcontrol_module.desktop','kcontrol_module.py')] )
|
@ -0,0 +1,33 @@
|
|||||||
|
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||||
|
<class>KcontrolModuleWidgetUI</class>
|
||||||
|
<widget class="QWidget">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>KcontrolModuleWidgetUI</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>600</width>
|
||||||
|
<height>480</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="caption">
|
||||||
|
<string>Form1</string>
|
||||||
|
</property>
|
||||||
|
<hbox>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>unnamed</cstring>
|
||||||
|
</property>
|
||||||
|
<widget class="QLabel">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>textLabel1</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Congratulations, Kcontrol_module template application is working!</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</hbox>
|
||||||
|
</widget>
|
||||||
|
<layoutdefaults spacing="6" margin="11"/>
|
||||||
|
</UI>
|
@ -0,0 +1,15 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=Kcontrol module
|
||||||
|
Name[en]=Kcontrol module
|
||||||
|
name[en_GB]=Kcontrol module
|
||||||
|
Comment=Kcontrol module template
|
||||||
|
Comment[en]=Kcontrol module template
|
||||||
|
Comment[en_GB]=Kcontrol module template
|
||||||
|
Icon=daemons.png
|
||||||
|
X-KDE-ModuleType=Library
|
||||||
|
X-KDE-Library=kcontrol_module
|
||||||
|
X-KDE-FactoryName=kcontrol_module
|
||||||
|
X-KDE-RootOnly=false
|
||||||
|
Type=Application
|
||||||
|
Exec=kcmshell kcontrol_module
|
||||||
|
Categories=QT;KDE;X-KDE-settings-system;
|
@ -0,0 +1,16 @@
|
|||||||
|
Begin3
|
||||||
|
Title: $APPNAME$ -- Some description
|
||||||
|
Version: $VERSION$
|
||||||
|
Entered-date:
|
||||||
|
Description:
|
||||||
|
Keywords: KDE Qt
|
||||||
|
Author: $AUTHOR$ <$EMAIL$>
|
||||||
|
Maintained-by: $AUTHOR$ <$EMAIL$>
|
||||||
|
Home-page:
|
||||||
|
Alternate-site:
|
||||||
|
Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
|
||||||
|
xxxxxx $APPNAMELC$-$VERSION$.tar.gz
|
||||||
|
xxx $APPNAMELC$-$VERSION$.lsm
|
||||||
|
Platform: Linux. Needs KDE
|
||||||
|
Copying-policy: $LICENSE$
|
||||||
|
End
|
@ -0,0 +1,166 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# kcontrol_module - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Mon May 2 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from qt import *
|
||||||
|
from kdecore import *
|
||||||
|
from kdeui import *
|
||||||
|
|
||||||
|
import kdedesigner
|
||||||
|
from KcontrolModuleWidgetUI import *
|
||||||
|
|
||||||
|
description = "A Kcontrol module"
|
||||||
|
version = "0.1"
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def AboutData():
|
||||||
|
global version,description
|
||||||
|
|
||||||
|
about_data = KAboutData("kcontrol_module", "kcontrol_module", version, \
|
||||||
|
description, KAboutData.License_GPL, "(C) 2005 AUTHOR", None, None,\
|
||||||
|
"your@email.com")
|
||||||
|
about_data.addAuthor("AUTHOR", None, "your@email.com")
|
||||||
|
return about_data
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
class KcontrolModuleWidget(KcontrolModuleWidgetUI):
|
||||||
|
def __init__(self,parent=None):
|
||||||
|
KcontrolModuleWidgetUI.__init__(self,parent,"Kcontrol module")
|
||||||
|
# Add other methods, slots and signals here.
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
# The base class that we use depends on whether this is running inside
|
||||||
|
# kcontrol or as a standalone application.
|
||||||
|
# Are we running as a separate standalone application or in KControl?
|
||||||
|
standalone = __name__=='__main__'
|
||||||
|
|
||||||
|
if standalone:
|
||||||
|
programbase = KDialogBase
|
||||||
|
else:
|
||||||
|
programbase = KCModule
|
||||||
|
|
||||||
|
class KcontrolModuleApp(programbase):
|
||||||
|
########################################################################
|
||||||
|
def __init__(self,parent=None,name=None):
|
||||||
|
global standalone
|
||||||
|
if standalone:
|
||||||
|
KDialogBase.__init__(self,KJanusWidget.Plain,"Kcontrol module",KDialogBase.User1|KDialogBase.Close, KDialogBase.Close)
|
||||||
|
self.setButtonText(KDialogBase.User1,"About")
|
||||||
|
else:
|
||||||
|
KCModule.__init__(self,parent,name)
|
||||||
|
# Create a configuration object.
|
||||||
|
self.config = KConfig("kcontrol_module")
|
||||||
|
self.setButtons(0)
|
||||||
|
self.aboutdata = AboutData()
|
||||||
|
|
||||||
|
# The appdir needs to be explicitly otherwise we won't be able to
|
||||||
|
# load our icons and images.
|
||||||
|
KGlobal.iconLoader().addAppDir("kcontrol_module")
|
||||||
|
|
||||||
|
if standalone:
|
||||||
|
toplayout = QVBoxLayout( self.plainPage(), 0, KDialog.spacingHint() )
|
||||||
|
mainwidget = KcontrolModuleWidget(self.plainPage())
|
||||||
|
else:
|
||||||
|
toplayout = QVBoxLayout( self, 0, KDialog.spacingHint() )
|
||||||
|
mainwidget = KcontrolModuleWidget(self)
|
||||||
|
|
||||||
|
toplayout.addWidget(mainwidget)
|
||||||
|
|
||||||
|
self.aboutus = KAboutApplication(self)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
def __del__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KDialogBase method
|
||||||
|
def exec_loop(self):
|
||||||
|
global programbase
|
||||||
|
|
||||||
|
# Load configuration here
|
||||||
|
self.__loadOptions()
|
||||||
|
|
||||||
|
programbase.exec_loop(self)
|
||||||
|
|
||||||
|
# Save configuration here
|
||||||
|
self.__saveOptions()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KDialogBase method
|
||||||
|
def slotUser1(self):
|
||||||
|
self.aboutus.show()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
def slotCloseButton(self):
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
def __loadOptions(self):
|
||||||
|
global kapp
|
||||||
|
config = kapp.config()
|
||||||
|
config.setGroup("General")
|
||||||
|
size = config.readSizeEntry("Geometry")
|
||||||
|
if size.isEmpty()==False:
|
||||||
|
self.resize(size)
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
def __saveOptions(self):
|
||||||
|
global kapp
|
||||||
|
config = kapp.config()
|
||||||
|
config.setGroup("General")
|
||||||
|
config.writeEntry("Geometry", self.size())
|
||||||
|
config.sync()
|
||||||
|
|
||||||
|
#######################################################################
|
||||||
|
# KControl virtual void methods
|
||||||
|
def load(self):
|
||||||
|
pass
|
||||||
|
def save(self):
|
||||||
|
pass
|
||||||
|
def defaults(self):
|
||||||
|
pass
|
||||||
|
def sysdefaults(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def aboutData(self):
|
||||||
|
# Return the KAboutData object which we created during initialisation.
|
||||||
|
return self.aboutdata
|
||||||
|
|
||||||
|
def buttons(self):
|
||||||
|
# Only supply a Help button. Other choices are Default and Apply.
|
||||||
|
return KCModule.Help
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
# This is the entry point used when running this module outside of kcontrol.
|
||||||
|
def main():
|
||||||
|
global kapp
|
||||||
|
about_data = AboutData()
|
||||||
|
KCmdLineArgs.init(sys.argv,about_data)
|
||||||
|
kapp = KApplication()
|
||||||
|
myapp = KcontrolModuleApp()
|
||||||
|
myapp.exec_loop()
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
# Factory function for KControl
|
||||||
|
def create_kcontrol_module(parent,name):
|
||||||
|
global kapp
|
||||||
|
kapp = KApplication.kApplication()
|
||||||
|
return KcontrolModuleApp(parent, name)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
if standalone:
|
||||||
|
main()
|
@ -0,0 +1 @@
|
|||||||
|
$AUTHOR$ <$EMAIL$>
|
@ -0,0 +1,43 @@
|
|||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
This software uses the Python language's distutils system for installation.
|
||||||
|
A detailed guide for users and system administrators to using distutils to
|
||||||
|
install software can be found here:
|
||||||
|
|
||||||
|
http://docs.python.org/inst/inst.html
|
||||||
|
|
||||||
|
The simplest way to install this software is to run the following command as
|
||||||
|
the root user:
|
||||||
|
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
The setup.py script will automatically detect the directories to use for
|
||||||
|
documentation, binaries and other software files.
|
||||||
|
|
||||||
|
|
||||||
|
Uninstallation
|
||||||
|
==============
|
||||||
|
During installation setup.py creates list of files and directories that
|
||||||
|
were installed in a file called install_log.txt.
|
||||||
|
|
||||||
|
python setup.py uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Installing into an alternate root
|
||||||
|
=================================
|
||||||
|
For packaging purposes it is often very useful to be able to install all files
|
||||||
|
relative not to the usual root directory (/) but into an alternative
|
||||||
|
directory.
|
||||||
|
|
||||||
|
python setup.py install --root=/tmp/alternativeroot/
|
||||||
|
|
||||||
|
|
||||||
|
Operation Controls
|
||||||
|
==================
|
||||||
|
--verbose
|
||||||
|
Print more information about what setup.py is doing.
|
||||||
|
|
||||||
|
--help
|
||||||
|
Print a summary of the options to setup.py, and exit.
|
@ -0,0 +1,6 @@
|
|||||||
|
recursive-include doc *.docbook *.png
|
||||||
|
recursive-include po *.po *.pot
|
||||||
|
include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
|
||||||
|
global-include *.desktop *.py *.ui *.png *.lsm
|
||||||
|
global-exclude *~ .svn
|
||||||
|
global-exclude *~ .cvs
|
@ -0,0 +1,555 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
|
||||||
|
<!ENTITY appname "<application>MyApplicaition 0.1</application>">
|
||||||
|
<!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
|
||||||
|
<!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
|
||||||
|
<!ENTITY % addindex "IGNORE">
|
||||||
|
<!ENTITY % English "INCLUDE"><!-- change language only here -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not define any other entities; instead, use the entities
|
||||||
|
from kde-genent.entities and $LANG/user.entities. -->
|
||||||
|
]>
|
||||||
|
<!-- kdoctemplate v0.8 October 1 1999
|
||||||
|
Minor update to "Credits and Licenses" section on August 24, 2000
|
||||||
|
Removed "Revision history" section on 22 January 2001
|
||||||
|
Changed to Installation/Help menu entities 18 October 2001
|
||||||
|
Other minor cleanup and changes 18 October 2001 -->
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This template was designed by: David Rugge davidrugge@mindspring.com
|
||||||
|
with lots of help from: Eric Bischoff ebisch@cybercable.tm.fr
|
||||||
|
and Frederik Fouvry fouvry@sfs.nphil.uni-tuebingen.de
|
||||||
|
of the KDE DocBook team.
|
||||||
|
|
||||||
|
You may freely use this template for writing any sort of KDE documentation.
|
||||||
|
If you have any changes or improvements, please let us know.
|
||||||
|
|
||||||
|
Remember:
|
||||||
|
- in XML, the case of the <tags> and attributes is relevant ;
|
||||||
|
- also, quote all attributes.
|
||||||
|
|
||||||
|
Please don't forget to remove all these comments in your final documentation,
|
||||||
|
thanks ;-).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- ................................................................ -->
|
||||||
|
|
||||||
|
<!-- The language must NOT be changed here. -->
|
||||||
|
|
||||||
|
<book lang="&language;">
|
||||||
|
|
||||||
|
<!-- This header contains all of the meta-information for the document such
|
||||||
|
as Authors, publish date, the abstract, and Keywords -->
|
||||||
|
|
||||||
|
<bookinfo>
|
||||||
|
<title>The &appname; Handbook</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname></firstname>
|
||||||
|
<othername></othername>
|
||||||
|
<surname>%{AUTHOR}</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address><email>%{EMAIL}</email></address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>1999</year>
|
||||||
|
<year>%{YEAR}</year>
|
||||||
|
<holder>%{AUTHOR}</holder>
|
||||||
|
</copyright>
|
||||||
|
<!-- Translators: put here the copyright notice of the translation -->
|
||||||
|
<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
|
||||||
|
and in the FDL itself on how to use it. -->
|
||||||
|
<legalnotice>&FDLNotice;</legalnotice>
|
||||||
|
|
||||||
|
<!-- Date and version information of the documentation
|
||||||
|
Don't forget to include this last date and this last revision number, we
|
||||||
|
need them for translation coordination !
|
||||||
|
Please respect the format of the date (YYYY-MM-DD) and of the version
|
||||||
|
(V.MM.LL), it could be used by automation scripts.
|
||||||
|
Do NOT change these in the translation. -->
|
||||||
|
|
||||||
|
<date>2001-10-18</date>
|
||||||
|
<releaseinfo>%{VERSION}</releaseinfo>
|
||||||
|
|
||||||
|
<!-- Abstract about this handbook -->
|
||||||
|
|
||||||
|
<abstract>
|
||||||
|
<para>
|
||||||
|
&appname; is an application specially designed to do nothing you would
|
||||||
|
ever want.
|
||||||
|
</para>
|
||||||
|
</abstract>
|
||||||
|
|
||||||
|
<!-- This is a set of Keywords for indexing by search engines.
|
||||||
|
Please at least include KDE, the KDE package it is in, the name
|
||||||
|
of your application, and a few relevant keywords. -->
|
||||||
|
|
||||||
|
<keywordset>
|
||||||
|
<keyword>KDE</keyword>
|
||||||
|
<keyword>%{APPNAME}</keyword>
|
||||||
|
<keyword>nothing</keyword>
|
||||||
|
<keyword>nothing else</keyword>
|
||||||
|
</keywordset>
|
||||||
|
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<!-- The contents of the documentation begin here. Label
|
||||||
|
each chapter so with the id attribute. This is necessary for two reasons: it
|
||||||
|
allows you to easily reference the chapter from other chapters of your
|
||||||
|
document, and if there is no ID, the name of the generated HTML files will vary
|
||||||
|
from time to time making it hard to manage for maintainers and for the CVS
|
||||||
|
system. Any chapter labelled (OPTIONAL) may be left out at the author's
|
||||||
|
discretion. Other chapters should not be left out in order to maintain a
|
||||||
|
consistent documentation style across all KDE apps. -->
|
||||||
|
|
||||||
|
<chapter id="introduction">
|
||||||
|
<title>Introduction</title>
|
||||||
|
|
||||||
|
<!-- The introduction chapter contains a brief introduction for the
|
||||||
|
application that explains what it does and where to report
|
||||||
|
problems. Basically a long version of the abstract. Don't include a
|
||||||
|
revision history. (see installation appendix comment) -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; is a program that lets you do absolutely nothing. Please report
|
||||||
|
any problems or feature requests to the &kde; mailing lists.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="using-appname">
|
||||||
|
<title>Using &appname;</title>
|
||||||
|
|
||||||
|
<!-- This chapter should tell the user how to use your app. You should use as
|
||||||
|
many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
|
||||||
|
your application. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
|
||||||
|
<!-- Note that all graphics should be in .png format. Use no gifs because of
|
||||||
|
patent issues. -->
|
||||||
|
|
||||||
|
<screenshot>
|
||||||
|
<screeninfo>Here's a screenshot of &appname;</screeninfo>
|
||||||
|
<mediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Screenshot</phrase>
|
||||||
|
</textobject>
|
||||||
|
</mediaobject>
|
||||||
|
</screenshot>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<sect1 id="appname-features">
|
||||||
|
<title>More &appname; features</title>
|
||||||
|
|
||||||
|
<para>It slices! It dices! and it comes with a free toaster!</para>
|
||||||
|
<para>
|
||||||
|
The Squiggle Tool <guiicon><inlinemediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Squiggle</phrase>
|
||||||
|
</textobject>
|
||||||
|
</inlinemediaobject></guiicon> is used to draw squiggly lines all over
|
||||||
|
the &appname; main window. It's not a bug, it's a feature!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="commands">
|
||||||
|
<title>Command Reference</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
|
||||||
|
application windows and their menubar and toolbar commands for easy reference.
|
||||||
|
Also include any keys that have a special function but have no equivalent in the
|
||||||
|
menus or toolbars. This may not be necessary for small apps or apps with no tool
|
||||||
|
or menu bars. -->
|
||||||
|
|
||||||
|
<sect1 id="appname-mainwindow">
|
||||||
|
<title>The main &appname; window</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The File Menu</title>
|
||||||
|
<para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>New</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Creates a new document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Save</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Saves the document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Quit</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Quits</action> &appname;</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The <guimenu>Help</guimenu> Menu</title>
|
||||||
|
|
||||||
|
<!-- Assuming you have a standard help menu (help, what's this, about -->
|
||||||
|
<!-- &appname;, about KDE) then the documentation is already written. -->
|
||||||
|
<!-- The following entity is valid anywhere that a variablelist is -->
|
||||||
|
<!-- valid. -->
|
||||||
|
|
||||||
|
&help.menu.documentation;
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="developers">
|
||||||
|
<title>Developer's Guide to &appname;</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
|
||||||
|
used for apps that use plugins or that provide their own scripting hooks
|
||||||
|
and/or development libraries. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Programming &appname; plugins is a joy to behold. Just read through the next
|
||||||
|
66 pages of API's to learn how!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
|
||||||
|
should consult the docbook reference for further details. The example below was
|
||||||
|
taken from that reference and shortened a bit for readability. -->
|
||||||
|
|
||||||
|
<refentry id="re-1007-unmanagechildren-1">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>XtUnmanageChildren</refentrytitle>
|
||||||
|
<refmiscinfo>Xt - Geometry Management</refmiscinfo>
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>XtUnmanageChildren
|
||||||
|
</refname>
|
||||||
|
<refpurpose>remove a list of children from a parent widget's managed
|
||||||
|
list.
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
|
||||||
|
</refpurpose>
|
||||||
|
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<refsynopsisdivinfo>
|
||||||
|
<date>4 March 1996</date>
|
||||||
|
</refsynopsisdivinfo>
|
||||||
|
<synopsis>
|
||||||
|
void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
|
||||||
|
WidgetList <replaceable class="parameter">children</replaceable>;
|
||||||
|
Cardinal <replaceable class="parameter">num_children</replaceable>;
|
||||||
|
</synopsis>
|
||||||
|
|
||||||
|
<refsect2 id="r2-1007-unmanagechildren-1">
|
||||||
|
<title>Inputs</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies an array of child widgets. Each child must be of
|
||||||
|
class RectObj or any subclass thereof.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">num_children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect2></refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-1">
|
||||||
|
<title>Description
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
|
||||||
|
and removes them from their parent's geometry management.
|
||||||
|
The widgets will disappear from the screen, and (depending
|
||||||
|
on its parent) may no longer have screen space allocated for
|
||||||
|
them.
|
||||||
|
</para>
|
||||||
|
<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
|
||||||
|
the same parent.
|
||||||
|
</para>
|
||||||
|
<para>See the “Algorithm” section below for full details of the
|
||||||
|
widget unmanagement procedure.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-2">
|
||||||
|
<title>Usage</title>
|
||||||
|
<para>Unmanaging widgets is the usual method for temporarily
|
||||||
|
making them invisible. They can be re-managed with
|
||||||
|
<function>XtManageChildren()</function>.
|
||||||
|
</para>
|
||||||
|
<para>You can unmap a widget, but leave it under geometry
|
||||||
|
management by calling <function>XtUnmapWidget()</function>. You can
|
||||||
|
destroy a widget's window without destroying the widget by
|
||||||
|
calling <function>XtUnrealizeWidget()</function>. You can destroy a
|
||||||
|
widget completely with <function>XtDestroyWidget()</function>.
|
||||||
|
</para>
|
||||||
|
<para>If you are only going to unmanage a single widget, it is
|
||||||
|
more convenient to call <function>XtUnmanageChild()</function>. It is
|
||||||
|
often more convenient to call <function>XtUnmanageChild()</function>
|
||||||
|
several times than it is to declare and initialize an array
|
||||||
|
of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
|
||||||
|
<function>XtUnmanageChildren()</function> is more efficient, however,
|
||||||
|
because it only calls the parent's <function>change_managed()</function>
|
||||||
|
method once.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-3">
|
||||||
|
<title>Algorithm
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> performs the following:
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Ignores the child if it already is unmanaged or is being
|
||||||
|
destroyed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Otherwise, if the child is realized, it makes it nonvisible
|
||||||
|
by unmapping it.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-4">
|
||||||
|
<title>Structures</title>
|
||||||
|
<para>The <type>WidgetList</type> type is simply an array of widgets:
|
||||||
|
</para>
|
||||||
|
<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
|
||||||
|
</screen>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="faq">
|
||||||
|
<title>Questions and Answers</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL but recommended) This chapter should include all of the silly
|
||||||
|
(and not-so-silly) newbie questions that fill up your mailbox. This chapter
|
||||||
|
should be reserved for BRIEF questions and answers! If one question uses more
|
||||||
|
than a page or so then it should probably be part of the
|
||||||
|
"Using this Application" chapter instead. You should use links to
|
||||||
|
cross-reference questions to the parts of your documentation that answer them.
|
||||||
|
This is also a great place to provide pointers to other FAQ's if your users
|
||||||
|
must do some complicated configuration on other programs in order for your
|
||||||
|
application work. -->
|
||||||
|
|
||||||
|
&reporting.bugs;
|
||||||
|
&updating.documentation;
|
||||||
|
|
||||||
|
<qandaset id="faqlist">
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>My Mouse doesn't work. How do I quit &appname;?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You silly goose! Check out the <link linkend="commands">Commands
|
||||||
|
Section</link> for the answer.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>Why can't I twiddle my documents?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You can only twiddle your documents if you have the foobar.lib
|
||||||
|
installed.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
</qandaset>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="credits">
|
||||||
|
|
||||||
|
<!-- Include credits for the programmers, documentation writers, and
|
||||||
|
contributors here. The license for your software should then be included below
|
||||||
|
the credits with a reference to the appropriate license file included in the KDE
|
||||||
|
distribution. -->
|
||||||
|
|
||||||
|
<title>Credits and License</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname;
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Contributors:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Konqui the KDE Dragon <email>konqui@kde.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem><para>Tux the Linux Penguin <email>tux@linux.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
|
||||||
|
|
||||||
|
&underFDL; <!-- FDL: do not remove -->
|
||||||
|
|
||||||
|
<!-- Determine which license your application is licensed under,
|
||||||
|
and delete all the remaining licenses below:
|
||||||
|
|
||||||
|
(NOTE: All documentation are licensed under the FDL,
|
||||||
|
regardless of what license the application uses) -->
|
||||||
|
|
||||||
|
&underGPL; <!-- GPL License -->
|
||||||
|
&underBSDLicense; <!-- BSD License -->
|
||||||
|
&underArtisticLicense; <!-- BSD Artistic License -->
|
||||||
|
&underX11License; <!-- X11 License -->
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<appendix id="installation">
|
||||||
|
<title>Installation</title>
|
||||||
|
|
||||||
|
<sect1 id="getting-appname">
|
||||||
|
<title>How to obtain &appname;</title>
|
||||||
|
|
||||||
|
<!-- This first entity contains boiler plate for applications that are
|
||||||
|
part of KDE CVS. You should remove it if you are releasing your
|
||||||
|
application -->
|
||||||
|
|
||||||
|
&install.intro.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="requirements">
|
||||||
|
<title>Requirements</title>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
List any special requirements for your application here. This should include:
|
||||||
|
.Libraries or other software that is not included in kdesupport,
|
||||||
|
kdelibs, or kdebase.
|
||||||
|
.Hardware requirements like amount of RAM, disk space, graphics card
|
||||||
|
capabilities, screen resolution, special expansion cards, etc.
|
||||||
|
.Operating systems the app will run on. If your app is designed only for a
|
||||||
|
specific OS, (you wrote a graphical LILO configurator for example) put this
|
||||||
|
information here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
|
||||||
|
required in order to support the advanced &appname; features. &appname; uses
|
||||||
|
about 5 megs of memory to run, but this may vary depending on your
|
||||||
|
platform and configuration.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
All required libraries as well as &appname; itself can be found
|
||||||
|
on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- For a list of updates, you may refer to the application web site
|
||||||
|
or the ChangeLog file, or ... -->
|
||||||
|
<para>
|
||||||
|
You can find a list of changes at <ulink
|
||||||
|
url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="compilation">
|
||||||
|
<title>Compilation and Installation</title>
|
||||||
|
|
||||||
|
<!-- This entity contains the boilerplate text for standard -->
|
||||||
|
<!-- compilation instructions. If your application requires any -->
|
||||||
|
<!-- special handling, remove it, and replace with your own text. -->
|
||||||
|
|
||||||
|
&install.compile.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="configuration">
|
||||||
|
<title>Configuration</title>
|
||||||
|
|
||||||
|
<para>Don't forget to tell your system to start the <filename>dtd</filename>
|
||||||
|
dicer-toaster daemon first, or &appname; won't work !</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</appendix>
|
||||||
|
|
||||||
|
&documentation.index;
|
||||||
|
</book>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-general-insert-case:lower
|
||||||
|
sgml-indent-step:0
|
||||||
|
sgml-indent-data:nil
|
||||||
|
End:
|
||||||
|
|
||||||
|
vim:tabstop=2:shiftwidth=2:expandtab
|
||||||
|
-->
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
.pot and .pot translation files should be placed here.
|
@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# setup - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2003 #
|
||||||
|
# copyright : (C) 2003-2004 by AUTHOR #
|
||||||
|
# email : YOUR@EMAIL.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import kdedistutils
|
||||||
|
|
||||||
|
kdedistutils.setup(name="kdeapp",
|
||||||
|
version="0.1.0",
|
||||||
|
author="AUTHOR",
|
||||||
|
author_email="YOUR@EMAIL.com",
|
||||||
|
url="http://www.KDEAPP.com/",
|
||||||
|
min_kde_version = "3.0.0",
|
||||||
|
min_qt_version = "3.0.0",
|
||||||
|
license = "GPL",
|
||||||
|
application_data = ['src/kdeapp.py','src/prefdialog.py','src/kdeappview.py'],
|
||||||
|
executable_links = [('kdeapp','kdeapp.py')],
|
||||||
|
docbooks = [ ('doc/en','en') ] )
|
@ -0,0 +1,16 @@
|
|||||||
|
Begin3
|
||||||
|
Title: $APPNAME$ -- Some description
|
||||||
|
Version: $VERSION$
|
||||||
|
Entered-date:
|
||||||
|
Description:
|
||||||
|
Keywords: KDE Qt
|
||||||
|
Author: $AUTHOR$ <$EMAIL$>
|
||||||
|
Maintained-by: $AUTHOR$ <$EMAIL$>
|
||||||
|
Home-page:
|
||||||
|
Alternate-site:
|
||||||
|
Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
|
||||||
|
xxxxxx $APPNAMELC$-$VERSION$.tar.gz
|
||||||
|
xxx $APPNAMELC$-$VERSION$.lsm
|
||||||
|
Platform: Linux. Needs KDE
|
||||||
|
Copying-policy: $LICENSE$
|
||||||
|
End
|
@ -0,0 +1,280 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# kdeapp - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from qt import *
|
||||||
|
from kdecore import *
|
||||||
|
from kdeui import *
|
||||||
|
import sys
|
||||||
|
from prefdialog import *
|
||||||
|
from kdeappview import *
|
||||||
|
|
||||||
|
description = "A KDE Application"
|
||||||
|
version = "0.1";
|
||||||
|
|
||||||
|
class KdeApp(KMainWindow):
|
||||||
|
def __init__(self):
|
||||||
|
KMainWindow.__init__(self,None,"KdeApp")
|
||||||
|
|
||||||
|
self._view = KdeAppView(self)
|
||||||
|
self._printer = None
|
||||||
|
|
||||||
|
# accept dnd
|
||||||
|
self.setAcceptDrops(True)
|
||||||
|
|
||||||
|
# tell the KMainWindow that this is indeed the main widget
|
||||||
|
self.setCentralWidget(self._view)
|
||||||
|
|
||||||
|
# then, setup our actions
|
||||||
|
self._setupActions()
|
||||||
|
|
||||||
|
# and a status bar
|
||||||
|
self.statusBar().show()
|
||||||
|
|
||||||
|
# Apply the create the main window and ask the mainwindow to
|
||||||
|
# automatically save settings if changed: window size, toolbar
|
||||||
|
# position, icon size, etc. Also to add actions for the statusbar
|
||||||
|
# toolbar, and keybindings if necessary.
|
||||||
|
self.setAutoSaveSettings()
|
||||||
|
|
||||||
|
# allow the view to change the statusbar and caption
|
||||||
|
self.connect(self._view, PYSIGNAL("signalChangeStatusbar"), self.changeStatusbar)
|
||||||
|
self.connect(self._view, PYSIGNAL("signalChangeCaption"), self.changeCaption)
|
||||||
|
|
||||||
|
def load(self,url):
|
||||||
|
target = QString()
|
||||||
|
# the below code is what you should normally do. in this
|
||||||
|
# example case, we want the url to our own. you probably
|
||||||
|
# want to use this code instead for your app
|
||||||
|
|
||||||
|
if False:
|
||||||
|
# download the contents
|
||||||
|
if KIO.NetAccess.download(url, target):
|
||||||
|
# set our caption
|
||||||
|
self.setCaption(url)
|
||||||
|
|
||||||
|
# load in the file (target is always local)
|
||||||
|
self.loadFile(target)
|
||||||
|
|
||||||
|
# and remove the temp file
|
||||||
|
KIO.NetAccess.removeTempFile(target)
|
||||||
|
|
||||||
|
self.setCaption(url.prettyURL())
|
||||||
|
self._view.openURL(url)
|
||||||
|
|
||||||
|
|
||||||
|
def _setupActions(self):
|
||||||
|
global kapp
|
||||||
|
KStdAction.openNew(self.fileNew, self.actionCollection())
|
||||||
|
KStdAction.open(self.fileOpen, self.actionCollection())
|
||||||
|
KStdAction.save(self.fileSave, self.actionCollection())
|
||||||
|
KStdAction.saveAs(self.fileSaveAs, self.actionCollection())
|
||||||
|
KStdAction.print_(self.filePrint, self.actionCollection())
|
||||||
|
KStdAction.quit(kapp.quit, self.actionCollection())
|
||||||
|
|
||||||
|
self._toolbarAction = KStdAction.showToolbar(self.optionsShowToolbar, self.actionCollection())
|
||||||
|
self._statusbarAction = KStdAction.showStatusbar(self.optionsShowStatusbar, self.actionCollection())
|
||||||
|
KStdAction.keyBindings(self.optionsConfigureKeys, self.actionCollection())
|
||||||
|
|
||||||
|
KStdAction.configureToolbars(self.optionsConfigureToolbars, self.actionCollection())
|
||||||
|
KStdAction.preferences(self.optionsPreferences, self.actionCollection())
|
||||||
|
|
||||||
|
# this doesn't do anything useful. it's just here to illustrate
|
||||||
|
# how to insert a custom menu and menu item
|
||||||
|
custom = KAction(i18n("Cus&tom Menuitem"), KShortcut(),
|
||||||
|
self.optionsPreferences,
|
||||||
|
self.actionCollection(), "custom_action")
|
||||||
|
self.createGUI()
|
||||||
|
|
||||||
|
def _saveProperties(self,config):
|
||||||
|
# the 'config' object points to the session managed
|
||||||
|
# config file. anything you write here will be available
|
||||||
|
# later when this app is restored
|
||||||
|
|
||||||
|
if not self._view.currentURL().isEmpty():
|
||||||
|
config.writeEntry("lastURL", self._view.currentURL())
|
||||||
|
|
||||||
|
def _readProperties(self,config):
|
||||||
|
# the 'config' object points to the session managed
|
||||||
|
# config file. this function is automatically called whenever
|
||||||
|
# the app is being restored. read in here whatever you wrote
|
||||||
|
# in 'saveProperties'
|
||||||
|
|
||||||
|
url = config.readPathEntry("lastURL")
|
||||||
|
|
||||||
|
if not url.isEmpty():
|
||||||
|
self._view.openURL(KURL(url))
|
||||||
|
|
||||||
|
def dragEnterEvent(self,event):
|
||||||
|
# accept uri drops only
|
||||||
|
event.accept(KURLDrag.canDecode(event))
|
||||||
|
|
||||||
|
def dropEvent(self,event):
|
||||||
|
# this is a very simplistic implementation of a drop event. we
|
||||||
|
# will only accept a dropped URL. the Qt dnd code can do *much*
|
||||||
|
# much more, so please read the docs there
|
||||||
|
urls = KURL.List()
|
||||||
|
|
||||||
|
# see if we can decode a URI.. if not, just ignore it
|
||||||
|
if KURLDrag.decode(event, urls) and not urls.isEmpty():
|
||||||
|
# okay, we have a URI.. process it
|
||||||
|
url = urls.first()
|
||||||
|
|
||||||
|
# load in the file
|
||||||
|
self.load(url)
|
||||||
|
|
||||||
|
def fileNew(self):
|
||||||
|
# this slot is called whenever the File->New menu is selected,
|
||||||
|
# the New shortcut is pressed (usually CTRL+N) or the New toolbar
|
||||||
|
# button is clicked
|
||||||
|
|
||||||
|
# create a new window
|
||||||
|
KdeApp().show()
|
||||||
|
|
||||||
|
def fileOpen(self):
|
||||||
|
# this slot is called whenever the File->Open menu is selected,
|
||||||
|
# the Open shortcut is pressed (usually CTRL+O) or the Open toolbar
|
||||||
|
# button is clicked
|
||||||
|
|
||||||
|
## this brings up the generic open dialog
|
||||||
|
#KURL url = KURLRequesterDlg::getURL(QString::null, this, i18n("Open Location") );
|
||||||
|
|
||||||
|
# standard filedialog
|
||||||
|
url = KFileDialog.getOpenURL(None, One, self, i18n("Open Location"))
|
||||||
|
if not url.isEmpty():
|
||||||
|
self._view.openURL(url)
|
||||||
|
|
||||||
|
def fileSave(self):
|
||||||
|
# this slot is called whenever the File->Save menu is selected,
|
||||||
|
# the Save shortcut is pressed (usually CTRL+S) or the Save toolbar
|
||||||
|
# button is clicked
|
||||||
|
|
||||||
|
# save the current file
|
||||||
|
pass
|
||||||
|
|
||||||
|
def fileSaveAs(self):
|
||||||
|
# this slot is called whenever the File->Save As menu is selected,
|
||||||
|
file_url = KFileDialog.getSaveURL()
|
||||||
|
if not file_url.isEmpty() and file_url.isValid():
|
||||||
|
# save your info, here
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def filePrint(self):
|
||||||
|
# this slot is called whenever the File->Print menu is selected,
|
||||||
|
# the Print shortcut is pressed (usually CTRL+P) or the Print toolbar
|
||||||
|
# button is clicked
|
||||||
|
if self._printer is None:
|
||||||
|
self._printer = KPrinter()
|
||||||
|
|
||||||
|
if self._printer.setup(self):
|
||||||
|
# setup the printer. with Qt, you always "print" to a
|
||||||
|
# QPainter.. whether the output medium is a pixmap, a screen,
|
||||||
|
# or paper
|
||||||
|
p = QPainter()
|
||||||
|
p.begin(self._printer)
|
||||||
|
|
||||||
|
# we let our view do the actual printing
|
||||||
|
metrics = QPaintDeviceMetrics(m_printer)
|
||||||
|
self._view.print_(p, metrics.height(), metrics.width())
|
||||||
|
|
||||||
|
# and send the result to the printer
|
||||||
|
p.end();
|
||||||
|
|
||||||
|
def optionsPreferences(self):
|
||||||
|
# popup some sort of preference dialog, here
|
||||||
|
dlg = PreferencesDialog()
|
||||||
|
if dlg.exec_loop():
|
||||||
|
# redo your settings
|
||||||
|
pass
|
||||||
|
|
||||||
|
def optionsShowToolbar(self):
|
||||||
|
# this is all very cut and paste code for showing/hiding the
|
||||||
|
# toolbar
|
||||||
|
if self._toolbarAction.isChecked():
|
||||||
|
self.toolBar().show()
|
||||||
|
else:
|
||||||
|
self.toolBar().hide()
|
||||||
|
|
||||||
|
def optionsShowStatusbar(self):
|
||||||
|
# this is all very cut and paste code for showing/hiding the
|
||||||
|
# statusbar
|
||||||
|
|
||||||
|
if self._statusbarAction.isChecked():
|
||||||
|
self.statusBar().show()
|
||||||
|
else:
|
||||||
|
self.statusBar().hide()
|
||||||
|
|
||||||
|
def optionsConfigureKeys(self):
|
||||||
|
KKeyDialog.configure(self.actionCollection())
|
||||||
|
|
||||||
|
def optionsConfigureToolbars(self):
|
||||||
|
# use the standard toolbar editor
|
||||||
|
self.saveMainWindowSettings(KGlobal.config())
|
||||||
|
|
||||||
|
def newToolbarConfig(self):
|
||||||
|
# this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
|
||||||
|
# recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
|
||||||
|
self.createGUI()
|
||||||
|
self.applyMainWindowSettings(KGlobal.config())
|
||||||
|
|
||||||
|
def changeStatusbar(self,text):
|
||||||
|
# display the text on the statusbar
|
||||||
|
self.statusBar().message(text)
|
||||||
|
|
||||||
|
def changeCaption(self,text):
|
||||||
|
# display the text on the caption
|
||||||
|
self.setCaption(text)
|
||||||
|
|
||||||
|
|
||||||
|
options = [ ("+[URL]", "Document to open", "") ]
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global kapp,version,description,options
|
||||||
|
|
||||||
|
aboutdata = KAboutData("kdeapp", "KdeApp", version, description, \
|
||||||
|
KAboutData.License_GPL, "(C) 2005 AUTHOR", None, None, "your@email.com")
|
||||||
|
aboutdata.addAuthor("AUTHOR", None, "your@email.com")
|
||||||
|
KCmdLineArgs.init(sys.argv,aboutdata)
|
||||||
|
KCmdLineArgs.addCmdLineOptions(options)
|
||||||
|
kapp = KApplication()
|
||||||
|
|
||||||
|
# register ourselves as a dcop client
|
||||||
|
kapp.dcopClient().registerAs(kapp.name(), False)
|
||||||
|
|
||||||
|
# see if we are starting with session management
|
||||||
|
if kapp.isRestored():
|
||||||
|
n = 1
|
||||||
|
while KMainWindow.canBeRestored(n):
|
||||||
|
KdeApp().restore(n)
|
||||||
|
n += 1
|
||||||
|
else:
|
||||||
|
# no session.. just start up normally
|
||||||
|
args = KCmdLineArgs.parsedArgs()
|
||||||
|
if args.count() == 0:
|
||||||
|
widget = KdeApp()
|
||||||
|
widget.show()
|
||||||
|
else:
|
||||||
|
i = 0
|
||||||
|
for i in range(args.count()):
|
||||||
|
widget = KdeApp()
|
||||||
|
widget.show()
|
||||||
|
widget.load(args.url(i))
|
||||||
|
|
||||||
|
args.clear()
|
||||||
|
|
||||||
|
return kapp.exec_loop()
|
||||||
|
main()
|
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# testappiface - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2003 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from dcopexport import DCOPExObj
|
||||||
|
|
||||||
|
class TestAppIface(DCOPExObj):
|
||||||
|
def __init__(self, parent, id="Value"):
|
||||||
|
DCOPExObj.__init__(self, id)
|
||||||
|
self.addMethod("void openURL(QString url)", self.openURL)
|
||||||
|
|
||||||
|
def openURL(self,url):
|
||||||
|
pass
|
@ -0,0 +1,8 @@
|
|||||||
|
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
|
||||||
|
<kpartgui name="testapp" version="1">
|
||||||
|
<MenuBar>
|
||||||
|
<Menu name="custom"><text>C&ustom</text>
|
||||||
|
<Action name="custom_action" />
|
||||||
|
</Menu>
|
||||||
|
</MenuBar>
|
||||||
|
</kpartgui>
|
@ -0,0 +1,91 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# kdeappview - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from qt import *
|
||||||
|
from kdecore import *
|
||||||
|
from kdeui import *
|
||||||
|
from kio import *
|
||||||
|
from khtml import *
|
||||||
|
from kparts import *
|
||||||
|
#from kdeappiface import *
|
||||||
|
|
||||||
|
class KdeAppView(QWidget):
|
||||||
|
def __init__(self,parent):
|
||||||
|
QWidget.__init__(self,parent)
|
||||||
|
#self._dcopclient= KdeAppIface(self,"KdeAppIface")
|
||||||
|
|
||||||
|
# setup our layout manager to automatically add our widgets
|
||||||
|
top_layout = QHBoxLayout(self)
|
||||||
|
top_layout.setAutoAdd(True)
|
||||||
|
|
||||||
|
if True:
|
||||||
|
self._html = KHTMLPart(self)
|
||||||
|
else:
|
||||||
|
|
||||||
|
# we want to look for all components that satisfy our needs. the
|
||||||
|
# trader will actually search through *all* registered KDE
|
||||||
|
# applications and components -- not just KParts. So we have to
|
||||||
|
# specify two things: a service type and a constraint
|
||||||
|
#
|
||||||
|
# the service type is like a mime type. we say that we want all
|
||||||
|
# applications and components that can handle HTML -- 'text/html'
|
||||||
|
#
|
||||||
|
# however, by itself, this will return such things as Netscape..
|
||||||
|
# not what we wanted. so we constrain it by saying that the
|
||||||
|
# string 'KParts/ReadOnlyPart' must be found in the ServiceTypes
|
||||||
|
# field. with this, only components of the type we want will be
|
||||||
|
# returned.
|
||||||
|
offers = KTrader.self().query("text/html", "'KParts/ReadOnlyPart' in ServiceTypes")
|
||||||
|
|
||||||
|
self._html = None
|
||||||
|
# in theory, we only care about the first one.. but let's try all
|
||||||
|
# offers just in case the first can't be loaded for some reason
|
||||||
|
for ptr in offers:
|
||||||
|
# we now know that our offer can handle HTML and is a part.
|
||||||
|
# since it is a part, it must also have a library... let's try to
|
||||||
|
# load that now
|
||||||
|
self._html = createReadOnlyPart(ptr.library(),self,ptr.name(),"KParts::ReadOnlyPart",QStringList())
|
||||||
|
if self._html is not None:
|
||||||
|
break
|
||||||
|
|
||||||
|
# if our factory is invalid, then we never found our component
|
||||||
|
# and we might as well just exit now
|
||||||
|
if self._html is None:
|
||||||
|
KMessageBox.error(self, i18n("Could not find a suitable HTML component"))
|
||||||
|
return
|
||||||
|
|
||||||
|
QObject.connect(self._html, SIGNAL("setWindowCaption(const QString&)"), self.slotSetTitle)
|
||||||
|
QObject.connect(self._html, SIGNAL("setStatusBarText(const QString&)"), self.slotOnURL)
|
||||||
|
|
||||||
|
def print_(self,p,height,width):
|
||||||
|
pass
|
||||||
|
# do the actual printing, here
|
||||||
|
# p.drawText(etc..)
|
||||||
|
|
||||||
|
def currentURL(self):
|
||||||
|
return self._html.url().url()
|
||||||
|
|
||||||
|
def openURL(self,url):
|
||||||
|
if isinstance(url,QString):
|
||||||
|
url = KURL(url)
|
||||||
|
self._html.openURL(url)
|
||||||
|
|
||||||
|
def slotOnURL(self,url):
|
||||||
|
self.emit(PYSIGNAL("signalChangeStatusbar"),(url,) )
|
||||||
|
|
||||||
|
def slotSetTitle(self,title):
|
||||||
|
self.emit(PYSIGNAL("signalChangeCaption"),(title,) )
|
@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# testapp - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from qt import *
|
||||||
|
from kdecore import *
|
||||||
|
from kdeui import *
|
||||||
|
|
||||||
|
class TestAppPrefDialog(KDialogBase):
|
||||||
|
def __init__(self):
|
||||||
|
KDialogBase.__init__(TreeList, i18n("TestApp Preferences"),
|
||||||
|
KDialogBase.Help|KDialogBase.Default|KDialogBase.Ok|KDialogBase.Apply|KDialogBase.Cancel, Ok)
|
||||||
|
|
||||||
|
# this is the base class for your preferences dialog. it is now
|
||||||
|
# a Treelist dialog.. but there are a number of other
|
||||||
|
# possibilities (including Tab, Swallow, and just Plain)
|
||||||
|
frame = self.addPage(i18n("First Page"), i18n("Page One Options"))
|
||||||
|
self._pageOne = TestAppPrefPageOne(frame)
|
||||||
|
|
||||||
|
frame = self.addPage(i18n("Second Page"), i18n("Page Two Options"))
|
||||||
|
self._pageTwo = TestAppPrefPageTwo(frame)
|
||||||
|
|
||||||
|
class TestAppPrefPageOne(QFrame):
|
||||||
|
def __init__(self,parent):
|
||||||
|
QFrame.__init__(self,parent)
|
||||||
|
|
||||||
|
layout = QHBoxLayout(self)
|
||||||
|
layout.setAutoAdd(True)
|
||||||
|
|
||||||
|
QLabel(i18n("Add something here"), self)
|
||||||
|
|
||||||
|
class TestAppPrefPageTwo(QFrame):
|
||||||
|
def __init__(self,parent):
|
||||||
|
QFrame.__init__(self,parent)
|
||||||
|
|
||||||
|
layout = QHBoxLayout(self)
|
||||||
|
layout.setAutoAdd(True)
|
||||||
|
|
||||||
|
QLabel(i18n("Add something here"), self)
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
$AUTHOR$ <$EMAIL$>
|
@ -0,0 +1,43 @@
|
|||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
This software uses the Python language's distutils system for installation.
|
||||||
|
A detailed guide for users and system administrators to using distutils to
|
||||||
|
install software can be found here:
|
||||||
|
|
||||||
|
http://docs.python.org/inst/inst.html
|
||||||
|
|
||||||
|
The simplest way to install this software is to run the following command as
|
||||||
|
the root user:
|
||||||
|
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
The setup.py script will automatically detect the directories to use for
|
||||||
|
documentation, binaries and other software files.
|
||||||
|
|
||||||
|
|
||||||
|
Uninstallation
|
||||||
|
==============
|
||||||
|
During installation setup.py creates list of files and directories that
|
||||||
|
were installed in a file called install_log.txt.
|
||||||
|
|
||||||
|
python setup.py uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Installing into an alternate root
|
||||||
|
=================================
|
||||||
|
For packaging purposes it is often very useful to be able to install all files
|
||||||
|
relative not to the usual root directory (/) but into an alternative
|
||||||
|
directory.
|
||||||
|
|
||||||
|
python setup.py install --root=/tmp/alternativeroot/
|
||||||
|
|
||||||
|
|
||||||
|
Operation Controls
|
||||||
|
==================
|
||||||
|
--verbose
|
||||||
|
Print more information about what setup.py is doing.
|
||||||
|
|
||||||
|
--help
|
||||||
|
Print a summary of the options to setup.py, and exit.
|
@ -0,0 +1,6 @@
|
|||||||
|
recursive-include doc *.docbook *.png
|
||||||
|
recursive-include po *.po *.pot
|
||||||
|
include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
|
||||||
|
global-include *.desktop *.py *.ui *.png *.lsm
|
||||||
|
global-exclude *~ .svn
|
||||||
|
global-exclude *~ .cvs
|
@ -0,0 +1,555 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
|
||||||
|
<!ENTITY appname "<application>MyApplicaition 0.1</application>">
|
||||||
|
<!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
|
||||||
|
<!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
|
||||||
|
<!ENTITY % addindex "IGNORE">
|
||||||
|
<!ENTITY % English "INCLUDE"><!-- change language only here -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not define any other entities; instead, use the entities
|
||||||
|
from kde-genent.entities and $LANG/user.entities. -->
|
||||||
|
]>
|
||||||
|
<!-- kdoctemplate v0.8 October 1 1999
|
||||||
|
Minor update to "Credits and Licenses" section on August 24, 2000
|
||||||
|
Removed "Revision history" section on 22 January 2001
|
||||||
|
Changed to Installation/Help menu entities 18 October 2001
|
||||||
|
Other minor cleanup and changes 18 October 2001 -->
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This template was designed by: David Rugge davidrugge@mindspring.com
|
||||||
|
with lots of help from: Eric Bischoff ebisch@cybercable.tm.fr
|
||||||
|
and Frederik Fouvry fouvry@sfs.nphil.uni-tuebingen.de
|
||||||
|
of the KDE DocBook team.
|
||||||
|
|
||||||
|
You may freely use this template for writing any sort of KDE documentation.
|
||||||
|
If you have any changes or improvements, please let us know.
|
||||||
|
|
||||||
|
Remember:
|
||||||
|
- in XML, the case of the <tags> and attributes is relevant ;
|
||||||
|
- also, quote all attributes.
|
||||||
|
|
||||||
|
Please don't forget to remove all these comments in your final documentation,
|
||||||
|
thanks ;-).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- ................................................................ -->
|
||||||
|
|
||||||
|
<!-- The language must NOT be changed here. -->
|
||||||
|
|
||||||
|
<book lang="&language;">
|
||||||
|
|
||||||
|
<!-- This header contains all of the meta-information for the document such
|
||||||
|
as Authors, publish date, the abstract, and Keywords -->
|
||||||
|
|
||||||
|
<bookinfo>
|
||||||
|
<title>The &appname; Handbook</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname></firstname>
|
||||||
|
<othername></othername>
|
||||||
|
<surname>%{AUTHOR}</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address><email>%{EMAIL}</email></address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>1999</year>
|
||||||
|
<year>%{YEAR}</year>
|
||||||
|
<holder>%{AUTHOR}</holder>
|
||||||
|
</copyright>
|
||||||
|
<!-- Translators: put here the copyright notice of the translation -->
|
||||||
|
<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
|
||||||
|
and in the FDL itself on how to use it. -->
|
||||||
|
<legalnotice>&FDLNotice;</legalnotice>
|
||||||
|
|
||||||
|
<!-- Date and version information of the documentation
|
||||||
|
Don't forget to include this last date and this last revision number, we
|
||||||
|
need them for translation coordination !
|
||||||
|
Please respect the format of the date (YYYY-MM-DD) and of the version
|
||||||
|
(V.MM.LL), it could be used by automation scripts.
|
||||||
|
Do NOT change these in the translation. -->
|
||||||
|
|
||||||
|
<date>2001-10-18</date>
|
||||||
|
<releaseinfo>%{VERSION}</releaseinfo>
|
||||||
|
|
||||||
|
<!-- Abstract about this handbook -->
|
||||||
|
|
||||||
|
<abstract>
|
||||||
|
<para>
|
||||||
|
&appname; is an application specially designed to do nothing you would
|
||||||
|
ever want.
|
||||||
|
</para>
|
||||||
|
</abstract>
|
||||||
|
|
||||||
|
<!-- This is a set of Keywords for indexing by search engines.
|
||||||
|
Please at least include KDE, the KDE package it is in, the name
|
||||||
|
of your application, and a few relevant keywords. -->
|
||||||
|
|
||||||
|
<keywordset>
|
||||||
|
<keyword>KDE</keyword>
|
||||||
|
<keyword>%{APPNAME}</keyword>
|
||||||
|
<keyword>nothing</keyword>
|
||||||
|
<keyword>nothing else</keyword>
|
||||||
|
</keywordset>
|
||||||
|
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<!-- The contents of the documentation begin here. Label
|
||||||
|
each chapter so with the id attribute. This is necessary for two reasons: it
|
||||||
|
allows you to easily reference the chapter from other chapters of your
|
||||||
|
document, and if there is no ID, the name of the generated HTML files will vary
|
||||||
|
from time to time making it hard to manage for maintainers and for the CVS
|
||||||
|
system. Any chapter labelled (OPTIONAL) may be left out at the author's
|
||||||
|
discretion. Other chapters should not be left out in order to maintain a
|
||||||
|
consistent documentation style across all KDE apps. -->
|
||||||
|
|
||||||
|
<chapter id="introduction">
|
||||||
|
<title>Introduction</title>
|
||||||
|
|
||||||
|
<!-- The introduction chapter contains a brief introduction for the
|
||||||
|
application that explains what it does and where to report
|
||||||
|
problems. Basically a long version of the abstract. Don't include a
|
||||||
|
revision history. (see installation appendix comment) -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; is a program that lets you do absolutely nothing. Please report
|
||||||
|
any problems or feature requests to the &kde; mailing lists.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="using-appname">
|
||||||
|
<title>Using &appname;</title>
|
||||||
|
|
||||||
|
<!-- This chapter should tell the user how to use your app. You should use as
|
||||||
|
many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
|
||||||
|
your application. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
|
||||||
|
<!-- Note that all graphics should be in .png format. Use no gifs because of
|
||||||
|
patent issues. -->
|
||||||
|
|
||||||
|
<screenshot>
|
||||||
|
<screeninfo>Here's a screenshot of &appname;</screeninfo>
|
||||||
|
<mediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Screenshot</phrase>
|
||||||
|
</textobject>
|
||||||
|
</mediaobject>
|
||||||
|
</screenshot>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<sect1 id="appname-features">
|
||||||
|
<title>More &appname; features</title>
|
||||||
|
|
||||||
|
<para>It slices! It dices! and it comes with a free toaster!</para>
|
||||||
|
<para>
|
||||||
|
The Squiggle Tool <guiicon><inlinemediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Squiggle</phrase>
|
||||||
|
</textobject>
|
||||||
|
</inlinemediaobject></guiicon> is used to draw squiggly lines all over
|
||||||
|
the &appname; main window. It's not a bug, it's a feature!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="commands">
|
||||||
|
<title>Command Reference</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
|
||||||
|
application windows and their menubar and toolbar commands for easy reference.
|
||||||
|
Also include any keys that have a special function but have no equivalent in the
|
||||||
|
menus or toolbars. This may not be necessary for small apps or apps with no tool
|
||||||
|
or menu bars. -->
|
||||||
|
|
||||||
|
<sect1 id="appname-mainwindow">
|
||||||
|
<title>The main &appname; window</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The File Menu</title>
|
||||||
|
<para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>New</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Creates a new document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Save</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Saves the document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Quit</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Quits</action> &appname;</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The <guimenu>Help</guimenu> Menu</title>
|
||||||
|
|
||||||
|
<!-- Assuming you have a standard help menu (help, what's this, about -->
|
||||||
|
<!-- &appname;, about KDE) then the documentation is already written. -->
|
||||||
|
<!-- The following entity is valid anywhere that a variablelist is -->
|
||||||
|
<!-- valid. -->
|
||||||
|
|
||||||
|
&help.menu.documentation;
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="developers">
|
||||||
|
<title>Developer's Guide to &appname;</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
|
||||||
|
used for apps that use plugins or that provide their own scripting hooks
|
||||||
|
and/or development libraries. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Programming &appname; plugins is a joy to behold. Just read through the next
|
||||||
|
66 pages of API's to learn how!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
|
||||||
|
should consult the docbook reference for further details. The example below was
|
||||||
|
taken from that reference and shortened a bit for readability. -->
|
||||||
|
|
||||||
|
<refentry id="re-1007-unmanagechildren-1">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>XtUnmanageChildren</refentrytitle>
|
||||||
|
<refmiscinfo>Xt - Geometry Management</refmiscinfo>
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>XtUnmanageChildren
|
||||||
|
</refname>
|
||||||
|
<refpurpose>remove a list of children from a parent widget's managed
|
||||||
|
list.
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
|
||||||
|
</refpurpose>
|
||||||
|
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<refsynopsisdivinfo>
|
||||||
|
<date>4 March 1996</date>
|
||||||
|
</refsynopsisdivinfo>
|
||||||
|
<synopsis>
|
||||||
|
void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
|
||||||
|
WidgetList <replaceable class="parameter">children</replaceable>;
|
||||||
|
Cardinal <replaceable class="parameter">num_children</replaceable>;
|
||||||
|
</synopsis>
|
||||||
|
|
||||||
|
<refsect2 id="r2-1007-unmanagechildren-1">
|
||||||
|
<title>Inputs</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies an array of child widgets. Each child must be of
|
||||||
|
class RectObj or any subclass thereof.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">num_children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect2></refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-1">
|
||||||
|
<title>Description
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
|
||||||
|
and removes them from their parent's geometry management.
|
||||||
|
The widgets will disappear from the screen, and (depending
|
||||||
|
on its parent) may no longer have screen space allocated for
|
||||||
|
them.
|
||||||
|
</para>
|
||||||
|
<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
|
||||||
|
the same parent.
|
||||||
|
</para>
|
||||||
|
<para>See the “Algorithm” section below for full details of the
|
||||||
|
widget unmanagement procedure.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-2">
|
||||||
|
<title>Usage</title>
|
||||||
|
<para>Unmanaging widgets is the usual method for temporarily
|
||||||
|
making them invisible. They can be re-managed with
|
||||||
|
<function>XtManageChildren()</function>.
|
||||||
|
</para>
|
||||||
|
<para>You can unmap a widget, but leave it under geometry
|
||||||
|
management by calling <function>XtUnmapWidget()</function>. You can
|
||||||
|
destroy a widget's window without destroying the widget by
|
||||||
|
calling <function>XtUnrealizeWidget()</function>. You can destroy a
|
||||||
|
widget completely with <function>XtDestroyWidget()</function>.
|
||||||
|
</para>
|
||||||
|
<para>If you are only going to unmanage a single widget, it is
|
||||||
|
more convenient to call <function>XtUnmanageChild()</function>. It is
|
||||||
|
often more convenient to call <function>XtUnmanageChild()</function>
|
||||||
|
several times than it is to declare and initialize an array
|
||||||
|
of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
|
||||||
|
<function>XtUnmanageChildren()</function> is more efficient, however,
|
||||||
|
because it only calls the parent's <function>change_managed()</function>
|
||||||
|
method once.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-3">
|
||||||
|
<title>Algorithm
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> performs the following:
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Ignores the child if it already is unmanaged or is being
|
||||||
|
destroyed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Otherwise, if the child is realized, it makes it nonvisible
|
||||||
|
by unmapping it.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-4">
|
||||||
|
<title>Structures</title>
|
||||||
|
<para>The <type>WidgetList</type> type is simply an array of widgets:
|
||||||
|
</para>
|
||||||
|
<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
|
||||||
|
</screen>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="faq">
|
||||||
|
<title>Questions and Answers</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL but recommended) This chapter should include all of the silly
|
||||||
|
(and not-so-silly) newbie questions that fill up your mailbox. This chapter
|
||||||
|
should be reserved for BRIEF questions and answers! If one question uses more
|
||||||
|
than a page or so then it should probably be part of the
|
||||||
|
"Using this Application" chapter instead. You should use links to
|
||||||
|
cross-reference questions to the parts of your documentation that answer them.
|
||||||
|
This is also a great place to provide pointers to other FAQ's if your users
|
||||||
|
must do some complicated configuration on other programs in order for your
|
||||||
|
application work. -->
|
||||||
|
|
||||||
|
&reporting.bugs;
|
||||||
|
&updating.documentation;
|
||||||
|
|
||||||
|
<qandaset id="faqlist">
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>My Mouse doesn't work. How do I quit &appname;?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You silly goose! Check out the <link linkend="commands">Commands
|
||||||
|
Section</link> for the answer.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>Why can't I twiddle my documents?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You can only twiddle your documents if you have the foobar.lib
|
||||||
|
installed.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
</qandaset>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="credits">
|
||||||
|
|
||||||
|
<!-- Include credits for the programmers, documentation writers, and
|
||||||
|
contributors here. The license for your software should then be included below
|
||||||
|
the credits with a reference to the appropriate license file included in the KDE
|
||||||
|
distribution. -->
|
||||||
|
|
||||||
|
<title>Credits and License</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname;
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Contributors:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Konqui the KDE Dragon <email>konqui@kde.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem><para>Tux the Linux Penguin <email>tux@linux.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
|
||||||
|
|
||||||
|
&underFDL; <!-- FDL: do not remove -->
|
||||||
|
|
||||||
|
<!-- Determine which license your application is licensed under,
|
||||||
|
and delete all the remaining licenses below:
|
||||||
|
|
||||||
|
(NOTE: All documentation are licensed under the FDL,
|
||||||
|
regardless of what license the application uses) -->
|
||||||
|
|
||||||
|
&underGPL; <!-- GPL License -->
|
||||||
|
&underBSDLicense; <!-- BSD License -->
|
||||||
|
&underArtisticLicense; <!-- BSD Artistic License -->
|
||||||
|
&underX11License; <!-- X11 License -->
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<appendix id="installation">
|
||||||
|
<title>Installation</title>
|
||||||
|
|
||||||
|
<sect1 id="getting-appname">
|
||||||
|
<title>How to obtain &appname;</title>
|
||||||
|
|
||||||
|
<!-- This first entity contains boiler plate for applications that are
|
||||||
|
part of KDE CVS. You should remove it if you are releasing your
|
||||||
|
application -->
|
||||||
|
|
||||||
|
&install.intro.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="requirements">
|
||||||
|
<title>Requirements</title>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
List any special requirements for your application here. This should include:
|
||||||
|
.Libraries or other software that is not included in kdesupport,
|
||||||
|
kdelibs, or kdebase.
|
||||||
|
.Hardware requirements like amount of RAM, disk space, graphics card
|
||||||
|
capabilities, screen resolution, special expansion cards, etc.
|
||||||
|
.Operating systems the app will run on. If your app is designed only for a
|
||||||
|
specific OS, (you wrote a graphical LILO configurator for example) put this
|
||||||
|
information here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
|
||||||
|
required in order to support the advanced &appname; features. &appname; uses
|
||||||
|
about 5 megs of memory to run, but this may vary depending on your
|
||||||
|
platform and configuration.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
All required libraries as well as &appname; itself can be found
|
||||||
|
on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- For a list of updates, you may refer to the application web site
|
||||||
|
or the ChangeLog file, or ... -->
|
||||||
|
<para>
|
||||||
|
You can find a list of changes at <ulink
|
||||||
|
url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="compilation">
|
||||||
|
<title>Compilation and Installation</title>
|
||||||
|
|
||||||
|
<!-- This entity contains the boilerplate text for standard -->
|
||||||
|
<!-- compilation instructions. If your application requires any -->
|
||||||
|
<!-- special handling, remove it, and replace with your own text. -->
|
||||||
|
|
||||||
|
&install.compile.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="configuration">
|
||||||
|
<title>Configuration</title>
|
||||||
|
|
||||||
|
<para>Don't forget to tell your system to start the <filename>dtd</filename>
|
||||||
|
dicer-toaster daemon first, or &appname; won't work !</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</appendix>
|
||||||
|
|
||||||
|
&documentation.index;
|
||||||
|
</book>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-general-insert-case:lower
|
||||||
|
sgml-indent-step:0
|
||||||
|
sgml-indent-data:nil
|
||||||
|
End:
|
||||||
|
|
||||||
|
vim:tabstop=2:shiftwidth=2:expandtab
|
||||||
|
-->
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
.pot and .pot translation files should be placed here.
|
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# setup - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : YOUR@EMAIL.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import kdedistutils
|
||||||
|
|
||||||
|
kdedistutils.setup(name="kdeutility",
|
||||||
|
version="0.1.0",
|
||||||
|
author="AUTHOR",
|
||||||
|
author_email="YOUR@EMAIL.com",
|
||||||
|
url="http://www.TESTAPP.com/",
|
||||||
|
min_kde_version = "3.0.0",
|
||||||
|
min_qt_version = "3.0.0",
|
||||||
|
license = "GPL",
|
||||||
|
application_data = ['src/kdeutility.py','src/KDEUtilityDialogUI.ui'],
|
||||||
|
executable_links = [('kdeutility','kdeutility.py')],
|
||||||
|
docbooks = [ ('doc/en','en') ],
|
||||||
|
i18n = ('po',['src']) )
|
@ -0,0 +1,33 @@
|
|||||||
|
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
||||||
|
<class>KDEUtilityDialogUI</class>
|
||||||
|
<widget class="QDialog">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>KDEUtilityDialogUI</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>600</width>
|
||||||
|
<height>480</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="caption">
|
||||||
|
<string>KDE Utility</string>
|
||||||
|
</property>
|
||||||
|
<vbox>
|
||||||
|
<property name="name">
|
||||||
|
<cstring>unnamed</cstring>
|
||||||
|
</property>
|
||||||
|
<widget class="QPushButton">
|
||||||
|
<property name="name">
|
||||||
|
<cstring>hellobutton</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Hello, Good bye</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</vbox>
|
||||||
|
</widget>
|
||||||
|
<layoutdefaults spacing="6" margin="11"/>
|
||||||
|
</UI>
|
@ -0,0 +1,16 @@
|
|||||||
|
Begin3
|
||||||
|
Title: $APPNAME$ -- Some description
|
||||||
|
Version: $VERSION$
|
||||||
|
Entered-date:
|
||||||
|
Description:
|
||||||
|
Keywords: KDE Qt
|
||||||
|
Author: $AUTHOR$ <$EMAIL$>
|
||||||
|
Maintained-by: $AUTHOR$ <$EMAIL$>
|
||||||
|
Home-page:
|
||||||
|
Alternate-site:
|
||||||
|
Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
|
||||||
|
xxxxxx $APPNAMELC$-$VERSION$.tar.gz
|
||||||
|
xxx $APPNAMELC$-$VERSION$.lsm
|
||||||
|
Platform: Linux. Needs KDE
|
||||||
|
Copying-policy: $LICENSE$
|
||||||
|
End
|
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# kdeutility - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Mon May 2 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from qt import *
|
||||||
|
from kdecore import *
|
||||||
|
from kdeui import *
|
||||||
|
import kdedesigner
|
||||||
|
from KDEUtilityDialogUI import *
|
||||||
|
|
||||||
|
description = "A KDE Utility"
|
||||||
|
version = "0.1";
|
||||||
|
|
||||||
|
class KDEUtilityDialog(KDEUtilityDialogUI):
|
||||||
|
def __init__(self):
|
||||||
|
KDEUtilityDialogUI.__init__(self,None,"TestApp")
|
||||||
|
# Add other methods, slots and signals here.
|
||||||
|
|
||||||
|
|
||||||
|
options = [] # No command line options.
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global kapp,version,description,options
|
||||||
|
|
||||||
|
aboutdata = KAboutData("kdeutility", "KdeUtility", version, description, \
|
||||||
|
KAboutData.License_GPL, "(C) 2005 AUTHOR", None, None, "your@email.com")
|
||||||
|
aboutdata.addAuthor("AUTHOR", None, "your@email.com")
|
||||||
|
KCmdLineArgs.init(sys.argv,aboutdata)
|
||||||
|
#KCmdLineArgs.addCmdLineOptions(options)
|
||||||
|
kapp = KApplication()
|
||||||
|
|
||||||
|
dialog = KDEUtilityDialog()
|
||||||
|
kapp.setMainWidget(dialog)
|
||||||
|
dialog.show()
|
||||||
|
|
||||||
|
return kapp.exec_loop()
|
||||||
|
main()
|
@ -0,0 +1 @@
|
|||||||
|
$AUTHOR$ <$EMAIL$>
|
@ -0,0 +1,43 @@
|
|||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
This software uses the Python language's distutils system for installation.
|
||||||
|
A detailed guide for users and system administrators to using distutils to
|
||||||
|
install software can be found here:
|
||||||
|
|
||||||
|
http://docs.python.org/inst/inst.html
|
||||||
|
|
||||||
|
The simplest way to install this software is to run the following command as
|
||||||
|
the root user:
|
||||||
|
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
The setup.py script will automatically detect the directories to use for
|
||||||
|
documentation, binaries and other software files.
|
||||||
|
|
||||||
|
|
||||||
|
Uninstallation
|
||||||
|
==============
|
||||||
|
During installation setup.py creates list of files and directories that
|
||||||
|
were installed in a file called install_log.txt.
|
||||||
|
|
||||||
|
python setup.py uninstall
|
||||||
|
|
||||||
|
|
||||||
|
Installing into an alternate root
|
||||||
|
=================================
|
||||||
|
For packaging purposes it is often very useful to be able to install all files
|
||||||
|
relative not to the usual root directory (/) but into an alternative
|
||||||
|
directory.
|
||||||
|
|
||||||
|
python setup.py install --root=/tmp/alternativeroot/
|
||||||
|
|
||||||
|
|
||||||
|
Operation Controls
|
||||||
|
==================
|
||||||
|
--verbose
|
||||||
|
Print more information about what setup.py is doing.
|
||||||
|
|
||||||
|
--help
|
||||||
|
Print a summary of the options to setup.py, and exit.
|
@ -0,0 +1,6 @@
|
|||||||
|
recursive-include doc *.docbook *.png
|
||||||
|
recursive-include po *.po *.pot
|
||||||
|
include AUTHORS ChangeLog COPYING INSTALL MANIFEST.in NEWS README TODO
|
||||||
|
global-include *.desktop *.py *.ui *.png *.lsm
|
||||||
|
global-exclude *~ .svn
|
||||||
|
global-exclude *~ .cvs
|
@ -0,0 +1,555 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
|
||||||
|
<!ENTITY appname "<application>MyApplicaition 0.1</application>">
|
||||||
|
<!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
|
||||||
|
<!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
|
||||||
|
<!ENTITY % addindex "IGNORE">
|
||||||
|
<!ENTITY % English "INCLUDE"><!-- change language only here -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not define any other entities; instead, use the entities
|
||||||
|
from kde-genent.entities and $LANG/user.entities. -->
|
||||||
|
]>
|
||||||
|
<!-- kdoctemplate v0.8 October 1 1999
|
||||||
|
Minor update to "Credits and Licenses" section on August 24, 2000
|
||||||
|
Removed "Revision history" section on 22 January 2001
|
||||||
|
Changed to Installation/Help menu entities 18 October 2001
|
||||||
|
Other minor cleanup and changes 18 October 2001 -->
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This template was designed by: David Rugge davidrugge@mindspring.com
|
||||||
|
with lots of help from: Eric Bischoff ebisch@cybercable.tm.fr
|
||||||
|
and Frederik Fouvry fouvry@sfs.nphil.uni-tuebingen.de
|
||||||
|
of the KDE DocBook team.
|
||||||
|
|
||||||
|
You may freely use this template for writing any sort of KDE documentation.
|
||||||
|
If you have any changes or improvements, please let us know.
|
||||||
|
|
||||||
|
Remember:
|
||||||
|
- in XML, the case of the <tags> and attributes is relevant ;
|
||||||
|
- also, quote all attributes.
|
||||||
|
|
||||||
|
Please don't forget to remove all these comments in your final documentation,
|
||||||
|
thanks ;-).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- ................................................................ -->
|
||||||
|
|
||||||
|
<!-- The language must NOT be changed here. -->
|
||||||
|
|
||||||
|
<book lang="&language;">
|
||||||
|
|
||||||
|
<!-- This header contains all of the meta-information for the document such
|
||||||
|
as Authors, publish date, the abstract, and Keywords -->
|
||||||
|
|
||||||
|
<bookinfo>
|
||||||
|
<title>The &appname; Handbook</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname></firstname>
|
||||||
|
<othername></othername>
|
||||||
|
<surname>%{AUTHOR}</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address><email>%{EMAIL}</email></address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>1999</year>
|
||||||
|
<year>%{YEAR}</year>
|
||||||
|
<holder>%{AUTHOR}</holder>
|
||||||
|
</copyright>
|
||||||
|
<!-- Translators: put here the copyright notice of the translation -->
|
||||||
|
<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
|
||||||
|
and in the FDL itself on how to use it. -->
|
||||||
|
<legalnotice>&FDLNotice;</legalnotice>
|
||||||
|
|
||||||
|
<!-- Date and version information of the documentation
|
||||||
|
Don't forget to include this last date and this last revision number, we
|
||||||
|
need them for translation coordination !
|
||||||
|
Please respect the format of the date (YYYY-MM-DD) and of the version
|
||||||
|
(V.MM.LL), it could be used by automation scripts.
|
||||||
|
Do NOT change these in the translation. -->
|
||||||
|
|
||||||
|
<date>2001-10-18</date>
|
||||||
|
<releaseinfo>%{VERSION}</releaseinfo>
|
||||||
|
|
||||||
|
<!-- Abstract about this handbook -->
|
||||||
|
|
||||||
|
<abstract>
|
||||||
|
<para>
|
||||||
|
&appname; is an application specially designed to do nothing you would
|
||||||
|
ever want.
|
||||||
|
</para>
|
||||||
|
</abstract>
|
||||||
|
|
||||||
|
<!-- This is a set of Keywords for indexing by search engines.
|
||||||
|
Please at least include KDE, the KDE package it is in, the name
|
||||||
|
of your application, and a few relevant keywords. -->
|
||||||
|
|
||||||
|
<keywordset>
|
||||||
|
<keyword>KDE</keyword>
|
||||||
|
<keyword>%{APPNAME}</keyword>
|
||||||
|
<keyword>nothing</keyword>
|
||||||
|
<keyword>nothing else</keyword>
|
||||||
|
</keywordset>
|
||||||
|
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<!-- The contents of the documentation begin here. Label
|
||||||
|
each chapter so with the id attribute. This is necessary for two reasons: it
|
||||||
|
allows you to easily reference the chapter from other chapters of your
|
||||||
|
document, and if there is no ID, the name of the generated HTML files will vary
|
||||||
|
from time to time making it hard to manage for maintainers and for the CVS
|
||||||
|
system. Any chapter labelled (OPTIONAL) may be left out at the author's
|
||||||
|
discretion. Other chapters should not be left out in order to maintain a
|
||||||
|
consistent documentation style across all KDE apps. -->
|
||||||
|
|
||||||
|
<chapter id="introduction">
|
||||||
|
<title>Introduction</title>
|
||||||
|
|
||||||
|
<!-- The introduction chapter contains a brief introduction for the
|
||||||
|
application that explains what it does and where to report
|
||||||
|
problems. Basically a long version of the abstract. Don't include a
|
||||||
|
revision history. (see installation appendix comment) -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; is a program that lets you do absolutely nothing. Please report
|
||||||
|
any problems or feature requests to the &kde; mailing lists.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="using-appname">
|
||||||
|
<title>Using &appname;</title>
|
||||||
|
|
||||||
|
<!-- This chapter should tell the user how to use your app. You should use as
|
||||||
|
many sections (Chapter, Sect1, Sect3, etc...) as is necessary to fully document
|
||||||
|
your application. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
|
||||||
|
<!-- Note that all graphics should be in .png format. Use no gifs because of
|
||||||
|
patent issues. -->
|
||||||
|
|
||||||
|
<screenshot>
|
||||||
|
<screeninfo>Here's a screenshot of &appname;</screeninfo>
|
||||||
|
<mediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="screenshot.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Screenshot</phrase>
|
||||||
|
</textobject>
|
||||||
|
</mediaobject>
|
||||||
|
</screenshot>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<sect1 id="appname-features">
|
||||||
|
<title>More &appname; features</title>
|
||||||
|
|
||||||
|
<para>It slices! It dices! and it comes with a free toaster!</para>
|
||||||
|
<para>
|
||||||
|
The Squiggle Tool <guiicon><inlinemediaobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.png" format="PNG"/>
|
||||||
|
</imageobject>
|
||||||
|
<imageobject>
|
||||||
|
<imagedata fileref="squiggle.eps" format="EPS"/>
|
||||||
|
</imageobject>
|
||||||
|
<textobject>
|
||||||
|
<phrase>Squiggle</phrase>
|
||||||
|
</textobject>
|
||||||
|
</inlinemediaobject></guiicon> is used to draw squiggly lines all over
|
||||||
|
the &appname; main window. It's not a bug, it's a feature!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="commands">
|
||||||
|
<title>Command Reference</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
|
||||||
|
application windows and their menubar and toolbar commands for easy reference.
|
||||||
|
Also include any keys that have a special function but have no equivalent in the
|
||||||
|
menus or toolbars. This may not be necessary for small apps or apps with no tool
|
||||||
|
or menu bars. -->
|
||||||
|
|
||||||
|
<sect1 id="appname-mainwindow">
|
||||||
|
<title>The main &appname; window</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The File Menu</title>
|
||||||
|
<para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>N</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>New</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Creates a new document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>S</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Save</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Saves the document</action></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><menuchoice>
|
||||||
|
<shortcut>
|
||||||
|
<keycombo action="simul">&Ctrl;<keycap>Q</keycap></keycombo>
|
||||||
|
</shortcut>
|
||||||
|
<guimenu>File</guimenu>
|
||||||
|
<guimenuitem>Quit</guimenuitem>
|
||||||
|
</menuchoice></term>
|
||||||
|
<listitem><para><action>Quits</action> &appname;</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The <guimenu>Help</guimenu> Menu</title>
|
||||||
|
|
||||||
|
<!-- Assuming you have a standard help menu (help, what's this, about -->
|
||||||
|
<!-- &appname;, about KDE) then the documentation is already written. -->
|
||||||
|
<!-- The following entity is valid anywhere that a variablelist is -->
|
||||||
|
<!-- valid. -->
|
||||||
|
|
||||||
|
&help.menu.documentation;
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="developers">
|
||||||
|
<title>Developer's Guide to &appname;</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL) A Programming/Scripting reference chapter should be
|
||||||
|
used for apps that use plugins or that provide their own scripting hooks
|
||||||
|
and/or development libraries. -->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Programming &appname; plugins is a joy to behold. Just read through the next
|
||||||
|
66 pages of API's to learn how!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- Use refentries to describe APIs. Refentries are fairly complicated and you
|
||||||
|
should consult the docbook reference for further details. The example below was
|
||||||
|
taken from that reference and shortened a bit for readability. -->
|
||||||
|
|
||||||
|
<refentry id="re-1007-unmanagechildren-1">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>XtUnmanageChildren</refentrytitle>
|
||||||
|
<refmiscinfo>Xt - Geometry Management</refmiscinfo>
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>XtUnmanageChildren
|
||||||
|
</refname>
|
||||||
|
<refpurpose>remove a list of children from a parent widget's managed
|
||||||
|
list.
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
|
||||||
|
</refpurpose>
|
||||||
|
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<refsynopsisdivinfo>
|
||||||
|
<date>4 March 1996</date>
|
||||||
|
</refsynopsisdivinfo>
|
||||||
|
<synopsis>
|
||||||
|
void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
|
||||||
|
WidgetList <replaceable class="parameter">children</replaceable>;
|
||||||
|
Cardinal <replaceable class="parameter">num_children</replaceable>;
|
||||||
|
</synopsis>
|
||||||
|
|
||||||
|
<refsect2 id="r2-1007-unmanagechildren-1">
|
||||||
|
<title>Inputs</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies an array of child widgets. Each child must be of
|
||||||
|
class RectObj or any subclass thereof.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">num_children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect2></refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-1">
|
||||||
|
<title>Description
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
|
||||||
|
and removes them from their parent's geometry management.
|
||||||
|
The widgets will disappear from the screen, and (depending
|
||||||
|
on its parent) may no longer have screen space allocated for
|
||||||
|
them.
|
||||||
|
</para>
|
||||||
|
<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
|
||||||
|
the same parent.
|
||||||
|
</para>
|
||||||
|
<para>See the “Algorithm” section below for full details of the
|
||||||
|
widget unmanagement procedure.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-2">
|
||||||
|
<title>Usage</title>
|
||||||
|
<para>Unmanaging widgets is the usual method for temporarily
|
||||||
|
making them invisible. They can be re-managed with
|
||||||
|
<function>XtManageChildren()</function>.
|
||||||
|
</para>
|
||||||
|
<para>You can unmap a widget, but leave it under geometry
|
||||||
|
management by calling <function>XtUnmapWidget()</function>. You can
|
||||||
|
destroy a widget's window without destroying the widget by
|
||||||
|
calling <function>XtUnrealizeWidget()</function>. You can destroy a
|
||||||
|
widget completely with <function>XtDestroyWidget()</function>.
|
||||||
|
</para>
|
||||||
|
<para>If you are only going to unmanage a single widget, it is
|
||||||
|
more convenient to call <function>XtUnmanageChild()</function>. It is
|
||||||
|
often more convenient to call <function>XtUnmanageChild()</function>
|
||||||
|
several times than it is to declare and initialize an array
|
||||||
|
of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
|
||||||
|
<function>XtUnmanageChildren()</function> is more efficient, however,
|
||||||
|
because it only calls the parent's <function>change_managed()</function>
|
||||||
|
method once.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-3">
|
||||||
|
<title>Algorithm
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> performs the following:
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Ignores the child if it already is unmanaged or is being
|
||||||
|
destroyed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Otherwise, if the child is realized, it makes it nonvisible
|
||||||
|
by unmapping it.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-4">
|
||||||
|
<title>Structures</title>
|
||||||
|
<para>The <type>WidgetList</type> type is simply an array of widgets:
|
||||||
|
</para>
|
||||||
|
<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
|
||||||
|
</screen>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="faq">
|
||||||
|
<title>Questions and Answers</title>
|
||||||
|
|
||||||
|
<!-- (OPTIONAL but recommended) This chapter should include all of the silly
|
||||||
|
(and not-so-silly) newbie questions that fill up your mailbox. This chapter
|
||||||
|
should be reserved for BRIEF questions and answers! If one question uses more
|
||||||
|
than a page or so then it should probably be part of the
|
||||||
|
"Using this Application" chapter instead. You should use links to
|
||||||
|
cross-reference questions to the parts of your documentation that answer them.
|
||||||
|
This is also a great place to provide pointers to other FAQ's if your users
|
||||||
|
must do some complicated configuration on other programs in order for your
|
||||||
|
application work. -->
|
||||||
|
|
||||||
|
&reporting.bugs;
|
||||||
|
&updating.documentation;
|
||||||
|
|
||||||
|
<qandaset id="faqlist">
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>My Mouse doesn't work. How do I quit &appname;?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You silly goose! Check out the <link linkend="commands">Commands
|
||||||
|
Section</link> for the answer.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>Why can't I twiddle my documents?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You can only twiddle your documents if you have the foobar.lib
|
||||||
|
installed.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
</qandaset>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="credits">
|
||||||
|
|
||||||
|
<!-- Include credits for the programmers, documentation writers, and
|
||||||
|
contributors here. The license for your software should then be included below
|
||||||
|
the credits with a reference to the appropriate license file included in the KDE
|
||||||
|
distribution. -->
|
||||||
|
|
||||||
|
<title>Credits and License</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname;
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Program copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Contributors:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Konqui the KDE Dragon <email>konqui@kde.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem><para>Tux the Linux Penguin <email>tux@linux.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Documentation copyright %{YEAR} %{AUTHOR} <email>%{EMAIL}</email>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
|
||||||
|
|
||||||
|
&underFDL; <!-- FDL: do not remove -->
|
||||||
|
|
||||||
|
<!-- Determine which license your application is licensed under,
|
||||||
|
and delete all the remaining licenses below:
|
||||||
|
|
||||||
|
(NOTE: All documentation are licensed under the FDL,
|
||||||
|
regardless of what license the application uses) -->
|
||||||
|
|
||||||
|
&underGPL; <!-- GPL License -->
|
||||||
|
&underBSDLicense; <!-- BSD License -->
|
||||||
|
&underArtisticLicense; <!-- BSD Artistic License -->
|
||||||
|
&underX11License; <!-- X11 License -->
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<appendix id="installation">
|
||||||
|
<title>Installation</title>
|
||||||
|
|
||||||
|
<sect1 id="getting-appname">
|
||||||
|
<title>How to obtain &appname;</title>
|
||||||
|
|
||||||
|
<!-- This first entity contains boiler plate for applications that are
|
||||||
|
part of KDE CVS. You should remove it if you are releasing your
|
||||||
|
application -->
|
||||||
|
|
||||||
|
&install.intro.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="requirements">
|
||||||
|
<title>Requirements</title>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
List any special requirements for your application here. This should include:
|
||||||
|
.Libraries or other software that is not included in kdesupport,
|
||||||
|
kdelibs, or kdebase.
|
||||||
|
.Hardware requirements like amount of RAM, disk space, graphics card
|
||||||
|
capabilities, screen resolution, special expansion cards, etc.
|
||||||
|
.Operating systems the app will run on. If your app is designed only for a
|
||||||
|
specific OS, (you wrote a graphical LILO configurator for example) put this
|
||||||
|
information here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
|
||||||
|
required in order to support the advanced &appname; features. &appname; uses
|
||||||
|
about 5 megs of memory to run, but this may vary depending on your
|
||||||
|
platform and configuration.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
All required libraries as well as &appname; itself can be found
|
||||||
|
on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- For a list of updates, you may refer to the application web site
|
||||||
|
or the ChangeLog file, or ... -->
|
||||||
|
<para>
|
||||||
|
You can find a list of changes at <ulink
|
||||||
|
url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="compilation">
|
||||||
|
<title>Compilation and Installation</title>
|
||||||
|
|
||||||
|
<!-- This entity contains the boilerplate text for standard -->
|
||||||
|
<!-- compilation instructions. If your application requires any -->
|
||||||
|
<!-- special handling, remove it, and replace with your own text. -->
|
||||||
|
|
||||||
|
&install.compile.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="configuration">
|
||||||
|
<title>Configuration</title>
|
||||||
|
|
||||||
|
<para>Don't forget to tell your system to start the <filename>dtd</filename>
|
||||||
|
dicer-toaster daemon first, or &appname; won't work !</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</appendix>
|
||||||
|
|
||||||
|
&documentation.index;
|
||||||
|
</book>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-general-insert-case:lower
|
||||||
|
sgml-indent-step:0
|
||||||
|
sgml-indent-data:nil
|
||||||
|
End:
|
||||||
|
|
||||||
|
vim:tabstop=2:shiftwidth=2:expandtab
|
||||||
|
-->
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# setup - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Fri Jun 27 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : YOUR@EMAIL.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import kdedistutils
|
||||||
|
|
||||||
|
kdedistutils.setup(name="kioslave",
|
||||||
|
version="0.1.0",
|
||||||
|
author="AUTHOR",
|
||||||
|
author_email="YOUR@EMAIL.com",
|
||||||
|
url="http://www.TESTAPP.com/",
|
||||||
|
min_kde_version = "3.0.0",
|
||||||
|
min_qt_version = "3.0.0",
|
||||||
|
license = "GPL",
|
||||||
|
application_data = ['src/kioslave.py'],
|
||||||
|
docbooks = [ ('doc/en','en') ],
|
||||||
|
kioslaves = [ ('src/kioslave.protocol','kioslave.py')] )
|
@ -0,0 +1,16 @@
|
|||||||
|
Begin3
|
||||||
|
Title: $APPNAME$ -- Some description
|
||||||
|
Version: $VERSION$
|
||||||
|
Entered-date:
|
||||||
|
Description:
|
||||||
|
Keywords: KDE Qt
|
||||||
|
Author: $AUTHOR$ <$EMAIL$>
|
||||||
|
Maintained-by: $AUTHOR$ <$EMAIL$>
|
||||||
|
Home-page:
|
||||||
|
Alternate-site:
|
||||||
|
Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
|
||||||
|
xxxxxx $APPNAMELC$-$VERSION$.tar.gz
|
||||||
|
xxx $APPNAMELC$-$VERSION$.lsm
|
||||||
|
Platform: Linux. Needs KDE
|
||||||
|
Copying-policy: $LICENSE$
|
||||||
|
End
|
@ -0,0 +1,13 @@
|
|||||||
|
[Protocol]
|
||||||
|
exec=kioslave
|
||||||
|
protocol=kioslave
|
||||||
|
input=none
|
||||||
|
output=filesystem
|
||||||
|
listing=Name,Type,Size,Date
|
||||||
|
reading=true
|
||||||
|
writing=true
|
||||||
|
makedir=true
|
||||||
|
deleting=true
|
||||||
|
linking=false
|
||||||
|
moving=true
|
||||||
|
maxInstances=1
|
@ -0,0 +1,618 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# kioslave - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Mon May 2 2005 #
|
||||||
|
# copyright : (C) 2005 by AUTHOR #
|
||||||
|
# email : your@email.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU General Public License as published by #
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# Import the required Qt and KDE modules.
|
||||||
|
from qt import *
|
||||||
|
from kio import *
|
||||||
|
from kdecore import *
|
||||||
|
import os, time
|
||||||
|
|
||||||
|
# For debugging purposes, import the sys and traceback modules.
|
||||||
|
import sys, traceback
|
||||||
|
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
|
# Define a class which will be used to create IOSlave instances.
|
||||||
|
############################################################################
|
||||||
|
class SlaveClass(KIO.SlaveBase):
|
||||||
|
"""SlaveClass(KIO.SlaveBase)
|
||||||
|
|
||||||
|
See kdelibs/kio/kio/slavebase.h for virtual functions to override.
|
||||||
|
"""
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
def __init__(self, pool, app):
|
||||||
|
# We must call the initialisation method of the base class.
|
||||||
|
KIO.SlaveBase.__init__(self, "kioslave", pool, app)
|
||||||
|
|
||||||
|
# Attach the DCOP client object associated with this IOSlave to the
|
||||||
|
# DCOP server.
|
||||||
|
self.dcopClient().attach()
|
||||||
|
|
||||||
|
self.debug("dcopClient: %i" % self.dcopClient().isRegistered())
|
||||||
|
|
||||||
|
self.contents = RAMDir(None,u"/")
|
||||||
|
|
||||||
|
self.host = ""
|
||||||
|
self.document = None
|
||||||
|
self.file = None
|
||||||
|
|
||||||
|
self.debug("Exiting __init__ now");
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
def __del__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def setHost(self, host, port, user, passwd):
|
||||||
|
self.debug(
|
||||||
|
"setHost: %s %s %s %s" % (
|
||||||
|
repr(unicode(host)), repr(unicode(port)),
|
||||||
|
repr(unicode(user)), repr(unicode(passwd))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# This IOSlave does not allow a host to be specified as part of
|
||||||
|
# a URL.
|
||||||
|
if unicode(host) != u"":
|
||||||
|
self.closeConnection()
|
||||||
|
self.error(KIO.ERR_MALFORMED_URL, host)
|
||||||
|
return
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def openConnection(self):
|
||||||
|
# Don't call self.finished() in this method.
|
||||||
|
self.debug("openConnection")
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def closeConnection(self):
|
||||||
|
# Don't call self.finished() in this method.
|
||||||
|
self.debug("closeConnection")
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def get(self, url):
|
||||||
|
path = str(url.path())
|
||||||
|
self.debug("get(): %s" % path)
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
item = self.contents.resolve(path)
|
||||||
|
if item is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, path)
|
||||||
|
return
|
||||||
|
|
||||||
|
if item.isDir():
|
||||||
|
self.error(KIO.ERR_IS_DIRECTORY, path)
|
||||||
|
|
||||||
|
self.totalSize(len(item.getData()))
|
||||||
|
self.data(QByteArray(item.getData()))
|
||||||
|
|
||||||
|
# The end of the data string.
|
||||||
|
self.data(QByteArray())
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def put(self, url, permissions, overwrite, resume):
|
||||||
|
self.debug("put")
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
path = str(url.path())
|
||||||
|
parts = path.split('/')
|
||||||
|
filename = parts[-1]
|
||||||
|
parent_dir = self.contents.resolveParent(path)
|
||||||
|
if parent_dir is None:
|
||||||
|
parent_path = '/'.join(parts[:-1])
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, parent_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
if parent_dir.contains(filename):
|
||||||
|
if not overwrite:
|
||||||
|
self.error(KIO.ERR_COULD_NOT_WRITE, parent_path)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
parent_dir.unlink(filename)
|
||||||
|
|
||||||
|
# Read data from the application.
|
||||||
|
bytearray = QByteArray()
|
||||||
|
bytes = 0
|
||||||
|
data = ""
|
||||||
|
|
||||||
|
while True:
|
||||||
|
self.dataReq()
|
||||||
|
result = self.readData(bytearray)
|
||||||
|
|
||||||
|
if result <= 0:
|
||||||
|
# An error or the end of data was encountered.
|
||||||
|
break
|
||||||
|
|
||||||
|
# The number of bytes read is given in the result.
|
||||||
|
bytes = bytes + result
|
||||||
|
data = data + str(bytearray)
|
||||||
|
|
||||||
|
parent_dir.insert(RAMFile(parent_dir,filename,data))
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def stat(self, url):
|
||||||
|
self.debug("stat: %s" % url.url(0,0))
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
self.debug("path:%s"% url.path())
|
||||||
|
|
||||||
|
# Return info the for the root.
|
||||||
|
item = self.contents.resolve(str(url.path()))
|
||||||
|
if item is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, str(url.path()))
|
||||||
|
return
|
||||||
|
|
||||||
|
self.statEntry(item.getStatEntry())
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def mimetype(self, url):
|
||||||
|
self.debug("mimetype: %s" % unicode(url))
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
path = str(url.path())
|
||||||
|
item = self.contents.resolve(path)
|
||||||
|
if item is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, path)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.mimeType(item.getMimetype())
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def listDir(self, url):
|
||||||
|
# The "url" argument is a kdecore.KURL object.
|
||||||
|
self.debug("listDir: %s" % str(url.prettyURL(0)))
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
path = str(url.path())
|
||||||
|
dir = self.contents.resolve(path)
|
||||||
|
if dir is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, path)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not dir.isDir():
|
||||||
|
self.error(KIO.ERR_IS_FILE, path)
|
||||||
|
return
|
||||||
|
|
||||||
|
for entry in dir.listDir():
|
||||||
|
self.listEntry(entry, 0)
|
||||||
|
|
||||||
|
self.listEntry([], 1) # Signal that the list is finished.
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def mkdir(self, url, permissions):
|
||||||
|
self.debug("mkdir")
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
parent_path = str(url.path())
|
||||||
|
parent_dir = self.contents.resolveParent(parent_path)
|
||||||
|
if parent_dir is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, parent_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
new_dir_obj = parent_dir.mkdir(parent_path.split('/')[-1])
|
||||||
|
if new_dir_obj is None:
|
||||||
|
self.error(KIO.ERR_COULD_NOT_MKDIR, parent_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def rename(self, src, dest, overwrite):
|
||||||
|
self.debug("rename: %s %s" % (src.path(), dest.path()))
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
src_path = str(src.path())
|
||||||
|
src_obj = self.contents.resolve(src_path)
|
||||||
|
if src_obj is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, src_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
# See if the destination path already exists.
|
||||||
|
dest_path = str(dest.path())
|
||||||
|
dest_obj = self.contents.resolve(dest_path)
|
||||||
|
if dest_obj is not None:
|
||||||
|
if dest_obj is src_obj:
|
||||||
|
self.finished() # Done already.
|
||||||
|
return
|
||||||
|
|
||||||
|
if not overwrite:
|
||||||
|
# Can't overwrite. not bad.
|
||||||
|
self.error(KIO.ERR_CANNOT_RENAME, dest_path)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
# Over write, just remove the object.
|
||||||
|
dest_obj.getParent().unlink(dest_obj.getName())
|
||||||
|
|
||||||
|
dest_dir = self.contents.resolveParent(dest_path)
|
||||||
|
if dest_dir is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, dest_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
src_obj.getParent().unlink(src_obj)
|
||||||
|
src_obj.setName(dest_path.split('/')[-1])
|
||||||
|
dest_dir.insert(src_obj)
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
# Other possible file operations are represented by the following
|
||||||
|
# methods which are not implemented.
|
||||||
|
|
||||||
|
#def symlink(self, target, dest, overwrite):
|
||||||
|
# debug("symlink")
|
||||||
|
# ...
|
||||||
|
# self.finished()
|
||||||
|
|
||||||
|
#def chmod(self, url, permissions):
|
||||||
|
# debug("chmod")
|
||||||
|
# ...
|
||||||
|
# self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def copy(self, src, dest, permissions, overwrite):
|
||||||
|
self.debug("copy")
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
src_path = str(src.path())
|
||||||
|
src_obj = self.contents.resolve(src_path)
|
||||||
|
if src_obj is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, src_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
# See if the destination path already exists.
|
||||||
|
dest_path = str(dest.path())
|
||||||
|
dest_obj = self.contents.resolve(dest_path)
|
||||||
|
if dest_obj is not None:
|
||||||
|
if dest_obj is src_obj:
|
||||||
|
self.finished() # Done already.
|
||||||
|
return
|
||||||
|
|
||||||
|
if not overwrite:
|
||||||
|
# Can't overwrite. not bad.
|
||||||
|
self.error(KIO.ERR_COULD_NOT_WRITE, dest_path)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
# Over write, just remove the object.
|
||||||
|
dest_obj.getParent().unlink(dest_obj.getName())
|
||||||
|
|
||||||
|
dest_dir = self.contents.resolveParent(dest_path)
|
||||||
|
if dest_dir is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, dest_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
new_obj = src_obj.copy()
|
||||||
|
new_obj.setName(dest_path.split('/')[-1])
|
||||||
|
dest_dir.insert(new_obj)
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def del_(self, url, isfile):
|
||||||
|
self.debug("del_")
|
||||||
|
self.openConnection()
|
||||||
|
|
||||||
|
path = str(url.path())
|
||||||
|
item = self.contents.resolve(path)
|
||||||
|
if item is None:
|
||||||
|
self.error(KIO.ERR_DOES_NOT_EXIST, path)
|
||||||
|
return
|
||||||
|
|
||||||
|
item.getParent().unlink(item.getName())
|
||||||
|
|
||||||
|
self.finished()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def disconnectSlave(self):
|
||||||
|
self.debug("disconnectSlave")
|
||||||
|
return
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def dispatchLoop(self):
|
||||||
|
self.debug("dispatchLoop")
|
||||||
|
KIO.SlaveBase.dispatchLoop(self)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# KIO.SlaveBase method
|
||||||
|
def error(self,errid,text):
|
||||||
|
self.debug("error: %i, %s" % (errid,text) )
|
||||||
|
KIO.SlaveBase.error(self,errid,text)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def debug(self,msg):
|
||||||
|
if DEBUG == 0: return
|
||||||
|
print "kioslave:"+str(msg)+"\n"
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
class RAMDir(object):
|
||||||
|
############################################################################
|
||||||
|
def __init__(self,parent,name):
|
||||||
|
self.contents = {}
|
||||||
|
self.parent = parent
|
||||||
|
self.name = str(name)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getParent(self):
|
||||||
|
return self.parent
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def setParent(self,parent):
|
||||||
|
self.parent = parent
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getName(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def setName(self,name):
|
||||||
|
self.name = str(name)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def resolve(self,path):
|
||||||
|
while path.endswith('/'):
|
||||||
|
path = path[:-1]
|
||||||
|
while path.startswith('/'):
|
||||||
|
path = path[1:]
|
||||||
|
|
||||||
|
if path=='':
|
||||||
|
return self
|
||||||
|
|
||||||
|
parts = path.split('/')
|
||||||
|
self.debug(path)
|
||||||
|
for item in self.contents.keys():
|
||||||
|
self.debug("keys:"+item)
|
||||||
|
|
||||||
|
if parts[0] in self.contents:
|
||||||
|
return self.contents[parts[0]].resolve('/'.join(parts[1:]))
|
||||||
|
self.debug("CHECKPOINT 1")
|
||||||
|
return None
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def resolveParent(self,path):
|
||||||
|
while path.endswith('/'):
|
||||||
|
path = path[:-1]
|
||||||
|
while path.startswith('/'):
|
||||||
|
path = path[1:]
|
||||||
|
|
||||||
|
if path=="":
|
||||||
|
return None
|
||||||
|
|
||||||
|
parts = path.split('/')
|
||||||
|
return self.resolve('/'.join(parts[:-1]))
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def mkdir(self,name):
|
||||||
|
if name in self.contents:
|
||||||
|
return None
|
||||||
|
new_dir = RAMDir(self,name)
|
||||||
|
self.contents[name] = new_dir
|
||||||
|
return new_dir
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getStatEntry(self):
|
||||||
|
# Return info the for the root.
|
||||||
|
length = 0
|
||||||
|
|
||||||
|
entry = []
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_NAME
|
||||||
|
atom.m_str = self.name
|
||||||
|
#debug("name: %s" % name)
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_SIZE
|
||||||
|
atom.m_long = length
|
||||||
|
#debug("length: %i" % length)
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_MODIFICATION_TIME
|
||||||
|
# Number of seconds since the epoch.
|
||||||
|
atom.m_long = int(time.time())
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_ACCESS
|
||||||
|
# The usual octal permission information (rw-r--r-- in this case).
|
||||||
|
atom.m_long = 0644
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
# If the stat method is implemented then entries _must_ include
|
||||||
|
# the UDE_FILE_TYPE atom or the whole system may not work at all.
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_FILE_TYPE
|
||||||
|
#atom.m_long = os.path.stat.S_IFREG
|
||||||
|
atom.m_long = os.path.stat.S_IFDIR
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_MIME_TYPE
|
||||||
|
atom.m_str = self.getMimetype()
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
return entry
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def listDir(self):
|
||||||
|
list = []
|
||||||
|
for item in self.contents.values():
|
||||||
|
list.append(item.getStatEntry())
|
||||||
|
return list
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def isDir(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def insert(self,item):
|
||||||
|
self.contents[item.getName()] = item
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def contains(self,name):
|
||||||
|
return name in self.contents
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def unlink(self,name):
|
||||||
|
if str(name) in self.contents:
|
||||||
|
del self.contents[str(name)]
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def debug(self,msg):
|
||||||
|
if DEBUG == 0: return
|
||||||
|
|
||||||
|
print "kioslave:"+str(msg)+"\n"
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getMimetype(self):
|
||||||
|
return "inode/directory"
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def copy(self):
|
||||||
|
new_dir = RAMDir(None,self.name)
|
||||||
|
|
||||||
|
for item in self.contents.values():
|
||||||
|
new_item = item.copy()
|
||||||
|
new_item.setParent(new_dir)
|
||||||
|
new_dir.insert(new_item)
|
||||||
|
|
||||||
|
return new_dir
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
class RAMFile(object):
|
||||||
|
############################################################################
|
||||||
|
def __init__(self,parent,name,data=None):
|
||||||
|
self.parent = parent
|
||||||
|
self.name = str(name)
|
||||||
|
self.data = data
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getParent(self):
|
||||||
|
return self.parent
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def setParent(self,parent):
|
||||||
|
self.parent = parent
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getName(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def setName(self,name):
|
||||||
|
self.name = str(name)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def resolve(self,path):
|
||||||
|
if path!="":
|
||||||
|
return None
|
||||||
|
return self
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getData(self):
|
||||||
|
return self.data
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def resolveParent(self,path):
|
||||||
|
return None
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getStatEntry(self):
|
||||||
|
# Return info the for the root.
|
||||||
|
length = 0
|
||||||
|
|
||||||
|
entry = []
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_NAME
|
||||||
|
atom.m_str = self.name
|
||||||
|
#debug("name: %s" % name)
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
length = 0
|
||||||
|
if self.data is not None:
|
||||||
|
length = len(self.data)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_SIZE
|
||||||
|
atom.m_long = length
|
||||||
|
#debug("length: %i" % length)
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_MODIFICATION_TIME
|
||||||
|
# Number of seconds since the epoch.
|
||||||
|
atom.m_long = int(time.time())
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_ACCESS
|
||||||
|
# The usual octal permission information (rw-r--r-- in this case).
|
||||||
|
atom.m_long = 0644
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
# If the stat method is implemented then entries _must_ include
|
||||||
|
# the UDE_FILE_TYPE atom or the whole system may not work at all.
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_FILE_TYPE
|
||||||
|
atom.m_long = os.path.stat.S_IFREG
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
atom = KIO.UDSAtom()
|
||||||
|
atom.m_uds = KIO.UDS_MIME_TYPE
|
||||||
|
atom.m_str = self.getMimetype()
|
||||||
|
entry.append(atom)
|
||||||
|
|
||||||
|
return entry
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def isDir(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def getMimetype(self):
|
||||||
|
return "text/html"
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def copy(self):
|
||||||
|
return RAMFile(None,self.name,self.data)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def SlaveFactory(pool, app):
|
||||||
|
slave = SlaveClass(pool, app)
|
||||||
|
slave.dispatchLoop()
|
@ -0,0 +1,874 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
|
||||||
|
<!ENTITY appname "<application>PyKDE Extensions</application>">
|
||||||
|
<!ENTITY kappname "&appname;"><!-- Do *not* replace kappname-->
|
||||||
|
<!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc -->
|
||||||
|
<!ENTITY % addindex "IGNORE">
|
||||||
|
<!ENTITY % English "INCLUDE"><!-- change language only here -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not define any other entities; instead, use the entities
|
||||||
|
from kde-genent.entities and $LANG/user.entities. -->
|
||||||
|
]>
|
||||||
|
|
||||||
|
<!-- ................................................................ -->
|
||||||
|
<!-- The language must NOT be changed here. -->
|
||||||
|
|
||||||
|
<book lang="&language;">
|
||||||
|
|
||||||
|
<bookinfo>
|
||||||
|
<title>The &appname; Handbook</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname>Simon</firstname>
|
||||||
|
<othername></othername>
|
||||||
|
<surname>Edwards</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address><email>simon@simonzone.com</email></address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>2005</year>
|
||||||
|
<holder>Simon Edwards</holder>
|
||||||
|
</copyright>
|
||||||
|
<!-- Translators: put here the copyright notice of the translation -->
|
||||||
|
<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
|
||||||
|
and in the FDL itself on how to use it. -->
|
||||||
|
<legalnotice>&FDLNotice;</legalnotice>
|
||||||
|
|
||||||
|
<!-- Date and version information of the documentation
|
||||||
|
Don't forget to include this last date and this last revision number, we
|
||||||
|
need them for translation coordination !
|
||||||
|
Please respect the format of the date (YYYY-MM-DD) and of the version
|
||||||
|
(V.MM.LL), it could be used by automation scripts.
|
||||||
|
Do NOT change these in the translation. -->
|
||||||
|
|
||||||
|
<date>2005-09-19</date>
|
||||||
|
<releaseinfo>0.4</releaseinfo>
|
||||||
|
|
||||||
|
<!-- Abstract about this handbook -->
|
||||||
|
|
||||||
|
<abstract>
|
||||||
|
<para>
|
||||||
|
&appname; is a collection of software and Python packages to support the
|
||||||
|
creation and installation of KDE applications.
|
||||||
|
</para>
|
||||||
|
</abstract>
|
||||||
|
|
||||||
|
<!-- This is a set of Keywords for indexing by search engines.
|
||||||
|
Please at least include KDE, the KDE package it is in, the name
|
||||||
|
of your application, and a few relevant keywords. -->
|
||||||
|
|
||||||
|
<keywordset>
|
||||||
|
<keyword>KDE</keyword>
|
||||||
|
<keyword>PyKDE Extensions</keyword>
|
||||||
|
<keyword>python</keyword>
|
||||||
|
<keyword>PyKDE</keyword>
|
||||||
|
</keywordset>
|
||||||
|
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<chapter id="introduction">
|
||||||
|
<title>Introduction</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; is a collection of software and Python packages to support the
|
||||||
|
creation and installation of KDE applications.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- distutils -->
|
||||||
|
<chapter id="distutils">
|
||||||
|
<title>Installation & Distutils support</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
C++ projects on KDE traditionally use
|
||||||
|
<ulink url="http://www.gnu.org/software/autoconf/">autoconf</ulink>,
|
||||||
|
<ulink url="http://www.gnu.org/software/automake/">automake</ulink>
|
||||||
|
and <ulink url="http://www.gnu.org/software/libtool/">libtool</ulink>
|
||||||
|
to handle the building and installation. These tools
|
||||||
|
and difficult to use, even for experianced developers.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Fortunately Python has a its own system for building and installing
|
||||||
|
modules and software. <ulink url="http://docs.python.org/lib/module-distutils.html">Distutils</ulink>
|
||||||
|
is a standard Python package and comes with every Python installation.
|
||||||
|
&appname; builds on Distutils with extensions tailored for handling KDE
|
||||||
|
programs.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A typical KDE program comes not only with the program itself but also
|
||||||
|
extra files such as a manual written in <ulink url="http://i18n.kde.org/doc/markup/">Docbook
|
||||||
|
format</ulink>, <ulink url="http://i18n.kde.org/translation-howto/">translation files</ulink>,
|
||||||
|
icons, images and other auxiliary data files. &appname; provides support for
|
||||||
|
handling all these other files types.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect1 id="distutils-using">
|
||||||
|
<title>Using Distutils with KDE programs</title>
|
||||||
|
<para>
|
||||||
|
It is advised that you first read the standard
|
||||||
|
<ulink url="http://docs.python.org/lib/module-distutils.html">Distutils documentation</ulink>
|
||||||
|
to learn about how it works. &appname; adds some KDE specific extensions which are documented
|
||||||
|
below.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Distutils is based around writing a <filename>setup.py</filename> file which
|
||||||
|
then uses the distutils package
|
||||||
|
To use the KDE extensions, the first thing you need to do in your <filename>setup.py
|
||||||
|
</filename> file is include the <symbol>kdedistutils</symbol> package.
|
||||||
|
<programlisting>
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Setup.py file for MyKDEApplication
|
||||||
|
|
||||||
|
import kdedistutils
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
You need to call the <symbol>setup()</symbol> function from <symbol>kdedistutils</symbol>
|
||||||
|
with all of the configuration information about your application, much like the standard
|
||||||
|
<symbol>setup()</symbol> from <symbol>distutils</symbol>.
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
kdedistutils.setup(name="pykdeextensions",
|
||||||
|
version="0.1.0",
|
||||||
|
author="Simon Edwards",
|
||||||
|
author_email="simon@simonzone.com",
|
||||||
|
url="http://www.simonzone.com/software/pykdeextensions/",
|
||||||
|
min_kde_version = "3.0.0",
|
||||||
|
min_qt_version = "3.0.0",
|
||||||
|
license = "LGPL" )
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
<symbol>min_kde_version</symbol> and <symbol>min_qt_version</symbol> specify
|
||||||
|
the minimum versions of the Qt library and KDE needed to install and run
|
||||||
|
the software. These requirements are checked during install.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The other arguments shown here are standard <symbol>distutils.setup()</symbol>
|
||||||
|
arguments.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="distutils-files">
|
||||||
|
<title>Application data files</title>
|
||||||
|
<para>
|
||||||
|
Each KDE application as a data directory of it's own for storing any extra
|
||||||
|
data files it may need to run.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Data files are specified using the the <symbol>application_data</symbol>
|
||||||
|
argument for <symbol>setup()</symbol>. <symbol>application_data</symbol>
|
||||||
|
is a list of files to install.
|
||||||
|
<programlisting>
|
||||||
|
application_data = ['extracode.py', ('pics', ['pics/warning.png'])]
|
||||||
|
</programlisting>
|
||||||
|
You can simply specify the name of each file as a string and they will be
|
||||||
|
installed directly in the application data directory. Or you can use a tuple
|
||||||
|
containing the name of the sub-directory under the application data directory
|
||||||
|
to install into, and as the second tuple item, the list of files to install
|
||||||
|
into the given sub-directory.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Since most large Python programs are broken up into multiple source files
|
||||||
|
it is recommended that all of the Python files that comprise your
|
||||||
|
application be installed into the application directory. This helps eliminate
|
||||||
|
problems with the Python module path and the interpreter not being able
|
||||||
|
find the correct file to <symbol>import</symbol>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Even with all of the python files in the Application data directory, it is
|
||||||
|
still desirable to have your application's "executables" available in KDE's
|
||||||
|
<filename>bin</filename> directory. &appname; provides an easy way for creating
|
||||||
|
symbolic links from the "bin" directory to scripts in the application
|
||||||
|
directory.
|
||||||
|
<programlisting>
|
||||||
|
executable_links = [('myapplication','myapplication.py'), ('myapplicationgui','myapplicationgui.py')]
|
||||||
|
</programlisting>
|
||||||
|
This example specifies an executable symbolic link <filename>myapplication
|
||||||
|
</filename> that points to the <filename>myapplication.py</filename> script
|
||||||
|
in the application data directory.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="distutils-uninstall">
|
||||||
|
<title>Uninstall command</title>
|
||||||
|
<para>
|
||||||
|
Standard Distutils does not feature an uninstall command. &appname; does
|
||||||
|
and it can be easily invoked with:
|
||||||
|
<screen>
|
||||||
|
python setup.py uninstall
|
||||||
|
</screen>
|
||||||
|
It is quite basic. The <symbol>install</symbol> writes the list of files
|
||||||
|
it installed to the file <filename>install_log.txt</filename>. The
|
||||||
|
<symbol>uninstall</symbol> command simply reads this file and removes the
|
||||||
|
files and directories that are listed within.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="distutils-docbook">
|
||||||
|
<title>Manuals & Docbook files</title>
|
||||||
|
<para>
|
||||||
|
Docbook is an XML based file format for writing manuals and books.
|
||||||
|
More information about using Docbook to write manuals and documentation using
|
||||||
|
Docbook is <ulink url="http://i18n.kde.org/doc/markup/">here</ulink>.
|
||||||
|
Manuals are written in the Docbook format, but need to be converted
|
||||||
|
into HTML when installed and made available for the KDE Help Center.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Docbooks files and images are usually organised under a
|
||||||
|
<filename>doc</filename> directory which is then further divided by two
|
||||||
|
letter language code. For example <filename>doc/en</filename>,
|
||||||
|
<filename>doc/nl</filename>, en <filename>doc/fr</filename>.
|
||||||
|
The Docbook files themselves are named <filename>index.docbook</filename>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
By using the <symbol>docbooks</symbol> argument to <symbol>setup()</symbol>
|
||||||
|
in your <filename>setup.py</filename>, you can specify the directories
|
||||||
|
containing docbook files. You also need to specify the language used in
|
||||||
|
that directory.
|
||||||
|
<programlisting>
|
||||||
|
docbooks = [ ('doc/en','en'), ('doc/nl','nl'), ('doc/fr','fr') ]
|
||||||
|
</programlisting>
|
||||||
|
The argument to <symbol>docbooks</symbol> is a list of tuples. The first item
|
||||||
|
of a tuple is the relative path to a docbook directory. The second item is
|
||||||
|
the two letter language code.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Docbook files specified this way will automatically be converted to HTML
|
||||||
|
during install.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Qt-designer -->
|
||||||
|
<chapter id="using-qtdesigner">
|
||||||
|
<title>Run-time integration with Qt-Designer</title>
|
||||||
|
<para>
|
||||||
|
Qt-Designer is a graphical application used for designing user interfaces.
|
||||||
|
It creates <literal role="extension">.ui</literal> files. These files need
|
||||||
|
to be converted into Python classes before they can be used in a Python
|
||||||
|
application. This can be manually done using the <command>pyuic</command>
|
||||||
|
command from the shell. But it is a lot more convenient to let &appname;
|
||||||
|
to this automatically for you. All you need to do is import the
|
||||||
|
<symbol>qtdesigner</symbol> or <symbol>kdedesigner</symbol> module, depending
|
||||||
|
on whether your application is pure Qt or uses KDE, and then you can import
|
||||||
|
your user interface files as though they were normal Python files.
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
#!/usr/bin/env python
|
||||||
|
from kdeui import *
|
||||||
|
|
||||||
|
import kdedesigner # This module lets us import .ui file directly.
|
||||||
|
from MyWindow import * # Loads MyWindow.ui
|
||||||
|
|
||||||
|
# Subclass the Qt-designer form.
|
||||||
|
class MyWindowCode(MyWindow):
|
||||||
|
# Implement extra functionality and methods.
|
||||||
|
</programlisting>
|
||||||
|
The <symbol>kdedesigner</symbol>/<symbol>qtdesigner</symbol> module converts
|
||||||
|
<literal role="extension">.ui</literal> on demand to
|
||||||
|
<literal role="extension">.py</literal> files.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Internationalization -->
|
||||||
|
<chapter id="i18n">
|
||||||
|
<title>Internationalization & translation</title>
|
||||||
|
<para>
|
||||||
|
i18n (an abbreviation of internationalization) is the process of translating
|
||||||
|
the user interface and documentation of a piece of software into another
|
||||||
|
language. <ulink url="i18n.kde.org">i18n.kde.org</ulink> is the central
|
||||||
|
information point for the effort to translate KDE software into other
|
||||||
|
languages.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Translation of the user interface an application is done using
|
||||||
|
<literal role="extension">.pot</literal> files and
|
||||||
|
<literal role="extension">.po</literal> files.
|
||||||
|
A <literal role="extension">.pot</literal> file, is generated from the source
|
||||||
|
code of the program itself, and contains all of the strings / fragments of text,
|
||||||
|
that are used in the program.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Before a string in a program is include in the <literal role="extension">.pot
|
||||||
|
</literal> file, it needs to be marked with the <function>i18n()</function>.
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
#!/usr/bin/env python
|
||||||
|
from kdecode import *
|
||||||
|
|
||||||
|
...
|
||||||
|
mylabel = QLabel(i18n("Select new directory:"))
|
||||||
|
...
|
||||||
|
</programlisting>
|
||||||
|
The <function>i18n()</function> is part of the <symbol>kdecode</symbol> package
|
||||||
|
and needs to be imported.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; provides support for generating <literal role="extension">.pot</literal>
|
||||||
|
files and managing and updating <literal role="extension">.po</literal> files.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
By using the <symbol>i18n</symbol> argument to <symbol>setup()</symbol>
|
||||||
|
in your <filename>setup.py</filename>, you can specify the directory
|
||||||
|
that should contain the <literal role="extension">.pot</literal> and
|
||||||
|
<literal role="extension">.po</literal> files. The argument for
|
||||||
|
<symbol>i18n</symbol> is a tuple. The first item is the relative path
|
||||||
|
to the directory where the translation files should be stored. The
|
||||||
|
second item is a list of directories that should be scanned for Python source
|
||||||
|
files containing translatable strings.
|
||||||
|
<programlisting>
|
||||||
|
i18n = ('po',['.','mymodule'])
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Once your <filename>setup.py</filename> is configured, use this command in the
|
||||||
|
shell to generate the <literal role="extension">.pot</literal> file.
|
||||||
|
<screen>
|
||||||
|
python setup.py update_messages
|
||||||
|
</screen>
|
||||||
|
This command also updates any already existing <literal role="extension">.po</literal>
|
||||||
|
files with any new messages.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname; also handles installing translation files and converting
|
||||||
|
<literal role="extension">.po</literal> files into the special binary format
|
||||||
|
needed by the application at runtime.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Kcontrol modules -->
|
||||||
|
<chapter id="kcontrol-modules">
|
||||||
|
<title>KDE Control Center Modules</title>
|
||||||
|
<para>
|
||||||
|
&appname; can also help create modules for the KDE Control Center.
|
||||||
|
C++ glue code is needed when writing in module in Python. Fortunately
|
||||||
|
&appname; can generate this glue for you automatically.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The best way to start learning about creating modules is to read the
|
||||||
|
<ulink url="http://developer.kde.org/documentation/other/kcm_howto.html">KConfig
|
||||||
|
Module HOWTO</ulink>. It is written for C++, but the concepts are the same for
|
||||||
|
Python.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In your <filename>setup.py</filename> file you can specify the list of kcontrol
|
||||||
|
modules that need to be installed.
|
||||||
|
<programlisting>
|
||||||
|
kcontrol_modules = [ ('src/kcontrol_module.desktop','kcontrol_module.py')] )
|
||||||
|
</programlisting>
|
||||||
|
This is just a list of tuples. The first item is name of the
|
||||||
|
<literal role="extension">.desktop</literal> file that you've made for your
|
||||||
|
module. The second item is the name of the Python program to run when the
|
||||||
|
user views the module in kcontrol. This program is expected to be in
|
||||||
|
the application's data files directory.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The <ulink url="http://developer.kde.org/documentation/standards/kde/kcontrol_style/index.html">
|
||||||
|
KControl Module Guidelines</ulink> provides useful information about how to
|
||||||
|
design a KControl module that fits into the rest of KDE.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<tip>
|
||||||
|
<para>
|
||||||
|
&appname; typically installs the <literal role="extension">.desktop</literal>
|
||||||
|
file into the <filename>/usr/share/applications/kde/</filename> directory.
|
||||||
|
This is normally enough to make the module appear in the KDE Control Center.
|
||||||
|
But for some distributions, most notably <ulink url="http://www.mandriva.com/">
|
||||||
|
Mandriva</ulink> but probably others too, this isn't enough. Mandriva in
|
||||||
|
particular uses the <ulink url="http://alioth.debian.org/projects/menu/">
|
||||||
|
Debian menu system</ulink> for managing the K menu and also for KControl
|
||||||
|
modules. In order to get a module to appear in the kcontrol it is best
|
||||||
|
to createa a <literal role="extension">.menu</literal> file and copy
|
||||||
|
it into <filename>/usr/lib/menu</filename>, and then use <command>update-menus
|
||||||
|
</command> as root to update all of the menus and the list of kcontrol
|
||||||
|
modules.
|
||||||
|
</para>
|
||||||
|
</tip>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
Right now there is no support for "module-testing" or "X-KDE-Test-Module=true"
|
||||||
|
features in <literal role="extension">.desktop</literal> files.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- KIO-Slaves -->
|
||||||
|
<chapter id="kioslaves">
|
||||||
|
<title>KIO Slaves</title>
|
||||||
|
<para>
|
||||||
|
&appname; can be used for the creation of kio-slaves. &appname; handles the C++
|
||||||
|
glue code needed for making kioslaves in Python.
|
||||||
|
<ulink url="http://developer.kde.org/documentation/library/kdeqt/kde3arch/nettransparency.html">developer.kde.org</ulink>
|
||||||
|
has some documentation about KIO-slaves aimed at C++ programmers.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In your <filename>setup.py</filename> file you can specify the list of kioslaves
|
||||||
|
that need to be installed.
|
||||||
|
<programlisting>
|
||||||
|
kioslaves = [ ('src/kioslave.protocol','kioslave.py')] )
|
||||||
|
</programlisting>
|
||||||
|
This is just a list of tuples. The first item is name of the
|
||||||
|
<literal role="extension">.protocol</literal> file that you've made for your
|
||||||
|
kio-slave. The second item is the name of the Python program to run when the
|
||||||
|
user views the module in kcontrol. This program is expected to be in
|
||||||
|
the application's data files directory.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Application templates -->
|
||||||
|
<chapter id="application-templates">
|
||||||
|
<title>Application templates</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <filename>app_templates</filename> directory contains a number of
|
||||||
|
application templates. An <quote>application template</quote> is just a collection of files
|
||||||
|
in a directory structure that should be copied and used as starting point
|
||||||
|
when developing a new application. An application template typically contains
|
||||||
|
default documentation files, icons, source file and <filename>setup.py
|
||||||
|
</filename> file which can later be modified.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Every application template has a number of files in common. They are
|
||||||
|
described below.
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>AUTHORS</filename></term>
|
||||||
|
<listitem><para>Lists the authors of this software.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>ChangeLog</filename></term>
|
||||||
|
<listitem><para>An itemised log or list of changes to the software.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>COPYING</filename></term>
|
||||||
|
<listitem><para>A copy of the GNU GPL, explaining the terms under which this
|
||||||
|
software may be distributed. This file does not need to be changed.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>INSTALL</filename></term>
|
||||||
|
<listitem><para>Instructions for installing the software.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>MANIFEST.in</filename></term>
|
||||||
|
<listitem><para></para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>NEWS</filename></term>
|
||||||
|
<listitem><para>News about what is new in the current version of this software.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>README</filename></term>
|
||||||
|
<listitem><para>Important instructions and information that the user should
|
||||||
|
read first.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>setup.py</filename></term>
|
||||||
|
<listitem><para>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>TODO</filename></term>
|
||||||
|
<listitem><para>List of features and work that may be available in a future
|
||||||
|
version of the software.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>po/</filename></term>
|
||||||
|
<listitem><para>This directory is initially empty. It is used for
|
||||||
|
<literal role="extension">.pot</literal> and <literal role="extension">.po
|
||||||
|
</literal> translation files.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>doc/</filename></term>
|
||||||
|
<listitem><para>This directory is initially empty. It is used for holding the
|
||||||
|
directores for the different langauge version of the manual.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>doc/en</filename></term>
|
||||||
|
<listitem><para>This directory for the english version of the manual.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>doc/en/index.docbook</filename></term>
|
||||||
|
<listitem><para>The english manual in docbook format. The default is a template
|
||||||
|
which can then be filled in.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>src</filename></term>
|
||||||
|
<listitem><para>This directory containing the source code for the software.
|
||||||
|
The default contents of this directory depends on the particular
|
||||||
|
application template.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect1 id="app-template-simple">
|
||||||
|
<title>Simple KDE utility template</title>
|
||||||
|
<para>
|
||||||
|
The <filename>kdeutility</filename> application template is a simple utility
|
||||||
|
that uses an interface designed in Qt-Designer. It doesn't have a menubar
|
||||||
|
or toolbar.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="app-template-application">
|
||||||
|
<title>KDE application template</title>
|
||||||
|
<para>
|
||||||
|
The <filename>kdeapp</filename> application template is an application with
|
||||||
|
menubar, toolbar and separated document and view classes. The menubar and toolbars
|
||||||
|
are defined using XML.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="app-template-kcontrol">
|
||||||
|
<title>Kcontrol Module Application Template</title>
|
||||||
|
<para>
|
||||||
|
The <filename>kcontrol_module</filename> application template is a simple
|
||||||
|
module for the KDE Control Center. The module can also be run as a separate
|
||||||
|
application outside of KControl to ease development and debugging.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="app-template-kioslave">
|
||||||
|
<title>KIO-slave Application Template</title>
|
||||||
|
<para>
|
||||||
|
The <filename>kioslave</filename> application template is a simple
|
||||||
|
KIO-slave that implements a simple RAM disk. Once installed it can be
|
||||||
|
accessed using kioslave:/ in konqueror. It is initially empty. Files and
|
||||||
|
directories can be made and deposited. <filename>kioslave.py</filename>
|
||||||
|
contains more information and comments.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
Note that the KIO subsystem usually creates multiple running instances
|
||||||
|
of a kio-slave backend. For the application template, files and directories
|
||||||
|
are specific to each particular backend instance. When using konqueror the
|
||||||
|
same instance will be used, but if you try to access kioslave:/ from a
|
||||||
|
different process a new (empty!) instance will be craeted. This can be
|
||||||
|
confusing! Be aware.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<chapter id="commands">
|
||||||
|
<title>Command Reference</title>
|
||||||
|
<sect1 id="appname-mainwindow">
|
||||||
|
<title>The main &appname; window</title>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="developers">
|
||||||
|
<title>Developer's Guide to &appname;</title>
|
||||||
|
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Programming &appname; plugins is a joy to behold. Just read through the next
|
||||||
|
66 pages of API's to learn how!
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<refentry id="re-1007-unmanagechildren-1">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>XtUnmanageChildren</refentrytitle>
|
||||||
|
<refmiscinfo>Xt - Geometry Management</refmiscinfo>
|
||||||
|
</refmeta>
|
||||||
|
<refnamediv>
|
||||||
|
<refname>XtUnmanageChildren
|
||||||
|
</refname>
|
||||||
|
<refpurpose>remove a list of children from a parent widget's managed
|
||||||
|
list.
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-1"><primary>widgets</primary><secondary>removing</secondary></indexterm>
|
||||||
|
<indexterm id="ix-1007-unmanagechildren-2"><primary>XtUnmanageChildren</primary></indexterm>
|
||||||
|
</refpurpose>
|
||||||
|
|
||||||
|
</refnamediv>
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<refsynopsisdivinfo>
|
||||||
|
<date>4 March 1996</date>
|
||||||
|
</refsynopsisdivinfo>
|
||||||
|
<synopsis>
|
||||||
|
void XtUnmanageChildren(<replaceable class="parameter">children</replaceable>, <replaceable class="parameter">num_children</replaceable>)
|
||||||
|
WidgetList <replaceable class="parameter">children</replaceable>;
|
||||||
|
Cardinal <replaceable class="parameter">num_children</replaceable>;
|
||||||
|
</synopsis>
|
||||||
|
|
||||||
|
<refsect2 id="r2-1007-unmanagechildren-1">
|
||||||
|
<title>Inputs</title>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies an array of child widgets. Each child must be of
|
||||||
|
class RectObj or any subclass thereof.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><replaceable class="parameter">num_children</replaceable>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Specifies the number of elements in <replaceable class="parameter">children</replaceable>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect2></refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-1">
|
||||||
|
<title>Description
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> unmaps the specified widgets
|
||||||
|
and removes them from their parent's geometry management.
|
||||||
|
The widgets will disappear from the screen, and (depending
|
||||||
|
on its parent) may no longer have screen space allocated for
|
||||||
|
them.
|
||||||
|
</para>
|
||||||
|
<para>Each of the widgets in the <replaceable class="parameter">children</replaceable> array must have
|
||||||
|
the same parent.
|
||||||
|
</para>
|
||||||
|
<para>See the “Algorithm” section below for full details of the
|
||||||
|
widget unmanagement procedure.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-2">
|
||||||
|
<title>Usage</title>
|
||||||
|
<para>Unmanaging widgets is the usual method for temporarily
|
||||||
|
making them invisible. They can be re-managed with
|
||||||
|
<function>XtManageChildren()</function>.
|
||||||
|
</para>
|
||||||
|
<para>You can unmap a widget, but leave it under geometry
|
||||||
|
management by calling <function>XtUnmapWidget()</function>. You can
|
||||||
|
destroy a widget's window without destroying the widget by
|
||||||
|
calling <function>XtUnrealizeWidget()</function>. You can destroy a
|
||||||
|
widget completely with <function>XtDestroyWidget()</function>.
|
||||||
|
</para>
|
||||||
|
<para>If you are only going to unmanage a single widget, it is
|
||||||
|
more convenient to call <function>XtUnmanageChild()</function>. It is
|
||||||
|
often more convenient to call <function>XtUnmanageChild()</function>
|
||||||
|
several times than it is to declare and initialize an array
|
||||||
|
of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
|
||||||
|
<function>XtUnmanageChildren()</function> is more efficient, however,
|
||||||
|
because it only calls the parent's <function>change_managed()</function>
|
||||||
|
method once.
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-3">
|
||||||
|
<title>Algorithm
|
||||||
|
</title>
|
||||||
|
<para><function>XtUnmanageChildren()</function> performs the following:
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Ignores the child if it already is unmanaged or is being
|
||||||
|
destroyed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>-
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Otherwise, if the child is realized, it makes it nonvisible
|
||||||
|
by unmapping it.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id="r1-1007-unmanagechildren-4">
|
||||||
|
<title>Structures</title>
|
||||||
|
<para>The <type>WidgetList</type> type is simply an array of widgets:
|
||||||
|
</para>
|
||||||
|
<screen id="sc-1007-unmanagechildren-1">typedef Widget *WidgetList;
|
||||||
|
</screen>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="faq">
|
||||||
|
<title>Questions and Answers</title>
|
||||||
|
|
||||||
|
|
||||||
|
&reporting.bugs;
|
||||||
|
&updating.documentation;
|
||||||
|
|
||||||
|
<qandaset id="faqlist">
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>My Mouse doesn't work. How do I quit &appname;?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You silly goose! Check out the <link linkend="commands">Commands
|
||||||
|
Section</link> for the answer.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
<qandaentry>
|
||||||
|
<question>
|
||||||
|
<para>Why can't I twiddle my documents?</para>
|
||||||
|
</question>
|
||||||
|
<answer>
|
||||||
|
<para>You can only twiddle your documents if you have the foobar.lib
|
||||||
|
installed.</para>
|
||||||
|
</answer>
|
||||||
|
</qandaentry>
|
||||||
|
</qandaset>
|
||||||
|
</chapter>
|
||||||
|
-->
|
||||||
|
<chapter id="credits">
|
||||||
|
|
||||||
|
<!-- Include credits for the programmers, documentation writers, and
|
||||||
|
contributors here. The license for your software should then be included below
|
||||||
|
the credits with a reference to the appropriate license file included in the KDE
|
||||||
|
distribution. -->
|
||||||
|
|
||||||
|
<title>Credits and License</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
&appname;
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Program copyright 2005 Simon Edwards <email>simon@simonzone.com</email>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Contributors:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Konqui the KDE Dragon <email>konqui@kde.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem><para>Tux the Linux Penguin <email>tux@linux.org</email></para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Documentation copyright 2005 Simon Edwards <email>simon@simonzone.com</email>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
|
||||||
|
|
||||||
|
&underFDL; <!-- FDL: do not remove -->
|
||||||
|
</chapter>
|
||||||
|
<!--
|
||||||
|
<appendix id="installation">
|
||||||
|
<title>Installation</title>
|
||||||
|
|
||||||
|
<sect1 id="getting-appname">
|
||||||
|
<title>How to obtain &appname;</title>
|
||||||
|
|
||||||
|
&install.intro.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="requirements">
|
||||||
|
<title>Requirements</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In order to successfully use &appname;, you need &kde; 1.1. Foobar.lib is
|
||||||
|
required in order to support the advanced &appname; features. &appname; uses
|
||||||
|
about 5 megs of memory to run, but this may vary depending on your
|
||||||
|
platform and configuration.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
All required libraries as well as &appname; itself can be found
|
||||||
|
on <ulink url="ftp://ftp.appname.org">The &appname; home page</ulink>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You can find a list of changes at <ulink
|
||||||
|
url="http://apps.kde.org/appname">http://apps.kde.org/appname</ulink>.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="compilation">
|
||||||
|
<title>Compilation and Installation</title>
|
||||||
|
|
||||||
|
&install.compile.documentation;
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="configuration">
|
||||||
|
<title>Configuration</title>
|
||||||
|
|
||||||
|
<para>Don't forget to tell your system to start the <filename>dtd</filename>
|
||||||
|
dicer-toaster daemon first, or &appname; won't work !</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</appendix>
|
||||||
|
-->
|
||||||
|
&documentation.index;
|
||||||
|
</book>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-general-insert-case:lower
|
||||||
|
sgml-indent-step:0
|
||||||
|
sgml-indent-data:nil
|
||||||
|
End:
|
||||||
|
|
||||||
|
vim:tabstop=2:shiftwidth=2:expandtab
|
||||||
|
-->
|
||||||
|
|
@ -0,0 +1,323 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# setup - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Thu Apr 21 2005 #
|
||||||
|
# copyright : (C) 2005 by Simon Edwards #
|
||||||
|
# email : simon@simonzone.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU Library General Public License as #
|
||||||
|
# published by the Free Software Foundation; either version 2 of the #
|
||||||
|
# License, or (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
from distutils.cmd import Command
|
||||||
|
from distutils import sysconfig
|
||||||
|
from distutils.spawn import find_executable,spawn
|
||||||
|
from distutils import dir_util
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
sys.path.insert(0,"src") # We need this for the import statement below.
|
||||||
|
|
||||||
|
import kdedistutils
|
||||||
|
|
||||||
|
def main():
|
||||||
|
kdedistutils.setup(name="pykdeextensions",
|
||||||
|
version="0.4.0",
|
||||||
|
author="Simon Edwards",
|
||||||
|
author_email="simon@simonzone.com",
|
||||||
|
url="http://www.simonzone.com/software/pykdeextensions/",
|
||||||
|
min_kde_version = "3.0.0",
|
||||||
|
min_qt_version = "3.0.0",
|
||||||
|
license = "LGPL",
|
||||||
|
package_dir = {'': 'src'},
|
||||||
|
py_modules = ["kdedistutils","qtuicompiler","qtdesigner","kdedesigner"],
|
||||||
|
application_data = ["app_templates","AUTHORS","ChangeLog","COPYING","INSTALL","NEWS"],
|
||||||
|
docbooks = [ ('doc/en','en') ],
|
||||||
|
cmdclass = {
|
||||||
|
'install' : InstallPyKDEExtensions,
|
||||||
|
'build_libpythonize' : BuildLibpythonize,
|
||||||
|
'install_libpythonize' : InstallLibpythonize
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
class InstallPyKDEExtensions(kdedistutils.InstallKDE):
|
||||||
|
sub_commands = kdedistutils.InstallKDE.sub_commands[:]
|
||||||
|
sub_commands.append( ('install_libpythonize',None) )
|
||||||
|
|
||||||
|
user_options = kdedistutils.InstallKDE.user_options
|
||||||
|
user_options.append( ('install-clib=', None, "installation directory for shared libraries") )
|
||||||
|
user_options.append( ('install-cheaders=', None, "installation directory for C header files") )
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
self.install_clib = None
|
||||||
|
self.install_cheaders = None
|
||||||
|
kdedistutils.InstallKDE.initialize_options(self)
|
||||||
|
|
||||||
|
def finalize_options(self):
|
||||||
|
if self.install_clib is None:
|
||||||
|
if self.prefix is not None:
|
||||||
|
self.install_clib = os.path.join(self.prefix,'lib')
|
||||||
|
else:
|
||||||
|
self.announce("Detecting KDE library directory...")
|
||||||
|
self.install_clib = kdedistutils.ask_kde_config('--install lib --expandvars').strip()
|
||||||
|
self.announce(" ...KDE library directory is %s" % self.install_clib)
|
||||||
|
|
||||||
|
if self.install_cheaders is None:
|
||||||
|
if self.prefix is not None:
|
||||||
|
self.install_cheaders = os.path.join(self.prefix,'include')
|
||||||
|
else:
|
||||||
|
self.announce("Detecting KDE headers directory...")
|
||||||
|
self.install_cheaders = os.path.normpath(os.path.join(kdedistutils.ask_kde_config('--install lib --expandvars').strip(),"../include"))
|
||||||
|
self.announce(" ...KDE library headers is %s" % self.install_cheaders)
|
||||||
|
|
||||||
|
kdedistutils.InstallKDE.finalize_options(self)
|
||||||
|
|
||||||
|
if self.root is not None:
|
||||||
|
self.change_roots('clib','cheaders')
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
class BuildLibpythonize(Command):
|
||||||
|
description = "Build libpythonize"
|
||||||
|
|
||||||
|
user_options = [
|
||||||
|
('install-dir=', 'd',"Directory for the libpythonize shared library."),
|
||||||
|
('no-libpythonize',None,"Don't build libpythonize"),
|
||||||
|
('build-dir=','b', "build directory (where to install from)"),
|
||||||
|
('python-dir=',None,'Directory containing the Python installation'),
|
||||||
|
('python-inc-dir=',None,'Directory containing C Header files for Python'),
|
||||||
|
('clib=',None,'gcc library and path'),
|
||||||
|
]
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
self.build_dir = None
|
||||||
|
self.install_dir = None
|
||||||
|
self.no_libpythonize = 0
|
||||||
|
self.python_inc_dir = None
|
||||||
|
self.python_dir = None
|
||||||
|
self.clib = None
|
||||||
|
|
||||||
|
def finalize_options(self):
|
||||||
|
if self.no_libpythonize==0:
|
||||||
|
own_install_dir = self.install_dir is not None
|
||||||
|
|
||||||
|
self.set_undefined_options('install',\
|
||||||
|
('build_base', 'build_dir'),
|
||||||
|
('install_clib', 'install_dir') )
|
||||||
|
|
||||||
|
install = self.get_finalized_command('install')
|
||||||
|
self.install_prefix = install.prefix
|
||||||
|
|
||||||
|
# Python dir
|
||||||
|
if self.python_dir is None:
|
||||||
|
self.python_dir = os.path.split(sysconfig.get_config_var("LIBP"))[0]
|
||||||
|
self.announce("Using %s for the python directory" % self.python_dir)
|
||||||
|
|
||||||
|
# Python include dir.
|
||||||
|
if self.python_inc_dir is None:
|
||||||
|
# Find the Python include directory.
|
||||||
|
self.python_inc_dir = sysconfig.get_config_var("INCLUDEPY")
|
||||||
|
self.announce("Using %s for Python header files" % self.python_inc_dir)
|
||||||
|
|
||||||
|
# Find the C library (libgcc, libgcc_s or some other variation).
|
||||||
|
if self.clib is None:
|
||||||
|
canidatepaths = ["/usr/"+kdedistutils.get_libdir_name(), "/usr/local/"+kdedistutils.get_libdir_name() ]
|
||||||
|
self.clib = kdedistutils.FindFileInPaths("libgcc*.so",canidatepaths)
|
||||||
|
if self.clib!=None:
|
||||||
|
self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0]
|
||||||
|
else:
|
||||||
|
self.clib = kdedistutils.FindFileInPaths("libgcc*.a",canidatepaths)
|
||||||
|
if self.clib!=None:
|
||||||
|
self.clib = glob.glob(os.path.join(self.clib,'libgcc*.a'))[0]
|
||||||
|
if self.clib is None:
|
||||||
|
raise SystemExit, "Failed to find a suitable libgcc library"
|
||||||
|
self.announce("Using %s for clib" % self.clib)
|
||||||
|
|
||||||
|
# Make a list of places to look for python .so modules
|
||||||
|
self.python_sub_dirs = sysconfig.get_config_var("LIBSUBDIRS").split()
|
||||||
|
base = sysconfig.get_config_var("LIBP")
|
||||||
|
self.python_sub_dirs = [ os.path.join(base,item) for item in self.python_sub_dirs ]
|
||||||
|
self.python_sub_dirs.append(base)
|
||||||
|
|
||||||
|
def get_command_name(self):
|
||||||
|
return 'build_libpythonize'
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if self.no_libpythonize:
|
||||||
|
self.announce("Skipping libpythonize")
|
||||||
|
return
|
||||||
|
|
||||||
|
self.announce("Building libpythonize.")
|
||||||
|
|
||||||
|
cppfile = "src/pythonize.cpp"
|
||||||
|
# Compile the library.
|
||||||
|
cmdlist = ['libtool']
|
||||||
|
|
||||||
|
# Couldn't get it to pass without this ...
|
||||||
|
cmdlist.append("--mode=compile")
|
||||||
|
cmdlist.append("--tag=CXX")
|
||||||
|
|
||||||
|
# Find the compiler flags and options
|
||||||
|
# CXX is empty on some Systems, let's do it 'the hard way'.
|
||||||
|
# FIXME :: get CXX from make.conf for Gentoo.
|
||||||
|
if len(sysconfig.get_config_var("CXX").split()) >= 2:
|
||||||
|
cmdlist.extend(sysconfig.get_config_var("CXX").split())
|
||||||
|
else:
|
||||||
|
cmdlist.extend(['g++', '-pthread'])
|
||||||
|
|
||||||
|
# cc_flags
|
||||||
|
cmdlist.append("-c")
|
||||||
|
cmdlist.append("-g")
|
||||||
|
|
||||||
|
# The 4 is randomly chosen!
|
||||||
|
# FIXME :: get CFLAGS from make.conf for Gentoo.
|
||||||
|
if len(sysconfig.get_config_var("CFLAGS").split()) >=4:
|
||||||
|
cmdlist.extend(sysconfig.get_config_var("CFLAGS").split())
|
||||||
|
else:
|
||||||
|
# On Gentoo systems, CFLAGS are not in the environment.
|
||||||
|
raw = os.popen('emerge info 2> /dev/null|grep CFLAGS')
|
||||||
|
lines = raw.readlines()
|
||||||
|
if len(lines):
|
||||||
|
cflags = lines[0].split('"')[1].split()
|
||||||
|
print "Got CFLAGS from emerge info."
|
||||||
|
cmdlist.extend(cflags)
|
||||||
|
else:
|
||||||
|
# Still no CFLAGS found, use these ...
|
||||||
|
cmdlist.extend(['-fno-strict-aliasing', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes'])
|
||||||
|
|
||||||
|
# includes
|
||||||
|
cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR"))
|
||||||
|
cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEPY"))
|
||||||
|
cmdlist.append("-I" + self.python_inc_dir)
|
||||||
|
cmdlist.append("-Isrc")
|
||||||
|
# input
|
||||||
|
cmdlist.append(cppfile)
|
||||||
|
# output
|
||||||
|
outputfile = os.path.join(self.build_dir,'libpythonize.lo')
|
||||||
|
cmdlist.append("-o")
|
||||||
|
cmdlist.append(outputfile)
|
||||||
|
spawn(cmdlist) # Execute!!!
|
||||||
|
print
|
||||||
|
|
||||||
|
# Link the resulting object file to create a shared library.
|
||||||
|
cmdlist = ['libtool']
|
||||||
|
cmdlist.append("--mode=link")
|
||||||
|
|
||||||
|
# Grab the linker command name
|
||||||
|
cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0])
|
||||||
|
# link_flags
|
||||||
|
cmdlist.append("-module")
|
||||||
|
cmdlist.append("-export-dynamic")
|
||||||
|
# object
|
||||||
|
cmdlist.append(outputfile)
|
||||||
|
cmdlist.append("-rpath"); cmdlist.append(self.install_dir)
|
||||||
|
cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,'libpythonize.la'))
|
||||||
|
# Link libs
|
||||||
|
linklist = []
|
||||||
|
linklist.append("-lpython%i.%i" % (sys.version_info[0],sys.version_info[1]) )
|
||||||
|
linklist.extend(sysconfig.get_config_var("LIBS").split())
|
||||||
|
|
||||||
|
linklist.append("-lm")
|
||||||
|
linklist.append("-lstdc++")
|
||||||
|
linklist.append("-lc")
|
||||||
|
linklist.append(self.clib)
|
||||||
|
|
||||||
|
linklist.append("-R"); linklist.append(self.python_dir)
|
||||||
|
|
||||||
|
cmdlist.extend(linklist)
|
||||||
|
spawn(cmdlist) # Execute!!
|
||||||
|
print
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
class InstallLibpythonize(Command):
|
||||||
|
description = "Install libpythonize"
|
||||||
|
|
||||||
|
user_options = [
|
||||||
|
('install-dir=', 'd',"Directory for the libpythonize shared library."),
|
||||||
|
('build-dir=','b', "build directory (where to install from)"),
|
||||||
|
('cheader-dir=', 'h',"Directory for the pythonize.h C header file."),
|
||||||
|
('install-cmd=', None, "Command to use to install the files"),
|
||||||
|
('root=', None, "install everything relative to this alternate root directory"),
|
||||||
|
('force', 'f', "force installation (overwrite existing files)"),
|
||||||
|
('skip-build', None, "skip the build steps"),
|
||||||
|
]
|
||||||
|
|
||||||
|
boolean_options = ['force', 'skip-build']
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
self.install_dir = None
|
||||||
|
self.build_dir = None
|
||||||
|
self.install_cmd = None
|
||||||
|
self.cheader_dir = None
|
||||||
|
self.outfiles = []
|
||||||
|
self.root = None
|
||||||
|
self.force = 0
|
||||||
|
self.warn_dir = 1
|
||||||
|
self.skip_build = None
|
||||||
|
|
||||||
|
def finalize_options(self):
|
||||||
|
own_install_dir = self.install_dir is not None
|
||||||
|
own_cheader_dir = self.cheader_dir is not None
|
||||||
|
|
||||||
|
self.set_undefined_options('install',
|
||||||
|
('build_base','build_dir'),
|
||||||
|
('install_clib', 'install_dir'),
|
||||||
|
('install_cheaders', 'cheader_dir'),
|
||||||
|
('install_cmd', 'install_cmd'),
|
||||||
|
('root', 'root'),
|
||||||
|
('force', 'force'),
|
||||||
|
('skip_build', 'skip_build')
|
||||||
|
)
|
||||||
|
|
||||||
|
if own_install_dir and self.root is not None:
|
||||||
|
self.install_dir = change_root(self.root,self.install_dir)
|
||||||
|
if own_cheader_dir and self.root is not None:
|
||||||
|
self.cheader_dir = change_root(self.root,self.cheader_dir)
|
||||||
|
|
||||||
|
def get_command_name(self):
|
||||||
|
return 'install_libpythonize'
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if not self.skip_build:
|
||||||
|
self.run_command('build_libpythonize')
|
||||||
|
|
||||||
|
self.announce("Installing libpythonize...")
|
||||||
|
|
||||||
|
self.outfiles.extend(self.mkpath(self.install_dir))
|
||||||
|
|
||||||
|
# Install the library.
|
||||||
|
cmdlist = ['libtool']
|
||||||
|
cmdlist.append("--mode=install")
|
||||||
|
cmdlist.append(self.install_cmd)
|
||||||
|
cmdlist.append("-c")
|
||||||
|
cmdlist.append(os.path.join(self.build_dir,"libpythonize.la"))
|
||||||
|
cmdlist.append(os.path.join(self.install_dir,"libpythonize.la"))
|
||||||
|
spawn(cmdlist) # Execute!!
|
||||||
|
print
|
||||||
|
|
||||||
|
# Work the names of the files that were installed.
|
||||||
|
self.outfiles = []
|
||||||
|
for file in glob.glob(os.path.join(self.build_dir,'.libs/libpythonize*')):
|
||||||
|
self.outfiles.append(os.path.join(self.install_dir,os.path.basename(file)))
|
||||||
|
|
||||||
|
# Create a directory for the C header file.
|
||||||
|
self.outfiles.extend(self.mkpath(self.cheader_dir))
|
||||||
|
|
||||||
|
# Install the header file.
|
||||||
|
(out, _) = self.copy_file("src/pythonize.h", os.path.join(self.cheader_dir,'pythonize.h'))
|
||||||
|
self.outfiles.append(out)
|
||||||
|
|
||||||
|
self.announce("Done installing libpythonize.")
|
||||||
|
|
||||||
|
def get_outputs(self):
|
||||||
|
return self.outfiles
|
||||||
|
|
||||||
|
def mkpath(self, name, mode=0777):
|
||||||
|
return dir_util.mkpath(name, mode, dry_run=self.dry_run)
|
||||||
|
|
||||||
|
main()
|
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
############################################################################
|
||||||
|
# kdedesigner - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Thu Apr 21 2005 #
|
||||||
|
# copyright : (C) 2005 by Simon Edwards #
|
||||||
|
# email : simon@simonzone.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU Library General Public License as #
|
||||||
|
# published by the Free Software Foundation; either version 2 of the #
|
||||||
|
# License, or (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import __builtin__
|
||||||
|
import qtuicompiler
|
||||||
|
|
||||||
|
python_import = __builtin__.__import__
|
||||||
|
def load(*args):
|
||||||
|
qtuicompiler.DynamicImport(args,True)
|
||||||
|
return apply(python_import,args)
|
||||||
|
__builtin__.__import__ = load
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,238 @@
|
|||||||
|
/* copyright 2003 Jim Bublitz <jbublitz@nwinternet.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// this just gets rid of a warning when Python.h redefines it
|
||||||
|
#undef _POSIX_C_SOURCE
|
||||||
|
|
||||||
|
#include <pythonize.h>
|
||||||
|
|
||||||
|
#define debug 1
|
||||||
|
|
||||||
|
ObjectRef::ObjectRef (ObjectRef *oi, PyObject *o)
|
||||||
|
{
|
||||||
|
prevObject = oi;
|
||||||
|
object = o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Pythonize::Pythonize ()
|
||||||
|
{
|
||||||
|
pythonInit = 1;
|
||||||
|
objects = NULL;
|
||||||
|
|
||||||
|
if (debug) printf ("\n\nPythonize constructor -- pid = %i\n", getpid ());
|
||||||
|
|
||||||
|
if (!Py_IsInitialized ())
|
||||||
|
{
|
||||||
|
PyEval_InitThreads ();
|
||||||
|
Py_Initialize ();
|
||||||
|
if (!Py_IsInitialized ())
|
||||||
|
{
|
||||||
|
pythonInit = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) printf ("Python interpreter initialized!\n\n");
|
||||||
|
|
||||||
|
// free the lock
|
||||||
|
PyEval_ReleaseLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Pythonize::runScript (char *scriptPath)
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (debug) printf ("Running script: %s\n", scriptPath);
|
||||||
|
|
||||||
|
if (scriptPath == NULL || strlen (scriptPath) == 0) return false;
|
||||||
|
|
||||||
|
f = fopen (scriptPath, "r");
|
||||||
|
if (f == NULL) return false;
|
||||||
|
|
||||||
|
res = PyRun_SimpleFile (f, scriptPath);
|
||||||
|
|
||||||
|
fclose (f);
|
||||||
|
return res == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PyObject * Pythonize::runFunction (PyObject *object, PyObject *args)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!PyCallable_Check (object))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
PyObject *res = PyObject_CallObject (object, args ? args : PyTuple_New (0));
|
||||||
|
Py_XINCREF (res);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * Pythonize::runFunctionVoid (PyObject *object, PyObject *args)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!PyCallable_Check (object))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
PyObject *pyRes = PyObject_CallObject (object, args ? args : PyTuple_New (0));
|
||||||
|
void *res = PyLong_AsVoidPtr (pyRes);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Pythonize::runString (char *str)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (str == NULL || strlen (str) == 0) return false;
|
||||||
|
|
||||||
|
int res = PyRun_SimpleString (str);
|
||||||
|
|
||||||
|
return res == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Pythonize::appendToSysPath (const char* newPath)
|
||||||
|
{
|
||||||
|
if (newPath == NULL || strlen (newPath) == 0) return false;
|
||||||
|
|
||||||
|
char *fmtString = "import sys\nif not '%s' in sys.path:\n\tsys.path.append ('%s')\n"; //print sys.path\n";
|
||||||
|
int length = strlen (fmtString) + 2*strlen (newPath) + 1;
|
||||||
|
char *line = new char [length];
|
||||||
|
if (!line) return false;
|
||||||
|
snprintf (line, length, fmtString, newPath, newPath);
|
||||||
|
|
||||||
|
int res = PyRun_SimpleString (line);
|
||||||
|
|
||||||
|
delete line;
|
||||||
|
return res == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *Pythonize::importModule (char *moduleName)
|
||||||
|
{
|
||||||
|
if (moduleName == NULL || strlen (moduleName) == 0) return NULL;
|
||||||
|
|
||||||
|
PyObject *module = PyImport_ImportModule (moduleName);
|
||||||
|
|
||||||
|
objects = new ObjectRef (objects, module);
|
||||||
|
if (!objects) return NULL;
|
||||||
|
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Pythonize::~Pythonize ()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (debug) printf ("Pythonize destructor\n");
|
||||||
|
ObjectRef *top;
|
||||||
|
|
||||||
|
while (objects)
|
||||||
|
{
|
||||||
|
top = objects;
|
||||||
|
objects = objects->prevObject;
|
||||||
|
delete top;
|
||||||
|
}
|
||||||
|
if (debug) printf (" --- Objects destroyed\n");
|
||||||
|
|
||||||
|
Py_Finalize();
|
||||||
|
|
||||||
|
if (debug) printf (" --- Py_Finalized\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// The global Pythonize instance
|
||||||
|
Pythonize *pyize = new Pythonize ();
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
Pythonize *_pythonize;
|
||||||
|
|
||||||
|
Pythonize *initialize ()
|
||||||
|
{
|
||||||
|
if (_pythonize) return _pythonize;
|
||||||
|
|
||||||
|
_pythonize = new Pythonize ();
|
||||||
|
if (!_pythonize || !_pythonize->getPythonInit ())
|
||||||
|
{
|
||||||
|
if (_pythonize) delete _pythonize;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _pythonize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void finalize ()
|
||||||
|
{
|
||||||
|
if (_pythonize) {
|
||||||
|
if (debug) printf(" --- Pythonize finalize()\n");
|
||||||
|
delete _pythonize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// adds a path to sys.path
|
||||||
|
bool appendToSysPath (const char* newPath)
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->appendToSysPath (newPath) : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// imports a module into the interpreter
|
||||||
|
// or gets a PyObject for an already loaded module
|
||||||
|
PyObject *importModule (char *moduleName)
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->importModule (moduleName) : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns an object from a loaded module
|
||||||
|
// you must decref the object returned when done with it (new reference returned)
|
||||||
|
PyObject *getNewObjectRef (PyObject *module, char *object)
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->getNewObjectRef (module, object) : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getPythonInit ()
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->getPythonInit () : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// decrements the ref count of an object
|
||||||
|
void decref (PyObject *object)
|
||||||
|
{
|
||||||
|
Py_XDECREF (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
// runs a script on the current sys.path
|
||||||
|
bool runScript (char *scriptPath)
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->runScript (scriptPath) : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// executes a string of Python in the interpreter
|
||||||
|
bool runString (char *str)
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->runString (str) : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// runs a callable Python object
|
||||||
|
PyObject *runFunction (PyObject *object, PyObject *args)
|
||||||
|
{
|
||||||
|
return _pythonize ? _pythonize->runFunction (object, args) : NULL;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,104 @@
|
|||||||
|
/* copyright 2003 Jim Bublitz <jbublitz@nwinternet.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of
|
||||||
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __pythonize_h__
|
||||||
|
#define __pythonize_h__
|
||||||
|
|
||||||
|
// Pythonize is a general purpose library that wraps the Python
|
||||||
|
// interpreter with an interface to a set of common operations
|
||||||
|
// used when embedding the interpreter.
|
||||||
|
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
struct ObjectRef
|
||||||
|
{
|
||||||
|
ObjectRef (ObjectRef *oi, PyObject *o);
|
||||||
|
~ObjectRef () { Py_XDECREF (object); }
|
||||||
|
|
||||||
|
PyObject *object; // pointer to an object we created
|
||||||
|
ObjectRef *prevObject; // pointer to next object on the stack
|
||||||
|
};
|
||||||
|
|
||||||
|
class Pythonize
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Pythonize ();
|
||||||
|
~Pythonize ();
|
||||||
|
|
||||||
|
// adds a path to sys.path
|
||||||
|
bool appendToSysPath (const char* newPath);
|
||||||
|
|
||||||
|
// imports a module into the interpreter
|
||||||
|
// or gets a PyObject for an already loaded module
|
||||||
|
PyObject *importModule (char *moduleName);
|
||||||
|
|
||||||
|
// returns an object from a loaded module
|
||||||
|
// you must decref the object returned when done with it (new reference returned)
|
||||||
|
PyObject *getNewObjectRef (PyObject *module, char *object) { return PyObject_GetAttrString (module, object); }
|
||||||
|
|
||||||
|
int getPythonInit () { return pythonInit; }
|
||||||
|
|
||||||
|
// decrements the ref count of an object
|
||||||
|
void decref (PyObject *object) { Py_XDECREF (object); }
|
||||||
|
|
||||||
|
// runs a script on the current sys.path
|
||||||
|
bool runScript (char *scriptPath);
|
||||||
|
|
||||||
|
// executes a string of Python in the interpreter
|
||||||
|
bool runString (char *str);
|
||||||
|
|
||||||
|
// runs a callable Python object
|
||||||
|
PyObject *runFunction(PyObject *object, PyObject *args);
|
||||||
|
void *runFunctionVoid(PyObject *object, PyObject *args);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int pythonInit; // status of Py_Initialize
|
||||||
|
ObjectRef *objects; // a stack of PyObjects (used in destructor)
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
Pythonize *initialize();
|
||||||
|
void finalize();
|
||||||
|
|
||||||
|
// adds a path to sys.path
|
||||||
|
bool appendToSysPath (const char* newPath);
|
||||||
|
|
||||||
|
// imports a module into the interpreter
|
||||||
|
// or gets a PyObject for an already loaded module
|
||||||
|
PyObject *importModule (char *moduleName);
|
||||||
|
|
||||||
|
// returns an object from a loaded module
|
||||||
|
// you must decref the object returned when done with it (new reference returned)
|
||||||
|
PyObject *getNewObjectRef (PyObject *module, char *object);
|
||||||
|
|
||||||
|
bool getPythonInit();
|
||||||
|
|
||||||
|
// decrements the ref count of an object
|
||||||
|
void decref (PyObject *object);
|
||||||
|
|
||||||
|
// runs a script on the current sys.path
|
||||||
|
bool runScript (char *scriptPath);
|
||||||
|
|
||||||
|
// executes a string of Python in the interpreter
|
||||||
|
bool runString (char *str);
|
||||||
|
|
||||||
|
// runs a callable Python object
|
||||||
|
PyObject *runFunction (PyObject *object, PyObject *args);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# qtdesigner - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Thu Apr 21 2005 #
|
||||||
|
# copyright : (C) 2005 by Simon Edwards #
|
||||||
|
# email : simon@simonzone.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU Library General Public License as #
|
||||||
|
# published by the Free Software Foundation; either version 2 of the #
|
||||||
|
# License, or (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import __builtin__
|
||||||
|
import qtuicompiler
|
||||||
|
|
||||||
|
python_import = __builtin__.__import__
|
||||||
|
def load(*args):
|
||||||
|
qtuicompiler.DynamicImport(args,False)
|
||||||
|
return apply(python_import,args)
|
||||||
|
|
||||||
|
__builtin__.__import__ = load
|
@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
###########################################################################
|
||||||
|
# qtuicompiler - description #
|
||||||
|
# ------------------------------ #
|
||||||
|
# begin : Thu Apr 21 2005 #
|
||||||
|
# copyright : (C) 2005 by Simon Edwards #
|
||||||
|
# email : simon@simonzone.com #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
# #
|
||||||
|
# This program is free software; you can redistribute it and/or modify #
|
||||||
|
# it under the terms of the GNU Library General Public License as #
|
||||||
|
# published by the Free Software Foundation; either version 2 of the #
|
||||||
|
# License, or (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import pyqtconfig
|
||||||
|
from distutils.spawn import *
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
pyqt_configuration = pyqtconfig.Configuration()
|
||||||
|
pyuic_exe = None
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def FindPyuic():
|
||||||
|
global pyuic_exe
|
||||||
|
if pyuic_exe is not None: return pyuic_exe
|
||||||
|
|
||||||
|
pyuic_exe = find_executable('pyuic',pyqt_configuration.pyqt_bin_dir)
|
||||||
|
if pyuic_exe is None:
|
||||||
|
# Search on the $Path.
|
||||||
|
pyuic_exe = find_executable('pyuic')
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def CompileUI(ui_file_name, py_file_name=None, kde=False):
|
||||||
|
pyuic_exe = find_executable('pyuic',pyqt_configuration.default_bin_dir)
|
||||||
|
if pyuic_exe is None:
|
||||||
|
# Search on the $Path.
|
||||||
|
pyuic_exe = find_executable('pyuic')
|
||||||
|
if pyuic_exe is None:
|
||||||
|
pass # FIXME raise something!
|
||||||
|
|
||||||
|
if py_file_name is None:
|
||||||
|
py_file_name = os.path.splitext(os.path.basename(ui_file_name))[0] + '.py'
|
||||||
|
|
||||||
|
tmp_file_name = py_file_name + '.bak'
|
||||||
|
cmd = [pyuic_exe]
|
||||||
|
if kde:
|
||||||
|
cmd.append('-tr')
|
||||||
|
cmd.append('i18n')
|
||||||
|
cmd.append('-o')
|
||||||
|
cmd.append(tmp_file_name)
|
||||||
|
cmd.append(ui_file_name)
|
||||||
|
spawn(cmd)
|
||||||
|
|
||||||
|
input = open(tmp_file_name, 'r')
|
||||||
|
output = open(py_file_name, 'w')
|
||||||
|
for line in input.readlines():
|
||||||
|
if kde and string.strip(line) == 'from qt import *':
|
||||||
|
output.write(line)
|
||||||
|
output.write('from kdecore import *\nfrom kdeui import *\n\n')
|
||||||
|
elif kde and string.find(line, " = KDatePicker(") != -1:
|
||||||
|
o = string.find(line, ",")
|
||||||
|
output.write(line[:o] + ",QDate.currentDate()" + line[o:])
|
||||||
|
else:
|
||||||
|
output.write (line)
|
||||||
|
|
||||||
|
input.close()
|
||||||
|
output.close()
|
||||||
|
|
||||||
|
os.remove(tmp_file_name)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def DynamicImport(importargs,kde=False):
|
||||||
|
file_name = importargs[0].replace('.',os.sep)
|
||||||
|
file_name_ui = file_name + '.ui'
|
||||||
|
if os.path.exists(file_name_ui):
|
||||||
|
try:
|
||||||
|
UpdateUI(file_name_ui,kde)
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
raise ImportError, "Unable to compile Qt designer file %s." % args[0]
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def UpdateUI(ui_file,kde=False):
|
||||||
|
py_file = ui_file[:-3] + '.py'
|
||||||
|
remake = False
|
||||||
|
if os.path.exists(py_file):
|
||||||
|
remake = os.stat(py_file).st_mtime <= os.stat(ui_file).st_mtime
|
||||||
|
else:
|
||||||
|
remake = True
|
||||||
|
|
||||||
|
if remake:
|
||||||
|
CompileUI(ui_file, py_file, kde)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
def main():
|
||||||
|
# FIXME parse args and add --kde parameter.
|
||||||
|
if len(sys.argv)!=3:
|
||||||
|
print """\nUsage:
|
||||||
|
qtuicompiler filename.ui filename.py\n\n
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
CompileUI(sys.argv[1],sys.argv[2])
|
||||||
|
|
||||||
|
if __name__=='__main__':
|
||||||
|
main()
|
Loading…
Reference in new issue