Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Jam/JamMain.py
diff options
context:
space:
mode:
Diffstat (limited to 'Jam/JamMain.py')
-rw-r--r--Jam/JamMain.py212
1 files changed, 115 insertions, 97 deletions
diff --git a/Jam/JamMain.py b/Jam/JamMain.py
index 99b5059..ec295cb 100644
--- a/Jam/JamMain.py
+++ b/Jam/JamMain.py
@@ -3,6 +3,7 @@ from gi.repository import Gdk
from gi.repository import GdkPixbuf
from gi.repository import GObject
from gi.repository import Pango
+from gi.repository import PangoCairo
import cairo
import os
@@ -43,6 +44,7 @@ from common.Util import OS
from common.Tooltips import Tooltips
import common.Util.Network as Net
+from common.Util import CairoUtil
import xdrlib
import time
@@ -57,11 +59,6 @@ from math import sqrt
# wrapping during sync correction
HEARTBEAT_BUFFER = 100
-def hexa_to_cairo_color(color_hexa):
- _, color = Gdk.Color.parse(color_hexa)
- logging.error('color %s class %s', color, color.__class__)
- return (color.red / 65536.0, color.green / 65536.0, color.blue / 65536.0)
-
class JamMain(Gtk.EventBox):
@@ -117,27 +114,31 @@ class JamMain(Gtk.EventBox):
xoColorKey = ("#8D8D8D,#FFDDEA")
xoColor = XoColor(xoColorKey)
- win = Gdk.get_default_root_window()
- self.colors = {"bg": Config.PANEL_BCK_COLOR,
- "black": style.COLOR_BLACK.get_html(),
+ # colors in Config and in XoColor are strings,
+ # the colors in style are style.Color, transform all to Gdk.Color
+ self.colors = {"bg": CairoUtil.get_gdk_color(Config.PANEL_BCK_COLOR),
+ "black": style.COLOR_BLACK.get_gdk_color(),
#"Picker_Bg": colormap.alloc_color("#404040"),
#"Picker_Bg_Inactive": colormap.alloc_color("#808080"),
- "Picker_Bg": style.COLOR_TOOLBAR_GREY.get_html(),
- "Picker_Bg_Inactive": style.COLOR_BUTTON_GREY.get_html(),
- "Picker_Fg": style.COLOR_WHITE.get_html(),
- "Border_Active": xoColor.get_stroke_color(),
- "Border_Inactive": "#8D8D8D",
- "Border_Highlight": "#FFFFFF",
- "Bg_Active": xoColor.get_fill_color(),
- "Bg_Inactive": "#DBDBDB",
- "Preview_Note_Fill": Config.BG_COLOR,
- "Preview_Note_Border": Config.FG_COLOR,
- "Preview_Note_Selected": style.COLOR_WHITE.get_html(),
- "Note_Fill_Active": lighten("#590000"),
+ "Picker_Bg": style.COLOR_TOOLBAR_GREY.get_gdk_color(),
+ "Picker_Bg_Inactive": style.COLOR_BUTTON_GREY.get_gdk_color(),
+ "Picker_Fg": style.COLOR_WHITE.get_gdk_color(),
+ "Border_Active": \
+ CairoUtil.get_gdk_color(xoColor.get_stroke_color()),
+ "Border_Inactive": CairoUtil.get_gdk_color("#8D8D8D"),
+ "Border_Highlight": CairoUtil.get_gdk_color("#FFFFFF"),
+ "Bg_Active": CairoUtil.get_gdk_color(xoColor.get_fill_color()),
+ "Bg_Inactive": CairoUtil.get_gdk_color("#DBDBDB"),
+ "Preview_Note_Fill": CairoUtil.get_gdk_color(Config.BG_COLOR),
+ "Preview_Note_Border": CairoUtil.get_gdk_color(Config.FG_COLOR),
+ "Preview_Note_Selected": style.COLOR_WHITE.get_gdk_color(),
+ # TODO: lighten here can be removed, check if is used in other
+ # places
+ "Note_Fill_Active": Gdk.Color(*lighten("#590000")),
# base "Border_Active"
- "Note_Fill_Inactive": lighten("#8D8D8D"),
+ "Note_Fill_Inactive": Gdk.Color(*lighten("#8D8D8D")),
# base "Border_Inactive"
- "Beat_Line": "#959595"}
+ "Beat_Line": CairoUtil.get_gdk_color("#959595")}
self.colors["Note_Border_Active"] = self.colors["Border_Active"]
self.colors["Note_Border_Inactive"] = self.colors["Border_Inactive"]
@@ -171,11 +172,10 @@ class JamMain(Gtk.EventBox):
self.blockMask = Gdk.bitmap_create_from_data(
None, bitmap, pix.get_width(), pix.get_height())
- pix = GdkPixbuf.Pixbuf.new_from_file(imagefile('sampleBG.png'))
- self.sampleBg = Gdk.Pixmap(win, pix.get_width(), pix.get_height())
- self.sampleBg.draw_pixbuf(self.gc, pix, 0, 0, 0, 0, pix.get_width(),
- pix.get_height(), Gdk.RGB_DITHER_NONE)
- self.sampleBg.endOffset = pix.get_width() - 5
+ """
+ self.sampleBg = cairo.ImageSurface.create_from_png(
+ imagefile('sampleBG.png'))
+ """
if True: # load sample note clipmask
pix = GdkPixbuf.Pixbuf.new_from_file(imagefile('sampleNoteMask.png'))
pixels = pix.get_pixels()
@@ -283,7 +283,7 @@ class JamMain(Gtk.EventBox):
#-- GUI -----------------------------------------------
if True: # GUI
- self.modify_bg(Gtk.StateType.NORMAL, self.colors["bg"]) # window bg
+ self.modify_bg(Gtk.StateType.NORMAL, self.colors["bg"])
self.GUI = {}
self.GUI["mainVBox"] = Gtk.VBox()
@@ -296,18 +296,20 @@ class JamMain(Gtk.EventBox):
#-- Bank ----------------------------------------------
separator = Gtk.Label(label=" ")
separator.set_size_request(-1, style.TOOLBOX_SEPARATOR_HEIGHT)
- self.GUI["mainVBox"].pack_start(separator, False)
+ self.GUI["mainVBox"].pack_start(separator, False, True, 0)
self.GUI["notebook"] = Gtk.Notebook()
self.GUI["notebook"].set_scrollable(True)
self.GUI["notebook"].modify_bg(Gtk.StateType.NORMAL,
self.colors["Picker_Bg"])
self.GUI["notebook"].modify_bg(Gtk.StateType.ACTIVE,
self.colors["Picker_Bg_Inactive"])
- self.GUI["notebook"].props.tab_vborder = style.TOOLBOX_TAB_VBORDER
- self.GUI["notebook"].props.tab_hborder = style.TOOLBOX_TAB_HBORDER
+ # TODO gtk3 no available anymore?
+ #self.GUI["notebook"].props.tab_vborder = style.TOOLBOX_TAB_VBORDER
+ #self.GUI["notebook"].props.tab_hborder = style.TOOLBOX_TAB_HBORDER
self.GUI["notebook"].set_size_request(-1, scale(160))
self.GUI["notebook"].connect("switch-page", self.setPicker)
- self.GUI["mainVBox"].pack_start(self.GUI["notebook"], False, False)
+ self.GUI["mainVBox"].pack_start(self.GUI["notebook"], False,
+ False, 0)
self.pickers = {}
self.pickerScroll = {}
for type in [Picker.Instrument, Picker.Drum, Picker.Loop]:
@@ -410,10 +412,10 @@ class JamMain(Gtk.EventBox):
self.activity.connect("shared", self.shared)
- if self.activity._shared_activity: # PEER
- self.activity._shared_activity.connect("buddy-joined",
+ if self.activity.shared_activity: # PEER
+ self.activity.shared_activity.connect("buddy-joined",
self.buddy_joined)
- self.activity._shared_activity.connect("buddy-left",
+ self.activity.shared_activity.connect("buddy-left",
self.buddy_left)
self.activity.connect("joined", self.joined)
self.network.setMode(Net.MD_WAIT)
@@ -972,29 +974,32 @@ class JamMain(Gtk.EventBox):
x = (Block.Block.WIDTH - pix.get_width()) // 2
y = (Block.Block.HEIGHT - pix.get_height()) // 2
- img = cairo.ImageSurface(cairo.FORMAT_RGB24, Block.Block.WIDTH,
+ img = cairo.ImageSurface(cairo.FORMAT_ARGB32, Block.Block.WIDTH,
Block.Block.HEIGHT)
# TODO: two images? may be we can draw the rectangle with cairo later
ctx = cairo.Context(img)
- ctx.set_source_rgb(*hexa_to_cairo_color(self.colors["Bg_Inactive"]))
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Bg_Inactive"]))
ctx.rectangle(0, 0, Block.Block.WIDTH, Block.Block.HEIGHT)
ctx.translate(x, y)
ctx.set_source_surface(pix, 0, 0)
ctx.paint()
self.instrumentImage[id] = img
- img2 = cairo.ImageSurface(cairo.FORMAT_RGB24, Block.Block.WIDTH,
+ img2 = cairo.ImageSurface(cairo.FORMAT_ARGB32, Block.Block.WIDTH,
Block.Block.HEIGHT)
ctx2 = cairo.Context(img2)
- ctx2.set_source_rgb(*hexa_to_cairo_color(self.colors["Bg_Active"]))
+ ctx2.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Bg_Active"]))
ctx2.rectangle(0, 0, Block.Block.WIDTH, Block.Block.HEIGHT)
ctx2.translate(x, y)
ctx2.set_source_surface(pix, 0, 0)
ctx2.paint()
self.instrumentImageActive[id] = img2
- def _drawNotes(self, pixmap, beats, notes, active):
- self.gc.set_clip_mask(self.sampleNoteMask)
+ def _drawNotes(self, ctx, beats, notes, active):
+ #self.gc.set_clip_mask(self.sampleNoteMask)
+ ctx.save()
for note in notes: # draw N notes
x = self.ticksToPixels(note.cs.onset)
# include end cap offset
@@ -1006,73 +1011,86 @@ class JamMain(Gtk.EventBox):
y = self.pitchToPixels(note.cs.pitch)
# draw fill
if active:
- self.gc.foreground = self.colors["Note_Fill_Active"]
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Note_Fill_Active"]))
else:
- self.gc.foreground = self.colors["Note_Fill_Inactive"]
- self.gc.set_clip_origin(x, y - self.sampleNoteHeight)
- pixmap.draw_rectangle(self.gc, True, x + 1, y + 1, width + 1,
- self.sampleNoteHeight - 2)
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Note_Fill_Inactive"]))
+ #self.gc.set_clip_origin(x, y - self.sampleNoteHeight)
+ ctx.rectangle(x + 1, y + 1, width + 1, self.sampleNoteHeight - 2)
+ ctx.fill()
# draw border
if active:
- self.gc.foreground = self.colors["Note_Border_Active"]
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Note_Border_Active"]))
else:
- self.gc.foreground = self.colors["Note_Border_Inactive"]
- self.gc.set_clip_origin(x, y)
- pixmap.draw_rectangle(self.gc, True, x, y, width,
- self.sampleNoteHeight)
- self.gc.set_clip_origin(endX - self.sampleNoteMask.endOffset, y)
- pixmap.draw_rectangle(self.gc, True, endX, y, 3,
- self.sampleNoteHeight)
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Note_Border_Inactive"]))
+ #self.gc.set_clip_origin(x, y)
+ ctx.rectangle(x, y, width, self.sampleNoteHeight)
+ ctx.fill()
+ #self.gc.set_clip_origin(endX - self.sampleNoteMask.endOffset, y)
+ ctx.rectangle(endX, y, 3, self.sampleNoteHeight)
+ ctx.fill()
+ ctx.restore()
def prepareKeyImage(self, key):
- win = Gdk.get_default_root_window()
- pangolayout = self.create_pango_layout(_(self.valid_shortcuts[key]))
+ text =_(self.valid_shortcuts[key])
+
+ # TODO: two images? may be we can draw the rectangle with cairo later
+ self.keyImage[key] = self._prepare_key_image(text,
+ self.colors["Bg_Inactive"], self.colors["Border_Inactive"])
+
+ self.keyImageActive[key] = self._prepare_key_image(text,
+ self.colors["Bg_Active"], self.colors["Border_Active"])
+
+ def _prepare_key_image(self, text, bg_color, border_color):
+ img = cairo.ImageSurface(cairo.FORMAT_ARGB32, Block.Block.KEYSIZE,
+ Block.Block.KEYSIZE)
+ ctx = cairo.Context(img)
+ pango_layout = PangoCairo.create_layout(ctx)
fontDesc = Pango.FontDescription("bold")
- pangolayout.set_font_description(fontDesc)
- extents = pangolayout.get_pixel_extents()
- x = (Block.Block.KEYSIZE - extents[1][2]) // 2
- y = (Block.Block.KEYSIZE - extents[1][3]) // 2
-
- pixmap = Gdk.Pixmap(win, Block.Block.KEYSIZE, Block.Block.KEYSIZE)
- self.gc.foreground = self.colors["Border_Inactive"]
- pixmap.draw_rectangle(self.gc, True, 0, 0, Block.Block.KEYSIZE,
- Block.Block.KEYSIZE)
- self.gc.foreground = self.colors["Bg_Inactive"]
- pixmap.draw_layout(self.gc, x, y, pangolayout)
- self.keyImage[key] = pixmap
-
- pixmap = Gdk.Pixmap(win, Block.Block.KEYSIZE, Block.Block.KEYSIZE)
- self.gc.foreground = self.colors["Border_Active"]
- pixmap.draw_rectangle(self.gc, True, 0, 0, Block.Block.KEYSIZE,
- Block.Block.KEYSIZE)
- self.gc.foreground = self.colors["Bg_Active"]
- pixmap.draw_layout(self.gc, x, y, pangolayout)
- self.keyImageActive[key] = pixmap
+ pango_layout.set_font_description(fontDesc)
+ pango_layout.set_text(unicode(text), len(unicode(text)))
+ extents = pango_layout.get_pixel_extents()
+ x = (Block.Block.KEYSIZE - extents[1].width) // 2
+ y = (Block.Block.KEYSIZE - extents[1].height) // 2
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(border_color))
+ ctx.rectangle(0, 0, Block.Block.KEYSIZE, Block.Block.KEYSIZE)
+ ctx.fill()
+ ctx.translate(x, y)
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(bg_color))
+ PangoCairo.show_layout(ctx, pango_layout)
+ ctx.stroke()
+ return img
def updateLoopImage(self, id):
page = self.noteDB.getPage(id)
- win = Gdk.get_default_root_window()
width = Block.Loop.WIDTH[page.beats]
height = Block.Loop.HEIGHT
-
- self.gc.set_clip_rectangle((0, 0, width, height))
-
- pixmap = Gdk.Pixmap(win, width, height)
- self.gc.foreground = self.colors["Bg_Inactive"]
- pixmap.draw_rectangle(self.gc, True, 0, 0, width, height)
- self._drawNotes(pixmap, page.beats, self.noteDB.getNotesByTrack(id, 0),
- False)
- self.loopImage[id] = pixmap
-
- self.gc.set_clip_rectangle((0, 0, width, height))
-
- pixmap = Gdk.Pixmap(win, width, height)
- self.gc.foreground = self.colors["Bg_Active"]
- pixmap.draw_rectangle(self.gc, True, 0, 0, width, height)
- self._drawNotes(pixmap, page.beats, self.noteDB.getNotesByTrack(id, 0),
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ ctx = cairo.Context(surface)
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Bg_Inactive"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.fill()
+
+ self._drawNotes(ctx, page.beats, self.noteDB.getNotesByTrack(id, 0),
+ False)
+ self.loopImage[id] = surface
+
+ #self.gc.set_clip_rectangle((0, 0, width, height))
+
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ ctx = cairo.Context(surface)
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Bg_Active"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.fill()
+ self._drawNotes(ctx, page.beats, self.noteDB.getNotesByTrack(id, 0),
True)
- self.loopImageActive[id] = pixmap
+ self.loopImageActive[id] = surface
def ticksToPixels(self, ticks):
return self.loopTickOffset + int(round(ticks * self.pixelsPerTick))
@@ -1157,9 +1175,9 @@ class JamMain(Gtk.EventBox):
def shared(self, activity):
if Config.DEBUG:
print "TamTamJam:: successfully shared, start host mode"
- self.activity._shared_activity.connect("buddy-joined",
+ self.activity.shared_activity.connect("buddy-joined",
self.buddy_joined)
- self.activity._shared_activity.connect("buddy-left", self.buddy_left)
+ self.activity.shared_activity.connect("buddy-left", self.buddy_left)
self.network.setMode(Net.MD_HOST)
self.updateSync()
self.syncTimeout = GObject.timeout_add(1000, self.updateSync)
@@ -1167,7 +1185,7 @@ class JamMain(Gtk.EventBox):
def joined(self, activity):
if Config.DEBUG:
print "TamTamJam:: joined activity!!"
- for buddy in self.activity._shared_activity.get_joined_buddies():
+ for buddy in self.activity.shared_activity.get_joined_buddies():
print buddy.props.ip4_address
def buddy_joined(self, activity, buddy):