Beispiel #1
0
    def __init__(self, buff, appwin, readonly = False):
        
        # Save params
        self.appwin = appwin; 

        self.readonly = readonly      
                
        # Gather globals
        self.keyh = pedconfig.conf.keyh

        # Init vars
        self.xpos = 0; self.ypos = 0
        self.changed = False; 
        self.needscan = True; 
        self.record = False; 
        self.recarr = []                # Macros
        self.undoarr = []               # Undo
        self.redoarr = []               # Redo
        self.colsel = False
        self.oldsearch = ""
        self.oldrep = ""
        self.xsel = -1; self.ysel = -1
        self.xsel2 = -1; self.ysel2 = -1
        self.mx = -1; self.my = -1    
        self.caret = []; self.caret.append(0); self.caret.append(0)        
        self.focus = False
        self.insert = True       
        self.startxxx = -1;  self.startyyy = -1
        self.hex = False
        self.accum = []; 
        self.bigcaret = False                
        
        # Init configurables
        self.scgap = SCROLLGAP      
        self.pgup  = PAGEUP
        self.tabstop = TABSTOP

        # Process buffer into list
        self.text = buff
        self.maxlinelen = 0
     
        # Parent widget                 
        gtk.DrawingArea.__init__(self)
        self.set_flags(gtk.CAN_FOCUS | gtk.SENSITIVE)
        self.pangolayout = self.create_pango_layout("a")
    
        if self.readonly:
            self.set_tooltip_text("Read only buffer")
       
        # Our font
        fd = pango.FontDescription()
        fd.set_size(14*1024); fd.set_family("mono")
        self.pangolayout.set_font_description(fd)

        # Get Pango steps
        self.cxx, self.cyy = self.pangolayout.get_pixel_size()
        ts = self.pangolayout.get_tabs()
        if ts == None: self.tabstop = TABSTOP    
        else: al, self.tabstop = ts.get_tab(0)

        #print "tabstop", self.tabstop
        
        sm = len(self.text) + self.get_height() / self.cyy + 10
        self.hadj = gtk.Adjustment(0, 0, self.maxlinelen, 1, 15, 25);
        self.vadj = gtk.Adjustment(0, 0, sm, 1, 15, 25)
        
        self.vscroll = gtk.VScrollbar(self.vadj)
        self.hscroll = gtk.HScrollbar(self.hadj)
        
        # We connect scrollers after construction
        self.hadj.connect("value-changed", self.hscroll_cb)
        self.vadj.connect("value-changed", self.vscroll_cb)

        self.set_events(    gtk.gdk.POINTER_MOTION_MASK |
                            gtk.gdk.POINTER_MOTION_HINT_MASK |
                            gtk.gdk.BUTTON_PRESS_MASK |
                            gtk.gdk.BUTTON_RELEASE_MASK |
                            gtk.gdk.KEY_PRESS_MASK |
                            gtk.gdk.KEY_RELEASE_MASK )
    
        self.set_events(    gtk.gdk.ALL_EVENTS_MASK )

        self.colormap = gtk.widget_get_default_colormap()

        # Set default background color
        if self.readonly:
            color = self.colormap.alloc_color("#d8d8d8")
            self.modify_bg(gtk.STATE_NORMAL, color)
        
        # Customize your colors here
        
        self.fgcolor  = self.colormap.alloc_color(FGCOLOR)              
        self.rbgcolor = self.colormap.alloc_color(RBGCOLOR)              
        self.cbgcolor = self.colormap.alloc_color(CBGCOLOR)              
        self.kwcolor  = self.colormap.alloc_color(KWCOLOR)
        self.clcolor  = self.colormap.alloc_color(CLCOLOR)
        self.cocolor  = self.colormap.alloc_color(COCOLOR)
        self.stcolor  = self.colormap.alloc_color(STCOLOR)

        self.connect("expose-event", self.area_expose_cb)
        self.connect("motion-notify-event", self.area_motion)
        self.connect("button-press-event", self.area_button)
        self.connect("button-release-event", self.area_button)
        self.connect("key-press-event", self.area_key)
        self.connect("key-release-event", self.area_key)
        self.connect("focus", self.area_focus)
        self.connect("configure_event", self.configure_event)
        self.connect("size-request", self.size_request)
        self.connect("size-allocate", self.size_alloc)    
        self.connect("scroll-event", self.scroll_event)    
        #self.connect("enter-notify-event", self.area_enter)
        #self.connect("leave-notify-event", self.area_leave)
        self.connect("focus-in-event", self.focus_in_cb)    
        self.connect("focus-out-event", self.focus_out_cb)    
        self.aaa = 0
