diff options
Diffstat (limited to 'icondialog.py')
-rw-r--r-- | icondialog.py | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/icondialog.py b/icondialog.py new file mode 100644 index 0000000..1087d8a --- /dev/null +++ b/icondialog.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2013 Ignacio RodrÃguez <ignacio@sugarlabs.org> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import shutil +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from jarabe.journal.model import get_documents_path +from sugar3.activity.activity import get_bundle_path +from sugar3.graphics.toolbutton import ToolButton +from sugar3.graphics.toolbarbox import ToolbarBox +from gettext import gettext as _ +import os + +DEFAULT_NAME = "default-pippy.svg" +DEFAULT_ICON = os.path.join(get_bundle_path(), 'activity', + 'activity-default.svg') + + +def get_document_icons(): + icons = os.listdir(get_documents_path()) + icons_ = [] + for icon in icons: + if icon.endswith('.svg'): + icons_.append(icon[:-4]) + + return icons_ + + +def get_user_path(): + user = os.path.expanduser("~") + path = os.path.join(user, ".icons") + if not os.path.exists(path): + os.mkdir(path) + if os.path.exists(DEFAULT_NAME): + os.remove(DEFAULT_NAME) + shutil.copy(DEFAULT_ICON, os.path.join(path, DEFAULT_NAME)) + return path + + +def get_usericons_icons(): + path = get_user_path() + icons = os.listdir(path) + icons_ = [] + for icon in icons: + if icon.endswith('.svg'): + icons_.append(icon[:-4]) + + return icons_ + + +def get_user_icons(): + home = get_usericons_icons() + documents = get_document_icons() + final = [] + + for x in home: + final.append(x) + + for x in documents: + final.append(x) + + return final + + +class IconDialog(Gtk.Window): + def __init__(self): + Gtk.Window.__init__(self) + + self.theme = Gtk.IconTheme.get_default() + self.theme.append_search_path(get_documents_path()) + + self._icon = None + grid = Gtk.Grid() + + self.x, self.y = (Gdk.Screen.width() / 1.5, Gdk.Screen.height() / 1.5) + self.set_size_request(self.x, self.y) + + self.icons = None + toolbox = self.build_toolbar() + self.icons = self.build_scroll() + + grid.attach(toolbox, 0, 1, 1, 1) + grid.attach(self.icons, 0, 2, 1, 1) + + self.set_decorated(False) + self.set_skip_pager_hint(True) + self.set_skip_taskbar_hint(True) + self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) + self.set_resizable(False) + self.set_modal(True) + + self.add(grid) + self.show_all() + + def build_toolbar(self): + toolbox = ToolbarBox() + + label = Gtk.Label("\t" + _('Select an icon')) + label.modify_fg(Gtk.StateType.NORMAL, + Gdk.color_parse('white')) + + item = Gtk.ToolItem() + item.add(label) + + close = ToolButton('entry-cancel') + close.connect('clicked', lambda x: self.destroy()) + + separator = Gtk.SeparatorToolItem() + separator.props.draw = False + separator.set_expand(True) + + toolbox.toolbar.insert(item, -1) + toolbox.toolbar.insert(separator, -1) + toolbox.toolbar.insert(close, -1) + + return toolbox + + def get_icon(self): + return self._icon + + def build_scroll(self): + scroll = Gtk.ScrolledWindow() + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + + icons = self.build_icons() + + scroll.set_size_request(self.x, self.y) + scroll.add_with_viewport(icons) + return scroll + + def build_icons(self): + store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) + + icon_view = Gtk.IconView.new_with_model(store) + icon_view.set_selection_mode(Gtk.SelectionMode.SINGLE) + icon_view.connect('selection-changed', self.set_icon, store) + icon_view.set_pixbuf_column(0) + icon_view.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('#D5D5D5')) + + for icon in get_user_icons(): + info = self.theme.lookup_icon(icon, 55, + Gtk.IconLookupFlags.FORCE_SVG) + if not info: + continue + icon_path = os.path.join(get_user_path(), icon + ".svg") + if not os.path.exists(icon_path): + icon_path = os.path.join(get_documents_path(), icon + ".svg") + + if not os.path.exists(icon_path): + icon_path = info.get_filename() + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( + icon_path, 55, 55) + store.insert(-1, [pixbuf, icon, icon_path]) + + return icon_view + + def set_icon(self, widget, model): + try: + iter_ = model.get_iter(widget.get_selected_items()[0]) + except: + return + + icon_path = model.get(iter_, 2)[0] + self._icon = icon_path + self.destroy()
\ No newline at end of file |