예제 #1
0
 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
예제 #2
0
    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
예제 #3
0
 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)
예제 #4
0
    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()
예제 #5
0
 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)
예제 #6
0
    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)
예제 #7
0
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
예제 #8
0
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)
예제 #9
0
 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)
예제 #10
0
    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),
            ],
        ]
예제 #11
0
    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()
예제 #12
0
 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
예제 #13
0
    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')
예제 #14
0
 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)
예제 #15
0
 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)