Portál AbcLinuxu, 3. června 2024 23:22

Převod LibGlade.xml na GtkBuilder.xml

14.12.2012 21:07 | Přečteno: 957× | Python | Výběrový blog | poslední úprava: 15.12.2012 11:36

Stručný návod pro převod LibGlade.xml na GtkBuilder.xml, který nemusí pokrývat vše co se může při konverzi pokazit.

Glade 3.8.x umí pracovat s LibGlade i GtkBuilder, je určen pro GTK+2. Naproti tomu novější verze jsou určené pouze pro GTK+3. Debian Wheezy bohužel obsahuje pouze verzi pro GTK+3, Bug #638478: allow installing both glade 3.8 and 3.10.

Nejprve si otevřeme LibGlade.xml v Glade 3.8.x, poté uložíme projekt jako GtkBuilder.xml a při ukládání nezapomeneme přepnout radiobutton na GtkBuilder.

U všech widgetů, které využívají property "adjustment", ztratíme toto nastavení. Můžeme to napravit zavoláním následujícího skriptu, kterému se předají dva argumenty reprezentující dva výše uvedené XML soubory. Z LibGlade.xml se načte property "adjustment" jednotlivých witgetů, přidá se k odpovídajícím widgetům z GtkBuilder.xml a výsledek se vypíše na stdout.

$ ./g2b_gtkscale.py LibGlade.xml GtkBuilder.xml >output.xml

#! /usr/bin/env python2.7
# -*- coding: utf-8 -*-

import sys
from lxml import etree

class G2B_GtkScale:
    def __init__(self, lib_glade_xml, gtk_builder_xml):
        lib_glade_doc = etree.parse(lib_glade_xml)
        self.lib_glade_root = lib_glade_doc.getroot()

        parser = etree.XMLParser(remove_blank_text=True)
        gtk_builder_doc = etree.parse(gtk_builder_xml, parser)
        self.gtk_builder_root = gtk_builder_doc.getroot()

        # LibGlade
        # <widget class="GtkHScale" id="NAME">
        #   <property name="adjustment">-255 -255 255 1 0 0</property>
        # </widget>

        # GtkBuilder
        # <widget class="GtkHScale" id="NAME">
        #   <property name="adjustment">NAME_ADJ</property>
        # </widget>

        lib_glade_elts = self.get_elements(lib_glade_doc, "widget")
        gtk_builder_elts = self.get_elements(gtk_builder_doc, "object")

        for key in lib_glade_elts.keys():
            adjs = lib_glade_elts[key].text.split()
            prop_adj = gtk_builder_elts[key]
            self.glade2builder(key, adjs, prop_adj)

        print etree.tostring(self.gtk_builder_root, pretty_print=True, \
            xml_declaration=True, encoding="UTF-8")

    def get_elements(self, doc, name):
        result = {}

        elements = doc.findall(".//%s" % name)
        for element in elements:
            eclass = element.get("class")
            eid = element.get("id")

            if (eclass in ["GtkHScale", "GtkVScale", "GtkSpinButton"]):
                for subelt in element.findall("property"):
                    name = subelt.get("name")
                    if (name == "adjustment"):
                        result[eid] = subelt

        return result

    def glade2builder(self, eid, adjs, prop_adj):
        # <object class="GtkAdjustment" id="NAME_ADJ">
        #   <property name="lower">0</property>
        #   <property name="upper">100</property>
        #   <property name="step_increment">1</property>
        #   <property name="page_increment">10</property>
        # </object>

        oid = "%s_ADJ" % eid
        elt_adj = etree.SubElement(self.gtk_builder_root, "object")
        elt_adj.set("class", "GtkAdjustment")
        elt_adj.set("id", oid)

        #value, lower, upper, step_inc, page_inc, page_size = adjs
        props = ["lower", "upper", "step_increment", "page_increment"]

        idx = 1
        for prop in props:
            elt_prop = etree.SubElement(elt_adj, "property")
            elt_prop.set("name", prop)
            elt_prop.text = adjs[idx]
            idx += 1

        prop_adj.text = oid
        #print etree.tostring(elt_adj, pretty_print=True)

def main():
    if (len(sys.argv) != 3):
        print "Usage: %s LibGlade.xml GtkBuilder.xml" % sys.argv[0]
        sys.exit()

    G2B_GtkScale(sys.argv[1], sys.argv[2])

if __name__ == '__main__':
    main()

Podrobněji jsem se tím nezabýval, soustředil jsem se pouze na převod svých projektů. Třeba to bude užitěčné i někomu dalšímu. Pokud máte nějakou připomínku, nápad či dotaz, na toto téma, pište do diskuze.

Řešení pomocí gtk-builder-convert

Na základě podnětu diskutujícího chrono uvádím druhé řešení, ke kterému není třeba Glade.

libgtk2.0-dev: /usr/bin/gtk-builder-convert

Výše uvedený distribuční skript nastavuje u nově vytvářených GtkAdjustment id na adjustment1 až adjustmentN. Já chci, aby toto id reprezentovalo id widgetu, ke kterému GtkAdjustment patří, tj. přidá se k němu suffix "_adj".

Řeší to drobná úprava distribučního skriptu gtk-builder-convert

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

14.12.2012 22:02 chrono
Rozbalit Rozbalit vše Re: Převod LibGlade.xml na GtkBuilder.xml
Odpovědět | Sbalit | Link | Blokovat | Admin
Skript gtk-builder-convert (mal by byť v Gtk+ 2.12+) by adjustment (a pár ďalších vecí) mal riešiť. Každopádne nikdy som nebol donútený ten skript použiť, takže netuším, ako dobre funguje.
Fuky avatar 15.12.2012 10:18 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Převod LibGlade.xml na GtkBuilder.xml
# aptitude install libgtk2.0-dev
$ gtk-builder-convert LibGlade.xml GtkBuilder.xml 

Děkuji za připomínku, i Pythonovský skript gtk-builder-convert řeší property "adjustment", ovšem nastavuje u GtkAdjustment id na adjustment1 až adjustmentN, takže se v tom člověk ztratí. Já nastavuji id na základě názvu widgetu, ke kterému patří tj. NAME_ADJ.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.