application.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. from GtkSelectionList import GtkSelectionList
  2. from GtkButtonGrid import GtkButtonGrid
  3. from gi.repository import Gdk
  4. from gi.repository import Gtk
  5. from pad import *
  6. import os
  7. import simplemidi
  8. import sys
  9. gtk=Gtk
  10. from MidiConst import *
  11. def when_button_is_clicked(label):
  12. '''
  13. Quand le bouton est cliqué
  14. '''
  15. label.set_text('Hello world!')
  16. def ok(btn):
  17. print("OK clicked")
  18. _GAMME = {
  19. "Personalisée": "",
  20. "Majeur" : GAMME_MAJEUR,
  21. "Mineur naturelle" : GAMME_MINEUR_NATURELLE,
  22. "Mineur harmonique" : GAMME_MINEUR_HARMONIQUE,
  23. "Mineur mélodique" : GAMME_MINEUR_MELODIQUE
  24. }
  25. class Pane:
  26. def __init__(self, app):
  27. self.app = app
  28. self.pad=app.pad
  29. self.builder = app.builder
  30. def connect(self, name, signal, fct):
  31. self.builder.get_object(name).connect(signal, fct)
  32. def widget(self, name):
  33. return self.builder.get_object(name)
  34. class _Dialog:
  35. def __init__(self, parent, name):
  36. self.builder=parent.builder
  37. self.parent=parent
  38. self.dialog=self.widget(name)
  39. self.dialog.connect("delete-event", self.drop)
  40. self.modify=False
  41. self.isInit=False
  42. def on_ok(self, btn):
  43. self.dialog.hide()
  44. self.dialog.hide()
  45. if self.modify:
  46. self.parent.on_modify_return(self.get_data())
  47. else:
  48. self.parent.on_add_return(self.get_data())
  49. def on_cancel(self, x=None):
  50. self.dialog.hide()
  51. self.dialog.hide()
  52. def run(self):
  53. if not self.isInit:
  54. self.dialog.show()
  55. self.isInit=True
  56. self.dialog.hide()
  57. self.update(None)
  58. self.dialog.show()
  59. def get_data(self):
  60. raise NotImplementedError
  61. def _init(self, data, ):
  62. raise NotImplementedError
  63. def drop(self,a,b):
  64. self.dialog.hide()
  65. return True
  66. def connect(self, name, signal, fct):
  67. self.builder.get_object(name).connect(signal, fct)
  68. def widget(self, name):
  69. return self.builder.get_object(name)
  70. def init(self, data):
  71. self.modify=data!=None
  72. self._init(data)
  73. self.update(None)
  74. class NewDialog(_Dialog):
  75. def __init__(self, pane):
  76. super().__init__(pane, "new_pad_conf_dialog")
  77. self.cb=self.widget("cb_new_pad")
  78. l=PadManager.pad_list()
  79. for k in l: self.cb.append(k,k)
  80. if len(l): self.cb.set_active(0)
  81. self.widget("new_pad").connect("clicked", self.on_valid)
  82. self.app=pane
  83. def on_valid(self, x):
  84. self.app.on_new(self.cb.get_active_id())
  85. self.drop(None,None)
  86. def update(self, x): pass
  87. class InitDialog(_Dialog):
  88. def __init__(self, pane):
  89. super().__init__(pane, "init_dialog")
  90. self.wchannel=[self.widget("init_enable_channel"),self.widget("init_channel_value"),self.widget("init_channel_absolute")]
  91. self.wkey=[self.widget("init_enable_key"),self.widget("init_key_value"),self.widget("init_key_absolute")]
  92. self.wvelocity=[self.widget("init_enable_velocity"),self.widget("init_velocity_value"),self.widget("init_velocity_absolute")]
  93. self.widget("init_ok").connect("clicked", self.on_ok)
  94. self.widget("init_cancel").connect("clicked", self.on_cancel)
  95. self.wchannel[0].connect("toggled", self.update)
  96. self.wkey[0].connect("toggled", self.update)
  97. self.wvelocity[0].connect("toggled", self.update)
  98. self.message=self.widget("init_message")
  99. def get_data(self):
  100. return [
  101. self.message.get_active_id(),
  102. int(self.wchannel[1].get_value()) if self.wchannel[0].get_active() else -1,
  103. int(self.wkey[1].get_value()) if self.wkey[0].get_active() else -1,
  104. int(self.wvelocity[1].get_value()) if self.wvelocity[0].get_active() else -1
  105. ]
  106. def _init(self, data):
  107. self.message.set_active(0)
  108. self.wchannel[0].set_active(False)
  109. self.wkey[0].set_active(False)
  110. self.wvelocity[0].set_active(False)
  111. self.wchannel[1].set_sensitive(False)
  112. self.wkey[1].set_sensitive(False)
  113. self.wvelocity[1].set_sensitive(False)
  114. self.wchannel[1].set_value(0)
  115. self.wkey[1].set_value(0)
  116. self.wvelocity[1].set_value(0)
  117. if data:
  118. self.message.set_active_id(data[0])
  119. self.wchannel[0].set_active(data[1]>=0)
  120. self.wkey[0].set_active(data[2]>=0)
  121. self.wvelocity[0].set_active(data[3]>=0)
  122. self.wchannel[1].set_sensitive(data[1]>=0)
  123. self.wkey[1].set_sensitive(data[2]>=0)
  124. self.wvelocity[1].set_sensitive(data[3]>=0)
  125. self.wchannel[1].set_value(data[1])
  126. self.wkey[1].set_value(data[2])
  127. self.wvelocity[1].set_value(data[3])
  128. def update(self, x):
  129. self.wchannel[1].set_sensitive(self.wchannel[0].get_active())
  130. self.wkey[1].set_sensitive(self.wkey[0].get_active())
  131. self.wvelocity[1].set_sensitive(self.wvelocity[0].get_active())
  132. class OperationDialog(_Dialog):
  133. def __init__(self, pane):
  134. super().__init__(pane, "operation_dialog")
  135. self.cbtype=self.widget("operation_type")
  136. self.cbtype.connect("changed", self.update)
  137. self.current_type="TRANSLATE"
  138. self.widget("operation_ok").connect("clicked", self.on_ok)
  139. self.widget("operation_cancel").connect("clicked", self.on_cancel)
  140. self.frames={
  141. "TRANSLATE" : self.widget("operation_translate"),
  142. "RANGE" : self.widget("operation_range"),
  143. "REORDER" : self.widget("operation_reorder"),
  144. "DROP" : self.widget("operation_drop")
  145. }
  146. self.reorder_offest=self.widget("operation_offset")
  147. self.gamme_note=self.widget("operation_gamme_note")
  148. self.gamme_gamme=self.widget("operation_gamme_gamme")
  149. self.gamme_custom=self.widget("operation_gamme_custom")
  150. self.gamme_octave=self.widget("operation_gamme_note_octave")
  151. self.trans_ch=[self.widget("operation_translate_channel"), self.widget("operation_translate_channel_absolute")]
  152. self.trans_key=[self.widget("operation_translate_key"), self.widget("operation_translate_key_absolute")]
  153. self.trans_vel=[self.widget("operation_translate_velocity"), self.widget("operation_translate_velocity_absolute")]
  154. for k in _GAMME: self.gamme_gamme.append(k, k)
  155. for k in ARR_NOTE: self.gamme_note.append(k, k)
  156. self.update()
  157. def update(self, x=None):
  158. self.current_type=self.cbtype.get_active_id()
  159. for k in self.frames:
  160. if k==self.current_type:
  161. self.frames[k].show()
  162. else:
  163. self.frames[k].hide()
  164. def get_data(self):
  165. if self.current_type=="TRANSLATE":
  166. values=[self.trans_ch[0].get_value(),self.trans_key[0].get_value(),self.trans_vel[0].get_value()]
  167. modes=[self.trans_ch[1].get_active(),self.trans_key[1].get_active(),self.trans_vel[1].get_active()]
  168. return TranslateOperation.new(values, modes)
  169. elif self.current_type=="DROP":
  170. return DropOperation.new()
  171. elif self.current_type=="RANGE":
  172. gamme=self.gamme_gamme.get_active_id()
  173. gamme=_GAMME[gamme] if gamme else json.loads("["+self.gamme_custom.get_text()+"]")
  174. note=Note.parse(self.gamme_note.get_active_id()+self.gamme_octave.get_active_id())
  175. return RangeOperation.new(gamme, note)
  176. elif self.current_type=="REORDER":
  177. return ReorderOperation.new(int(self.reorder_offest.get_value()))
  178. def _init(self, data):
  179. self.gamme_gamme.set_active(0)
  180. self.gamme_note.set_active(0)
  181. self.gamme_octave.set_active(5)
  182. self.gamme_custom.set_text("")
  183. self.trans_ch[0].set_value(0)
  184. self.trans_key[0].set_value(0)
  185. self.trans_vel[0].set_value(0)
  186. self.trans_ch[1].set_active(False)
  187. self.trans_key[1].set_active(False)
  188. self.trans_vel[1].set_active(False)
  189. self.reorder_offest.set_value(0)
  190. if data:
  191. self.cbtype.set_active_id(data.type)
  192. if isinstance(data, RangeOperation):
  193. self.gamme_note.set_active(Note.get_note(data.key))
  194. self.gamme_octave.set_active(Note.get_octave(data.key))
  195. range_set=False
  196. for i in _GAMME:
  197. if _GAMME[i]!="" and _GAMME[i]==data.range:
  198. range_set=True
  199. self.gamme_gamme.set_active_id(i)
  200. if not range_set:
  201. self.gamme_custom.set_text(str(data.range)[1:-1])
  202. if isinstance(data, ReorderOperation):
  203. self.reorder_offest.set_value(int(data.offset))
  204. if isinstance(data, TranslateOperation):
  205. self.trans_ch[0].set_value(data.channel)
  206. self.trans_key[0].set_value(data.key)
  207. self.trans_vel[0].set_value(data.velocity)
  208. self.trans_ch[1].set_active(data.channelmode=="FIXED")
  209. self.trans_key[1].set_active(data.keymode=="FIXED")
  210. self.trans_vel[1].set_active(data.velocitymode=="FIXED")
  211. class CRUDPane(Pane):
  212. def __init__(self, app, prefix):
  213. super().__init__(app)
  214. #self.widget(prefix+"_down").connect("clicked", self.on_down)
  215. self.widget(prefix+"_up").connect("clicked", self._on_up)
  216. self.widget(prefix+"_remove").connect("clicked", self._on_remove)
  217. self.widget(prefix+"_add").connect("clicked", self._on_add)
  218. self.widget(prefix+"_edit").connect("clicked", self._on_edit)
  219. self.list=self.widget(prefix+"_listbox")
  220. self.dialog=None
  221. self.data=[]
  222. def print(self, tmp="After"):
  223. pass
  224. def get_index(self): return self.find_index(self.list.get_selected_row())
  225. def find_index(self, widget):
  226. n=-1
  227. if not widget: return -1
  228. widget=widget.get_child()
  229. for i in range(len(self.data)):
  230. k=self.data[i]
  231. if k[1]==widget:
  232. return i
  233. return -1
  234. def insert(self, i, data):
  235. self.data.append(None)
  236. for j in reversed(range(i,len(self.data)-1)):
  237. self.data[j+1]=self.data[j]
  238. lbl=Gtk.Label.new(str(data))
  239. self.data[j] =(data, lbl)
  240. self.list.insert(lbl, i)
  241. self.list.show_all()
  242. def _on_up(self, btn):
  243. if not self.app.sel_pane.get_current_selection(): return
  244. n=self.get_index()
  245. if n>0:
  246. x=self.data[n]
  247. self.list.remove(x[1].get_parent())
  248. self.insert(n-1, x[0])
  249. self.data.remove(x)
  250. self.list.select_row(self.data[n-1][1].get_parent())
  251. self.on_up(n)
  252. self.print("up")
  253. def _on_down(self, btn):
  254. if not self.app.sel_pane.get_current_selection(): return
  255. n=self.get_index()
  256. if n>=0 and n<=len(self.data)-1:
  257. x=self.data[n]
  258. self.list.remove(x[1].get_parent())
  259. self.insert(n+1, x[0])
  260. self.data.remove(x)
  261. self.list.select_row(self.data[n+1][1].get_parent())
  262. self.on_down(n)
  263. self.print("down")
  264. def _on_remove(self, btn):
  265. if not self.app.sel_pane.get_current_selection(): return
  266. n=self.get_index()
  267. if n>=0:
  268. x=self.data[n]
  269. self.list.remove(x[1].get_parent())
  270. self.data.remove(x)
  271. self.on_remove(n)
  272. self.print("remove")
  273. def _on_add(self, btn):
  274. if not self.app.sel_pane.get_current_selection(): return
  275. self.dialog.init(None)
  276. self.dialog.run()
  277. def _on_edit(self, btn):
  278. if not self.app.sel_pane.get_current_selection(): return
  279. n=self.get_index()
  280. if n>=0:
  281. self.dialog.init(self.data[n][0])
  282. self.dialog.run()
  283. def init(self, data):
  284. self.data=[]
  285. ch = self.list.get_children()
  286. for i in ch: self.list.remove(i)
  287. for d in data:
  288. self.add_on_ui(d)
  289. def data_to_str(self, x):
  290. return str(x)
  291. def add_on_ui(self, data):
  292. lbl=Gtk.Label.new(self.data_to_str(data))
  293. lbl.set_alignment(0,0)
  294. self.data.append((data, lbl))
  295. self.list.add(lbl)
  296. self.list.show_all()
  297. def on_add_return(self, data):
  298. self.add_on_ui(data)
  299. self.on_add(data)
  300. self.print("add")
  301. def on_modify_return(self, data):
  302. n=self.find_index(self.list.get_selected_row())
  303. lbl=self.data[n][1]
  304. lbl.set_label(self.data_to_str(data))
  305. self.data[n]=(data, lbl)
  306. self.on_modify(n, data)
  307. self.print("modify")
  308. def on_add(self, x): raise NotImplementedError
  309. def on_modify(self, i, x): raise NotImplementedError
  310. def on_remove(self, i): raise NotImplementedError
  311. def on_up(self, i): raise NotImplementedError
  312. def on_down(self, i): raise NotImplementedError
  313. class InitPane(CRUDPane):
  314. def __init__(self, app):
  315. super().__init__(app, "init")
  316. self.dialog=InitDialog(self)
  317. def data_to_str(self, x):
  318. out=""
  319. if x[0]=="noteon": out="NoteOn("
  320. if x[0]=="noteoff": out="NoteOff("
  321. args=[]
  322. if x[1]>=0: args.append("channel %d"%x[1])
  323. if x[2]>=0: args.append("key %d"%x[2])
  324. if x[3]>=0: args.append("velocity %d"%x[3])
  325. return out+",".join(args)+")"
  326. def on_add(self, x):
  327. sel = self.app.sel_pane.get_current_selection()
  328. sel.init.actions.append(InputAction(x))
  329. def on_modify(self, i, x):
  330. sel = self.app.sel_pane.get_current_selection()
  331. sel.init.actions[i]=InputAction(x)
  332. def on_remove(self, i):
  333. sel = self.app.sel_pane.get_current_selection()
  334. sel.init.actions.remove(sel.init.actions[i])
  335. def on_up(self, i):
  336. sel = self.app.sel_pane.get_current_selection()
  337. tmp=sel.init.actions[i]
  338. sel.init.actions[i]=sel.init.actions[i-1]
  339. sel.init.actions[i-1]=tmp
  340. def on_down(self, i):
  341. sel = self.app.sel_pane.get_current_selection()
  342. tmp=sel.init.actions[i]
  343. sel.init.actions[i]=sel.init.actions[i+1]
  344. sel.init.actions[i+1]=tmp
  345. class OperationPane(CRUDPane):
  346. def __init__(self, app):
  347. super().__init__(app, "operation")
  348. self.dialog=OperationDialog(self)
  349. def on_add(self, x):
  350. sel = self.app.sel_pane.get_current_selection()
  351. sel.operations.append(x)
  352. def on_modify(self, i, x):
  353. sel = self.app.sel_pane.get_current_selection()
  354. sel.operations[i]=x
  355. def on_remove(self, i):
  356. sel = self.app.sel_pane.get_current_selection()
  357. sel.operations.remove(sel.operations[i])
  358. def on_up(self, i):
  359. sel = self.app.sel_pane.get_current_selection()
  360. tmp=sel.operations[i]
  361. sel.operations[i]=sel.operations[i-1]
  362. sel.operations[i-1]=tmp
  363. def on_down(self, i):
  364. sel = self.app.sel_pane.get_current_selection()
  365. tmp=sel.operations[i]
  366. sel.operations[i]=sel.operations[i+1]
  367. sel.operations[i+1]=tmp
  368. class SelectionPane(Pane):
  369. def __init__(self, app):
  370. super().__init__(app)
  371. self.input_new_pad=self.builder.get_object("input_new_pad")
  372. self.sel_list=GtkSelectionList()
  373. self.pad=app.pad
  374. self.builder.get_object("sel_pane_root").pack_start(self.sel_list, True, True, 0)
  375. self.builder.get_object("sel_pane_root").reorder_child(self.sel_list,1)
  376. self.sel_list.set_on_selected(self.on_selections_changed)
  377. self.connect("button_new_sel", "clicked", self.on_new_sel)
  378. self.grid=GtkButtonGrid()
  379. self.grid.set_on_select(self.on_button_selected)
  380. self.grid.set_on_unselect(self.on_button_unselected)
  381. self.widget("grid_root").pack_start(self.grid, True, True, 0)
  382. self.entry_name=self.widget("entry_sel_name")
  383. self.widget("rename_sel").connect("clicked", self.on_name_change)
  384. self.sel_edit_box=self.widget("sel_edit_box")
  385. self.modifying=False
  386. self.init_pane=InitPane(self.app)
  387. self.op_pane=OperationPane(self.app)
  388. def on_name_change(self, editable):
  389. old=self.sel_list.current_selection_name
  390. new=self.entry_name.get_text()
  391. self.pad.rename_selection(old, new)
  392. self.sel_list.rename(old, new)
  393. def on_new_sel(self, btn):
  394. name = self.input_new_pad.get_text()
  395. sel=self.pad.new_sel(name)
  396. self.sel_list.append(name, sel)
  397. self.input_new_pad.set_text("")
  398. def on_selections_changed(self, sel, selection):
  399. self.set_selection(sel, selection)
  400. self.entry_name.set_text(sel if sel else "")
  401. def set_selection(self, name, selection):
  402. self.modifying=True
  403. self.grid.unselect_all()
  404. if name:
  405. for i in selection.inputs:
  406. self.grid[i].select()
  407. self.sel_edit_box.set_visible(True)
  408. self.sel_edit_box.show()
  409. self.sel_edit_box.queue_draw()
  410. self.init_pane.init(selection.init.json())
  411. self.op_pane.init(selection.operations)
  412. self.sel_edit_box.show()
  413. else:
  414. self.init_pane.init([])
  415. self.op_pane.init([])
  416. self.sel_edit_box.hide()
  417. self.grid.update()
  418. self.modifying=False
  419. def init(self, pad):
  420. self.modifying=True
  421. self.pad=pad
  422. self.sel_list.init()
  423. print(self.sel_list.get_children())
  424. for k in self.pad.selections:
  425. self.sel_list.append(k, self.pad.selections[k])
  426. self.grid.set_grid_size(self.pad.width, self.pad.height)
  427. for i in range(self.pad.width*self.pad.height):
  428. sel = self.pad.find_selection_of(i)
  429. if sel: sel=self.pad.selections[sel]
  430. self.grid[i]=(sel, self.pad.matrix[i], i)
  431. self.modifying=False
  432. def get_current_selection_name(self):
  433. return self.sel_list.current_selection_name
  434. def get_current_selection(self):
  435. n=self.sel_list.current_selection_name
  436. if n and n in self.pad.selections:
  437. return self.pad.selections[n]
  438. return None
  439. def on_button_selected(self, i, btn):
  440. if not self.modifying and self.get_current_selection_name():
  441. self.pad.add_button_to(self.sel_list.current_selection_name, i)
  442. btn.select()
  443. def on_button_unselected(self, i, btn):
  444. if not self.modifying and self.get_current_selection_name():
  445. self.pad.remove_button_selection(i)
  446. btn.unselect()
  447. class Application:
  448. def __init__(self):
  449. self.builder = Gtk.Builder()
  450. self.builder.add_from_file('ui.glade')
  451. self.window=self.builder.get_object('main_window')
  452. self.window.connect('delete-event', Gtk.main_quit)
  453. self.pad=None
  454. self.sel_pane=SelectionPane(self)
  455. self.window.show_all()
  456. self.widget("menu_open").connect("activate", self.open_dialog)
  457. self.widget("menu_save").connect("activate", self.on_save_as)
  458. self.widget("menu_save_as").connect("activate", self.save_dialog)
  459. self.widget("menu_new").connect("activate", self.new_dialog)
  460. self.widget("toolbox_start").connect("clicked", self.start_simple_midi)
  461. self.widget("toolbox_clear").connect("clicked", self.reset_simple_midi)
  462. self.file_open=None
  463. self.file_dir_open=None
  464. self.changed=False
  465. self.simplemidi= simplemidi.SimpleMidi()
  466. self.simplemidi.run()
  467. self.widget("notebook").hide()
  468. self.dialog_new=NewDialog(self)
  469. def widget(self, name):
  470. return self.builder.get_object(name)
  471. def connect(self, name, signal, fct):
  472. self.builder.get_object(name).connect(signal, fct)
  473. def set_pad_configuration(self, conf):
  474. self.pad=PadConfiguration.parse(conf)
  475. self.init()
  476. def set_new_pad(self, pad):
  477. self.pad=PadConfiguration.new(pad)
  478. self.init()
  479. def set_changed(self):
  480. self.cahnged=True
  481. self.window.set_title("*"+os.path.basename(self.file_open))
  482. def init(self):
  483. self.sel_pane.init(self.pad)
  484. def open(self, file :str):
  485. self.set_pad_configuration(file)
  486. self.window.show_all()
  487. self.sel_pane.set_selection(None, None)
  488. self.file_open=file
  489. self.file_dir_open=os.path.dirname(file)
  490. self.widget("selection_root_pane").set_position(100)
  491. self.window.set_title(os.path.basename(self.file_open))
  492. self.simplemidi.set_pad(self.pad.name)
  493. def save(self, file):
  494. with open(file, "w") as f:
  495. f.write(json.dumps(self.pad.json(), indent=4))
  496. self.changed=False
  497. def test(self):
  498. with open("test", "w") as f:
  499. f.write(json.dumps(self.pad.json(), indent=4))
  500. def open_dialog(self, x):
  501. dialog = Gtk.FileChooserDialog("Please choose a file", self.window,
  502. Gtk.FileChooserAction.OPEN,
  503. (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  504. Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
  505. response = dialog.run()
  506. if response == Gtk.ResponseType.OK:
  507. file_path = dialog.get_filename()
  508. self.open(file_path)
  509. elif response == Gtk.ResponseType.CANCEL:
  510. pass
  511. dialog.destroy()
  512. def save_dialog(self, x):
  513. dialog = Gtk.FileChooserDialog("Please choose a file", self.window,
  514. Gtk.FileChooserAction.SAVE,
  515. (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  516. Gtk.STOCK_SAVE_AS, Gtk.ResponseType.OK))
  517. dialog.set_current_folder(self.file_dir_open if self.file_dir_open else ".")
  518. dialog.set_filename(os.path.basename(self.file_open))
  519. response = dialog.run()
  520. if response == Gtk.ResponseType.OK:
  521. file_path = dialog.get_filename()
  522. self.save(file_path)
  523. elif response == Gtk.ResponseType.CANCEL:
  524. pass
  525. dialog.destroy()
  526. def on_save_as(self, x):
  527. if self.file_dir_open:
  528. self.save(self.file_open)
  529. else:
  530. self.save_dialog(None)
  531. def new_dialog(self, x):
  532. self.dialog_new.run()
  533. def reset_simple_midi(self, x):
  534. if self.pad:
  535. self.simplemidi.clear()
  536. def start_simple_midi(self, x):
  537. if self.pad:
  538. self.simplemidi.set_configuration_data(self.pad)
  539. def on_new(self, pad):
  540. self.set_new_pad(pad)
  541. self.file_open=pad+" configuration"
  542. self.file_dir_open=None
  543. self.set_changed()
  544. self.window.show_all()
  545. def main(self):
  546. self.window.show()
  547. Gtk.main()
  548. app = Application()
  549. app.open("conf3.conf")
  550. app.main()