Beispiel #2
0
    def __init__(self, project, mainview, small=False):
        """
		Creates a new instance of RecordingView.
		
		Parameters:
			project -- the currently active Project.
			mainview -- the main Jokosher window (MainApp).
			small -- set to True if we want small edit views (i.e. for the mixing view).
		"""
        gtk.Frame.__init__(self)

        self.project = project
        self.mainview = mainview
        self.small = small
        self.timelinebar = TimeLineBar.TimeLineBar(self.project, mainview)

        self.errorMessageArea = None
        self.restoreMessageArea = None
        self.unsetNameMessageArea = None

        ## create darker workspace box
        self.eventBox = gtk.EventBox()
        self.eventBox.connect("button-press-event",
                              self.OnEmptySpaceDoubleClicked)

        self.vbox = gtk.VBox()
        self.add(self.vbox)
        self.vbox.pack_start(self.timelinebar, False, False)
        self.instrumentWindow = gtk.ScrolledWindow()
        self.instrumentBox = gtk.VBox()

        ## pack the instrument box inside the eventbox as you cant modify the color of a gtk.Box
        self.eventBox.add(self.instrumentBox)
        self.instrumentWindow.add_with_viewport(self.eventBox)
        self.instrumentWindow.set_policy(gtk.POLICY_NEVER,
                                         gtk.POLICY_AUTOMATIC)
        self.vbox.pack_start(self.instrumentWindow, True, True)
        self.instrumentWindow.child.set_shadow_type(gtk.SHADOW_NONE)
        self.views = []

        self.header_size_group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
        self.header_size_group.add_widget(self.timelinebar.GetHeaderWidget())

        self.hb = gtk.HBox()
        self.hb.set_spacing(6)
        self.hb.set_border_width(6)
        self.vbox.pack_end(self.hb, False, False)
        self.vbox.pack_end(gtk.HSeparator(), False, False)

        self.zoom_hb = gtk.HBox()
        self.zoom_hb.set_spacing(6)
        self.zoom_hb.set_border_width(0)
        self.header_size_group.add_widget(self.zoom_hb)

        self.scrollRange = gtk.Adjustment()
        self.scrollBar = gtk.HScrollbar(self.scrollRange)

        self.hb.pack_start(self.zoom_hb, False, False)
        self.hb.pack_start(self.scrollBar, True, True)

        self.lastzoom = 0

        self.zoomSlider = gtk.HScale()
        self.zoomSlider.set_size_request(70, -1)

        self.zoomSlider.set_range(self.ZOOM_MIN_SCALE, self.ZOOM_MAX_SCALE)
        self.zoomSlider.set_increments(0.2, 0.2)
        self.zoomSlider.set_draw_value(False)
        self.zoomSlider.set_value(self.project.viewScale)
        self.zoomSlider.set_tooltip_text(
            _("Zoom the timeline - Right-Click to reset to the default level"))

        self.zoomSlider.connect("value-changed", self.OnZoom)
        self.zoomSlider.connect("button-press-event", self.OnZoomReset)

        self.inbutton = gtk.Button()
        inimg = gtk.image_new_from_stock(gtk.STOCK_ZOOM_IN,
                                         gtk.ICON_SIZE_BUTTON)
        self.inbutton.set_image(inimg)
        self.inbutton.set_relief(gtk.RELIEF_NONE)
        self.inbutton.set_tooltip_text(_("Zoom in timeline"))
        self.inbutton.connect("clicked", self.OnZoomIn)

        self.outbutton = gtk.Button()
        outimg = gtk.image_new_from_stock(gtk.STOCK_ZOOM_OUT,
                                          gtk.ICON_SIZE_BUTTON)
        self.outbutton.set_image(outimg)
        self.outbutton.set_relief(gtk.RELIEF_NONE)
        self.outbutton.set_tooltip_text(_("Zoom out timeline"))
        self.outbutton.connect("clicked", self.OnZoomOut)

        self.zoom_hb.pack_start(self.outbutton, False, False)
        self.zoom_hb.pack_start(self.zoomSlider, False, False)
        self.zoom_hb.pack_start(self.inbutton, False, False)

        self.centreViewOnPosition = False
        self.scrollRange.lower = 0
        self.scrollRange.upper = 100
        self.scrollRange.value = 0
        self.scrollRange.step_increment = 1

        self.scrollBar.connect("value-changed", self.OnScroll)
        self.connect("expose-event", self.OnExpose)
        self.connect("button_release_event", self.OnExpose)
        self.connect("button_press_event", self.OnMouseDown)

        #connect to the project signals
        self.project.connect("gst-bus-error", self.OnProjectGstError)
        self.project.connect("incremental-save", self.OnProjectIncSave)
        self.project.connect("instrument::added", self.OnInstrumentAdded)
        self.project.connect("instrument::reordered",
                             self.OnInstrumentReordered)
        self.project.connect("instrument::removed", self.OnInstrumentRemoved)
        self.project.connect("view-start", self.OnViewStartChanged)

        self.vbox.drag_dest_set(gtk.DEST_DEFAULT_DROP, self.DRAG_TARGETS,
                                gtk.gdk.ACTION_COPY)
        self.vbox.connect("drag_data_received", self.OnDragDataReceived)
        self.vbox.connect("drag_motion", self.OnDragMotion)

        #add the instruments that were loaded from the project file already
        for instr in self.project.instruments:
            self.OnInstrumentAdded(project, instr)

        self.show_all()
        self.show_all()
        if self.small:
            self.inbutton.hide()
            self.outbutton.hide()
            self.zoomSlider.hide()

        if self.project.CanDoIncrementalRestore():
            message = _("Would you like to restore the current project?")
            details = _(
                "A crash was detected and changes to your project were not saved.\nIf you would like, you can attempt to recover these lost changes."
            )

            msg_area = MessageArea.MessageArea()
            msg_area.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
            msg_area.add_stock_button_with_text(_("_Restore Project"),
                                                gtk.STOCK_APPLY,
                                                gtk.RESPONSE_OK)
            msg_area.set_text_and_icon(gtk.STOCK_DIALOG_QUESTION, message,
                                       details)

            msg_area.connect("response", self.OnRestoreMessageAreaResponse,
                             msg_area)
            msg_area.connect("close", self.OnRestoreMessageAreaClose, msg_area)

            self.vbox.pack_end(msg_area, False, False)
            msg_area.show()
            self.restoreMessageArea = msg_area
        elif self.project.name_is_unset:
            self.ShowUnsetProjectNameMessage()
    def __init__(self,
                 modelCollection,
                 programSettings,
                 width=250,
                 console=None,
                 customFunctions=None):
        # Call super class init function.
        gtk.VBox.__init__(self)

        # Internalise parameters.
        self.modelCollection = modelCollection
        self.console = console
        self.customFunctions = customFunctions

        # Reference to image.
        #		self.image = self.modelCollection.sliceImage

        # Get parent width and set height according to projector aspect ratio.
        aspect = float(programSettings['projectorSizeY'].value) / float(
            programSettings['projectorSizeX'].value)
        self.width = width  #250
        self.height = int(self.width * aspect)

        # Create image view.
        self.imageView = gtk.Image()
        # Create black dummy image.
        self.imageBlack = numpy.zeros((self.height, self.width, 3),
                                      numpy.uint8)
        # Create pixbuf from numpy.
        self.pixbuf = gtk.gdk.pixbuf_new_from_array(self.imageBlack,
                                                    gtk.gdk.COLORSPACE_RGB, 8)
        # Set image to viewer.
        self.imageView.set_from_pixbuf(self.pixbuf)
        self.pack_start(self.imageView, expand=True, fill=True)
        self.imageView.show()

        # Create slider.
        self.slider = gtk.HScrollbar()
        self.pack_start(self.slider, expand=True, fill=True)
        self.slider.set_range(1, 100)
        self.slider.set_value(1)
        self.slider.set_round_digits(0)
        self.slider.show()
        # Connect event handler. We only want to update if the button was released.
        self.slider.connect("value-changed", self.callbackScroll)
        #		self.slider.connect("button-release-event", self.callbackScroll)

        # Create current slice label.
        self.labelBox = gtk.HBox()
        self.pack_start(self.labelBox, expand=True, fill=True)
        self.labelBox.show()
        # Create labels.
        self.minLabel = gtk.Label('1')
        self.labelBox.pack_start(self.minLabel, expand=False)
        self.minLabel.show()
        self.currentLabel = gtk.Label('1')
        self.labelBox.pack_start(self.currentLabel, expand=True, fill=True)
        self.currentLabel.show()
        self.maxLabel = gtk.Label('1')
        self.labelBox.pack_start(self.maxLabel, expand=False)
        self.maxLabel.show()
    def build_prop_dialog(self):
        dlg = gtk.Dialog('Properties')
        #dlg.set_size_request(400,200)

        vbox = dlg.vbox

        frame = gtk.Frame('Opacity')
        frame.show()
        frame.set_border_width(5)
        vbox.pack_start(frame, False, False)

        table = gtk.Table(2, 2)
        table.set_homogeneous(False)
        table.show()
        table.set_col_spacings(3)
        table.set_row_spacings(3)
        table.set_border_width(3)
        frame.add(table)

        #EitanP -  start
        frame_size = gtk.Frame('Markers Size')
        frame_size.show()
        frame_size.set_border_width(5)
        vbox.pack_start(frame_size, False, False)

        table_size = gtk.Table(2, 2)
        table_size.set_homogeneous(False)
        table_size.show()
        table_size.set_col_spacings(3)
        table_size.set_row_spacings(3)
        table_size.set_border_width(3)
        frame_size.add(table_size)
        #EitanP -  end

        label = gtk.Label('Plane')
        label.show()

        def set_plane_opacity(bar):
            pwx, pwy, pwz = self.get_plane_widgets()
            val = bar.get_value()
            pwx.GetTexturePlaneProperty().SetOpacity(val)
            pwx.GetPlaneProperty().SetOpacity(val)
            pwy.GetTexturePlaneProperty().SetOpacity(val)
            pwy.GetPlaneProperty().SetOpacity(val)
            pwz.GetTexturePlaneProperty().SetOpacity(val)
            pwz.GetPlaneProperty().SetOpacity(val)
            self.owner.pwxyz.Render()

        scrollbar = gtk.HScrollbar()
        scrollbar.show()
        scrollbar.set_range(0, 1)
        scrollbar.set_value(1)
        scrollbar.connect('value_changed', set_plane_opacity)
        scrollbar.set_size_request(300, 20)

        table.attach(label, 0, 1, 0, 1)
        table.attach(scrollbar, 1, 2, 0, 1)

        label = gtk.Label('Markers')
        label.show()

        def set_marker_opacity(bar):
            val = bar.get_value()
            for marker in EventHandler().get_markers_as_seq():
                marker.GetProperty().SetOpacity(val)

            self.owner.pwxyz.Render()

        scrollbar = gtk.HScrollbar()
        scrollbar.show()
        scrollbar.set_range(0, 1)
        scrollbar.set_value(1)
        scrollbar.connect('value_changed', set_marker_opacity)
        scrollbar.set_size_request(300, 20)

        table.attach(label, 0, 1, 1, 2)
        table.attach(scrollbar, 1, 2, 1, 2)

        #EitanP -  start
        label = gtk.Label('Markers')
        label.show()

        def set_marker_size(bar):
            val = bar.get_value()
            for marker in EventHandler().get_markers_as_seq():
                marker.set_size(val)
            self.owner.pwxyz.Render()

            self.owner.pwxyz.Render()

        scrollbar_size = gtk.HScrollbar()
        scrollbar_size.show()
        scrollbar_size.set_range(0, 20)
        scrollbar_size.set_value(1)
        scrollbar_size.connect('value_changed', set_marker_size)
        scrollbar_size.set_size_request(300, 20)
        table_size.attach(scrollbar_size, 0, 1, 1, 2)
        #EitanP -  end

        button = gtk.Button('Hide')
        button.show()
        button.set_use_stock(True)
        button.set_label(gtk.STOCK_CANCEL)

        def hide(button):
            self.propDialog.hide()
            return True

        button.connect('clicked', hide)
        vbox.pack_start(button, False, False)

        dlg.hide()
        self.propDialog = dlg
