[gparted] modern-gtk2: Use Cairo for drawing the partition visualizer (!17)



commit 2fad30960135a6771248644095a2e5e032f1e4cc
Author: Luca Bacci <luca bacci982 gmail com>
Date:   Thu Aug 2 19:49:46 2018 +0200

    modern-gtk2: Use Cairo for drawing the partition visualizer (!17)
    
    Third commit in a series to convert Gdk::GC based drawing to Cairo based
    drawing.  This specific commit makes the transition for the graphical
    partition visualizer widget that is used in the main application window.
    
    Closed !17 - Gtk2 modernisation

 include/DrawingAreaVisualDisk.h |  13 ++--
 src/DrawingAreaVisualDisk.cc    | 148 +++++++++++++++++-----------------------
 2 files changed, 70 insertions(+), 91 deletions(-)
---
diff --git a/include/DrawingAreaVisualDisk.h b/include/DrawingAreaVisualDisk.h
index 7f8c34fe..d7f6ee49 100644
--- a/include/DrawingAreaVisualDisk.h
+++ b/include/DrawingAreaVisualDisk.h
@@ -53,18 +53,18 @@ private:
        void calc_position_and_height( std::vector<visual_partition> & visual_partitions, int start, int 
border ) ;
        void calc_usage( std::vector<visual_partition> & visual_partitions ) ;
        void calc_text( std::vector<visual_partition> & visual_partitions ) ;
-       
-       void draw_partition( const visual_partition & vp ) ;
-       void draw_partitions( const std::vector<visual_partition> & visual_partitions ) ;
-       
+
+       void draw_partition(const Cairo::RefPtr<Cairo::Context>& cr,
+                           const visual_partition& vp);
+       void draw_partitions(const Cairo::RefPtr<Cairo::Context>& cr,
+                            const std::vector<visual_partition>& visual_partitions);
+
        void set_selected( const std::vector<visual_partition> & visual_partitions, int x, int y ) ;
        void set_selected( const std::vector<visual_partition> & visual_partitions, const Partition * 
partition_ptr );
 
        int spreadout_leftover_px( std::vector<visual_partition> & visual_partitions, int pixels ) ;
-       void free_colors( std::vector<visual_partition> & visual_partitions ) ;
        
        //overridden signalhandlers
-       void on_realize() ;
        bool on_expose_event( GdkEventExpose * event ) ;
        bool on_button_press_event( GdkEventButton * event ) ;
        void on_size_allocate( Gtk::Allocation & allocation ) ;
@@ -115,7 +115,6 @@ private:
        const visual_partition * selected_vp ;
        int TOT_SEP, MIN_SIZE ;
 
-       Glib::RefPtr<Gdk::GC> gc;
        Gdk::Color color_used, color_unused, color_unallocated, color_text;
 };
 
diff --git a/src/DrawingAreaVisualDisk.cc b/src/DrawingAreaVisualDisk.cc
index b5f5cc0b..ff4f68dd 100644
--- a/src/DrawingAreaVisualDisk.cc
+++ b/src/DrawingAreaVisualDisk.cc
@@ -21,6 +21,8 @@
 #include "PartitionVector.h"
 #include "Utils.h"
 
+#include <gdkmm/general.h>
+
 #define MAIN_BORDER 5
 #define BORDER 4
 #define SEP 4
