You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spOSMroute/gtk/gtk_main_wnd.c

229 lines
5.9 KiB

/***************************************************************************
* gtk_wnd_main.c
*
* Thu Jul 19 19:00:10 2007
* Copyright 2007 Steffen Pohle
* steffen@gulpe.de
****************************************************************************/
/*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "map.h"
#include "gtk_port.h"
#include "memoryleak.h"
#include "system.h"
#include "routing.h"
GtkWidget *main_wnd;
GtkWidget *statusbar;
GtkWidget *scale;
GtkWidget *positionlon;
GtkWidget *positionlat;
GtkWidget *search;
GtkWidget *progressbar;
GtkToggleAction *gpsenabled;
extern GtkActionGroup *main_menu_ac;
gint status_bar_contextid;
/******************************************************************************
* update stausbar
*/
void gtk_main_wnd_status (char *text, int progress) {
static char oldtext[255];
char sbtext[255];
struct memoryleak_info m;
/* scale */
gtk_combo_box_set_active (GTK_COMBO_BOX(scale), view_scale);
/* progress bar */
if (progress != -2) {
if (progress != -1)
gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progressbar));
else
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progressbar), 1.0);
if (text) strncpy (oldtext, text, 255);
snprintf (sbtext, 255, "%s", oldtext);
gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progressbar), sbtext);
}
/* gps enabled menubutton? */
gtk_toggle_action_set_active (gpsenabled, gps_isrunning ());
ml_get_stats (&m);
};
/*
* scale widget changed.
*/
gboolean main_wnd_search_keyrelease (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
gchar *text;
struct map_search_data msres[16];
int i, j;
if (event->keyval == GDK_Return || event->keyval == GDK_ISO_Enter || event->keyval == GDK_KP_Enter) {
text = gtk_combo_box_get_active_text (GTK_COMBO_BOX(widget));
d_printf ("enter: %s", text);
i = map_search (text, &msres[0], 16);
g_free (text);
if (i > 0) {
for (j = 0; j < i; j++)
d_printf ("res %-2d: c:'%s' n:'%s'", j, msres[j].country, msres[j].name);
}
}
return FALSE;
};
/*
* check if we can quit the programm
*/
static gboolean main_wnd_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {
return FALSE; /* we can quit */
};
/*
* callback function for the cyclic loop
*/
gboolean main_wnd_cyclicloop (gpointer data) {
// d_printf ("%s:%d main_wnd_cyclicloop", __FILE__, __LINE__);
while (gtk_events_pending()) // make sure we handle also other GTK events..
gtk_main_iteration();
app_loop ();
return TRUE;
};
/*
* to make sure the gtk subsystem will quit, without it the
* windows just disapears but the programm is still in memory
*/
void main_wnd_destroy (GtkWidget *widget, gpointer data) {
d_printf ("main_wnd_destroy");
app_shutdown ();
gtk_main_quit ();
};
/**********************************************************************
*
* the main window..
*
*/
/*
* creates the main window
*/
GtkWidget *main_wnd_create () {
GtkWidget *window;
GtkWidget *main_vbox;
GtkWidget *widget;
GtkWidget *box;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(window), _("spOSMroute"));
gtk_window_set_default_size (GTK_WINDOW(window), 600, 400);
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (main_wnd_delete_event), NULL);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (main_wnd_destroy), NULL);
main_vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1);
gtk_container_add (GTK_CONTAINER (window), main_vbox);
/*
* create our menu..
*/
gtk_box_pack_start (GTK_BOX (main_vbox), main_menu_create(window), FALSE, TRUE, 0);
/*
* create the main part of the window (DRAWAREA)
*/
gtk_box_pack_start (GTK_BOX (main_vbox), map_da_create (), TRUE, TRUE, 0);
/*
* create pos, search, scale, progressbar status bar
*/
box = gtk_hbox_new (FALSE, 1);
widget = gtk_vseparator_new();
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 4);
/* progress bar */
progressbar = gtk_progress_bar_new ();
gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR(progressbar), PANGO_ELLIPSIZE_END);
gtk_box_pack_start (GTK_BOX (box), progressbar, TRUE, TRUE, 0);
/* statusbar */
statusbar = gtk_statusbar_new ();
status_bar_contextid = gtk_statusbar_get_context_id (GTK_STATUSBAR (statusbar), "");
gtk_box_pack_start (GTK_BOX (box), statusbar, TRUE, TRUE, 0);
g_timeout_add (10, main_wnd_cyclicloop, 0);
gtk_box_pack_start (GTK_BOX (main_vbox), box, FALSE, TRUE, 0);
colormap = gdk_colormap_get_system ();
draw_init_color ();
return window;
};
/*
* some other usefull functions..
*
*
*/
void widget_change_fontsize (GtkWidget *w, float s) {
PangoFontDescription *pfd;
pfd = pango_context_get_font_description(gtk_widget_get_pango_context(w));
pango_font_description_set_size(pfd, ((int)((float)pango_font_description_get_size (pfd)*(float)s)));
gtk_widget_modify_font(w, pfd);
};
void main_wnd_loop (long long int cur, long long int max) {
static time_t to;
time_t t1;
t1 = time (NULL);
if (to != t1) {
app_status (NULL, 0);
to = t1;
}
if (!gtk_running) return;
while (gtk_events_pending())
gtk_main_iteration();
};
void main_wnd_update () {
if (!gtk_running) return;
while (gtk_events_pending())
gtk_main_iteration();
};