[gparted] Refactor merging rules into new merge_operations() (#755214)
- From: Curtis Gedak <gedakc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted] Refactor merging rules into new merge_operations() (#755214)
- Date: Tue, 29 Sep 2015 18:42:48 +0000 (UTC)
commit cf5d8d928c7fd8c1e2aad6e70dbb6de8c42f4a93
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date: Tue Sep 15 15:34:12 2015 +0100
Refactor merging rules into new merge_operations() (#755214)
Creation of the various operations involved various implicit rules about
how the different types of operations were merged in different cases.
This was open coded in each ::activate_*() method. Abstract this into
new merge_operations() method and make the merging rules explicitly
specified.
NOTE:
The removal of operation type checking in the MERGE_LAST_WITH_ANY cases
is not a problem because all the Operation*::merge_operations() methods
ensure the operation types match as part of the merge attempt.
Bug 755214 - Refactor operation merging
include/Win_GParted.h | 10 +++++-
src/Win_GParted.cc | 90 ++++++++++++++++++++++---------------------------
2 files changed, 49 insertions(+), 51 deletions(-)
---
diff --git a/include/Win_GParted.h b/include/Win_GParted.h
index 08adedc..c3118ed 100644
--- a/include/Win_GParted.h
+++ b/include/Win_GParted.h
@@ -38,7 +38,14 @@
namespace GParted
{
-
+
+enum MergeType
+{
+ MERGE_LAST_WITH_PREV = 0,
+ MERGE_LAST_WITH_ANY = 1,
+ MERGE_ALL_ADJACENT = 2
+};
+
class Win_GParted : public Gtk::Window
{
public:
@@ -61,6 +68,7 @@ private:
void Add_Operation( Operation * operation, int index = -1 ) ;
bool merge_two_operations( unsigned int first, unsigned int second );
+ void merge_operations( MergeType mergetype );
void Refresh_Visual();
bool valid_display_partition_ptr( const Partition * partition_ptr );
bool Quit_Check_Operations();
diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc
index 0e0393e..ee2cb0e 100644
--- a/src/Win_GParted.cc
+++ b/src/Win_GParted.cc
@@ -758,6 +758,38 @@ bool Win_GParted::merge_two_operations( unsigned int first, unsigned int second
return false;
}
+void Win_GParted::merge_operations( MergeType mergetype )
+{
+ unsigned int num_ops = operations.size();
+ if ( num_ops <= 1 )
+ return; // Nothing to merge. One or fewer operations.
+
+ switch ( mergetype )
+ {
+ case MERGE_LAST_WITH_PREV:
+ merge_two_operations( num_ops-2, num_ops-1 );
+ break;
+
+ case MERGE_LAST_WITH_ANY:
+ for ( unsigned int i = 0 ; i < num_ops-1 ; i ++ )
+ {
+ if ( merge_two_operations( i, num_ops-1 ) )
+ break;
+ }
+ break;
+
+ case MERGE_ALL_ADJACENT:
+ // Must check against operations.size() as looping continues after
+ // merging which might have reduced the number of items in the
+ // vector.
+ for ( unsigned int i = 0 ; i < operations.size()-1 ; i ++ )
+ {
+ merge_two_operations( i, i+1 );
+ }
+ break;
+ }
+}
+
void Win_GParted::Refresh_Visual()
{
// How GParted displays partitions in the GUI and manages the lifetime and
@@ -830,7 +862,7 @@ void Win_GParted::Refresh_Visual()
//
// Win_GParted::activate_label_filesystem()
// Win_GParted::Add_Operation( operation )
- // Win_GParted::merge_two_operations( ... )
+ // Win_GParted::merge_operations( ... )
// Win_GParted::show_operationslist()
// Win_GParted::Refresh_Visual()
//
@@ -1746,10 +1778,7 @@ void Win_GParted::activate_resize()
// Try to merge this resize/move operation with the previous
// operation only.
- if ( operations .size() >= 2 )
- {
- merge_two_operations( operations.size() - 2, operations.size() - 1 );
- }
+ merge_operations( MERGE_LAST_WITH_PREV );
}
}
@@ -2014,10 +2043,7 @@ void Win_GParted::activate_delete()
// newly adjacent and can now be merged. (Applies to resize/move and
// format operations on real, already existing partitions which are only
// merged when adjacent).
- for ( int t = 0 ; t < static_cast<int>( operations .size() - 1 ) ; t++ )
- {
- merge_two_operations( t, t+1 );
- }
+ merge_operations( MERGE_ALL_ADJACENT );
Refresh_Visual();
@@ -2149,12 +2175,8 @@ void Win_GParted::activate_format( GParted::FILESYSTEM new_fs )
operation ->icon = render_icon( Gtk::Stock::CONVERT, Gtk::ICON_SIZE_MENU );
Add_Operation( operation ) ;
-
// Try to merge this format operation with the previous operation only.
- if ( operations .size() >= 2 )
- {
- merge_two_operations( operations.size() - 2, operations.size() - 1 );
- }
+ merge_operations( MERGE_LAST_WITH_PREV );
}
show_operationslist() ;
@@ -2601,16 +2623,8 @@ void Win_GParted::activate_check()
operation ->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU );
Add_Operation( operation ) ;
-
// Try to merge this check operation with all previous operations.
- for ( unsigned int t = 0 ; t < operations .size() - 1 ; t++ )
- {
- if ( operations[ t ] ->type == OPERATION_CHECK )
- {
- if ( merge_two_operations( t, operations.size() - 1 ) )
- break;
- }
- }
+ merge_operations( MERGE_LAST_WITH_ANY );
show_operationslist() ;
}
@@ -2637,17 +2651,9 @@ void Win_GParted::activate_label_filesystem()
operation ->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU );
Add_Operation( operation ) ;
-
// Try to merge this label file system operation with all previous
// operations.
- for ( unsigned int t = 0 ; t < operations .size() - 1 ; t++ )
- {
- if ( operations[t]->type == OPERATION_LABEL_FILESYSTEM )
- {
- if ( merge_two_operations( t, operations.size() - 1 ) )
- break;
- }
- }
+ merge_operations( MERGE_LAST_WITH_ANY );
show_operationslist() ;
}
@@ -2676,17 +2682,9 @@ void Win_GParted::activate_name_partition()
operation->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU );
Add_Operation( operation );
-
// Try to merge this name partition operation with all previous
// operations.
- for ( unsigned int t = 0 ; t < operations.size() - 1 ; t++ )
- {
- if ( operations[t]->type == OPERATION_NAME_PARTITION )
- {
- if( merge_two_operations( t, operations.size() - 1 ) )
- break;
- }
- }
+ merge_operations( MERGE_LAST_WITH_ANY );
show_operationslist();
}
@@ -2734,16 +2732,8 @@ void Win_GParted::activate_change_uuid()
operation ->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU );
Add_Operation( operation ) ;
-
// Try to merge this change UUID operation with all previous operations.
- for ( unsigned int t = 0 ; t < operations .size() - 1 ; t++ )
- {
- if ( operations[ t ] ->type == OPERATION_CHANGE_UUID )
- {
- if( merge_two_operations( t, operations .size() - 1 ) )
- break;
- }
- }
+ merge_operations( MERGE_LAST_WITH_ANY );
show_operationslist() ;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]