class Tree(gtk.VBox): """""" def __init__(self, menu, manager): """""" gtk.VBox.__init__(self) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.treeview = gtk.TreeView( gtk.TreeStore(gtk.gdk.Pixbuf, str, str, str, int, bool, str, str, str, str, str)) scroll.add(self.treeview) self.pack_start(scroll) self.menu = gtk.Menu() for item in menu: if item == None: subitem = gtk.SeparatorMenuItem() else: subitem = gtk.ImageMenuItem(item[0]) subitem.connect("activate", item[1]) self.menu.append(subitem) self.menu.show_all() self.treeview.connect("button-press-event", self.mouse_menu) self.get_files = manager.get_files self.treeview.set_rules_hint(True) self.treeview.set_headers_visible(False) #tree columns tree_icon = gtk.TreeViewColumn('Icon') icon_cell = gtk.CellRendererPixbuf() tree_icon.pack_start(icon_cell, False) tree_icon.add_attribute(icon_cell, 'pixbuf', 0) self.treeview.append_column(tree_icon) tree_name = gtk.TreeViewColumn('Name') name_cell = gtk.CellRendererText() name_cell.set_property("width-chars", 60) name_cell.set_property("ellipsize", pango.ELLIPSIZE_MIDDLE) tree_name.pack_start(name_cell, True) tree_name.add_attribute(name_cell, 'text', 3) self.treeview.append_column(tree_name) tree_progress = gtk.TreeViewColumn('Progress') tree_progress.set_min_width(150) progress_cell = gtk.CellRendererProgress() tree_progress.pack_start(progress_cell, True) tree_progress.add_attribute(progress_cell, 'value', 4) tree_progress.add_attribute(progress_cell, 'visible', 5) self.treeview.append_column(tree_progress) tree_current_size = gtk.TreeViewColumn('Current Size') current_size_cell = gtk.CellRendererText() tree_current_size.pack_start(current_size_cell, False) tree_current_size.add_attribute(current_size_cell, 'text', 6) self.treeview.append_column(tree_current_size) tree_total_size = gtk.TreeViewColumn('Total Size') total_size_cell = gtk.CellRendererText() tree_total_size.pack_start(total_size_cell, False) tree_total_size.add_attribute(total_size_cell, 'text', 7) self.treeview.append_column(tree_total_size) tree_speed = gtk.TreeViewColumn('Speed') speed_cell = gtk.CellRendererText() tree_speed.pack_start(speed_cell, False) tree_speed.add_attribute(speed_cell, 'text', 8) self.treeview.append_column(tree_speed) tree_time = gtk.TreeViewColumn('Time Left') time_cell = gtk.CellRendererText() tree_time.pack_start(time_cell, False) tree_time.add_attribute(time_cell, 'text', 9) self.treeview.append_column(tree_time) tree_plugins = gtk.TreeViewColumn('Plugin') plugins_cell = gtk.CellRendererText() tree_plugins.pack_start(plugins_cell, False) tree_plugins.add_attribute(plugins_cell, 'text', 10) self.treeview.append_column(tree_plugins) #icons self.package_icon = self.treeview.render_icon(gtk.STOCK_OPEN, gtk.ICON_SIZE_MENU) self.active_service_icon = self.treeview.render_icon( gtk.STOCK_YES, gtk.ICON_SIZE_MENU) self.unactive_service_icon = self.treeview.render_icon( gtk.STOCK_NO, gtk.ICON_SIZE_MENU) self.correct_icon = self.treeview.render_icon(gtk.STOCK_APPLY, gtk.ICON_SIZE_MENU) self.failed_icon = self.treeview.render_icon(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU) self.wait_icon = self.treeview.render_icon(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU) self.active_icon = self.treeview.render_icon(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_MENU) self.pending_icon = self.treeview.render_icon(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_MENU) self.stoped_icon = self.treeview.render_icon(gtk.STOCK_MEDIA_STOP, gtk.ICON_SIZE_MENU) self.icons = { cons.STATUS_CORRECT: self.correct_icon, cons.STATUS_ERROR: self.failed_icon, cons.STATUS_WAIT: self.wait_icon, cons.STATUS_ACTIVE: self.active_icon, cons.STATUS_PEND: self.pending_icon, cons.STATUS_STOP: self.stoped_icon } self.status_bar = Statusbar() self.pack_start(self.status_bar, False) self.status_bar.push(self.status_bar.get_context_id("Downloads"), " No Downloads Active.") self.updating = False shared.events.connect(cons.EVENT_ALL_COMPLETE, self.stop_update) def stop_update(self): """""" self.updating = False def mouse_menu(self, widget, event): """right button""" if event.button == 3: model, paths = self.treeview.get_selection().get_selected_rows() if len(paths) > 0: self.menu.popup(None, None, None, event.button, event.time) def add_package(self, package_name, package_path, package, password): """ TreeStore(icon, status, password, name, progress, progress_visible, current_size, total_size, speed, time, services) """ tmp_size = [] model = self.treeview.get_model() package_iter = model.append(None, [ self.package_icon, cons.STATUS_PEND, password, package_name, 0, True, None, None, None, None, package_path ]) for item in package: tmp_size.append((item[3], item[4])) item_iter = model.append(package_iter, [ self.pending_icon, cons.STATUS_PEND, None, item[1], 0, True, None, str(item[3]) + item[4], None, None, str(item[2]) ]) self.treeview.expand_to_path(model.get_path(item_iter)) for link in item[0]: link_iter = model.append(item_iter, [ self.unactive_service_icon, cons.STATUS_PEND, None, link, 0, False, None, None, None, None, item[5][item[0].index(link)] ]) package_size, package_unit = self.normalize(tmp_size) model.set_value(package_iter, 7, str(package_size) + package_unit) if not self.updating: self.updating = True gobject.timeout_add_seconds(1, self.update) return package_iter def update(self): """(icon, status, None, name, progress, progress_visible, current_size, total_size, speed, time, services)""" if self.updating: files = self.get_files() if files: model = self.treeview.get_model() package_iter = model.get_iter_root() active_downloads = 0 complete_downloads = 0 total_downloads = 0 total_speed = 0 while package_iter: file_iter = model.iter_children(package_iter) package_status = model.get_value(package_iter, 1) package_progress = 0 package_speed = 0 package_complete_downloads = 0 tmp_actual_size = [] tmp_total_size = [] children_names = [] while file_iter: total_downloads += 1 name = model.get_value(file_iter, 3) children_names.append(name) for file in files: if file.name == name: model.set_value(file_iter, 0, self.icons[file.status]) model.set_value(file_iter, 1, file.status) if file.status in [ cons.STATUS_ACTIVE, cons.STATUS_WAIT ]: active_downloads += 1 if file.progress: model.set_value(file_iter, 4, file.progress) package_progress += file.progress if file.actual_size: model.set_value( file_iter, 6, str(file.actual_size) + file.actual_size_unit) tmp_actual_size.append( (file.actual_size, file.actual_size_unit)) tmp_total_size.append( (file.total_size, file.total_size_unit)) if file.speed: model.set_value( file_iter, 8, str(file.speed) + cons.UNIT_SPEED) package_speed += file.speed else: model.set_value(file_iter, 8, None) if file.status == cons.STATUS_CORRECT: complete_downloads += 1 package_complete_downloads += 1 if not file.time > 0: file.time = 1 file.actual_size = file.total_size file.actual_size_unit = file.total_size_unit model.set_value(file_iter, 9, misc.calculate_time(file.time)) link_iter = model.iter_children(file_iter) while link_iter: for tmp_link in file.links: if tmp_link.url == model.get_value( link_iter, 3): service_icon = self.unactive_service_icon link_status = cons.STATUS_STOP if tmp_link.active: service_icon = self.active_service_icon link_status = cons.STATUS_ACTIVE model.set_value( link_iter, 0, service_icon) model.set_value( link_iter, 1, link_status) link_iter = model.iter_next(link_iter) file_iter = model.iter_next(file_iter) package_actual_size, package_actual_unit = self.normalize( tmp_actual_size) package_total_size, package_total_unit = self.normalize( tmp_total_size) if len(children_names) == package_complete_downloads: if package_status != cons.STATUS_CORRECT: model.set_value(package_iter, 1, cons.STATUS_CORRECT) model.set_value(package_iter, 4, 100) model.set_value( package_iter, 6, str(package_total_size) + package_total_unit) shared.events.trigger_package_complete( model.get_value(package_iter, 10), children_names) elif package_actual_size > 0: model.set_value(package_iter, 4, package_progress / len(children_names)) model.set_value( package_iter, 6, str(package_actual_size) + package_actual_unit) if package_speed > 0: model.set_value(package_iter, 8, str(package_speed) + cons.UNIT_SPEED) else: model.set_value(package_iter, 8, None) total_speed += package_speed package_iter = model.iter_next(package_iter) self.status_bar.pop( self.status_bar.get_context_id("Downloads")) self.status_bar.push( self.status_bar.get_context_id("Downloads"), " Downstream %dKB/s \tTotal %d \t Complete %d \t Active %d" % (total_speed, total_downloads, complete_downloads, active_downloads)) return True def normalize(self, sizes): """""" total = 0 total_unit = cons.UNIT_KB for size, unit in sizes: total += self.get_size(size, unit) tmp = int(total / 1024) if tmp > 0: total = tmp total_unit = cons.UNIT_MB tmp = int(tmp / 1024) # if tmp > 0: # total = tmp # total_unit = cons.UNIT_GB return total, total_unit def get_size(self, size, unit): """""" if unit == cons.UNIT_KB: return size elif unit == cons.UNIT_MB: return size * 1024 #elif unit == cons.UNIT_GB: # return size*1024*1024 def get_packages(self): """""" model = self.treeview.get_model() package_iter = model.get_iter_root() packages = [] info = [] while package_iter: files = [] file_iter = model.iter_children(package_iter) while file_iter: if model.get_value(file_iter, 1) != cons.STATUS_CORRECT: links = [] plugins = [] link_iter = model.iter_children(file_iter) while link_iter: links.append(model.get_value(link_iter, 3)) plugins.append(model.get_value(link_iter, 10)) link_iter = model.iter_next(link_iter) name = model.get_value(file_iter, 3) tmp = model.get_value(file_iter, 7) for unit in [cons.UNIT_KB, cons.UNIT_MB]: tmp_size = tmp.split(unit) if len(tmp_size) > 1: size_unit = unit size = int(tmp_size[0]) break tmp = model.get_value(file_iter, 10) tmp = tmp.split(",") service_list = [] for service in tmp: service_list.append(service.split("\'")[1]) files.append( (links, name, service_list, size, size_unit, plugins)) file_iter = model.iter_next(file_iter) if len(files) > 0: name = model.get_value(package_iter, 3) packages.append((name, files)) path = model.get_value(package_iter, 10).split(name)[0] info.append((path, name, model.get_value(package_iter, 2))) package_iter = model.iter_next(package_iter) return packages, info def get_links(self, iter): """""" links = [] model = self.treeview.get_model() file_iter = model.iter_children(iter) if not file_iter: links.append(model.get_value(iter, 3)) while file_iter: link_iter = model.iter_children(file_iter) if not link_iter: links.append(model.get_value(file_iter, 3)) while link_iter: links.append(model.get_value(link_iter, 3)) link_iter = model.iter_next(link_iter) file_iter = model.iter_next(file_iter) return links def package_files(self, package_iter): """""" files = [] model = self.treeview.get_model() file_iter = model.iter_children(package_iter) while file_iter: if model.get_value(file_iter, 1) not in [ cons.STATUS_ACTIVE, cons.STATUS_WAIT, cons.STATUS_CORRECT ]: files.append(model.get_value(file_iter, 3)) file_iter = model.iter_next(file_iter) return files def clear(self): """""" files = [] model = self.treeview.get_model() package_iter = model.get_iter_root() while package_iter: tmp_iter = package_iter package_iter = model.iter_next(package_iter) files += self.delete_package([cons.STATUS_CORRECT], tmp_iter) return files def delete_package(self, status, package_iter): """""" tmp = [] model = self.treeview.get_model() file_iter = model.iter_children(package_iter) while file_iter: if model.get_value(file_iter, 1) in status: tmp.append(model.get_value(file_iter, 3)) file_iter = model.iter_next(file_iter) if len(tmp) == model.iter_n_children(package_iter): model.remove(package_iter) else: tmp = [] return tmp def delete_file(self, status, iter): """""" model = self.treeview.get_model() if model.get_value(iter, 1) in status: if model.iter_n_children(model.iter_parent(iter)) > 1: result = model.get_value(iter, 3) model.remove(iter) return result def delete_link(self, status, iter): """""" result = None, None model = self.treeview.get_model() file_iter = model.iter_parent(iter) if model.iter_n_children(file_iter) > 1: if model.get_value(iter, 1) == cons.STATUS_STOP: result = model.get_value(file_iter, 3), model.get_value(iter, 3) model.remove(iter) return result def move_up(self, iter): """""" model = self.treeview.get_model() package_iter = model.iter_parent(iter) file_iter = model.iter_children(package_iter) prev_iter = None while ((file_iter) and (model.get_path(file_iter) != model.get_path(iter))): prev_iter = file_iter file_iter = model.iter_next(file_iter) if prev_iter: model.move_before(iter, prev_iter) return True def move_down(self, iter): """""" model = self.treeview.get_model() next_iter = model.iter_next(iter) if next_iter: model.move_after(iter, next_iter) return True
class Tree(gtk.VBox): """""" def __init__(self, menu, manager): """""" gtk.VBox.__init__(self) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.treeview = gtk.TreeView(gtk.TreeStore(gtk.gdk.Pixbuf, str, str, str, int, bool, str, str, str, str, str)) scroll.add(self.treeview) self.pack_start(scroll) self.menu = gtk.Menu() for item in menu: if item == None: subitem = gtk.SeparatorMenuItem() else: subitem = gtk.ImageMenuItem(item[0]) subitem.connect("activate", item[1]) self.menu.append(subitem) self.menu.show_all() self.treeview.connect("button-press-event", self.mouse_menu) self.get_files = manager.get_files self.treeview.set_rules_hint(True) self.treeview.set_headers_visible(False) #tree columns tree_icon = gtk.TreeViewColumn('Icon') icon_cell = gtk.CellRendererPixbuf() tree_icon.pack_start(icon_cell, False) tree_icon.add_attribute(icon_cell, 'pixbuf', 0) self.treeview.append_column(tree_icon) tree_name = gtk.TreeViewColumn('Name') name_cell = gtk.CellRendererText() name_cell.set_property("width-chars", 60) name_cell.set_property("ellipsize", pango.ELLIPSIZE_MIDDLE) tree_name.pack_start(name_cell, True) tree_name.add_attribute(name_cell, 'text', 3) self.treeview.append_column(tree_name) tree_progress = gtk.TreeViewColumn('Progress') tree_progress.set_min_width(150) progress_cell = gtk.CellRendererProgress() tree_progress.pack_start(progress_cell, True) tree_progress.add_attribute(progress_cell, 'value', 4) tree_progress.add_attribute(progress_cell, 'visible', 5) self.treeview.append_column(tree_progress) tree_current_size = gtk.TreeViewColumn('Current Size') current_size_cell = gtk.CellRendererText() tree_current_size.pack_start(current_size_cell, False) tree_current_size.add_attribute(current_size_cell, 'text', 6) self.treeview.append_column(tree_current_size) tree_total_size = gtk.TreeViewColumn('Total Size') total_size_cell = gtk.CellRendererText() tree_total_size.pack_start(total_size_cell, False) tree_total_size.add_attribute(total_size_cell, 'text', 7) self.treeview.append_column(tree_total_size) tree_speed = gtk.TreeViewColumn('Speed') speed_cell = gtk.CellRendererText() tree_speed.pack_start(speed_cell, False) tree_speed.add_attribute(speed_cell, 'text', 8) self.treeview.append_column(tree_speed) tree_time = gtk.TreeViewColumn('Time Left') time_cell = gtk.CellRendererText() tree_time.pack_start(time_cell, False) tree_time.add_attribute(time_cell, 'text', 9) self.treeview.append_column(tree_time) tree_plugins = gtk.TreeViewColumn('Plugin') plugins_cell = gtk.CellRendererText() tree_plugins.pack_start(plugins_cell, False) tree_plugins.add_attribute(plugins_cell, 'text', 10) self.treeview.append_column(tree_plugins) #icons self.package_icon = self.treeview.render_icon(gtk.STOCK_OPEN, gtk.ICON_SIZE_MENU) self.active_service_icon = self.treeview.render_icon(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) self.unactive_service_icon = self.treeview.render_icon(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) self.correct_icon = self.treeview.render_icon(gtk.STOCK_APPLY, gtk.ICON_SIZE_MENU) self.failed_icon = self.treeview.render_icon(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU) self.wait_icon = self.treeview.render_icon(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU) self.active_icon = self.treeview.render_icon(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_MENU) self.pending_icon = self.treeview.render_icon(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_MENU) self.stoped_icon = self.treeview.render_icon(gtk.STOCK_MEDIA_STOP, gtk.ICON_SIZE_MENU) self.icons = {cons.STATUS_CORRECT: self.correct_icon, cons.STATUS_ERROR: self.failed_icon, cons.STATUS_WAIT: self.wait_icon, cons.STATUS_ACTIVE: self.active_icon, cons.STATUS_PEND: self.pending_icon, cons.STATUS_STOP: self.stoped_icon} self.status_bar = Statusbar() self.pack_start(self.status_bar, False) self.status_bar.push(self.status_bar.get_context_id("Downloads"), " No Downloads Active.") self.updating = False shared.events.connect(cons.EVENT_ALL_COMPLETE, self.stop_update) def stop_update(self): """""" self.updating = False def mouse_menu(self, widget, event): """right button""" if event.button == 3: model, paths = self.treeview.get_selection().get_selected_rows() if len(paths) > 0: self.menu.popup(None, None, None, event.button, event.time) def add_package(self, package_name, package_path, package, password): """ TreeStore(icon, status, password, name, progress, progress_visible, current_size, total_size, speed, time, services) """ tmp_size = [] model = self.treeview.get_model() package_iter = model.append(None, [self.package_icon, cons.STATUS_PEND, password, package_name, 0, True, None, None, None, None, package_path]) for item in package: tmp_size.append((item[3], item[4])) item_iter = model.append(package_iter, [self.pending_icon, cons.STATUS_PEND, None, item[1], 0, True, None, str(item[3])+item[4], None, None, str(item[2])]) self.treeview.expand_to_path(model.get_path(item_iter)) for link in item[0]: link_iter = model.append(item_iter, [self.unactive_service_icon, cons.STATUS_PEND, None, link, 0, False, None, None, None, None, item[5][item[0].index(link)]]) package_size, package_unit = self.normalize(tmp_size) model.set_value(package_iter, 7, str(package_size)+package_unit) if not self.updating: self.updating = True gobject.timeout_add_seconds(1, self.update) return package_iter def update(self): """(icon, status, None, name, progress, progress_visible, current_size, total_size, speed, time, services)""" if self.updating: files = self.get_files() if files: model = self.treeview.get_model() package_iter = model.get_iter_root() active_downloads = 0 complete_downloads = 0 total_downloads = 0 total_speed = 0 while package_iter: file_iter = model.iter_children(package_iter) package_status = model.get_value(package_iter, 1) package_progress = 0 package_speed = 0 package_complete_downloads = 0 tmp_actual_size = [] tmp_total_size = [] children_names = [] while file_iter: total_downloads += 1 name = model.get_value(file_iter, 3) children_names.append(name) for file in files: if file.name == name: model.set_value(file_iter, 0, self.icons[file.status]) model.set_value(file_iter, 1, file.status) if file.status in [cons.STATUS_ACTIVE, cons.STATUS_WAIT]: active_downloads += 1 if file.progress: model.set_value(file_iter, 4, file.progress) package_progress += file.progress if file.actual_size: model.set_value(file_iter, 6, str(file.actual_size)+file.actual_size_unit) tmp_actual_size.append((file.actual_size, file.actual_size_unit)) tmp_total_size.append((file.total_size, file.total_size_unit)) if file.speed: model.set_value(file_iter, 8, str(file.speed)+cons.UNIT_SPEED) package_speed += file.speed else: model.set_value(file_iter, 8, None) if file.status == cons.STATUS_CORRECT: complete_downloads += 1 package_complete_downloads += 1 if not file.time > 0: file.time = 1 file.actual_size = file.total_size file.actual_size_unit = file.total_size_unit model.set_value(file_iter, 9, misc.calculate_time(file.time)) link_iter = model.iter_children(file_iter) while link_iter: for tmp_link in file.links: if tmp_link.url == model.get_value(link_iter, 3): service_icon = self.unactive_service_icon link_status = cons.STATUS_STOP if tmp_link.active: service_icon = self.active_service_icon link_status = cons.STATUS_ACTIVE model.set_value(link_iter, 0, service_icon) model.set_value(link_iter, 1, link_status) link_iter = model.iter_next(link_iter) file_iter = model.iter_next(file_iter) package_actual_size, package_actual_unit = self.normalize(tmp_actual_size) package_total_size, package_total_unit = self.normalize(tmp_total_size) if len(children_names) == package_complete_downloads: if package_status != cons.STATUS_CORRECT: model.set_value(package_iter, 1, cons.STATUS_CORRECT) model.set_value(package_iter, 4, 100) model.set_value(package_iter, 6, str(package_total_size)+package_total_unit) shared.events.trigger_package_complete(model.get_value(package_iter, 10), children_names) elif package_actual_size > 0: model.set_value(package_iter, 4, package_progress/len(children_names)) model.set_value(package_iter, 6, str(package_actual_size)+package_actual_unit) if package_speed > 0: model.set_value(package_iter, 8, str(package_speed)+cons.UNIT_SPEED) else: model.set_value(package_iter, 8, None) total_speed += package_speed package_iter = model.iter_next(package_iter) self.status_bar.pop(self.status_bar.get_context_id("Downloads")) self.status_bar.push(self.status_bar.get_context_id("Downloads"), " Downstream %dKB/s \tTotal %d \t Complete %d \t Active %d" % (total_speed, total_downloads, complete_downloads, active_downloads)) return True def normalize(self, sizes): """""" total = 0 total_unit = cons.UNIT_KB for size, unit in sizes: total += self.get_size(size, unit) tmp = int(total/1024) if tmp > 0: total = tmp total_unit = cons.UNIT_MB tmp = int(tmp/1024) # if tmp > 0: # total = tmp # total_unit = cons.UNIT_GB return total, total_unit def get_size(self, size, unit): """""" if unit == cons.UNIT_KB: return size elif unit == cons.UNIT_MB: return size*1024 #elif unit == cons.UNIT_GB: # return size*1024*1024 def get_packages(self): """""" model = self.treeview.get_model() package_iter = model.get_iter_root() packages = [] info = [] while package_iter: files = [] file_iter = model.iter_children(package_iter) while file_iter: if model.get_value(file_iter, 1) != cons.STATUS_CORRECT: links = [] plugins = [] link_iter = model.iter_children(file_iter) while link_iter: links.append(model.get_value(link_iter, 3)) plugins.append(model.get_value(link_iter, 10)) link_iter = model.iter_next(link_iter) name = model.get_value(file_iter, 3) tmp = model.get_value(file_iter, 7) for unit in [cons.UNIT_KB, cons.UNIT_MB]: tmp_size = tmp.split(unit) if len(tmp_size) > 1: size_unit = unit size = int(tmp_size[0]) break tmp = model.get_value(file_iter, 10) tmp = tmp.split(",") service_list = [] for service in tmp: service_list.append(service.split("\'")[1]) files.append((links, name, service_list, size, size_unit, plugins)) file_iter = model.iter_next(file_iter) if len(files) > 0: name = model.get_value(package_iter, 3) packages.append((name, files)) path = model.get_value(package_iter, 10).split(name)[0] info.append((path, name, model.get_value(package_iter, 2))) package_iter = model.iter_next(package_iter) return packages, info def get_links(self, iter): """""" links = [] model = self.treeview.get_model() file_iter = model.iter_children(iter) if not file_iter: links.append(model.get_value(iter, 3)) while file_iter: link_iter = model.iter_children(file_iter) if not link_iter: links.append(model.get_value(file_iter, 3)) while link_iter: links.append(model.get_value(link_iter, 3)) link_iter = model.iter_next(link_iter) file_iter = model.iter_next(file_iter) return links def package_files(self, package_iter): """""" files = [] model = self.treeview.get_model() file_iter = model.iter_children(package_iter) while file_iter: if model.get_value(file_iter, 1) not in [cons.STATUS_ACTIVE, cons.STATUS_WAIT, cons.STATUS_CORRECT]: files.append(model.get_value(file_iter, 3)) file_iter = model.iter_next(file_iter) return files def clear(self): """""" files = [] model = self.treeview.get_model() package_iter = model.get_iter_root() while package_iter: tmp_iter = package_iter package_iter = model.iter_next(package_iter) files += self.delete_package([cons.STATUS_CORRECT], tmp_iter) return files def delete_package(self, status, package_iter): """""" tmp = [] model = self.treeview.get_model() file_iter = model.iter_children(package_iter) while file_iter: if model.get_value(file_iter, 1) in status: tmp.append(model.get_value(file_iter, 3)) file_iter = model.iter_next(file_iter) if len(tmp) == model.iter_n_children(package_iter): model.remove(package_iter) else: tmp = [] return tmp def delete_file(self, status, iter): """""" model = self.treeview.get_model() if model.get_value(iter, 1) in status: if model.iter_n_children(model.iter_parent(iter)) > 1: result = model.get_value(iter, 3) model.remove(iter) return result def delete_link(self, status, iter): """""" result = None, None model = self.treeview.get_model() file_iter = model.iter_parent(iter) if model.iter_n_children(file_iter) > 1: if model.get_value(iter, 1) == cons.STATUS_STOP: result = model.get_value(file_iter, 3), model.get_value(iter, 3) model.remove(iter) return result def move_up(self, iter): """""" model = self.treeview.get_model() package_iter = model.iter_parent(iter) file_iter = model.iter_children(package_iter) prev_iter = None while ((file_iter) and (model.get_path(file_iter) != model.get_path(iter))): prev_iter = file_iter file_iter = model.iter_next(file_iter) if prev_iter: model.move_before(iter, prev_iter) return True def move_down(self, iter): """""" model = self.treeview.get_model() next_iter = model.iter_next(iter) if next_iter: model.move_after(iter, next_iter) return True
class Application(gtk.Window): """This class represents an application""" # application = None # # def __new__(cls, *args, **kwargs): # if cls.application: # return cls.application # else: # cls.application = super(Application, cls).__new__(cls) # cls.application.initialize() # return cls.application # # def initialize(self): def __init__(self): gtk.Window.__init__(self) self.set_size_request(640, 480) self.set_default_size(1366, 768) #self.set_default_size(800, 600) self.winstate = 0 self.maximize() self.connect("delete-event", self.quit) self.bindings = gtk.AccelGroup() self.add_accel_group(self.bindings) self.setup = gtk.PageSetup() self.settings = gtk.PrintSettings() self.filename = None self.update_title() icon = gtk.gdk.pixbuf_new_from_file(os.path.join(os.path.dirname(__file__), "..", "images", "canvas-logo.png")) self.set_icon(icon) vbox = gtk.VBox() self.add(vbox) self.menu = MenuBar(self) vbox.pack_start(self.menu, False, False) self.menu.append_menu("_" + _("File")) self.menu.append_item(gtk.STOCK_NEW, "new", "<Control>N") self.menu.append_item(gtk.STOCK_OPEN, "open", "<Control>O") self.menu.append_item(gtk.STOCK_SAVE, "save", "<Control>S") self.menu.append_item(gtk.STOCK_SAVE_AS, "save-as", "<Control><Shift>S") self.menu.append_separator() self.menu.append_item(gtk.STOCK_PAGE_SETUP, "page-setup") self.menu.append_item(gtk.STOCK_PRINT_PREVIEW, "print-preview", "<Control><Shift>P") self.menu.append_item(gtk.STOCK_PRINT, "print", "<Control>P") self.menu.append_separator() self.menu.append_menu("_" + _("Document"), True) self.menu.append_item(SET_BACKGROUND, "set-background") self.menu.ascend() self.menu.append_separator() self.menu.append_menu("_" + _("Export"), True) self.menu.append_item(EXPORT_TO_PDF, "export-to-pdf") self.menu.ascend() self.menu.append_separator() self.menu.append_item(gtk.STOCK_QUIT, "quit", "<Control>Q") self.menu.append_menu("_" + _("Edit")) self.menu.append_item(gtk.STOCK_UNDO, "undo", "<Control>Z") self.menu.append_item(gtk.STOCK_REDO, "redo", "<Control>Y") self.menu.append_separator() self.menu.append_item(gtk.STOCK_COPY, "copy", "<Control>C") self.menu.append_item(gtk.STOCK_CUT, "cut", "<Control>X") self.menu.append_item(gtk.STOCK_PASTE, "paste", "<Control>V") self.menu.append_separator() self.menu.append_item(gtk.STOCK_DELETE, "delete", "Delete") self.menu.append_separator() self.menu.append_item(gtk.STOCK_SELECT_ALL, "select-all", "<Control>A") self.menu.append_menu("_" + _("View")) self.menu.append_toggle(MARGINS_ENABLED, "margins") self.menu.append_toggle(GRID, "grid") self.menu.append_toggle(GUIDES, "guides") self.menu.append_toggle(SNAP_ENABLED, "snap") self.menu.append_toggle(_("Z-Order hint"), "hints", toggled = False) self.menu.append_separator() self.menu.append_toggle(gtk.STOCK_PROPERTIES, "properties") self.menu.append_toggle(_("Menubar"), "menubar") self.menu.append_toggle(_("Statusbar"), "statusbar") self.menu.append_menu("_" + _("Insert")) self.menu.append_item(LINE, "line") self.menu.append_item(ARC, "arc") self.menu.append_item(CURVE, "curve") self.menu.append_item(CONNECTOR, "connector") self.menu.append_menu(BOX, "box", True) self.menu.append_item(BOX, "box") self.menu.append_item(SPLIT_HORIZONTALLY, "split-horizontally") self.menu.append_item(SPLIT_VERTICALLY, "split-vertically") self.menu.append_item(REMOVE_SPLIT, "remove-split") self.menu.ascend() self.menu.append_item(ROUNDED_BOX, "rounded-box") self.menu.append_item(TEXT, "text") self.menu.append_item(TABLE, "table") self.menu.append_item(CHART, "chart") self.menu.append_item(BARCODE, "barcode") self.menu.append_item(IMAGE, "image") self.menu.append_menu("_" + _("Format")) self.menu.append_item(gtk.STOCK_SELECT_FONT, "select-font") self.menu.append_separator() self.menu.append_item(gtk.STOCK_SELECT_COLOR, "select-color") self.menu.append_menu("_" + _("Tools")) self.menu.append_item(GROUP, "group", "<Control>G") self.menu.append_item(UNGROUP, "ungroup", "<Control><Shift>G") self.menu.append_separator() self.menu.append_item(BRING_TO_FRONT, "bring-to-front", "<Control>plus") self.menu.append_item(BRING_TO_BACK, "bring-to-back", "<Control>minus") self.menu.append_separator() self.menu.append_menu("_" + _("Zoom"), True) self.menu.append_item(gtk.STOCK_ZOOM_FIT, "zoom-fit", "<Control>0") self.menu.append_item(gtk.STOCK_ZOOM_100, "zoom-100", "<Control>1") self.menu.append_item(gtk.STOCK_ZOOM_IN, "zoom-in", "<Control><Shift>plus") self.menu.append_item(gtk.STOCK_ZOOM_OUT, "zoom-out", "<Control><Shift>minus") self.menu.ascend() self.menu.append_separator() self.menu.append_menu("_" + _("Objects alignment"), True) self.menu.append_item(ALIGN_OBJECTS_NORTHWEST, "align-objects-northwest") self.menu.append_item(ALIGN_OBJECTS_NORTH, "align-objects-north") self.menu.append_item(ALIGN_OBJECTS_NORTHEAST, "align-objects-northeast") self.menu.append_item(ALIGN_OBJECTS_SOUTHWEST, "align-objects-southwest") self.menu.append_item(ALIGN_OBJECTS_SOUTH, "align-objects-south") self.menu.append_item(ALIGN_OBJECTS_SOUTHEAST, "align-objects-southeast") self.menu.append_item(ALIGN_OBJECTS_WEST, "align-objects-west") self.menu.append_item(ALIGN_OBJECTS_CENTER_BOTH, "align-objects-center-both") self.menu.append_item(ALIGN_OBJECTS_EAST, "align-objects-east") self.menu.append_item(ALIGN_OBJECTS_CENTER_HORIZONTAL, "align-objects-center-horizontal") self.menu.append_item(ALIGN_OBJECTS_CENTER_VERTICAL, "align-objects-center-vertical") self.menu.ascend() self.menu.append_menu("_" + _("Paper alignment"), True) self.menu.append_item(ALIGN_PAPER_NORTHWEST, "align-paper-northwest") self.menu.append_item(ALIGN_PAPER_NORTH, "align-paper-north") self.menu.append_item(ALIGN_PAPER_NORTHEAST, "align-paper-northeast") self.menu.append_item(ALIGN_PAPER_SOUTHWEST, "align-paper-southwest") self.menu.append_item(ALIGN_PAPER_SOUTH, "align-paper-south") self.menu.append_item(ALIGN_PAPER_SOUTHEAST, "align-paper-southeast") self.menu.append_item(ALIGN_PAPER_WEST, "align-paper-west") self.menu.append_item(ALIGN_PAPER_CENTER_BOTH, "align-paper-center-both") self.menu.append_item(ALIGN_PAPER_EAST, "align-paper-east") self.menu.append_item(ALIGN_PAPER_CENTER_HORIZONTAL, "align-paper-center-horizontal") self.menu.append_item(ALIGN_PAPER_CENTER_VERTICAL, "align-paper-center-vertical") self.menu.ascend() self.menu.append_menu("_" + _("Window")) self.menu.append_item(gtk.STOCK_FULLSCREEN, "fullscreen", "<Control>F") self.menu.append_menu("_" + _("Help"), right=True) self.menu.append_item(gtk.STOCK_HELP, "help", "F1") self.menu.append_separator() self.menu.append_item(gtk.STOCK_ABOUT, "about") self.menu.show_all() htoolbar = Toolbar(HORIZONTAL) vbox.pack_start(htoolbar, False, False) htoolbar.append(gtk.STOCK_NEW, "new") htoolbar.append(gtk.STOCK_OPEN, "open") htoolbar.append(gtk.STOCK_SAVE, "save") htoolbar.append_separator() htoolbar.append(gtk.STOCK_PRINT, "print") htoolbar.append_separator() htoolbar.append(gtk.STOCK_UNDO, "undo") htoolbar.append(gtk.STOCK_REDO, "redo") htoolbar.append_separator() htoolbar.append(gtk.STOCK_CUT, "cut") htoolbar.append(gtk.STOCK_COPY, "copy") htoolbar.append(gtk.STOCK_PASTE, "paste") htoolbar.append_separator() htoolbar.append(gtk.STOCK_DELETE, "delete") htoolbar.append_separator() htoolbar.append_with_submenu(LINE_STYLE_CONTINUOUS, "line-style-continuous") htoolbar.append_to_submenu(LINE_STYLE_POINT_DASH, "line-style-point-dash") htoolbar.append_to_submenu(LINE_STYLE_POINT, "line-style-point") htoolbar.append_to_submenu(LINE_STYLE_DASH, "line-style-dash") htoolbar.append_separator() htoolbar.append_with_submenu(gtk.STOCK_ZOOM_FIT, "zoom-fit") htoolbar.append_to_submenu(gtk.STOCK_ZOOM_100, "zoom-100") htoolbar.append_to_submenu(gtk.STOCK_ZOOM_IN, "zoom-in") htoolbar.append_to_submenu(gtk.STOCK_ZOOM_OUT, "zoom-out") htoolbar.append_separator() htoolbar.append_toggle(MARGINS_ENABLED, "margins") htoolbar.append_toggle(GRID, "grid") htoolbar.append_toggle(GUIDES, "guides") htoolbar.append_toggle(SNAP_ENABLED, "snap") htoolbar.append_separator() htoolbar.append(EXPORT_TO_PDF, "export-to-pdf") htoolbar.append_separator() htoolbar.append_toggle(GROUP, "group") htoolbar.append_separator() htoolbar.append(BRING_TO_FRONT, "bring-to-front") htoolbar.append(BRING_TO_BACK, "bring-to-back") htoolbar.append_separator() htoolbar.append_with_submenu(ALIGN_OBJECTS_CENTER_BOTH, "align-object-center-both") htoolbar.append_to_submenu(ALIGN_OBJECTS_NORTHWEST, "align-object-northwest") htoolbar.append_to_submenu(ALIGN_OBJECTS_NORTH, "align-object-north") htoolbar.append_to_submenu(ALIGN_OBJECTS_SOUTHWEST, "align-object-southwest") htoolbar.append_to_submenu(ALIGN_OBJECTS_NORTHEAST, "align-object-northeast") htoolbar.append_to_submenu(ALIGN_OBJECTS_SOUTH, "align-object-south") htoolbar.append_to_submenu(ALIGN_OBJECTS_SOUTHEAST, "align-object-southeast") htoolbar.append_to_submenu(ALIGN_OBJECTS_WEST, "align-object-west") htoolbar.append_to_submenu(ALIGN_OBJECTS_EAST, "align-object-east") htoolbar.append_to_submenu(ALIGN_OBJECTS_CENTER_HORIZONTAL, "align-object-center-horizontal") htoolbar.append_to_submenu(ALIGN_OBJECTS_CENTER_VERTICAL, "align-object-center-vertical") htoolbar.append_with_submenu(ALIGN_PAPER_CENTER_BOTH, "align-paper-center-both") htoolbar.append_to_submenu(ALIGN_PAPER_NORTHWEST, "align-paper-northwest") htoolbar.append_to_submenu(ALIGN_PAPER_NORTH, "align-paper-north") htoolbar.append_to_submenu(ALIGN_PAPER_SOUTHWEST, "align-paper-southwest") htoolbar.append_to_submenu(ALIGN_PAPER_NORTHEAST, "align-paper-northeast") htoolbar.append_to_submenu(ALIGN_PAPER_SOUTH, "align-paper-south") htoolbar.append_to_submenu(ALIGN_PAPER_SOUTHEAST, "align-paper-southeast") htoolbar.append_to_submenu(ALIGN_PAPER_WEST, "align-paper-west") htoolbar.append_to_submenu(ALIGN_PAPER_EAST, "align-paper-east") htoolbar.append_to_submenu(ALIGN_PAPER_CENTER_HORIZONTAL, "align-paper-center-horizontal") htoolbar.append_to_submenu(ALIGN_PAPER_CENTER_VERTICAL, "align-paper-center-vertical") htoolbar.append_separator() htoolbar.append(gtk.STOCK_HELP, "help") hbox = gtk.HBox() vbox.add(hbox) vtoolbar = Toolbar() vtoolbar.set_style(gtk.TOOLBAR_ICONS) hbox.pack_start(vtoolbar, False, False) vtoolbar.append(LINE, "line") vtoolbar.append(ARC, "arc") vtoolbar.append(CURVE, "curve") vtoolbar.append(CONNECTOR, "connector") vtoolbar.append_with_submenu(BOX, "box") vtoolbar.append_to_submenu(SPLIT_HORIZONTALLY, "split-horizontally") vtoolbar.append_to_submenu(SPLIT_VERTICALLY, "split-vertically") vtoolbar.append_to_submenu(REMOVE_SPLIT, "remove-split") vtoolbar.append(ROUNDED_BOX, "rounded-box") vtoolbar.append(TEXT, "text") vtoolbar.append(BARCODE, "barcode") vtoolbar.append(TABLE, "table") vtoolbar.append(CHART, "chart") vtoolbar.append(IMAGE, "image") notebook = gtk.Notebook() notebook.set_show_tabs(True) notebook.set_show_border(False) #notebook.set_tab_pos(gtk.POS_LEFT) notebook.set_tab_pos(gtk.POS_RIGHT) hbox.add(notebook) self.status = Statusbar() self.id = self.status.get_context_id(_("Edit mode")) vbox.pack_start(self.status, False, False) label = gtk.Label(_("Design view")) label.set_angle(90) self.editor = Editor(self) self.editor.set_paper() notebook.append_page(self.editor, label) label = gtk.Label(_("XML view")) label.set_angle(90) def get_source_view(): source = gtk.ScrolledWindow() source.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) view = gtk.TextView() self.code = gtk.TextBuffer() view.set_buffer(self.code) source.add(view) return source if '--source-editor-test' in sys.argv: while True: try: from ui.code_editor import SourcePad except: source = get_source_view() break source = SourcePad(self) self.code = source.buffer source.set_language("xml") break else: source = get_source_view() notebook.append_page(source, label) self.menu.connect("new", self.new) self.menu.connect("open", self.open) self.menu.connect("save", self.save) self.menu.connect("save-as", self.save_as) self.menu.connect("page-setup", self.page_setup) self.menu.connect("export-to-pdf", self.export_to_pdf) self.menu.connect("set-background", self.set_background) self.menu.connect("quit", self.quit) self.menu.connect("cut", self.editor.canvas.cut) self.menu.connect("copy", self.editor.canvas.copy) self.menu.connect("paste", self.editor.canvas.paste) self.menu.connect("delete", self.editor.canvas.delete) self.menu.connect("select-all", self.editor.canvas.select_all) self.menu.connect("margins", self.editor.canvas.toggle_margins) self.menu.connect("grid", self.editor.canvas.toggle_grid) self.menu.connect("guides", self.editor.canvas.toggle_guides) self.menu.connect("snap", self.editor.canvas.toggle_snap) self.menu.connect("hints", self.editor.canvas.toggle_hints) self.menu.connect("properties", self.editor.toggle_properties) self.menu.connect("menubar", self.toggle_menubar) self.menu.connect("statusbar", self.toggle_statusbar) self.menu.connect("bring-to-front", self.editor.canvas.bring_to_front) self.menu.connect("bring-to-back", self.editor.canvas.bring_to_back) self.menu.connect("align-paper-center-horizontal", self.editor.canvas.paper_center_horizontal) self.menu.connect("line", self.create, "Line") self.menu.connect("curve", self.create, "Curve") self.menu.connect("connector", self.create, "Connector") self.menu.connect("box", self.create, "Box") self.menu.connect("rounded-box", self.create, "Rounded") self.menu.connect("text", self.create, "Text") self.menu.connect("barcode", self.create, "BarCode") self.menu.connect("table", self.create, "Table") self.menu.connect("image", self.create, "Image") self.menu.connect("chart", self.create, "Chart") self.menu.connect("fullscreen", self.fullscreen) self.menu.connect("about", self.about) self.menu.connect("help", self.help) self.menu.connect("split-horizontally", self.editor.canvas.split_horizontally) self.menu.connect("split-vertically", self.editor.canvas.split_vertically) self.menu.connect("remove-split", self.editor.canvas.remove_split) htoolbar.connect("new", self.new) htoolbar.connect("open", self.open) htoolbar.connect("save", self.save) htoolbar.connect("snap", self.editor.canvas.toggle_snap) htoolbar.connect("grid", self.editor.canvas.toggle_grid) htoolbar.connect("guides", self.editor.canvas.toggle_guides) htoolbar.connect("margins", self.editor.canvas.toggle_margins) htoolbar.connect("cut", self.editor.canvas.cut) htoolbar.connect("copy", self.editor.canvas.copy) htoolbar.connect("paste", self.editor.canvas.paste) htoolbar.connect("delete", self.editor.canvas.delete) htoolbar.connect("bring-to-front", self.editor.canvas.bring_to_front) htoolbar.connect("bring-to-back", self.editor.canvas.bring_to_back) htoolbar.connect("export-to-pdf", self.export_to_pdf) htoolbar.connect("help", self.help) vtoolbar.connect("line", self.create, "Line") vtoolbar.connect("arc", self.create, "Arc") vtoolbar.connect("curve", self.create, "Curve") vtoolbar.connect("connector", self.create, "Connector") vtoolbar.connect("box", self.create, "Box") vtoolbar.connect("rounded-box", self.create, "Rounded") vtoolbar.connect("text", self.create, "Text") vtoolbar.connect("barcode", self.create, "BarCode") vtoolbar.connect("table", self.create, "Table") vtoolbar.connect("image", self.create, "Image") vtoolbar.connect("chart", self.create, "Chart") vtoolbar.connect("split-horizontally", self.editor.canvas.split_horizontally) vtoolbar.connect("split-vertically", self.editor.canvas.split_vertically) vtoolbar.connect("remove-split", self.editor.canvas.remove_split) notebook.connect("switch-page", self.switch) self.connect("key-press-event", self.key_press) def run(self): self.show_all() gtk.main() def update_title(self): document = self.filename if self.filename else _("New document") title = _("%(document)s - Sanaviron %(version)s") % {"document": document, "version": VERSION} self.set_title(title) def disable_bindings(self): self.remove_accel_group(self.bindings) def enable_bindings(self): self.add_accel_group(self.bindings) def switch(self, widget, child, page): document = self.editor.canvas.serialize() self.code.set_text(document) def key_handler(self, keyname): if keyname == "<Control><Shift>V": self.editor.canvas.add_box_separator_vertical() if keyname == "<Control><Shift>H": self.editor.canvas.add_box_separator_horizontal() if keyname == "<Control><Shift>Escape": self.toggle_menubar() if keyname in ["<Control><Shift>Colon", "<Control><Shift>Period"]: self.editor.canvas.hints ^= 1 self.editor.canvas.update() def key_press(self, widget, event): keyval = event.keyval keyname = gtk.gdk.keyval_name(keyval) if keyname.startswith('Control') or\ keyname.startswith('Shift') or\ keyname.startswith('Alt'): return False keyname = keyname.capitalize() if event.state & gtk.gdk.SHIFT_MASK: keyname = "<Shift>%s" % keyname if event.state & gtk.gdk.CONTROL_MASK: keyname = "<Control>%s" % keyname self.key_handler(keyname) return False def toggle_menubar(self, *args): if self.menu.get_visible(): self.menu.hide() self.editor.notification.notificate(_("Press <i><b>Control+Shift+Escape</b></i> to show again."), INFORMATION) else: self.menu.show() def toggle_statusbar(self, *args): if self.status.get_visible(): self.status.hide() else: self.status.show() def new(self, widget, data): self.editor.canvas.children = list() self.editor.canvas.queue_draw() def open(self, widget, data): # XXX funcional dialog = gtk.FileChooserDialog(title=_("Open document"), parent=self, action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), backend=None) dialog.set_transient_for(self) dialog.set_default_response(gtk.RESPONSE_OK) filter = gtk.FileFilter() filter.set_name(_("XML files")) filter.add_mime_type("document/xml") filter.add_pattern("*.xml") dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name(_("All files")) filter.add_pattern("*") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() self.filename = filename if filename is not None: self.editor.canvas.load_from_xml(filename) self.update_title() dialog.destroy() def save(self, widget, data): if not self.filename: return current = self.editor.canvas.serialize() original = open(self.filename).read() print original print current if original == current: return print "saving" #self.editor.canvas.save_to_xml(self.filename) def save_as(self, widget, data): dialog = gtk.FileChooserDialog(title=_("Save document as"), parent=self, action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT), backend=None) dialog.set_transient_for(self) dialog.set_default_response(gtk.RESPONSE_ACCEPT) filter = gtk.FileFilter() filter.set_name(_("XML files")) filter.add_mime_type("document/xml") filter.add_pattern("*.xml") dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name(_("All files")) filter.add_pattern("*") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() self.filename = filename if filename is not None: self.editor.canvas.save_to_xml(filename) self.update_title() dialog.destroy() def page_setup(self, widget, data): self.setup.settings = self.settings self.setup = gtk.print_run_page_setup_dialog(self, self.setup, self.settings) size = self.setup.get_paper_size() orientation = self.setup.get_orientation() # TODO canvas->margins for page in self.editor.canvas.pages: page.top = self.setup.get_top_margin(gtk.UNIT_POINTS) page.left = self.setup.get_left_margin(gtk.UNIT_POINTS) page.bottom = self.setup.get_bottom_margin(gtk.UNIT_POINTS) page.right = self.setup.get_right_margin(gtk.UNIT_POINTS) width = size.get_width(gtk.UNIT_POINTS) height = size.get_height(gtk.UNIT_POINTS) # no int if orientation in (gtk.PAGE_ORIENTATION_PORTRAIT, gtk.PAGE_ORIENTATION_REVERSE_PORTRAIT): orientation = _("Vertical") width = int(width) height = int(height) else: orientation = _("Landscape") saved_height = height height = int(width) width = int(saved_height) # TODO: canvas->page_size for page in self.editor.canvas.pages: page.width = width page.height = height name = size.get_display_name() text = "%s %s (%d dots x %d dots)" % (name, orientation, width, height) self.status.push(self.id, text) self.editor.canvas.queue_draw() def export_to_pdf(self, widget, format): dialog = gtk.FileChooserDialog(title=_("Save PDF file as"), parent=self, action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT), backend=None) dialog.set_transient_for(self) dialog.set_default_response(gtk.RESPONSE_ACCEPT) filter = gtk.FileFilter() filter.set_name(_("PDF files")) filter.add_mime_type("document/pdf") filter.add_pattern("*.pdf") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() if filename is not None: self.editor.canvas.save_to_pdf(filename) dialog.destroy() def set_background(self, widget, data): dialog = gtk.FileChooserDialog(title=_("Select background"), parent=self, action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), backend=None) def update_preview(dialog, preview): filename = dialog.get_preview_filename() try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 128, 128) preview.set_from_pixbuf(pixbuf) have_preview = True except: have_preview = False dialog.set_preview_widget_active(have_preview) preview = gtk.Image() dialog.set_preview_widget(preview) dialog.connect("update-preview", update_preview, preview) dialog.set_transient_for(self) def add_filter(dialog, name, pattern, type=None): filter = gtk.FileFilter() filter.set_name(name) if type: filter.add_mime_type(type) filter.add_pattern(pattern) dialog.add_filter(filter) add_filter(dialog, "PNG files", "*.png", "image/png") add_filter(dialog, "JPG files", "*.jpg", "image/jpg") add_filter(dialog, "All files", "*") response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() self.filename = filename if filename is not None: self.editor.canvas.document.pages[0].background = filename self.editor.canvas.update () dialog.destroy() def fullscreen(self, widget, data): if not self.winstate: self.winstate = not self.winstate self.window.fullscreen() else: self.window.unfullscreen() def quit(self, widget, event): print "Motion events:", self.editor.canvas.statics.motion print "Expose events:", self.editor.canvas.statics.expose print "Consumed motion events:", self.editor.canvas.statics.consumed.motion print("Bye ;-)") gtk.main_quit() return True create = lambda self, widget, data, name: self.editor.canvas.create(Shape(name)) def help(self, widget, data): cwd = os.getcwd() language = get_parsed_language() url = 'file://%s/../doc/help/%s/index.html' % (cwd, language) import webbrowser webbrowser.open_new(url) def about(self, widget, data): dialog = gtk.AboutDialog() dialog.set_transient_for(self) dialog.set_program_name("sanaviron") dialog.set_name("sanaviron") dialog.set_version(VERSION) dialog.set_copyright("Copyright 2012 - Juan Manuel Mouriz, Ivlev Denis") dialog.set_comments(_("A program to design reports, invoices, documents, labels and more. Based on the 2D " "drawing engine \"sanaviron\".\n\n" + get_summary())) dialog.set_website("http://www.sanaviron.org/") dialog.set_website_label(_("Official site")) dialog.set_license(open(os.path.join(os.path.dirname(__file__), "..", "..", "COPYING")).read()) dialog.set_wrap_license(False) dialog.set_authors(["Juan Manuel Mouriz <*****@*****.**>", "Ivlev Denis <*****@*****.**>"]) dialog.set_documenters([_("Undocumented yet :'(")]) dialog.set_artists(["Juan Manuel Mouriz <*****@*****.**>", "Ivlev Denis <*****@*****.**>"]) dialog.set_translator_credits("Juan Manuel Mouriz <*****@*****.**> " + _( "(Spanish)") + "\n" + "Ivlev Denis <*****@*****.**> " + _("(Russian)")) logo = gtk.gdk.pixbuf_new_from_file(os.path.join(os.path.dirname(__file__), "..", "images", "canvas-logo.png")) dialog.set_logo(logo) #dialog.set_logo_icon_name(self.icon_name) dialog.run() dialog.destroy()
class Application(gtk.Window): """This class represents an application""" # application = None # # def __new__(cls, *args, **kwargs): # if cls.application: # return cls.application # else: # cls.application = super(Application, cls).__new__(cls) # cls.application.initialize() # return cls.application # # def initialize(self): def __init__(self): gtk.Window.__init__(self) self.set_size_request(640, 480) self.set_default_size(1366, 768) #self.set_default_size(800, 600) self.winstate = 0 self.maximize() self.connect("delete-event", self.quit) self.bindings = gtk.AccelGroup() self.add_accel_group(self.bindings) self.setup = gtk.PageSetup() self.settings = gtk.PrintSettings() self.filename = None self.update_title() icon = gtk.gdk.pixbuf_new_from_file( os.path.join(os.path.dirname(__file__), "..", "images", "canvas-logo.png")) self.set_icon(icon) vbox = gtk.VBox() self.add(vbox) self.menu = MenuBar(self) vbox.pack_start(self.menu, False, False) self.menu.append_menu("_" + _("File")) self.menu.append_item(gtk.STOCK_NEW, "new", "<Control>N") self.menu.append_item(gtk.STOCK_OPEN, "open", "<Control>O") self.menu.append_item(gtk.STOCK_SAVE, "save", "<Control>S") self.menu.append_item(gtk.STOCK_SAVE_AS, "save-as", "<Control><Shift>S") self.menu.append_separator() self.menu.append_item(gtk.STOCK_PAGE_SETUP, "page-setup") self.menu.append_item(gtk.STOCK_PRINT_PREVIEW, "print-preview", "<Control><Shift>P") self.menu.append_item(gtk.STOCK_PRINT, "print", "<Control>P") self.menu.append_separator() self.menu.append_menu("_" + _("Document"), True) self.menu.append_item(SET_BACKGROUND, "set-background") self.menu.ascend() self.menu.append_separator() self.menu.append_menu("_" + _("Export"), True) self.menu.append_item(EXPORT_TO_PDF, "export-to-pdf") self.menu.ascend() self.menu.append_separator() self.menu.append_item(gtk.STOCK_QUIT, "quit", "<Control>Q") self.menu.append_menu("_" + _("Edit")) self.menu.append_item(gtk.STOCK_UNDO, "undo", "<Control>Z") self.menu.append_item(gtk.STOCK_REDO, "redo", "<Control>Y") self.menu.append_separator() self.menu.append_item(gtk.STOCK_COPY, "copy", "<Control>C") self.menu.append_item(gtk.STOCK_CUT, "cut", "<Control>X") self.menu.append_item(gtk.STOCK_PASTE, "paste", "<Control>V") self.menu.append_separator() self.menu.append_item(gtk.STOCK_DELETE, "delete", "Delete") self.menu.append_separator() self.menu.append_item(gtk.STOCK_SELECT_ALL, "select-all", "<Control>A") self.menu.append_menu("_" + _("View")) self.menu.append_toggle(MARGINS_ENABLED, "margins") self.menu.append_toggle(GRID, "grid") self.menu.append_toggle(GUIDES, "guides") self.menu.append_toggle(SNAP_ENABLED, "snap") self.menu.append_toggle(_("Z-Order hint"), "hints", toggled=False) self.menu.append_separator() self.menu.append_toggle(gtk.STOCK_PROPERTIES, "properties") self.menu.append_toggle(_("Menubar"), "menubar") self.menu.append_toggle(_("Statusbar"), "statusbar") self.menu.append_menu("_" + _("Insert")) self.menu.append_item(LINE, "line") self.menu.append_item(ARC, "arc") self.menu.append_item(CURVE, "curve") self.menu.append_item(CONNECTOR, "connector") self.menu.append_menu(BOX, "box", True) self.menu.append_item(BOX, "box") self.menu.append_item(SPLIT_HORIZONTALLY, "split-horizontally") self.menu.append_item(SPLIT_VERTICALLY, "split-vertically") self.menu.append_item(REMOVE_SPLIT, "remove-split") self.menu.ascend() self.menu.append_item(ROUNDED_BOX, "rounded-box") self.menu.append_item(TEXT, "text") self.menu.append_item(TABLE, "table") self.menu.append_item(CHART, "chart") self.menu.append_item(BARCODE, "barcode") self.menu.append_item(IMAGE, "image") self.menu.append_menu("_" + _("Format")) self.menu.append_item(gtk.STOCK_SELECT_FONT, "select-font") self.menu.append_separator() self.menu.append_item(gtk.STOCK_SELECT_COLOR, "select-color") self.menu.append_menu("_" + _("Tools")) self.menu.append_item(GROUP, "group", "<Control>G") self.menu.append_item(UNGROUP, "ungroup", "<Control><Shift>G") self.menu.append_separator() self.menu.append_item(BRING_TO_FRONT, "bring-to-front", "<Control>plus") self.menu.append_item(BRING_TO_BACK, "bring-to-back", "<Control>minus") self.menu.append_separator() self.menu.append_menu("_" + _("Zoom"), True) self.menu.append_item(gtk.STOCK_ZOOM_FIT, "zoom-fit", "<Control>0") self.menu.append_item(gtk.STOCK_ZOOM_100, "zoom-100", "<Control>1") self.menu.append_item(gtk.STOCK_ZOOM_IN, "zoom-in", "<Control><Shift>plus") self.menu.append_item(gtk.STOCK_ZOOM_OUT, "zoom-out", "<Control><Shift>minus") self.menu.ascend() self.menu.append_separator() self.menu.append_menu("_" + _("Objects alignment"), True) self.menu.append_item(ALIGN_OBJECTS_NORTHWEST, "align-objects-northwest") self.menu.append_item(ALIGN_OBJECTS_NORTH, "align-objects-north") self.menu.append_item(ALIGN_OBJECTS_NORTHEAST, "align-objects-northeast") self.menu.append_item(ALIGN_OBJECTS_SOUTHWEST, "align-objects-southwest") self.menu.append_item(ALIGN_OBJECTS_SOUTH, "align-objects-south") self.menu.append_item(ALIGN_OBJECTS_SOUTHEAST, "align-objects-southeast") self.menu.append_item(ALIGN_OBJECTS_WEST, "align-objects-west") self.menu.append_item(ALIGN_OBJECTS_CENTER_BOTH, "align-objects-center-both") self.menu.append_item(ALIGN_OBJECTS_EAST, "align-objects-east") self.menu.append_item(ALIGN_OBJECTS_CENTER_HORIZONTAL, "align-objects-center-horizontal") self.menu.append_item(ALIGN_OBJECTS_CENTER_VERTICAL, "align-objects-center-vertical") self.menu.ascend() self.menu.append_menu("_" + _("Paper alignment"), True) self.menu.append_item(ALIGN_PAPER_NORTHWEST, "align-paper-northwest") self.menu.append_item(ALIGN_PAPER_NORTH, "align-paper-north") self.menu.append_item(ALIGN_PAPER_NORTHEAST, "align-paper-northeast") self.menu.append_item(ALIGN_PAPER_SOUTHWEST, "align-paper-southwest") self.menu.append_item(ALIGN_PAPER_SOUTH, "align-paper-south") self.menu.append_item(ALIGN_PAPER_SOUTHEAST, "align-paper-southeast") self.menu.append_item(ALIGN_PAPER_WEST, "align-paper-west") self.menu.append_item(ALIGN_PAPER_CENTER_BOTH, "align-paper-center-both") self.menu.append_item(ALIGN_PAPER_EAST, "align-paper-east") self.menu.append_item(ALIGN_PAPER_CENTER_HORIZONTAL, "align-paper-center-horizontal") self.menu.append_item(ALIGN_PAPER_CENTER_VERTICAL, "align-paper-center-vertical") self.menu.ascend() self.menu.append_menu("_" + _("Window")) self.menu.append_item(gtk.STOCK_FULLSCREEN, "fullscreen", "<Control>F") self.menu.append_menu("_" + _("Help"), right=True) self.menu.append_item(gtk.STOCK_HELP, "help", "F1") self.menu.append_separator() self.menu.append_item(gtk.STOCK_ABOUT, "about") self.menu.show_all() htoolbar = Toolbar(HORIZONTAL) vbox.pack_start(htoolbar, False, False) htoolbar.append(gtk.STOCK_NEW, "new") htoolbar.append(gtk.STOCK_OPEN, "open") htoolbar.append(gtk.STOCK_SAVE, "save") htoolbar.append_separator() htoolbar.append(gtk.STOCK_PRINT, "print") htoolbar.append_separator() htoolbar.append(gtk.STOCK_UNDO, "undo") htoolbar.append(gtk.STOCK_REDO, "redo") htoolbar.append_separator() htoolbar.append(gtk.STOCK_CUT, "cut") htoolbar.append(gtk.STOCK_COPY, "copy") htoolbar.append(gtk.STOCK_PASTE, "paste") htoolbar.append_separator() htoolbar.append(gtk.STOCK_DELETE, "delete") htoolbar.append_separator() htoolbar.append_with_submenu(LINE_STYLE_CONTINUOUS, "line-style-continuous") htoolbar.append_to_submenu(LINE_STYLE_POINT_DASH, "line-style-point-dash") htoolbar.append_to_submenu(LINE_STYLE_POINT, "line-style-point") htoolbar.append_to_submenu(LINE_STYLE_DASH, "line-style-dash") htoolbar.append_separator() htoolbar.append_with_submenu(gtk.STOCK_ZOOM_FIT, "zoom-fit") htoolbar.append_to_submenu(gtk.STOCK_ZOOM_100, "zoom-100") htoolbar.append_to_submenu(gtk.STOCK_ZOOM_IN, "zoom-in") htoolbar.append_to_submenu(gtk.STOCK_ZOOM_OUT, "zoom-out") htoolbar.append_separator() htoolbar.append_toggle(MARGINS_ENABLED, "margins") htoolbar.append_toggle(GRID, "grid") htoolbar.append_toggle(GUIDES, "guides") htoolbar.append_toggle(SNAP_ENABLED, "snap") htoolbar.append_separator() htoolbar.append(EXPORT_TO_PDF, "export-to-pdf") htoolbar.append_separator() htoolbar.append_toggle(GROUP, "group") htoolbar.append_separator() htoolbar.append(BRING_TO_FRONT, "bring-to-front") htoolbar.append(BRING_TO_BACK, "bring-to-back") htoolbar.append_separator() htoolbar.append_with_submenu(ALIGN_OBJECTS_CENTER_BOTH, "align-object-center-both") htoolbar.append_to_submenu(ALIGN_OBJECTS_NORTHWEST, "align-object-northwest") htoolbar.append_to_submenu(ALIGN_OBJECTS_NORTH, "align-object-north") htoolbar.append_to_submenu(ALIGN_OBJECTS_SOUTHWEST, "align-object-southwest") htoolbar.append_to_submenu(ALIGN_OBJECTS_NORTHEAST, "align-object-northeast") htoolbar.append_to_submenu(ALIGN_OBJECTS_SOUTH, "align-object-south") htoolbar.append_to_submenu(ALIGN_OBJECTS_SOUTHEAST, "align-object-southeast") htoolbar.append_to_submenu(ALIGN_OBJECTS_WEST, "align-object-west") htoolbar.append_to_submenu(ALIGN_OBJECTS_EAST, "align-object-east") htoolbar.append_to_submenu(ALIGN_OBJECTS_CENTER_HORIZONTAL, "align-object-center-horizontal") htoolbar.append_to_submenu(ALIGN_OBJECTS_CENTER_VERTICAL, "align-object-center-vertical") htoolbar.append_with_submenu(ALIGN_PAPER_CENTER_BOTH, "align-paper-center-both") htoolbar.append_to_submenu(ALIGN_PAPER_NORTHWEST, "align-paper-northwest") htoolbar.append_to_submenu(ALIGN_PAPER_NORTH, "align-paper-north") htoolbar.append_to_submenu(ALIGN_PAPER_SOUTHWEST, "align-paper-southwest") htoolbar.append_to_submenu(ALIGN_PAPER_NORTHEAST, "align-paper-northeast") htoolbar.append_to_submenu(ALIGN_PAPER_SOUTH, "align-paper-south") htoolbar.append_to_submenu(ALIGN_PAPER_SOUTHEAST, "align-paper-southeast") htoolbar.append_to_submenu(ALIGN_PAPER_WEST, "align-paper-west") htoolbar.append_to_submenu(ALIGN_PAPER_EAST, "align-paper-east") htoolbar.append_to_submenu(ALIGN_PAPER_CENTER_HORIZONTAL, "align-paper-center-horizontal") htoolbar.append_to_submenu(ALIGN_PAPER_CENTER_VERTICAL, "align-paper-center-vertical") htoolbar.append_separator() htoolbar.append(gtk.STOCK_HELP, "help") hbox = gtk.HBox() vbox.add(hbox) vtoolbar = Toolbar() vtoolbar.set_style(gtk.TOOLBAR_ICONS) hbox.pack_start(vtoolbar, False, False) vtoolbar.append(LINE, "line") vtoolbar.append(ARC, "arc") vtoolbar.append(CURVE, "curve") vtoolbar.append(CONNECTOR, "connector") vtoolbar.append_with_submenu(BOX, "box") vtoolbar.append_to_submenu(SPLIT_HORIZONTALLY, "split-horizontally") vtoolbar.append_to_submenu(SPLIT_VERTICALLY, "split-vertically") vtoolbar.append_to_submenu(REMOVE_SPLIT, "remove-split") vtoolbar.append(ROUNDED_BOX, "rounded-box") vtoolbar.append(TEXT, "text") vtoolbar.append(BARCODE, "barcode") vtoolbar.append(TABLE, "table") vtoolbar.append(CHART, "chart") vtoolbar.append(IMAGE, "image") notebook = gtk.Notebook() notebook.set_show_tabs(True) notebook.set_show_border(False) #notebook.set_tab_pos(gtk.POS_LEFT) notebook.set_tab_pos(gtk.POS_RIGHT) hbox.add(notebook) self.status = Statusbar() self.id = self.status.get_context_id(_("Edit mode")) vbox.pack_start(self.status, False, False) label = gtk.Label(_("Design view")) label.set_angle(90) self.editor = Editor(self) self.editor.set_paper() notebook.append_page(self.editor, label) label = gtk.Label(_("XML view")) label.set_angle(90) def get_source_view(): source = gtk.ScrolledWindow() source.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) view = gtk.TextView() self.code = gtk.TextBuffer() view.set_buffer(self.code) source.add(view) return source if '--source-editor-test' in sys.argv: while True: try: from ui.code_editor import SourcePad except: source = get_source_view() break source = SourcePad(self) self.code = source.buffer source.set_language("xml") break else: source = get_source_view() notebook.append_page(source, label) self.menu.connect("new", self.new) self.menu.connect("open", self.open) self.menu.connect("save", self.save) self.menu.connect("save-as", self.save_as) self.menu.connect("page-setup", self.page_setup) self.menu.connect("export-to-pdf", self.export_to_pdf) self.menu.connect("set-background", self.set_background) self.menu.connect("quit", self.quit) self.menu.connect("cut", self.editor.canvas.cut) self.menu.connect("copy", self.editor.canvas.copy) self.menu.connect("paste", self.editor.canvas.paste) self.menu.connect("delete", self.editor.canvas.delete) self.menu.connect("select-all", self.editor.canvas.select_all) self.menu.connect("margins", self.editor.canvas.toggle_margins) self.menu.connect("grid", self.editor.canvas.toggle_grid) self.menu.connect("guides", self.editor.canvas.toggle_guides) self.menu.connect("snap", self.editor.canvas.toggle_snap) self.menu.connect("hints", self.editor.canvas.toggle_hints) self.menu.connect("properties", self.editor.toggle_properties) self.menu.connect("menubar", self.toggle_menubar) self.menu.connect("statusbar", self.toggle_statusbar) self.menu.connect("bring-to-front", self.editor.canvas.bring_to_front) self.menu.connect("bring-to-back", self.editor.canvas.bring_to_back) self.menu.connect("align-paper-center-horizontal", self.editor.canvas.paper_center_horizontal) self.menu.connect("line", self.create, "Line") self.menu.connect("curve", self.create, "Curve") self.menu.connect("connector", self.create, "Connector") self.menu.connect("box", self.create, "Box") self.menu.connect("rounded-box", self.create, "Rounded") self.menu.connect("text", self.create, "Text") self.menu.connect("barcode", self.create, "BarCode") self.menu.connect("table", self.create, "Table") self.menu.connect("image", self.create, "Image") self.menu.connect("chart", self.create, "Chart") self.menu.connect("fullscreen", self.fullscreen) self.menu.connect("about", self.about) self.menu.connect("help", self.help) self.menu.connect("split-horizontally", self.editor.canvas.split_horizontally) self.menu.connect("split-vertically", self.editor.canvas.split_vertically) self.menu.connect("remove-split", self.editor.canvas.remove_split) htoolbar.connect("new", self.new) htoolbar.connect("open", self.open) htoolbar.connect("save", self.save) htoolbar.connect("snap", self.editor.canvas.toggle_snap) htoolbar.connect("grid", self.editor.canvas.toggle_grid) htoolbar.connect("guides", self.editor.canvas.toggle_guides) htoolbar.connect("margins", self.editor.canvas.toggle_margins) htoolbar.connect("cut", self.editor.canvas.cut) htoolbar.connect("copy", self.editor.canvas.copy) htoolbar.connect("paste", self.editor.canvas.paste) htoolbar.connect("delete", self.editor.canvas.delete) htoolbar.connect("bring-to-front", self.editor.canvas.bring_to_front) htoolbar.connect("bring-to-back", self.editor.canvas.bring_to_back) htoolbar.connect("export-to-pdf", self.export_to_pdf) htoolbar.connect("help", self.help) vtoolbar.connect("line", self.create, "Line") vtoolbar.connect("arc", self.create, "Arc") vtoolbar.connect("curve", self.create, "Curve") vtoolbar.connect("connector", self.create, "Connector") vtoolbar.connect("box", self.create, "Box") vtoolbar.connect("rounded-box", self.create, "Rounded") vtoolbar.connect("text", self.create, "Text") vtoolbar.connect("barcode", self.create, "BarCode") vtoolbar.connect("table", self.create, "Table") vtoolbar.connect("image", self.create, "Image") vtoolbar.connect("chart", self.create, "Chart") vtoolbar.connect("split-horizontally", self.editor.canvas.split_horizontally) vtoolbar.connect("split-vertically", self.editor.canvas.split_vertically) vtoolbar.connect("remove-split", self.editor.canvas.remove_split) notebook.connect("switch-page", self.switch) self.connect("key-press-event", self.key_press) def run(self): self.show_all() gtk.main() def update_title(self): document = self.filename if self.filename else _("New document") title = _("%(document)s - Sanaviron %(version)s") % { "document": document, "version": VERSION } self.set_title(title) def disable_bindings(self): self.remove_accel_group(self.bindings) def enable_bindings(self): self.add_accel_group(self.bindings) def switch(self, widget, child, page): document = self.editor.canvas.serialize() self.code.set_text(document) def key_handler(self, keyname): if keyname == "<Control><Shift>V": self.editor.canvas.add_box_separator_vertical() if keyname == "<Control><Shift>H": self.editor.canvas.add_box_separator_horizontal() if keyname == "<Control><Shift>Escape": self.toggle_menubar() if keyname in ["<Control><Shift>Colon", "<Control><Shift>Period"]: self.editor.canvas.hints ^= 1 self.editor.canvas.update() def key_press(self, widget, event): keyval = event.keyval keyname = gtk.gdk.keyval_name(keyval) if keyname.startswith('Control') or\ keyname.startswith('Shift') or\ keyname.startswith('Alt'): return False keyname = keyname.capitalize() if event.state & gtk.gdk.SHIFT_MASK: keyname = "<Shift>%s" % keyname if event.state & gtk.gdk.CONTROL_MASK: keyname = "<Control>%s" % keyname self.key_handler(keyname) return False def toggle_menubar(self, *args): if self.menu.get_visible(): self.menu.hide() self.editor.notification.notificate( _("Press <i><b>Control+Shift+Escape</b></i> to show again."), INFORMATION) else: self.menu.show() def toggle_statusbar(self, *args): if self.status.get_visible(): self.status.hide() else: self.status.show() def new(self, widget, data): self.editor.canvas.children = list() self.editor.canvas.queue_draw() def open(self, widget, data): # XXX funcional dialog = gtk.FileChooserDialog( title=_("Open document"), parent=self, action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), backend=None) dialog.set_transient_for(self) dialog.set_default_response(gtk.RESPONSE_OK) filter = gtk.FileFilter() filter.set_name(_("XML files")) filter.add_mime_type("document/xml") filter.add_pattern("*.xml") dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name(_("All files")) filter.add_pattern("*") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() self.filename = filename if filename is not None: self.editor.canvas.load_from_xml(filename) self.update_title() dialog.destroy() def save(self, widget, data): if not self.filename: return current = self.editor.canvas.serialize() original = open(self.filename).read() print original print current if original == current: return print "saving" #self.editor.canvas.save_to_xml(self.filename) def save_as(self, widget, data): dialog = gtk.FileChooserDialog( title=_("Save document as"), parent=self, action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT), backend=None) dialog.set_transient_for(self) dialog.set_default_response(gtk.RESPONSE_ACCEPT) filter = gtk.FileFilter() filter.set_name(_("XML files")) filter.add_mime_type("document/xml") filter.add_pattern("*.xml") dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name(_("All files")) filter.add_pattern("*") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() self.filename = filename if filename is not None: self.editor.canvas.save_to_xml(filename) self.update_title() dialog.destroy() def page_setup(self, widget, data): self.setup.settings = self.settings self.setup = gtk.print_run_page_setup_dialog(self, self.setup, self.settings) size = self.setup.get_paper_size() orientation = self.setup.get_orientation() # TODO canvas->margins for page in self.editor.canvas.pages: page.top = self.setup.get_top_margin(gtk.UNIT_POINTS) page.left = self.setup.get_left_margin(gtk.UNIT_POINTS) page.bottom = self.setup.get_bottom_margin(gtk.UNIT_POINTS) page.right = self.setup.get_right_margin(gtk.UNIT_POINTS) width = size.get_width(gtk.UNIT_POINTS) height = size.get_height(gtk.UNIT_POINTS) # no int if orientation in (gtk.PAGE_ORIENTATION_PORTRAIT, gtk.PAGE_ORIENTATION_REVERSE_PORTRAIT): orientation = _("Vertical") width = int(width) height = int(height) else: orientation = _("Landscape") saved_height = height height = int(width) width = int(saved_height) # TODO: canvas->page_size for page in self.editor.canvas.pages: page.width = width page.height = height name = size.get_display_name() text = "%s %s (%d dots x %d dots)" % (name, orientation, width, height) self.status.push(self.id, text) self.editor.canvas.queue_draw() def export_to_pdf(self, widget, format): dialog = gtk.FileChooserDialog( title=_("Save PDF file as"), parent=self, action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT), backend=None) dialog.set_transient_for(self) dialog.set_default_response(gtk.RESPONSE_ACCEPT) filter = gtk.FileFilter() filter.set_name(_("PDF files")) filter.add_mime_type("document/pdf") filter.add_pattern("*.pdf") dialog.add_filter(filter) response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() if filename is not None: self.editor.canvas.save_to_pdf(filename) dialog.destroy() def set_background(self, widget, data): dialog = gtk.FileChooserDialog( title=_("Select background"), parent=self, action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT), backend=None) def update_preview(dialog, preview): filename = dialog.get_preview_filename() try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( filename, 128, 128) preview.set_from_pixbuf(pixbuf) have_preview = True except: have_preview = False dialog.set_preview_widget_active(have_preview) preview = gtk.Image() dialog.set_preview_widget(preview) dialog.connect("update-preview", update_preview, preview) dialog.set_transient_for(self) def add_filter(dialog, name, pattern, type=None): filter = gtk.FileFilter() filter.set_name(name) if type: filter.add_mime_type(type) filter.add_pattern(pattern) dialog.add_filter(filter) add_filter(dialog, "PNG files", "*.png", "image/png") add_filter(dialog, "JPG files", "*.jpg", "image/jpg") add_filter(dialog, "All files", "*") response = dialog.run() if response == gtk.RESPONSE_ACCEPT: filename = dialog.get_filename() self.filename = filename if filename is not None: self.editor.canvas.document.pages[0].background = filename self.editor.canvas.update() dialog.destroy() def fullscreen(self, widget, data): if not self.winstate: self.winstate = not self.winstate self.window.fullscreen() else: self.window.unfullscreen() def quit(self, widget, event): print "Motion events:", self.editor.canvas.statics.motion print "Expose events:", self.editor.canvas.statics.expose print "Consumed motion events:", self.editor.canvas.statics.consumed.motion print("Bye ;-)") gtk.main_quit() return True create = lambda self, widget, data, name: self.editor.canvas.create( Shape(name)) def help(self, widget, data): cwd = os.getcwd() language = get_parsed_language() url = 'file://%s/../doc/help/%s/index.html' % (cwd, language) import webbrowser webbrowser.open_new(url) def about(self, widget, data): dialog = gtk.AboutDialog() dialog.set_transient_for(self) dialog.set_program_name("sanaviron") dialog.set_name("sanaviron") dialog.set_version(VERSION) dialog.set_copyright( "Copyright 2012 - Juan Manuel Mouriz, Ivlev Denis") dialog.set_comments( _("A program to design reports, invoices, documents, labels and more. Based on the 2D " "drawing engine \"sanaviron\".\n\n" + get_summary())) dialog.set_website("http://www.sanaviron.org/") dialog.set_website_label(_("Official site")) dialog.set_license( open(os.path.join(os.path.dirname(__file__), "..", "..", "COPYING")).read()) dialog.set_wrap_license(False) dialog.set_authors([ "Juan Manuel Mouriz <*****@*****.**>", "Ivlev Denis <*****@*****.**>" ]) dialog.set_documenters([_("Undocumented yet :'(")]) dialog.set_artists([ "Juan Manuel Mouriz <*****@*****.**>", "Ivlev Denis <*****@*****.**>" ]) dialog.set_translator_credits( "Juan Manuel Mouriz <*****@*****.**> " + _("(Spanish)") + "\n" + "Ivlev Denis <*****@*****.**> " + _("(Russian)")) logo = gtk.gdk.pixbuf_new_from_file( os.path.join(os.path.dirname(__file__), "..", "images", "canvas-logo.png")) dialog.set_logo(logo) #dialog.set_logo_icon_name(self.icon_name) dialog.run() dialog.destroy()