Beispiel #5
0
 def __init__(self, tareas):
     """
     days es el número de días totales que se pueden representar. Los que 
     actualmente se muestren depende del zoom aplicado.
     tareas es el conjunto de datos *inicial* a ser mostrado. El valor en 
     cada momento (self.tareas) puede ser diferente en función de las 
     operaciones con el backend.
     """
     self.ventana = gtk.Window()
     self.ventana.set_size_request(800, 400)
     self.ventana.connect("delete_event", lambda *a, **kw: gtk.main_quit())
     self.ventana.connect("destroy", lambda *a, **kw: gtk.main_quit())
     self.container = gtk.VBox()
     self.grafica = gtk.HBox()
     self.container.pack_start(self.grafica)
     self.container.set_property("border-width", 5)
     self.controls = gtk.VBox()
     self.lower_controls = gtk.HBox()
     self.lower_controls.set_property("homogeneous", True)
     self.lower_controls.set_property("spacing", 10)
     self.b_salir = gtk.Button(stock = gtk.STOCK_QUIT)
     self.b_salir.connect("clicked", self.__salir)
     self.lower_controls.add(self.b_salir)
     # El valor más alto que se puede obtener es upper - page_size 
     self.zoom = gtk.Adjustment(62.0, 1.0, 365.0 + 31.0, 1.0, 31.0, 31.0)
     self.zoom_level = 62
     self.slider = gtk.HScale(self.zoom)
     self.slider.set_digits(0)
     self.slider.get_layout().set_font_description(
         pango.FontDescription("monospace 8"))
     for i in range(31, 365, 31):
         try:
             self.slider.add_mark(i, gtk.POS_TOP, None)
         except AttributeError:
             pass    # Versión de pygtk sin add_mark
     self.lower_controls.add(self.slider)
     self.slider.connect("value-changed", self._update_zoom)
     if not tareas:
         days = 0
     else:
         days = (max(tareas, key = lambda t: t.fin).fin  
                 - min(tareas, key = lambda t: t.ini).ini).days
     self.scrollbar = gtk.HScrollbar()
     self.adj_scroll = gtk.Adjustment(0, 0, days + 10, 1, 10, 10)
     self.scrollbar.set_adjustment(self.adj_scroll)
     self.controls.pack_start(self.scrollbar, expand = False)
     self.first_day = 0
     self.adj_scroll.connect("value-changed", self._update_first_day)
     self.b_vista = gtk.ToggleButton("Ver por línea")
     self.b_vista.connect("toggled", self._cambiar_vista)
     self.lower_controls.pack_end(self.b_vista, expand = False)
     self.controls.pack_start(self.lower_controls, expand = False)
     self.container.pack_start(self.controls, expand = False)
     self.ventana.add(self.container)
     self.ventana.set_title("Vista por empleado")
     self.vista_por_empleado = True
     #tareas.sort(key = lambda t: t.fecha)
     self.tareas = tareas
     self.load_escena()
     self.grafica.add(self.escena)
     self.ventana.show_all()
Beispiel #6
0
win.connect("destroy", gtk.main_quit)

table = gtk.Table()
win.add(table)

row, col = 0, 0

drawing_area = gtk.DrawingArea()
# drawing_area.set_size_request(100, 100)
pack(drawing_area, row, col)
row += 1

vscroll = gtk.VScrollbar()
pack(vscroll, 0, 1)

hscroll = gtk.HScrollbar()
pack(hscroll, row, col)
row += 1

notebook = gtk.Notebook()
label = gtk.Label("Label")
notebook.append_page(label)
label = gtk.Label("Label")
notebook.append_page(label)
pack(notebook, row, col)
row += 1

button = gtk.Button("Button")
pack(button, row, col)
row += 1
if conf.fftw is None:
    wait_for_info.wait()
wait_for_info.release()

da_width = conf.borderleft + conf.fftw + conf.histow + conf.histooffs
da_height = conf.drawingheight

# Put it into layout into table with horizontal scrolling.
layout = gtk.Layout(None, None)
layout.set_size_request(1024, da_height)
layout.set_size(da_width, da_height)
table = gtk.Table(2, 1, False)
table.attach(layout, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND,
             0, 0)

hScrollbar = gtk.HScrollbar(None)
table.attach(hScrollbar, 0, 1, 1, 2, gtk.FILL | gtk.SHRINK,
             gtk.FILL | gtk.SHRINK, 0, 0)

hAdjust = layout.get_hadjustment()
hScrollbar.set_adjustment(hAdjust)

