def __init__( self, parent_window, palettes: Dict[str, List[int]], disable_color0=True, allow_adding_removing=False, show_make_unique_button=True ): path = os.path.abspath(os.path.dirname(__file__)) # Deprecated, this option doesn't do anything anymore. color0 is always editable. self.disable_color0 = False self.allow_adding_removing = allow_adding_removing self.show_make_unique_button = show_make_unique_button self.builder = make_builder(os.path.join(path, 'palette_editor.glade')) self.dialog: Gtk.Dialog = self.builder.get_object('map_bg_palettes') self.dialog.set_attached_to(parent_window) self.dialog.set_transient_for(parent_window) self.notebook: Gtk.Notebook = self.builder.get_object('notebook') self.notebook.add_events(Gdk.EventMask.SCROLL_MASK |\ Gdk.EventMask.SMOOTH_SCROLL_MASK) self.page_boxes: List[Gtk.Box] = [] self.tab_keys = list(palettes.keys()) self.palettes = list(palettes.values()) self.builder.connect_signals(self)
def __init__(self, parent_window: Gtk.Window): path = os.path.abspath(os.path.dirname(__file__)) # SkyTemple translation support try: from skytemple.core.ui_utils import make_builder self.builder = make_builder( os.path.join(path, "PyDeSmuMe_controls.glade")) except ImportError: self.builder = Gtk.Builder() self.builder.add_from_file( os.path.join(path, "PyDeSmuMe_controls.glade")) self.window: Gtk.Window = self.builder.get_object('wKeybConfDlg') self.window.set_transient_for(parent_window) self.window.set_attached_to(parent_window) self._keyboard_cfg: Optional[List[int]] = None self._tmp_key = None self.builder.connect_signals(self)
def open(self, main_window): """Open the debugger (if not already opened) and focus it's UI.""" if not self.is_opened(): self._was_opened_once = True self._context = SkyTempleMainDebuggerControlContext(self) builder = make_builder(os.path.join(get_debugger_package_dir(), "debugger.glade")) self._opened_main_window: Gtk.Window = builder.get_object("main_window") self._opened_main_window.set_role("SkyTemple Script Engine Debugger") self._opened_main_window.set_title("SkyTemple Script Engine Debugger") self._opened_main_controller = DebuggerMainController( builder, self._opened_main_window, self._context ) self.handle_project_change() self.main_window = main_window self._opened_main_window.present()
def __init__(self, ssa: Ssa, parent_window: Gtk.Window, sprite_provider: SpriteProvider, level: Pmd2ScriptLevel, map_bg_module, script_module, pos_marks: List[SourceMapPositionMark], pos_mark_to_edit: int): """A controller for a dialog for editing position marks for an Ssb file.""" path = os.path.abspath(os.path.dirname(__file__)) self.builder = make_builder(os.path.join(path, 'pos_mark_editor.glade')) self.sprite_provider = sprite_provider self.ssa: Ssa = ssa self.map_bg_module = map_bg_module self.script_module = script_module self.pos_marks = pos_marks # intial to edit, index self.pos_mark_to_edit = pos_mark_to_edit self.level = level self.mapbg_id = self.level.mapid self._scale_factor = 1 self._bg_draw_is_clicked__location: Optional[Tuple[int, int]] = None self._bg_draw_is_clicked__drag_active = False self._map_bg_width = SIZE_REQUEST_NONE self._map_bg_height = SIZE_REQUEST_NONE self._map_bg_surface = None self._currently_selected_mark: Optional[SourceMapPositionMark] = None self._w_ssa_draw: Gtk.DrawingArea = self.builder.get_object('ssa_draw') self._tileset_drawer_overlay: Optional[MapTilesetOverlay] = None self.drawer: Optional[Drawer] = None self.window: Gtk.Dialog = self.builder.get_object('dialog') self.window.set_transient_for(parent_window) self.window.set_attached_to(parent_window) self.title = _('Edit Position Marks') self.builder.connect_signals(self)
def main(): # TODO: Gtk.Application: https://python-gtk-3-tutorial.readthedocs.io/en/latest/application.html path = os.path.abspath(os.path.dirname(__file__)) # Load settings settings = SkyTempleSettingsStore() if sys.platform.startswith('win'): # Load theming under Windows _load_theme(settings) # Solve issue #12 try: from skytemple_files.common.platform_utils.win import win_set_error_mode win_set_error_mode() except BaseException: # This really shouldn't fail, but it's not important enough to crash over pass if sys.platform.startswith('darwin'): # Load theming under macOS _load_theme(settings) # The search path is wrong if SkyTemple is executed as an .app bundle if getattr(sys, 'frozen', False): path = os.path.dirname(sys.executable) if sys.platform.startswith('linux') and gdk_backend() == GDK_BACKEND_BROADWAY: gtk_settings = Gtk.Settings.get_default() gtk_settings.set_property("gtk-theme-name", 'Arc-Dark') gtk_settings.set_property("gtk-application-prefer-dark-theme", True) itheme: Gtk.IconTheme = Gtk.IconTheme.get_default() itheme.append_search_path(os.path.abspath(icons())) itheme.append_search_path(os.path.abspath(os.path.join(data_dir(), "icons"))) itheme.append_search_path(os.path.abspath(os.path.join(get_debugger_data_dir(), "icons"))) itheme.rescan_if_needed() # Load Builder and Window builder = make_builder(os.path.join(path, "skytemple.glade")) main_window: Window = builder.get_object("main_window") main_window.set_role("SkyTemple") GLib.set_application_name("SkyTemple") GLib.set_prgname("skytemple") # TODO: Deprecated but the only way to set the app title on GNOME...? main_window.set_wmclass("SkyTemple", "SkyTemple") # Load CSS style_provider = Gtk.CssProvider() with open(os.path.join(path, "skytemple.css"), 'rb') as f: css = f.read() style_provider.load_from_data(css) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) # Load async task runner thread AsyncTaskRunner.instance() # Init. core events event_manager = EventManager.instance() if settings.get_integration_discord_enabled(): try: from skytemple.core.events.impl.discord import DiscordPresence discord_listener = DiscordPresence() event_manager.register_listener(discord_listener) except BaseException: pass # Load modules Modules.load() # Load main window + controller MainController(builder, main_window, settings) main_window.present() main_window.set_icon_name('skytemple') try: Gtk.main() except (KeyboardInterrupt, SystemExit): AsyncTaskRunner.end()
def __init__(self, parent_window, incoming_mappings: List[TilemapEntry], tile_graphics: AbstractTileGraphicsProvider, palettes: AbstractTilePalettesProvider, pal_ani_durations: int, animated_tile_graphics: List[ Optional[AbstractTileGraphicsProvider]] = None, animated_tile_durations=0): path = os.path.abspath(os.path.dirname(__file__)) self.builder = make_builder(os.path.join(path, 'chunk_editor.glade')) self.dialog: Gtk.Dialog = self.builder.get_object( 'map_bg_chunk_editor') self.dialog.set_attached_to(parent_window) self.dialog.set_transient_for(parent_window) self.tile_graphics = tile_graphics self.animated_tile_graphics = animated_tile_graphics self.palettes = palettes self.animated_tile_durations = animated_tile_durations self.pal_ani_durations = pal_ani_durations self.current_tile_id = 0 self.current_tile_drawer: DrawerTiled = None self.switching_tile = False self.edited_mappings = [] for mapping in incoming_mappings: self.edited_mappings.append(TilemapEntry.from_int( mapping.to_int())) self.tile_surfaces = [] # For each palette for pal in range(0, len(self.palettes.get())): all_bpc_tiles_for_current_pal = self.tile_graphics.get_pil( self.palettes.get(), pal) tiles_current_pal = [] self.tile_surfaces.append(tiles_current_pal) has_pal_ani = self.palettes.is_palette_affected_by_animation(pal) len_pal_ani = self.palettes.animation_length( ) if has_pal_ani else 1 # BPC tiles # For each tile... for tile_idx in range(0, self.tile_graphics.count()): # For each frame of palette animation... pal_ani_tile = [] tiles_current_pal.append(pal_ani_tile) for pal_ani in range(0, len_pal_ani): # Switch out the palette with that from the palette animation if has_pal_ani: pal_for_frame = itertools.chain.from_iterable( self.palettes.apply_palette_animations(pal_ani)) all_bpc_tiles_for_current_pal.putpalette(pal_for_frame) pal_ani_tile.append([ pil_to_cairo_surface( all_bpc_tiles_for_current_pal.crop( (0, tile_idx * TILE_DIM, TILE_DIM, tile_idx * TILE_DIM + TILE_DIM)).convert('RGBA')) ]) # BPA tiles # For each BPA... if self.animated_tile_graphics is not None: for ani_tile_g in self.animated_tile_graphics: if ani_tile_g is not None: all_bpa_tiles_for_current_pal = ani_tile_g.get_pil( self.palettes.get(), pal) # For each tile... for tile_idx in range(0, ani_tile_g.count()): pal_ani_tile = [] tiles_current_pal.append(pal_ani_tile) # For each frame of palette animation... for pal_ani in range(0, len_pal_ani): bpa_ani_tile = [] pal_ani_tile.append(bpa_ani_tile) # For each frame of BPA animation... for frame in all_bpa_tiles_for_current_pal: # Switch out the palette with that from the palette animation if has_pal_ani: pal_for_frame = itertools.chain.from_iterable( self.palettes. apply_palette_animations(pal_ani)) all_bpc_tiles_for_current_pal.putpalette( pal_for_frame) bpa_ani_tile.append( pil_to_cairo_surface( frame.crop( (0, tile_idx * TILE_DIM, TILE_DIM, tile_idx * TILE_DIM + TILE_DIM)).convert('RGBA'))) self.builder.connect_signals(self) self.dummy_tile_map = [] self.current_tile_picker_palette = 0 for i in range(0, self.tile_graphics.count()): self.dummy_tile_map.append( TilemapEntry(idx=i, pal_idx=self.current_tile_picker_palette, flip_x=False, flip_y=False)) if self.animated_tile_graphics: self.bpa_starts_cursor = len(self.dummy_tile_map) self.bpa_starts = [None, None, None, None] for i, ani_tile_g in enumerate(self.animated_tile_graphics): if ani_tile_g is not None: self.bpa_starts[i] = self.bpa_starts_cursor self.current_tile_picker_palette = 0 for j in range(0, ani_tile_g.count()): self.dummy_tile_map.append( TilemapEntry( idx=self.bpa_starts_cursor + j, pal_idx=self.current_tile_picker_palette, flip_x=False, flip_y=False)) self.bpa_starts_cursor += ani_tile_g.count()
def _get_builder(pymodule_path: str, glade_file: str): path = os.path.abspath(os.path.dirname(pymodule_path)) return make_builder(os.path.join(path, glade_file))