?? main.cpp
字號:
/* * main.cpp - главный исходник, с которого собсна все и начинается. * Copyright (C) 2007 lester * * 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 <glib.h>#include <gtk/gtk.h>#include <gdk/gdk.h>#include <gdk-pixbuf/gdk-pixbuf.h> #include <glade/glade.h>#include <gsf/gsf-utils.h>#include <mgl_c.h>#include <stdio.h>#include "globals.h"#include "mathdrawer.h"#include "tree_view.h"#include "add_function_dlg.h"#include "fsio.h"// TODO: перевести все на glib, чтоб он сам дергал юзерпасы//#define GLADE_FILE "bin/Debug/graph.glade"//#define GLADE_FILE "/usr/share/graph/graph.glade"#define GLADE_FILE "data/graph.glade"using namespace std;GladeXML *xml;GtkWidget *win;char *g_filename;bool modified = TRUE;bool new_sheet = TRUE;GtkWidget *splash;GdkPixbuf *image;gbooleansave ();voidupdate_window_title ();gintask_for_save ();voidopen ();gchar *display_open_dlg ();gchar *display_save_dlg ();voidset_new_sheet (const gboolean v){ new_sheet = v; if (v) { g_filename = "Untitled.sheet"; } update_window_title ();}voidset_modified (const bool v){ modified = v; GtkWidget *widget; // хммммм... может лучше хранить поинтеры а не дергать их каждый раз widget = glade_xml_get_widget (xml, "tlb_save_button"); gtk_widget_set_sensitive (widget, v); widget = glade_xml_get_widget (xml, "imagemenuitem3"); gtk_widget_set_sensitive (widget, v);}CDECL voidon_tlb_save_button_clicked (GtkWidget *widget, gpointer data){ save();}CDECL voidon_save_as_menuitem_activate (GtkMenuItem *menuitem, gpointer data){ new_sheet = TRUE; new_sheet = !save();}voidcreate_new_sheet() // создать новый шит. бгггг { gint result = GTK_RESPONSE_NO; if (modified) { result = ask_for_save(); } if (result == GTK_RESPONSE_YES) { save(); result = GTK_RESPONSE_NO; // да я индус. Джими-джими, ача-ача } if (result == GTK_RESPONSE_NO) { graph_new_sheet (); set_new_sheet (TRUE); set_modified (TRUE); graph_render_to_pixbuf (); }}gbooleansave (){ if (new_sheet) { char *filename = display_save_dlg (); if (filename == NULL) return FALSE; g_filename = g_strdup(filename); g_free(filename); update_window_title (); set_new_sheet (FALSE); } fsio_write_functions (g_filename); set_modified (FALSE); return TRUE;}voidopen (){ gint result = GTK_RESPONSE_NO; if (modified && !new_sheet) result = ask_for_save (); if (result == GTK_RESPONSE_YES) save(); if (result == GTK_RESPONSE_NO) { char *filename = display_open_dlg (); if (filename == NULL) return; g_filename = g_strdup(filename); g_free(filename); // чистим все graph_new_sheet (); // создаем функции из файла fsio_read_functions (g_filename); tree_view_fill_items (); graph_render_to_pixbuf (); update_window_title (); set_new_sheet (FALSE); set_modified (FALSE); }}gintask_for_save (){ gint result; GtkWidget *dlg = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Вы хотите сохранить текущий лист?")); gtk_dialog_add_button (GTK_DIALOG(dlg), GTK_STOCK_NO, GTK_RESPONSE_NO); gtk_dialog_add_button (GTK_DIALOG(dlg), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button (GTK_DIALOG(dlg), GTK_STOCK_YES, GTK_RESPONSE_YES); result = gtk_dialog_run (GTK_DIALOG(dlg)); gtk_widget_destroy (dlg); return result;}CDECL voidon_tlb_new_button_clicked (GtkWidget *widget, gpointer data){ create_new_sheet ();}voidupdate_window_title (){ std::string str("Graph - "); str += g_path_get_basename(g_filename); gtk_window_set_title (GTK_WINDOW(win), str.c_str());}gchar *display_open_dlg (){ GtkWidget *dlg = gtk_file_chooser_dialog_new ("Открыть", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); GtkFileFilter *filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, "Лист graph (*.sheet)"); gtk_file_filter_add_pattern (filter, "*.sheet"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dlg), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, _("Все файлы")); gtk_file_filter_add_pattern (filter, "*.*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dlg), filter); //gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dlg), TRUE); gint resp = gtk_dialog_run (GTK_DIALOG(dlg)); gchar *filename = NULL; if (resp == GTK_RESPONSE_OK) { filename = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(dlg)); } gtk_widget_destroy (dlg); return filename;}gchar *display_save_dlg (){ GtkWidget *dlg = gtk_file_chooser_dialog_new ("Сохранить", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); GtkFileFilter *filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, "Лист graph (*.sheet)"); gtk_file_filter_add_pattern (filter, "*.sheet"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dlg), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name (filter, "Все файлы"); gtk_file_filter_add_pattern (filter, "*.*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dlg), filter); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(dlg), g_path_get_basename(g_filename)); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dlg), TRUE); gint resp = gtk_dialog_run (GTK_DIALOG(dlg)); gchar *filename = NULL; if (resp == GTK_RESPONSE_OK) { filename = gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(dlg)); } gtk_widget_destroy (dlg); return filename;}CDECL voidon_tlb_open_button_clicked (GtkWidget *widget, gpointer data){ open();}voiddestroy (){ graph_delete_graph_drawer(); printf ("Graph::I'm completely destroying!");}voidshow_message (void *widget, const gchar *mesg){GtkWidget *msg = gtk_message_dialog_new(GTK_WINDOW(widget), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, mesg); gtk_dialog_run(GTK_DIALOG(msg)); gtk_widget_destroy(msg);}gbooleanon_splash_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data){ GdkGC *gc = gdk_gc_new (splash->window); GdkPixbuf *image = (GdkPixbuf*)data; gdk_pixbuf_render_to_drawable (image, widget->window, gc, 0, 0, -1, -1, 355, 302, GDK_RGB_DITHER_NONE, 0, 0); gdk_gc_destroy (gc); return TRUE; }voidshow_splash (){ splash = gtk_window_new (GTK_WINDOW_POPUP); gtk_widget_set_size_request (splash, 313, 260); gtk_window_set_position( GTK_WINDOW(splash), GTK_WIN_POS_CENTER); gtk_widget_show_all (splash); gtk_window_set_resizable (GTK_WINDOW(splash), FALSE ); image = gdk_pixbuf_new_from_file ("data/splash.png", NULL); g_signal_connect (G_OBJECT(splash), "expose-event", G_CALLBACK(on_splash_expose_event), (gpointer)image); }gbooleanclose_splash (gpointer){ gtk_widget_destroy (splash); gdk_pixbuf_unref (image); return FALSE;}intmain (int argc, char *argv[] ) { gtk_init (&argc, &argv); gsf_init (); xml = glade_xml_new ( GLADE_FILE, NULL, NULL); win = glade_xml_get_widget (xml, "main_window"); glade_xml_signal_autoconnect (xml); set_new_sheet (TRUE); gtk_widget_show_all (win); show_splash (); g_timeout_add_seconds (1, close_splash, NULL); prepare_mathdraw (xml); prepare_tree_view (xml); prepare_function_dlg (xml); gtk_main (); destroy (); return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -