/inkscape/MB_EditButton.py

https://bitbucket.org/codefirex/external_madbutterfly
Python | 158 lines | 134 code | 20 blank | 4 comment | 20 complexity | 6e70df23ac517943b135232aa9b86cc5 MD5 | raw file
  1. #!/usr/bin/python
  2. import inkex
  3. import pygtk
  4. import gtk
  5. from copy import deepcopy
  6. from lxml import etree
  7. import os
  8. import tempfile
  9. class ConvertToButton(inkex.Effect):
  10. def effect(self):
  11. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  12. self.window.set_position(gtk.WIN_POS_MOUSE)
  13. self.defaultname = 'input symbol name here'
  14. if self.fillcontent() == False:
  15. self.window.show_all()
  16. self.window.connect("delete_event", gtk.main_quit)
  17. gtk.main()
  18. def onQuit(self,data):
  19. gtk.main_quit()
  20. def onAssign(self,data):
  21. text = self.text.get_text()
  22. if text != self.defaultname:
  23. self.node.set("mbname",text)
  24. gtk.main_quit()
  25. def confirm(self,msg):
  26. vbox = gtk.VBox()
  27. vbox.pack_start(gtk.Label(msg))
  28. self.button = gtk.Button('OK')
  29. vbox.pack_start(self.button)
  30. self.button.connect("clicked", self.onQuit)
  31. self.window.add(vbox)
  32. def dumpattr(self,n):
  33. s = ""
  34. for a,v in n.attrib.items():
  35. s = s + ("%s=%s" % (a,v))
  36. return s
  37. def dump(self,node,l=0):
  38. print " " * l*2,"<", node.tag, self.dumpattr(node),">"
  39. for n in node:
  40. self.dump(n,l+1)
  41. print " " * l * 2,"/>"
  42. def hide_frame(self,frame):
  43. frame.set('style','display:none')
  44. def show_frame(self,frame):
  45. frame.set('style','')
  46. def EditNormalButton(self,event,node):
  47. self.EditButton(node,'_normal')
  48. def EditActiveButton(self,event,node):
  49. self.EditButton(node,'_active')
  50. def EditClickButton(self,event,node):
  51. self.EditButton(node,'_click')
  52. def EditFrame(self,node):
  53. # Generate a SVG file with node and invoke inkscape to edit it
  54. svg = etree.Element('svg')
  55. for n in node:
  56. svg.append(deepcopy(n))
  57. fd,fname = tempfile.mkstemp(suffix='.svg')
  58. f = os.fdopen(fd,"w")
  59. f.write(etree.tostring(svg))
  60. f.close()
  61. os.system("inkscape %s >/dev/null 2>/dev/null" % fname)
  62. svg = etree.parse(fname)
  63. os.unlink(fname)
  64. newnode=[]
  65. for n in svg.getroot():
  66. if n.tag == '{http://www.w3.org/2000/svg}g':
  67. newnode.append(n)
  68. if n.tag == '{http://www.w3.org/2000/svg}rect':
  69. newnode.append(n)
  70. if n.tag == '{http://www.w3.org/2000/svg}text':
  71. newnode.append(n)
  72. return newnode
  73. def duplicateAttribute(self,new,old):
  74. for k,v in old.attrib.items():
  75. new.set(k,v)
  76. def EditButton(self,node,mode):
  77. name = node.get('mbname')
  78. for frame in node:
  79. if frame.get('mbname') == name+mode:
  80. newnode = self.EditFrame(frame)
  81. oldframe = deepcopy(frame)
  82. frame.clear()
  83. self.duplicateAttribute(frame,oldframe)
  84. for n in newnode:
  85. frame.append(n)
  86. return
  87. def DisplayNormalButton(self,event,node):
  88. self.displayButton(node,'_normal')
  89. def DisplayActiveButton(self,event,node):
  90. self.displayButton(node,'_active')
  91. def DisplayClickButton(self,event,node):
  92. self.displayButton(node,'_click')
  93. def displayButton(self,node,mode):
  94. name = node.get('mbname')
  95. for n in node:
  96. if n.get('mbname') == name+mode:
  97. n.set('style','')
  98. else:
  99. n.set('style','display:none')
  100. gtk.main_quit()
  101. def fillcontent(self):
  102. if len(self.selected) != 1:
  103. self.confirm('Please select one group only')
  104. return False
  105. for id,node in self.selected.iteritems():
  106. #self.dump(node)
  107. name = node.get("mbname")
  108. if name == None:
  109. self.confirm("The MadButterFly symbol is not defined yet. Please convert it to the symbol before convert it to button.")
  110. return False
  111. type = node.get("mbtype")
  112. if type != 'button':
  113. self.confirm('This is not a button')
  114. return False
  115. hbox = gtk.HBox()
  116. self.window.add(hbox)
  117. button = gtk.Button('Edit Normal')
  118. hbox.pack_start(button)
  119. button.connect("clicked", self.EditNormalButton,node)
  120. button = gtk.Button('Edit Active')
  121. hbox.pack_start(button)
  122. button.connect("clicked", self.EditActiveButton,node)
  123. button = gtk.Button('Edit Click')
  124. hbox.pack_start(button)
  125. button.connect("clicked", self.EditClickButton,node)
  126. button = gtk.Button('Display Normal')
  127. hbox.pack_start(button)
  128. button.connect("clicked", self.DisplayNormalButton,node)
  129. button = gtk.Button('Display Active')
  130. hbox.pack_start(button)
  131. button.connect("clicked", self.DisplayActiveButton,node)
  132. button = gtk.Button('Display Click')
  133. hbox.pack_start(button)
  134. button.connect("clicked", self.DisplayClickButton,node)
  135. return False
  136. a=ConvertToButton()
  137. a.affect()
  138. # vim: set ts=4