PhotoFiddle.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #!/usr/bin/python3
  2. from gi import require_version
  3. import FocusStack
  4. import HDR
  5. import LightStack
  6. require_version('Gtk', '3.0')
  7. from gi.repository import GLib, Gtk, Gio
  8. import sys
  9. import PF2
  10. # MENU UI FILE
  11. MENU_FILE = "ui/menu.ui"
  12. # UI FILE
  13. UI_FILE = "ui/PhotoFiddle.glade"
  14. Gtk.Settings.get_default().set_property("gtk_application_prefer_dark_theme", True)
  15. class App(Gtk.Application):
  16. def __init__(self):
  17. Gtk.Application.__init__(self,
  18. application_id="com.pcthingz.photofiddle",
  19. flags=Gio.ApplicationFlags.FLAGS_NONE)
  20. self.connect("activate", self.activateCb)
  21. def do_startup(self):
  22. Gtk.Application.do_startup(self)
  23. self.builder = Gtk.Builder()
  24. self.builder.add_from_file(UI_FILE)
  25. # TODO: Menu
  26. self.builder.add_from_file(MENU_FILE)
  27. action = Gio.SimpleAction.new("about", None)
  28. action.connect("activate", self.on_about)
  29. self.add_action(action)
  30. action = Gio.SimpleAction.new("quit", None)
  31. action.connect("activate", self.quit)
  32. self.add_action(action)
  33. self.set_app_menu(self.builder.get_object("app-menu"))
  34. def activateCb(self, app):
  35. self.builder = Gtk.Builder()
  36. self.builder.add_from_file(UI_FILE)
  37. self.builder.connect_signals(self)
  38. self.window = self.builder.get_object('window')
  39. self.window.set_wmclass("PhotoFiddle", "PhotoFiddle")
  40. self.window.set_titlebar(self.builder.get_object('header_bar'))
  41. app.add_window(self.window)
  42. self.stack = self.builder.get_object('stack')
  43. self.stack.add_titled(self.builder.get_object('initial_box'), "init", "PhotoFiddle")
  44. self.header_stack = self.builder.get_object('header_stack')
  45. self.no_header = self.builder.get_object('initial_header')
  46. self.header_stack.add_titled(self.no_header, "noh", "No Header")
  47. spinner = self.builder.get_object('spinner')
  48. # Initialse Activities
  49. args = (self.stack, self.header_stack, self.builder, self.window, self.show_message, self.hide_message,
  50. self.update_message_progress, spinner.start, spinner.stop, self.switch_activity_id)
  51. self.activities = [PF2.PF2(*args), FocusStack.FocusStack(*args), HDR.HDR(*args), LightStack.LightStack(*args)]
  52. self.header_stack.set_visible_child_name("noh")
  53. self.window.show_all()
  54. self.window.maximize()
  55. self.add_activities()
  56. activity_map = {}
  57. def add_activities(self):
  58. activity_list = self.builder.get_object('activity_list')
  59. for activity in self.activities:
  60. # Add activities to the man menu
  61. item = Gtk.VBox()
  62. item.set_margin_left(18)
  63. item.set_margin_right(18)
  64. item.set_margin_top(6)
  65. item.set_margin_bottom(6)
  66. title = Gtk.Label()
  67. title.set_markup("<b>%s</b>" % activity.name)
  68. title.set_halign(Gtk.Align.START)
  69. item.add(title)
  70. subtitle = Gtk.Label()
  71. subtitle.set_markup("<i>%s</i>" % activity.subtitle)
  72. subtitle.set_halign(Gtk.Align.START)
  73. item.add(subtitle)
  74. item.show()
  75. title.show()
  76. subtitle.show()
  77. activity_list.add(item)
  78. self.activity_map[item.get_parent()] = activity
  79. current_activity = None
  80. def activity_selected(self, sender, row):
  81. activity = self.activity_map[row]
  82. self.switch_activity(activity)
  83. def switch_activity(self, activity, path=None):
  84. self.current_activity = activity
  85. self.stack.set_visible_child(activity.widget)
  86. if(activity.header_widget != None):
  87. self.header_stack.set_visible_child(activity.header_widget)
  88. back = self.builder.get_object("back_button")
  89. back.set_sensitive(True)
  90. menu = self.builder.get_object("menu_button")
  91. menu.set_popover(activity.menu_popover)
  92. activity.on_open(path)
  93. def go_back(self, sender):
  94. if(self.current_activity.on_exit()):
  95. self.hide_message()
  96. back = self.builder.get_object("back_button")
  97. back.set_sensitive(False)
  98. menu = self.builder.get_object("menu_button")
  99. menu.set_popover(None)
  100. self.header_stack.set_visible_child(self.no_header)
  101. self.stack.set_visible_child_name("init")
  102. def quit(self, sender, item):
  103. self.window.close()
  104. def on_about(self, sender, item):
  105. self.builder.get_object('about_dialog').run()
  106. self.builder.get_object('about_dialog').hide()
  107. def show_message(self, title, subtitle, ongoing=False, progressive=False):
  108. self.builder.get_object('info_title').set_text(title)
  109. self.builder.get_object('info_subtitle').set_text(subtitle)
  110. if(ongoing):
  111. self.builder.get_object('info_spinner').start()
  112. else:
  113. self.builder.get_object('info_spinner').stop()
  114. self.builder.get_object('info_progress').set_visible(progressive)
  115. self.builder.get_object('info_reveal').set_reveal_child(True)
  116. self.builder.get_object('info_bar').set_show_close_button(not ongoing)
  117. def hide_message(self):
  118. self.builder.get_object('info_reveal').set_reveal_child(False)
  119. def update_message_progress(self, step, steps):
  120. self.builder.get_object('info_progress').set_fraction(float(step)/float(steps))
  121. def on_message_close(self, sender, arg):
  122. self.hide_message()
  123. def switch_activity_id(self, activity_id, file=None):
  124. self.current_activity.on_exit()
  125. for activity in self.activities:
  126. if(activity.id == activity_id):
  127. self.switch_activity(activity, file)
  128. return True
  129. return False
  130. ## MAIN ##
  131. if __name__ == '__main__':
  132. app = App()
  133. app.run(sys.argv)