drawing_area = gtk.DrawingArea()
drawing_area.set_size_request(da_width, da_height)
drawing_area.connect("realize", steal_sdl_window)
drawing_area.connect("expose-event", da_expose_event)
drawing_area.show()

drawing_area.connect("button_press_event", da_press)
drawing_area.connect("button_release_event", da_press)
drawing_area.connect("scroll-event", da_scroll)
Beispiel #8
0
    def update_segments_frame(self):
        'Update the segment props with the latest segments'

        vbox = self.vboxSegPropsFrame

        widgets = vbox.get_children()
        for w in widgets:
            vbox.remove(w)

        names = self.paramd.keys()

        if not len(names):
            label = gtk.Label('No segments')
            label.show()
            vbox.pack_start(label)
            return

        names.sort()
        numrows = len(names) + 1
        numcols = 2

        table = gtk.Table(numrows, numcols)
        table.set_col_spacings(3)
        table.show()
        vbox.pack_start(table, True, True)

        delete = gtk.Label('Hide')
        delete.show()
        opacity = gtk.Label('Opacity')
        opacity.show()

        table.attach(delete, 0, 1, 0, 1, xoptions=gtk.FILL, yoptions=0)
        table.attach(opacity,
                     1,
                     2,
                     0,
                     1,
                     xoptions=gtk.EXPAND | gtk.FILL,
                     yoptions=0)
        deleteButtons = {}
        opacityBars = {}

        class OpacityCallback:
            def __init__(self, sr, name, paramd):
                """
                sr is the surf renderer instance
                name is the name of the surface
                paramd is the dict mapping names to objects

                You don't want to pass the object itself because it is
                bound at init time but you to be able to dynamically
                update
                """
                self.name = name
                self.sr = sr
                self.paramd = paramd

            def __call__(self, bar):
                val = bar.get_value()
                self.paramd[self.name].isoActor.GetProperty().SetOpacity(val)

        class HideCallback:
            def __init__(self, sr, name, paramd):
                """
                sr is the surf renderer instance
                name is the name of the surface
                paramd is the dict mapping names to objects

                You don't want to pass the object itself because it is
                bound at init time but you to be able to dynamically
                update                
                """
                self.sr = sr
                self.name = name
                self.paramd = paramd
                self.removed = False

            def __call__(self, button):

                if button.get_active():
                    self.paramd[self.name].isoActor.VisibilityOff()
                else:
                    self.paramd[self.name].isoActor.VisibilityOn()
                self.sr.Render()

        rownum = 1
        for name in names:
            hideCallback = HideCallback(self.sr, name, self.paramd)
            opacityCallback = OpacityCallback(self.sr, name, self.paramd)
            b = gtk.CheckButton(name)
            b.show()
            b.set_active(False)
            b.connect('toggled', hideCallback)
            table.attach(b,
                         0,
                         1,
                         rownum,
                         rownum + 1,
                         xoptions=False,
                         yoptions=False)
            deleteButtons[name] = b

            scrollbar = gtk.HScrollbar()
            scrollbar.show()
            scrollbar.set_size_request(*self.SCROLLBARSIZE)
            table.attach(scrollbar,
                         1,
                         2,
                         rownum,
                         rownum + 1,
                         xoptions=True,
                         yoptions=False)

            scrollbar.set_range(0, 1)
            scrollbar.set_increments(.05, .2)
            scrollbar.set_value(1.0)

            scrollbar.connect('value_changed', opacityCallback)
            rownum += 1
