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