--- gigedit/trunk/src/gigedit/dimregionchooser.cpp 2008/02/02 08:18:19 1656 +++ gigedit/trunk/src/gigedit/dimregionchooser.cpp 2011/03/06 07:51:04 2169 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2008 Andreas Persson + * Copyright (C) 2006-2011 Andreas Persson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -18,25 +18,17 @@ */ #include "dimregionchooser.h" +#include #include +#include -DimRegionChooser::DimRegionChooser() +#include "global.h" + +DimRegionChooser::DimRegionChooser() : + red("#8070ff"), + black("black"), + white("white") { - // get_window() would return 0 because the Gdk::Window has not yet been realized - // So we can only allocate the colors here - the rest will happen in on_realize(). - Glib::RefPtr colormap = get_default_colormap(); - - black = Gdk::Color("black"); - white = Gdk::Color("white"); - red = Gdk::Color("#8070ff"); - blue = Gdk::Color("blue"); - green = Gdk::Color("green"); - - colormap->alloc_color(black); - colormap->alloc_color(white); - colormap->alloc_color(red); - colormap->alloc_color(blue); - colormap->alloc_color(green); instrument = 0; region = 0; dimregno = -1; @@ -44,7 +36,7 @@ resize.active = false; cursor_is_resize = false; h = 20; - set_flags(Gtk::CAN_FOCUS); + set_can_focus(); add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK); @@ -55,28 +47,23 @@ { } -void DimRegionChooser::on_realize() +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 +bool DimRegionChooser::on_expose_event(GdkEventExpose* e) { - // We need to call the base on_realize() - Gtk::DrawingArea::on_realize(); - - // Now we can allocate any additional resources we need - Glib::RefPtr window = get_window(); - gc = Gdk::GC::create(window); + return on_draw(get_window()->create_cairo_context()); } +#endif -bool DimRegionChooser::on_expose_event(GdkEventExpose* event) +bool DimRegionChooser::on_draw(const Cairo::RefPtr& cr) { if (!region) return true; // This is where we draw on the window int w = get_width(); - Glib::RefPtr window = get_window(); Glib::RefPtr context = get_pango_context(); Glib::RefPtr layout = Pango::Layout::create(context); - - window->clear(); + cr->set_line_width(1); // draw labels on the left (reflecting the dimension type) int y = 0; @@ -87,40 +74,40 @@ const char* dstr; char dstrbuf[10]; switch (region->pDimensionDefinitions[i].dimension) { - case gig::dimension_none: dstr="none"; break; - case gig::dimension_samplechannel: dstr="samplechannel"; break; - case gig::dimension_layer: dstr="layer"; break; - case gig::dimension_velocity: dstr="velocity"; break; - case gig::dimension_channelaftertouch: dstr="channelaftertouch"; break; - case gig::dimension_releasetrigger: dstr="releasetrigger"; break; - case gig::dimension_keyboard: dstr="keyswitching"; break; - case gig::dimension_roundrobin: dstr="roundrobin"; break; - case gig::dimension_random: dstr="random"; break; - case gig::dimension_smartmidi: dstr="smartmidi"; break; - case gig::dimension_roundrobinkeyboard: dstr="roundrobinkeyboard"; break; - case gig::dimension_modwheel: dstr="modwheel"; break; - case gig::dimension_breath: dstr="breath"; break; - case gig::dimension_foot: dstr="foot"; break; - case gig::dimension_portamentotime: dstr="portamentotime"; break; - case gig::dimension_effect1: dstr="effect1"; break; - case gig::dimension_effect2: dstr="effect2"; break; - case gig::dimension_genpurpose1: dstr="genpurpose1"; break; - case gig::dimension_genpurpose2: dstr="genpurpose2"; break; - case gig::dimension_genpurpose3: dstr="genpurpose3"; break; - case gig::dimension_genpurpose4: dstr="genpurpose4"; break; - case gig::dimension_sustainpedal: dstr="sustainpedal"; break; - case gig::dimension_portamento: dstr="portamento"; break; - case gig::dimension_sostenutopedal: dstr="sostenutopedal"; break; - case gig::dimension_softpedal: dstr="softpedal"; break; - case gig::dimension_genpurpose5: dstr="genpurpose5"; break; - case gig::dimension_genpurpose6: dstr="genpurpose6"; break; - case gig::dimension_genpurpose7: dstr="genpurpose7"; break; - case gig::dimension_genpurpose8: dstr="genpurpose8"; break; - case gig::dimension_effect1depth: dstr="effect1depth"; break; - case gig::dimension_effect2depth: dstr="effect2depth"; break; - case gig::dimension_effect3depth: dstr="effect3depth"; break; - case gig::dimension_effect4depth: dstr="effect4depth"; break; - case gig::dimension_effect5depth: dstr="effect5depth"; break; + case gig::dimension_none: dstr=_("none"); break; + case gig::dimension_samplechannel: dstr=_("samplechannel"); break; + case gig::dimension_layer: dstr=_("layer"); break; + case gig::dimension_velocity: dstr=_("velocity"); break; + case gig::dimension_channelaftertouch: dstr=_("channelaftertouch"); break; + case gig::dimension_releasetrigger: dstr=_("releasetrigger"); break; + case gig::dimension_keyboard: dstr=_("keyswitching"); break; + case gig::dimension_roundrobin: dstr=_("roundrobin"); break; + case gig::dimension_random: dstr=_("random"); break; + case gig::dimension_smartmidi: dstr=_("smartmidi"); break; + case gig::dimension_roundrobinkeyboard: dstr=_("roundrobinkeyboard"); break; + case gig::dimension_modwheel: dstr=_("modwheel"); break; + case gig::dimension_breath: dstr=_("breath"); break; + case gig::dimension_foot: dstr=_("foot"); break; + case gig::dimension_portamentotime: dstr=_("portamentotime"); break; + case gig::dimension_effect1: dstr=_("effect1"); break; + case gig::dimension_effect2: dstr=_("effect2"); break; + case gig::dimension_genpurpose1: dstr=_("genpurpose1"); break; + case gig::dimension_genpurpose2: dstr=_("genpurpose2"); break; + case gig::dimension_genpurpose3: dstr=_("genpurpose3"); break; + case gig::dimension_genpurpose4: dstr=_("genpurpose4"); break; + case gig::dimension_sustainpedal: dstr=_("sustainpedal"); break; + case gig::dimension_portamento: dstr=_("portamento"); break; + case gig::dimension_sostenutopedal: dstr=_("sostenutopedal"); break; + case gig::dimension_softpedal: dstr=_("softpedal"); break; + case gig::dimension_genpurpose5: dstr=_("genpurpose5"); break; + case gig::dimension_genpurpose6: dstr=_("genpurpose6"); break; + case gig::dimension_genpurpose7: dstr=_("genpurpose7"); break; + case gig::dimension_genpurpose8: dstr=_("genpurpose8"); break; + case gig::dimension_effect1depth: dstr=_("effect1depth"); break; + case gig::dimension_effect2depth: dstr=_("effect2depth"); break; + case gig::dimension_effect3depth: dstr=_("effect3depth"); break; + case gig::dimension_effect4depth: dstr=_("effect4depth"); break; + case gig::dimension_effect5depth: dstr=_("effect5depth"); break; default: sprintf(dstrbuf, "%d", region->pDimensionDefinitions[i].dimension); @@ -133,9 +120,18 @@ double text_w = double(rectangle.get_width()) / Pango::SCALE; if (text_w > maxwidth) maxwidth = text_w; double text_h = double(rectangle.get_height()) / Pango::SCALE; - Glib::RefPtr fg = get_style()->get_fg_gc(get_state()); - window->draw_layout(fg, 4, int(y + (h - text_h) / 2 + 0.5), layout); - +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 + const Gdk::Color fg = get_style()->get_fg(get_state()); +#else + const Gdk::RGBA fg = get_style_context()->get_color(get_state_flags()); +#endif + Gdk::Cairo::set_source_rgba(cr, fg); + cr->move_to(4, int(y + (h - text_h) / 2 + 0.5)); +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 16) || GTKMM_MAJOR_VERSION < 2 + pango_cairo_show_layout(cr->cobj(), layout->gobj()); +#else + layout->show_in_cairo_context(cr); +#endif } y += h; } @@ -149,18 +145,27 @@ if (nbZones) { // draw focus rectangle around dimension's label and zones if (has_focus() && focus_line == i) { +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 Gdk::Rectangle farea(0, y, 150, 20); - get_style()->paint_focus(window, get_state(), farea, *this, "", + get_style()->paint_focus(get_window(), get_state(), farea, *this, "", 0, y, label_width, 20); +#else + get_style_context()->render_focus(cr, 0, y, label_width, 20); +#endif } - Glib::RefPtr black = get_style()->get_black_gc(); // draw top and bottom lines of dimension's zones - window->draw_line(black, label_width, y, w - 1, y); - window->draw_line(black, w - 1, y + h - 1, label_width, y + h - 1); + Gdk::Cairo::set_source_rgba(cr, black); + cr->move_to(label_width, y + 0.5); + cr->line_to(w, y + 0.5); + cr->move_to(w, y + h - 0.5); + cr->line_to(label_width, y + h - 0.5); + cr->stroke(); + // erase whole dimension's zones area - window->draw_rectangle(get_style()->get_white_gc(), true, - label_width + 1, y + 1, (w - label_width - 2), h - 2); + Gdk::Cairo::set_source_rgba(cr, white); + cr->rectangle(label_width + 1, y + 1, (w - label_width - 2), h - 2); + cr->fill(); int c = 0; if (dimregno >= 0) { @@ -174,26 +179,32 @@ region->pDimensionRegions[c]->VelocityUpperLimit)); // draw dimension's zone borders + Gdk::Cairo::set_source_rgba(cr, black); if (customsplits) { - window->draw_line(black, label_width, y + 1, label_width, y + h - 2); + cr->move_to(label_width + 0.5, y + 1); + cr->line_to(label_width + 0.5, y + h - 1); + for (int j = 0 ; j < nbZones ; j++) { gig::DimensionRegion *d = region->pDimensionRegions[c + (j << bitpos)]; int upperLimit = d->DimensionUpperLimits[i]; if (!upperLimit) upperLimit = d->VelocityUpperLimit; int v = upperLimit + 1; int x = int((w - label_width - 1) * v / 128.0 + 0.5); - window->draw_line(black, label_width + x, y + 1, label_width + x, y + h - 2); + cr->move_to(label_width + x + 0.5, y + 1); + cr->line_to(label_width + x + 0.5, y + h - 1); } } else { for (int j = 0 ; j <= nbZones ; j++) { int x = int((w - label_width - 1) * j / double(nbZones) + 0.5); - window->draw_line(black, label_width + x, y + 1, label_width + x, y + h - 2); + cr->move_to(label_width + x + 0.5, y + 1); + cr->line_to(label_width + x + 0.5, y + h - 1); } } + cr->stroke(); // draw fill for currently selected zone if (dimregno >= 0) { - gc->set_foreground(red); + Gdk::Cairo::set_source_rgba(cr, red); int dr = (dimregno >> bitpos) & ((1 << region->pDimensionDefinitions[i].bits) - 1); if (customsplits) { int x1 = 0; @@ -204,8 +215,9 @@ int v = upperLimit + 1; int x2 = int((w - label_width - 1) * v / 128.0 + 0.5); if (j == dr && x1 < x2) { - window->draw_rectangle(gc, true, label_width + x1 + 1, y + 1, - (x2 - x1) - 1, h - 2); + cr->rectangle(label_width + x1 + 1, y + 1, + (x2 - x1) - 1, h - 2); + cr->fill(); break; } x1 = x2; @@ -214,8 +226,9 @@ if (dr < nbZones) { int x1 = int((w - label_width - 1) * dr / double(nbZones) + 0.5); int x2 = int((w - label_width - 1) * (dr + 1) / double(nbZones) + 0.5); - window->draw_rectangle(gc, true, label_width + x1 + 1, y + 1, - (x2 - x1) - 1, h - 2); + cr->rectangle(label_width + x1 + 1, y + 1, + (x2 - x1) - 1, h - 2); + cr->fill(); } } } @@ -228,13 +241,6 @@ return true; } -void DimRegionChooser::on_size_request(GtkRequisition* requisition) -{ - *requisition = GtkRequisition(); - requisition->height = region ? nbDimensions * 20 : 0; - requisition->width = 800; -} - void DimRegionChooser::set_region(gig::Region* region) { this->region = region; @@ -256,6 +262,8 @@ dimreg = 0; } dimregion_selected(); + set_size_request(800, region ? nbDimensions * 20 : 0); + queue_resize(); } @@ -286,7 +294,11 @@ bool DimRegionChooser::on_button_release_event(GdkEventButton* event) { if (resize.active) { +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 get_window()->pointer_ungrab(event->time); +#else + Glib::wrap(event->device, true)->ungrab(event->time); +#endif resize.active = false; if (region->pDimensionDefinitions[resize.dimension].dimension == gig::dimension_velocity) { @@ -377,12 +389,23 @@ event->x >= label_width && event->x < w) { if (is_in_resize_zone(event->x, event->y)) { - Gdk::Cursor double_arrow(Gdk::SB_H_DOUBLE_ARROW); +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 get_window()->pointer_grab(false, Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK, - double_arrow, event->time); + Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW), + event->time); +#else + Glib::wrap(event->device, true)->grab(get_window(), + Gdk::OWNERSHIP_NONE, + false, + Gdk::BUTTON_RELEASE_MASK | + Gdk::POINTER_MOTION_MASK | + Gdk::POINTER_MOTION_HINT_MASK, + Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW), + event->time); +#endif resize.active = true; } else { int ydim = int(event->y / h); @@ -464,8 +487,8 @@ if (k < 2) k = 2; // k is upper limit + 1, upper limit 0 is forbidden if (k != resize.pos) { - Glib::RefPtr black = get_style()->get_black_gc(); - Glib::RefPtr white = get_style()->get_white_gc(); + Cairo::RefPtr cr = get_window()->create_cairo_context(); + cr->set_line_width(1); int prevx = int((w - label_width - 1) * resize.pos / 128.0 + 0.5) + label_width; int x = int((w - label_width - 1) * k / 128.0 + 0.5) + label_width; @@ -473,39 +496,48 @@ if (resize.selected == resize.none) { if (resize.pos != resize.min && resize.pos != resize.max) { - window->draw_line(white, prevx, y + 1, prevx, y + h - 2); + Gdk::Cairo::set_source_rgba(cr, white); + cr->move_to(prevx + 0.5, y + 1); + cr->line_to(prevx + 0.5, y + h - 1); + cr->stroke(); } } else { - gc->set_foreground(red); - - Glib::RefPtr left; - Glib::RefPtr right; + Gdk::RGBA left; + Gdk::RGBA right; if (resize.selected == resize.left) { - left = gc; + left = red; right = white; } else { left = white; - right = gc; + right = red; } if (k > resize.pos) { int xx = resize.pos == resize.min ? 1 : 0; - window->draw_rectangle(left, true, - prevx + xx, y + 1, x - prevx - xx, h - 2); + Gdk::Cairo::set_source_rgba(cr, left); + cr->rectangle(prevx + xx, y + 1, x - prevx - xx, h - 2); } else { int xx = resize.pos == resize.max ? 0 : 1; - window->draw_rectangle(right, true, - x, y + 1, prevx - x + xx, h - 2); + Gdk::Cairo::set_source_rgba(cr, right); + cr->rectangle(x, y + 1, prevx - x + xx, h - 2); } + cr->fill(); } - window->draw_line(black, x, y + 1, x, y + h - 2); + Gdk::Cairo::set_source_rgba(cr, black); + cr->move_to(x + 0.5, y + 1); + cr->line_to(x + 0.5, y + h - 1); + cr->stroke(); + resize.pos = k; } } else { if (is_in_resize_zone(x, y)) { if (!cursor_is_resize) { - Gdk::Cursor double_arrow(Gdk::SB_H_DOUBLE_ARROW); - window->set_cursor(double_arrow); +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 + window->set_cursor(Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW)); +#else + window->set_cursor(Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW)); +#endif cursor_is_resize = true; } } else if (cursor_is_resize) {