//----------------------------------------------------------------------------- // Copyright 2007 Jonathan Westhues // // This file is part of LDmicro. // // LDmicro 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. // // LDmicro 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 LDmicro. If not, see . //------ // // Dialog for setting the properties of a relay coils: negated or not, // plus the name, plus set-only or reset-only // Jonathan Westhues, Oct 2004 //----------------------------------------------------------------------------- #include #include //#include #include "ldmicro.h" static HWID CoilDialog; static HWID SourceInternalRelayRadio; static HWID SourceMcuPinRadio; static HWID NegatedRadio; static HWID NormalRadio; static HWID SetOnlyRadio; static HWID ResetOnlyRadio; static HWID NameTextbox; static HWID OkButton; static HWID CancelButton; static LONG_PTR PrevNameProc; static HWID CoilGrid; static HWID CoilPackingBox; static bool* tmpnegated; static bool* tmpsetOnly ; static bool* tmpresetOnly; //----------------------------------------------------------------------------- // Don't allow any characters other than A-Za-z0-9_ in the name. //----------------------------------------------------------------------------- void CoilDialogMyNameProc (GtkEditable *editable, gchar *NewText, gint length, gint *position, gpointer data){ for (int i = 0; i < length; i++){ if (!(isalpha (NewText[i]) || NewText[i] == '_' || isdigit (NewText[i]) || NewText[i] == '\b' )){ g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text"); return; } } } static void MakeControls(void) { NormalRadio = gtk_radio_button_new_with_label (NULL, "( ) Normal"); NegatedRadio = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (NormalRadio), "(/) Negated"); SetOnlyRadio = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (NormalRadio), "(S) Set-Only"); ResetOnlyRadio = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (NormalRadio), "(R) Reset-Only"); SourceInternalRelayRadio = gtk_radio_button_new_with_label (NULL, "Internal Relay"); SourceMcuPinRadio = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (SourceInternalRelayRadio), "Pin on MCU"); HWID textLabel = gtk_label_new ("Name:"); NameTextbox = gtk_entry_new(); gtk_entry_set_max_length (GTK_ENTRY (NameTextbox), 0); OkButton = gtk_button_new_with_label ("OK"); CancelButton = gtk_button_new_with_label ("Cancel"); gtk_grid_attach (GTK_GRID (CoilGrid), NormalRadio, 0, 1, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), NegatedRadio, 0, 2, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), SetOnlyRadio, 0, 3, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), ResetOnlyRadio, 0, 4, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), SourceInternalRelayRadio, 1, 1, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), SourceMcuPinRadio, 1, 2, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), textLabel, 1, 4, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), NameTextbox, 2, 4, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), OkButton, 4, 2, 1, 1); gtk_grid_attach (GTK_GRID (CoilGrid), CancelButton, 4, 3, 1, 1); gtk_grid_set_column_spacing (GTK_GRID (CoilGrid), 1); gtk_box_pack_start(GTK_BOX(CoilPackingBox), CoilGrid, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (NameTextbox), "insert-text", G_CALLBACK (CoilDialogMyNameProc), NULL); } void CoilDialogGetData (char* name){ bool* negated = tmpnegated; bool* resetOnly = tmpresetOnly; bool* setOnly = tmpsetOnly; if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (SourceInternalRelayRadio))) { name[0] = 'R'; } else { name[0] = 'Y'; } strcpy (name+1, gtk_entry_get_text (GTK_ENTRY (NameTextbox))); if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (NormalRadio))) { *negated = FALSE; *setOnly = FALSE; *resetOnly = FALSE; } else if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (NegatedRadio))) { *negated = TRUE; *setOnly = FALSE; *resetOnly = FALSE; } else if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (SetOnlyRadio))) { *negated = FALSE; *setOnly = TRUE; *resetOnly = FALSE; } else if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ResetOnlyRadio))){ *negated = FALSE; *setOnly = FALSE; *resetOnly = TRUE; } gtk_widget_set_sensitive (MainWindow, TRUE); DestroyWindow (CoilDialog); ProgramChanged(); } // Mouse click callback void CoilDialogMouseClick (HWID widget, gpointer data){ CoilDialogGetData((char*)data); } // Checks for the required key press gboolean CoilDialogKeyPress (HWID widget, GdkEventKey* event, gpointer data){ if (event -> keyval == GDK_KEY_Return){ CoilDialogGetData((char*)data); } else if (event -> keyval == GDK_KEY_Escape){ DestroyWindow (CoilDialog); ProgramChanged(); gtk_widget_set_sensitive (MainWindow, TRUE); } return FALSE; } // Calls DestroyWindow void CoilCallDestroyWindow (HWID widget, gpointer data){ DestroyWindow (CoilDialog); ProgramChanged(); gtk_widget_set_sensitive (MainWindow, TRUE); } void ShowCoilDialog(BOOL *negated, BOOL *setOnly, BOOL *resetOnly, char *name) { CoilGrid = gtk_grid_new(); CoilPackingBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); CoilDialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(CoilDialog), "Coil"); gtk_window_set_default_size(GTK_WINDOW(CoilDialog), 100, 50); gtk_window_set_resizable (GTK_WINDOW (CoilDialog), FALSE); gtk_container_add(GTK_CONTAINER(CoilDialog), CoilPackingBox); gtk_widget_add_events (CoilDialog, GDK_KEY_PRESS_MASK); gtk_widget_add_events (CoilDialog, GDK_BUTTON_PRESS_MASK); MakeControls(); if(name[0] == 'R') { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SourceInternalRelayRadio), TRUE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SourceMcuPinRadio), TRUE); } gtk_entry_set_text (GTK_ENTRY (NameTextbox), name+1); if(*negated) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (NegatedRadio), TRUE); } else if(*setOnly) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SetOnlyRadio), TRUE); } else if(*resetOnly) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ResetOnlyRadio), TRUE); } else { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (NormalRadio), TRUE); } gtk_widget_set_sensitive (MainWindow, FALSE); gtk_widget_show_all (CoilDialog); gtk_widget_grab_focus (NameTextbox); tmpnegated = negated; tmpresetOnly = resetOnly; tmpsetOnly = setOnly; g_signal_connect (G_OBJECT (CoilDialog), "key-press-event", G_CALLBACK(CoilDialogKeyPress), (gpointer)name); g_signal_connect (G_OBJECT (OkButton), "clicked", G_CALLBACK(CoilDialogMouseClick), (gpointer)name); g_signal_connect (G_OBJECT (CancelButton), "clicked", G_CALLBACK(CoilCallDestroyWindow), NULL); return; }