@@ -33,19 +35,11 @@ DrawingAreaVisualDisk::DrawingAreaVisualDisk()
 {
        selected_vp = NULL ;
 
-       //set and allocated some standard colors
+       // Set some standard colors
        color_used .set( Utils::get_color( GParted::FS_USED ) );
-       get_colormap() ->alloc_color( color_used ) ;
-       
        color_unused .set( Utils::get_color( GParted::FS_UNUSED ) );
-       get_colormap() ->alloc_color( color_unused ) ;
-       
        color_unallocated .set( Utils::get_color( GParted::FS_UNALLOCATED ) );
-       get_colormap() ->alloc_color( color_unallocated ) ;
-
        color_text .set( "black" );
-       get_colormap() ->alloc_color( color_text ) ;
-
        add_events( Gdk::BUTTON_PRESS_MASK );
        
        set_size_request( -1, HEIGHT ) ;
@@ -71,7 +65,6 @@ void DrawingAreaVisualDisk::set_selected( const Partition * partition_ptr )
 
 void DrawingAreaVisualDisk::clear()
 {
-       free_colors( visual_partitions ) ;
        visual_partitions .clear() ;
        selected_vp = NULL ;
        
@@ -102,7 +95,6 @@ void DrawingAreaVisualDisk::set_static_data( const PartitionVector & partitions,
 
                Glib::ustring color_str = Utils::get_color( 
partitions[t].get_filesystem_partition().filesystem );
                visual_partitions.back().color.set( color_str );
-               get_colormap() ->alloc_color( visual_partitions .back() .color );
 
                if ( partitions[ t ] .type == GParted::TYPE_EXTENDED )
                        set_static_data( partitions[t].logicals,
@@ -224,72 +216,70 @@ void DrawingAreaVisualDisk::calc_text( std::vector<visual_partition> & visual_pa
        }
 }
 
-void DrawingAreaVisualDisk::draw_partition( const visual_partition & vp ) 
+
+void DrawingAreaVisualDisk::draw_partition(const Cairo::RefPtr<Cairo::Context>& cr,
+                                           const visual_partition& vp)
 {
        //partition...
-       gc ->set_foreground( vp .color );
-       get_window() ->draw_rectangle( gc, 
-                                      true,
-                                      vp .x_start,
-                                      vp .y_start,
-                                      vp .length,
-                                      vp .height );
-                       
+       Gdk::Cairo::set_source_color(cr, vp.color);
+       cr->rectangle(vp.x_start,
+                     vp.y_start,
+                     vp.length,
+                     vp.height);
+       cr->fill();
+
        //used..
        if ( vp .used_length > 0 )
        {
-               gc ->set_foreground( color_used );
-               get_window() ->draw_rectangle( gc,
-                                              true,
-                                              vp .x_used_start, 
-                                              vp .y_usage_start,
-                                              vp .used_length,
-                                              vp .usage_height );
+               Gdk::Cairo::set_source_color(cr, color_used);
+               cr->rectangle(vp.x_used_start,
+                             vp.y_usage_start,
+                             vp.used_length,
+                             vp.usage_height);
+               cr->fill();
        }
                
        //unused
        if ( vp .unused_length > 0 )
        {
-               gc ->set_foreground( color_unused );
-               get_window() ->draw_rectangle( gc,
-                                              true,
-                                              vp .x_unused_start, 
-                                              vp .y_usage_start,
-                                              vp .unused_length,
-                                              vp .usage_height );
+               Gdk::Cairo::set_source_color(cr, color_unused);
+               cr->rectangle(vp.x_unused_start,
+                             vp.y_usage_start,
+                             vp.unused_length,
+                             vp.usage_height);
+               cr->fill();
        }
 
        //unallocated
        if ( vp .unallocated_length > 0 )
        {
-               gc ->set_foreground( color_unallocated );
-               get_window() ->draw_rectangle( gc,
-                                              true,
-                                              vp .x_unallocated_start,
-                                              vp .y_usage_start,
-                                              vp .unallocated_length,
-                                              vp .usage_height );
+               Gdk::Cairo::set_source_color(cr, color_unallocated);
+               cr->rectangle(vp.x_unallocated_start,
+                             vp.y_usage_start,
+                             vp.unallocated_length,
+                             vp.usage_height);
+               cr->fill();
        }
 
        //text
        if ( vp .x_text > 0 )
        {
-               gc ->set_foreground( color_text );
-               get_window() ->draw_layout( gc,
-                                           vp .x_text,
-                                           vp .y_text,
-                                           vp .pango_layout ) ;
+               Gdk::Cairo::set_source_color(cr, color_text);
+               cr->move_to(vp.x_text, vp.y_text);
+               vp.pango_layout->show_in_cairo_context(cr);
        }
 }
 
-void DrawingAreaVisualDisk::draw_partitions( const std::vector<visual_partition> & visual_partitions ) 
+
+void DrawingAreaVisualDisk::draw_partitions(const Cairo::RefPtr<Cairo::Context>& cr,
+                                            const std::vector<visual_partition>& visual_partitions)
 {
        for ( unsigned int t = 0 ; t < visual_partitions .size() ; t++ )
        {
-               draw_partition( visual_partitions[ t ] ) ;
+               draw_partition(cr, visual_partitions[t]);
 
                if ( visual_partitions[ t ] .logicals .size() > 0 )
-                       draw_partitions( visual_partitions[ t ] .logicals ) ;
+                       draw_partitions(cr, visual_partitions[t].logicals);
        }
 }
 
@@ -324,33 +314,39 @@ void DrawingAreaVisualDisk::set_selected( const std::vector<visual_partition> &
        }
 }
 
-void DrawingAreaVisualDisk::on_realize()
-{
-       Gtk::DrawingArea::on_realize() ;
 
-       gc = Gdk::GC::create( get_window() );
-       gc ->set_line_attributes( 2,
-                                 Gdk::LINE_ON_OFF_DASH,
-                                 Gdk::CAP_BUTT,
-                                 Gdk::JOIN_MITER ) ;
-}
-       
 bool DrawingAreaVisualDisk::on_expose_event( GdkEventExpose * event )
 {
        bool ret_val = Gtk::DrawingArea::on_expose_event( event ) ;
        
-       draw_partitions( visual_partitions ) ;
-        
+       Glib::RefPtr<Gdk::Window> window = get_window();
+       if (!window)
+               return true;
+
+       Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context();
+
+       // Clip to the area indicated by the expose event so that we only redraw
+       // the portion of the window that needs to be redrawn.
+       cr->rectangle(event->area.x, event->area.y,
+                     event->area.width, event->area.height);
+       cr->clip();
+
+       cr->set_line_width(2.0);
+       cr->set_line_join(Cairo::LINE_JOIN_MITER);  // default
+       cr->set_line_cap(Cairo::LINE_CAP_BUTT);     // default
+       cr->set_dash(std::vector<double>(1, 4.0), 0.0);
+
+       draw_partitions(cr, 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 ) ;
+               Gdk::Cairo::set_source_color(cr, color_used);
+               cr->rectangle(selected_vp->x_start + BORDER/2,
+                             selected_vp->y_start + BORDER/2,
+                             selected_vp->length - BORDER,
+                             selected_vp->height - BORDER);
+               cr->stroke();
        }
 
        return ret_val ;
@@ -441,26 +437,10 @@ int DrawingAreaVisualDisk::spreadout_leftover_px( std::vector<visual_partition>
        return pixels ;
 }
 
-void DrawingAreaVisualDisk::free_colors( std::vector<visual_partition> & visual_partitions ) 
-{
-       for ( unsigned int t = 0 ; t < visual_partitions .size() ; t++ )
-       {
-               get_colormap() ->free_color( visual_partitions[ t ] .color ) ;
-
-               if ( visual_partitions[ t ] .logicals .size() > 0 )
-                       free_colors( visual_partitions[ t ] .logicals ) ;
-       }
-}
 
 DrawingAreaVisualDisk::~DrawingAreaVisualDisk()
 {
        clear() ;
-
-       //free the allocated colors
-       get_colormap() ->free_color( color_used ) ;
-       get_colormap() ->free_color( color_unused ) ;
-       get_colormap() ->free_color( color_unallocated ) ;
-       get_colormap() ->free_color( color_text ) ;
 }
 
 } //GParted


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