Añadida version preliminar de copia de texto directo
This commit is contained in:
parent
42610578fe
commit
ba589b3c22
2 changed files with 158 additions and 7 deletions
|
@ -41,6 +41,15 @@
|
|||
<signal name="activate" handler="onOpenMenuClicked"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="imagemenuitem1">
|
||||
<property name="label">Copiar JSON</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="image">image1</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="onCopyJSONClicked"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="separatormenuitem1">
|
||||
<property name="visible">True</property>
|
||||
|
@ -172,4 +181,80 @@
|
|||
<property name="page_increment">10</property>
|
||||
<property name="page_size">10</property>
|
||||
</object>
|
||||
<object class="GtkWindow" id="TextWindow">
|
||||
<property name="title" translatable="yes">Introducir texto JSON</property>
|
||||
<property name="modal">True</property>
|
||||
<signal name="delete_event" handler="onCopyJSONDelete"/>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox2">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<object class="GtkTextView" id="textview1">
|
||||
<property name="width_request">180</property>
|
||||
<property name="height_request">90</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="wrap_mode">char</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkHBox" id="hbox1">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button1">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="activate" handler="onCopyJSONAcceptClicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button2">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="activate" handler="onCopyJSONCancelClicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkImage" id="image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-copy</property>
|
||||
</object>
|
||||
</interface>
|
||||
|
|
|
@ -26,13 +26,15 @@ class MainWindowMethods(object):
|
|||
self.builder.add_from_file("jsoninspector.glade")
|
||||
self.builder.connect_signals(self)
|
||||
|
||||
# Prepara los renderizados de columna y las asigna a los valores
|
||||
cell = gtk.CellRendererText()
|
||||
columns = self.builder.get_object("treeviewcolumn1")
|
||||
columns.pack_start(cell)
|
||||
columns.add_attribute(cell, 'text', 0)
|
||||
treeview = self.builder.get_object("treeview1")
|
||||
# Esta columna es la que tiene los nodos de apertura y cierre
|
||||
treeview.set_expander_column(columns)
|
||||
|
||||
|
||||
cell = gtk.CellRendererText()
|
||||
columns = self.builder.get_object("treeviewcolumn2")
|
||||
columns.pack_start(cell)
|
||||
|
@ -43,10 +45,11 @@ class MainWindowMethods(object):
|
|||
columns.pack_start(cell)
|
||||
columns.add_attribute(cell, 'text', 2)
|
||||
|
||||
# Obtenemos la ventana y la mostramos completamente
|
||||
self.window = self.builder.get_object("MainWindow")
|
||||
self.window.show_all()
|
||||
|
||||
# We get the logic and help object
|
||||
# Obtenemos un enlace al objeto de lógica de aplicación
|
||||
self.logicObj = logic
|
||||
|
||||
def onOpenMenuClicked(self, event):
|
||||
|
@ -85,6 +88,43 @@ class MainWindowMethods(object):
|
|||
# Nos deshacemos del dialogo
|
||||
chooser.destroy()
|
||||
|
||||
def onCopyJSONClicked(self, widget):
|
||||
"""
|
||||
Se ha pulsado Copiar JSON
|
||||
"""
|
||||
# Mostrar la ventana de texto
|
||||
textWindow = self.builder.get_object("TextWindow")
|
||||
textWindow.show_all()
|
||||
|
||||
def onCopyJSONDelete(self, widget, event):
|
||||
"""
|
||||
Se ha dado a cerrar la ventana de copiar texto
|
||||
"""
|
||||
textView = self.builder.get_object("textview1")
|
||||
textView.hide()
|
||||
|
||||
def onCopyJSONAcceptClicked(self, widget):
|
||||
"""
|
||||
Se ha aceptado el código
|
||||
"""
|
||||
textView = self.builder.get_objects("textview1")
|
||||
jsonBuffer = textView.get_buffer()
|
||||
jsonText = jsonBuffer.get_text()
|
||||
|
||||
textWindow = self.builder.get_object("textview1")
|
||||
textWindow.hide()
|
||||
treestore = self.builder.get_object("treestore1")
|
||||
treestore.clear()
|
||||
if self.logicObj.loadJSONText(jsonText):
|
||||
self.logicObj.loadTree(treestore)
|
||||
|
||||
def onCopyJSONCancelClicked(self, widget):
|
||||
"""
|
||||
Se ha cancelado
|
||||
"""
|
||||
textView = self.builder.get_object("textview1")
|
||||
textView.hide()
|
||||
|
||||
def onExitMenuClicked(self, widget):
|
||||
"""
|
||||
Se ha pulsado salir
|
||||
|
@ -102,15 +142,15 @@ class MainWindowMethods(object):
|
|||
|
||||
class LogicObject(object):
|
||||
"""
|
||||
Holds the some external logic of the app and persisten variables all across
|
||||
the execution
|
||||
Esta clase define un objeto que mantiene la lógica interna del programa y
|
||||
nos permite un acceso a las variables principales
|
||||
"""
|
||||
def __init__(self):
|
||||
self.json = None
|
||||
|
||||
def loadjson(self, filename):
|
||||
"""
|
||||
Loads a JSON file string and creates the respective object
|
||||
Carga un fichero JSON y crea el objeto respectivo
|
||||
"""
|
||||
f = open(filename, 'r')
|
||||
try:
|
||||
|
@ -125,38 +165,64 @@ class LogicObject(object):
|
|||
f.close()
|
||||
return True
|
||||
|
||||
def loadJSONText(self, text):
|
||||
"""
|
||||
Carga un texto JSON
|
||||
"""
|
||||
try:
|
||||
self.json = json.loads(text)
|
||||
except ValueError:
|
||||
print "JSON no válido"
|
||||
self.json = None
|
||||
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def loadTree(self, treestore):
|
||||
"""
|
||||
Loads the JSON into the tree store for display purposes
|
||||
Carga el JSON en el tree store para mostrarlo
|
||||
"""
|
||||
for key_val in self.json.keys():
|
||||
|
||||
# Si el elemento contiene un diccionario
|
||||
if type(self.json[key_val]) is dict:
|
||||
|
||||
# Añadimos el nodo, y obtenemos la referencia
|
||||
parent_node = treestore.append(None, [str(key_val), "", ""])
|
||||
# De manera recursiva, entramos en el diccionario y obtenemos
|
||||
# los nodos, añadidos como hijos de este
|
||||
self._loadTreeRec(treestore, self.json[key_val], parent_node)
|
||||
|
||||
else:
|
||||
|
||||
# Tenemos un nodo hoja, obtenemos el valor y el tipo y lo
|
||||
# añadimos
|
||||
treestore.append(None, [str(key_val),
|
||||
str(self.json[key_val]),
|
||||
str(type(self.json[key_val]))])
|
||||
|
||||
def _loadTreeRec(self, treestore, elems, parent_node):
|
||||
"""
|
||||
Recursive element adding to the tree
|
||||
Adición recursiva de elementos al árbol
|
||||
"""
|
||||
for key_val in elems.keys():
|
||||
|
||||
# Si el elemento contiene un diccionario
|
||||
if type(elems[key_val]) is dict:
|
||||
|
||||
# Añadimos el nodo, y obtenemos la referencia
|
||||
new_parent_node = treestore.append(parent_node,
|
||||
[str(key_val),
|
||||
"", ""])
|
||||
# De manera recursiva, entramos en el diccionario y obtenemos
|
||||
# los nodos, añadidos como hijos de este
|
||||
self._loadTreeRec(treestore, elems[key_val], new_parent_node)
|
||||
|
||||
else:
|
||||
|
||||
# Tenemos un nodo hoja, obtenemos el valor y el tipo y lo
|
||||
# añadimos
|
||||
treestore.append(parent_node, [str(key_val),
|
||||
str(elems[key_val]),
|
||||
str(type(elems[key_val]))])
|
||||
|
|
Loading…
Reference in a new issue