[gtkmm-documentation] others/cellrenderercustom examples: Override gtkmm-4 vfuncs



commit 8855c12305314d69c7bea66f4c1f4e10dc591d46
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date:   Sun Feb 5 17:00:48 2017 +0100

    others/cellrenderercustom examples: Override gtkmm-4 vfuncs
    
    * examples/others/cellrenderercustom/cellrendererpopup.[cc|h]: Override
    get_preferred_width_[for_height]_func() instead of get_size_vfunc().
    * examples/others/cellrenderercustom/cellrenderertoggle.cc:
    Override get_preferred_width_[for_height]_func() and
    get_preferred_height_[for_width]_func() instead of get_size_vfunc().
    Override snapshot_vfunc() instead of render_vfunc().
    Test property_active_ in snapshot_vfunc().

 .../others/cellrenderercustom/cellrendererpopup.cc |   31 ++++--
 .../others/cellrenderercustom/cellrendererpopup.h  |   12 +--
 .../cellrenderercustom/cellrenderertoggle.cc       |  101 ++++++++++---------
 3 files changed, 77 insertions(+), 67 deletions(-)
---
diff --git a/examples/others/cellrenderercustom/cellrendererpopup.cc 
b/examples/others/cellrenderercustom/cellrendererpopup.cc
index 606c7c9..ca1054b 100644
--- a/examples/others/cellrenderercustom/cellrendererpopup.cc
+++ b/examples/others/cellrenderercustom/cellrendererpopup.cc
@@ -98,23 +98,32 @@ void CellRendererPopup::hide_popup()
   signal_hide_popup_();
 }
 
-//TODO: Port this to gtkmm 4:
-/*
-void CellRendererPopup::get_preferred_size_vfunc(Gtk::Widget& widget,
-                                       const Gdk::Rectangle* cell_area,
-                                       int* x_offset, int* y_offset,
-                                       int* width,    int* height) const
+void CellRendererPopup::get_preferred_width_vfunc(Gtk::Widget& widget,
+  int& minimum_width, int& natural_width) const
 {
-  Gtk::CellRendererText::get_preferred_size_vfunc(widget, cell_area, x_offset, y_offset, width, height);
+  Gtk::CellRendererText::get_preferred_width_vfunc(widget, minimum_width, natural_width);
 
   // We cache this because it takes a really long time to get the width.
-  if(button_width_ < 0)
+  if (button_width_ < 0)
     button_width_ = PopupEntry::get_button_width();
 
-  if(width)
-    *width += button_width_;
+  minimum_width += button_width_;
+  natural_width += button_width_;
+}
+
+void CellRendererPopup::get_preferred_width_for_height_vfunc(Gtk::Widget& widget,
+  int height, int& minimum_width, int& natural_width) const
+{
+  Gtk::CellRendererText::get_preferred_width_for_height_vfunc(
+    widget, height, minimum_width, natural_width);
+
+  // We cache this because it takes a really long time to get the width.
+  if (button_width_ < 0)
+    button_width_ = PopupEntry::get_button_width();
+
+  minimum_width += button_width_;
+  natural_width += button_width_;
 }
-*/
 
 Gtk::CellEditable* CellRendererPopup::start_editing_vfunc(GdkEvent*,
                                                           Gtk::Widget&,
diff --git a/examples/others/cellrenderercustom/cellrendererpopup.h 
b/examples/others/cellrenderercustom/cellrendererpopup.h
index 9d15c36..7c9a036 100644
--- a/examples/others/cellrenderercustom/cellrendererpopup.h
+++ b/examples/others/cellrenderercustom/cellrendererpopup.h
@@ -42,14 +42,10 @@ public:
   void hide_popup();
 
 protected:
-
-  //TODO: Port this to gtkmm 4:
-  /*
-  void get_preferred_size_vfunc(Gtk::Widget& widget,
-                              const Gdk::Rectangle* cell_area,
-                              int* x_offset, int* y_offset,
-                              int* width,    int* height) const  override;
-  */
+  void get_preferred_width_vfunc(Gtk::Widget& widget,
+    int& minimum_width, int& natural_width) const override;
+  void get_preferred_width_for_height_vfunc(Gtk::Widget& widget, int height,
+    int& minimum_width, int& natural_width) const override;
 
   Gtk::CellEditable* start_editing_vfunc(GdkEvent* event,
                                                  Gtk::Widget& widget,
diff --git a/examples/others/cellrenderercustom/cellrenderertoggle.cc 
b/examples/others/cellrenderercustom/cellrenderertoggle.cc
index 3854d1c..19ff4c5 100644
--- a/examples/others/cellrenderercustom/cellrenderertoggle.cc
+++ b/examples/others/cellrenderercustom/cellrenderertoggle.cc
@@ -20,6 +20,7 @@
  */
 
 #include <gtkmm.h>
+#include <gtkmm/snapshot.h>
 #include <sstream>
 
 // Can't have MyCellRendererToggle in an anonymous namespace, because then
@@ -42,17 +43,20 @@ public:
   SignalToggled& signal_toggled();
 
 protected:
-  //TODO: Update for gtkmm 4. This isn't currently overriding anything.
-  void get_preferred_size_vfunc(Gtk::Widget& widget,
-                              const Gdk::Rectangle* cell_area,
-                              int* x_offset, int* y_offset,
-                              int* width,    int* height) const /* override */;
-
-  void render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
-                            Gtk::Widget& widget,
-                            const Gdk::Rectangle& background_area,
-                            const Gdk::Rectangle& cell_area,
-                            Gtk::CellRendererState flag) /* override */;
+  void get_preferred_width_vfunc(Gtk::Widget& widget,
+    int& minimum_width, int& natural_width) const override;
+  void get_preferred_width_for_height_vfunc(Gtk::Widget& widget, int height,
+    int& minimum_width, int& natural_width) const override;
+  void get_preferred_height_vfunc(Gtk::Widget& widget,
+    int& minimum_height, int& natural_height) const override;
+  void get_preferred_height_for_width_vfunc(Gtk::Widget& widget, int width,
+    int& minimum_height, int& natural_height) const override;
+
+  void snapshot_vfunc(Gtk::Snapshot& snapshot,
+                      Gtk::Widget& widget,
+                      const Gdk::Rectangle& background_area,
+                      const Gdk::Rectangle& cell_area,
+                      Gtk::CellRendererState flags) override;
 
   bool activate_vfunc(GdkEvent* event,
                               Gtk::Widget& widget,
@@ -130,44 +134,39 @@ MyCellRendererToggle::SignalToggled& MyCellRendererToggle::signal_toggled()
   return signal_toggled_;
 }
 
-void MyCellRendererToggle::get_preferred_size_vfunc(Gtk::Widget&,
-                                          const Gdk::Rectangle* cell_area,
-                                          int* x_offset, int* y_offset,
-                                          int* width,    int* height) const
-{
-  enum { TOGGLE_WIDTH = 12 };
+enum { TOGGLE_WIDTH = 12 };
 
+void MyCellRendererToggle::get_preferred_width_vfunc(Gtk::Widget& /* widget */,
+  int& minimum_width, int& natural_width) const
+{
   const unsigned int xpad = property_xpad();
-  const unsigned int ypad = property_ypad();
-  const unsigned int xalign = property_xalign();
-  const unsigned int yalign = property_yalign();
-
   const int calc_width = xpad * 2 + TOGGLE_WIDTH;
-  const int calc_height = ypad * 2 + TOGGLE_WIDTH;
+  minimum_width = calc_width;
+  natural_width = calc_width;
+}
 
-  if(width)
-    *width = calc_width;
+void MyCellRendererToggle::get_preferred_width_for_height_vfunc(Gtk::Widget& widget,
+  int /* height */, int& minimum_width, int& natural_width) const
+{
+  get_preferred_width_vfunc(widget, minimum_width, natural_width);
+}
 
-  if(height)
-    *height = calc_height;
+void MyCellRendererToggle::get_preferred_height_vfunc(Gtk::Widget& /* widget */,
+  int& minimum_height, int& natural_height) const
+{
+  const unsigned int ypad = property_ypad();
+  const int calc_height = ypad * 2 + TOGGLE_WIDTH;
+  minimum_height = calc_height;
+  natural_height = calc_height;
+}
 
-  if(cell_area)
-  {
-    if(x_offset)
-    {
-      *x_offset = int(xalign * (cell_area->get_width() - calc_width));
-      *x_offset = std::max(0, *x_offset);
-    }
-
-    if(y_offset)
-    {
-      *y_offset = int(yalign * (cell_area->get_height() - calc_height));
-      *y_offset = std::max(0, *y_offset);
-    }
-  }
+void MyCellRendererToggle::get_preferred_height_for_width_vfunc(Gtk::Widget& widget,
+  int /* width */, int& minimum_height, int& natural_height) const
+{
+  get_preferred_height_vfunc(widget, minimum_height, natural_height);
 }
 
-void MyCellRendererToggle::render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
+void MyCellRendererToggle::snapshot_vfunc(Gtk::Snapshot& snapshot,
   Gtk::Widget& widget,
   const Gdk::Rectangle& /* background_area */,
   const Gdk::Rectangle& cell_area,
@@ -176,7 +175,6 @@ void MyCellRendererToggle::render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
   const unsigned int cell_xpad = property_xpad();
   const unsigned int cell_ypad = property_ypad();
 
-
   int width = 0, height = 0;
 
   //TODO: Support natural size.
@@ -193,17 +191,24 @@ void MyCellRendererToggle::render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
 
   Gtk::StateFlags state = Gtk::STATE_FLAG_INSENSITIVE;
 
-  if(property_activatable_)
+  if (property_activatable_)
     state = (Gtk::StateFlags)0;
 
-  if((flags & Gtk::CELL_RENDERER_SELECTED) != 0)
+  if ((flags & Gtk::CELL_RENDERER_SELECTED) != 0)
     state = (widget.has_focus()) ? Gtk::STATE_FLAG_SELECTED : Gtk::STATE_FLAG_ACTIVE;
 
-  widget.get_style_context()->set_state(state);
+  if (property_active_)
+    state |= Gtk::STATE_FLAG_CHECKED;
+
+  auto style_context = widget.get_style_context();
+  style_context->set_state(state);
+
+  // Create a cairo context to draw on.
+  auto cr = snapshot.append_cairo(cell_area, "MyCairoNode");
 
-  if(property_radio_)
+  if (property_radio_)
   {
-    widget.get_style_context()->render_option(
+    style_context->render_option(
       cr,
       cell_area.get_x() + cell_xpad,
       cell_area.get_y() + cell_ypad,
@@ -211,7 +216,7 @@ void MyCellRendererToggle::render_vfunc(const Cairo::RefPtr<Cairo::Context>& cr,
   }
   else
   {
-    widget.get_style_context()->render_check(
+    style_context->render_check(
       cr,
       cell_area.get_x() + cell_xpad,
       cell_area.get_y() + cell_ypad,


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