162 lines
4.6 KiB
C
162 lines
4.6 KiB
C
#include "mooedit/mooeditprogress.h"
|
|
#include "mooedit/mooeditprogress-gxml.h"
|
|
#include "mooutils/mooutils-script.h"
|
|
|
|
#define MOO_TYPE_EDIT_PROGRESS (moo_edit_progress_get_type ())
|
|
#define MOO_EDIT_PROGRESS(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_EDIT_PROGRESS, MooEditProgress))
|
|
#define MOO_EDIT_PROGRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_EDIT_PROGRESS, MooEditProgressClass))
|
|
#define MOO_IS_EDIT_PROGRESS(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_EDIT_PROGRESS))
|
|
#define MOO_IS_EDIT_PROGRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_EDIT_PROGRESS))
|
|
#define MOO_EDIT_PROGRESS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_EDIT_PROGRESS, MooEditProgressClass))
|
|
|
|
#define PROGRESS_TIMEOUT 100
|
|
#define INITIAL_TIMEOUT 500
|
|
|
|
typedef struct MooEditProgressClass MooEditProgressClass;
|
|
|
|
struct MooEditProgress
|
|
{
|
|
GtkAlignment base;
|
|
|
|
ProgressWidgetXml *xml;
|
|
|
|
guint timeout;
|
|
char *text;
|
|
GDestroyNotify cancel_op;
|
|
gpointer cancel_data;
|
|
};
|
|
|
|
struct MooEditProgressClass
|
|
{
|
|
GtkAlignmentClass base_class;
|
|
};
|
|
|
|
static void cancel_clicked (MooEditProgress *pr);
|
|
|
|
MOO_DEFINE_TYPE_STATIC (MooEditProgress, moo_edit_progress, GTK_TYPE_ALIGNMENT)
|
|
|
|
static void
|
|
moo_edit_progress_init (MooEditProgress *pr)
|
|
{
|
|
pr->xml = progress_widget_xml_new_with_root (GTK_WIDGET (pr));
|
|
g_signal_connect_swapped (pr->xml->cancel, "clicked", G_CALLBACK (cancel_clicked), pr);
|
|
}
|
|
|
|
static void
|
|
moo_edit_progress_dispose (GObject *object)
|
|
{
|
|
MooEditProgress *pr = MOO_EDIT_PROGRESS (object);
|
|
|
|
if (pr->timeout)
|
|
{
|
|
g_source_remove (pr->timeout);
|
|
pr->timeout = 0;
|
|
}
|
|
|
|
g_free (pr->text);
|
|
pr->text = NULL;
|
|
|
|
G_OBJECT_CLASS (moo_edit_progress_parent_class)->dispose (object);
|
|
}
|
|
|
|
static void
|
|
moo_edit_progress_class_init (MooEditProgressClass *klass)
|
|
{
|
|
G_OBJECT_CLASS (klass)->dispose = moo_edit_progress_dispose;
|
|
}
|
|
|
|
MooEditProgress *
|
|
_moo_edit_progress_new (void)
|
|
{
|
|
return g_object_new (MOO_TYPE_EDIT_PROGRESS, NULL);
|
|
}
|
|
|
|
static void
|
|
update_progress (MooEditProgress *progress)
|
|
{
|
|
g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress));
|
|
g_return_if_fail (progress->text != NULL);
|
|
gtk_progress_bar_set_text (progress->xml->progressbar,
|
|
progress->text);
|
|
}
|
|
|
|
void
|
|
_moo_edit_progress_set_text (MooEditProgress *progress,
|
|
const char *text)
|
|
{
|
|
char *tmp;
|
|
|
|
g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress));
|
|
|
|
tmp = progress->text;
|
|
progress->text = g_strdup (text);
|
|
g_free (tmp);
|
|
|
|
update_progress (progress);
|
|
}
|
|
|
|
static gboolean
|
|
pulse_progress (MooEditProgress *progress)
|
|
{
|
|
g_return_val_if_fail (MOO_IS_EDIT_PROGRESS (progress), FALSE);
|
|
g_return_val_if_fail (GTK_IS_WIDGET (progress->xml->progressbar), FALSE);
|
|
gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progress->xml->progressbar));
|
|
update_progress (progress);
|
|
return TRUE;
|
|
}
|
|
|
|
static void
|
|
cancel_clicked (MooEditProgress *progress)
|
|
{
|
|
g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress));
|
|
if (progress->cancel_op)
|
|
progress->cancel_op (progress->cancel_data);
|
|
}
|
|
|
|
static gboolean
|
|
show_progress (MooEditProgress *progress)
|
|
{
|
|
g_source_remove (progress->timeout);
|
|
|
|
progress->timeout =
|
|
g_timeout_add (PROGRESS_TIMEOUT,
|
|
(GSourceFunc) pulse_progress,
|
|
progress);
|
|
update_progress (progress);
|
|
|
|
gtk_widget_show (GTK_WIDGET (progress));
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void
|
|
_moo_edit_progress_set_cancel_func (MooEditProgress *progress,
|
|
GDestroyNotify cancel_func,
|
|
gpointer cancel_func_data)
|
|
{
|
|
g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress));
|
|
progress->cancel_op = cancel_func;
|
|
progress->cancel_data = cancel_func_data;
|
|
gtk_widget_set_sensitive (GTK_WIDGET (progress->xml->cancel),
|
|
cancel_func != NULL);
|
|
}
|
|
|
|
void
|
|
_moo_edit_progress_start (MooEditProgress *progress,
|
|
const char *text,
|
|
GDestroyNotify cancel_func,
|
|
gpointer cancel_func_data)
|
|
{
|
|
g_return_if_fail (MOO_IS_EDIT_PROGRESS (progress));
|
|
g_return_if_fail (progress->timeout == 0);
|
|
|
|
progress->text = g_strdup (text);
|
|
|
|
_moo_edit_progress_set_cancel_func (progress, cancel_func, cancel_func_data);
|
|
|
|
progress->timeout =
|
|
g_timeout_add (INITIAL_TIMEOUT,
|
|
(GSourceFunc) show_progress,
|
|
progress);
|
|
}
|