def save_as_doc(self, doc, win=None): wnd = win or self.wins[0] doc_file = doc.doc_file doc_file = doc_file or doc.model.name if os.path.splitext(doc_file)[1] != "." + \ uc2const.FORMAT_EXTENSION[uc2const.SKP][0]: doc_file = os.path.splitext(doc_file)[0] + "." + \ uc2const.FORMAT_EXTENSION[uc2const.SKP][0] if not os.path.exists(os.path.dirname(doc_file)): doc_file = os.path.join(config.save_dir, os.path.basename(doc_file)) ret = dialogs.get_save_file_name( wnd, doc_file, file_types=uc2const.PALETTE_SAVERS) if ret and len(ret) == 2: try: doc_file, saver_id = ret saver = get_saver_by_id(saver_id) saver(doc, doc_file, translate=False, convert=True) LOG.info('Palette saved to %s', doc_file) return True except Exception as e: msg = _('Cannot save file:') msg = "%s\n'%s'" % (msg, doc_file) + '\n' msg2 = _('Details see in logs') wal.error_dialog(wnd, self.appdata.app_name, msg, msg2) LOG.exception('Cannot save file <%s>' % doc_file, e) return False
def _get_doc_form_file(self, filepath=None, win=None, title=None): doc = None wnd = win or self.wins[0] if wnd and not filepath: filepath = dialogs.get_open_file_name( wnd, config.open_dir, title, uc2const.PALETTE_LOADERS) if not filepath: return if os.path.isfile(filepath): try: loader = get_loader(filepath) if not loader: raise LookupError('Cannot find loader for %s' % filepath) doc = loader(self.appdata, filepath, convert=True) self._normalize_colors(doc) config.open_dir = str(os.path.dirname(filepath)) except Exception as e: msg = _('Cannot parse file:') msg = "%s\n'%s'" % (msg, filepath) + '\n' msg2 = _('The file may be corrupted or not supported format') wal.error_dialog(wnd, self.appdata.app_name, msg, msg2) LOG.exception('Cannot parse file <%s>' % filepath, e) return doc
def on_about(self, *_args, **kwargs): keys = { 'transient_for': kwargs.get('transient_for') or self.wins[-1], 'logo_icon_name': None, 'version': self.appdata.version + self.appdata.revision, 'copyright': '2019 © sK1 Project', 'comments': _('Cross-platform palette editor'), 'website': 'https://sk1project.net/color-picker/', 'website_label': _('Project website'), 'license_type': 'GPLv3', 'authors': ['Igor E. Novikov', 'Maxim S. Barabash (build scripts)'], 'translator_credits': 'Russian - Igor E. Novikov\n' 'Ukrainian - Maxim S. Barabash, ' 'Eugeniy Fedirets', 'artists': None, } wal.about_dialog(**keys)
def reflect_transaction(self): mark = '' if self.history.is_saved() else ' [*]' self.mw.set_title(self.app.appdata.app_name + mark) subtitle = self.doc.model.name or _('Untitled palette') if not self.doc.model.name: self.doc.model.name = subtitle colornum = len(self.grid.cells) txt = _('colors') self.mw.set_subtitle('%s (%s %s)' % (subtitle, colornum, txt)) self.dc.refresh()
def set_color_hexvalue(self, index, hexvalue): try: clr = uc2.cms.hexcolor_to_rgb(hexvalue) except Exception: wal.error_dialog(self.canvas.mw, _('Wrong value'), _('Wrong color value: ') + hexvalue, _('Fix it and try again')) return cell = self.cells[index] color = deepcopy(self.cells[index].color) color[1] = clr api.change_color(self.canvas, cell, color)
def __init__(self, app, doc): wal.PaletteWindow.__init__(self, app, app.appdata.app_name) menu = [ [ (_('New palette'), 'new', self.on_new, None), (_('Open palette...'), 'open', self.on_open, None), (_('Save as...'), 'save-as', self.on_save_as, None), ], [ (_('Properties...'), 'properties', self.on_props, None), ], [ (_('Palette Collection'), 'palettes', app.on_palettes, None), ], [ (_('Online help'), 'online-help', app.on_help, None), (_('About Color Picker'), 'about', self.on_about, None), ], [(_('Quit'), 'exit', self.app.exit, None), ], ] self.make_menu(menu) acc_keys = [ [('Ctrl', 'N'), self.on_new], [('Ctrl', 'O'), self.on_open], [('Ctrl-Shift', 'O'), self.on_paste_from], [('Ctrl', 'S'), self.on_save_as], [('None', 'Home'), self.go_home], [('None', 'End'), self.go_end], [('None', 'KP_Home'), self.go_home], [('None', 'KP_End'), self.go_end], [('None', 'Page_Up'), self.page_up], [('None', 'Page_Down'), self.page_down], [('None', 'KP_Page_Up'), self.page_up], [('None', 'KP_Page_Down'), self.page_down], [('Ctrl', 'Up'), self.canvas_up], [('Ctrl', 'Down'), self.canvas_down], [('Ctrl', 'KP_Up'), self.canvas_up], [('Ctrl', 'KP_Down'), self.canvas_down], [('Ctrl', 'Z'), self.canvas_undo], [('Ctrl-Shift', 'Z'), self.canvas_redo], [('Ctrl-Shift', 'A'), self.deselect], [('Ctrl', 'A'), self.select_all], [('None', 'Delete'), self.delete_selected], [('None', 'KP_Delete'), self.delete_selected], [('Ctrl', 'C'), self.copy_selected], [('Ctrl', 'X'), self.cut_selected], [('Ctrl', 'V'), self.paste], [('Ctrl', 'D'), self.duplicate], ] self.make_shortcuts(acc_keys) self.set_min_size(*config.mw_min_size) self.center() self.show() self.set_doc(doc) LOG.info('Palette window created for %s', self.canvas.doc.model.name)
def get_save_file_name( parent, path, title=None, file_types=None, path_only=False): title = title or _('Save file as...') path = path or os.path.expanduser('~') descr = uc2const.FORMAT_DESCRIPTION ext = uc2const.FORMAT_EXTENSION ft = [] if file_types: for item in file_types: ft.append(('*.' + ext[item][0], descr[item])) ret = wal.get_save_file_name(parent, path, title, ft) if not path_only and isinstance(ret, tuple): for wildcard, descr in ft: if ret[1] == descr: index = ft.index((wildcard, descr)) doc_file = ret[0] if os.path.splitext(doc_file)[1] != "." + \ uc2const.FORMAT_EXTENSION[file_types[index]][0]: doc_file = os.path.splitext(doc_file)[0] + "." + \ uc2const.FORMAT_EXTENSION[file_types[index]][0] return doc_file, file_types[index] return ret
def get_open_file_name(parent, default_dir=None, title=None, file_types=None): title = title or _('Select file to open') default_dir = default_dir or os.path.expanduser('~') descr = uc2const.FORMAT_DESCRIPTION ext = uc2const.FORMAT_EXTENSION all_ = [(['*'], '*.* - All files'), ] ft = [] if file_types: for item in file_types: ft.append((['*.%s' % ext[item][0]], descr[item])) if ft: supported = [ext[0] for ext, _txt in ft] ft.insert(0, (supported, _('All supported files'))) file_types = ft + all_ if ft else all_ return wal.get_open_file_name(parent, default_dir, title, file_types)
def on_props(self, *_args): model = self.canvas.doc.model kwargs = { 'name': (_('Name:'), model.name), 'source': (_('Source:'), model.source), 'columns': (_('Columns:'), model.columns), 'comments': (_('Comments:'), model.comments), } ret = wal.properties_dialog(self, _('Palette properties'), **kwargs) kwargs = { 'name': model.name, 'source': model.source, 'columns': model.columns, 'comments': model.comments, } if ret and ret != kwargs: api.change_meta(self.canvas, ret) self.canvas.reflect_transaction() LOG.info('Metainfo changed for %s', model.name)
def __init__(self, mw, doc): self.mw = mw self.doc = doc self.app = mw.app self.dc = mw.dc self.cms = self.app.default_cms self.history = UndoHistory(self) self.selection = [] self.grid = ColorGrid(self) self.scroll = ScrollObj(self) self.z_order = [ LogoObj(self), self.scroll, AddButtonObj(self), self.grid, BackgroundObj(self), ] self.reflect_transaction() self.ctx_menu = [ [ (_('Cut'), 'cut', self.mw.cut_selected, self.is_selection), (_('Copy'), 'copy', self.mw.copy_selected, self.is_selection), (_('Paste'), 'paste', self.mw.paste, self.mw.is_clipboard), ], [ (_('Change color'), 'change-color', self.grid.on_change_color, self.is_single_selection), ], [ (_('Delete'), 'delete', self.mw.delete_selected, self.is_selection), (_('Duplicate'), 'duplicate', self.mw.duplicate, self.is_selection), ], [ (_('Select all'), 'select-all', self.mw.select_all, self.is_not_selected), (_('Deselect'), 'deselect', self.mw.deselect, self.is_selection), ], [ (_('Paste from file...'), 'paste-from', self.mw.on_paste_from, None), ], ]
def paste_from(self, filepath=None, win=None): doc = self._get_doc_form_file(filepath, win, title=_('Select file to paste from')) if not doc: return colors = [] + doc.model.colors if len(win.canvas.selection) == 1: api.insert_colors(win.canvas, win.canvas.selection[0], colors) else: api.add_colors(win.canvas, colors) LOG.info('Palette updated from %s', doc.doc_file) doc.close()
def close_action(self, *_args): if not self.canvas.history.is_saved(): palette_name = self.canvas.doc.model.name or _('Untitled palette') ret = wal.yesno_dialog( self, self.app.appdata.app_name, 'Palette "%s" is modified' % palette_name, 'Do you wish to save changes?') if ret: if not self.app.save_as_doc(self.canvas.doc, self): LOG.info('Palette window destroying canceled for %s', self.canvas.doc.model.name) return True LOG.info('Palette window destroyed for %s', self.canvas.doc.model.name) wal.PaletteWindow.destroy(self) self.app.drop_win(self) return False
def do_startup(self): wal.Application.do_startup(self) wal.init_clipboard() self.set_app_name(self.appdata.app_name) menu = [[], [ (_('New palette'), 'new', self.on_new, None), (_('Open palette...'), 'open', self.on_open, None), ], [ (_('Palette Collection'), 'palettes', self.on_palettes, None), ], [ (_('Online help'), 'online-help', self.on_help, None), (_('About Color Picker'), 'about', self.on_about, None), ], [(_('Quit'), 'exit', self.exit, None), ], ] self.make_menu(menu) LOG.info('Application startup successful')
def change_color(self, cell): clr0 = [] + cell.color[1] clr = wal.color_dialog(self.canvas.mw, _('Change color'), clr0) if clr and clr0 != clr: color = [uc2const.COLOR_RGB, clr, 1.0, cell.color[3], ''] api.change_color(self.canvas, cell, color)
def on_left_released(self, _event): clr = wal.color_dialog(self.canvas.mw, _('Select color')) if clr: color = [uc2const.COLOR_RGB, clr, 1.0, '', ''] api.add_color(self.canvas, color)