Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/icondialog.py
diff options
context:
space:
mode:
Diffstat (limited to 'icondialog.py')
-rw-r--r--icondialog.py182
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