~segphault/grabbersnap/trunk

« back to all changes in this revision

Viewing changes to grabbersnap/main.py

  • Committer: Ryan Paul
  • Date: 2008-12-14 23:57:58 UTC
  • Revision ID: segphault@arstechnica.com-20081214235758-d78lr8cwi2t62wr7
Added support for copying the canvas to the clipboard

Show diffs side-by-side

added added

removed removed

Lines of Context:
44
44
    #    shadow_color=canvas.convert_color("black", 100),
45
45
    #    text=SAMPLE_TEXT, use_markup=True)
46
46
 
 
47
  def act_select_change(self): pass
 
48
 
 
49
  def get_selection_rect(self):
 
50
    return self._selection_rect
 
51
 
 
52
  def set_selection_rect(self, r):
 
53
    self._selection_rect = r if r and r.props.width else None
 
54
    self.act_select_change()
 
55
 
 
56
  selection_rect = property(get_selection_rect, set_selection_rect)
 
57
 
47
58
  def on_mouse_down(self, target, e):
48
59
    x, y = self.convert_from_pixels(e.x, e.y)
49
 
    if len(self.get_items_at(x, y, True)) == 1:
 
60
    items = self.get_items_at(x, y, True)
 
61
    if items and len(items) == 1:
50
62
      self.add_selection(x=x, y=y)
51
63
  
52
64
  def add_selection(self, **kwargs):
53
 
    r = canvas.ResizableRect.create_on_canvas(self, True, **kwargs)
 
65
    def on_finish(r): self.selection_rect = r
 
66
    
 
67
    if self.selection_rect: self.selection_rect.remove()
 
68
    r = canvas.ResizableRect.create_on_canvas(self, on_finish, **kwargs)
54
69
    r.props.line_dash = goocanvas.LineDash([2.0, 2.0, 2.0, 2.0, 2.0])
55
70
    r.props.fill_color_rgba = canvas.convert_color("gray", 80)
56
71
    r.constrain = True
57
72
    self += r
58
73
 
59
 
    if self.selection_rect: self.selection_rect.remove()
60
 
    self.selection_rect = r
61
 
    
62
74
  def zoom(self, amount):
63
75
    self.set_scale(amount)
64
76
 
76
88
      self.selection_rect = None
77
89
      self.update_base_image(pb)
78
90
 
79
 
  def save(self, fn):
 
91
  def render_to_surface(self):
80
92
    x, y, w, h = self.get_bounds()
81
93
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(w), int(h))
82
94
    context = cairo.Context(surface)
85
97
    context.fill()
86
98
 
87
99
    self.render(context)
88
 
    surface.write_to_png(fn)
 
100
    return surface
 
101
 
 
102
  def copy(self):
 
103
    pbl = gtk.gdk.PixbufLoader()
 
104
    self.render_to_surface().write_to_png(pbl)
 
105
    pbl.close()
 
106
 
 
107
    gtk.Clipboard().set_image(pbl.get_pixbuf())
 
108
    
 
109
  def save(self, fn):
 
110
    self.render_to_surface().write_to_png(fn)
89
111
 
90
112
  def set_base_image(self, image=None):
91
113
    self.base_image = goocanvas.Image(x=0, y=0)
114
136
    self.resize(500, 500)
115
137
    self.connect("destroy", gtk.main_quit)
116
138
    gtk.window_set_default_icon_name("applets-screenshooter")
117
 
 
118
 
    ui = self.setup_menus()
119
 
    self.add_accel_group(ui.get_accel_group())
120
 
 
121
 
    menu = ui.get_widget("/menubarMain")
122
 
    toolbar = ui.get_widget("/toolbarMain")
 
139
    
 
140
    self.canvas = GrabberSnapCanvas(SAMPLE_SCREENSHOT)
 
141
    scroll = gtk.ScrolledWindow()
 
142
    scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 
143
    scroll.add(self.canvas)
 
144
 
 
145
    self.ui = self.setup_menus()
 
146
    self.add_accel_group(self.ui.get_accel_group())
 
