Merge pull request #89 from gergelypolonkai/gtk-icon-view
Move chart list from GdMainView to GtkIconView
This commit is contained in:
commit
39e58c7156
4
.gitignore
vendored
4
.gitignore
vendored
@ -40,8 +40,8 @@ Makefile.in
|
||||
/data/astrognome.desktop.in
|
||||
|
||||
# Generated files
|
||||
/src/ag-resources.c
|
||||
/src/ag-resources.h
|
||||
/src/ag-resources.[ch]
|
||||
/src/ag-enumtypes.[ch]
|
||||
|
||||
# Geonames related things
|
||||
/data/geonames/*.txt
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
||||
[submodule "libgd"]
|
||||
path = libgd
|
||||
url = git://git.gnome.org/libgd.git
|
@ -1,5 +1,5 @@
|
||||
ACLOCAL_AMFLAGS = -I m4 -I libgd ${ACLOCAL_FLAGS}
|
||||
SUBDIRS = libgd src po data help
|
||||
SUBDIRS = src po data help
|
||||
|
||||
EXTRA_DIST = config.rpath ChangeLog
|
||||
|
||||
|
@ -40,14 +40,10 @@ PKG_CHECK_MODULES([GDA], [libgda-5.0 libgda-sqlite-5.0])
|
||||
PKG_CHECK_MODULES([PIXBUF], [gdk-pixbuf-2.0])
|
||||
PKG_CHECK_MODULES([RSVG], [librsvg-2.0])
|
||||
PKG_CHECK_MODULES([SWE_GLIB], [swe-glib >= 2.1.0])
|
||||
|
||||
LIBGD_INIT([
|
||||
main-view
|
||||
])
|
||||
PKG_CHECK_MODULES([CAIRO], [cairo]);
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
libgd/Makefile
|
||||
src/Makefile
|
||||
help/Makefile
|
||||
po/Makefile.in
|
||||
|
@ -1,15 +1,27 @@
|
||||
RESOURCE_DIR = $(srcdir)/resources
|
||||
resource_files = $(shell glib-compile-resources --sourcedir=$(RESOURCE_DIR) --generate-dependencies $(srcdir)/ag.gresource.xml)
|
||||
|
||||
ag_enum_headers = ag-icon-view.h
|
||||
|
||||
ag-resources.c: ag.gresource.xml $(resource_files)
|
||||
glib-compile-resources --target=$@ --sourcedir=$(RESOURCE_DIR) --generate-source --c-name ag $(srcdir)/ag.gresource.xml
|
||||
|
||||
ag-resources.h: ag.gresource.xml $(resource_files)
|
||||
glib-compile-resources --target=$@ --sourcedir=$(RESOURCE_DIR) --generate-header --c-name ag $(srcdir)/ag.gresource.xml
|
||||
|
||||
ag-enumtypes.h: $(ag_enum_headers) ag-enumtypes.h.template
|
||||
$(GLIB_MKENUMS) --template $(filter %.template,$^) $(filter-out %.template,$^) > \
|
||||
ag-enumtypes.h.tmp && mv ag-enumtypes.h.tmp ag-enumtypes.h
|
||||
|
||||
ag-enumtypes.c: $(ag_enum_headers) ag-enumtypes.c.template
|
||||
$(GLIB_MKENUMS) --template $(filter %.template,$^) $(filter-out %.template,$^) > \
|
||||
ag-enumtypes.c.tmp && mv ag-enumtypes.c.tmp ag-enumtypes.c
|
||||
|
||||
BUILT_SOURCES = \
|
||||
ag-resources.h \
|
||||
ag-resources.c \
|
||||
ag-enumtypes.h \
|
||||
ag-enumtypes.c \
|
||||
$(NULL)
|
||||
|
||||
astrognome_source_files = \
|
||||
@ -20,6 +32,8 @@ astrognome_source_files = \
|
||||
ag-preferences.c \
|
||||
ag-db.c \
|
||||
ag-display-theme.c \
|
||||
ag-icon-view.c \
|
||||
ag-chart-renderer.c \
|
||||
astrognome.c \
|
||||
$(NULL)
|
||||
|
||||
@ -28,13 +42,13 @@ EXTRA_DIST = \
|
||||
ag.gresource.xml \
|
||||
$(NULL)
|
||||
|
||||
AM_CPPFLAGS = -DG_LOG_DOMAIN=\"Astrognome\" -DLOCALEDIR=\"$(localedir)\" -DPKGDATADIR=\"$(pkgdatadir)\" -I$(top_srcdir)/libgd
|
||||
AM_CPPFLAGS = -DG_LOG_DOMAIN=\"Astrognome\" -DLOCALEDIR=\"$(localedir)\" -DPKGDATADIR=\"$(pkgdatadir)\"
|
||||
bin_PROGRAMS = astrognome
|
||||
|
||||
astrognome_SOURCES = $(astrognome_source_files) $(BUILT_SOURCES)
|
||||
astrognome_LDADD = $(SWE_GLIB_LIBS) $(GTK_LIBS) $(LIBXML_LIBS) $(LIBXSLT_LIBS) $(WEBKIT_LIBS) $(GDA_LIBS) $(PIXBUF_LIBS) $(RSVG_LIBS) $(top_builddir)/libgd/libgd.la
|
||||
astrognome_LDADD = $(SWE_GLIB_LIBS) $(GTK_LIBS) $(LIBXML_LIBS) $(LIBXSLT_LIBS) $(WEBKIT_LIBS) $(GDA_LIBS) $(PIXBUF_LIBS) $(RSVG_LIBS) $(CAIRO_LIBS)
|
||||
astrognome_LDFLAGS = -rdynamic
|
||||
astrognome_CFLAGS = $(SWE_GLIB_CFLAGS) $(CFLAGS) $(GTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) $(WEBKIT_CFLAGS) $(GDA_CFLAGS) $(PIXBUF_CFLAGS) $(RSVG_CFLAGS) -Wall
|
||||
astrognome_CFLAGS = $(SWE_GLIB_CFLAGS) $(CFLAGS) $(GTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) $(WEBKIT_CFLAGS) $(GDA_CFLAGS) $(PIXBUF_CFLAGS) $(RSVG_CFLAGS) $(CAIRO_CFLAGS) -Wall
|
||||
|
||||
# The following two lines generate a .dir-locals.el file, so
|
||||
# company-mode won’t die due to unknown includes
|
||||
|
396
src/ag-chart-renderer.c
Normal file
396
src/ag-chart-renderer.c
Normal file
@ -0,0 +1,396 @@
|
||||
#include <cairo.h>
|
||||
|
||||
#include "ag-chart-renderer.h"
|
||||
|
||||
typedef struct {
|
||||
gchar *css_class;
|
||||
gboolean checked;
|
||||
gboolean toggle_visible;
|
||||
} AgChartRendererPrivate;
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
AG_CHART_RENDERER_PROP_CSS_CLASS,
|
||||
AG_CHART_RENDERER_PROP_CHECKED,
|
||||
AG_CHART_RENDERER_PROP_TOGGLE_VISIBLE,
|
||||
};
|
||||
|
||||
static void ag_chart_renderer_dispose(GObject *gobject);
|
||||
static void ag_chart_renderer_finalize(GObject *gobject);
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE(
|
||||
AgChartRenderer,
|
||||
ag_chart_renderer,
|
||||
GTK_TYPE_CELL_RENDERER_PIXBUF
|
||||
);
|
||||
|
||||
static void
|
||||
ag_chart_renderer_render(GtkCellRenderer *renderer,
|
||||
cairo_t *cr,
|
||||
GtkWidget *widget,
|
||||
const GdkRectangle *background_area,
|
||||
const GdkRectangle *cell_area,
|
||||
GtkCellRendererState flags)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
AG_CHART_RENDERER(renderer)
|
||||
);
|
||||
int margin;
|
||||
GtkStyleContext *context = gtk_widget_get_style_context(widget);
|
||||
GdkPixbuf *pixbuf;
|
||||
|
||||
gtk_style_context_save(context);
|
||||
gtk_style_context_add_class(context, "ag-chart-renderer");
|
||||
|
||||
if (priv->css_class) {
|
||||
gtk_style_context_add_class(context, priv->css_class);
|
||||
}
|
||||
|
||||
cairo_save(cr);
|
||||
gdk_cairo_rectangle(cr, cell_area);
|
||||
cairo_clip(cr);
|
||||
|
||||
cairo_translate(cr, cell_area->x, cell_area->y);
|
||||
|
||||
margin = MAX(
|
||||
AG_CHART_RENDERER_TILE_MARGIN,
|
||||
(int)((cell_area->width - AG_CHART_RENDERER_TILE_SIZE) / 2)
|
||||
);
|
||||
|
||||
g_object_get(renderer, "pixbuf", &pixbuf, NULL);
|
||||
|
||||
if (pixbuf != NULL) {
|
||||
GdkRectangle area = {
|
||||
margin,
|
||||
margin,
|
||||
AG_CHART_RENDERER_TILE_SIZE,
|
||||
AG_CHART_RENDERER_TILE_SIZE
|
||||
};
|
||||
|
||||
GTK_CELL_RENDERER_CLASS(ag_chart_renderer_parent_class)->render(
|
||||
renderer,
|
||||
cr,
|
||||
widget,
|
||||
&area,
|
||||
&area,
|
||||
flags
|
||||
);
|
||||
} else {
|
||||
gtk_render_frame(
|
||||
context,
|
||||
cr,
|
||||
margin,
|
||||
margin,
|
||||
AG_CHART_RENDERER_TILE_SIZE,
|
||||
AG_CHART_RENDERER_TILE_SIZE
|
||||
);
|
||||
gtk_render_background(
|
||||
context,
|
||||
cr,
|
||||
margin,
|
||||
margin,
|
||||
AG_CHART_RENDERER_TILE_SIZE,
|
||||
AG_CHART_RENDERER_TILE_SIZE
|
||||
);
|
||||
}
|
||||
|
||||
gtk_style_context_restore(context);
|
||||
|
||||
if (priv->toggle_visible) {
|
||||
gint xpad,
|
||||
ypad,
|
||||
x_offset,
|
||||
check_x,
|
||||
check_y;
|
||||
|
||||
gtk_cell_renderer_get_padding(
|
||||
GTK_CELL_RENDERER(renderer),
|
||||
&xpad, &ypad
|
||||
);
|
||||
|
||||
if (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL) {
|
||||
x_offset = xpad;
|
||||
} else {
|
||||
x_offset = cell_area->width
|
||||
- AG_CHART_RENDERER_CHECK_ICON_SIZE
|
||||
- xpad;
|
||||
}
|
||||
|
||||
check_x = x_offset;
|
||||
check_y = cell_area->height - AG_CHART_RENDERER_CHECK_ICON_SIZE - ypad;
|
||||
|
||||
gtk_style_context_save(context);
|
||||
gtk_style_context_add_class(context, GTK_STYLE_CLASS_CHECK);
|
||||
|
||||
if (priv->checked) {
|
||||
gtk_style_context_set_state(context, GTK_STATE_FLAG_CHECKED);
|
||||
}
|
||||
|
||||
gtk_render_background(
|
||||
context,
|
||||
cr,
|
||||
check_x,
|
||||
check_y,
|
||||
AG_CHART_RENDERER_CHECK_ICON_SIZE,
|
||||
AG_CHART_RENDERER_CHECK_ICON_SIZE
|
||||
);
|
||||
gtk_render_frame(
|
||||
context,
|
||||
cr,
|
||||
check_x,
|
||||
check_y,
|
||||
AG_CHART_RENDERER_CHECK_ICON_SIZE,
|
||||
AG_CHART_RENDERER_CHECK_ICON_SIZE
|
||||
);
|
||||
gtk_render_check(
|
||||
context,
|
||||
cr,
|
||||
check_x,
|
||||
check_y,
|
||||
AG_CHART_RENDERER_CHECK_ICON_SIZE,
|
||||
AG_CHART_RENDERER_CHECK_ICON_SIZE
|
||||
);
|
||||
|
||||
gtk_style_context_restore(context);
|
||||
}
|
||||
|
||||
cairo_restore(cr);
|
||||
}
|
||||
|
||||
void
|
||||
ag_chart_renderer_set_css_class(AgChartRenderer *chart_renderer,
|
||||
const gchar *css_class)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
g_free(priv->css_class);
|
||||
priv->css_class = g_strdup(css_class);
|
||||
}
|
||||
|
||||
const gchar *
|
||||
ag_chart_renderer_get_css_class(AgChartRenderer *chart_renderer)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
return priv->css_class;
|
||||
}
|
||||
|
||||
void
|
||||
ag_chart_renderer_set_checked(AgChartRenderer *chart_renderer, gboolean checked)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
priv->checked = checked;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ag_chart_renderer_get_checked(AgChartRenderer *chart_renderer)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
return priv->checked;
|
||||
}
|
||||
|
||||
void
|
||||
ag_chart_renderer_set_toggle_visible(AgChartRenderer *chart_renderer,
|
||||
gboolean toggle_visible)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
priv->toggle_visible = toggle_visible;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ag_chart_renderer_get_toggle_visible(AgChartRenderer *chart_renderer)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
return priv->toggle_visible;
|
||||
}
|
||||
|
||||
static void
|
||||
ag_chart_renderer_get_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
AgChartRenderer *chart_renderer = AG_CHART_RENDERER(gobject);
|
||||
|
||||
switch (prop_id) {
|
||||
case AG_CHART_RENDERER_PROP_CSS_CLASS:
|
||||
g_value_set_string(
|
||||
value,
|
||||
ag_chart_renderer_get_css_class(chart_renderer)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case AG_CHART_RENDERER_PROP_CHECKED:
|
||||
g_value_set_boolean(
|
||||
value,
|
||||
ag_chart_renderer_get_checked(chart_renderer)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case AG_CHART_RENDERER_PROP_TOGGLE_VISIBLE:
|
||||
g_value_set_boolean(
|
||||
value,
|
||||
ag_chart_renderer_get_toggle_visible(chart_renderer)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_chart_renderer_set_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
AgChartRenderer *chart_renderer = AG_CHART_RENDERER(gobject);
|
||||
|
||||
switch (prop_id) {
|
||||
case AG_CHART_RENDERER_PROP_CSS_CLASS:
|
||||
ag_chart_renderer_set_css_class(
|
||||
chart_renderer,
|
||||
g_value_get_string(value)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case AG_CHART_RENDERER_PROP_CHECKED:
|
||||
ag_chart_renderer_set_checked(
|
||||
chart_renderer,
|
||||
g_value_get_boolean(value)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case AG_CHART_RENDERER_PROP_TOGGLE_VISIBLE:
|
||||
ag_chart_renderer_set_toggle_visible(
|
||||
chart_renderer,
|
||||
g_value_get_boolean(value)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_chart_renderer_class_init(AgChartRendererClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = (GObjectClass *)klass;
|
||||
GtkCellRendererClass *cell_renderer_class = (GtkCellRendererClass *)klass;
|
||||
|
||||
gobject_class->dispose = ag_chart_renderer_dispose;
|
||||
gobject_class->finalize = ag_chart_renderer_finalize;
|
||||
gobject_class->set_property = ag_chart_renderer_set_property;
|
||||
gobject_class->get_property = ag_chart_renderer_get_property;
|
||||
cell_renderer_class->render = ag_chart_renderer_render;
|
||||
|
||||
g_object_class_install_property(
|
||||
G_OBJECT_CLASS(klass),
|
||||
AG_CHART_RENDERER_PROP_CSS_CLASS,
|
||||
g_param_spec_string(
|
||||
"css-class",
|
||||
"css-class",
|
||||
"CSS Class",
|
||||
NULL,
|
||||
G_PARAM_STATIC_NAME
|
||||
| G_PARAM_STATIC_NICK
|
||||
| G_PARAM_STATIC_BLURB
|
||||
| G_PARAM_READABLE
|
||||
| G_PARAM_WRITABLE
|
||||
)
|
||||
);
|
||||
|
||||
g_object_class_install_property(
|
||||
G_OBJECT_CLASS(klass),
|
||||
AG_CHART_RENDERER_PROP_CHECKED,
|
||||
g_param_spec_boolean(
|
||||
"checked",
|
||||
"checked",
|
||||
"Checked",
|
||||
FALSE,
|
||||
G_PARAM_STATIC_NAME
|
||||
| G_PARAM_STATIC_NICK
|
||||
| G_PARAM_STATIC_BLURB
|
||||
| G_PARAM_READABLE
|
||||
| G_PARAM_WRITABLE
|
||||
)
|
||||
);
|
||||
|
||||
g_object_class_install_property(
|
||||
G_OBJECT_CLASS(klass),
|
||||
AG_CHART_RENDERER_PROP_TOGGLE_VISIBLE,
|
||||
g_param_spec_boolean(
|
||||
"toggle-visible",
|
||||
"toggle-visible",
|
||||
"Toggle visible",
|
||||
FALSE,
|
||||
G_PARAM_STATIC_NAME
|
||||
| G_PARAM_STATIC_NICK
|
||||
| G_PARAM_STATIC_BLURB
|
||||
| G_PARAM_READABLE
|
||||
| G_PARAM_WRITABLE
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_chart_renderer_init(AgChartRenderer *chart_renderer)
|
||||
{
|
||||
AgChartRendererPrivate *priv = ag_chart_renderer_get_instance_private(
|
||||
chart_renderer
|
||||
);
|
||||
|
||||
priv->checked = FALSE;
|
||||
priv->toggle_visible = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
ag_chart_renderer_dispose(GObject *gobject)
|
||||
{
|
||||
G_OBJECT_CLASS(ag_chart_renderer_parent_class)->dispose(gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_chart_renderer_finalize (GObject *gobject)
|
||||
{
|
||||
g_signal_handlers_destroy(gobject);
|
||||
G_OBJECT_CLASS(ag_chart_renderer_parent_class)->finalize(gobject);
|
||||
}
|
||||
|
||||
AgChartRenderer *
|
||||
ag_chart_renderer_new(void)
|
||||
{
|
||||
AgChartRenderer *chart_renderer = NULL;
|
||||
|
||||
chart_renderer = g_object_new(AG_TYPE_CHART_RENDERER, NULL);
|
||||
|
||||
return chart_renderer;
|
||||
}
|
58
src/ag-chart-renderer.h
Normal file
58
src/ag-chart-renderer.h
Normal file
@ -0,0 +1,58 @@
|
||||
#ifndef __AG_CHART_RENDERER_H__
|
||||
#define __AG_CHART_RENDERER_H__
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define AG_TYPE_CHART_RENDERER \
|
||||
(ag_chart_renderer_get_type())
|
||||
#define AG_CHART_RENDERER(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
|
||||
AG_TYPE_CHART_RENDERER, \
|
||||
AgChartRenderer))
|
||||
#define AG_CHART_RENDERER_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST ((klass), \
|
||||
AG_TYPE_CHART_RENDERER, \
|
||||
AgChartRendererClass))
|
||||
#define IS_AG_CHART_RENDERER(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
|
||||
AG_TYPE_CHART_RENDERER))
|
||||
#define IS_AG_CHART_RENDERER_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
|
||||
AG_TYPE_CHART_RENDERER))
|
||||
#define AG_CHART_RENDERER_GET_CLASS(obj) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
|
||||
AG_TYPE_CHART_RENDERER, \
|
||||
AgChartRendererClass))
|
||||
|
||||
typedef struct _AgChartRenderer AgChartRenderer;
|
||||
typedef struct _AgChartRendererClass AgChartRendererClass;
|
||||
|
||||
struct _AgChartRendererClass
|
||||
{
|
||||
GtkCellRendererPixbufClass parent_class;
|
||||
};
|
||||
|
||||
struct _AgChartRenderer
|
||||
{
|
||||
GtkCellRendererPixbuf parent;
|
||||
};
|
||||
|
||||
#define AG_CHART_RENDERER_TILE_SIZE 256
|
||||
#define AG_CHART_RENDERER_CHECK_ICON_SIZE 40
|
||||
#define AG_CHART_RENDERER_TILE_MARGIN AG_CHART_RENDERER_CHECK_ICON_SIZE / 4
|
||||
#define AG_CHART_RENDERER_TILE_MARGIN_BOTTOM AG_CHART_RENDERER_CHECK_ICON_SIZE / 8
|
||||
|
||||
GType ag_chart_renderer_get_type (void) G_GNUC_CONST;
|
||||
|
||||
AgChartRenderer *ag_chart_renderer_new(void);
|
||||
|
||||
void ag_chart_renderer_set_toggle_visible(AgChartRenderer *chart_renderer, gboolean toggle_visible);
|
||||
|
||||
gboolean ag_chart_renderer_get_toggle_visible(AgChartRenderer *chart_renderer);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __AG_CHART_RENDERER_H__ */
|
@ -1926,7 +1926,7 @@ ag_chart_get_db_save(AgChart *chart, gint db_id)
|
||||
{
|
||||
GsweCoordinates *coords;
|
||||
AgChartPrivate *priv = ag_chart_get_instance_private(chart);
|
||||
AgDbChartSave *save_data = g_new0(AgDbChartSave, 1);
|
||||
AgDbChartSave *save_data = ag_db_chart_save_new();
|
||||
GsweTimestamp *timestamp = gswe_moment_get_timestamp(GSWE_MOMENT(chart));
|
||||
GEnumClass *house_system_class;
|
||||
GEnumValue *house_system_enum;
|
||||
|
51
src/ag-db.c
51
src/ag-db.c
@ -39,6 +39,12 @@ typedef struct _AgDbPrivate {
|
||||
G_DEFINE_QUARK(ag_db_error_quark, ag_db_error);
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE(AgDb, ag_db, G_TYPE_OBJECT);
|
||||
G_DEFINE_BOXED_TYPE(
|
||||
AgDbChartSave,
|
||||
ag_db_chart_save,
|
||||
(GBoxedCopyFunc)ag_db_chart_save_ref,
|
||||
(GBoxedFreeFunc)ag_db_chart_save_unref
|
||||
);
|
||||
|
||||
enum {
|
||||
COLUMN_CHART_ID,
|
||||
@ -564,7 +570,7 @@ ag_db_get(void)
|
||||
*
|
||||
* Frees @save_data and all its fields
|
||||
*/
|
||||
void
|
||||
static void
|
||||
ag_db_chart_save_free(AgDbChartSave *save_data)
|
||||
{
|
||||
if (!save_data) {
|
||||
@ -594,6 +600,30 @@ ag_db_chart_save_free(AgDbChartSave *save_data)
|
||||
g_free(save_data);
|
||||
}
|
||||
|
||||
AgDbChartSave *
|
||||
ag_db_chart_save_ref(AgDbChartSave *save_data)
|
||||
{
|
||||
if (save_data == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
save_data->refcount++;
|
||||
|
||||
return save_data;
|
||||
}
|
||||
|
||||
void
|
||||
ag_db_chart_save_unref(AgDbChartSave *save_data)
|
||||
{
|
||||
if (save_data == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (--save_data->refcount == 0) {
|
||||
ag_db_chart_save_free(save_data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ag_db_chart_save:
|
||||
* @db: the #AgDb object to operate on
|
||||
@ -797,6 +827,17 @@ ag_db_chart_save(AgDb *db, AgDbChartSave *save_data, GError **err)
|
||||
return save_success;
|
||||
}
|
||||
|
||||
AgDbChartSave *
|
||||
ag_db_chart_save_new(void)
|
||||
{
|
||||
AgDbChartSave *save_data;
|
||||
|
||||
save_data = g_new0(AgDbChartSave, 1);
|
||||
save_data->refcount = 1;
|
||||
|
||||
return save_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* ag_db_chart_get_list:
|
||||
* @db: the #AgDb object to operate on
|
||||
@ -833,7 +874,7 @@ ag_db_chart_get_list(AgDb *db, GError **err)
|
||||
|
||||
while (gda_data_model_iter_move_next(iter)) {
|
||||
const GValue *value;
|
||||
AgDbChartSave *save_data = g_new0(AgDbChartSave, 1);
|
||||
AgDbChartSave *save_data = ag_db_chart_save_new();
|
||||
|
||||
value = gda_data_model_iter_get_value_at(iter, 0);
|
||||
save_data->db_id = g_value_get_int(value);
|
||||
@ -910,7 +951,7 @@ ag_db_chart_get_data_by_id(AgDb *db, guint row_id, GError **err)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
save_data = g_new0(AgDbChartSave, 1);
|
||||
save_data = ag_db_chart_save_new();
|
||||
|
||||
/* id */
|
||||
value = gda_data_model_get_value_at(
|
||||
@ -1082,8 +1123,8 @@ string_collate(const gchar *str1, const gchar *str2)
|
||||
*/
|
||||
gboolean
|
||||
ag_db_chart_save_identical(const AgDbChartSave *a,
|
||||
const AgDbChartSave *b,
|
||||
gboolean chart_only)
|
||||
const AgDbChartSave *b,
|
||||
gboolean chart_only)
|
||||
{
|
||||
if (a == b) {
|
||||
g_debug("identical: Equal");
|
||||
|
12
src/ag-db.h
12
src/ag-db.h
@ -65,8 +65,12 @@ typedef struct _AgDbChartSave {
|
||||
gdouble timezone;
|
||||
gchar *house_system;
|
||||
gchar *note;
|
||||
gint refcount;
|
||||
} AgDbChartSave;
|
||||
|
||||
GType ag_db_chart_save_get_type(void);
|
||||
#define AG_TYPE_DB_CHART_SAVE (ag_db_chart_save_get_type())
|
||||
|
||||
typedef enum {
|
||||
AG_DB_ERROR_NO_CHART,
|
||||
AG_DB_ERROR_DATABASE_ERROR,
|
||||
@ -76,12 +80,16 @@ GType ag_db_get_type(void) G_GNUC_CONST;
|
||||
|
||||
AgDb *ag_db_get(void);
|
||||
|
||||
void ag_db_chart_save_free(AgDbChartSave *save_data);
|
||||
|
||||
gboolean ag_db_chart_save(AgDb *db,
|
||||
AgDbChartSave *save_data,
|
||||
GError **err);
|
||||
|
||||
AgDbChartSave *ag_db_chart_save_new(void);
|
||||
|
||||
AgDbChartSave *ag_db_chart_save_ref(AgDbChartSave *save_data);
|
||||
|
||||
void ag_db_chart_save_unref(AgDbChartSave *save_data);
|
||||
|
||||
GList *ag_db_chart_get_list(AgDb *db, GError **err);
|
||||
|
||||
AgDbChartSave *ag_db_chart_get_data_by_id(AgDb *db, guint row_id, GError **err);
|
||||
|
63
src/ag-enumtypes.c.template
Normal file
63
src/ag-enumtypes.c.template
Normal file
@ -0,0 +1,63 @@
|
||||
/*** BEGIN file-header ***/
|
||||
/* ag-enumtypes.c - Enumeration types for Astrognome
|
||||
*
|
||||
* Copyright © 2013 Gergely Polonkai
|
||||
*
|
||||
* Astrognome 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.
|
||||
*
|
||||
* Astrognome 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 library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "ag-enumtypes.h"
|
||||
#include "@filename@"
|
||||
|
||||
/*** END file-header ***/
|
||||
|
||||
/*** BEGIN file-production ***/
|
||||
/* enumerations from "@filename@" */
|
||||
/*** END file-production ***/
|
||||
|
||||
/*** BEGIN value-header ***/
|
||||
GType
|
||||
@enum_name@_get_type(void)
|
||||
{
|
||||
static volatile gsize g_define_type_id__volatile = 0;
|
||||
|
||||
if (g_once_init_enter(&g_define_type_id__volatile)) {
|
||||
static const G@Type@Value values[] = {
|
||||
/*** END value-header ***/
|
||||
|
||||
/*** BEGIN value-production ***/
|
||||
{
|
||||
@VALUENAME@,
|
||||
"@VALUENAME@",
|
||||
"@valuenick@"
|
||||
},
|
||||
/*** END value-production ***/
|
||||
|
||||
/*** BEGIN value-tail ***/
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
GType g_define_type_id = g_@type@_register_static(
|
||||
g_intern_static_string("@EnumName@"),
|
||||
values
|
||||
);
|
||||
|
||||
g_once_init_leave(&g_define_type_id__volatile, g_define_type_id);
|
||||
}
|
||||
|
||||
return g_define_type_id__volatile;
|
||||
}
|
||||
|
||||
/*** END value-tail ***/
|
||||
|
42
src/ag-enumtypes.h.template
Normal file
42
src/ag-enumtypes.h.template
Normal file
@ -0,0 +1,42 @@
|
||||
/*** BEGIN file-header ***/
|
||||
/* ag-enumtypes.h - Enumeration types for Astrognome
|
||||
*
|
||||
* Copyright © 2013 Gergely Polonkai
|
||||
*
|
||||
* Astrognome 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.
|
||||
*
|
||||
* Astrognome 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 library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __AG_ENUM_TYPES_H__
|
||||
#define __AG_ENUM_TYPES_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
/*** END file-header ***/
|
||||
|
||||
/*** BEGIN file-production ***/
|
||||
|
||||
/* enumerations from "@filename@" */
|
||||
|
||||
#include "@filename@"
|
||||
/*** END file-production ***/
|
||||
|
||||
/*** BEGIN value-header ***/
|
||||
GType @enum_name@_get_type(void);
|
||||
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type())
|
||||
/*** END value-header ***/
|
||||
|
||||
/*** BEGIN file-tail ***/
|
||||
|
||||
#endif /* __AG_ENUM_TYPES_H__ */
|
||||
/*** END file-tail ***/
|
||||
|
423
src/ag-icon-view.c
Normal file
423
src/ag-icon-view.c
Normal file
@ -0,0 +1,423 @@
|
||||
#include "ag-enumtypes.h"
|
||||
#include "ag-icon-view.h"
|
||||
#include "ag-db.h"
|
||||
#include "ag-chart-renderer.h"
|
||||
|
||||
typedef struct _AgIconViewPrivate {
|
||||
AgIconViewMode mode;
|
||||
AgChartRenderer *thumb_renderer;
|
||||
GtkCellRenderer *text_renderer;
|
||||
GtkListStore *model;
|
||||
} AgIconViewPrivate;
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_MODE,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
enum {
|
||||
AG_ICON_VIEW_COLUMN_SELECTED,
|
||||
AG_ICON_VIEW_COLUMN_ITEM,
|
||||
AG_ICON_VIEW_COLUMN_COLUMNS
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE(AgIconView, ag_icon_view, GTK_TYPE_ICON_VIEW);
|
||||
|
||||
static GParamSpec *properties[PROP_LAST];
|
||||
|
||||
void
|
||||
ag_icon_view_set_mode(AgIconView *icon_view, AgIconViewMode mode)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
|
||||
if (priv->mode != mode) {
|
||||
priv->mode = mode;
|
||||
|
||||
if (mode != AG_ICON_VIEW_MODE_SELECTION) {
|
||||
ag_icon_view_unselect_all(icon_view);
|
||||
}
|
||||
|
||||
ag_chart_renderer_set_toggle_visible(priv->thumb_renderer, (mode == AG_ICON_VIEW_MODE_SELECTION));
|
||||
|
||||
gtk_widget_queue_draw(GTK_WIDGET(icon_view));
|
||||
|
||||
g_object_notify_by_pspec(
|
||||
G_OBJECT(icon_view),
|
||||
properties[PROP_MODE]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
AgIconViewMode
|
||||
ag_icon_view_get_mode(AgIconView *icon_view)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
|
||||
return priv->mode;
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_set_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *param_spec)
|
||||
{
|
||||
switch (prop_id) {
|
||||
case PROP_MODE:
|
||||
ag_icon_view_set_mode(
|
||||
AG_ICON_VIEW(gobject),
|
||||
g_value_get_enum(value)
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_get_property(GObject *gobject,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *param_spec)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(
|
||||
AG_ICON_VIEW(gobject)
|
||||
);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_MODE:
|
||||
g_value_set_enum(value, priv->mode);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_selection_changed(AgIconView *icon_view)
|
||||
{
|
||||
g_signal_emit_by_name(icon_view, "selection-changed");
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_item_activated(AgIconView *icon_view, GtkTreePath *path)
|
||||
{
|
||||
g_signal_emit_by_name(icon_view, "item-activated", path);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
ag_icon_view_button_press_event_cb(GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
GtkTreePath *path;
|
||||
GtkIconView *gtk_icon_view = GTK_ICON_VIEW(widget);
|
||||
AgIconView *ag_icon_view = AG_ICON_VIEW(widget);
|
||||
|
||||
path = gtk_icon_view_get_path_at_pos(gtk_icon_view, ((GdkEventButton *)event)->x, ((GdkEventButton *)event)->y);
|
||||
|
||||
if (path != NULL) {
|
||||
gboolean selected;
|
||||
AgDbChartSave *chart_save;
|
||||
GtkListStore *store = GTK_LIST_STORE(gtk_icon_view_get_model(gtk_icon_view));
|
||||
|
||||
if (event->button == GDK_BUTTON_SECONDARY) {
|
||||
ag_icon_view_set_mode(ag_icon_view, AG_ICON_VIEW_MODE_SELECTION);
|
||||
}
|
||||
|
||||
if (ag_icon_view_get_mode(ag_icon_view) == AG_ICON_VIEW_MODE_SELECTION) {
|
||||
GtkTreeIter iter;
|
||||
|
||||
if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) {
|
||||
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, AG_ICON_VIEW_COLUMN_SELECTED, &selected, AG_ICON_VIEW_COLUMN_ITEM, &chart_save, -1);
|
||||
|
||||
gtk_list_store_set(store, &iter, AG_ICON_VIEW_COLUMN_SELECTED, !selected, -1);
|
||||
|
||||
ag_icon_view_selection_changed(ag_icon_view);
|
||||
}
|
||||
} else {
|
||||
ag_icon_view_item_activated(ag_icon_view, path);
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_class_init(AgIconViewClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
|
||||
|
||||
gobject_class->set_property = ag_icon_view_set_property;
|
||||
gobject_class->get_property = ag_icon_view_get_property;
|
||||
widget_class->button_press_event = ag_icon_view_button_press_event_cb;
|
||||
|
||||
properties[PROP_MODE] = g_param_spec_enum(
|
||||
"mode",
|
||||
"Mode",
|
||||
"Mode",
|
||||
AG_TYPE_ICON_VIEW_MODE,
|
||||
AG_ICON_VIEW_MODE_NORMAL,
|
||||
G_PARAM_STATIC_NAME
|
||||
| G_PARAM_STATIC_NICK
|
||||
| G_PARAM_STATIC_BLURB
|
||||
| G_PARAM_READABLE
|
||||
| G_PARAM_WRITABLE
|
||||
);
|
||||
g_object_class_install_property(
|
||||
gobject_class,
|
||||
PROP_MODE,
|
||||
properties[PROP_MODE]
|
||||
);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_chart_renderer_func(GtkCellLayout *layout,
|
||||
GtkCellRenderer *renderer,
|
||||
GtkTreeModel *model,
|
||||
GtkTreeIter *iter,
|
||||
AgIconView *icon_view)
|
||||
{
|
||||
AgDbChartSave *chart_save;
|
||||
|
||||
gtk_tree_model_get(model, iter, AG_ICON_VIEW_COLUMN_ITEM, &chart_save, -1);
|
||||
|
||||
if (chart_save) {
|
||||
g_object_set(renderer, "pixbuf", NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_text_renderer_func(GtkCellLayout *layout,
|
||||
GtkCellRenderer *renderer,
|
||||
GtkTreeModel *model,
|
||||
GtkTreeIter *iter,
|
||||
AgIconView *icon_view)
|
||||
{
|
||||
AgDbChartSave *chart_save;
|
||||
|
||||
gtk_tree_model_get(model, iter, AG_ICON_VIEW_COLUMN_ITEM, &chart_save, -1);
|
||||
|
||||
if (chart_save) {
|
||||
gchar *text;
|
||||
|
||||
text = g_markup_escape_text(chart_save->name, -1);
|
||||
g_object_set(renderer, "markup", text, NULL);
|
||||
g_free(text);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_icon_view_init(AgIconView *icon_view)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
guint tile_width,
|
||||
tile_height;
|
||||
|
||||
priv->model = gtk_list_store_new(
|
||||
AG_ICON_VIEW_COLUMN_COLUMNS,
|
||||
G_TYPE_BOOLEAN,
|
||||
AG_TYPE_DB_CHART_SAVE
|
||||
);
|
||||
gtk_icon_view_set_model(
|
||||
GTK_ICON_VIEW(icon_view),
|
||||
GTK_TREE_MODEL(priv->model)
|
||||
);
|
||||
|
||||
gtk_icon_view_set_selection_mode(
|
||||
GTK_ICON_VIEW(icon_view),
|
||||
GTK_SELECTION_NONE
|
||||
);
|
||||
priv->mode = AG_ICON_VIEW_MODE_NORMAL;
|
||||
|
||||
gtk_icon_view_set_item_padding(GTK_ICON_VIEW(icon_view), 0);
|
||||
gtk_icon_view_set_margin(GTK_ICON_VIEW(icon_view), 12);
|
||||
|
||||
tile_width = AG_CHART_RENDERER_TILE_SIZE
|
||||
+ 2 * AG_CHART_RENDERER_TILE_MARGIN;
|
||||
tile_height = AG_CHART_RENDERER_TILE_SIZE
|
||||
+ AG_CHART_RENDERER_TILE_MARGIN
|
||||
+ AG_CHART_RENDERER_TILE_MARGIN_BOTTOM;
|
||||
|
||||
priv->thumb_renderer = ag_chart_renderer_new();
|
||||
gtk_cell_renderer_set_alignment(
|
||||
GTK_CELL_RENDERER(priv->thumb_renderer),
|
||||
0.5, 0.5
|
||||
);
|
||||
gtk_cell_renderer_set_fixed_size(
|
||||
GTK_CELL_RENDERER(priv->thumb_renderer),
|
||||
tile_width, tile_height
|
||||
);
|
||||
gtk_cell_layout_pack_start(
|
||||
GTK_CELL_LAYOUT(icon_view),
|
||||
GTK_CELL_RENDERER(priv->thumb_renderer),
|
||||
FALSE
|
||||
);
|
||||
gtk_cell_layout_add_attribute(
|
||||
GTK_CELL_LAYOUT(icon_view),
|
||||
GTK_CELL_RENDERER(priv->thumb_renderer),
|
||||
"checked", AG_ICON_VIEW_COLUMN_SELECTED
|
||||
);
|
||||
gtk_cell_layout_set_cell_data_func(
|
||||
GTK_CELL_LAYOUT(icon_view),
|
||||
GTK_CELL_RENDERER(priv->thumb_renderer),
|
||||
(GtkCellLayoutDataFunc)ag_icon_view_chart_renderer_func,
|
||||
icon_view,
|
||||
NULL
|
||||
);
|
||||
|
||||
priv->text_renderer = gtk_cell_renderer_text_new();
|
||||
gtk_cell_renderer_set_alignment(
|
||||
GTK_CELL_RENDERER(priv->text_renderer),
|
||||
0.5, 0.5
|
||||
);
|
||||
gtk_cell_layout_pack_start(
|
||||
GTK_CELL_LAYOUT(icon_view),
|
||||
priv->text_renderer,
|
||||
TRUE
|
||||
);
|
||||
gtk_cell_layout_set_cell_data_func(
|
||||
GTK_CELL_LAYOUT(icon_view),
|
||||
GTK_CELL_RENDERER(priv->text_renderer),
|
||||
(GtkCellLayoutDataFunc)ag_icon_view_text_renderer_func,
|
||||
icon_view,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
void
|
||||
ag_icon_view_add_chart(AgIconView *icon_view, AgDbChartSave *chart_save)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
|
||||
g_debug("Adding chart for %s", chart_save->name);
|
||||
|
||||
gtk_list_store_append(priv->model, &iter);
|
||||
gtk_list_store_set(
|
||||
priv->model, &iter,
|
||||
AG_ICON_VIEW_COLUMN_SELECTED, FALSE,
|
||||
AG_ICON_VIEW_COLUMN_ITEM, chart_save,
|
||||
-1
|
||||
);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
ag_icon_view_check_selected(GtkTreeModel *model,
|
||||
GtkTreePath *path,
|
||||
GtkTreeIter *iter,
|
||||
GList **list)
|
||||
{
|
||||
gboolean selected;
|
||||
|
||||
gtk_tree_model_get(model, iter, AG_ICON_VIEW_COLUMN_SELECTED, &selected, -1);
|
||||
|
||||
if (selected) {
|
||||
*list = g_list_prepend(*list, path);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GList *
|
||||
ag_icon_view_get_selected_items(AgIconView *icon_view)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
GList *items = NULL;
|
||||
|
||||
gtk_tree_model_foreach(GTK_TREE_MODEL(priv->model), (GtkTreeModelForeachFunc)ag_icon_view_check_selected, &items);
|
||||
|
||||
return g_list_reverse(items);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
ag_icon_view_change_item_selection(GtkListStore *model,
|
||||
GtkTreePath *path,
|
||||
GtkTreeIter *iter,
|
||||
gboolean *selected)
|
||||
{
|
||||
gtk_list_store_set(model, iter, AG_ICON_VIEW_COLUMN_SELECTED, *selected, -1);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
ag_icon_view_select_all(AgIconView *icon_view)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
gboolean selected = TRUE;
|
||||
|
||||
gtk_tree_model_foreach(
|
||||
GTK_TREE_MODEL(priv->model),
|
||||
(GtkTreeModelForeachFunc)ag_icon_view_change_item_selection,
|
||||
&selected
|
||||
);
|
||||
|
||||
ag_icon_view_selection_changed(icon_view);
|
||||
}
|
||||
|
||||
void
|
||||
ag_icon_view_unselect_all(AgIconView *icon_view)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
gboolean selected = FALSE;
|
||||
|
||||
gtk_tree_model_foreach(
|
||||
GTK_TREE_MODEL(priv->model),
|
||||
(GtkTreeModelForeachFunc)ag_icon_view_change_item_selection,
|
||||
&selected
|
||||
);
|
||||
|
||||
ag_icon_view_selection_changed(icon_view);
|
||||
}
|
||||
|
||||
AgDbChartSave *
|
||||
ag_icon_view_get_chart_save_at_path(AgIconView *icon_view,
|
||||
const GtkTreePath *path)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
GtkTreeIter iter;
|
||||
AgDbChartSave *save_data;
|
||||
|
||||
if (gtk_tree_model_get_iter(GTK_TREE_MODEL(priv->model), &iter, (GtkTreePath *)path)) {
|
||||
gtk_tree_model_get(
|
||||
GTK_TREE_MODEL(priv->model), &iter,
|
||||
AG_ICON_VIEW_COLUMN_ITEM, &save_data,
|
||||
-1
|
||||
);
|
||||
} else {
|
||||
g_warning("Invalid tree path");
|
||||
|
||||
save_data = NULL;
|
||||
}
|
||||
|
||||
return save_data;
|
||||
}
|
||||
|
||||
void
|
||||
ag_icon_view_remove_selected(AgIconView *icon_view)
|
||||
{
|
||||
AgIconViewPrivate *priv = ag_icon_view_get_instance_private(icon_view);
|
||||
GList *paths = g_list_reverse(ag_icon_view_get_selected_items(icon_view)),
|
||||
*l;
|
||||
|
||||
for (l = paths; l; l = g_list_next(l)) {
|
||||
GtkTreeIter iter;
|
||||
GtkTreePath *path = l->data;
|
||||
|
||||
if (gtk_tree_model_get_iter(GTK_TREE_MODEL(priv->model), &iter, path)) {
|
||||
gtk_list_store_remove(priv->model, &iter);
|
||||
}
|
||||
}
|
||||
|
||||
ag_icon_view_selection_changed(icon_view);
|
||||
}
|
69
src/ag-icon-view.h
Normal file
69
src/ag-icon-view.h
Normal file
@ -0,0 +1,69 @@
|
||||
#ifndef __AG_ICON_VIEW_H__
|
||||
#define __AG_ICON_VIEW_H__
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "ag-db.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define AG_TYPE_ICON_VIEW \
|
||||
(ag_icon_view_get_type())
|
||||
#define AG_ICON_VIEW(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
|
||||
AG_TYPE_ICON_VIEW, \
|
||||
AgIconView))
|
||||
#define AG_ICON_VIEW_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST ((klass), \
|
||||
AG_TYPE_ICON_VIEW, \
|
||||
AgIconViewClass))
|
||||
#define IS_AG_ICON_VIEW(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
|
||||
AG_TYPE_ICON_VIEW))
|
||||
#define IS_AG_ICON_VIEW_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
|
||||
AG_TYPE_ICON_VIEW))
|
||||
#define AG_ICON_VIEW_GET_CLASS(obj) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
|
||||
AG_TYPE_ICON_VIEW, \
|
||||
AgIconViewClass))
|
||||
|
||||
typedef struct _AgIconView AgIconView;
|
||||
typedef struct _AgIconViewClass AgIconViewClass;
|
||||
|
||||
struct _AgIconViewClass
|
||||
{
|
||||
GtkIconViewClass parent_class;
|
||||
};
|
||||
|
||||
struct _AgIconView
|
||||
{
|
||||
GtkIconView parent;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
AG_ICON_VIEW_MODE_NORMAL,
|
||||
AG_ICON_VIEW_MODE_SELECTION
|
||||
} AgIconViewMode;
|
||||
|
||||
GType ag_icon_view_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void ag_icon_view_set_mode(AgIconView *icon_view, AgIconViewMode mode);
|
||||
|
||||
AgIconViewMode ag_icon_view_get_mode(AgIconView *icon_view);
|
||||
|
||||
void ag_icon_view_add_chart(AgIconView *icon_view, AgDbChartSave *chart_save);
|
||||
|
||||
GList *ag_icon_view_get_selected_items(AgIconView *icon_view);
|
||||
|
||||
AgDbChartSave *ag_icon_view_get_chart_save_at_path(AgIconView *icon_view, const GtkTreePath *path);
|
||||
|
||||
void ag_icon_view_select_all(AgIconView *icon_view);
|
||||
|
||||
void ag_icon_view_unselect_all(AgIconView *icon_view);
|
||||
|
||||
void ag_icon_view_remove_selected(AgIconView *icon_view);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __AG_ICON_VIEW_H__ */
|
237
src/ag-window.c
237
src/ag-window.c
@ -22,8 +22,6 @@
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
#include <webkit2/webkit2.h>
|
||||
#include <libgd/gd-main-view.h>
|
||||
#include <libgd/gd-main-view-generic.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include <swe-glib.h>
|
||||
@ -35,6 +33,7 @@
|
||||
#include "ag-settings.h"
|
||||
#include "ag-db.h"
|
||||
#include "ag-display-theme.h"
|
||||
#include "ag-icon-view.h"
|
||||
|
||||
struct _AgWindowPrivate {
|
||||
GtkWidget *header_bar;
|
||||
@ -72,12 +71,12 @@ struct _AgWindowPrivate {
|
||||
GtkWidget *points_eq;
|
||||
GtkAdjustment *year_adjust;
|
||||
|
||||
GtkWidget *chart_list;
|
||||
AgSettings *settings;
|
||||
AgChart *chart;
|
||||
gboolean aspect_table_populated;
|
||||
GtkTextBuffer *note_buffer;
|
||||
GtkListStore *house_system_model;
|
||||
GtkListStore *db_chart_data;
|
||||
AgDbChartSave *saved_data;
|
||||
GtkEntryCompletion *country_comp;
|
||||
GtkEntryCompletion *city_comp;
|
||||
@ -720,7 +719,7 @@ ag_window_recalculate_chart(AgWindow *window, gboolean set_everything)
|
||||
gtk_spin_button_update(GTK_SPIN_BUTTON(current));
|
||||
}
|
||||
|
||||
edit_data = g_new0(AgDbChartSave, 1);
|
||||
edit_data = ag_db_chart_save_new();
|
||||
|
||||
edit_data->db_id = db_id;
|
||||
|
||||
@ -798,13 +797,13 @@ ag_window_recalculate_chart(AgWindow *window, gboolean set_everything)
|
||||
if (ag_db_chart_save_identical(edit_data, chart_data, !set_everything)) {
|
||||
g_debug("No redrawing needed");
|
||||
|
||||
ag_db_chart_save_free(edit_data);
|
||||
ag_db_chart_save_free(chart_data);
|
||||
ag_db_chart_save_unref(edit_data);
|
||||
ag_db_chart_save_unref(chart_data);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ag_db_chart_save_free(chart_data);
|
||||
ag_db_chart_save_unref(chart_data);
|
||||
|
||||
g_debug("Recalculating chart data");
|
||||
|
||||
@ -846,7 +845,7 @@ ag_window_recalculate_chart(AgWindow *window, gboolean set_everything)
|
||||
ag_chart_set_note(priv->chart, edit_data->note);
|
||||
}
|
||||
|
||||
ag_db_chart_save_free(edit_data);
|
||||
ag_db_chart_save_unref(edit_data);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1257,7 +1256,7 @@ ag_window_can_close(AgWindow *window, gboolean display_dialog)
|
||||
}
|
||||
}
|
||||
|
||||
ag_db_chart_save_free(save_data);
|
||||
ag_db_chart_save_unref(save_data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1289,7 +1288,7 @@ ag_window_save_action(GSimpleAction *action,
|
||||
);
|
||||
}
|
||||
|
||||
ag_db_chart_save_free(priv->saved_data);
|
||||
ag_db_chart_save_unref(priv->saved_data);
|
||||
priv->saved_data = save_data;
|
||||
}
|
||||
}
|
||||
@ -1644,7 +1643,7 @@ ag_window_back_action(GSimpleAction *action,
|
||||
if (ag_window_can_close(window, TRUE)) {
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->toolbar_aspect), TRUE);
|
||||
g_clear_object(&(priv->chart));
|
||||
ag_db_chart_save_free(priv->saved_data);
|
||||
ag_db_chart_save_unref(priv->saved_data);
|
||||
priv->saved_data = NULL;
|
||||
|
||||
ag_window_load_chart_list(window);
|
||||
@ -1662,30 +1661,23 @@ ag_window_refresh_action(GSimpleAction *action,
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_selection_mode_action(GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer user_data)
|
||||
ag_window_set_selection_mode(AgWindow *window, gboolean state)
|
||||
{
|
||||
GVariant *state;
|
||||
gboolean new_state;
|
||||
GtkStyleContext *style;
|
||||
AgWindow *window = AG_WINDOW(user_data);
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||
|
||||
state = g_action_get_state(G_ACTION(action));
|
||||
new_state = !g_variant_get_boolean(state);
|
||||
g_action_change_state(G_ACTION(action), g_variant_new_boolean(new_state));
|
||||
g_variant_unref(state);
|
||||
|
||||
style = gtk_widget_get_style_context(priv->header_bar);
|
||||
|
||||
if (new_state) {
|
||||
if (state) {
|
||||
gtk_header_bar_set_show_close_button(
|
||||
GTK_HEADER_BAR(priv->header_bar),
|
||||
FALSE
|
||||
);
|
||||
gtk_style_context_add_class(style, "selection-mode");
|
||||
gd_main_view_set_selection_mode(GD_MAIN_VIEW(priv->tab_list), TRUE);
|
||||
ag_icon_view_set_mode(
|
||||
AG_ICON_VIEW(priv->chart_list),
|
||||
AG_ICON_VIEW_MODE_SELECTION
|
||||
);
|
||||
gtk_widget_hide(priv->new_back_stack);
|
||||
gtk_stack_set_visible_child_name(
|
||||
GTK_STACK(priv->menubutton_stack),
|
||||
@ -1697,7 +1689,10 @@ ag_window_selection_mode_action(GSimpleAction *action,
|
||||
TRUE
|
||||
);
|
||||
gtk_style_context_remove_class(style, "selection-mode");
|
||||
gd_main_view_set_selection_mode(GD_MAIN_VIEW(priv->tab_list), FALSE);
|
||||
ag_icon_view_set_mode(
|
||||
AG_ICON_VIEW(priv->chart_list),
|
||||
AG_ICON_VIEW_MODE_NORMAL
|
||||
);
|
||||
gtk_widget_show_all(priv->new_back_stack);
|
||||
gtk_stack_set_visible_child_name(
|
||||
GTK_STACK(priv->menubutton_stack),
|
||||
@ -1706,6 +1701,42 @@ ag_window_selection_mode_action(GSimpleAction *action,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_icon_view_mode_cb(AgIconView *icon_view,
|
||||
GParamSpec *pspec,
|
||||
AgWindow *window)
|
||||
{
|
||||
AgIconViewMode mode = ag_icon_view_get_mode(icon_view);
|
||||
GVariant *state_var = g_variant_new_boolean(
|
||||
(mode == AG_ICON_VIEW_MODE_SELECTION)
|
||||
);
|
||||
|
||||
g_action_group_activate_action(
|
||||
G_ACTION_GROUP(window),
|
||||
"selection",
|
||||
state_var
|
||||
);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_selection_mode_action(GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer user_data)
|
||||
{
|
||||
GVariant *state;
|
||||
gboolean new_state;
|
||||
AgWindow *window = AG_WINDOW(user_data);
|
||||
|
||||
state = g_action_get_state(G_ACTION(action));
|
||||
new_state = !g_variant_get_boolean(state);
|
||||
g_action_change_state(G_ACTION(action), g_variant_new_boolean(new_state));
|
||||
g_variant_unref(state);
|
||||
|
||||
g_debug("Set selection mode: %d", new_state);
|
||||
|
||||
ag_window_set_selection_mode(window, new_state);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_delete_action(GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
@ -1713,31 +1744,20 @@ ag_window_delete_action(GSimpleAction *action,
|
||||
{
|
||||
GList *selection,
|
||||
*item;
|
||||
GtkTreeModel *model;
|
||||
AgWindow *window = AG_WINDOW(user_data);
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||
AgDb *db = ag_db_get();
|
||||
|
||||
selection = gd_main_view_get_selection(GD_MAIN_VIEW(priv->tab_list));
|
||||
model = gd_main_view_get_model(GD_MAIN_VIEW(priv->tab_list));
|
||||
selection = ag_icon_view_get_selected_items(AG_ICON_VIEW(priv->chart_list));
|
||||
|
||||
for (item = selection; item; item = g_list_next(item)) {
|
||||
GtkTreePath *path = item->data;
|
||||
GtkTreeIter iter;
|
||||
gchar *id_str;
|
||||
gint id;
|
||||
GError *err = NULL;
|
||||
GtkTreePath *path = item->data;
|
||||
GError *err = NULL;
|
||||
AgDbChartSave *save_data;
|
||||
|
||||
gtk_tree_model_get_iter(model, &iter, path);
|
||||
gtk_tree_model_get(
|
||||
model, &iter,
|
||||
GD_MAIN_COLUMN_ID, &id_str,
|
||||
-1
|
||||
);
|
||||
id = atoi(id_str);
|
||||
g_free(id_str);
|
||||
save_data = ag_icon_view_get_chart_save_at_path(AG_ICON_VIEW(priv->chart_list), path);
|
||||
|
||||
if (!ag_db_chart_delete(db, id, &err)) {
|
||||
if (!ag_db_chart_delete(db, save_data->db_id, &err)) {
|
||||
ag_app_message_dialog(
|
||||
GTK_WINDOW(window),
|
||||
GTK_MESSAGE_ERROR,
|
||||
@ -1749,6 +1769,8 @@ ag_window_delete_action(GSimpleAction *action,
|
||||
}
|
||||
}
|
||||
|
||||
ag_icon_view_remove_selected(AG_ICON_VIEW(priv->chart_list));
|
||||
|
||||
g_action_group_activate_action(G_ACTION_GROUP(window), "selection", NULL);
|
||||
g_action_group_activate_action(G_ACTION_GROUP(window), "refresh", NULL);
|
||||
}
|
||||
@ -1827,7 +1849,7 @@ static GActionEntry win_entries[] = {
|
||||
{ "new-chart", ag_window_new_chart_action, NULL, NULL, NULL },
|
||||
{ "back", ag_window_back_action, NULL, NULL, NULL },
|
||||
{ "refresh", ag_window_refresh_action, NULL, NULL, NULL },
|
||||
{ "selection", ag_window_selection_mode_action, NULL, "false", NULL },
|
||||
{ "selection", ag_window_selection_mode_action, "b", "false", NULL },
|
||||
{ "delete", ag_window_delete_action, NULL, NULL, NULL },
|
||||
{ "connection", ag_window_connection_action, "s", "'aspects'", NULL },
|
||||
};
|
||||
@ -1878,15 +1900,14 @@ ag_window_add_display_theme(AgDisplayTheme *display_theme,
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_list_item_activated_cb(GdMainView *view,
|
||||
const gchar *id,
|
||||
ag_window_list_item_activated_cb(AgIconView *icon_view,
|
||||
const GtkTreePath *path,
|
||||
AgWindow *window)
|
||||
{
|
||||
guint row_id = atoi(id);
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||
AgDb *db = ag_db_get();
|
||||
GError *err = NULL;
|
||||
AgDbChartSave *save_data;
|
||||
|
||||
if (priv->saved_data != NULL) {
|
||||
ag_app_message_dialog(
|
||||
@ -1902,11 +1923,17 @@ ag_window_list_item_activated_cb(GdMainView *view,
|
||||
return;
|
||||
}
|
||||
|
||||
g_debug("Loading chart with ID %d", row_id);
|
||||
save_data = ag_icon_view_get_chart_save_at_path(icon_view, path);
|
||||
|
||||
if (save_data == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
g_debug("Loading chart with ID %d", save_data->db_id);
|
||||
|
||||
if ((priv->saved_data = ag_db_chart_get_data_by_id(
|
||||
db,
|
||||
row_id,
|
||||
save_data->db_id,
|
||||
&err)) == NULL) {
|
||||
ag_app_message_dialog(
|
||||
GTK_WINDOW(window),
|
||||
@ -1931,7 +1958,7 @@ ag_window_list_item_activated_cb(GdMainView *view,
|
||||
"Error: %s",
|
||||
err->message
|
||||
);
|
||||
ag_db_chart_save_free(priv->saved_data);
|
||||
ag_db_chart_save_unref(priv->saved_data);
|
||||
priv->saved_data = NULL;
|
||||
|
||||
return;
|
||||
@ -1943,13 +1970,13 @@ ag_window_list_item_activated_cb(GdMainView *view,
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_list_selection_changed_cb(GdMainView *view, AgWindow *window)
|
||||
ag_window_list_selection_changed_cb(AgIconView *view, AgWindow *window)
|
||||
{
|
||||
GList *selection;
|
||||
guint count;
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||
|
||||
selection = gd_main_view_get_selection(view);
|
||||
selection = ag_icon_view_get_selected_items(view);
|
||||
|
||||
if ((count = g_list_length(selection)) > 0) {
|
||||
gtk_revealer_set_reveal_child(
|
||||
@ -2130,32 +2157,6 @@ ag_window_init(AgWindow *window)
|
||||
NULL
|
||||
);
|
||||
|
||||
priv->tab_list = GTK_WIDGET(gd_main_view_new(GD_MAIN_VIEW_ICON));
|
||||
gtk_stack_add_titled(
|
||||
GTK_STACK(priv->stack),
|
||||
priv->tab_list,
|
||||
"list",
|
||||
"Chart list"
|
||||
);
|
||||
|
||||
gd_main_view_set_selection_mode(GD_MAIN_VIEW(priv->tab_list), FALSE);
|
||||
gd_main_view_set_model(
|
||||
GD_MAIN_VIEW(priv->tab_list),
|
||||
GTK_TREE_MODEL(priv->db_chart_data)
|
||||
);
|
||||
g_signal_connect(
|
||||
priv->tab_list,
|
||||
"item-activated",
|
||||
G_CALLBACK(ag_window_list_item_activated_cb),
|
||||
window
|
||||
);
|
||||
g_signal_connect(
|
||||
priv->tab_list,
|
||||
"view-selection-changed",
|
||||
G_CALLBACK(ag_window_list_selection_changed_cb),
|
||||
window
|
||||
);
|
||||
|
||||
gtk_stack_set_visible_child_name(GTK_STACK(priv->stack), "list");
|
||||
priv->current_tab = priv->tab_list;
|
||||
|
||||
@ -2402,12 +2403,35 @@ ag_window_display_theme_changed_cb(GtkComboBox *combo_box,
|
||||
ag_window_set_theme(window, theme);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_destroy(GtkWidget *widget)
|
||||
{
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(AG_WINDOW(widget));
|
||||
|
||||
// Destroy the signal handlers on priv->stack, as “tab” switching
|
||||
// can cause trouble during destroy. However, this function might
|
||||
// get called multiple times for the same object, in which case
|
||||
// priv->stack is NULL.
|
||||
if (priv->stack) {
|
||||
g_signal_handlers_destroy(priv->stack);
|
||||
}
|
||||
|
||||
GTK_WIDGET_CLASS(ag_window_parent_class)->destroy(widget);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_selection_mode_cancel_cb(GtkButton *button, AgWindow *window)
|
||||
{
|
||||
ag_window_set_selection_mode(window, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_class_init(AgWindowClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
|
||||
|
||||
widget_class->destroy = ag_window_destroy;
|
||||
gobject_class->dispose = ag_window_dispose;
|
||||
|
||||
gtk_widget_class_set_template_from_resource(
|
||||
@ -2429,11 +2453,6 @@ ag_window_class_init(AgWindowClass *klass)
|
||||
AgWindow,
|
||||
menubutton_stack
|
||||
);
|
||||
gtk_widget_class_bind_template_child_private(
|
||||
widget_class,
|
||||
AgWindow,
|
||||
db_chart_data
|
||||
);
|
||||
gtk_widget_class_bind_template_child_private(
|
||||
widget_class,
|
||||
AgWindow,
|
||||
@ -2561,6 +2580,16 @@ ag_window_class_init(AgWindowClass *klass)
|
||||
AgWindow,
|
||||
toolbar_aspect
|
||||
);
|
||||
gtk_widget_class_bind_template_child_private(
|
||||
widget_class,
|
||||
AgWindow,
|
||||
tab_list
|
||||
);
|
||||
gtk_widget_class_bind_template_child_private(
|
||||
widget_class,
|
||||
AgWindow,
|
||||
chart_list
|
||||
);
|
||||
|
||||
gtk_widget_class_bind_template_callback(
|
||||
widget_class,
|
||||
@ -2586,6 +2615,22 @@ ag_window_class_init(AgWindowClass *klass)
|
||||
widget_class,
|
||||
ag_window_display_theme_changed_cb
|
||||
);
|
||||
gtk_widget_class_bind_template_callback(
|
||||
widget_class,
|
||||
ag_window_list_item_activated_cb
|
||||
);
|
||||
gtk_widget_class_bind_template_callback(
|
||||
widget_class,
|
||||
ag_window_list_selection_changed_cb
|
||||
);
|
||||
gtk_widget_class_bind_template_callback(
|
||||
widget_class,
|
||||
ag_window_icon_view_mode_cb
|
||||
);
|
||||
gtk_widget_class_bind_template_callback(
|
||||
widget_class,
|
||||
ag_window_selection_mode_cancel_cb
|
||||
);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -2657,7 +2702,7 @@ ag_window_set_chart(AgWindow *window, AgChart *chart)
|
||||
g_clear_object(&(priv->chart));
|
||||
}
|
||||
|
||||
ag_db_chart_save_free(priv->saved_data);
|
||||
ag_db_chart_save_unref(priv->saved_data);
|
||||
|
||||
priv->chart = chart;
|
||||
g_signal_connect(
|
||||
@ -2744,33 +2789,10 @@ ag_window_change_tab(AgWindow *window, const gchar *tab_name)
|
||||
|
||||
static void
|
||||
ag_window_add_chart_to_list(AgDbChartSave *save_data, AgWindow *window)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||
gchar *id = g_strdup_printf("%d", save_data->db_id);
|
||||
|
||||
gtk_list_store_append(priv->db_chart_data, &iter);
|
||||
gtk_list_store_set(
|
||||
priv->db_chart_data, &iter,
|
||||
0, id, /* ID */
|
||||
1, NULL, /* URI */
|
||||
2, save_data->name, /* Primary text */
|
||||
3, NULL, /* Secondary text */
|
||||
4, NULL, /* Icon */
|
||||
5, 0, /* mtime */
|
||||
6, FALSE, /* Selected */
|
||||
7, 0, /* Pulse */
|
||||
-1
|
||||
);
|
||||
g_free(id);
|
||||
}
|
||||
|
||||
static void
|
||||
ag_window_clear_chart_list(AgWindow *window)
|
||||
{
|
||||
AgWindowPrivate *priv = ag_window_get_instance_private(window);
|
||||
|
||||
gtk_list_store_clear(priv->db_chart_data);
|
||||
ag_icon_view_add_chart(AG_ICON_VIEW(priv->chart_list), save_data);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@ -2780,7 +2802,6 @@ ag_window_load_chart_list(AgWindow *window)
|
||||
GError *err = NULL;
|
||||
GList *chart_list = ag_db_chart_get_list(db, &err);
|
||||
|
||||
ag_window_clear_chart_list(window);
|
||||
/* With only a few charts, this should be fine. Maybe implementing lazy
|
||||
* loading would be a better idea. See:
|
||||
* http://blogs.gnome.org/ebassi/documentation/lazy-loading/
|
||||
|
@ -124,26 +124,6 @@
|
||||
</object>
|
||||
<object class="GtkTextBuffer" id="note_buffer">
|
||||
</object>
|
||||
<object class="GtkListStore" id="db_chart_data">
|
||||
<columns>
|
||||
<!-- column-name id -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name uri -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name name -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name secondary-text -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name icon -->
|
||||
<column type="GdkPixbuf"/>
|
||||
<!-- column-name mtime -->
|
||||
<column type="gint64"/>
|
||||
<!-- column-name selected -->
|
||||
<column type="gboolean"/>
|
||||
<!-- column-name pulse -->
|
||||
<column type="guint"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkEntryCompletion" id="country_comp">
|
||||
<property name="inline_completion">True</property>
|
||||
</object>
|
||||
@ -338,8 +318,8 @@
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="action_name">win.selection</property>
|
||||
<property name="label" translatable="yes">Cancel</property>
|
||||
<signal name="clicked" handler="ag_window_selection_mode_cancel_cb" object="AgWindow" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
@ -363,6 +343,21 @@
|
||||
<property name="vexpand">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<signal name="notify::visible-child" handler="ag_window_tab_changed_cb" object="AgWindow" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="tab_list">
|
||||
<child>
|
||||
<object class="AgIconView" id="chart_list">
|
||||
<signal name="item-activated" handler="ag_window_list_item_activated_cb" object="AgWindow" swapped="no"/>
|
||||
<signal name="selection-changed" handler="ag_window_list_selection_changed_cb" object="AgWindow" swapped="no"/>
|
||||
<signal name="notify::mode" handler="ag_window_icon_view_mode_cb" object="AgWindow" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="name">list</property>
|
||||
<property name="title" translatable="yes">Chart list</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkGrid" id="tab_edit">
|
||||
<property name="visible">True</property>
|
||||
|
Loading…
Reference in New Issue
Block a user