From c3c5f189ed41ea667cd18f8ffee13c3946cdabed Mon Sep 17 00:00:00 2001 From: Bart Hakvoort Date: Mon, 20 Mar 2006 10:12:55 +0000 Subject: [PATCH] fixed a few issues with selecting/activating partitions. improved support * include/DrawingAreaVisualDisk.h, src/DrawingAreaVisualDisk.cc: fixed a few issues with selecting/activating partitions. * include/Utils.h, src/Utils.cc, src/Dialog_Disklabel.cc, src/Dialog_Partition_Info.cc (mk_label): improved support for aligment. * src/Win_GParted.cc: fixed a small alignmentissue in the devices submenu. --- ChangeLog | 13 +++++ include/DrawingAreaVisualDisk.h | 10 ++-- include/Utils.h | 2 +- src/Dialog_Disklabel.cc | 2 +- src/Dialog_Partition_Info.cc | 2 +- src/DrawingAreaVisualDisk.cc | 84 +++++++++++++++------------------ src/Utils.cc | 10 ++-- src/Win_GParted.cc | 20 +++++--- 8 files changed, 75 insertions(+), 68 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b7c9859..7d931139 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-03-20 Bart Hakvoort + + * include/DrawingAreaVisualDisk.h, + src/DrawingAreaVisualDisk.cc: fixed a few issues with + selecting/activating partitions. + * include/Utils.h, + src/Utils.cc, + src/Dialog_Disklabel.cc, + src/Dialog_Partition_Info.cc (mk_label): improved support for + aligment. + * src/Win_GParted.cc: fixed a small alignmentissue in the devices + submenu. + 2006-03-19 Bart Hakvoort * include/GParted_Core.h, diff --git a/include/DrawingAreaVisualDisk.h b/include/DrawingAreaVisualDisk.h index 60d13d72..c86c2f45 100644 --- a/include/DrawingAreaVisualDisk.h +++ b/include/DrawingAreaVisualDisk.h @@ -57,8 +57,8 @@ private: void draw_partition( const visual_partition & vp ) ; void draw_partitions( const std::vector & visual_partitions ) ; - bool set_selected( std::vector & visual_partitions, int x, int y ) ; - void set_selected( std::vector & visual_partitions, const Partition & partition ) ; + void set_selected( const std::vector & visual_partitions, int x, int y ) ; + void set_selected( const std::vector & visual_partitions, const Partition & partition ) ; int spreadout_leftover_px( std::vector & visual_partitions, int pixels ) ; void free_colors( std::vector & visual_partitions ) ; @@ -82,8 +82,6 @@ private: int y_used_unused_start, used_unused_height ; int x_text, y_text ; - bool selected ; - Gdk::Color color ; Glib::RefPtr pango_layout; @@ -102,8 +100,6 @@ private: y_used_unused_start = used_unused_height = x_text = y_text = 0 ; - selected = false ; - pango_layout .clear() ; logicals .clear() ; } @@ -116,7 +112,7 @@ private: }; std::vector visual_partitions ; - visual_partition selected_vp ; + const visual_partition * selected_vp ; int TOT_SEP, MIN_SIZE ; Glib::RefPtr gc; diff --git a/include/Utils.h b/include/Utils.h index c424df87..08937990 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -114,7 +114,7 @@ public: static Sector Round( double double_value ) ; static Gtk::Label * mk_label( const Glib::ustring & text, bool use_markup = true, - bool align_left = true, + Gtk::AlignmentEnum alignment = Gtk::ALIGN_LEFT, bool wrap = false, const Glib::ustring & text_color = "black" ) ; static Glib::ustring num_to_str( Sector number, bool use_C_locale = false ) ; diff --git a/src/Dialog_Disklabel.cc b/src/Dialog_Disklabel.cc index 393c8235..65541543 100644 --- a/src/Dialog_Disklabel.cc +++ b/src/Dialog_Disklabel.cc @@ -51,7 +51,7 @@ Dialog_Disklabel::Dialog_Disklabel( const Glib::ustring & device_path, const std str_temp += "\n\n" ; str_temp += _("By default GParted creates an msdos disklabel.") ; str_temp += "\n" ; - vbox ->pack_start( * Utils::mk_label( str_temp, true, true, true ), Gtk::PACK_SHRINK ); + vbox ->pack_start( * Utils::mk_label( str_temp, true, Gtk::ALIGN_LEFT, true ), Gtk::PACK_SHRINK ); //advanced str_temp = "" ; diff --git a/src/Dialog_Partition_Info.cc b/src/Dialog_Partition_Info.cc index d0327d1e..56d658aa 100644 --- a/src/Dialog_Partition_Info.cc +++ b/src/Dialog_Partition_Info.cc @@ -49,7 +49,7 @@ Dialog_Partition_Info::Dialog_Partition_Info( const Partition & partition ) Gtk::PACK_SHRINK ) ; frame ->set_label_widget( *hbox ) ; - frame ->add( * Utils::mk_label( "" + partition.error + "", true, true, true ) ) ; + frame ->add( * Utils::mk_label( "" + partition.error + "", true, Gtk::ALIGN_LEFT, true ) ) ; this ->get_vbox() ->pack_start( *frame, Gtk::PACK_SHRINK ) ; } diff --git a/src/DrawingAreaVisualDisk.cc b/src/DrawingAreaVisualDisk.cc index 82b69fc9..c52cf478 100644 --- a/src/DrawingAreaVisualDisk.cc +++ b/src/DrawingAreaVisualDisk.cc @@ -54,6 +54,7 @@ void DrawingAreaVisualDisk::load_partitions( const std::vector & part void DrawingAreaVisualDisk::set_selected( const Partition & partition ) { + selected_vp = NULL ; set_selected( visual_partitions, partition ) ; queue_draw() ; @@ -63,6 +64,7 @@ void DrawingAreaVisualDisk::clear() { free_colors( visual_partitions ) ; visual_partitions .clear() ; + selected_vp = NULL ; queue_resize() ; } @@ -210,7 +212,7 @@ void DrawingAreaVisualDisk::draw_partition( const visual_partition & vp ) get_window() ->draw_rectangle( gc, true, vp .x_start, - vp .y_start, + vp .y_start, vp .length, vp .height ); @@ -247,18 +249,6 @@ void DrawingAreaVisualDisk::draw_partition( const visual_partition & vp ) vp .y_text, vp .pango_layout ) ; } - - //selection - if ( vp .selected ) - { - gc ->set_foreground( color_used ) ; - get_window() ->draw_rectangle( gc, - false, - vp .x_start + BORDER/2 , - vp .y_start + BORDER/2 , - vp .length - BORDER, - vp .height - BORDER ) ; - } } void DrawingAreaVisualDisk::draw_partitions( const std::vector & visual_partitions ) @@ -272,45 +262,34 @@ void DrawingAreaVisualDisk::draw_partitions( const std::vector } } -bool DrawingAreaVisualDisk::set_selected( std::vector & visual_partitions, int x, int y ) +void DrawingAreaVisualDisk::set_selected( const std::vector & visual_partitions, int x, int y ) { - bool found = false ; - - for ( unsigned int t = 0 ; t < visual_partitions .size() ; t++ ) + for ( unsigned int t = 0 ; t < visual_partitions .size() && ! selected_vp ; t++ ) { - if ( visual_partitions[ t ] .x_start <= x && + if ( visual_partitions[ t ] .logicals .size() > 0 ) + set_selected( visual_partitions[ t ] .logicals, x, y ) ; + + if ( ! selected_vp && + visual_partitions[ t ] .x_start <= x && x < visual_partitions[ t ] .x_start + visual_partitions[ t ] .length && visual_partitions[ t ] .y_start <= y && y < visual_partitions[ t ] .y_start + visual_partitions[ t ] .height ) { - visual_partitions[ t ] .selected = true ; - selected_vp = visual_partitions[ t ] ; - found = true ; + selected_vp = & visual_partitions[ t ] ; } - else - visual_partitions[ t ] .selected = false ; - - if ( visual_partitions[ t ] .logicals .size() > 0 ) - visual_partitions[ t ] .selected &= ! set_selected( visual_partitions[ t ] .logicals, x, y ) ; } - - return found ; } -void DrawingAreaVisualDisk::set_selected( std::vector & visual_partitions, const Partition & partition ) +void DrawingAreaVisualDisk::set_selected( const std::vector & visual_partitions, + const Partition & partition ) { - for ( unsigned int t = 0 ; t < visual_partitions .size() ; t++ ) + for ( unsigned int t = 0 ; t < visual_partitions .size() && ! selected_vp ; t++ ) { - if ( visual_partitions[ t ] .partition == partition ) - { - visual_partitions[ t ] .selected = true ; - selected_vp = visual_partitions[ t ] ; - } - else - visual_partitions[ t ] .selected = false ; - if ( visual_partitions[ t ] .logicals .size() > 0 ) set_selected( visual_partitions[ t ] .logicals, partition ) ; + + if ( ! selected_vp && visual_partitions[ t ] .partition == partition ) + selected_vp = & visual_partitions[ t ] ; } } @@ -330,6 +309,18 @@ bool DrawingAreaVisualDisk::on_expose_event( GdkEventExpose * event ) bool ret_val = Gtk::DrawingArea::on_expose_event( event ) ; draw_partitions( visual_partitions ) ; + + //selection + if ( selected_vp ) + { + gc ->set_foreground( color_used ) ; + get_window() ->draw_rectangle( gc, + false, + selected_vp ->x_start + BORDER/2 , + selected_vp ->y_start + BORDER/2 , + selected_vp ->length - BORDER, + selected_vp ->height - BORDER ) ; + } return ret_val ; } @@ -338,17 +329,20 @@ bool DrawingAreaVisualDisk::on_button_press_event( GdkEventButton * event ) { bool ret_val = Gtk::DrawingArea::on_button_press_event( event ) ; + selected_vp = NULL ; set_selected( visual_partitions, static_cast( event ->x ), static_cast( event ->y ) ) ; queue_draw() ; - signal_partition_selected .emit( selected_vp .partition, false ) ; - - if ( event ->type == GDK_2BUTTON_PRESS ) //FIXME: only emit the signal if a partition was selected - //right now it's possible to 'activate' a seperator. - signal_partition_activated .emit() ; - else if ( event ->button == 3 ) - signal_popup_menu .emit( event ->button, event ->time ) ; + if ( selected_vp ) + { + signal_partition_selected .emit( selected_vp ->partition, false ) ; + if ( event ->type == GDK_2BUTTON_PRESS ) + signal_partition_activated .emit() ; + else if ( event ->button == 3 ) + signal_popup_menu .emit( event ->button, event ->time ) ; + } + return ret_val ; } diff --git a/src/Utils.cc b/src/Utils.cc index 86c8523a..150030b9 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -30,13 +30,11 @@ Sector Utils::Round( double double_value ) Gtk::Label * Utils::mk_label( const Glib::ustring & text, bool use_markup, - bool align_left, + Gtk::AlignmentEnum alignment, bool wrap, const Glib::ustring & text_color ) { - Gtk::Label * label = manage( new Gtk::Label( text, - align_left ? Gtk::ALIGN_LEFT : Gtk::ALIGN_CENTER, - Gtk::ALIGN_TOP ) ) ; + Gtk::Label * label = manage( new Gtk::Label( text, alignment, Gtk::ALIGN_TOP ) ) ; label ->set_use_markup( use_markup ) ; label ->set_line_wrap( wrap ) ; @@ -44,7 +42,7 @@ Gtk::Label * Utils::mk_label( const Glib::ustring & text, if ( text_color != "black" ) { Gdk::Color color( text_color ) ; - label ->modify_fg( label ->get_state( ), color ) ; + label ->modify_fg( label ->get_state(), color ) ; } return label ; @@ -55,7 +53,7 @@ Glib::ustring Utils::num_to_str( Sector number, bool use_C_locale ) std::stringstream ss ; //ss.imbue( std::locale( use_C_locale ? "C" : "" ) ) ; see #157871 ss << number ; - return ss .str( ) ; + return ss .str() ; } //use http://developer.gnome.org/projects/gup/hig/2.0/design.html#Palette as a starting point.. diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index 550a2ed9..8774f106 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -444,20 +444,26 @@ void Win_GParted::refresh_combo_devices() treerow[ treeview_devices_columns .size ] = "(" + Utils::format_size( devices[ i ] .length ) + ")" ; //devices submenu.... - menu ->items() .push_back( Gtk::Menu_Helpers::RadioMenuElem( - radio_group, - devices[ i ] .get_path() + "\t(" + Utils::format_size( devices[ i ] .length ) + ")", - sigc::bind( sigc::mem_fun(*this, &Win_GParted::radio_devices_changed), i ) ) ) ; + hbox = manage( new Gtk::HBox() ) ; + hbox ->pack_start( * Utils::mk_label( devices[ i ] .get_path() ), Gtk::PACK_SHRINK ) ; + hbox ->pack_start( * Utils::mk_label( " (" + Utils::format_size( devices[ i ] .length ) + ")", + true, + Gtk::ALIGN_RIGHT ), + Gtk::PACK_EXPAND_WIDGET ) ; - //FIXME: the (size) needs the be rightaligned while the path should remain left-aligned - //i guess this takes 2 labels to achieve.. + menu ->items() .push_back( * manage( new Gtk::RadioMenuItem( radio_group ) ) ) ; + menu ->items() .back() .add( *hbox ) ; + menu ->items() .back() .signal_activate() .connect( + sigc::bind( sigc::mem_fun(*this, &Win_GParted::radio_devices_changed), i ) ) ; } - menubar_main .items()[ 0 ] .get_submenu() ->items()[ 1 ] .remove_submenu() ; if ( menu ->items() .size() ) + { + menu ->show_all() ; menubar_main .items()[ 0 ] .get_submenu() ->items()[ 1 ] .set_submenu( *menu ) ; + } combo_devices .set_active( current_device ) ; }