Adding more methods to LabelModel.
This commit is contained in:
+95
-60
@@ -20,13 +20,16 @@
|
|||||||
|
|
||||||
#include "LabelModel.h"
|
#include "LabelModel.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
namespace glabels
|
namespace glabels
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor.
|
* Default constructor.
|
||||||
*/
|
*/
|
||||||
LabelModel::LabelModel()
|
LabelModel::LabelModel() : mModified(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,17 +39,46 @@ namespace glabels
|
|||||||
*/
|
*/
|
||||||
void LabelModel::addItem( LabelModelItem *item )
|
void LabelModel::addItem( LabelModelItem *item )
|
||||||
{
|
{
|
||||||
|
item->setParent( this );
|
||||||
mItemList << item;
|
mItemList << item;
|
||||||
|
|
||||||
|
connect( item, SIGNAL(changed()), this, SLOT(itemChanged(LabelModelItem*)) );
|
||||||
|
connect( item, SIGNAL(moved()), this, SLOT(itemMoved(LabelModelItem*)) );
|
||||||
|
|
||||||
|
mModified = true;
|
||||||
|
|
||||||
emit itemAdded( item );
|
emit itemAdded( item );
|
||||||
|
emit changed();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LabelModel::itemChanged( LabelModelItem *item )
|
||||||
|
{
|
||||||
|
mModified = true;
|
||||||
|
|
||||||
|
emit changed();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LabelModel::itemMoved( LabelModelItem *item )
|
||||||
|
{
|
||||||
|
mModified = true;
|
||||||
|
|
||||||
|
emit changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LabelModel::deleteItem( LabelModelItem *item )
|
void LabelModel::deleteItem( LabelModelItem *item )
|
||||||
{
|
{
|
||||||
|
item->unselect();
|
||||||
mItemList.removeOne( item );
|
mItemList.removeOne( item );
|
||||||
|
|
||||||
|
disconnect( item, 0, this, 0 );
|
||||||
|
|
||||||
|
mModified = true;
|
||||||
|
|
||||||
emit itemDeleted( item );
|
emit itemDeleted( item );
|
||||||
|
emit changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -75,7 +107,7 @@ namespace glabels
|
|||||||
/**
|
/**
|
||||||
* Select all items.
|
* Select all items.
|
||||||
*/
|
*/
|
||||||
void LabelModel::selectAll( void )
|
void LabelModel::selectAll()
|
||||||
{
|
{
|
||||||
foreach ( LabelModelItem *item, mItemList )
|
foreach ( LabelModelItem *item, mItemList )
|
||||||
{
|
{
|
||||||
@@ -89,7 +121,7 @@ namespace glabels
|
|||||||
/**
|
/**
|
||||||
* Unselect item all items.
|
* Unselect item all items.
|
||||||
*/
|
*/
|
||||||
void LabelModel::unselectAll( void )
|
void LabelModel::unselectAll()
|
||||||
{
|
{
|
||||||
foreach ( LabelModelItem *item, mItemList )
|
foreach ( LabelModelItem *item, mItemList )
|
||||||
{
|
{
|
||||||
@@ -100,6 +132,64 @@ namespace glabels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LabelModel::selectRegion( const LabelRegion ®ion )
|
||||||
|
{
|
||||||
|
double rX1 = std::min( region.x1(), region.x2() );
|
||||||
|
double rY1 = std::min( region.y1(), region.y2() );
|
||||||
|
double rX2 = std::max( region.x1(), region.x2() );
|
||||||
|
double rY2 = std::max( region.y1(), region.y2() );
|
||||||
|
|
||||||
|
foreach ( LabelModelItem *item, mItemList )
|
||||||
|
{
|
||||||
|
LabelRegion itemExtent = item->getExtent();
|
||||||
|
|
||||||
|
if ( (itemExtent.x1() >= rX1) &&
|
||||||
|
(itemExtent.x2() <= rX2) &&
|
||||||
|
(itemExtent.y1() >= rY1) &&
|
||||||
|
(itemExtent.y2() <= rY2) )
|
||||||
|
{
|
||||||
|
item->select();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emit selectionChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool LabelModel::isSelectionEmpty()
|
||||||
|
{
|
||||||
|
foreach ( LabelModelItem *item, mItemList )
|
||||||
|
{
|
||||||
|
if ( item->isSelected() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool LabelModel::isSelectionAtomic()
|
||||||
|
{
|
||||||
|
int nSelected = 0;
|
||||||
|
|
||||||
|
foreach ( LabelModelItem *item, mItemList )
|
||||||
|
{
|
||||||
|
if ( item->isSelected() )
|
||||||
|
{
|
||||||
|
nSelected++;
|
||||||
|
if ( nSelected > 1 )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (nSelected == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QList<LabelModelItem *> LabelModel::getSelection()
|
QList<LabelModelItem *> LabelModel::getSelection()
|
||||||
{
|
{
|
||||||
QList<LabelModelItem*> selectedList;
|
QList<LabelModelItem*> selectedList;
|
||||||
@@ -124,11 +214,11 @@ namespace glabels
|
|||||||
deleteItem( item );
|
deleteItem( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mModified = true;
|
||||||
|
|
||||||
emit selectionChanged();
|
emit selectionChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -524,61 +614,6 @@ namespace qtLabels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void select_region( LabelRegion region )
|
|
||||||
{
|
|
||||||
double r_x1 = double.min( region.x1, region.x2 );
|
|
||||||
double r_y1 = double.min( region.y1, region.y2 );
|
|
||||||
double r_x2 = double.max( region.x1, region.x2 );
|
|
||||||
double r_y2 = double.max( region.y1, region.y2 );
|
|
||||||
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
LabelRegion obj_extent = object.get_extent();
|
|
||||||
|
|
||||||
if ( (obj_extent.x1 >= r_x1) &&
|
|
||||||
(obj_extent.x2 <= r_x2) &&
|
|
||||||
(obj_extent.y1 >= r_y1) &&
|
|
||||||
(obj_extent.y2 <= r_y2) )
|
|
||||||
{
|
|
||||||
object.select();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
selection_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public bool is_selection_empty()
|
|
||||||
{
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
if ( object.is_selected() )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public bool is_selection_atomic()
|
|
||||||
{
|
|
||||||
int n_selected = 0;
|
|
||||||
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
if ( object.is_selected() )
|
|
||||||
{
|
|
||||||
n_selected++;
|
|
||||||
if ( n_selected > 1 )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (n_selected == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public LabelObject? get_1st_selected_object()
|
public LabelObject? get_1st_selected_object()
|
||||||
{
|
{
|
||||||
foreach ( LabelObject object in object_list )
|
foreach ( LabelObject object in object_list )
|
||||||
|
|||||||
+20
-182
@@ -39,11 +39,16 @@ namespace glabels
|
|||||||
virtual ~LabelModel() {}
|
virtual ~LabelModel() {}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
void changed();
|
||||||
void selectionChanged();
|
void selectionChanged();
|
||||||
void itemAdded( LabelModelItem *item );
|
void itemAdded( LabelModelItem *item );
|
||||||
void itemDeleted( LabelModelItem *item );
|
void itemDeleted( LabelModelItem *item );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Q_PROPERTY( bool modified READ isModified );
|
||||||
|
bool isModified( void ) const { return mModified; }
|
||||||
|
|
||||||
|
|
||||||
void addItem( LabelModelItem *item );
|
void addItem( LabelModelItem *item );
|
||||||
|
|
||||||
void deleteItem( LabelModelItem *item );
|
void deleteItem( LabelModelItem *item );
|
||||||
@@ -53,9 +58,15 @@ namespace glabels
|
|||||||
|
|
||||||
void unselectItem( LabelModelItem *item );
|
void unselectItem( LabelModelItem *item );
|
||||||
|
|
||||||
void selectAll( void );
|
void selectAll();
|
||||||
|
|
||||||
void unselectAll( void );
|
void unselectAll();
|
||||||
|
|
||||||
|
void selectRegion( const LabelRegion ®ion );
|
||||||
|
|
||||||
|
bool isSelectionEmpty();
|
||||||
|
|
||||||
|
bool isSelectionAtomic();
|
||||||
|
|
||||||
|
|
||||||
QList<LabelModelItem *> getSelection();
|
QList<LabelModelItem *> getSelection();
|
||||||
@@ -64,9 +75,16 @@ namespace glabels
|
|||||||
void deleteSelection();
|
void deleteSelection();
|
||||||
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void itemChanged( LabelModelItem *item );
|
||||||
|
void itemMoved( LabelModelItem *item );
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QList<LabelModelItem*> mItemList;
|
QList<LabelModelItem*> mItemList;
|
||||||
|
|
||||||
|
bool mModified;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -338,192 +356,12 @@ namespace qtLabels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void add_object( LabelObject object )
|
|
||||||
{
|
|
||||||
object.parent = this;
|
|
||||||
object_list.append( object );
|
|
||||||
|
|
||||||
object.changed.connect( on_object_changed );
|
|
||||||
object.moved.connect( on_object_moved );
|
|
||||||
|
|
||||||
changed();
|
|
||||||
modified = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void delete_object( LabelObject object )
|
|
||||||
{
|
|
||||||
unselect_object( object );
|
|
||||||
|
|
||||||
object_list.remove( object );
|
|
||||||
|
|
||||||
object.changed.disconnect( on_object_changed );
|
|
||||||
object.moved.disconnect( on_object_moved );
|
|
||||||
|
|
||||||
changed();
|
|
||||||
modified = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void on_object_changed()
|
|
||||||
{
|
|
||||||
schedule_or_emit_changed_signal();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void on_object_moved()
|
|
||||||
{
|
|
||||||
schedule_or_emit_changed_signal();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void on_merge_source_changed()
|
private void on_merge_source_changed()
|
||||||
{
|
{
|
||||||
changed();
|
changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void draw( Cairo.Context cr,
|
|
||||||
bool in_editor,
|
|
||||||
MergeRecord? record )
|
|
||||||
{
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
object.draw( cr, in_editor, record );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public LabelObject? object_at( Cairo.Context cr,
|
|
||||||
double x_pixels,
|
|
||||||
double y_pixels )
|
|
||||||
{
|
|
||||||
for ( unowned List<LabelObject>? p = object_list.last(); p != null; p = p.prev )
|
|
||||||
{
|
|
||||||
LabelObject object = p.data;
|
|
||||||
|
|
||||||
if ( object.is_located_at( cr, x_pixels, y_pixels ) )
|
|
||||||
{
|
|
||||||
return object;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Handle? handle_at( Cairo.Context cr,
|
|
||||||
double x_pixels,
|
|
||||||
double y_pixels )
|
|
||||||
{
|
|
||||||
for ( unowned List<LabelObject>? p = object_list.last(); p != null; p = p.prev )
|
|
||||||
{
|
|
||||||
LabelObject object = p.data;
|
|
||||||
|
|
||||||
if ( object.is_selected() )
|
|
||||||
{
|
|
||||||
Handle? handle = object.handle_at( cr, x_pixels, y_pixels );
|
|
||||||
|
|
||||||
if ( handle != null )
|
|
||||||
{
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void select_object( LabelObject object )
|
|
||||||
{
|
|
||||||
object.select();
|
|
||||||
selection_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void unselect_object( LabelObject object )
|
|
||||||
{
|
|
||||||
object.unselect();
|
|
||||||
selection_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void select_all()
|
|
||||||
{
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
object.select();
|
|
||||||
}
|
|
||||||
selection_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void unselect_all()
|
|
||||||
{
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
object.unselect();
|
|
||||||
}
|
|
||||||
selection_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void select_region( LabelRegion region )
|
|
||||||
{
|
|
||||||
double r_x1 = double.min( region.x1, region.x2 );
|
|
||||||
double r_y1 = double.min( region.y1, region.y2 );
|
|
||||||
double r_x2 = double.max( region.x1, region.x2 );
|
|
||||||
double r_y2 = double.max( region.y1, region.y2 );
|
|
||||||
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
LabelRegion obj_extent = object.get_extent();
|
|
||||||
|
|
||||||
if ( (obj_extent.x1 >= r_x1) &&
|
|
||||||
(obj_extent.x2 <= r_x2) &&
|
|
||||||
(obj_extent.y1 >= r_y1) &&
|
|
||||||
(obj_extent.y2 <= r_y2) )
|
|
||||||
{
|
|
||||||
object.select();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
selection_changed();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public bool is_selection_empty()
|
|
||||||
{
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
if ( object.is_selected() )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public bool is_selection_atomic()
|
|
||||||
{
|
|
||||||
int n_selected = 0;
|
|
||||||
|
|
||||||
foreach ( LabelObject object in object_list )
|
|
||||||
{
|
|
||||||
if ( object.is_selected() )
|
|
||||||
{
|
|
||||||
n_selected++;
|
|
||||||
if ( n_selected > 1 )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (n_selected == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public LabelObject? get_1st_selected_object()
|
public LabelObject? get_1st_selected_object()
|
||||||
{
|
{
|
||||||
foreach ( LabelObject object in object_list )
|
foreach ( LabelObject object in object_list )
|
||||||
|
|||||||
+12
-12
@@ -28,24 +28,24 @@ namespace glabels
|
|||||||
struct LabelRegion
|
struct LabelRegion
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline double x1( void ) { return m_x1; }
|
inline double x1( void ) const { return mX1; }
|
||||||
inline void x1( double value ) { m_x1 = value; }
|
inline void x1( double value ) { mX1 = value; }
|
||||||
|
|
||||||
inline double y1( void ) { return m_y1; }
|
inline double y1( void ) const { return mY1; }
|
||||||
inline void y1( double value ) { m_y1 = value; }
|
inline void y1( double value ) { mY1 = value; }
|
||||||
|
|
||||||
inline double x2( void ) { return m_x2; }
|
inline double x2( void ) const { return mX2; }
|
||||||
inline void x2( double value ) { m_x2 = value; }
|
inline void x2( double value ) { mX2 = value; }
|
||||||
|
|
||||||
inline double y2( void ) { return m_y2; }
|
inline double y2( void ) const { return mY2; }
|
||||||
inline void y2( double value ) { m_y2 = value; }
|
inline void y2( double value ) { mY2 = value; }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double m_x1;
|
double mX1;
|
||||||
double m_y1;
|
double mY1;
|
||||||
double m_x2;
|
double mX2;
|
||||||
double m_y2;
|
double mY2;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user