--- gigedit/trunk/src/gigedit/dimregionchooser.cpp 2007/09/10 19:56:26 1339 +++ gigedit/trunk/src/gigedit/dimregionchooser.cpp 2008/02/02 08:18:19 1656 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007 Andreas Persson + * Copyright (C) 2006-2008 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 @@ -44,7 +44,6 @@ resize.active = false; cursor_is_resize = false; h = 20; - w = 800; set_flags(Gtk::CAN_FOCUS); add_events(Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK); @@ -71,6 +70,7 @@ 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(); @@ -93,7 +93,7 @@ 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="keyboard"; 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; @@ -230,7 +230,6 @@ void DimRegionChooser::on_size_request(GtkRequisition* requisition) { - printf("DimRegionChooser::on_size_request\n"); *requisition = GtkRequisition(); requisition->height = region ? nbDimensions * 20 : 0; requisition->width = 800; @@ -249,10 +248,6 @@ int z = std::min(dimvalue[region->pDimensionDefinitions[dim].dimension], region->pDimensionDefinitions[dim].zones - 1); - int mask = - ~(((1 << region->pDimensionDefinitions[dim].bits) - 1) << - bitcount); - dimregno &= mask; dimregno |= (z << bitcount); bitcount += region->pDimensionDefinitions[dim].bits; } @@ -264,6 +259,30 @@ queue_resize(); } + +void DimRegionChooser::get_dimregions(const gig::Region* region, bool stereo, + std::set& dimregs) const +{ + int dimregno = 0; + int bitcount = 0; + int stereo_bit = 0; + for (int dim = 0 ; dim < region->Dimensions ; dim++) { + if (region->pDimensionDefinitions[dim].bits == 0) continue; + if (stereo && + region->pDimensionDefinitions[dim].dimension == gig::dimension_samplechannel) { + stereo_bit = (1 << bitcount); + } else { + int z = std::min(dimvalue[region->pDimensionDefinitions[dim].dimension], + region->pDimensionDefinitions[dim].zones - 1); + dimregno |= (z << bitcount); + } + bitcount += region->pDimensionDefinitions[dim].bits; + } + dimregs.insert(region->pDimensionRegions[dimregno]); + if (stereo_bit) dimregs.insert(region->pDimensionRegions[dimregno | stereo_bit]); +} + + bool DimRegionChooser::on_button_release_event(GdkEventButton* event) { if (resize.active) { @@ -353,6 +372,7 @@ bool DimRegionChooser::on_button_press_event(GdkEventButton* event) { + int w = get_width(); if (region && event->y < nbDimensions * h && event->x >= label_width && event->x < w) { @@ -435,6 +455,7 @@ window->get_pointer(x, y, state); if (resize.active) { + int w = get_width(); int k = int((x - label_width) * 128.0 / (w - label_width - 1) + 0.5); if (k < resize.min) k = resize.min; @@ -497,6 +518,7 @@ bool DimRegionChooser::is_in_resize_zone(double x, double y) { + int w = get_width(); if (region && y < nbDimensions * h && x >= label_width && x < w) { int ydim = int(y / h); int dim;