コード例 #1
0
    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)
コード例 #2
0
 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)
コード例 #3
0
ファイル: manager.py プロジェクト: marius851000/skytemple
    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()
コード例 #4
0
    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)
コード例 #5
0
ファイル: main.py プロジェクト: marius851000/skytemple
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()
コード例 #6
0
ファイル: chunk_editor.py プロジェクト: tech-ticks/skytemple
    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()
コード例 #7
0
ファイル: gfxcrunch.py プロジェクト: marius851000/skytemple
 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))