Beispiel #9
0
    def __init__(self, fullscreen=False, show_library=False, open_path=None,
            open_page=1):
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)

        # ----------------------------------------------------------------
        # Attributes
        # ----------------------------------------------------------------
        self.is_fullscreen = False
        self.is_double_page = False
        self.is_manga_mode = False
        self.is_virtual_double_page = False # I.e. a wide image is displayed
        self.zoom_mode = preferences.ZOOM_MODE_BEST
        self.width = None
        self.height = None

        self._manual_zoom = 100 # In percent of original image size
        self._waiting_for_redraw = False

        self.file_handler = filehandler.FileHandler(self)
        self.thumbnailsidebar = thumbbar.ThumbnailSidebar(self)
        self.statusbar = status.Statusbar()
        self.slideshow = slideshow.Slideshow(self)
        self.cursor_handler = cursor.CursorHandler(self)
        self.enhancer = enhance.ImageEnhancer(self)
        self.glass = lens.MagnifyingGlass(self)
        self.ui_manager = ui.MainUI(self)
        self.menubar = self.ui_manager.get_widget('/Menu')
        self.toolbar = self.ui_manager.get_widget('/Tool')
        self.popup = self.ui_manager.get_widget('/Popup')
        self.actiongroup = self.ui_manager.get_action_groups()[0]
        self.left_image = gtk.Image()
        self.right_image = gtk.Image()

        self._image_box = gtk.HBox(False, 2)
        self._main_layout = gtk.Layout()
        self._event_handler = event.EventHandler(self)
        self._vadjust = self._main_layout.get_vadjustment()
        self._hadjust = self._main_layout.get_hadjustment()
        self._vscroll = gtk.VScrollbar(self._vadjust)
        self._hscroll = gtk.HScrollbar(self._hadjust)

        # ----------------------------------------------------------------
        # Setup
        # ----------------------------------------------------------------
        self.set_title('Comix')
        self.set_size_request(300, 300)  # Avoid making the window *too* small
        self.resize(prefs['window width'], prefs['window height'])

        # This is a hack to get the focus away from the toolbar so that
        # we don't activate it with space or some other key (alternative?)
        self.toolbar.set_focus_child(
            self.ui_manager.get_widget('/Tool/expander'))
        self.toolbar.set_style(gtk.TOOLBAR_ICONS)

        self._image_box.add(self.left_image)
        self._image_box.add(self.right_image)
        self._image_box.show_all()

        self._main_layout.put(self._image_box, 0, 0)
        self.set_bg_colour(prefs['bg colour'])

        self._vadjust.step_increment = 15
        self._vadjust.page_increment = 1
        self._hadjust.step_increment = 15
        self._hadjust.page_increment = 1

        table = gtk.Table(2, 2, False)
        table.attach(self.thumbnailsidebar, 0, 1, 2, 5, gtk.FILL,
            gtk.FILL|gtk.EXPAND, 0, 0)
        table.attach(self._main_layout, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND,
            gtk.FILL|gtk.EXPAND, 0, 0)
        table.attach(self._vscroll, 2, 3, 2, 3, gtk.FILL|gtk.SHRINK,
            gtk.FILL|gtk.SHRINK, 0, 0)
        table.attach(self._hscroll, 1, 2, 4, 5, gtk.FILL|gtk.SHRINK,
            gtk.FILL, 0, 0)
        table.attach(self.menubar, 0, 3, 0, 1, gtk.FILL|gtk.SHRINK,
            gtk.FILL, 0, 0)
        table.attach(self.toolbar, 0, 3, 1, 2, gtk.FILL|gtk.SHRINK,
            gtk.FILL, 0, 0)
        table.attach(self.statusbar, 0, 3, 5, 6, gtk.FILL|gtk.SHRINK,
            gtk.FILL, 0, 0)

        if prefs['default double page']:
            self.actiongroup.get_action('double_page').activate()
        if prefs['default fullscreen'] or fullscreen:
            self.actiongroup.get_action('fullscreen').activate()
        if prefs['default manga mode']:
            self.actiongroup.get_action('manga_mode').activate()
        if prefs['default zoom mode'] == preferences.ZOOM_MODE_BEST:
            self.actiongroup.get_action('best_fit_mode').activate()
        elif prefs['default zoom mode'] == preferences.ZOOM_MODE_WIDTH:
            self.actiongroup.get_action('fit_width_mode').activate()
        elif prefs['default zoom mode'] == preferences.ZOOM_MODE_HEIGHT:
            self.actiongroup.get_action('fit_height_mode').activate()
        elif prefs['default zoom mode'] == preferences.ZOOM_MODE_MANUAL:
            # This little ugly hack is to get the activate call on
            # 'fit_manual_mode' to actually create an event (and callback).
            # Since manual mode is the default selected radio button action
            # it won't send an event if we activate it when it is already
            # the selected one.
            self.actiongroup.get_action('best_fit_mode').activate()
            self.actiongroup.get_action('fit_manual_mode').activate()
        if prefs['show toolbar']:
            prefs['show toolbar'] = False
            self.actiongroup.get_action('toolbar').activate()
        if prefs['show menubar']:
            prefs['show menubar'] = False
            self.actiongroup.get_action('menubar').activate()
        if prefs['show statusbar']:
            prefs['show statusbar'] = False
            self.actiongroup.get_action('statusbar').activate()
        if prefs['show scrollbar']:
            prefs['show scrollbar'] = False
            self.actiongroup.get_action('scrollbar').activate()
        if prefs['show thumbnails']:
            prefs['show thumbnails'] = False
            self.actiongroup.get_action('thumbnails').activate()
        if prefs['hide all']:
            prefs['hide all'] = False
            self.actiongroup.get_action('hide all').activate()
        if prefs['keep transformation']:
            prefs['keep transformation'] = False
            self.actiongroup.get_action('keep_transformation').activate()
        else:
            prefs['rotation'] = 0
            prefs['vertical flip'] = False
            prefs['horizontal flip'] = False

        self.add(table)
        table.show()
        self._main_layout.show()
        self._display_active_widgets()

        self._main_layout.set_events(gtk.gdk.BUTTON1_MOTION_MASK |
                                     gtk.gdk.BUTTON2_MOTION_MASK |
                                     gtk.gdk.BUTTON_PRESS_MASK |
                                     gtk.gdk.BUTTON_RELEASE_MASK |
                                     gtk.gdk.POINTER_MOTION_MASK)
        self._main_layout.drag_dest_set(gtk.DEST_DEFAULT_ALL,
                                        [('text/uri-list', 0, 0)],
                                        gtk.gdk.ACTION_COPY |
                                        gtk.gdk.ACTION_MOVE)

        self.connect('delete_event', self.terminate_program)
        self.connect('key_press_event', self._event_handler.key_press_event)
        self.connect('configure_event', self._event_handler.resize_event)
        self._main_layout.connect('button_release_event',
            self._event_handler.mouse_release_event)
        self._main_layout.connect('scroll_event',
            self._event_handler.scroll_wheel_event)
        self._main_layout.connect('button_press_event',
            self._event_handler.mouse_press_event)
        self._main_layout.connect('motion_notify_event',
            self._event_handler.mouse_move_event)
        self._main_layout.connect('drag_data_received',
            self._event_handler.drag_n_drop_event)

        self.ui_manager.set_sensitivities()
        self.show()
        if open_path is not None:
            self.file_handler.open_file(open_path, open_page)
        if show_library:
            self.actiongroup.get_action('library').activate()
