application.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  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. for k in self.pad.selections:
  424. self.sel_list.append(k, self.pad.selections[k])
  425. self.grid.set_grid_size(self.pad.width, self.pad.height)
  426. for i in range(self.pad.width*self.pad.height):
  427. sel = self.pad.find_selection_of(i)
  428. if sel: sel=self.pad.selections[sel]
  429. self.grid[i]=(sel, self.pad.matrix[i], i)
  430. self.modifying=False
  431. def get_current_selection_name(self):
  432. return self.sel_list.current_selection_name
  433. def get_current_selection(self):
  434. n=self.sel_list.current_selection_name
  435. if n and n in self.pad.selections:
  436. return self.pad.selections[n]
  437. return None
  438. def on_button_selected(self, i, btn):
  439. if not self.modifying and self.get_current_selection_name():
  440. self.pad.add_button_to(self.sel_list.current_selection_name, i)
  441. btn.select()
  442. def on_button_unselected(self, i, btn):
  443. if not self.modifying and self.get_current_selection_name():
  444. self.pad.remove_button_selection(i)
  445. btn.unselect()
  446. class Application:
  447. def __init__(self):
  448. self.builder = Gtk.Builder()
  449. self.builder.add_from_file('ui.glade')
  450. self.window=self.builder.get_object('main_window')
  451. self.window.connect('delete-event', Gtk.main_quit)
  452. self.pad=None
  453. self.sel_pane=SelectionPane(self)
  454. self.window.show_all()
  455. self.widget("menu_open").connect("activate", self.open_dialog)
  456. self.widget("menu_save").connect("activate", self.on_save_as)
  457. self.widget("menu_save_as").connect("activate", self.save_dialog)
  458. self.widget("menu_new").connect("activate", self.new_dialog)
  459. self.widget("toolbox_start").connect("clicked", self.start_simple_midi)
  460. self.widget("toolbox_clear").connect("clicked", self.reset_simple_midi)
  461. self.file_open=None
  462. self.file_dir_open=None
  463. self.changed=False
  464. self.simplemidi= simplemidi.SimpleMidi()
  465. self.simplemidi.run()
  466. self.widget("notebook").hide()
  467. self.dialog_new=NewDialog(self)
  468. def widget(self, name):
  469. return self.builder.get_object(name)
  470. def connect(self, name, signal, fct):
  471. self.builder.get_object(name).connect(signal, fct)
  472. def set_pad_configuration(self, conf):
  473. self.pad=PadConfiguration.parse(conf)
  474. self.init()
  475. def set_new_pad(self, pad):
  476. self.pad=PadConfiguration.new(pad)
  477. self.init()
  478. def set_changed(self):
  479. self.cahnged=True
  480. self.window.set_title("*"+os.path.basename(self.file_open))
  481. def init(self):
  482. self.sel_pane.init(self.pad)
  483. def open(self, file :str):
  484. self.set_pad_configuration(file)
  485. self.window.show_all()
  486. self.sel_pane.set_selection(None, None)
  487. self.file_open=file
  488. self.file_dir_open=os.path.dirname(file)
  489. self.widget("selection_root_pane").set_position(100)
  490. self.window.set_title(os.path.basename(self.file_open))
  491. self.simplemidi.set_pad(self.pad.name)
  492. def save(self, file):
  493. with open(file, "w") as f:
  494. f.write(json.dumps(self.pad.json(), indent=4))
  495. self.changed=False
  496. def test(self):
  497. with open("test", "w") as f:
  498. f.write(json.dumps(self.pad.json(), indent=4))
  499. def open_dialog(self, x):
  500. dialog = Gtk.FileChooserDialog("Please choose a file", self.window,
  501. Gtk.FileChooserAction.OPEN,
  502. (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  503. Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
  504. response = dialog.run()
  505. if response == Gtk.ResponseType.OK:
  506. file_path = dialog.get_filename()
  507. self.open(file_path)
  508. elif response == Gtk.ResponseType.CANCEL:
  509. pass
  510. dialog.destroy()
  511. def save_dialog(self, x):
  512. dialog = Gtk.FileChooserDialog("Please choose a file", self.window,
  513. Gtk.FileChooserAction.SAVE,
  514. (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  515. Gtk.STOCK_SAVE_AS, Gtk.ResponseType.OK))
  516. dialog.set_current_folder(self.file_dir_open if self.file_dir_open else ".")
  517. dialog.set_filename(os.path.basename(self.file_open))
  518. response = dialog.run()
  519. if response == Gtk.ResponseType.OK:
  520. file_path = dialog.get_filename()
  521. self.save(file_path)
  522. elif response == Gtk.ResponseType.CANCEL:
  523. pass
  524. dialog.destroy()
  525. def on_save_as(self, x):
  526. if self.file_dir_open:
  527. self.save(self.file_open)
  528. else:
  529. self.save_dialog(None)
  530. def new_dialog(self, x):
  531. self.dialog_new.run()
  532. def reset_simple_midi(self, x):
  533. if self.pad:
  534. self.simplemidi.clear()
  535. def start_simple_midi(self, x):
  536. if self.pad:
  537. self.simplemidi.set_configuration_data(self.pad)
  538. def on_new(self, pad):
  539. self.set_new_pad(pad)
  540. self.file_open=pad+" configuration"
  541. self.file_dir_open=None
  542. self.set_changed()
  543. self.window.show_all()
  544. def main(self):
  545. self.window.show()
  546. Gtk.main()
  547. app = Application()
  548. app.open("../conf/conf3.conf")
  549. app.main()