Exemple #1
0
static void
edit_layer_add_ok_callback (GtkWidget *w, gpointer client_data)
{
  EditLayerDialog *dialog = (EditLayerDialog *) client_data;
  Diagram *dia = ddisplay_active_diagram();
  Layer *layer;
  int pos = data_layer_get_index (dia->data, dia->data->active_layer) + 1;
  
  layer = new_layer(g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->name_entry))), dia->data);
  data_add_layer_at(dia->data, layer, pos);
  data_set_active_layer(dia->data, layer);

  diagram_add_update_all(dia);
  diagram_flush(dia);
  
  undo_layer(dia, layer, TYPE_ADD_LAYER, pos);
  undo_set_transactionpoint(dia->undo);

  /* ugly way of updating the layer widget */
  if (layer_dialog && layer_dialog->diagram == dia) {
    layer_dialog_set_diagram(dia);
  }

  gtk_widget_destroy (dialog->dialog);
  g_free (dialog);
}
Exemple #2
0
static void
diagram_properties_update_sensitivity(GtkToggleButton *widget,
				      gpointer userdata)
{
  Diagram *dia = ddisplay_active_diagram();
  gboolean dyn_grid, square_grid, hex_grid;

  if (!dia)
    return; /* safety first */
  
  dia->grid.dynamic =
        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dynamic_check));
  dyn_grid = dia->grid.dynamic;
  if (!dyn_grid)
    dia->grid.hex =
        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hex_check));

  square_grid = !dyn_grid && !dia->grid.hex;
  hex_grid = !dyn_grid && dia->grid.hex;


  gtk_widget_set_sensitive(width_x_entry, square_grid);
  gtk_widget_set_sensitive(width_y_entry, square_grid);
  gtk_widget_set_sensitive(visible_x_entry, square_grid);
  gtk_widget_set_sensitive(visible_y_entry, square_grid);
  gtk_widget_set_sensitive(hex_check, !dyn_grid);
  gtk_widget_set_sensitive(hex_size_entry, hex_grid);
}
Exemple #3
0
static gboolean
_dtv_button_press (GtkWidget      *widget,
		   GdkEventButton *event)
{
  GtkTreeSelection *selection;
  GtkTreeModel     *model;
  GtkTreePath      *path = NULL;
  GtkTreeIter       iter;
  DiaObject        *object;
  Diagram          *diagram;

  if (event->button == 3) {
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
    model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));

    if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), 
					event->x, event->y,
                                        &path, NULL, NULL, NULL)) {
      return TRUE;
    }

    if (gtk_tree_selection_count_selected_rows (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget))) < 2) {
      gtk_tree_selection_unselect_all (selection);
      gtk_tree_selection_select_path (selection, path);

      /* FIXME: for multiple selection we should check all object selected being compatible */
      gtk_tree_model_get_iter (model, &iter, path);
      gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1);
      gtk_tree_path_free (path);
    }

    gtk_menu_popup (DIAGRAM_TREE_VIEW(widget)->popup, NULL, NULL, NULL, NULL, event->button, event->time);

  } else {
    GTK_WIDGET_CLASS (_dtv_parent_class)->button_press_event (widget, event);

    if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), 
					event->x, event->y,
                                        &path, NULL, NULL, NULL)) {
      model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
      gtk_tree_model_get_iter (model, &iter, path);
      gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1);
      gtk_tree_model_get (model, &iter, DIAGRAM_COLUMN, &diagram, -1);

      if (object && diagram && ddisplay_active_diagram() == diagram) {
	if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) /* double-click 'locates' */
	  ddisplay_present_object (ddisplay_active(), object);
      }
      if (diagram)
	g_object_unref(diagram);
      gtk_tree_path_free (path);
    }
  }

  return TRUE;
}
Exemple #4
0
static void
edit_layer_rename_ok_callback (GtkWidget *w, gpointer client_data)
{
  EditLayerDialog *dialog = (EditLayerDialog *) client_data;
  Diagram *dia = ddisplay_active_diagram();
  Layer *layer = dia->data->active_layer;
  
  g_free (layer->name);
  layer->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (dialog->name_entry)));

  diagram_add_update_all(dia);
  diagram_flush(dia);
  /* FIXME: undo handling */

  gtk_widget_destroy (dialog->dialog);
  g_free (dialog);
}
Exemple #5
0
static void
diagram_properties_respond(GtkWidget *widget,
                           gint       response_id,
                           gpointer   user_data)
{
  Diagram *active_diagram = ddisplay_active_diagram();

  if (response_id == GTK_RESPONSE_OK ||
      response_id == GTK_RESPONSE_APPLY) {
    if (active_diagram) {
      active_diagram->grid.dynamic =
        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dynamic_check));
      active_diagram->grid.width_x =
        gtk_spin_button_get_value(GTK_SPIN_BUTTON(width_x_entry));
      active_diagram->grid.width_y =
        gtk_spin_button_get_value(GTK_SPIN_BUTTON(width_y_entry));
      active_diagram->grid.visible_x =
        gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(visible_x_entry));
      active_diagram->grid.visible_y =
        gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(visible_y_entry));
      active_diagram->grid.hex =
        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hex_check));
      active_diagram->grid.hex_size =
        gtk_spin_button_get_value(GTK_SPIN_BUTTON(hex_size_entry));
      dia_color_selector_get_color(bg_colour,
  				 &active_diagram->data->bg_color);
      dia_color_selector_get_color(grid_colour,
  				 &active_diagram->grid.colour);
      dia_color_selector_get_color(pagebreak_colour,
  				 &active_diagram->pagebreak_color);
      diagram_add_update_all(active_diagram);
      diagram_flush(active_diagram);
      diagram_set_modified(active_diagram, TRUE);
    }
  }
  if (response_id != GTK_RESPONSE_APPLY)
    gtk_widget_hide(dialog);
}
Exemple #6
0
static GtkWidget *
file_save_as_dialog_prepare (Diagram *dia, DDisplay *ddisp)
{
  gchar *filename = NULL;

  if (!savedlg) {
    GtkWidget *compressbutton;

    savedlg = gtk_file_chooser_dialog_new(_("Save Diagram"),
					  GTK_WINDOW(ddisp->shell),
					  GTK_FILE_CHOOSER_ACTION_SAVE,
					  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
					  GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
					  NULL);
    /* vfs saving is as easy - if you see 'bad file descriptor' there is
     * something wrong with the permissions of the share ;) */
    gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER(savedlg), FALSE);

    gtk_dialog_set_default_response(GTK_DIALOG(savedlg), GTK_RESPONSE_ACCEPT);
    gtk_window_set_role(GTK_WINDOW(savedlg), "save_diagram");
    /* Need better way to make it a reasonable size.  Isn't there some*/
    /* standard look for them (or is that just Gnome?)*/
    compressbutton = gtk_check_button_new_with_label(_("Compress diagram files"));
    gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(savedlg),
				      compressbutton);
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compressbutton),
				 dia->data->is_compressed);
    g_signal_connect(G_OBJECT(compressbutton), "toggled",
		     G_CALLBACK(toggle_compress_callback), NULL);
    gtk_widget_show(compressbutton);
    gtk_widget_set_tooltip_text (compressbutton,
			 _("Compression reduces file size to less than 1/10th "
			   "size and speeds up loading and saving.  Some text "
			   "programs cannot manipulate compressed files."));
    g_signal_connect (GTK_FILE_CHOOSER(savedlg),
		      "response", G_CALLBACK(file_save_as_response_callback), compressbutton);
    g_signal_connect(G_OBJECT(savedlg), "destroy",
		     G_CALLBACK(gtk_widget_destroyed), &savedlg);
  } else {
    GtkWidget *compressbutton = gtk_file_chooser_get_extra_widget(GTK_FILE_CHOOSER(savedlg));
    gtk_widget_set_sensitive(savedlg, TRUE);
    g_signal_handlers_block_by_func(G_OBJECT(compressbutton), toggle_compress_callback, NULL);
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compressbutton),
				 dia->data->is_compressed);
    g_signal_handlers_unblock_by_func(G_OBJECT(compressbutton), toggle_compress_callback, NULL);
    if (g_object_get_data (G_OBJECT (savedlg), "user_data") != NULL)
      g_object_unref (g_object_get_data (G_OBJECT (savedlg), "user_data"));
