MuseScore/libmscore/mscoreview.cpp

84 lines
2.3 KiB
C++

//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2013 Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENSE.GPL
//=============================================================================
#include "mscoreview.h"
#include "score.h"
#include "page.h"
namespace Ms {
//---------------------------------------------------------
// elementLower
//---------------------------------------------------------
static bool elementLower(const Element* e1, const Element* e2)
{
if (!e1->selectable())
return false;
if (!e2->selectable())
return true;
return e1->z() < e2->z();
}
//---------------------------------------------------------
// elementAt
//---------------------------------------------------------
Element* MuseScoreView::elementAt(const QPointF& p)
{
QList<Element*> el = elementsAt(p);
#if 0
qDebug("elementAt");
for (const Element* e : el)
qDebug(" %s %d", e->name(), e->selected());
#endif
Element* e = el.value(0);
if (e && e->isPage())
e = el.value(1);
return e;
}
//---------------------------------------------------------
// point2page
//---------------------------------------------------------
Page* MuseScoreView::point2page(const QPointF& p)
{
if (score()->layoutMode() == LayoutMode::LINE)
return score()->pages().isEmpty() ? 0 : score()->pages().front();
foreach(Page* page, score()->pages()) {
if (page->bbox().translated(page->pos()).contains(p))
return page;
}
return 0;
}
//---------------------------------------------------------
// elementsAt
// p is in canvas coordinates
//---------------------------------------------------------
const QList<Element*> MuseScoreView::elementsAt(const QPointF& p)
{
QList<Element*> el;
Page* page = point2page(p);
if (page) {
el = page->items(p - page->pos());
qSort(el.begin(), el.end(), elementLower);
}
return el;
}
}