Beispiel #10
0
    def __init__(self,
                 fullscreen=False,
                 is_slideshow=slideshow,
                 show_library=False,
                 manga_mode=False,
                 double_page=False,
                 zoom_mode=None,
                 open_path=None,
                 open_page=1):
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)

        # ----------------------------------------------------------------
        # Attributes
        # ----------------------------------------------------------------
        self.is_in_focus = True
        self.is_fullscreen = False
        self.is_double_page = False
        self.is_manga_mode = False
        self.is_virtual_double_page = False  # I.e. a wide image is displayed
        self.width = None
        self.height = None
        self.was_out_of_focus = False
        #: Used to remember if changing to fullscreen enabled 'Hide all'
        self.hide_all_forced = False

        self._manual_zoom = 100  # In percent of original image size
        self._waiting_for_redraw = False

        self._image_box = gtk.HBox(False, 2)
        self._main_layout = gtk.Layout()
        self._event_handler = event.EventHandler(self)
        self._vadjust = self._main_layout.get_vadjustment()
        self._hadjust = self._main_layout.get_hadjustment()
        self._vscroll = gtk.VScrollbar(self._vadjust)
        self._hscroll = gtk.HScrollbar(self._hadjust)

        self.filehandler = file_handler.FileHandler(self)
        self.imagehandler = image_handler.ImageHandler(self)
        self.imagehandler.page_available += self._page_available
        self.thumbnailsidebar = thumbbar.ThumbnailSidebar(self)

        self.statusbar = status.Statusbar()
        self.clipboard = clipboard.Clipboard(self)
        self.slideshow = slideshow.Slideshow(self)
        self.cursor_handler = cursor_handler.CursorHandler(self)
        self.enhancer = enhance_backend.ImageEnhancer(self)
        self.lens = lens.MagnifyingLens(self)
        self.osd = osd.OnScreenDisplay(self)
        self.uimanager = ui.MainUI(self)
        self.menubar = self.uimanager.get_widget('/Menu')
        self.toolbar = self.uimanager.get_widget('/Tool')
        self.popup = self.uimanager.get_widget('/Popup')
        self.actiongroup = self.uimanager.get_action_groups()[0]

        self.left_image = gtk.Image()
        self.right_image = gtk.Image()

        # ----------------------------------------------------------------
        # Setup
        # ----------------------------------------------------------------
        self.set_title(constants.APPNAME)
        self.set_size_request(300, 300)  # Avoid making the window *too* small
        self.resize(prefs['window width'], prefs['window height'])

        # Hook up any additional key events not handled by UI accelerators
        self._event_handler.register_key_events()

        # This is a hack to get the focus away from the toolbar so that
        # we don't activate it with space or some other key (alternative?)
        self.toolbar.set_focus_child(
            self.uimanager.get_widget('/Tool/expander'))
        self.toolbar.set_style(gtk.TOOLBAR_ICONS)
        self.toolbar.set_icon_size(gtk.ICON_SIZE_LARGE_TOOLBAR)

        self._image_box.add(self.left_image)
        self._image_box.add(self.right_image)
        self._image_box.show_all()

        self._main_layout.put(self._image_box, 0, 0)
        self.set_bg_colour(prefs['bg colour'])

        self._vadjust.step_increment = 15
        self._vadjust.page_increment = 1
        self._hadjust.step_increment = 15
        self._hadjust.page_increment = 1

        table = gtk.Table(2, 2, False)
        table.attach(self.thumbnailsidebar, 0, 1, 2, 5, gtk.FILL,
                     gtk.FILL | gtk.EXPAND, 0, 0)

        table.attach(self._main_layout, 1, 2, 2, 3, gtk.FILL | gtk.EXPAND,
                     gtk.FILL | gtk.EXPAND, 0, 0)
        table.attach(self._vscroll, 2, 3, 2, 3, gtk.FILL | gtk.SHRINK,
                     gtk.FILL | gtk.SHRINK, 0, 0)
        table.attach(self._hscroll, 1, 2, 4, 5, gtk.FILL | gtk.SHRINK,
                     gtk.FILL, 0, 0)
        table.attach(self.menubar, 0, 3, 0, 1, gtk.FILL | gtk.SHRINK, gtk.FILL,
                     0, 0)
        table.attach(self.toolbar, 0, 3, 1, 2, gtk.FILL | gtk.SHRINK, gtk.FILL,
                     0, 0)
        table.attach(self.statusbar, 0, 3, 5, 6, gtk.FILL | gtk.SHRINK,
                     gtk.FILL, 0, 0)

        if prefs['default double page'] or double_page:
            self.actiongroup.get_action('double_page').activate()

        if prefs['default manga mode'] or manga_mode:
            self.actiongroup.get_action('manga_mode').activate()

        # Determine zoom mode. If zoom_mode is passed, it overrides
        # the zoom mode preference.
        zoom_actions = {
            constants.ZOOM_MODE_BEST: 'best_fit_mode',
            constants.ZOOM_MODE_WIDTH: 'fit_width_mode',
            constants.ZOOM_MODE_HEIGHT: 'fit_height_mode',
            constants.ZOOM_MODE_MANUAL: 'fit_manual_mode'
        }

        if zoom_mode is not None:
            zoom_action = zoom_actions[zoom_mode]
        else:
            zoom_action = zoom_actions[prefs['zoom mode']]

        if zoom_action == 'fit_manual_mode':
            # This little ugly hack is to get the activate call on
            # 'fit_manual_mode' to actually create an event (and callback).
            # Since manual mode is the default selected radio button action
            # it won't send an event if we activate it when it is already
            # the selected one.
            self.actiongroup.get_action('best_fit_mode').activate()

        self.actiongroup.get_action(zoom_action).activate()

        if prefs['stretch']:
            self.actiongroup.get_action('stretch').activate()

        if prefs['invert smart scroll']:
            self.actiongroup.get_action('invert_scroll').activate()

        if prefs['show toolbar']:
            prefs['show toolbar'] = False
            self.actiongroup.get_action('toolbar').activate()

        if prefs['show menubar']:
            prefs['show menubar'] = False
            self.actiongroup.get_action('menubar').activate()

        if prefs['show statusbar']:
            prefs['show statusbar'] = False
            self.actiongroup.get_action('statusbar').activate()

        if prefs['show scrollbar']:
            prefs['show scrollbar'] = False
            self.actiongroup.get_action('scrollbar').activate()

        if prefs['show thumbnails']:
            prefs['show thumbnails'] = False
            self.actiongroup.get_action('thumbnails').activate()

        if prefs['hide all']:
            prefs['hide all'] = False
            self.actiongroup.get_action('hide all').activate()

        if prefs['keep transformation']:
            prefs['keep transformation'] = False
            self.actiongroup.get_action('keep_transformation').activate()
        else:
            prefs['rotation'] = 0
            prefs['vertical flip'] = False
            prefs['horizontal flip'] = False

        self.add(table)
        table.show()
        self._main_layout.show()
        self._display_active_widgets()

        self._main_layout.set_events(gtk.gdk.BUTTON1_MOTION_MASK
                                     | gtk.gdk.BUTTON2_MOTION_MASK
                                     | gtk.gdk.BUTTON_PRESS_MASK
                                     | gtk.gdk.BUTTON_RELEASE_MASK
                                     | gtk.gdk.POINTER_MOTION_MASK)

        self._main_layout.drag_dest_set(
            gtk.DEST_DEFAULT_ALL, [('text/uri-list', 0, 0)],
            gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)

        self.connect('focus-in-event', self.gained_focus)
        self.connect('focus-out-event', self.lost_focus)
        self.connect('delete_event', self.close_program)
        self.connect('key_press_event', self._event_handler.key_press_event)
        self.connect('key_release_event',
                     self._event_handler.key_release_event)
        self.connect('configure_event', self._event_handler.resize_event)

        self._main_layout.connect('button_release_event',
                                  self._event_handler.mouse_release_event)
        self._main_layout.connect('scroll_event',
                                  self._event_handler.scroll_wheel_event)
        self._main_layout.connect('button_press_event',
                                  self._event_handler.mouse_press_event)
        self._main_layout.connect('motion_notify_event',
                                  self._event_handler.mouse_move_event)
        self._main_layout.connect('drag_data_received',
                                  self._event_handler.drag_n_drop_event)

        self.uimanager.set_sensitivities()
        self.show()

        # If MComix is set to start in fullscreen mode, it
        # cannot switch to windowed mode on Win32 unless this
        # condition is set to trigger after normal show().
        if prefs['default fullscreen'] or fullscreen:
            self.actiongroup.get_action('fullscreen').activate()

        if prefs['previous quit was quit and save']:
            fileinfo = self.filehandler.read_fileinfo_file()

            if fileinfo != None:

                open_path = fileinfo[0]
                open_page = fileinfo[1] + 1

        prefs['previous quit was quit and save'] = False

        if open_path is not None:
            self.filehandler.open_file(open_path, open_page)

        if is_slideshow:
            self.actiongroup.get_action('slideshow').activate()

        if show_library:
            self.actiongroup.get_action('library').activate()