#if GTK_CHECK_VERSION(2,20,0)
    if (gtk_widget_get_visible(savedlg)) {
#else
    if (GTK_WIDGET_VISIBLE(savedlg)) {
#endif
      /* keep a refernce to the diagram */
      g_object_ref(dia);
      g_object_set_data (G_OBJECT (savedlg), "user_data", dia);
      gtk_window_present (GTK_WINDOW(savedlg));
      return savedlg;
    }
  }
  if (dia && dia->filename)
    filename = g_filename_from_utf8(dia->filename, -1, NULL, NULL, NULL);
  if (filename != NULL) {
    char* fnabs = dia_get_absolute_filename (filename);
    if (fnabs) {
      gchar *base = g_path_get_basename(dia->filename);
      gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(savedlg), fnabs);
      /* FileChooser api insist on exiting files for set_filename  */
      /* ... and does not use filename encoding on this one. */
      gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(savedlg), base);
      g_free(base);
    }
    g_free(fnabs);
    g_free(filename);
  }
  g_object_ref(dia);
  g_object_set_data (G_OBJECT (savedlg), "user_data", dia);

  return savedlg;
}

/**
 * Respond to the File/Save menu entry.
 *
 * Delegates to Save As if there is no filename set yet.
 */
void
file_save_callback(GtkAction *action)
{
  Diagram *diagram;

  diagram = ddisplay_active_diagram();
  if (!diagram) return;

  if (diagram->unsaved) {
    file_save_as_callback(action);
  } else {
    gchar *filename = g_filename_from_utf8(diagram->filename, -1, NULL, NULL, NULL);
    DiaContext *ctx = dia_context_new (_("Save"));
    diagram_update_extents(diagram);
    if (diagram_save(diagram, filename, ctx))
      recent_file_history_add(filename);
    g_free (filename);
    dia_context_release (ctx);
  }
}