[gparted] Store pointers to partition objects in TreeView_Details (#750168)



commit acd5d7e580007894147e1dedb3a2d8e0f80e7477
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Sat May 16 22:36:29 2015 +0100

    Store pointers to partition objects in TreeView_Details (#750168)
    
    This stops copying of each displayed partition object into the
    TreeView_Details class.
    
    It also stops copy constructing lots of partition objects when just
    clicking on a partition in the disk graphic.  The disk graphic needs to
    inform the main GUI and then the partition list which partition has been
    selected.  The call sequence goes like:
    
        DrawingAreaVisualDisk::on_button_press_event(event)
          Win_GParted::on_partition_selected(partition_ptr, src_is_treeview)
            TreeView_Detail::set_selected(partition_ptr)
              TreeView_Detail::set_selected(rows, partition_ptr,
                                            inside_extended)
    
    Relevant source and highlighted comparison line:
    
       140  bool TreeView_Detail::set_selected( Gtk::TreeModel::Children rows,
       141                                      const Partition * partition_ptr, bool inside_extended )
       142  {
       143          for ( unsigned int t = 0 ; t < rows .size() ; t++ )
       144          {
    >> 145                  if ( static_cast<Partition>( rows[t][treeview_detail_columns.partition] ) == 
*partition_ptr )
       146                  {
       147                          if ( inside_extended )
       148                                  expand_all() ;
       149
       150                          set_cursor( static_cast<Gtk::TreePath>( rows[ t ] ) ) ;
       151                          return true ;
       152                  }
       153
       154                  if ( set_selected( rows[t].children(), partition_ptr, true ) )
       155                          return true ;
       156          }
       157
       158          return false ;
       159  }
    
    Then in this function the partition selected in the disk graphic
    (partition_ptr parameter) is compared in turn with each partition object
    stored in the Gtk::TreeView model to find the matching one to mark it as
    selected.  This mere act of accessing the partition object stored in a
    row of the Gtk::TreeView model causes it to be copy constructed.  So
    clicking on the 5th partition in the disk graphic will copy construct
    the first 5 partition objects just to do a compare to find the matching
    one.
    
    This is because it is not possible to get a reference from a
    Gtk:TreeViewProxy in gtkmm.  Merely accessing a value in a Gtk::TreeView
    model takes a copy of that value.
    
        Subject: get a reference from a Gtk::TreeValueProxy
        http://comments.gmane.org/gmane.comp.gnome.gtkmm/2217
        http://marc.info/?t=104400417500001&r=1&w=4
    
    Bug 750168 - Reduce the amount of copying of partition objects

 include/TreeView_Detail.h |    7 ++++---
 src/TreeView_Detail.cc    |   11 +++++------
 2 files changed, 9 insertions(+), 9 deletions(-)
---
diff --git a/include/TreeView_Detail.h b/include/TreeView_Detail.h
index 14e367d..8aedc18 100644
--- a/include/TreeView_Detail.h
+++ b/include/TreeView_Detail.h
@@ -81,14 +81,15 @@ private:
                Gtk::TreeModelColumn< Glib::RefPtr<Gdk::Pixbuf> > icon1 ;
                Gtk::TreeModelColumn< Glib::RefPtr<Gdk::Pixbuf> > icon2 ;
                Gtk::TreeModelColumn<Glib::ustring> flags;
-               Gtk::TreeModelColumn<Partition> partition; //hidden column 
-               
+               Gtk::TreeModelColumn<const Partition *> partition_ptr;  // Hidden column.  (Alias to element 
in
+                                                                       // Win_GParted::display_partitions[] 
vector).
+
                treeview_detail_Columns()
                {
                        add( path ); add( name ); add( filesystem ); add( mountpoint ); add( label );
                        add( size ); add( used ); add( unused ); add( color );
                        add( text_color ); add( mount_text_color ); add( icon1 );
-                       add( icon2 ) ; add( flags ); add( partition );
+                       add( icon2 ); add( flags ); add( partition_ptr );
                }
        };
        
diff --git a/src/TreeView_Detail.cc b/src/TreeView_Detail.cc
index 2063508..91947e5 100644
--- a/src/TreeView_Detail.cc
+++ b/src/TreeView_Detail.cc
@@ -142,7 +142,7 @@ bool TreeView_Detail::set_selected( Gtk::TreeModel::Children rows,
 {
        for ( unsigned int t = 0 ; t < rows .size() ; t++ )
        {
-               if ( static_cast<Partition>( rows[t][treeview_detail_columns.partition] ) == *partition_ptr )
+               if ( * static_cast<const Partition *>( rows[t][treeview_detail_columns.partition_ptr] ) == 
*partition_ptr )
                {
                        if ( inside_extended )
                                expand_all() ;
@@ -211,9 +211,9 @@ void TreeView_Detail::create_row( const Gtk::TreeRow & treerow, const Partition
        //flags 
        treerow[ treeview_detail_columns .flags ] = 
                Glib::build_path( ", ", partition .flags ) ;
-       
-       //hidden column (partition object)
-       treerow[ treeview_detail_columns .partition ] = partition;
+
+       // Hidden column (pointer to partition object)
+       treerow[treeview_detail_columns.partition_ptr] = & partition;
 }
 
 bool TreeView_Detail::on_button_press_event( GdkEventButton * event )
@@ -241,8 +241,7 @@ void TreeView_Detail::on_selection_changed()
        if ( ! block && treeselection ->get_selected() != 0 )
        {
                Gtk::TreeRow row = static_cast<Gtk::TreeRow>( * treeselection ->get_selected() ) ;
-               Partition selected_partition = row[treeview_detail_columns.partition];
-               signal_partition_selected.emit( & selected_partition, true );
+               signal_partition_selected.emit( row[treeview_detail_columns.partition_ptr], true );
        }
 }
        


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]