You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1602 lines
49 KiB
1602 lines
49 KiB
// Copyright (c) 2000 - 2001 Phil Thompson <phil@river-bank.demon.co.uk>
|
|
|
|
/**********************************************************************
|
|
** Copyright (C) 2000 Troll Tech AS. All rights reserved.
|
|
**
|
|
** This file is part of TQt GUI Designer.
|
|
**
|
|
** This file may be distributed under the terms of the GNU General
|
|
** Public License version 2 as published by the Free Software
|
|
** Foundation and appearing in the file COPYING included in the
|
|
** packaging of this file. If you did not get the file, send email
|
|
** to info@trolltech.com
|
|
**
|
|
** The file is provided AS IS with NO WARRANTY OF ANY KIND,
|
|
** INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
|
|
** A PARTICULAR PURPOSE.
|
|
**
|
|
**********************************************************************/
|
|
|
|
#include "uic.h"
|
|
#include <qapplication.h>
|
|
#include <qfile.h>
|
|
#include <qfileinfo.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <qstringlist.h>
|
|
#include <qstrlist.h>
|
|
#include <qdatetime.h>
|
|
#include <widgetdatabase.h>
|
|
#include <domtool.h>
|
|
#include <globaldefs.h>
|
|
#include <qregexp.h>
|
|
#include <zlib.h>
|
|
|
|
static TQString mkBool( bool b )
|
|
{
|
|
return b? "1" : "0";
|
|
}
|
|
|
|
static TQString mkBool( const TQString& s )
|
|
{
|
|
return mkBool( s == "true" || s == "1" );
|
|
}
|
|
|
|
static bool toBool( const TQString& s )
|
|
{
|
|
return s == "true" || s.toInt() != 0;
|
|
}
|
|
|
|
|
|
// fixString is only used in conjunction with tr(). We need to write out the
|
|
// string in utf8 and make sure it's converted from utf8 when created.
|
|
static TQString fixString( const TQString &str )
|
|
{
|
|
TQString s( str );
|
|
s.replace( TQRegExp( "\\\\" ), "\\\\" );
|
|
s.replace( TQRegExp( "\"" ), "\\\"" );
|
|
s.replace( TQRegExp( "\n" ), "\\n\"\n\"" );
|
|
s.replace( TQRegExp( "\r" ), "\\r" );
|
|
|
|
bool onlyAscii = TRUE;
|
|
unsigned int i;
|
|
for ( i = 0; i < s.length(); i++ ) {
|
|
if ( s.at(i).unicode() >= 0x80 ) {
|
|
onlyAscii = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
if ( onlyAscii )
|
|
s = "\"" + s + "\"";
|
|
else
|
|
s = "TQString.fromUtf8(\"" + s + "\")";
|
|
return s;
|
|
}
|
|
|
|
static TQString mkStdSet( const TQString& prop )
|
|
{
|
|
return TQString( "set" ) + prop[0].upper() + prop.mid(1);
|
|
}
|
|
|
|
|
|
/*!
|
|
\class Uic uic.h
|
|
\brief User Interface Compiler
|
|
|
|
The class Uic encapsulates the user interface compiler (uic).
|
|
*/
|
|
|
|
static TQString className;
|
|
|
|
Uic::Uic( TQTextStream &outStream, TQDomDocument doc, const TQString &trm )
|
|
: out( outStream ), trmacro( trm )
|
|
{
|
|
item_used = cg_used = pal_used = 0;
|
|
|
|
initIndent();
|
|
|
|
layouts << "hbox" << "vbox" << "grid";
|
|
tags = layouts;
|
|
tags << "widget";
|
|
|
|
nameOfClass = getClassName( doc.firstChild().toElement() );
|
|
|
|
TQDomElement firstWidget = doc.firstChild().firstChild().toElement();
|
|
while ( firstWidget.tagName() != "widget" )
|
|
firstWidget = firstWidget.nextSibling().toElement();
|
|
|
|
if ( nameOfClass.isEmpty() )
|
|
nameOfClass = getObjectName( firstWidget );
|
|
|
|
// This is a hack.
|
|
className = nameOfClass;
|
|
|
|
createFormImpl( firstWidget );
|
|
}
|
|
|
|
|
|
/*! Extracts a class name from \a e
|
|
*/
|
|
TQString Uic::getClassName( const TQDomElement& e )
|
|
{
|
|
TQDomElement n;
|
|
TQString cn;
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "class" ) {
|
|
TQString s = n.firstChild().toText().data();
|
|
int i;
|
|
while ( ( i = s.find(' ' )) != -1 )
|
|
s[i] = '_';
|
|
cn = s;
|
|
} else if ( n.tagName() == "pixmapfunction" ) {
|
|
pixmapLoaderFunction = n.firstChild().toText().data();
|
|
}
|
|
}
|
|
return cn;
|
|
}
|
|
|
|
/*! Extracts an object name from \a e. It's stored in the 'name'
|
|
property.
|
|
*/
|
|
TQString Uic::getObjectName( const TQDomElement& e )
|
|
{
|
|
TQDomElement n;
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" && n2.firstChild().toText().data() == "name" ) {
|
|
return n2.nextSibling().toElement().firstChild().toText().data();
|
|
}
|
|
}
|
|
}
|
|
return TQString::null;
|
|
}
|
|
|
|
/*! Extracts an layout name from \a e. It's stored in the 'name'
|
|
property of the preceeding sibling (the first child of a TQLayoutWidget).
|
|
*/
|
|
TQString Uic::getLayoutName( const TQDomElement& e )
|
|
{
|
|
TQDomElement p = e.parentNode().toElement();
|
|
TQString tail = TQString::null;
|
|
|
|
if (getClassName(p) != "TQLayoutWidget")
|
|
tail = "Layout";
|
|
|
|
TQDomElement n;
|
|
for ( n = p.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" && n2.firstChild().toText().data() == "name" ) {
|
|
return n2.nextSibling().toElement().firstChild().toText().data() + tail;
|
|
}
|
|
}
|
|
}
|
|
return e.tagName();
|
|
}
|
|
|
|
TQByteArray unzipXPM( TQString data, ulong& length )
|
|
{
|
|
char *ba = new char[ data.length() / 2 ];
|
|
for ( int i = 0; i < (int)data.length() / 2; ++i ) {
|
|
char h = data[ 2 * i ].latin1();
|
|
char l = data[ 2 * i + 1 ].latin1();
|
|
uchar r = 0;
|
|
if ( h <= '9' )
|
|
r += h - '0';
|
|
else
|
|
r += h - 'a' + 10;
|
|
r = r << 4;
|
|
if ( l <= '9' )
|
|
r += l - '0';
|
|
else
|
|
r += l - 'a' + 10;
|
|
ba[ i ] = r;
|
|
}
|
|
if ( length < data.length() * 5 )
|
|
length = data.length() * 5;
|
|
TQByteArray baunzip( length );
|
|
::uncompress( (uchar*) baunzip.data(), &length, (uchar*) ba, data.length()/2 );
|
|
return baunzip;
|
|
}
|
|
|
|
|
|
/*!
|
|
Creates an implementation ( cpp-file ) for the form given in \a e
|
|
|
|
\sa createFormDecl(), createObjectImpl()
|
|
*/
|
|
void Uic::createFormImpl( const TQDomElement &e )
|
|
{
|
|
TQStringList::Iterator it;
|
|
TQDomElement n;
|
|
TQDomNodeList nl;
|
|
int i;
|
|
TQString objClass = getClassName( e );
|
|
if ( objClass.isEmpty() )
|
|
return;
|
|
TQString objName = getObjectName( e );
|
|
|
|
// Handle custom widgets.
|
|
for (n = e; !n.isNull(); n = n.nextSibling().toElement())
|
|
{
|
|
if (n.tagName() != "customwidgets")
|
|
continue;
|
|
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
|
|
while (!n2.isNull())
|
|
{
|
|
if (n2.tagName() == "customwidget")
|
|
{
|
|
TQDomElement n3 = n2.firstChild().toElement();
|
|
TQString cname, header;
|
|
|
|
while (!n3.isNull())
|
|
{
|
|
if (n3.tagName() == "class")
|
|
cname = n3.firstChild().toText().data();
|
|
else if (n3.tagName() == "header")
|
|
header = n3.firstChild().toText().data();
|
|
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
|
|
if (cname.isEmpty())
|
|
cname = "UnnamedCustomClass";
|
|
|
|
int ext = header.findRev('.');
|
|
|
|
if (ext >= 0)
|
|
header.truncate(ext);
|
|
|
|
if (header.isEmpty())
|
|
header = cname.lower();
|
|
|
|
out << "from " << header << " import " << cname << endl;
|
|
}
|
|
|
|
n2 = n2.nextSibling().toElement();
|
|
}
|
|
}
|
|
|
|
// find out what images are retquired
|
|
TQStringList retquiredImages;
|
|
nl = e.elementsByTagName( "pixmap" );
|
|
for ( int j = 0; j < (int) nl.length(); j++ ) {
|
|
retquiredImages += nl.item(j).firstChild().toText().data();
|
|
}
|
|
|
|
TQStringList images;
|
|
TQStringList xpmImages;
|
|
if ( pixmapLoaderFunction.isEmpty() ) {
|
|
// create images
|
|
for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "images" ) {
|
|
nl = n.elementsByTagName( "image" );
|
|
for ( i = 0; i < (int) nl.length(); i++ ) {
|
|
TQDomElement tmp = nl.item(i).firstChild().toElement();
|
|
TQString img = registerObject( tmp.firstChild().toText().data() );
|
|
if ( !retquiredImages.contains( img ) )
|
|
continue;
|
|
tmp = tmp.nextSibling().toElement();
|
|
TQString format = tmp.attribute("format", "PNG" );
|
|
TQString data = tmp.firstChild().toText().data();
|
|
|
|
out << endl;
|
|
out << endl;
|
|
|
|
if ( format == "XPM.GZ" ) {
|
|
xpmImages += img;
|
|
ulong length = tmp.attribute("length").toULong();
|
|
TQByteArray baunzip = unzipXPM( data, length );
|
|
int a = 0;
|
|
out << indent << img << "_data = [" << endl;
|
|
while ( baunzip[a] != '\"' )
|
|
a++;
|
|
for ( ; a < (int) length; a++ )
|
|
{
|
|
char ch;
|
|
|
|
if ((ch = baunzip[a]) == '}')
|
|
{
|
|
out << endl << "]" << endl;
|
|
break;
|
|
}
|
|
|
|
if (ch == '\"')
|
|
ch = '\'';
|
|
|
|
out << ch;
|
|
}
|
|
} else {
|
|
images += img;
|
|
out << indent << img << "_data = \\" << endl;
|
|
pushIndent();
|
|
out << indent << "'";
|
|
int a ;
|
|
for ( a = 0; a < (int) (data.length()/2)-1; a++ ) {
|
|
out << "\\x" << TQString(data[2*a]) << TQString(data[2*a+1]);
|
|
if ( a % 12 == 11 )
|
|
out << "' \\" << endl << indent << "'";
|
|
}
|
|
out << "\\x" << TQString(data[2*a]) << TQString(data[2*a+1]) << "'" << endl;
|
|
popIndent();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// register the object and unify its name
|
|
objName = registerObject( objName );
|
|
|
|
|
|
// constructor
|
|
|
|
out << endl;
|
|
out << endl;
|
|
out << indent << "class " << nameOfClass << "(" << objClass << "):" << endl;
|
|
pushIndent();
|
|
|
|
if ( objClass == "TQDialog" || objClass == "TQWizard" ) {
|
|
out << indent << "def __init__(self,parent = None,name = None,modal = 0,fl = 0):" << endl;
|
|
pushIndent();
|
|
out << indent << objClass << ".__init__(self,parent,name,modal,fl)" << endl;
|
|
} else if ( objClass == "TQWidget" ) { // standard TQWidget
|
|
out << indent << "def __init__(self,parent = None,name = None,fl = 0):" << endl;
|
|
pushIndent();
|
|
out << indent << objClass << ".__init__(self,parent,name,fl)" << endl;
|
|
} else {
|
|
out << indent << "def __init__(self,parent = None,name = None):" << endl;
|
|
pushIndent();
|
|
out << indent << objClass << ".__init__(self,parent,name)" << endl;
|
|
}
|
|
|
|
out << endl;
|
|
|
|
// create pixmaps for all images
|
|
if ( !images.isEmpty() ) {
|
|
TQStringList::Iterator it;
|
|
for ( it = images.begin(); it != images.end(); ++it ) {
|
|
out << indent << (*it) << " = TQPixmap()" << endl;
|
|
out << indent << (*it) << ".loadFromData(" << (*it) << "_data,'PNG')" << endl;
|
|
}
|
|
|
|
out << endl;
|
|
}
|
|
// create pixmaps for all images
|
|
if ( !xpmImages.isEmpty() ) {
|
|
for ( it = xpmImages.begin(); it != xpmImages.end(); ++it ) {
|
|
out << indent << (*it) << " = TQPixmap(" << (*it) << "_data)" << endl;
|
|
}
|
|
|
|
out << endl;
|
|
}
|
|
|
|
|
|
// set the properties
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
bool stdset = toBool( n.attribute( "stdset" ) );
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString prop = n2.firstChild().toText().data();
|
|
TQString value = setObjectProperty( objClass, TQString::null, prop, n2.nextSibling().toElement(), stdset );
|
|
|
|
if ( value.isEmpty() )
|
|
continue;
|
|
|
|
if ( prop == "name" ) {
|
|
out << indent << "if name == None:" << endl;
|
|
pushIndent();
|
|
}
|
|
|
|
out << indent;
|
|
|
|
if ( prop == "geometry" && n2.nextSibling().toElement().tagName() == "rect") {
|
|
TQDomElement n3 = n2.nextSibling().toElement().firstChild().toElement();
|
|
int w = 0, h = 0;
|
|
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "width" )
|
|
w = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "height" )
|
|
h = n3.firstChild().toText().data().toInt();
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
|
|
out << "self.resize(" << w << "," << h << ")" << endl;
|
|
} else {
|
|
if ( stdset )
|
|
out << "self." << mkStdSet(prop) << "(" << value << ")" << endl;
|
|
else
|
|
out << "self.setProperty('" << prop << "',TQVariant(" << value << "))" << endl;
|
|
}
|
|
|
|
if (prop == "name") {
|
|
popIndent();
|
|
out << endl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// create all children, some forms have special retquirements
|
|
|
|
if ( objClass == "TQWizard" ) {
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( tags.contains( n.tagName() ) ) {
|
|
TQString page = createObjectImpl( n, objClass, "self" );
|
|
TQString label = DomTool::readAttribute( n, "title", "" ).toString();
|
|
out << indent << "self.addPage(" << page << ","<< trmacro << "(" << fixString( label ) << "))" << endl;
|
|
TQVariant def( FALSE, 0 );
|
|
if ( DomTool::hasAttribute( n, "backEnabled" ) )
|
|
out << indent << "self.setBackEnabled(" << page << "," << mkBool( DomTool::readAttribute( n, "backEnabled", def).toBool() ) << ")" << endl;
|
|
if ( DomTool::hasAttribute( n, "nextEnabled" ) )
|
|
out << indent << "self.setNextEnabled(" << page << "," << mkBool( DomTool::readAttribute( n, "nextEnabled", def).toBool() ) << ")" << endl;
|
|
if ( DomTool::hasAttribute( n, "finishEnabled" ) )
|
|
out << indent << "self.setFinishEnabled(" << page << "," << mkBool( DomTool::readAttribute( n, "finishEnabled", def).toBool() ) << ")" << endl;
|
|
if ( DomTool::hasAttribute( n, "helpEnabled" ) )
|
|
out << indent << "self.setHelpEnabled(" << page << "," << mkBool( DomTool::readAttribute( n, "helpEnabled", def).toBool() ) << ")" << endl;
|
|
if ( DomTool::hasAttribute( n, "finish" ) )
|
|
out << indent << "self.setFinish(" << page << "," << mkBool( DomTool::readAttribute( n, "finish", def).toBool() ) << ")" << endl;
|
|
}
|
|
}
|
|
} else { // standard widgets
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( tags.contains( n.tagName() ) )
|
|
createObjectImpl( n, objName, "self" );
|
|
}
|
|
}
|
|
|
|
// Get the list of any user defined slots.
|
|
|
|
TQStringList userSlots;
|
|
|
|
for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "connections" ) {
|
|
for ( TQDomElement n2 = n.firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) {
|
|
if ( n2.tagName() == "slot" ) {
|
|
userSlots += n2.firstChild().toText().data();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for ( n = e; !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "connections" ) {
|
|
// setup signals and slots connections
|
|
out << endl;
|
|
nl = n.elementsByTagName( "connection" );
|
|
for ( i = 0; i < (int) nl.length(); i++ ) {
|
|
TQString sender, receiver, signal, slot;
|
|
for ( TQDomElement n2 = nl.item(i).firstChild().toElement(); !n2.isNull(); n2 = n2.nextSibling().toElement() ) {
|
|
if ( n2.tagName() == "sender" )
|
|
sender = n2.firstChild().toText().data();
|
|
else if ( n2.tagName() == "receiver" )
|
|
receiver = n2.firstChild().toText().data();
|
|
else if ( n2.tagName() == "signal" )
|
|
signal = n2.firstChild().toText().data();
|
|
else if ( n2.tagName() == "slot" )
|
|
slot = n2.firstChild().toText().data();
|
|
}
|
|
if ( sender.isEmpty() || receiver.isEmpty() || signal.isEmpty() || slot.isEmpty() )
|
|
continue;
|
|
|
|
sender = registeredName( sender );
|
|
receiver = registeredName( receiver );
|
|
|
|
// translate formwindow name to "self"
|
|
if ( sender == objName )
|
|
sender = "self";
|
|
else
|
|
sender = "self." + sender;
|
|
if ( receiver == objName )
|
|
receiver = "self";
|
|
else
|
|
receiver = "self." + receiver;
|
|
|
|
// Note that we never use the SLOT() macro in case we have
|
|
// custom widgets implemented in Python.
|
|
out << indent << "self.connect(" << sender
|
|
<< ",SIGNAL('" << signal << "'),self."
|
|
<< slot.left(slot.find('(')) << ")" << endl;
|
|
}
|
|
} else if ( n.tagName() == "tabstops" ) {
|
|
// setup tab order
|
|
out << endl;
|
|
TQString lastName;
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
while ( !n2.isNull() ) {
|
|
if ( n2.tagName() == "tabstop" ) {
|
|
TQString name = n2.firstChild().toText().data();
|
|
name = registeredName( name );
|
|
if ( !lastName.isEmpty() )
|
|
out << indent << "self.setTabOrder(self." << lastName << ",self." << name << ")" << endl;
|
|
lastName = name;
|
|
}
|
|
n2 = n2.nextSibling().toElement();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// buddies
|
|
bool firstBuddy = TRUE;
|
|
for ( TQValueList<Buddy>::Iterator buddy = buddies.begin(); buddy != buddies.end(); ++buddy ) {
|
|
if ( isObjectRegistered( (*buddy).buddy ) ) {
|
|
if ( firstBuddy ) {
|
|
out << endl;
|
|
}
|
|
out << indent << "self." << (*buddy).key << ".setBuddy(self." << registeredName( (*buddy).buddy ) << ")" << endl;
|
|
firstBuddy = FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
// end of constructor
|
|
popIndent();
|
|
|
|
// handle application font changes if retquired
|
|
nl = e.elementsByTagName( "widget" );
|
|
bool needEventHandler = FALSE;
|
|
for ( i = 0; i < (int) nl.length(); i++ ) {
|
|
if ( DomTool::hasProperty( nl.item(i).toElement() , "font" ) ) {
|
|
needEventHandler = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
if ( needEventHandler ) {
|
|
out << endl;
|
|
out << indent << "def event(self,ev):" << endl;
|
|
pushIndent();
|
|
out << indent << "ret = " << objClass << ".event(self,ev)" << endl;
|
|
out << endl;
|
|
out << indent << "if ev.type() == TQEvent.ApplicationFontChange:" << endl;
|
|
pushIndent();
|
|
|
|
for ( i = 0; i < (int) nl.length(); i++ ) {
|
|
n = nl.item(i).toElement();
|
|
if ( DomTool::hasProperty( n, "font" ) )
|
|
createExclusiveProperty( n, "font" );
|
|
}
|
|
|
|
out << endl;
|
|
popIndent();
|
|
out << indent << "return ret" << endl;
|
|
popIndent();
|
|
}
|
|
|
|
|
|
// Generate user defined slot hooks.
|
|
|
|
for (it = userSlots.begin(); it != userSlots.end(); ++it) {
|
|
int astart = (*it).find('(');
|
|
|
|
out << endl;
|
|
out << indent << "def " << (*it).left(astart) << "(self";
|
|
|
|
// We don't reproduce the argument names (if any) because we would have
|
|
// to remove the types - too complicated for the moment, so we just
|
|
// count them and give them names based on their position.
|
|
|
|
TQString args = (*it).mid(astart + 1,(*it).find(')') - astart - 1).stripWhiteSpace();
|
|
|
|
if (!args.isEmpty()) {
|
|
int nrargs = args.contains(',') + 1;
|
|
|
|
for (int i = 0; i < nrargs; ++i)
|
|
out << ",a" << i;
|
|
}
|
|
|
|
out << "):" << endl;
|
|
pushIndent();
|
|
out << indent << "print '" << nameOfClass << "." << *it << ": not implemented yet'" << endl;
|
|
popIndent();
|
|
}
|
|
|
|
popIndent();
|
|
}
|
|
|
|
|
|
/*!
|
|
Creates an implementation for the object given in \a e.
|
|
|
|
Traverses recursively over all children.
|
|
|
|
Returns the name of the generated child object.
|
|
|
|
\sa createObjectDecl()
|
|
*/
|
|
TQString Uic::createObjectImpl( const TQDomElement &e, const TQString& parentClass, const TQString& parent, const TQString& layout )
|
|
{
|
|
|
|
TQDomElement n;
|
|
TQString objClass, objName, fullObjName;
|
|
|
|
if ( layouts.contains( e.tagName() ) )
|
|
return createLayoutImpl( e, parentClass, parent, layout );
|
|
|
|
objClass = getClassName( e );
|
|
if ( objClass.isEmpty() )
|
|
return objName;
|
|
objName = getObjectName( e );
|
|
|
|
TQString definedName = objName;
|
|
bool isTmpObject = objName.isEmpty() || objClass == "TQLayoutWidget";
|
|
if ( isTmpObject ) {
|
|
if ( objClass[0] == 'Q' )
|
|
objName = objClass.mid(1);
|
|
else
|
|
objName = objClass.lower();
|
|
}
|
|
|
|
bool isLine = objClass == "Line";
|
|
if ( isLine )
|
|
objClass = "TQFrame";
|
|
|
|
out << endl;
|
|
if ( objClass == "TQLayoutWidget" ) {
|
|
if ( layout.isEmpty() ) {
|
|
// register the object and unify its name
|
|
objName = registerObject( objName );
|
|
out << indent << objName << " = TQWidget(" << parent << ",'" << definedName << "')" << endl;
|
|
} else {
|
|
// the layout widget is not necessary, hide it by creating its child in the parent
|
|
TQString result;
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if (tags.contains( n.tagName() ) )
|
|
result = createObjectImpl( n, parentClass, parent, layout );
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// Layouts don't go into the class instance dictionary.
|
|
fullObjName = objName;
|
|
} else {
|
|
// register the object and unify its name
|
|
objName = registerObject( objName );
|
|
|
|
// Temporary objects don't go into the class instance dictionary.
|
|
fullObjName = isTmpObject ? objName : "self." + objName;
|
|
|
|
out << indent << fullObjName << " = " << createObjectInstance( objClass, parent, objName ) << endl;
|
|
}
|
|
|
|
lastItem = "None";
|
|
// set the properties and insert items
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
bool stdset = toBool( n.attribute( "stdset" ) );
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString prop = n2.firstChild().toText().data();
|
|
TQString value = setObjectProperty( objClass, objName, prop, n2.nextSibling().toElement(), stdset );
|
|
|
|
if ( value.isEmpty() )
|
|
continue;
|
|
if ( prop == "name" )
|
|
continue;
|
|
if ( prop == "buddy" && value[0] == '\'' && value[(int)value.length()-1] == '\'' ) {
|
|
buddies << Buddy( objName, value.mid(1, value.length() - 2 ) );
|
|
continue;
|
|
}
|
|
if ( isLine && prop == "orientation" ) {
|
|
prop = "frameStyle";
|
|
if ( value.right(10) == "Horizontal" )
|
|
value = "TQFrame.HLine | TQFrame.Sunken";
|
|
else
|
|
value = "TQFrame.VLine | TQFrame.Sunken";
|
|
}
|
|
if ( prop == "buttonGroupId" ) {
|
|
if ( parentClass == "TQButtonGroup" )
|
|
out << indent << parent << ".insert(" << fullObjName << "," << value << ")" << endl;
|
|
continue;
|
|
}
|
|
if ( prop == "geometry") {
|
|
out << indent << fullObjName << ".setGeometry(" << value << ")" << endl;
|
|
} else {
|
|
if ( stdset )
|
|
out << indent << fullObjName << "." << mkStdSet(prop) << "(" << value << ")" << endl;
|
|
else
|
|
out << indent << fullObjName << ".setProperty('" << prop << "',TQVariant(" << value << "))" << endl;
|
|
}
|
|
|
|
}
|
|
} else if ( n.tagName() == "item" ) {
|
|
if ( objClass.mid(1) == "ListBox" ) {
|
|
TQString s = createListBoxItemImpl( n, fullObjName );
|
|
if ( !s.isEmpty() )
|
|
out << indent << s << endl;
|
|
} else if ( objClass.mid(1) == "ComboBox" ) {
|
|
TQString s = createListBoxItemImpl( n, fullObjName );
|
|
if ( !s.isEmpty() )
|
|
out << indent << s << endl;
|
|
} else if ( objClass.mid(1) == "IconView" ) {
|
|
TQString s = createIconViewItemImpl( n, fullObjName );
|
|
if ( !s.isEmpty() )
|
|
out << indent << s << endl;
|
|
} else if ( objClass.mid(1) == "ListView" ) {
|
|
TQString s = createListViewItemImpl( n, fullObjName, TQString::null );
|
|
if ( !s.isEmpty() )
|
|
out << s << endl;
|
|
}
|
|
} else if ( n.tagName() == "column" ) {
|
|
if ( objClass.mid(1) == "ListView" ) {
|
|
TQString s = createListViewColumnImpl( n, fullObjName );
|
|
if ( !s.isEmpty() )
|
|
out << s;
|
|
}
|
|
}
|
|
}
|
|
|
|
// create all children, some widgets have special retquirements
|
|
|
|
if ( objClass == "TQTabWidget" ) {
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( tags.contains( n.tagName() ) ) {
|
|
TQString page = createObjectImpl( n, objClass, fullObjName );
|
|
TQString label = DomTool::readAttribute( n, "title", "" ).toString();
|
|
out << indent << fullObjName << ".insertTab(" << page << "," << trmacro << "(" << fixString( label ) << "))" << endl;
|
|
}
|
|
}
|
|
} else { // standard widgets
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( tags.contains( n.tagName() ) )
|
|
createObjectImpl( n, objClass, fullObjName );
|
|
}
|
|
}
|
|
|
|
return fullObjName;
|
|
}
|
|
|
|
/*!
|
|
Creates implementation of an listbox item tag.
|
|
*/
|
|
|
|
TQString Uic::createListBoxItemImpl( const TQDomElement &e, const TQString &parent )
|
|
{
|
|
TQDomElement n = e.firstChild().toElement();
|
|
TQString txt;
|
|
TQString pix;
|
|
while ( !n.isNull() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString attrib = n2.firstChild().toText().data();
|
|
TQVariant v = DomTool::elementToVariant( n2.nextSibling().toElement(), TQVariant() );
|
|
if ( attrib == "text" )
|
|
txt = v.toString();
|
|
else if ( attrib == "pixmap" ) {
|
|
pix = v.toString();
|
|
if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
|
|
pix.prepend( pixmapLoaderFunction + "(" );
|
|
pix.append( ")" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
|
|
return pix.isEmpty() ?
|
|
parent + ".insertItem(" + trmacro + "(" + fixString( txt ) + "))":
|
|
parent + ".insertItem(" + pix + "," + trmacro + "(" + fixString( txt ) + "))";
|
|
}
|
|
|
|
/*!
|
|
Creates implementation of an iconview item tag.
|
|
*/
|
|
|
|
TQString Uic::createIconViewItemImpl( const TQDomElement &e, const TQString &parent )
|
|
{
|
|
TQDomElement n = e.firstChild().toElement();
|
|
TQString txt;
|
|
TQString pix;
|
|
while ( !n.isNull() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString attrib = n2.firstChild().toText().data();
|
|
TQVariant v = DomTool::elementToVariant( n2.nextSibling().toElement(), TQVariant() );
|
|
if ( attrib == "text" )
|
|
txt = v.toString();
|
|
else if ( attrib == "pixmap" ) {
|
|
pix = v.toString();
|
|
if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
|
|
pix.prepend( pixmapLoaderFunction + "( " );
|
|
pix.append( " )" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
|
|
if ( pix.isEmpty() )
|
|
return "TQIconViewItem(" + parent + "," + trmacro + "(" + fixString( txt ) + "))";
|
|
return "TQIconViewItem(" + parent + "," + trmacro + "(" + fixString( txt ) + ")," + pix + ")";
|
|
|
|
}
|
|
|
|
/*!
|
|
Creates implementation of an listview item tag.
|
|
*/
|
|
|
|
TQString Uic::createListViewItemImpl( const TQDomElement &e, const TQString &parent,
|
|
const TQString &parentItem )
|
|
{
|
|
TQString s;
|
|
|
|
TQDomElement n = e.firstChild().toElement();
|
|
|
|
bool hasChildren = e.elementsByTagName( "item" ).count() > 0;
|
|
TQString item;
|
|
|
|
if ( hasChildren ) {
|
|
item = registerObject( "item" );
|
|
s = indent + item + " = ";
|
|
} else {
|
|
item = "item";
|
|
if ( item_used )
|
|
s = indent + item + " = ";
|
|
else
|
|
s = indent + item + " = ";
|
|
item_used = TRUE;
|
|
}
|
|
|
|
if ( !parentItem.isEmpty() )
|
|
s += "TQListViewItem(" + parentItem + "," + lastItem + ")\n";
|
|
else
|
|
s += "TQListViewItem(" + parent + "," + lastItem + ")\n";
|
|
|
|
TQStringList textes;
|
|
TQStringList pixmaps;
|
|
while ( !n.isNull() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString attrib = n2.firstChild().toText().data();
|
|
TQVariant v = DomTool::elementToVariant( n2.nextSibling().toElement(), TQVariant() );
|
|
if ( attrib == "text" )
|
|
textes << v.toString();
|
|
else if ( attrib == "pixmap" ) {
|
|
TQString pix = v.toString();
|
|
if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
|
|
pix.prepend( pixmapLoaderFunction + "( " );
|
|
pix.append( " )" );
|
|
}
|
|
pixmaps << pix;
|
|
}
|
|
}
|
|
} else if ( n.tagName() == "item" ) {
|
|
s += indent + item + ".setOpen(1)\n";
|
|
s += createListViewItemImpl( n, parent, item );
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
|
|
for ( int i = 0; i < (int)textes.count(); ++i ) {
|
|
if ( !textes[ i ].isEmpty() )
|
|
s += indent + item + ".setText(" + TQString::number( i ) + "," + trmacro + "(" + fixString( textes[ i ] ) + "))\n";
|
|
if ( !pixmaps[ i ].isEmpty() )
|
|
s += indent + item + ".setPixmap(" + TQString::number( i ) + "," + pixmaps[ i ] + ")\n";
|
|
}
|
|
|
|
lastItem = item;
|
|
return s;
|
|
}
|
|
|
|
/*!
|
|
Creates implementation of an listview column tag.
|
|
*/
|
|
|
|
TQString Uic::createListViewColumnImpl( const TQDomElement &e, const TQString &parent )
|
|
{
|
|
TQDomElement n = e.firstChild().toElement();
|
|
TQString txt;
|
|
TQString pix;
|
|
bool clickable = FALSE, resizeable = FALSE;
|
|
while ( !n.isNull() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString attrib = n2.firstChild().toText().data();
|
|
TQVariant v = DomTool::elementToVariant( n2.nextSibling().toElement(), TQVariant() );
|
|
if ( attrib == "text" )
|
|
txt = v.toString();
|
|
else if ( attrib == "pixmap" ) {
|
|
pix = v.toString();
|
|
if ( !pix.isEmpty() && !pixmapLoaderFunction.isEmpty() ) {
|
|
pix.prepend( pixmapLoaderFunction + "( " );
|
|
pix.append( " )" );
|
|
}
|
|
} else if ( attrib == "clickable" )
|
|
clickable = v.toBool();
|
|
else if ( attrib == "resizeable" )
|
|
resizeable = v.toBool();
|
|
}
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
|
|
TQString s;
|
|
s = indent + parent + ".addColumn(" + trmacro + "(" + fixString( txt ) + "))\n";
|
|
if ( !pix.isEmpty() )
|
|
s += indent + parent + ".header().setLabel(" + parent + ".header().count() - 1," + pix + "," + trmacro + "(" + fixString( txt ) + "))\n";
|
|
if ( !clickable )
|
|
s += indent + parent + ".header().setClickEnabled(0," + parent + ".header().count() - 1)\n";
|
|
if ( !resizeable )
|
|
s += indent + parent + ".header().setResizeEnabled(0," + parent + ".header().count() - 1)\n";
|
|
|
|
return s;
|
|
}
|
|
|
|
/*!
|
|
Creates the implementation of a layout tag. Called from createObjectImpl().
|
|
*/
|
|
TQString Uic::createLayoutImpl( const TQDomElement &e, const TQString& parentClass, const TQString& parent, const TQString& layout )
|
|
{
|
|
TQDomElement n;
|
|
TQString objClass, objName;
|
|
objClass = e.tagName();
|
|
|
|
TQString qlayout = "TQVBoxLayout";
|
|
if ( objClass == "hbox" )
|
|
qlayout = "TQHBoxLayout";
|
|
else if ( objClass == "grid" )
|
|
qlayout = "TQGridLayout";
|
|
|
|
bool isGrid = e.tagName() == "grid" ;
|
|
objName = registerObject( getLayoutName( e ) );
|
|
layoutObjects += objName;
|
|
int margin = DomTool::readProperty( e, "margin", BOXLAYOUT_DEFAULT_MARGIN ).toInt();
|
|
int spacing = DomTool::readProperty( e, "spacing", BOXLAYOUT_DEFAULT_SPACING ).toInt();
|
|
|
|
if ( (parentClass == "TQGroupBox" || parentClass == "TQButtonGroup") && layout.isEmpty() ) {
|
|
// special case for group box
|
|
out << indent << parent << ".setColumnLayout(0,TQt.Vertical)" << endl;
|
|
out << indent << parent << ".layout().setSpacing(0)" << endl;
|
|
out << indent << parent << ".layout().setMargin(0)" << endl;
|
|
out << indent << objName << " = " << qlayout << "(" << parent << ".layout())" << endl;
|
|
out << indent << objName << ".setAlignment(TQt.AlignTop)" << endl;
|
|
} else {
|
|
if ( layout.isEmpty() )
|
|
out << indent << objName << " = " << qlayout << "(" << parent << ")" << endl;
|
|
else
|
|
out << indent << objName << " = " << qlayout << "()" << endl;
|
|
}
|
|
|
|
out << indent << objName << ".setSpacing(" << spacing << ")" << endl;
|
|
out << indent << objName << ".setMargin(" << margin << ")" << endl;
|
|
|
|
if ( !isGrid ) {
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "spacer" ) {
|
|
TQString child = createSpacerImpl( n, parentClass, parent, objName );
|
|
out << indent << objName << ".addItem(" << child << ")" << endl;
|
|
} else if ( tags.contains( n.tagName() ) ) {
|
|
TQString child = createObjectImpl( n, parentClass, parent, objName );
|
|
if ( isLayout( child ) )
|
|
out << indent << objName << ".addLayout(" << child << ")" << endl;
|
|
else
|
|
out << indent << objName << ".addWidget(" << child << ")" << endl;
|
|
}
|
|
}
|
|
} else {
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
TQDomElement ae = n;
|
|
int row = ae.attribute( "row" ).toInt();
|
|
int col = ae.attribute( "column" ).toInt();
|
|
int rowspan = ae.attribute( "rowspan" ).toInt();
|
|
int colspan = ae.attribute( "colspan" ).toInt();
|
|
if ( rowspan < 1 )
|
|
rowspan = 1;
|
|
if ( colspan < 1 )
|
|
colspan = 1;
|
|
if ( n.tagName() == "spacer" ) {
|
|
TQString child = createSpacerImpl( n, parentClass, parent, objName );
|
|
if ( rowspan * colspan != 1 )
|
|
out << indent << objName << ".addMultiCell(" << child << ","
|
|
<< row << "," << row + rowspan - 1 << "," << col << ","
|
|
<< col + colspan - 1 << ")" << endl;
|
|
else
|
|
out << indent << objName << ".addItem(" << child << ","
|
|
<< row << "," << col << ")" << endl;
|
|
} else if ( tags.contains( n.tagName() ) ) {
|
|
TQString child = createObjectImpl( n, parentClass, parent, objName );
|
|
out << endl;
|
|
TQString o = "Widget";
|
|
if ( isLayout( child ) )
|
|
o = "Layout";
|
|
if ( rowspan * colspan != 1 )
|
|
out << indent << objName << ".addMultiCell" << o << "(" << child << ","
|
|
<< row << "," << row + rowspan - 1 << "," << col << "," << col + colspan - 1 << ")" << endl;
|
|
else
|
|
out << indent << objName << ".add" << o << "(" << child << ","
|
|
<< row << "," << col << ")" << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
return objName;
|
|
}
|
|
|
|
|
|
|
|
TQString Uic::createSpacerImpl( const TQDomElement &e, const TQString& /*parentClass*/, const TQString& /*parent*/, const TQString& /*layout*/)
|
|
{
|
|
TQDomElement n;
|
|
TQString objClass, objName;
|
|
objClass = e.tagName();
|
|
objName = registerObject( "spacer" );
|
|
|
|
TQSize size = DomTool::readProperty( e, "sizeHint", TQSize(0,0) ).toSize();
|
|
TQString sizeType = DomTool::readProperty( e, "sizeType", "Expanding" ).toString();
|
|
bool isVspacer = DomTool::readProperty( e, "orientation", "Horizontal" ) == "Vertical";
|
|
|
|
if ( sizeType != "Expanding" && sizeType != "MinimumExpanding" &&
|
|
DomTool::hasProperty( e, "geometry" ) ) { // compatibility TQt 2.2
|
|
TQRect geom = DomTool::readProperty( e, "geometry", TQRect(0,0,0,0) ).toRect();
|
|
size = geom.size();
|
|
}
|
|
|
|
if ( isVspacer )
|
|
out << indent << objName << " = TQSpacerItem("
|
|
<< size.width() << "," << size.height()
|
|
<< ",TQSizePolicy.Minimum,TQSizePolicy." << sizeType << ")" << endl;
|
|
else
|
|
out << indent << objName << " = TQSpacerItem("
|
|
<< size.width() << "," << size.height()
|
|
<< ",TQSizePolicy." << sizeType << ",TQSizePolicy.Minimum)" << endl;
|
|
|
|
return objName;
|
|
}
|
|
|
|
/*!
|
|
Creates a set-call for property \a exclusiveProp of the object
|
|
given in \a e.
|
|
|
|
If the object does not have this property, the function does nothing.
|
|
|
|
Exclusive properties are used to generate the implementation of
|
|
application font or palette change handlers in createFormImpl().
|
|
|
|
*/
|
|
void Uic::createExclusiveProperty( const TQDomElement & e, const TQString& exclusiveProp )
|
|
{
|
|
TQDomElement n;
|
|
TQString objClass = getClassName( e );
|
|
if ( objClass.isEmpty() )
|
|
return;
|
|
TQString objName = getObjectName( e );
|
|
if ( objClass.isEmpty() )
|
|
return;
|
|
for ( n = e.firstChild().toElement(); !n.isNull(); n = n.nextSibling().toElement() ) {
|
|
if ( n.tagName() == "property" ) {
|
|
bool stdset = toBool( n.attribute( "stdset" ) );
|
|
TQDomElement n2 = n.firstChild().toElement();
|
|
if ( n2.tagName() == "name" ) {
|
|
TQString prop = n2.firstChild().toText().data();
|
|
if ( prop != exclusiveProp )
|
|
continue;
|
|
TQString value = setObjectProperty( objClass, objName, prop, n2.nextSibling().toElement(), stdset );
|
|
if ( value.isEmpty() )
|
|
continue;
|
|
out << indent << objName << ".setProperty('" << prop << "',TQVariant(" << value << "))" << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
const char* const ColorRole[] = {
|
|
"Foreground", "Button", "Light", "Midlight", "Dark", "Mid",
|
|
"Text", "BrightText", "ButtonText", "Base", "Background", "Shadow",
|
|
"Highlight", "HighlightedText", 0
|
|
};
|
|
|
|
|
|
/*!
|
|
Attention: this function has to be in sync with Resource::setWidgetProperty(). If you change one, change both.
|
|
*/
|
|
TQString Uic::setObjectProperty( const TQString& objClass, const TQString& obj, const TQString &prop, const TQDomElement &e, bool stdset )
|
|
{
|
|
TQString v;
|
|
if ( e.tagName() == "rect" ) {
|
|
TQDomElement n3 = e.firstChild().toElement();
|
|
int x = 0, y = 0, w = 0, h = 0;
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "x" )
|
|
x = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "y" )
|
|
y = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "width" )
|
|
w = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "height" )
|
|
h = n3.firstChild().toText().data().toInt();
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
v = "TQRect(%1,%2,%3,%4)";
|
|
v = v.arg(x).arg(y).arg(w).arg(h);
|
|
|
|
} else if ( e.tagName() == "point" ) {
|
|
TQDomElement n3 = e.firstChild().toElement();
|
|
int x = 0, y = 0;
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "x" )
|
|
x = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "y" )
|
|
y = n3.firstChild().toText().data().toInt();
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
v = "TQPoint(%1,%2)";
|
|
v = v.arg(x).arg(y);
|
|
} else if ( e.tagName() == "size" ) {
|
|
TQDomElement n3 = e.firstChild().toElement();
|
|
int w = 0, h = 0;
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "width" )
|
|
w = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "height" )
|
|
h = n3.firstChild().toText().data().toInt();
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
v = "TQSize(%1,%2)";
|
|
v = v.arg(w).arg(h);
|
|
} else if ( e.tagName() == "color" ) {
|
|
TQDomElement n3 = e.firstChild().toElement();
|
|
int r= 0, g = 0, b = 0;
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "red" )
|
|
r = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "green" )
|
|
g = n3.firstChild().toText().data().toInt();
|
|
else if ( n3.tagName() == "blue" )
|
|
b = n3.firstChild().toText().data().toInt();
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
v = "TQColor(%1,%2,%3)";
|
|
v = v.arg(r).arg(g).arg(b);
|
|
} else if ( e.tagName() == "font" ) {
|
|
TQDomElement n3 = e.firstChild().toElement();
|
|
TQString fontname = "f";
|
|
if ( !obj.isEmpty() ) {
|
|
fontname = obj + "_font";
|
|
out << indent << fontname << " = TQFont(self." << obj << ".font())" << endl;
|
|
} else {
|
|
out << indent << fontname << " = TQFont(self.font())" << endl;
|
|
}
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "family" )
|
|
out << indent << fontname << ".setFamily('" << n3.firstChild().toText().data() << "')" << endl;
|
|
else if ( n3.tagName() == "pointsize" )
|
|
out << indent << fontname << ".setPointSize(" << n3.firstChild().toText().data() << ")" << endl;
|
|
else if ( n3.tagName() == "bold" )
|
|
out << indent << fontname << ".setBold(" << mkBool( n3.firstChild().toText().data() ) << ")" << endl;
|
|
else if ( n3.tagName() == "italic" )
|
|
out << indent << fontname << ".setItalic(" << mkBool( n3.firstChild().toText().data() ) << ")" << endl;
|
|
else if ( n3.tagName() == "underline" )
|
|
out << indent << fontname << ".setUnderline(" << mkBool( n3.firstChild().toText().data() ) << ")" << endl;
|
|
else if ( n3.tagName() == "strikeout" )
|
|
out << indent << fontname << ".setStrikeOut(" << mkBool( n3.firstChild().toText().data() ) << ")" << endl;
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
|
|
if ( prop == "font" ) {
|
|
if ( !obj.isEmpty() )
|
|
out << indent << "self." << obj << ".setFont(" << fontname << ")" << endl;
|
|
else
|
|
out << indent << "self.setFont(" << fontname << ")" << endl;
|
|
} else {
|
|
v = fontname;
|
|
}
|
|
} else if ( e.tagName() == "string" ) {
|
|
if ( prop == "toolTip" ) {
|
|
if ( !obj.isEmpty() )
|
|
out << indent << "TQToolTip.add(self." << obj << "," + trmacro + "(" << fixString( e.firstChild().toText().data() ) << "))" << endl;
|
|
else
|
|
out << indent << "TQToolTip.add(self," + trmacro + "(" << fixString( e.firstChild().toText().data() ) << "))" << endl;
|
|
} else if ( prop == "whatsThis" ) {
|
|
if ( !obj.isEmpty() )
|
|
out << indent << "TQWhatsThis.add(self." << obj << "," << trmacro << "(" << fixString( e.firstChild().toText().data() ) << "))" << endl;
|
|
else
|
|
out << indent << "TQWhatsThis.add(self," << trmacro << "(" << fixString( e.firstChild().toText().data() ) << "))" << endl;
|
|
} else {
|
|
v = trmacro + "(%1)";
|
|
v = v.arg( fixString( e.firstChild().toText().data() ) );
|
|
}
|
|
} else if ( e.tagName() == "cstring" ) {
|
|
v = "'%1'";
|
|
v = v.arg( e.firstChild().toText().data() );
|
|
} else if ( e.tagName() == "number" ) {
|
|
v = "%1";
|
|
v = v.arg( e.firstChild().toText().data() );
|
|
} else if ( e.tagName() == "bool" ) {
|
|
if ( stdset )
|
|
v = "%1";
|
|
else
|
|
v = "%1,0";
|
|
v = v.arg( mkBool( e.firstChild().toText().data() ) );
|
|
} else if ( e.tagName() == "pixmap" ) {
|
|
v = e.firstChild().toText().data();
|
|
if ( !pixmapLoaderFunction.isEmpty() ) {
|
|
v.prepend( pixmapLoaderFunction + "( " );
|
|
v.append( " )" );
|
|
}
|
|
} else if ( e.tagName() == "iconset" ) {
|
|
v = "TQIconSet(%1)";
|
|
v = v.arg( e.firstChild().toText().data() );
|
|
} else if ( e.tagName() == "image" ) {
|
|
v = e.firstChild().toText().data() + ".convertToImage()";
|
|
} else if ( e.tagName() == "enum" ) {
|
|
v = "%1.%2";
|
|
TQString oc = objClass;
|
|
TQString ev = e.firstChild().toText().data();
|
|
if ( oc == "TQListView" && ev == "Manual" ) // #### workaround, rename TQListView::Manual of WithMode enum in 3.0
|
|
oc = "TQScrollView";
|
|
v = v.arg( oc ).arg( ev );
|
|
} else if ( e.tagName() == "set" ) {
|
|
TQString keys( e.firstChild().toText().data() );
|
|
TQStringList lst = TQStringList::split( '|', keys );
|
|
v = "";
|
|
for ( TQStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
|
|
v += objClass + "." + *it;
|
|
if ( it != lst.fromLast() )
|
|
v += " | ";
|
|
}
|
|
} else if ( e.tagName() == "sizepolicy" ) {
|
|
TQDomElement n3 = e.firstChild().toElement();
|
|
TQSizePolicy sp;
|
|
while ( !n3.isNull() ) {
|
|
if ( n3.tagName() == "hsizetype" )
|
|
sp.setHorData( (TQSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
|
|
else if ( n3.tagName() == "vsizetype" )
|
|
sp.setVerData( (TQSizePolicy::SizeType)n3.firstChild().toText().data().toInt() );
|
|
n3 = n3.nextSibling().toElement();
|
|
}
|
|
TQString tmp;
|
|
if ( !obj.isEmpty() )
|
|
tmp = "self." + obj;
|
|
else
|
|
tmp = "self";
|
|
v = "TQSizePolicy(%1,%2," + tmp + ".sizePolicy().hasHeightForWidth())";
|
|
v = v.arg( (int)sp.horData() ).arg( (int)sp.verData() );
|
|
} else if ( e.tagName() == "palette" ) {
|
|
TQPalette pal;
|
|
bool no_pixmaps = e.elementsByTagName( "pixmap" ).count() == 0;
|
|
TQDomElement n;
|
|
if ( no_pixmaps ) {
|
|
n = e.firstChild().toElement();
|
|
while ( !n.isNull() ) {
|
|
TQColorGroup cg;
|
|
if ( n.tagName() == "active" ) {
|
|
cg = loadColorGroup( n );
|
|
pal.setActive( cg );
|
|
} else if ( n.tagName() == "inactive" ) {
|
|
cg = loadColorGroup( n );
|
|
pal.setInactive( cg );
|
|
} else if ( n.tagName() == "disabled" ) {
|
|
cg = loadColorGroup( n );
|
|
pal.setDisabled( cg );
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
}
|
|
if ( no_pixmaps && pal == TQPalette( pal.active().button(), pal.active().background() ) ) {
|
|
v = "TQPalette(TQColor(%1,%2,%3),TQColor(%1,%2,%3))";
|
|
v = v.arg( pal.active().button().red() ).arg( pal.active().button().green() ).arg( pal.active().button().blue() );
|
|
v = v.arg( pal.active().background().red() ).arg( pal.active().background().green() ).arg( pal.active().background().blue() );
|
|
} else {
|
|
TQString palette = "pal";
|
|
if ( !pal_used ) {
|
|
out << indent << palette << " = TQPalette()" << endl;
|
|
pal_used = TRUE;
|
|
}
|
|
TQString cg = "cg";
|
|
if ( !cg_used ) {
|
|
out << indent << cg << " = TQColorGroup()" << endl;
|
|
cg_used = TRUE;
|
|
}
|
|
n = e.firstChild().toElement();
|
|
while ( !n.isNull() && n.tagName() != "active")
|
|
n = n.nextSibling().toElement();
|
|
createColorGroupImpl( cg, n );
|
|
out << indent << palette << ".setActive(" << cg << ")" << endl;
|
|
|
|
n = e.firstChild().toElement();
|
|
while ( !n.isNull() && n.tagName() != "inactive")
|
|
n = n.nextSibling().toElement();
|
|
createColorGroupImpl( cg, n );
|
|
out << indent << palette << ".setInactive(" << cg << ")" << endl;
|
|
|
|
n = e.firstChild().toElement();
|
|
while ( !n.isNull() && n.tagName() != "disabled")
|
|
n = n.nextSibling().toElement();
|
|
createColorGroupImpl( cg, n );
|
|
out << indent << palette << ".setDisabled(" << cg << ")" << endl;
|
|
v = palette;
|
|
}
|
|
} else if ( e.tagName() == "cursor" ) {
|
|
v = "TQCursor(%1)";
|
|
v = v.arg( e.firstChild().toText().data() );
|
|
}
|
|
return v;
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
Creates a colorgroup with name \a name from the color group \a cg
|
|
*/
|
|
void Uic::createColorGroupImpl( const TQString& name, const TQDomElement& e )
|
|
{
|
|
TQColorGroup cg;
|
|
int r = -1;
|
|
TQDomElement n = e.firstChild().toElement();
|
|
TQString color;
|
|
while ( !n.isNull() ) {
|
|
if ( n.tagName() == "color" ) {
|
|
r++;
|
|
TQColor col = DomTool::readColor( n );
|
|
color = "TQColor(%1,%2,%3)";
|
|
color = color.arg( col.red() ).arg( col.green() ).arg( col.blue() );
|
|
if ( col == white )
|
|
color = "TQt.white";
|
|
else if ( col == black )
|
|
color = "TQt.black";
|
|
if ( n.nextSibling().toElement().tagName() != "pixmap" ) {
|
|
out << indent << name << ".setColor(TQColorGroup." << ColorRole[r] << "," << color << ")" << endl;
|
|
}
|
|
} else if ( n.tagName() == "pixmap" ) {
|
|
TQString pixmap = n.firstChild().toText().data();
|
|
if ( !pixmapLoaderFunction.isEmpty() ) {
|
|
pixmap.prepend( pixmapLoaderFunction + "(" );
|
|
pixmap.append( ")" );
|
|
}
|
|
out << indent << name << ".setBrush(TQColorGroup."
|
|
<< ColorRole[r] << ",TQBrush(" << color << "," << pixmap << "))" << endl;
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
}
|
|
|
|
/*!
|
|
Auxiliary function to load a color group. The colorgroup must not
|
|
contain pixmaps.
|
|
*/
|
|
TQColorGroup Uic::loadColorGroup( const TQDomElement &e )
|
|
{
|
|
TQColorGroup cg;
|
|
int r = -1;
|
|
TQDomElement n = e.firstChild().toElement();
|
|
TQColor col;
|
|
while ( !n.isNull() ) {
|
|
if ( n.tagName() == "color" ) {
|
|
r++;
|
|
cg.setColor( (TQColorGroup::ColorRole)r, (col = DomTool::readColor( n ) ) );
|
|
}
|
|
n = n.nextSibling().toElement();
|
|
}
|
|
return cg;
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
Registers an object with name \a name.
|
|
|
|
The returned name is a valid variable identifier, as similar to \a
|
|
name as possible and guaranteed to be unique within the form.
|
|
|
|
\sa registeredName(), isObjectRegistered()
|
|
*/
|
|
TQString Uic::registerObject( const TQString& name )
|
|
{
|
|
if ( objectNames.isEmpty() ) {
|
|
// some temporary variables we need
|
|
objectNames += "img";
|
|
objectNames += "item";
|
|
objectNames += "cg";
|
|
objectNames += "pal";
|
|
}
|
|
|
|
TQString result = name;
|
|
int i;
|
|
while ( ( i = result.find(' ' )) != -1 ) {
|
|
result[i] = '_';
|
|
}
|
|
|
|
if ( objectNames.contains( result ) ) {
|
|
int i = 2;
|
|
while ( objectNames.contains( result + "_" + TQString::number(i) ) )
|
|
i++;
|
|
result += "_";
|
|
result += TQString::number(i);
|
|
}
|
|
objectNames += result;
|
|
objectMapper.insert( name, result );
|
|
return result;
|
|
}
|
|
|
|
/*!
|
|
Returns the registered name for the original name \a name
|
|
or \a name if \a name wasn't registered.
|
|
|
|
\sa registerObject(), isObjectRegistered()
|
|
*/
|
|
TQString Uic::registeredName( const TQString& name )
|
|
{
|
|
if ( !objectMapper.contains( name ) )
|
|
return name;
|
|
return objectMapper[name];
|
|
}
|
|
|
|
/*!
|
|
Returns whether the object \a name was registered yet or not.
|
|
*/
|
|
bool Uic::isObjectRegistered( const TQString& name )
|
|
{
|
|
return objectMapper.contains( name );
|
|
}
|
|
|
|
|
|
/*!
|
|
Unifies the entries in stringlist \a list. Should really be a TQStringList feature.
|
|
*/
|
|
TQStringList Uic::unique( const TQStringList& list )
|
|
{
|
|
TQStringList result;
|
|
if (list.isEmpty() )
|
|
return result;
|
|
TQStringList l = list;
|
|
l.sort();
|
|
result += l.first();
|
|
for ( TQStringList::Iterator it = l.begin(); it != l.end(); ++it ) {
|
|
if ( *it != result.last() )
|
|
result += *it;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
Creates an instance of class \a objClass, with parent \a parent and name \a objName
|
|
*/
|
|
TQString Uic::createObjectInstance( const TQString& objClass, const TQString& parent, const TQString& objName )
|
|
{
|
|
|
|
if ( objClass.mid(1) == "ComboBox" ) {
|
|
return objClass + "(0," + parent + ",'" + objName + "')";
|
|
}
|
|
return objClass + "(" + parent + ",'" + objName + "')";
|
|
}
|
|
|
|
bool Uic::isLayout( const TQString& name ) const
|
|
{
|
|
return layoutObjects.contains( name );
|
|
}
|
|
|
|
|
|
#if defined(BLACKADDER)
|
|
#include "ba.h"
|
|
|
|
int BA::compilePython(const TQString &fileName,const TQString &outputFile,
|
|
const TQString &trmacro,bool execCode)
|
|
{
|
|
#else
|
|
int main( int argc, char * argv[] )
|
|
{
|
|
const char *error = 0;
|
|
TQString fileName;
|
|
TQString outputFile;
|
|
TQString trmacro;
|
|
bool execCode = FALSE;
|
|
|
|
for ( int n = 1; n < argc && error == 0; n++ ) {
|
|
TQCString arg = argv[n];
|
|
if ( arg[0] == '-' ) { // option
|
|
TQCString opt = &arg[1];
|
|
if ( opt[0] == 'o' ) { // output redirection
|
|
if ( opt[1] == '\0' ) {
|
|
if ( !(n < argc-1) ) {
|
|
error = "Missing output-file name";
|
|
break;
|
|
}
|
|
outputFile = argv[++n];
|
|
} else
|
|
outputFile = &opt[1];
|
|
} else if ( opt == "tr" ) {
|
|
if ( opt == "tr" || opt[1] == '\0' ) {
|
|
if ( !(n < argc-1) ) {
|
|
error = "Missing tr macro.";
|
|
break;
|
|
}
|
|
trmacro = argv[++n];
|
|
} else {
|
|
trmacro = &opt[1];
|
|
}
|
|
} else if ( opt == "x" ) {
|
|
execCode = TRUE;
|
|
}
|
|
} else {
|
|
if (!fileName.isEmpty()) // can handle only one file
|
|
error = "Too many input files specified";
|
|
else
|
|
fileName = argv[n];
|
|
}
|
|
}
|
|
|
|
if ( argc < 2 || error || fileName.isEmpty() ) {
|
|
fprintf( stderr, "PyTQt user interface compiler\n" );
|
|
if ( error )
|
|
fprintf( stderr, "pyuic: %s\n", error );
|
|
|
|
fprintf( stderr, "Usage: %s [options] <uifile>\n"
|
|
"\nGenerate PyTQt implementation:\n"
|
|
" %s [options] <uifile>\n"
|
|
"Options:\n"
|
|
"\t-o file Write output to file rather than stdout\n"
|
|
"\t-tr func Use func(...) rather than tr(...) for i18n\n"
|
|
"\t-x Generate extra code to test the class\n"
|
|
, argv[0], argv[0]);
|
|
exit( 1 );
|
|
}
|
|
#endif
|
|
|
|
TQFile file( fileName );
|
|
if ( !file.open( IO_ReadOnly ) )
|
|
qFatal( "pyuic: Could not open file '%s' ", (const char *)fileName );
|
|
|
|
TQFile fileOut;
|
|
if (!outputFile.isEmpty()) {
|
|
fileOut.setName( outputFile );
|
|
if (!fileOut.open( IO_WriteOnly ) )
|
|
qFatal( "pyuic: Could not open output file '%s'", (const char *)outputFile );
|
|
} else {
|
|
fileOut.open( IO_WriteOnly, stdout );
|
|
}
|
|
TQTextStream out( &fileOut );
|
|
out.setEncoding( TQTextStream::UnicodeUTF8 );
|
|
|
|
TQDomDocument doc;
|
|
if ( !doc.setContent( &file ) )
|
|
qFatal( "pyuic: Failed to parse %s\n", (const char *)fileName );
|
|
|
|
out << "# Form implementation generated from reading ui file '" << fileName << "'" << endl;
|
|
out << "#" << endl;
|
|
out << "# Created: " << TQDateTime::currentDateTime().toString() << endl;
|
|
out << "# by: The Python User Interface Compiler (pyuic) " << PYQT_VERSION << endl;
|
|
out << "#" << endl;
|
|
out << "# WARNING! All changes made in this file will be lost!" << endl;
|
|
out << endl;
|
|
out << endl;
|
|
|
|
if (execCode)
|
|
out << "import sys" << endl;
|
|
|
|
out << "from qt import *" << endl;
|
|
|
|
Uic( out, doc, trmacro.isEmpty() ? TQString("self.tr") : trmacro );
|
|
|
|
if (execCode) {
|
|
out << endl;
|
|
out << endl;
|
|
out << "if __name__ == '__main__':" << endl;
|
|
out << " a = TQApplication(sys.argv)" << endl;
|
|
out << " TQObject.connect(a,SIGNAL('lastWindowClosed()'),a,SLOT('quit()'))" << endl;
|
|
out << " w = " << className << "()" << endl;
|
|
out << " a.setMainWidget(w)" << endl;
|
|
out << " w.show()" << endl;
|
|
out << " a.exec_loop()" << endl;
|
|
}
|
|
|
|
return 0;
|
|
}
|