#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <cairomm/pattern.h>
-#include <gtkmm/drawingarea.h>
-#include <gdkmm/pixbuf.h>
+#include "gtkmm2ext/cairo_widget.h"
+
+#include "gtkmm2ext/visibility.h"
namespace Gtkmm2ext {
-class FastMeter : public Gtk::DrawingArea {
+class LIBGTKMM2EXT_API FastMeter : public CairoWidget {
public:
enum Orientation {
Horizontal,
int styleflags = 3
);
virtual ~FastMeter ();
+ static void flush_pattern_cache();
void set (float level, float peak = -1);
void clear ();
bool get_highlight () { return highlight; }
protected:
- bool on_expose_event (GdkEventExpose*);
+ void render (cairo_t *, cairo_rectangle_t*);
void on_size_request (GtkRequisition*);
void on_size_allocate (Gtk::Allocation&);
-
private:
Cairo::RefPtr<Cairo::Pattern> fgpattern;
float current_user_level;
bool highlight;
- bool vertical_expose (GdkEventExpose*);
+ void vertical_expose (cairo_t*, cairo_rectangle_t*);
+ void vertical_size_request (GtkRequisition*);
+ void vertical_size_allocate (Gtk::Allocation&);
void queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>&, float);
+ void horizontal_expose (cairo_t*, cairo_rectangle_t*);
+ void horizontal_size_request (GtkRequisition*);
+ void horizontal_size_allocate (Gtk::Allocation&);
+ void queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>&, float);
+
static bool no_rgba_overlay;
static Cairo::RefPtr<Cairo::Pattern> generate_meter_pattern (
- int, int, int *, float *, int);
+ int, int, int *, float *, int, bool);
static Cairo::RefPtr<Cairo::Pattern> request_vertical_meter (
int, int, int *, float *, int);
+ static Cairo::RefPtr<Cairo::Pattern> request_horizontal_meter (
+ int, int, int *, float *, int);
static Cairo::RefPtr<Cairo::Pattern> generate_meter_background (
- int, int, int *, bool);
+ int, int, int *, bool, bool);
static Cairo::RefPtr<Cairo::Pattern> request_vertical_background (
int, int, int *, bool);
+ static Cairo::RefPtr<Cairo::Pattern> request_horizontal_background (
+ int, int, int *, bool);
struct Pattern10MapKey {
Pattern10MapKey (
typedef std::map<Pattern10MapKey, Cairo::RefPtr<Cairo::Pattern> > Pattern10Map;
struct PatternBgMapKey {
- PatternBgMapKey (int w, int h, int c0, int c1)
+ PatternBgMapKey (int w, int h, int c0, int c1, bool shade)
: dim(w, h)
, cols(c0, c1)
+ , sh(shade)
{}
inline bool operator<(const PatternBgMapKey& rhs) const {
- return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols);
+ return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols) || (dim == rhs.dim && cols == rhs.cols && (sh && !rhs.sh));
}
boost::tuple<int, int> dim;
boost::tuple<int, int> cols;
+ bool sh;
};
typedef std::map<PatternBgMapKey, Cairo::RefPtr<Cairo::Pattern> > PatternBgMap;
static Pattern10Map vm_pattern_cache;
static PatternBgMap vb_pattern_cache;
+ static Pattern10Map hm_pattern_cache;
+ static PatternBgMap hb_pattern_cache;
static int min_pattern_metric_size; // min dimension for axis that displays the meter level
static int max_pattern_metric_size; // max dimension for axis that displays the meter level
};