def _get_base_colors(self):
     colors = copy(self._get_selector().get_harmonized())
     if colors is None:
         return None
     for i in self.base_colors.iterkeys():
         n = len(colors)
         if i > n - 1:
             for t in range(i - n + 1):
                 colors.append(None)
         colors[i] = self.base_colors[i]
     return colors
    def _do_harmony(self):
        base = self._get_base_colors()
        if base is None:
            return
        colors = []
        for c in base:
            if c is None:
                colors.append([])
            else:
                colors.append(self.shader.shades(c, self._shades_parameter))

        for i, row in enumerate(colors):
            for j, clr in enumerate(row):
                try:
                    self.model.swatches[j][i].color = clr
                    #self.swatches[i][j].setColor_(clr)
                except IndexError:
                    print i, j
    def restore(self, palette_filename=None):
        if palette_filename is None:
            palette_filename = locate_palette("default.gpl")
        if exists(palette_filename):
            palette = load_palette(palette_filename)
            self._load_palette(palette)

        settings = self.settings
        self.restoreGeometry(settings.value("geometry").toByteArray())
        self.restoreState(settings.value("windowState").toByteArray())

        selector_idx, ok = settings.value("selector/tab").toUInt()
        if ok:
            self.tabs.setCurrentIndex(selector_idx)

        mixer_idx, ok = settings.value("selector/mixer").toUInt()
        if ok:
            _, mixer = self.available_selector_mixers[mixer_idx]
            self.selector.setMixer(mixer, mixer_idx)

        clr = self._get_settings_color(settings, "current_color")
        if clr:
            self._select_color(clr)

        mixer_idx, ok = settings.value("palette/mixer").toUInt()
        if ok:
            _, mixer = self.available_mixers[mixer_idx]
            self.setMixer(mixer, mixer_idx)

        space_idx, ok = settings.value("matching/space").toUInt()
        if ok:
            self.matching_spaces.setCurrentIndex(space_idx)

        harmony_idx, ok = settings.value("harmonies/harmony").toUInt()
        if ok:
            self.harmonies.setCurrentIndex(harmony_idx)

        shader_idx, ok = settings.value("harmonies/shader").toUInt()
        if ok:
            self.shaders.setCurrentIndex(shader_idx)

        auto = settings.value("harmonies/auto").toBool()
        self.auto_harmony.setChecked(auto)

        harmony_param, ok = settings.value("harmonies/harmony_param").toUInt()
        if ok:
            self.harmony_slider.setValue(harmony_param)

        shader_param, ok = settings.value("harmonies/shader_param").toUInt()
        if ok:
            self.shades_slider.setValue(shader_param)

        nswatches = settings.beginReadArray("swatches")
        for idx in range(nswatches):
            settings.setArrayIndex(idx)
            j = idx % 5
            i = idx // 5
            clr = self._get_settings_color(settings, "color")
            if clr:
                self.swatches[i][j].setColor_(clr)
        settings.endArray()

        nclrs = settings.beginReadArray("scratchpad")
        colors = []
        for idx in range(nclrs):
            settings.setArrayIndex(idx)
            clr = self._get_settings_color(settings, "color")
            w, ok = settings.value("width").toReal()
            if clr and ok:
                colors.append((clr, w))
        self.scratchpad.colors = colors
        settings.endArray()

        self.undoStack.clear()