You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.1 KiB
194 lines
5.1 KiB
/*
|
|
Rosegarden
|
|
A MIDI and audio sequencer and musical notation editor.
|
|
|
|
This program is Copyright 2000-2008
|
|
Guillaume Laurent <glaurent@telegraph-road.org>,
|
|
Chris Cannam <cannam@all-day-breakfast.com>,
|
|
Richard Bown <richard.bown@ferventsoftware.com>
|
|
|
|
The moral rights of Guillaume Laurent, Chris Cannam, and Richard
|
|
Bown to claim authorship of this work have been asserted.
|
|
|
|
Other copyrights also apply to some parts of this work. Please
|
|
see the AUTHORS file and individual file headers for details.
|
|
|
|
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. See the file
|
|
COPYING included with this distribution for more information.
|
|
*/
|
|
|
|
#include "ControlItem.h"
|
|
#include "ControlRuler.h"
|
|
#include "ElementAdapter.h"
|
|
#include "misc/Debug.h"
|
|
|
|
namespace Rosegarden {
|
|
|
|
const unsigned int ControlItem::BorderThickness = 1;
|
|
const unsigned int ControlItem::DefaultWidth = 20;
|
|
static int _canvasItemZ = 30;
|
|
|
|
ControlItem::ControlItem(ControlRuler* ruler, ElementAdapter* elementAdapter,
|
|
int xx, int width)
|
|
: TQCanvasRectangle(ruler->canvas()),
|
|
m_value(0),
|
|
m_controlRuler(ruler),
|
|
m_elementAdapter(elementAdapter)
|
|
{
|
|
if (width < DefaultWidth/4) {
|
|
width = DefaultWidth/4; // avoid invisible zero-duration items
|
|
}
|
|
setWidth(width);
|
|
setPen(TQPen(TQt::black, BorderThickness));
|
|
setBrush(TQt::blue);
|
|
|
|
setX(xx);
|
|
setY(canvas()->height());
|
|
setZ(_canvasItemZ++); // we should make this work against controlruler
|
|
|
|
updateFromValue();
|
|
setEnabled(false);
|
|
//RG_DEBUG << "ControlItem x = " << x() << " - y = " << y() << " - width = " << width << endl;
|
|
show();
|
|
}
|
|
|
|
ControlItem::~ControlItem()
|
|
{
|
|
delete m_elementAdapter;
|
|
}
|
|
|
|
|
|
void ControlItem::setValue(long v)
|
|
{
|
|
// RG_DEBUG << "ControlItem::setValue(" << v << ") x = " << x() << endl;
|
|
|
|
m_value = v;
|
|
}
|
|
|
|
void ControlItem::updateValue()
|
|
{
|
|
m_elementAdapter->setValue(m_value);
|
|
}
|
|
|
|
void ControlItem::updateFromValue()
|
|
{
|
|
// RG_DEBUG << "ControlItem::updateFromValue() : " << this << endl;
|
|
|
|
if (m_elementAdapter->getValue(m_value)) {
|
|
// RG_DEBUG << "ControlItem::updateFromValue() : value = " << m_value << endl;
|
|
setHeight(m_controlRuler->valueToHeight(m_value));
|
|
}
|
|
}
|
|
|
|
typedef std::pair<int, TQCanvasItem*> ItemPair;
|
|
struct ItemCmp
|
|
{
|
|
bool operator()(const ItemPair &i1, const ItemPair &i2)
|
|
{
|
|
return i1.first > i2.first;
|
|
}
|
|
};
|
|
|
|
void ControlItem::draw(TQPainter &painter)
|
|
{
|
|
if (!isEnabled())
|
|
updateFromValue();
|
|
|
|
setBrush(m_controlRuler->valueToColour(m_controlRuler->getMaxItemValue(), m_value));
|
|
|
|
TQCanvasRectangle::draw(painter);
|
|
|
|
|
|
/*
|
|
|
|
// Attempt to get overlapping rectangles ordered automatically -
|
|
// probably best not to do this here - rwb
|
|
|
|
// calculate collisions and assign Z values accordingly
|
|
//
|
|
TQCanvasItemList l = collisions(false);
|
|
|
|
std::vector<ItemPair> sortList;
|
|
|
|
for (TQCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) {
|
|
|
|
// skip all but rectangles
|
|
if ((*it)->rtti() != TQCanvasItem::Rtti_Rectangle) continue;
|
|
|
|
if (TQCanvasRectangle *rect = dynamic_cast<TQCanvasRectangle*>(*it))
|
|
sortList.push_back(ItemPair(rect->height(), *it));
|
|
}
|
|
|
|
// sort the list by height
|
|
std::sort(sortList.begin(), sortList.end(), ItemCmp());
|
|
|
|
int z = 20;
|
|
|
|
for (std::vector<ItemPair>::iterator it = sortList.begin();
|
|
it != sortList.end(); ++it)
|
|
{
|
|
RG_DEBUG << "HEIGHT = " << (*it).first << endl;
|
|
(*it).second->setZ(z++);
|
|
}
|
|
|
|
RG_DEBUG << endl << endl;
|
|
|
|
canvas()->update();
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
void ControlItem::handleMouseButtonPress(TQMouseEvent*)
|
|
{
|
|
// RG_DEBUG << "ControlItem::handleMouseButtonPress()" << this << endl;
|
|
setEnabled(true);
|
|
}
|
|
|
|
void ControlItem::handleMouseButtonRelease(TQMouseEvent*)
|
|
{
|
|
// RG_DEBUG << "ControlItem::handleMouseButtonRelease()" << this << endl;
|
|
setEnabled(false);
|
|
}
|
|
|
|
void ControlItem::handleMouseMove(TQMouseEvent*, int /*deltaX*/, int deltaY)
|
|
{
|
|
// RG_DEBUG << "ControlItem::handleMouseMove()" << this << endl;
|
|
|
|
// height is always negative
|
|
//
|
|
|
|
m_controlRuler->applyTool(x(), deltaY);
|
|
|
|
int absNewHeight = -(getHeight() + deltaY);
|
|
|
|
// Make sure height is within bounds
|
|
if (absNewHeight > ControlRuler::MaxItemHeight)
|
|
absNewHeight = ControlRuler::MaxItemHeight;
|
|
else if (absNewHeight < ControlRuler::MinItemHeight)
|
|
absNewHeight = ControlRuler::MinItemHeight;
|
|
|
|
setHeight(-absNewHeight);
|
|
setValue(m_controlRuler->heightToValue(getHeight()));
|
|
}
|
|
|
|
void ControlItem::handleMouseWheel(TQWheelEvent *)
|
|
{
|
|
// RG_DEBUG << "ControlItem::handleMouseWheel - got wheel event" << endl;
|
|
}
|
|
|
|
void ControlItem::setSelected(bool s)
|
|
{
|
|
TQCanvasItem::setSelected(s);
|
|
|
|
if (s) setPen(TQPen(TQt::red, BorderThickness));
|
|
else setPen(TQPen(TQt::black, BorderThickness));
|
|
|
|
canvas()->update();
|
|
}
|
|
|
|
}
|