Commit 4e1dd48f authored by Dan Pascu's avatar Dan Pascu

Initial import

parents
# Boring file regexps:
(^|/)_darcs($|/)
(^|/)CVS($|/)
(^|/)\.svn($|/)
(^|/)\.DS_Store$
(^|/)Thumbs\.db$
\#
~$
(^|/)core(\.[0-9]+)?$
\.(pyc|pyo|o|so|orig|bak|BAK|prof|wpu|cvsignore)$
(^|/)build($|/)
(^|/)dist($|/)
^MANIFEST$
#!/usr/bin/env python
import os
import sys
# We need to mangle Python's import path in case blink is run directly from
# the bin/ directory.
script_dir = os.path.dirname(os.path.realpath(__file__))
parent_dir = os.path.dirname(script_dir)
if os.path.basename(script_dir)=='bin' and os.path.exists(os.path.join(parent_dir, 'blink', '__init__.py')):
# Insert the parent path just before the existing script's path. We need
# to do this in order to work with debuggers which insert their own paths
# at the beginning. The script's path is the last Python itself inserted
# so we should insert just before that.
try:
position = sys.path.index(script_dir)
except ValueError:
position = 0
sys.path.insert(position, parent_dir)
if __name__ == '__main__':
from blink import Blink
blink = Blink()
blink.run()
# Copyright (C) 2010 AG Projects. See LICENSE for details.
#
__all__ = ['Blink']
from PyQt4.QtCore import Qt, SIGNAL, SLOT
from PyQt4.QtGui import QApplication, QBrush, QColor, QPainter, QPen, QPixmap
# We need to fix __path__ in order be able to import the ui module when used
# with an interactive interpreter, because the ui module changes the current
# working directory when loading the user interfaces and this interferes with
# loading the custom classes for the user interfaces as __path__ points to a
# relative directory in that case and it won't find the submodules anymore.
import os
__path__ = [os.path.realpath(p) for p in __path__]
# We need this available early in order to import the ui module, as
# loading the user interfaces requires an instance of QApplication
import sys
_qt_application = QApplication(sys.argv)
from blink import ui
from blink.resources import Resources
class Blink(object):
def __init__(self):
self.app = _qt_application
self.main_window = ui.main_window
#self.main_window.setWindowTitle('Blink')
self.main_window.setWindowIconText('Blink')
self._setup_identities()
#self._setup_user_states()
#self.contacts_widget = uic.loadUi("contacts.ui", self.main_window.widget)
#self.contacts_widget.hide()
self.main_window.main_view.setCurrentWidget(self.main_window.contacts_panel)
self.main_window.contacts_view.setCurrentWidget(self.main_window.contact_list_panel)
self.main_window.search_view.setCurrentWidget(self.main_window.search_list_panel)
self.main_window.connect(self.main_window.search_box, SIGNAL("textChanged(const QString&)"), self.text_changed)
self.main_window.connect(self.main_window.back_to_contacts, SIGNAL("clicked()"), self.main_window.search_box, SLOT("clear()"))
#self.main_window.search_box.setStyleSheet(search_css) # this method is not working properly with all themes. -Dan
self.main_window.connect(self.main_window.identity, SIGNAL("currentIndexChanged (const QString&)"), self.set_identity)
#self.main_window.connect(self.main_window.identity, QtCore.SIGNAL("activated(const QString&)"), self.set_identity2)
#self.main_window.connect(self.main_window.icon_view, QtCore.SIGNAL("clicked()"), self.set_icon_view_mode)
#self.main_window.connect(self.main_window.list_view, QtCore.SIGNAL("clicked()"), self.set_list_view_mode)
#self.main_window.connect(self.main_window.list_view, QtCore.SIGNAL("doubleClicked(const QModelIndex &)"), self.play_game)
#self.main_window.connect(self.main_window.list_view.selectionModel(), QtCore.SIGNAL("selectionChanged(const QItemSelection &, const QItemSelection &)"), self.selection_changed)
def run(self):
self.main_window.show()
self.app.exec_()
def _set_user_icon(self, image_file_name):
pixmap = QPixmap(32, 32)
pixmap.fill(QColor(Qt.transparent))
painter = QPainter(pixmap)
painter.setRenderHint(QPainter.Antialiasing, True)
painter.setBrush(QBrush(Qt.white))
painter.setPen(QPen(painter.brush(), 0, Qt.NoPen))
#painter.drawRoundedRect(0, 0, 32, 32, 6, 6)
painter.drawRoundedRect(0, 0, 32, 32, 0, 0)
icon = QPixmap()
if icon.load(image_file_name):
icon = icon.scaled(32, 32, Qt.KeepAspectRatio, Qt.SmoothTransformation)
painter.setCompositionMode(QPainter.CompositionMode_SourceOver)
painter.drawPixmap(0, 0, icon)
painter.end()
self.main_window.image.setPixmap(pixmap)
def _setup_identities(self):
self.main_window.identity.addItem("31208005167@ag-projects.com")
self.main_window.identity.addItem("Bonjour")
self._set_user_icon(Resources.get("icons/default_user_icon.png"))
#self._set_user_icon(":/resources/icons/default_user_icon.png")
def _setup_user_states(self):
red_dot = QIcon()
red_dot.addFile('icons/red-dot.svg')
yellow_dot = QIcon()
yellow_dot.addFile('icons/yellow-dot.svg')
green_dot = QIcon()
green_dot.addFile('icons/green-dot.svg')
self.main_window.status.setIconSize(QSize(10, 10))
self.main_window.status.addItem(green_dot, 'Available')
self.main_window.status.addItem(yellow_dot, 'Away')
self.main_window.status.addItem(red_dot, 'Busy')
self.main_window.status.addItem(red_dot, 'On the phone')
def set_identity(self, string):
print "identity changed", string
def set_identity2(self, string):
print "identity (re)selected", string
def text_changed(self, text):
active_widget = self.main_window.contact_list_panel if text.isEmpty() else self.main_window.search_panel
self.main_window.contacts_view.setCurrentWidget(active_widget)
active_widget = self.main_window.search_list_panel if len(text)<3 else self.main_window.not_found_panel
self.main_window.search_view.setCurrentWidget(active_widget)
# Copyright (C) 2010 AG Projects. See LICENSE for details.
#
"""Provide access to Blink's resources"""
__all__ = ['Resources']
import os
import sys
# TODO: replace later with classproperty from sipsimple.util
def classproperty(function):
class Descriptor(object):
def __get__(self, instance, owner):
return function(owner)
def __set__(self, instance, value):
raise AttributeError("read-only attribute cannot be set")
def __delete__(self, instance):
raise AttributeError("read-only attribute cannot be deleted")
return Descriptor()
class Resources(object):
"""Provide access to Blink's resources"""
_cached_directory = None
@classproperty
def directory(cls):
if cls._cached_directory is None:
script = sys.argv[0]
if script == '':
application_directory = os.path.realpath(script) # executed in interactive interpreter
else:
binary_directory = os.path.dirname(os.path.realpath(script))
if os.path.basename(binary_directory) == 'bin':
application_directory = os.path.dirname(binary_directory)
else:
application_directory = binary_directory
if os.path.exists(os.path.join(application_directory, 'resources', 'blink.ui')):
cls._cached_directory = os.path.join(application_directory, 'resources')
else:
cls._cached_directory = os.path.join(application_directory, 'share', 'blink')
return cls._cached_directory
@classmethod
def get(cls, resource):
return os.path.join(cls.directory, resource)
# Copyright (C) 2010 AG Projects. See LICENSE for details.
#
__all__ = ['main_window']
import os
from PyQt4 import uic
from blink.resources import Resources
original_directory = os.getcwd()
os.chdir(Resources.directory)
main_window = uic.loadUi(Resources.get('blink.ui'))
os.chdir(original_directory)
del original_directory
# Copyright (c) 2010 AG Projects. See LICENSE for details.
#
# Copyright (c) 2010 AG Projects. See LICENSE for details.
#
from PyQt4.QtCore import Qt, QEvent, SIGNAL
from PyQt4.QtGui import QLineEdit, QBoxLayout, QHBoxLayout, QLayout, QPainter, QPalette, QSpacerItem, QSizePolicy, QStyle, QWidget, QStyleOptionFrameV2
from blink.widgets.util import QtDynamicProperty
class SideWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
def event(self, event):
if event.type() == QEvent.LayoutRequest:
self.emit(SIGNAL("sizeHintChanged()"))
return QWidget.event(self, event)
class LineEdit(QLineEdit):
inactiveText = QtDynamicProperty('inactiveText', str)
widgetSpacing = QtDynamicProperty('widgetSpacing', int)
def __init__(self, parent=None, contents=u""):
QLineEdit.__init__(self, contents, parent)
box_direction = QBoxLayout.RightToLeft if self.isRightToLeft() else QBoxLayout.LeftToRight
self.inactiveText = u""
self.left_widget = SideWidget(self)
self.left_widget.resize(0, 0)
self.left_layout = QHBoxLayout(self.left_widget)
self.left_layout.setContentsMargins(0, 0, 0, 0)
self.left_layout.setDirection(box_direction)
self.left_layout.setSizeConstraint(QLayout.SetFixedSize)
self.right_widget = SideWidget(self)
self.right_widget.resize(0, 0)
self.right_layout = QHBoxLayout(self.right_widget)
self.right_layout.setContentsMargins(0, 0, 0, 0)
self.right_layout.setDirection(box_direction)
self.right_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum))
self.widgetSpacing = 2
self.connect(self.left_widget, SIGNAL("sizeHintChanged()"), self._update_text_margins)
self.connect(self.right_widget, SIGNAL("sizeHintChanged()"), self._update_text_margins)
@property
def left_margin(self):
return self.left_widget.sizeHint().width() + 2*self.right_layout.spacing()
@property
def right_margin(self):
return self.right_widget.sizeHint().width() + 2*self.right_layout.spacing()
def _update_text_margins(self):
self.setTextMargins(self.left_margin, 0, self.right_margin, 0)
self._update_side_widget_locations()
def _update_side_widget_locations(self):
option = QStyleOptionFrameV2()
self.initStyleOption(option)
spacing = self.right_layout.spacing()
text_rect = self.style().subElementRect(QStyle.SE_LineEditContents, option, self)
text_rect.adjust(spacing, 0, -spacing, 0)
mid_height = text_rect.center().y() + 1 - (text_rect.height() % 2) # need -1 correction for odd heights -Dan
if self.left_layout.count() > 0:
left_height = mid_height - self.left_widget.height()/2
left_width = self.left_widget.width()
if left_width == 0:
left_height = mid_height - self.left_widget.sizeHint().height()/2
self.left_widget.move(text_rect.x(), left_height)
text_rect.setX(self.left_margin)
text_rect.setY(mid_height - self.right_widget.sizeHint().height()/2.0)
text_rect.setHeight(self.right_widget.sizeHint().height())
self.right_widget.setGeometry(text_rect)
def event(self, event):
if event.type() == QEvent.LayoutDirectionChange:
box_direction = QBoxLayout.RightToLeft if self.isRightToLeft() else QBoxLayout.LeftToRight
self.left_layout.setDirection(box_direction)
self.right_layout.setDirection(box_direction)
elif event.type() == QEvent.DynamicPropertyChange and event.propertyName() == 'widgetSpacing':
self.left_layout.setSpacing(self.widgetSpacing)
self.right_layout.setSpacing(self.widgetSpacing)
self._update_text_margins()
return QLineEdit.event(self, event)
def resizeEvent(self, event):
self._update_side_widget_locations()
QLineEdit.resizeEvent(self, event)
def paintEvent(self, event):
QLineEdit.paintEvent(self, event)
if not self.hasFocus() and self.text().isEmpty() and self.inactiveText:
options = QStyleOptionFrameV2()
self.initStyleOption(options)
text_rect = self.style().subElementRect(QStyle.SE_LineEditContents, options, self)
text_rect.adjust(self.left_margin+2, 0, -self.right_margin, 0)
painter = QPainter(self)
painter.setPen(self.palette().brush(QPalette.Disabled, QPalette.Text).color())
painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, self.inactiveText)
def addHeadWidget(self, widget):
if self.isRightToLeft():
self.right_layout.insertWidget(1, widget)
else:
self.left_layout.addWidget(widget)
def addTailWidget(self, widget):
if self.isRightToLeft():
self.left_layout.addWidget(widget)
else:
self.right_layout.insertWidget(1, widget)
def removeWidget(self, widget):
self.left_layout.removeWidget(widget)
self.right_layout.removeWidget(widget)
widget.hide()
# Copyright (c) 2010 AG Projects. See LICENSE for details.
#
from PyQt4.QtCore import Qt, SIGNAL, SLOT
from PyQt4.QtGui import QAbstractButton, QPainter, QPalette, QPixmap, QWidget
from blink.resources import Resources
from blink.widgets.lineedit import LineEdit
class SearchIcon(QWidget):
def __init__(self, parent=None, size=16):
QWidget.__init__(self, parent)
self.setFocusPolicy(Qt.NoFocus)
self.setVisible(True)
self.setMinimumSize(size+2, size+2)
pixmap = QPixmap()
if pixmap.load(Resources.get("icons/search.svg")):
self.icon = pixmap.scaled(size, size, Qt.KeepAspectRatio, Qt.SmoothTransformation)
else:
self.icon = None
def paintEvent(self, event):
painter = QPainter(self)
if self.icon is not None:
x = (self.width() - self.icon.width()) / 2
y = (self.height() - self.icon.height()) / 2
painter.drawPixmap(x, y, self.icon)
class ClearButton(QAbstractButton):
def __init__(self, parent=None, size=16):
QAbstractButton.__init__(self, parent)
self.setCursor(Qt.ArrowCursor)
self.setFocusPolicy(Qt.NoFocus)
self.setToolTip(u"Clear")
self.setVisible(False)
self.setMinimumSize(size+2, size+2)
pixmap = QPixmap()
if pixmap.load(Resources.get("icons/delete.svg")):
self.icon = pixmap.scaled(size, size, Qt.KeepAspectRatio, Qt.SmoothTransformation)
# Use QImage because QPainter using a QPixmap does not support CompositionMode_Multiply -Dan
image = self.icon.toImage()
painter = QPainter(image)
painter.setRenderHint(QPainter.Antialiasing, True)
painter.setCompositionMode(QPainter.CompositionMode_Multiply)
painter.drawPixmap(0, 0, self.icon)
painter.end()
self.icon_pressed = QPixmap(image)
else:
self.icon = self.icon_pressed = None
def paintEvent(self, event):
painter = QPainter(self)
icon = self.icon_pressed if self.isDown() else self.icon
if icon is not None:
x = (self.width() - icon.width()) / 2
y = (self.height() - icon.height()) / 2
painter.drawPixmap(x, y, icon)
else:
width = self.width()
height = self.height()
padding = width / 5
radius = width - 2*padding
palette = self.palette()
# Mid is darker than Dark. Go figure... -Dan
bg_color = palette.color(QPalette.Mid) if self.isDown() else palette.color(QPalette.Dark)
fg_color = palette.color(QPalette.Window) # or QPalette.Base for white
painter.setRenderHint(QPainter.Antialiasing, True)
painter.setBrush(bg_color)
painter.setPen(bg_color)
painter.drawEllipse(padding, padding, radius, radius)
padding = padding * 2
painter.setPen(fg_color)
painter.drawLine(padding, padding, width-padding, height-padding)
painter.drawLine(padding, height-padding, width-padding, padding)
class SearchBox(LineEdit):
def __init__(self, parent=None):
LineEdit.__init__(self, parent=parent)
self.search_icon = SearchIcon(self)
self.clear_button = ClearButton(self)
self.addHeadWidget(self.search_icon)
self.addTailWidget(self.clear_button)
self.clear_button.hide()
self.connect(self.clear_button, SIGNAL("clicked()"), self, SLOT("clear()"))
self.connect(self, SIGNAL("textChanged(const QString&)"), self.text_changed)
self.inactiveText = u"Search"
def text_changed(self, text):
self.clear_button.setVisible(not text.isEmpty())
# Copyright (c) 2010 AG Projects. See LICENSE for details.
#
__all__ = ['QtDynamicProperty']
from PyQt4.QtCore import QVariant
class QtDynamicProperty(object):
def __init__(self, name, type=str):
self.name = name
self.type = type
def __get__(self, obj, objtype):
return obj.property(self.name).toPyObject() if obj is not None else self
def __set__(self, obj, value):
obj.setProperty(self.name, QVariant(value))
def __delete__(self, obj):
raise AttributeError("attribute cannot be deleted")
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="0.47pre2 r22153"
version="1.1"
id="svg2816"
height="16px"
width="16px"
sodipodi:docname="delete.svg">
<defs
id="defs2818">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2824" />
<inkscape:perspective
id="perspective5182"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="8"
inkscape:cy="8.4809999"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1012"
inkscape:window-height="840"
inkscape:window-x="727"
inkscape:window-y="251"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#404040;stroke-width:1.00376034;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2826"
sodipodi:cx="7.8681383"
sodipodi:cy="7.8770232"
sodipodi:rx="6.084269"
sodipodi:ry="6.084269"
d="m 13.952407,7.8770232 a 6.084269,6.084269 0 1 1 -12.1685377,0 6.084269,6.084269 0 1 1 12.1685377,0 z"
transform="matrix(1.2146703,0,0,1.2146703,-1.5571941,-1.5679863)" />
<g
id="g5229"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,8,-3.3137085)"
style="fill:#f9f9f9">
<rect
y="3"
x="7"
height="10"
width="2"
id="rect5172"
style="fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<rect
transform="matrix(0,1,-1,0,0,0)"
y="-13"
x="7"
height="10"
width="2"
id="rect5172-4"
style="fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:none" />
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2816"
version="1.1"
inkscape:version="0.47pre2 r22153"
sodipodi:docname="red-dot.svg">
<defs
id="defs2818">
<linearGradient
id="linearGradient5054">
<stop
style="stop-color:#ff0000;stop-opacity:1;"
offset="0"
id="stop5056" />
<stop
style="stop-color:#e00000;stop-opacity:1;"
offset="1"
id="stop5058" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2824" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="7.7834049"
inkscape:cy="8"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1169"
inkscape:window-height="861"
inkscape:window-x="245"
inkscape:window-y="97"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#00a000;stroke-width:0.76077156999999984;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2826"
sodipodi:cx="9.4130964"
sodipodi:cy="10.059078"
sodipodi:rx="5.7179384"
sodipodi:ry="5.7179384"
d="m 15.131035,10.059078 a 5.7179384,5.7179384 0 1 1 -11.435877,0 5.7179384,5.7179384 0 1 1 11.435877,0 z"
transform="matrix(1.3118261,0,0,1.3118261,-4.3483457,-5.1957615)" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg2816"
version="1.1"
inkscape:version="0.47pre2 r22153"
sodipodi:docname="plus.svg">
<defs
id="defs2818">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective2824" />
<inkscape:perspective
id="perspective3620"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-14"
inkscape:cy="15.230556"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1140"
inkscape:window-height="842"
inkscape:window-x="433"
inkscape:window-y="195"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="rect2826"
width="2"
height="16"
x="15"
y="8" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="rect2826-0"
width="2"
height="16"
x="15"
y="-24"
transform="matrix(0,1,-1,0,0,0)" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="18"
height="18"
id="svg2816"
version="1.1"
inkscape:version="0.47pre2 r22153"
sodipodi:docname="plus18.svg">
<defs
id="defs2818">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2824" />
<inkscape:perspective
id="perspective2836"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="8"
inkscape:cy="8"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="884"
inkscape:window-height="748"
inkscape:window-x="593"
inkscape:window-y="230"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,2)">
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="rect2826"
width="2"
height="8"
x="8"
y="3" />
<rect
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="rect2826-0"
width="2"
height="8"
x="6"
y="-13"
transform="matrix(0,1,-1,0,0,0)" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2816"
version="1.1"
inkscape:version="0.47pre2 r22153"
sodipodi:docname="New document 2">
<defs
id="defs2818">
<linearGradient
id="linearGradient5054">
<stop
style="stop-color:#ff0000;stop-opacity:1;"
offset="0"
id="stop5056" />
<stop
style="stop-color:#e00000;stop-opacity:1;"
offset="1"
id="stop5058" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2824" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="7.7834049"
inkscape:cy="8"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1169"
inkscape:window-height="861"
inkscape:window-x="245"
inkscape:window-y="97"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#a00000;stroke-width:0.76077157;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2826"
sodipodi:cx="9.4130964"
sodipodi:cy="10.059078"
sodipodi:rx="5.7179384"
sodipodi:ry="5.7179384"
d="m 15.131035,10.059078 a 5.7179384,5.7179384 0 1 1 -11.435877,0 5.7179384,5.7179384 0 1 1 11.435877,0 z"
transform="matrix(1.3118261,0,0,1.3118261,-4.3483457,-5.1957615)" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2826"
version="1.1"
inkscape:version="0.47pre2 r22153"
sodipodi:docname="New document 3">
<defs
id="defs2828">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2834" />
<inkscape:perspective
id="perspective4223"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="8.7329474"
inkscape:cy="7.3353633"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1123"
inkscape:window-height="821"
inkscape:window-x="312"
inkscape:window-y="188"
inkscape:window-maximized="0" />
<metadata
id="metadata2831">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:none;stroke:#404040;stroke-width:1.57307458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2836"
sodipodi:cx="5.6987624"
sodipodi:cy="5.8413367"
sodipodi:rx="4.8878713"
sodipodi:ry="4.8878713"
d="m 10.586634,5.8413367 a 4.8878713,4.8878713 0 1 1 -9.77574285,0 4.8878713,4.8878713 0 1 1 9.77574285,0 z"
transform="matrix(1.0573789,0,0,1.0573789,-0.02575126,-0.17650608)" />
<rect
style="fill:#404040;fill-opacity:1;stroke:none"
id="rect4209-2"
width="1.6255314"
height="8.2739639"
x="-0.8127659"
y="13.540688"
transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
id="svg2816"
version="1.1"
inkscape:version="0.47pre2 r22153"
sodipodi:docname="green-dot.svg">
<defs
id="defs2818">
<linearGradient
id="linearGradient5054">
<stop
style="stop-color:#ff0000;stop-opacity:1;"
offset="0"
id="stop5056" />
<stop
style="stop-color:#e00000;stop-opacity:1;"
offset="1"
id="stop5058" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2824" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="7.7834049"
inkscape:cy="8"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1169"
inkscape:window-height="861"
inkscape:window-x="245"
inkscape:window-y="97"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:#fff000;fill-opacity:1;fill-rule:nonzero;stroke:#ffe000;stroke-width:0.76077156999999984;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path2826"
sodipodi:cx="9.4130964"
sodipodi:cy="10.059078"
sodipodi:rx="5.7179384"
sodipodi:ry="5.7179384"
d="m 15.131035,10.059078 a 5.7179384,5.7179384 0 1 1 -11.435877,0 5.7179384,5.7179384 0 1 1 11.435877,0 z"
transform="matrix(1.3118261,0,0,1.3118261,-4.3483457,-5.1957615)" />
</g>
</svg>
#!/bin/sh
exec bin/blink -style=oxygen $@
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment