[gtkmm-documentation] others/cellrenderercustom examples: Override gtkmm-4 vfuncs
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm-documentation] others/cellrenderercustom examples: Override gtkmm-4 vfuncs
- Date: Sun, 5 Feb 2017 16:03:52 +0000 (UTC)
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]