[cairo-commit] roadster/src mapinfowindow.c, NONE,
1.1 mapinfowindow.h, NONE, 1.1
Ian McIntosh
commit at pdx.freedesktop.org
Tue Oct 11 20:58:46 PDT 2005
Committed by: ian
Update of /cvs/cairo/roadster/src
In directory gabe:/tmp/cvs-serv27664/src
Added Files:
mapinfowindow.c mapinfowindow.h
Log Message:
* src/mapinfowindow.c:
* src/mapinfowindow.h: Added.
--- NEW FILE: mapinfowindow.c ---
/***************************************************************************
* mapinfowindow.c
*
* Copyright 2005 Ian McIntosh
* ian_mcintosh at linuxadvocate.org
****************************************************************************/
/*
* 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 Library 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.
*/
/*
This is the bar containing current [Country] [State] [City] buttons
*/
#include <gtk/gtk.h>
#include <glade/glade.h>
#include "map.h"
#include "gui.h"
#include "util.h"
#include "db.h"
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
struct {
GtkMenuToolButton* pCountryButton;
GtkMenuToolButton* pStateButton;
GtkMenuToolButton* pCityButton;
GtkLabel* pCountryLabel;
GtkLabel* pStateLabel;
GtkLabel* pCityLabel;
GtkMenu* pCountryMenu;
GtkMenu* pStateMenu;
GtkMenu* pCityMenu;
gint nCurrentCountryID; //
gint nCurrentStateID;
gint nCurrentCityID;
} g_MapInfoWindow = {0};
static void mapinfowindow_load_cities(gint nStateID);
static void mapinfowindow_load_states(gint nCountryID);
static void mapinfowindow_on_country_button_clicked(GtkWidget* _unused, gpointer __unused)
{
if(g_MapInfoWindow.nCurrentCountryID != 0) {
g_debug("recentering on countryID %d", g_MapInfoWindow.nCurrentCountryID);
}
}
static void mapinfowindow_on_state_button_clicked(GtkWidget* _unused, gpointer __unused)
{
if(g_MapInfoWindow.nCurrentStateID != 0) {
g_debug("recentering on StateID %d", g_MapInfoWindow.nCurrentStateID);
}
}
static void mapinfowindow_on_city_button_clicked(GtkWidget* _unused, gpointer __unused)
{
if(g_MapInfoWindow.nCurrentCityID != 0) {
g_debug("recentering on cityID %d", g_MapInfoWindow.nCurrentCityID);
}
}
void mapinfowindow_init(GladeXML* pGladeXML)
{
GLADE_LINK_WIDGET(pGladeXML, g_MapInfoWindow.pCountryButton, GTK_MENU_TOOL_BUTTON, "countrybutton");
GLADE_LINK_WIDGET(pGladeXML, g_MapInfoWindow.pStateButton, GTK_MENU_TOOL_BUTTON, "statebutton");
GLADE_LINK_WIDGET(pGladeXML, g_MapInfoWindow.pCityButton, GTK_MENU_TOOL_BUTTON, "citybutton");
g_MapInfoWindow.pCountryLabel = GTK_LABEL(gtk_label_new("")); gtk_widget_show(GTK_WIDGET(g_MapInfoWindow.pCountryLabel));
g_MapInfoWindow.pStateLabel = GTK_LABEL(gtk_label_new("")); gtk_widget_show(GTK_WIDGET(g_MapInfoWindow.pStateLabel));
g_MapInfoWindow.pCityLabel = GTK_LABEL(gtk_label_new("")); gtk_widget_show(GTK_WIDGET(g_MapInfoWindow.pCityLabel));
gtk_tool_button_set_label_widget(GTK_TOOL_BUTTON(g_MapInfoWindow.pCountryButton), GTK_WIDGET(g_MapInfoWindow.pCountryLabel));
gtk_tool_button_set_label_widget(GTK_TOOL_BUTTON(g_MapInfoWindow.pStateButton), GTK_WIDGET(g_MapInfoWindow.pStateLabel));
gtk_tool_button_set_label_widget(GTK_TOOL_BUTTON(g_MapInfoWindow.pCityButton), GTK_WIDGET(g_MapInfoWindow.pCityLabel));
g_signal_connect(G_OBJECT(g_MapInfoWindow.pCountryButton), "clicked", (GCallback)mapinfowindow_on_country_button_clicked, NULL);
g_signal_connect(G_OBJECT(g_MapInfoWindow.pStateButton), "clicked", (GCallback)mapinfowindow_on_state_button_clicked, NULL);
g_signal_connect(G_OBJECT(g_MapInfoWindow.pCityButton), "clicked", (GCallback)mapinfowindow_on_city_button_clicked, NULL);
g_MapInfoWindow.nCurrentCountryID = -1; //
g_MapInfoWindow.nCurrentStateID = -1;
g_MapInfoWindow.nCurrentCityID = -1;
}
void mapinfowindow_update(const map_t* pMap)
{
// Step 1. Get current country/state/city from map
gint nNewCountryID = 1; // XXX: get these from a hittest?
gint nNewStateID = 0;
gint nNewCityID = 0;
gint nZoomScale = map_get_zoomlevel_scale(pMap);
// Step 2. Set button text and drop-down menus
//
// Update country label
//
if(nNewCountryID != g_MapInfoWindow.nCurrentCountryID) {
// If we are now too high up to have a country selected, we clear the country label and
// hide the state list (of course, the state is 0 too, so
if(nNewCountryID == 0) {
gtk_label_set_markup(g_MapInfoWindow.pCountryLabel, "<i>Country</i>");
// hide state list
gtk_widget_hide(GTK_WIDGET(g_MapInfoWindow.pStateButton));
}
else {
// XXX: Set new country button text
gchar* pszLabel = g_strdup_printf("<b>%s</b>", "United States");
gtk_label_set_markup(g_MapInfoWindow.pCountryLabel, pszLabel);
g_free(pszLabel);
// Update state list
mapinfowindow_load_states(nNewCountryID);
}
g_MapInfoWindow.nCurrentCountryID = nNewCountryID;
}
//
// Update state label
//
if(nNewStateID != g_MapInfoWindow.nCurrentStateID) {
if(nNewStateID == 0) {
gtk_label_set_markup(g_MapInfoWindow.pStateLabel, "<i>State</i>");
// hide city list
gtk_widget_hide(GTK_WIDGET(g_MapInfoWindow.pCityButton));
}
else {
// XXX: Set new state button text
gtk_label_set_markup(g_MapInfoWindow.pStateLabel, "<b>State</b>");
// Update city list
mapinfowindow_load_cities(nNewStateID);
}
g_MapInfoWindow.nCurrentStateID = nNewStateID;
}
//
// Update city label
//
if(nNewCityID != g_MapInfoWindow.nCurrentCityID) {
if(nNewCityID == 0) {
// XXX: Set new city button text
gtk_label_set_markup(g_MapInfoWindow.pCityLabel, "<i>City</i>");
}
else {
// XXX: Set new city button text
gtk_label_set_markup(g_MapInfoWindow.pCityLabel, "<b>City</b>");
}
g_MapInfoWindow.nCurrentCityID = nNewCityID;
}
}
static void mapinfowindow_on_city_chosen(GtkWidget* _unused, gint nCityID)
{
g_debug("centering on CityID %d", nCityID);
}
static void mapinfowindow_on_state_chosen(GtkWidget* _unused, gint nStateID)
{
g_debug("centering on nStateID %d", nStateID);
}
static void mapinfowindow_load_cities(gint nStateID)
{
db_resultset_t* pResultSet = NULL;
db_row_t aRow;
//
// Load up all cities for this state
//
gchar* pszSQL = g_strdup_printf("SELECT City.ID, City.Name FROM City WHERE StateID=%d ORDER BY Name ASC;", nStateID);
db_query(pszSQL, &pResultSet);
g_free(pszSQL);
if(pResultSet == NULL) return;
// New menu
if(g_MapInfoWindow.pCityMenu) {
gtk_widget_destroy(GTK_WIDGET(g_MapInfoWindow.pCityMenu));
}
g_MapInfoWindow.pCityMenu = GTK_MENU(gtk_menu_new());
// Fill menu
while((aRow = db_fetch_row(pResultSet)) != NULL) {
gint nCityID = atoi(aRow[0]);
gchar* pszName = aRow[1];
GtkMenuItem* pNewMenuItem = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(pszName));
g_signal_connect(G_OBJECT(pNewMenuItem), "activate", (GCallback)mapinfowindow_on_city_chosen, (gpointer)nCityID);
gtk_menu_shell_append(GTK_MENU_SHELL(g_MapInfoWindow.pCityMenu), GTK_WIDGET(pNewMenuItem));
}
db_free_result(pResultSet);
// Install new menu
gtk_widget_show_all(GTK_WIDGET(g_MapInfoWindow.pCityMenu));
gtk_menu_tool_button_set_menu(g_MapInfoWindow.pCityButton, GTK_WIDGET(g_MapInfoWindow.pCityMenu));
}
static void mapinfowindow_load_states(gint nCountryID)
{
db_resultset_t* pResultSet = NULL;
db_row_t aRow;
//
// Load up all states for this country
//
gchar* pszSQL = g_strdup_printf("SELECT State.ID, State.Name FROM State WHERE CountryID=%d ORDER BY Name ASC;", nCountryID);
db_query(pszSQL, &pResultSet);
g_free(pszSQL);
if(pResultSet == NULL) return;
// New menu
if(g_MapInfoWindow.pStateMenu) {
gtk_widget_destroy(GTK_WIDGET(g_MapInfoWindow.pStateMenu));
}
g_MapInfoWindow.pStateMenu = GTK_MENU(gtk_menu_new());
// Fill menu
while((aRow = db_fetch_row(pResultSet)) != NULL) {
gint nID = atoi(aRow[0]);
gchar* pszName = aRow[1];
GtkMenuItem* pNewMenuItem = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(pszName));
g_signal_connect(G_OBJECT(pNewMenuItem), "activate", (GCallback)mapinfowindow_on_state_chosen, (gpointer)nID);
gtk_menu_shell_append(GTK_MENU_SHELL(g_MapInfoWindow.pStateMenu), GTK_WIDGET(pNewMenuItem));
}
db_free_result(pResultSet);
// Install new menu
gtk_widget_show_all(GTK_WIDGET(g_MapInfoWindow.pStateMenu));
gtk_menu_tool_button_set_menu(g_MapInfoWindow.pStateButton, GTK_WIDGET(g_MapInfoWindow.pStateMenu));
}
--- NEW FILE: mapinfowindow.h ---
/***************************************************************************
* mapinfowindow.h
*
* Copyright 2005 Ian McIntosh
* ian_mcintosh at linuxadvocate.org
****************************************************************************/
/*
* 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 Library 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.
*/
#ifndef _MAPINFOWINDOW_H_
#define _MAPINFOWINDOW_H_
G_BEGIN_DECLS
#include <gtk/gtk.h>
#include <glade/glade.h>
#include "map.h"
void mapinfowindow_init(GladeXML* pGladeXML);
void mapinfowindow_update(const map_t* pMap);
G_END_DECLS
#endif
More information about the cairo-commit
mailing list