openclonk/src/editor/C4ConsoleGTKDlg.cpp

128 lines
3.7 KiB
C++

/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 2007-2009, RedWolf Design GmbH, http://www.clonk.de/
* Copyright (c) 2010-2016, The OpenClonk Team and contributors
*
* Distributed under the terms of the ISC license; see accompanying file
* "COPYING" for details.
*
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
* See accompanying file "TRADEMARK" for details.
*
* To redistribute this file separately, substitute the full license texts
* for the above references.
*/
/* Common window for drawing and property tool dialogs in console mode */
#include "C4Include.h"
#include "editor/C4ConsoleGTKDlg.h"
#include <gtk/gtk.h>
GtkWidget* C4DevmodeDlg::window = NULL;
GtkWidget* C4DevmodeDlg::notebook = NULL;
int C4DevmodeDlg::x = -1;
int C4DevmodeDlg::y = -1;
namespace
{
gboolean OnDeleteEvent(GtkWidget* widget, gpointer user_data)
{
// Just hide the window, don't destroy it
C4DevmodeDlg::SwitchPage(NULL);
return true;
}
}
void C4DevmodeDlg::OnDestroy(GtkWidget* window, gpointer user_data)
{
C4DevmodeDlg::window = NULL;
C4DevmodeDlg::notebook = NULL;
}
void C4DevmodeDlg::AddPage(GtkWidget* widget, GtkWindow* parent, const char* title)
{
// Create Window if necessary
if (window == NULL)
{
notebook = gtk_notebook_new();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), false);
gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), false);
gtk_widget_show(GTK_WIDGET(notebook));
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(window), notebook);
gtk_window_set_resizable(GTK_WINDOW(window), true);
gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_UTILITY);
gtk_window_set_default_size(GTK_WINDOW(window), 320, 320);
gtk_window_set_role(GTK_WINDOW(window), "toolbox");
gtk_window_set_transient_for(GTK_WINDOW(window), parent);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ON_PARENT);
g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(OnDeleteEvent), NULL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(OnDestroy), NULL);
}
// Add page to notebook
GtkWidget* label = gtk_label_new(title);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), widget, label);
}
void C4DevmodeDlg::RemovePage(GtkWidget* widget)
{
int page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), widget);
assert(page_num != -1); // Make sure it is contained
gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), page_num);
if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)) == 0)
gtk_widget_destroy(window);
}
void C4DevmodeDlg::SwitchPage(GtkWidget* widget)
{
bool is_visible = gtk_widget_get_visible(GTK_WIDGET(window));
// Remember window position
if (window != NULL && is_visible)
gtk_window_get_position(GTK_WINDOW(window), &x, &y);
if (widget != NULL)
{
assert(window != NULL);
// Show required page
int page_num = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), widget);
assert(page_num != -1); // Make sure it is contained
gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page_num);
gtk_window_set_title(GTK_WINDOW(window), gtk_notebook_get_tab_label_text(GTK_NOTEBOOK(notebook), widget));
// Show window if not visible
if (!is_visible)
{
gtk_widget_show(window);
if (x != -1 || y != -1)
gtk_window_move(GTK_WINDOW(window), x, y);
}
}
else
{
if (window != NULL && is_visible)
gtk_widget_hide(window);
}
}
void C4DevmodeDlg::SetTitle(GtkWidget* widget, const char* title)
{
gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(notebook), widget, title);
int page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
if (gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), page_num) == widget)
gtk_window_set_title(GTK_WINDOW(window), title);
}