Adding more methods to LabelModel.

This commit is contained in:
Jim Evins
2013-11-24 23:55:32 -05:00
parent 7d5a0da2ef
commit b808b7ef2a
3 changed files with 127 additions and 254 deletions
+95 -60
View File
@@ -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 &region )
{
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
View File
@@ -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 &region );
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
View File
@@ -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;
}; };
} }