Beispiel #11
0
    def __init__(self, buff, appwin):
        
        # Save params
        global gl_appwin
        gl_appwin = appwin
        self.appwin = appwin; 

        # Gather globals
        self.keyh = pedconfig.pedconfig.keyh

        # Init vars
        self.xpos = 0; self.ypos = 0
        self.changed = False; self.colsel = False

        self.xsel = -1; self.ysel = -1
        self.xsel2 = -1; self.ysel2 = -1
        self.caret = []; self.caret.append(0); self.caret.append(0)        
        self.maxlinelen = 0
        self.focus = False

        # Init configurables
        self.scgap = SCROLLGAP      
        self.pgup  = PAGEUP
        self.tabstop = TABSTOP

        # Process buffer into list
        self.text = buff
        for aa in self.text:       
            xlen = len(aa)  
            if self.maxlinelen < xlen:
                self.maxlinelen = xlen

        # Parent widget                 
        gtk.DrawingArea.__init__(self)
        self.set_flags(gtk.CAN_FOCUS | gtk.SENSITIVE)
        self.pangolayout = self.create_pango_layout("a")
    
        # Set default background color
        '''colormap = gtk.widget_get_default_colormap()
        color = colormap.alloc_color("#d0d0d0")
        self.modify_bg(gtk.STATE_NORMAL, color)'''
        
        # Our font
        fd = pango.FontDescription()
        fd.set_size(14*1024); fd.set_family("mono")
        self.pangolayout.set_font_description(fd)

        # Get Pango steps
        self.cxx, self.cyy = self.pangolayout.get_pixel_size()
        ts = self.pangolayout.get_tabs()
        if ts == None: self.tabstop = TABSTOP    
        else: al, self.tabstop = ts.get_tab(0)

        #print "tabstop", self.tabstop
        # Set up scroll bars        
        sm = len(self.text) + self.get_height() / self.cyy + 10
        self.hadj = gtk.Adjustment(0, 0, 100, 1, 15, 25);
        self.vadj = gtk.Adjustment(0, 0, sm, 1, 15, 25);
        
        self.vscroll = gtk.VScrollbar(self.vadj)
        self.hscroll = gtk.HScrollbar(self.hadj)
        
        # We connect scrollers after construction
        self.hadj.connect("value-changed", self.hscroll_cb)
        self.vadj.connect("value-changed", self.vscroll_cb)
        
        #self.www = gtk.gdk.screen_width();
        #self.hhh = gtk.gdk.screen_height();
        
        # Start up with initial size 
        #self.set_size_request(3*self.www/4,    self.hhh/5)

        self.set_events(    gtk.gdk.POINTER_MOTION_MASK |
                            gtk.gdk.POINTER_MOTION_HINT_MASK |
                            gtk.gdk.BUTTON_PRESS_MASK |
                            gtk.gdk.BUTTON_RELEASE_MASK |
                            gtk.gdk.KEY_PRESS_MASK |
                            gtk.gdk.KEY_RELEASE_MASK )
    
        self.set_events(    gtk.gdk.ALL_EVENTS_MASK )

        colormap = gtk.widget_get_default_colormap()
        self.fgcolor = colormap.alloc_color("#000000")
        self.bgcolor = colormap.alloc_color("#4488ff")              
        self.kwcolor = colormap.alloc_color("#44aaff")
        self.clcolor = colormap.alloc_color("#44aa44")
        self.cocolor = colormap.alloc_color("#4444ff")
        self.stcolor = colormap.alloc_color("#ff44ff")

        self.connect("expose-event", self.area_expose_cb)
        self.connect("motion-notify-event", self.area_motion)
        self.connect("button-press-event", self.area_button)
        self.connect("button-release-event", self.area_button)
        self.connect("key-press-event", self.area_key)
        self.connect("key-release-event", self.area_key)
        self.connect("focus", self.area_focus)
        self.connect("configure_event", self.configure_event)
        self.connect("size-request", self.size_request)
        self.connect("size-allocate", self.size_alloc)    
        self.connect("scroll-event", self.scroll_event)    
        #self.connect("enter-notify-event", self.area_enter)
        #self.connect("leave-notify-event", self.area_leave)
        self.connect("focus-in-event", self.focus_in_cb)    
        self.connect("focus-out-event", self.focus_out_cb)    
    def __init__(self):

        self.directoriodeiconos = activity.get_bundle_path() + "/Iconos/"

        self.gris = gtk.gdk.Color(50000, 50000, 50000, 1)
        self.rosado = gtk.gdk.Color(65000, 13000, 25000, 1)

        gtk.HBox.__init__(self, False, 5)

        self.ajuste = gtk.Adjustment(0, 0, 100, 1, 1)
        self.barradeprogreso = gtk.HScrollbar(self.ajuste)
        self.barradeprogreso.modify_bg(gtk.STATE_NORMAL, self.rosado)

        #self.barradeprogreso.connect("value-changed", self.srollmove)

        self.etiqueta_progreso = gtk.Label("¡¡¡ CeibalRadio !!!")
        caja_progreso = gtk.VBox()
        caja_progreso.pack_start(self.barradeprogreso, True, True, 5)
        caja_progreso.pack_start(self.etiqueta_progreso, True, True, 0)
        self.pack_start(caja_progreso, True, True, 5)

        caja_de_botones = gtk.HBox(False, 0)
        # ****** BOTON_ATRAS
        self.imagenatras = gtk.Image()
        self.imagenatras.set_from_file(self.directoriodeiconos + "atras.png")
        self.botonatras = gtk.Button()
        self.botonatras.modify_bg(gtk.STATE_NORMAL, self.gris)
        self.botonatras.add(self.imagenatras)
        #self.botonatras.connect("clicked",self.clickenatras)
        caja_de_botones.pack_start(self.botonatras, False, False, 5)

        # ****** BOTON PLAY
        self.imagenplay = gtk.Image()
        self.imagenplay.set_from_file(self.directoriodeiconos + "play.png")
        self.botonplay = gtk.Button()
        self.botonplay.modify_bg(gtk.STATE_NORMAL, self.gris)
        self.botonplay.add(self.imagenplay)
        #self.botonplay.connect("clicked",self.clickenplay_pausa)
        caja_de_botones.pack_start(self.botonplay, False, False, 5)

        # ****** BOTON SIGUIENTE
        self.imagensiguiente = gtk.Image()
        self.imagensiguiente.set_from_file(self.directoriodeiconos +
                                           "siguiente.png")
        self.botonsiguiente = gtk.Button()
        self.botonsiguiente.modify_bg(gtk.STATE_NORMAL, self.gris)
        self.botonsiguiente.add(self.imagensiguiente)
        #self.botonsiguiente.connect("clicked",self.clickensiguiente)
        caja_de_botones.pack_start(self.botonsiguiente, False, False, 5)

        # ****** BOTON STOP
        self.imagenstop = gtk.Image()
        self.imagenstop.set_from_file(self.directoriodeiconos + "stop.png")
        self.botonstop = gtk.Button()
        self.botonstop.modify_bg(gtk.STATE_NORMAL, self.gris)
        self.botonstop.add(self.imagenstop)
        #self.botonstop.connect("clicked",self.clickenstop)
        caja_de_botones.pack_start(self.botonstop, False, False, 5)

        # ****** BOTON ABRIR DIRECTORIO
        self.imagenabrir = gtk.Image()
        self.imagenabrir.set_from_file(self.directoriodeiconos + "abrir.png")
        self.botonabrir = gtk.Button()
        self.botonabrir.modify_bg(gtk.STATE_NORMAL, self.gris)
        self.botonabrir.add(self.imagenabrir)
        #self.botonabrir.connect("clicked",self.clickenabrir)
        caja_de_botones.pack_start(self.botonabrir, False, False, 5)

        self.etiqueta_hora = gtk.Label("Hora")
        caja_de_botones_y_hora = gtk.VBox()
        caja_de_botones_y_hora.pack_start(caja_de_botones, False, False, 5)
        caja_de_botones_y_hora.pack_start(self.etiqueta_hora, False, False, 5)

        self.pack_start(caja_de_botones_y_hora, False, False, 5)

        self.show_all()
