提交 1682c8f4 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

We gives every geo_graphics_item an prop, which is a boolean variable. Items...

We gives every geo_graphics_item an prop, which is a boolean variable. Items can be selected by mouse dragging.
上级 9c377e8e
......@@ -10,6 +10,7 @@ namespace QTVP_GEOMARKER{
,m_type(tp)
,m_name(name)
,m_pLabelItem(0)
,m_pSelectionBound(0)
,m_bPropVisible(false)
{
if (pVi)
......@@ -26,11 +27,64 @@ namespace QTVP_GEOMARKER{
m_pLabelItem = 0;
}
}
if (m_pSelectionBound)
{
if (m_pSelectionBound->scene()==0)
{
delete m_pSelectionBound;
m_pSelectionBound = 0;
}
}
}
bool geoItemBase::is_selected ()
{
return m_bSeleted;
}
void geoItemBase::set_selected (bool bsel)
{
m_bSeleted = bsel;
QGraphicsItem * pc = dynamic_cast<QGraphicsItem *> (this);
if (pc)
{
if (m_bSeleted == true)
{
if (!m_pSelectionBound)
{
m_pSelectionBound = new QGraphicsRectItem(pc);
m_pSelectionBound->setRect(pc->boundingRect());
m_pSelectionBound->setPen(QPen(QBrush(QColor(255,64,0)),3,Qt::DashDotDotLine));
}
}
else
{
if (m_pSelectionBound)
{
QGraphicsScene * sc = pc->scene();
if (sc)
{
sc->removeItem(m_pSelectionBound);
}
delete m_pSelectionBound;
m_pSelectionBound = 0;
}
}
}
}
void geoItemBase::setLevel(int newLevel)
{
if (m_pLabelItem && newLevel != level())
m_pLabelItem->setPos(label_pos());
if (m_pSelectionBound && newLevel != level())
{
QGraphicsItem * pc = dynamic_cast<QGraphicsItem *> (this);
if (pc)
m_pSelectionBound->setRect(pc->boundingRect());
}
m_nCurrentLevel = newLevel;
}
......
......@@ -7,6 +7,7 @@
#include <QFont>
#include <QColor>
#include <QGraphicsTextItem>
#include <QGraphicsRectItem>
namespace QTVOSM{
class viewer_interface;
}
......@@ -57,8 +58,10 @@ namespace QTVP_GEOMARKER{
QFont m_LabelTextFont;
QColor m_LabelTextColor;
bool m_bPropVisible;
bool m_bSeleted;
int m_nCurrentLevel;
QGraphicsTextItem * m_pLabelItem;
QGraphicsRectItem * m_pSelectionBound;
QMap<QString, QVariant> m_props;
geo_item_type m_type;
QTVOSM::viewer_interface * m_pVi;
......@@ -86,6 +89,8 @@ namespace QTVP_GEOMARKER{
void del_prop (const QString & s);
void show_props (bool bShow);
bool props_visible ();
bool is_selected ();
void set_selected (bool bsel);
public:
virtual void adjust_coords(int nNewLevel) = 0;
virtual QPointF label_pos() = 0;
......
......@@ -315,25 +315,6 @@ void qtvplugin_geomarker::cb_paintEvent( QPainter * pImage )
default:
break;
}
if (m_sel_rects_merkator.empty()==false)
{
QPen pen_sel(QColor(0,64,255,128));
pen_sel.setWidth(2);
pen_sel.setStyle(Qt::DotLine);
pImage->setPen(pen_sel);
//draw select regions
foreach (QRectF wr, m_sel_rects_merkator)
{
double wx1,wy1,wx2,wy2;
qint32 nx1,ny1,nx2,ny2;
m_pVi->CV_MK2World(wr.left(),wr.top(),&wx1,&wy1);
m_pVi->CV_MK2World(wr.right(),wr.bottom(),&wx2,&wy2);
m_pVi->CV_World2DP(wx1,wy1,&nx1,&ny1);
m_pVi->CV_World2DP(wx2,wy2,&nx2,&ny2);
for (int i = -1;i<=1;++i)
pImage->drawRect(QRectF(QPointF(nx1 + i * winsz,ny1),QPointF(nx2 + i * winsz,ny2)));
}
}
}
void qtvplugin_geomarker::cb_levelChanged(int level)
......@@ -433,15 +414,23 @@ QRectF qtvplugin_geomarker::current_sel_RectWorld()
void qtvplugin_geomarker::clearSelection()
{
if (!m_pVi)
return ;
foreach (QString name, m_set_itemNameSelected)
{
QTVP_GEOMARKER::geoItemBase * it = m_pScene->geoitem_by_name(name);
if (it)
it->set_selected(false);
}
m_set_itemNameSelected.clear();
m_sel_rects_merkator.clear();
refresh_selection_listview();
m_pVi->UpdateWindow();
}
void qtvplugin_geomarker::addSelection(QRectF rectWorld)
{
qint32 wsz = 256*(1<<m_pVi->level());
int oldsz = m_set_itemNameSelected.size();
bool changed = false;
for (int i=-1;i<=1;++i)
{
double x1 = rectWorld.left()+i * wsz,
......@@ -456,14 +445,24 @@ void qtvplugin_geomarker::addSelection(QRectF rectWorld)
gi = dynamic_cast<QTVP_GEOMARKER::geoItemBase *>(it);
if (gi)
{
m_set_itemNameSelected.insert(gi->item_name());
changed = true;
QString nm = gi->item_name();
if (m_set_itemNameSelected.contains(nm))
{
m_set_itemNameSelected.remove(nm);
gi->set_selected(false);
}
else
{
m_set_itemNameSelected.insert(nm);
gi->set_selected(true);
}
}
}
}
int newsz = m_set_itemNameSelected.size();
if (newsz>oldsz)
if (changed)
{
m_sel_rects_merkator.push_back(CV_RectWrold2Mkt(rectWorld));
refresh_selection_listview();
scheduleUpdateMap();
}
......
......@@ -87,7 +87,6 @@ private:
QPointF m_sel_ptStart_World;
QPointF m_sel_ptEnd_World;
QSet<QString> m_set_itemNameSelected;
QList<QRectF> m_sel_rects_merkator;
QRectF CV_RectWrold2Mkt(QRectF world);
QRectF current_sel_RectWorld();
void addSelection(QRectF rectWorld);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册