#!/usr/bin/env python # Sketch - A Python-based interactive drawing program # Copyright (C) 2000, 2001 by Bernhard Herzog # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA '''\ skshow [options] file1 [file2 ...] A slideshow for sketch files. Use space/backspace or left and right mouse button for navigation. Options: -h, --help Print this help message --keep Keep files in memory after loading them --preload Load the next file in advance while the old one is shown --fit Fit drawing in window --display=DISP The X display to use --geometry=GEO The size and/or position of the window in the form WxH+X+Y ''' import sys, getopt class Options: display = None geometry = '640x480' keep = 0 preload = 0 fit = 0 files = [] def parse_options(): try: opts, args = getopt.getopt(sys.argv[1:], "h", ["display=", "geometry=", "keep", "preload", "fit" , "help"]) except getopt.error: sys.stderr.write(__doc__) sys.exit(0) for opt, value in opts: if opt == "--display": Options.display = value elif opt == "--geometry": Options.geometry = value elif opt == "--keep": Options.keep = 1 elif opt == "--preload": Options.preload = 1 elif opt == "--fit": Options.fit = 1 elif opt in ("-h", "--help"): sys.stderr.write(__doc__) sys.exit(0) Options.files = args parse_options() import Sketch Sketch.init_ui() import Sketch.UI.skapp, Sketch.UI.view, Sketch.load from Tkinter import BOTH class ShowView(Sketch.UI.view.SketchView): def __init__(self, master=None, toplevel = None, double_buffer = 1, show_page_outline = 0, **kw): apply(Sketch.UI.view.SketchView.__init__, (self, master), kw) self.double_buffer = double_buffer self.show_page_outline = show_page_outline def do_clear(self, region): if not self.double_buffer: Sketch.UI.view.SketchView.do_clear(self, region) def RedrawMethod(self, region = None): if self.double_buffer: self.gc.StartDblBuffer() Sketch.UI.view.SketchView.RedrawMethod(self, region) if self.double_buffer: self.gc.EndDblBuffer() self.tkwin.Sync() class MainWindow: def __init__(self, app, files, keep = 0, preload = 0): self.application = app self.files = files self.keep = keep self.preload = preload self.docs = [None] * len(self.files) self.current = 0 self.autofill = 1 self.build_window() self.bind_events() def build_window(self): root = self.application.root self.view = ShowView(root, toplevel = root) self.view.pack(fill = BOTH, expand = 1) self.view.focus() def bind_events(self): self.view.bind("", self.view_resized) self.view.bind("", self.view_resized) self.view.bind("", self.Exit) for event in ("<1>", "", ""): self.view.bind(event, self.next_file) for event in ("<3>", "

", ""): self.view.bind(event, self.previous_file) def adjust_view(self): if self.autofill: if Options.fit: self.view.FitToWindow() else: self.view.FitPageToWindow() #self.view.SetScale(1.0) #self.view.SetCenter((512, 384), move_contents = 0) def view_resized(self, event): self.adjust_view() def next_file(self, *args): which = self.current + 1 if which < len(self.files): self.current = which self.load_file(which) def previous_file(self, event): which = self.current - 1 if which >= 0: self.current = which self.load_file(which) def load_file(self, which): if self.docs[which] is None: filename = self.files[which] doc = Sketch.load.load_drawing(filename) self.docs[which] = doc else: doc = self.docs[which] self.view.SetDocument(doc) self.adjust_view() if not self.keep and which > 0 and self.docs[which - 1] is not None: self.docs[which - 1].Destroy() self.docs[which - 1] = None if self.preload: self.view.after_idle(self.preload_files) def preload_files(self, *args): next = self.current + 1 if next < len(self.docs) and not self.docs[next]: filename = self.files[next] doc = Sketch.load.load_drawing(filename) self.docs[next] = doc def Exit(self, *args): self.application.Exit() def Run(self): self.load_file(0) self.application.Mainloop() class SketchShowApplication(Sketch.UI.skapp.TkApplication): tk_basename = 'sketchshow' tk_class_name = 'SketchShow' def __init__(self, files, screen_name = None, geometry = None, keep = 0, preload = 0): Sketch.UI.skapp.TkApplication.__init__(self, screen_name = screen_name, geometry = geometry) self.files = files self.build_window(keep, preload) def init_tk(self, screen_name = None, geometry = None): Sketch.UI.skapp.TkApplication.init_tk(self, screen_name = screen_name, geometry = geometry) Sketch.init_modules_from_widget(self.root) def build_window(self, keep, preload): #self.root.wm_maxsize(1024, 768) self.main_window = MainWindow(self, self.files, keep = keep, preload = preload) def Run(self): self.main_window.Run() def Exit(self): self.root.destroy() app = SketchShowApplication(Options.files, screen_name = Options.display, geometry = Options.geometry, keep = Options.keep, preload = Options.preload) app.Run()