Beispiel #13
0
    def _createUI(self):
        self.leftSizeGroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
        self.props.row_spacing = 2
        self.props.column_spacing = 2
        self.hadj = gtk.Adjustment()
        self.vadj = gtk.Adjustment()

        # zooming slider's "zoom fit" button
        zoom_controls_hbox = gtk.HBox()
        zoom_best_fit_button = gtk.Button(_("Zoom"))
        zoom_best_fit_button.set_relief(gtk.RELIEF_NONE)
        zoom_best_fit_button.set_tooltip_text(ZOOM_FIT)
        zoom_best_fit_button.set_image(
            gtk.image_new_from_stock(gtk.STOCK_ZOOM_FIT, gtk.ICON_SIZE_BUTTON))
        zoom_best_fit_button.connect("clicked", self._zoomFitCb)
        zoom_controls_hbox.pack_start(zoom_best_fit_button)
        # zooming slider
        self._zoomAdjustment = gtk.Adjustment()
        self._zoomAdjustment.set_value(Zoomable.getCurrentZoomLevel())
        self._zoomAdjustment.connect("value-changed",
                                     self._zoomAdjustmentChangedCb)
        self._zoomAdjustment.props.lower = 0
        self._zoomAdjustment.props.upper = Zoomable.zoom_steps
        zoomslider = gtk.HScale(self._zoomAdjustment)
        zoomslider.props.draw_value = False
        zoomslider.set_tooltip_text(_("Zoom Timeline"))
        zoomslider.connect("scroll-event", self._zoomSliderScrollCb)
        zoomslider.set_size_request(100,
                                    0)  # At least 100px wide for precision
        zoom_controls_hbox.pack_start(zoomslider)
        self.attach(zoom_controls_hbox,
                    0,
                    1,
                    0,
                    1,
                    yoptions=0,
                    xoptions=gtk.FILL)

        # controls for tracks and layers
        self._controls = TimelineControls()
        controlwindow = gtk.Viewport(None, self.vadj)
        controlwindow.add(self._controls)
        controlwindow.set_size_request(-1, 1)
        controlwindow.set_shadow_type(gtk.SHADOW_OUT)
        self.attach(controlwindow, 0, 1, 1, 2, xoptions=gtk.FILL)

        # timeline ruler
        self.ruler = ruler.ScaleRuler(self.app, self.hadj)
        self.ruler.set_size_request(0, 25)
        #self.ruler.set_border_width(2)
        self.ruler.connect("key-press-event", self._keyPressEventCb)
        self.ruler.connect("size-allocate", self._rulerSizeAllocateCb)
        rulerframe = gtk.Frame()
        rulerframe.set_shadow_type(gtk.SHADOW_OUT)
        rulerframe.add(self.ruler)
        self.attach(rulerframe, 1, 2, 0, 1, yoptions=0)

        # proportional timeline
        self._canvas = TimelineCanvas(self.app)
        self._root_item = self._canvas.get_root_item()
        self.attach(self._canvas, 1, 2, 1, 2)
        self.vadj.connect("changed", self._unsureVadjHeightCb)

        # scrollbar
        self._hscrollbar = gtk.HScrollbar(self.hadj)
        self._vscrollbar = gtk.VScrollbar(self.vadj)
        self.attach(self._hscrollbar, 1, 2, 2, 3, yoptions=0)
        self.attach(self._vscrollbar, 2, 3, 1, 2, xoptions=0)
        self.hadj.connect("value-changed", self._updateScrollPosition)
        self.vadj.connect("value-changed", self._updateScrollPosition)

        # error infostub
        self.infostub = InfoStub()
        self.attach(self.infostub, 1, 2, 4, 5, yoptions=0)

        self.show_all()
        self.infostub.hide()

        # toolbar actions
        actions = (
            ("ZoomIn", gtk.STOCK_ZOOM_IN, None, "<Control>plus", ZOOM_IN,
             self._zoomInCb),
            ("ZoomOut", gtk.STOCK_ZOOM_OUT, None, "<Control>minus", ZOOM_OUT,
             self._zoomOutCb),
            ("ZoomFit", gtk.STOCK_ZOOM_FIT, None, None, ZOOM_FIT,
             self._zoomFitCb),

            # actions for adding additional accelerators
            ("ControlEqualAccel", gtk.STOCK_ZOOM_IN, None, "<Control>equal",
             ZOOM_IN, self._zoomInCb),
            ("ControlKPAddAccel", gtk.STOCK_ZOOM_IN, None, "<Control>KP_Add",
             ZOOM_IN, self._zoomInCb),
            ("ControlKPSubtractAccel", gtk.STOCK_ZOOM_OUT, None,
             "<Control>KP_Subtract", ZOOM_OUT, self._zoomOutCb),
        )

        selection_actions = (
            ("DeleteObj", gtk.STOCK_DELETE, None, "Delete", DELETE,
             self.deleteSelected),
            ("UnlinkObj", "pitivi-unlink", None, "<Shift><Control>L", UNLINK,
             self.unlinkSelected),
            ("LinkObj", "pitivi-link", None, "<Control>L", LINK,
             self.linkSelected),
            ("UngroupObj", "pitivi-ungroup", None, "<Shift><Control>G",
             UNGROUP, self.ungroupSelected),
            ("GroupObj", "pitivi-group", None, "<Control>G", GROUP,
             self.groupSelected),
        )

        self.playhead_actions = (
            ("Split", "pitivi-split", _("Split"), "S", SPLIT, self.split),
            ("Keyframe", "pitivi-keyframe", _("Add a Keyframe"), "K", KEYFRAME,
             self.keyframe),
            ("Prevframe", "pitivi-prevframe", _("_Previous Keyframe"), "E",
             PREVFRAME, self.prevframe),
            ("Nextframe", "pitivi-nextframe", _("_Next Keyframe"), "R",
             NEXTFRAME, self.nextframe),
        )

        actiongroup = gtk.ActionGroup("timelinepermanent")
        actiongroup.add_actions(actions)
        self.ui_manager.insert_action_group(actiongroup, 0)

        actiongroup = gtk.ActionGroup("timelineselection")
        actiongroup.add_actions(selection_actions)
        actiongroup.add_actions(self.playhead_actions)
        self.link_action = actiongroup.get_action("LinkObj")
        self.unlink_action = actiongroup.get_action("UnlinkObj")
        self.group_action = actiongroup.get_action("GroupObj")
        self.ungroup_action = actiongroup.get_action("UngroupObj")
        self.delete_action = actiongroup.get_action("DeleteObj")
        self.split_action = actiongroup.get_action("Split")
        self.keyframe_action = actiongroup.get_action("Keyframe")
        self.prevframe_action = actiongroup.get_action("Prevframe")
        self.nextframe_action = actiongroup.get_action("Nextframe")

        self.ui_manager.insert_action_group(actiongroup, -1)

        self.ui_manager.add_ui_from_string(ui)

        # drag and drop
        self.drag_dest_set(gtk.DEST_DEFAULT_MOTION,
                           [dnd.FILESOURCE_TUPLE, dnd.EFFECT_TUPLE],
                           gtk.gdk.ACTION_COPY)

        self.connect("drag-data-received", self._dragDataReceivedCb)
        self.connect("drag-leave", self._dragLeaveCb)
        self.connect("drag-drop", self._dragDropCb)
        self.connect("drag-motion", self._dragMotionCb)
        self._canvas.connect("key-press-event", self._keyPressEventCb)
        self._canvas.connect("scroll-event", self._scrollEventCb)