#!/usr/bin/python3 from gi import require_version import FocusStack import HDR import LightStack require_version('Gtk', '3.0') from gi.repository import GLib, Gtk, Gio import sys import PF2 # MENU UI FILE MENU_FILE = "ui/menu.ui" # UI FILE UI_FILE = "ui/PhotoFiddle.glade" Gtk.Settings.get_default().set_property("gtk_application_prefer_dark_theme", True) class App(Gtk.Application): def __init__(self): Gtk.Application.__init__(self, application_id="com.pcthingz.photofiddle2", flags=Gio.ApplicationFlags.FLAGS_NONE) self.connect("activate", self.activateCb) def do_startup(self): Gtk.Application.do_startup(self) self.builder = Gtk.Builder() self.builder.add_from_file(UI_FILE) # TODO: Menu self.builder.add_from_file(MENU_FILE) action = Gio.SimpleAction.new("about", None) action.connect("activate", self.on_about) self.add_action(action) action = Gio.SimpleAction.new("quit", None) action.connect("activate", self.quit) self.add_action(action) self.set_app_menu(self.builder.get_object("app-menu")) def activateCb(self, app): self.builder = Gtk.Builder() self.builder.add_from_file(UI_FILE) self.builder.connect_signals(self) self.window = self.builder.get_object('window') self.window.set_wmclass("PhotoFiddle", "PhotoFiddle") self.window.set_titlebar(self.builder.get_object('header_bar')) app.add_window(self.window) self.stack = self.builder.get_object('stack') self.stack.add_titled(self.builder.get_object('initial_box'), "init", "PhotoFiddle") self.header_stack = self.builder.get_object('header_stack') self.no_header = self.builder.get_object('initial_header') self.header_stack.add_titled(self.no_header, "noh", "No Header") spinner = self.builder.get_object('spinner') # Initialse Activities args = (self.stack, self.header_stack, self.builder, self.window, self.show_message, self.hide_message, self.update_message_progress, spinner.start, spinner.stop, self.switch_activity_id) self.activities = [PF2.PF2(*args), FocusStack.FocusStack(*args), HDR.HDR(*args), LightStack.LightStack(*args)] self.header_stack.set_visible_child_name("noh") self.window.show_all() self.window.maximize() self.add_activities() activity_map = {} def add_activities(self): activity_list = self.builder.get_object('activity_list') for activity in self.activities: # Add activities to the man menu item = Gtk.VBox() item.set_margin_left(18) item.set_margin_right(18) item.set_margin_top(6) item.set_margin_bottom(6) title = Gtk.Label() title.set_markup("%s" % activity.name) title.set_halign(Gtk.Align.START) item.add(title) subtitle = Gtk.Label() subtitle.set_markup("%s" % activity.subtitle) subtitle.set_halign(Gtk.Align.START) item.add(subtitle) item.show() title.show() subtitle.show() activity_list.add(item) self.activity_map[item.get_parent()] = activity current_activity = None def activity_selected(self, sender, row): activity = self.activity_map[row] self.switch_activity(activity) def switch_activity(self, activity, path=None): self.current_activity = activity self.stack.set_visible_child(activity.widget) if(activity.header_widget != None): self.header_stack.set_visible_child(activity.header_widget) back = self.builder.get_object("back_button") back.set_sensitive(True) menu = self.builder.get_object("menu_button") menu.set_popover(activity.menu_popover) activity.on_open(path) def go_back(self, sender): if(self.current_activity.on_exit()): self.hide_message() back = self.builder.get_object("back_button") back.set_sensitive(False) menu = self.builder.get_object("menu_button") menu.set_popover(None) self.header_stack.set_visible_child(self.no_header) self.stack.set_visible_child_name("init") def quit(self, sender, item): self.window.close() def on_about(self, sender, item): self.builder.get_object('about_dialog').run() self.builder.get_object('about_dialog').hide() def show_message(self, title, subtitle, ongoing=False, progressive=False): self.builder.get_object('info_title').set_text(title) self.builder.get_object('info_subtitle').set_text(subtitle) if(ongoing): self.builder.get_object('info_spinner').start() else: self.builder.get_object('info_spinner').stop() self.builder.get_object('info_progress').set_visible(progressive) self.builder.get_object('info_reveal').set_reveal_child(True) self.builder.get_object('info_bar').set_show_close_button(not ongoing) def hide_message(self): self.builder.get_object('info_reveal').set_reveal_child(False) def update_message_progress(self, step, steps): self.builder.get_object('info_progress').set_fraction(float(step)/float(steps)) def on_message_close(self, sender, arg): self.hide_message() def switch_activity_id(self, activity_id, file=None): self.current_activity.on_exit() for activity in self.activities: if(activity.id == activity_id): self.switch_activity(activity, file) return True return False ## MAIN ## if __name__ == '__main__': app = App() app.run(sys.argv)