147
 
 
148
    menu = self.ui.get_widget("/menubarMain")
 
149
    toolbar = self.ui.get_widget("/toolbarMain")
123
150
    toolbar.props.icon_size = gtk.ICON_SIZE_MENU
124
151
 
125
152
    top = gtk.HBox()
140
167
    metabar.pack_start(gtk.Label("Tags:"), False, False, 10)
141
168
    metabar.pack_start(tagedit, True, True)
142
169
    metabar.pack_start(btnclosemb, False, False, 5)
143
 
 
144
 
    self.canvas = GrabberSnapCanvas(SAMPLE_SCREENSHOT)
145
 
    scroll = gtk.ScrolledWindow()
146
 
    scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
147
 
    scroll.add(self.canvas)
148
 
 
 
170
    
149
171
    zoom_adjust = gtk.Adjustment(1, 0.1, 3, 0.1)
150
172
    zoom_slider = gtk.HScale(zoom_adjust)
151
173
    zoom_slider.connect("change-value", self.on_zoom_change)
203
225
    </ui>
204
226
    """
205
227
 
206
 
    act = gtk.ActionGroup("Actions")
207
 
    act.add_actions([
 
228
    self.act_main = gtk.ActionGroup("Actions")
 
229
    self.act_main.add_actions([
208
230
      ("menuFile", None, "_File"),
209
231
      ("menuEdit", None, "_Edit"),
210
232
      ("menuImage", None, "_Image"),
215
237
      ("Save", gtk.STOCK_SAVE, None, None, "Save the current file", self.on_save),
216
238
      ("Quit", gtk.STOCK_QUIT, None, None, "Quit the program", self.on_quit),
217
239
      ("Copy", gtk.STOCK_COPY, None, None, "Copy the image to the clipboard", self.on_copy),
218
 
      ("Crop", None, "_Crop", "<ctrl>R", "Crop the image", self.on_crop),
219
240
      ("ZoomIn", gtk.STOCK_ZOOM_IN, None, None, "Enlarge the image view", self.on_zoom_in),
220
241
      ("ZoomOut", gtk.STOCK_ZOOM_OUT, None, None, "Shrink the image view", self.on_zoom_out),
221
242
      ("NormalSize", gtk.STOCK_ZOOM_100, None, None, "Show the image at its normal size", self.on_normal_size),
222
243
      ("About", gtk.STOCK_ABOUT, None, None, "View information about the program", self.on_about),
223
244
    ])
 
245
 
 
246
    self.act_selected = gtk.ActionGroup("Selected")
 
247
    self.act_selected.add_actions([
 
248
      ("Crop", None, "_Crop", "<ctrl>R", "Crop the image", self.on_crop),
 
249
    ])
224
250
    
225
251
    ui = gtk.UIManager()
226
 
    ui.insert_action_group(act, 0)
 
252
    ui.insert_action_group(self.act_main, 0)
 
253
    ui.insert_action_group(self.act_selected, 0)
227
254
    ui.add_ui_from_string(ui_string)
228
255
    
229
256
    set_icon_named("applets-screenshooter", [
233
260
    set_icon_named(ICON_CROP,
234
261
      ui.get_widget("/menubarMain/menuEdit/Crop"))
235
262
 
 
263
    self.manage_enabled_widgets()
 
264
    self.canvas.act_select_change = self.manage_enabled_widgets
 
265
 
236
266
    return ui
237
267
 
 
268
  def manage_enabled_widgets(self):
 
269
    self.act_selected.set_sensitive(
 
270
      self.canvas.selection_rect != None)
 
271
 
238
272
  def on_quit(self, w):
239
273
    gtk.main_quit()
240
274
 
268
302
 
269
303
    dialog.destroy()
270
304
 
271
 
  def on_copy(self, w): pass
 
305
  def on_copy(self, w):
 
306
    self.canvas.copy()
 
307
  
272
308
  def on_about(self, w): pass
273
309
 
274
310
  def on_crop(self, w):