/////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011-2017 by Simon Schneegans
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////////////////////////////////////////////////////////////////
namespace GnomePie {
/////////////////////////////////////////////////////////////////////////
/// A widget showing tips. The tips are beautifully faded in and out.
/////////////////////////////////////////////////////////////////////////
public class TipViewer : Gtk.Label {
/////////////////////////////////////////////////////////////////////
/// Some settings tweaking the behavior of the TipViewer.
/////////////////////////////////////////////////////////////////////
private const double fade_time = 0.5;
private const double frame_rate = 20.0;
private const double base_delay = 3.0;
/////////////////////////////////////////////////////////////////////
/// False, if the playback of tips is stopped.
/////////////////////////////////////////////////////////////////////
private bool playing = false;
/////////////////////////////////////////////////////////////////////
/// An array containing all tips.
/////////////////////////////////////////////////////////////////////
private string[] tips;
/////////////////////////////////////////////////////////////////////
/// The index of the currently displayed tip.
/////////////////////////////////////////////////////////////////////
private int index = -1;
/////////////////////////////////////////////////////////////////////
/// The fading value.
/////////////////////////////////////////////////////////////////////
private AnimatedValue alpha;
/////////////////////////////////////////////////////////////////////
/// C'tor, initializes all members and sets the basic layout.
/////////////////////////////////////////////////////////////////////
public TipViewer(string[] tips) {
this.tips = tips;
this.alpha = new AnimatedValue.linear(0.0, 1.0, fade_time);
this.set_alignment (0.0f, 0.5f);
this.opacity = 0;
this.wrap = true;
this.valign = Gtk.Align.END;
this.set_use_markup(true);
}
/////////////////////////////////////////////////////////////////////
/// Starts the playback of tips.
/////////////////////////////////////////////////////////////////////
public void start_slide_show() {
if (!this.playing && tips.length > 1) {
this.playing = true;
show_tip();
}
}
/////////////////////////////////////////////////////////////////////
/// Stops the playback of tips.
/////////////////////////////////////////////////////////////////////
public void stop_slide_show() {
this.playing = false;
}
/////////////////////////////////////////////////////////////////////
/// Starts the fading in.
/////////////////////////////////////////////////////////////////////
private void fade_in() {
this.alpha = new AnimatedValue.linear(this.alpha.val, 1.0, fade_time);
GLib.Timeout.add((uint)(1000.0/frame_rate), () => {
this.alpha.update(1.0/frame_rate);
this.opacity = this.alpha.val;
return (this.alpha.val != 1.0);
});
}
/////////////////////////////////////////////////////////////////////
/// Starts the fading out.
/////////////////////////////////////////////////////////////////////
private void fade_out() {
this.alpha = new AnimatedValue.linear(this.alpha.val, 0.0, fade_time);
GLib.Timeout.add((uint)(1000.0/frame_rate), () => {
this.alpha.update(1.0/frame_rate);
this.opacity = this.alpha.val;
return (this.alpha.val != 0.0);
});
}
private void show_tip() {
this.set_random_tip();
this.fade_in();
uint delay = (uint)(base_delay*1000.0) + tips[this.index].length*30;
GLib.Timeout.add(delay, () => {
this.fade_out();
if (this.playing) {
GLib.Timeout.add((uint)(1000.0*fade_time), () => {
this.show_tip();
return false;
});
}
return false;
});
}
/////////////////////////////////////////////////////////////////////
/// Chooses the next random tip.
/////////////////////////////////////////////////////////////////////
private void set_random_tip() {
if (tips.length > 1) {
int next_index = -1;
do {
next_index = GLib.Random.int_range(0, tips.length);
} while (next_index == this.index);
this.index = next_index;
this.label = "" + tips[this.index] + "";
}
}
}
}