Merge branch 'editor'

objectmenu
Günther Brammer 2016-01-16 16:00:57 +01:00
commit bc3754b871
16 changed files with 279 additions and 307 deletions

View File

@ -312,18 +312,16 @@ endif()
############################################################################
# generated source files
############################################################################
find_program(GDK_PIXBUF_CSOURCE gdk-pixbuf-csource)
find_program(GLIB_COMPILE_RESOURCES glib-compile-resources)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mape-icons.h
OUTPUT mape-resource.c
COMMAND
${GDK_PIXBUF_CSOURCE} "--raw" "--static" "--build-list"
"mape_icon_ocd" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocd.ico"
"mape_icon_ocf" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocf.ico"
"mape_icon_ocg" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocg.ico"
"mape_icon_ocm" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocm.ico"
"mape_icon_ocs" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocs.ico"
> ${CMAKE_CURRENT_BINARY_DIR}/mape-icons.h
${GLIB_COMPILE_RESOURCES} "--internal" "--generate"
"--target" "mape-resource.c"
"--sourcedir" ${CMAKE_CURRENT_SOURCE_DIR}/src/res
"${CMAKE_CURRENT_SOURCE_DIR}/src/res/mape.xml"
MAIN_DEPENDENCY src/res/mape.xml
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocd.ico
${CMAKE_CURRENT_SOURCE_DIR}/src/res/ocf.ico
@ -334,30 +332,18 @@ add_custom_command(
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/editor-icons.h
OUTPUT engine-resource.c
COMMAND
${GDK_PIXBUF_CSOURCE} "--raw" "--rle" "--static" "--build-list"
"brush_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Brush_Trans.png"
"halt_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Halt_Trans.png"
"picker_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Picker_Trans.png"
"cursor_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Cursor_Trans.png"
"ift_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Ift_Trans.png"
"play_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Play_Trans.png"
"dynamic_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Dynamic_Trans.png"
"line_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Line_Trans.png"
"rect_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Rect_Trans.png"
"exact_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Exact_Trans.png"
"mouse_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Mouse_Trans.png"
"static_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Static_Trans.png"
"fill_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/Fill_Trans.png"
"no_ift_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/NoIft_Trans.png"
> ${CMAKE_CURRENT_BINARY_DIR}/editor-icons.h
${GLIB_COMPILE_RESOURCES} "--internal" "--generate"
"--target" "engine-resource.c"
"--sourcedir" ${CMAKE_CURRENT_SOURCE_DIR}/src/res
"${CMAKE_CURRENT_SOURCE_DIR}/src/res/engine.xml"
MAIN_DEPENDENCY src/res/engine.xml
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Brush_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Halt_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Picker_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Cursor_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Ift_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Play_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Dynamic_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Line_Trans.png
@ -366,17 +352,6 @@ add_custom_command(
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Mouse_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Static_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/Fill_Trans.png
${CMAKE_CURRENT_SOURCE_DIR}/src/res/NoIft_Trans.png
VERBATIM
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/oc-icon.h
COMMAND
${GDK_PIXBUF_CSOURCE} "--raw" "--rle" "--static" "--build-list"
"oc_icon_pixbuf_data" "${CMAKE_CURRENT_SOURCE_DIR}/src/res/oc.ico"
> ${CMAKE_CURRENT_BINARY_DIR}/oc-icon.h
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/src/res/oc.ico
VERBATIM
)
@ -402,8 +377,6 @@ if(APPLE)
src/res/Rect_Trans.png
src/res/Fill_Trans.png
src/res/Picker_Trans.png
src/res/Ift_Trans.png
src/res/NoIft_Trans.png
)
if (CMAKE_GENERATOR STREQUAL Xcode)
@ -871,7 +844,7 @@ set(MAPE_SOURCES
src/mape/texture.h
src/mape/window.c
src/mape/window.h
${CMAKE_CURRENT_BINARY_DIR}/mape-icons.h
mape-resource.c
)
# source files specific to an operating system
@ -924,8 +897,7 @@ if(USE_GTK)
src/platform/C4AppGTK.cpp
src/platform/C4AppGTKImpl.h
src/platform/C4WindowGTK.cpp
${CMAKE_CURRENT_BINARY_DIR}/editor-icons.h
${CMAKE_CURRENT_BINARY_DIR}/oc-icon.h
engine-resource.c
)
elseif(USE_SDL_MAINLOOP)
list(APPEND OC_GUI_SOURCES

View File

@ -173,7 +173,7 @@ Stand = {
<row>
<literal_col>EditCursorCommands</literal_col>
<col>Array</col>
<col>Array of functions made available in the context menu when right-clicking an object in the editor. Functions may be either strings (like "Explode(20)") or function pointers (like this.Hit). Function pointers are always called by name. Windows only.</col>
<col>Array of functions made available in the context menu when right-clicking an object in the editor. Functions may be either strings (like "Explode(20)") or function pointers (like this.Hit). Function pointers are always called by name.</col>
</row>
<row>
<literal_col>BorderBound</literal_col>

View File

@ -43,7 +43,6 @@
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <editor-icons.h>
using namespace OpenFileFlags;
@ -79,14 +78,6 @@ namespace
g_free(text);
return false;
}
GtkWidget* CreateImageFromInlinedPixbuf(const guint8* pixbuf_data)
{
GdkPixbuf* pixbuf = gdk_pixbuf_new_from_inline(-1, pixbuf_data, false, NULL);
GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
g_object_unref(pixbuf);
return image;
}
}
class C4ConsoleGUI::State: public C4ConsoleGUI::InternalState<class C4ConsoleGUI>
@ -125,7 +116,7 @@ public:
GtkWidget* helpAbout;
GtkWidget* lblCursor;
GtkWidget* statusBar;
GtkWidget* lblFrame;
GtkWidget* lblTime;
@ -324,7 +315,7 @@ gboolean C4ConsoleGUI::State::OnPropertyDlgRescrollIdle(gpointer data)
C4Window* C4ConsoleGUI::CreateConsoleWindow(C4AbstractApp* pApp)
{
C4Rect r(0, 0, 320, 320);
C4Rect r(0, 0, 400, 350);
C4Window* retval = C4Window::Init(C4Window::W_Console, pApp, LoadResStr("IDS_CNS_CONSOLE"), &r);
state->InitGUI();
UpdateHaltCtrls(true);
@ -336,12 +327,12 @@ C4Window* C4ConsoleGUI::CreateConsoleWindow(C4AbstractApp* pApp)
void C4ConsoleGUI::State::InitGUI()
{
// ------------ Play/Pause and Mode ---------------------
GtkWidget* image_play = CreateImageFromInlinedPixbuf(play_pixbuf_data);
GtkWidget* image_pause = CreateImageFromInlinedPixbuf(halt_pixbuf_data);
GtkWidget* image_play = gtk_image_new_from_resource("/org/openclonk/engine/Play_Trans.png");
GtkWidget* image_pause = gtk_image_new_from_resource("/org/openclonk/engine/Halt_Trans.png");
GtkWidget* image_mode_play = CreateImageFromInlinedPixbuf(mouse_pixbuf_data);
GtkWidget* image_mode_edit = CreateImageFromInlinedPixbuf(cursor_pixbuf_data);
GtkWidget* image_mode_draw = CreateImageFromInlinedPixbuf(brush_pixbuf_data);
GtkWidget* image_mode_play = gtk_image_new_from_resource("/org/openclonk/engine/Mouse_Trans.png");
GtkWidget* image_mode_edit = gtk_image_new_from_resource("/org/openclonk/engine/Cursor_Trans.png");
GtkWidget* image_mode_draw = gtk_image_new_from_resource("/org/openclonk/engine/Brush_Trans.png");
btnPlay = GTK_WIDGET(gtk_toggle_tool_button_new());
btnHalt = GTK_WIDGET(gtk_toggle_tool_button_new());
@ -355,7 +346,6 @@ void C4ConsoleGUI::State::InitGUI()
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(btnModeEdit), image_mode_edit);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(btnModeDraw), image_mode_draw);
GtkWidget* top_hbox = gtk_toolbar_new();
gtk_toolbar_insert(GTK_TOOLBAR(top_hbox), GTK_TOOL_ITEM(btnPlay), -1);
@ -365,40 +355,24 @@ void C4ConsoleGUI::State::InitGUI()
gtk_toolbar_insert(GTK_TOOLBAR(top_hbox), GTK_TOOL_ITEM(btnModeEdit), -1);
gtk_toolbar_insert(GTK_TOOLBAR(top_hbox), GTK_TOOL_ITEM(btnModeDraw), -1);
lblCursor = gtk_label_new("");
gtk_misc_set_padding(GTK_MISC(lblCursor), 3, 0);
gtk_label_set_ellipsize(GTK_LABEL(lblCursor), PANGO_ELLIPSIZE_END);
GtkToolItem * itmCursor = gtk_tool_item_new();
gtk_tool_item_set_expand(itmCursor, TRUE);
gtk_container_add(GTK_CONTAINER(itmCursor), lblCursor);
gtk_toolbar_insert(GTK_TOOLBAR(top_hbox), itmCursor, -1);
GtkToolItem * itm = gtk_tool_item_new();
gtk_tool_item_set_expand(itm, TRUE);
lblTime = gtk_label_new("00:00:00 (0 FPS)");
gtk_container_add(GTK_CONTAINER(itm), lblTime);
gtk_toolbar_insert(GTK_TOOLBAR(top_hbox), itm, -1);
itm = gtk_tool_item_new();
gtk_tool_item_set_expand(itm, TRUE);
lblFrame = gtk_label_new("Frame: 0");
gtk_container_add(GTK_CONTAINER(itm), lblFrame);
gtk_toolbar_insert(GTK_TOOLBAR(top_hbox), itm, -1);
// ------------ Statusbar ---------------------
GtkWidget* statusbar = gtk_hbox_new(false, 6);
GtkWidget* status_frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(status_frame), GTK_SHADOW_IN);
gtk_container_add(GTK_CONTAINER(status_frame), statusbar);
lblFrame = gtk_label_new("Frame: 0");
lblTime = gtk_label_new("00:00:00 (0 FPS)");
gtk_misc_set_alignment(GTK_MISC(lblFrame), 0.0, 0.5);
gtk_misc_set_alignment(GTK_MISC(lblTime), 0.0, 0.5);
GtkWidget* sep1 = gtk_vseparator_new();
gtk_box_pack_start(GTK_BOX(statusbar), lblFrame, true, true, 0);
gtk_box_pack_start(GTK_BOX(statusbar), sep1, false, false, 0);
gtk_box_pack_start(GTK_BOX(statusbar), lblTime, true, true, 0);
statusBar = gtk_statusbar_new();
// ------------ Log view and script entry ---------------------
GtkWidget* scroll = gtk_scrolled_window_new(NULL, NULL);
// int scrollbar_spacing = 0;
// gtk_widget_style_get (widget, "scrollbar-spacing", &scrollBarSpacing, NULL);
// g_object_set (scroll, "scrollbar-spacing", 0, NULL);
txtLog = gtk_text_view_new();
txtScript = gtk_entry_new();
@ -452,7 +426,6 @@ void C4ConsoleGUI::State::InitGUI()
fileSaveAs = gtk_menu_item_new_with_label(LoadResStr("IDS_MNU_SAVESCENARIOAS"));
gtk_menu_shell_append(GTK_MENU_SHELL(menuFile), fileSaveAs);
fileSaveGameAs = gtk_menu_item_new_with_label(LoadResStr("IDS_MNU_SAVEGAMEAS"));
gtk_menu_shell_append(GTK_MENU_SHELL(menuFile), fileSaveGameAs);
@ -482,13 +455,18 @@ void C4ConsoleGUI::State::InitGUI()
gtk_menu_shell_append(GTK_MENU_SHELL(menuHelp), helpAbout);
// ------------ Window ---------------------
GtkWidget* box = gtk_vbox_new(false, 0);
GtkWidget* box = gtk_grid_new();
gtk_orientable_set_orientation (GTK_ORIENTABLE(box), GTK_ORIENTATION_VERTICAL);
gtk_box_pack_start(GTK_BOX(box), menuBar, false, false, 0);
gtk_box_pack_start(GTK_BOX(box), top_hbox, false, false, 0);
gtk_box_pack_start(GTK_BOX(box), scroll, true, true, 0);
gtk_box_pack_start(GTK_BOX(box), txtScript, false, false, 3);
gtk_box_pack_start(GTK_BOX(box), status_frame, false, false, 0);
gtk_container_add(GTK_CONTAINER(box), menuBar);
gtk_container_add(GTK_CONTAINER(box), top_hbox);
gtk_widget_set_vexpand(scroll, true);
gtk_widget_set_hexpand(scroll, true);
gtk_container_add(GTK_CONTAINER(box), scroll);
gtk_widget_set_margin_top(txtScript, 3);
gtk_widget_set_margin_bottom(txtScript, 3);
gtk_container_add(GTK_CONTAINER(box), txtScript);
gtk_container_add(GTK_CONTAINER(box), statusBar);
gtk_container_add(GTK_CONTAINER(GetOwner()->window), box);
gtk_widget_show_all(GTK_WIDGET(GetOwner()->window));
@ -550,7 +528,7 @@ void C4ConsoleGUI::State::Clear()
helpAbout = NULL;
lblCursor = NULL;
statusBar = NULL;
lblFrame = NULL;
lblTime = NULL;
@ -573,8 +551,9 @@ void C4ConsoleGUI::DisplayInfoText(InfoTextType type, StdStrBuf& text)
switch (type)
{
case CONSOLE_Cursor:
label = state->lblCursor;
break;
gtk_statusbar_pop(GTK_STATUSBAR(state->statusBar), 0);
gtk_statusbar_push(GTK_STATUSBAR(state->statusBar), 0, text.getData());
return;
case CONSOLE_FrameCounter:
label = state->lblFrame;
break;
@ -608,7 +587,7 @@ void C4ConsoleGUI::SetCursor(Cursor cursor)
gdk_window_set_cursor(window_wnd, gdkcursor);
gdk_display_flush(display);
if (cursor)
gdk_cursor_unref (gdkcursor);
g_object_unref (gdkcursor);
}
void C4ConsoleGUI::ClearViewportMenu()
@ -972,7 +951,8 @@ bool C4ConsoleGUI::PropertyDlgOpen()
{
if (state->propertydlg == NULL)
{
GtkWidget * vbox = state->propertydlg = gtk_vbox_new(false, 3);
GtkWidget * vbox = state->propertydlg = gtk_grid_new();
gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox), GTK_ORIENTATION_VERTICAL);
GtkWidget* scrolled_wnd = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_wnd), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
@ -986,8 +966,11 @@ bool C4ConsoleGUI::PropertyDlgOpen()
GtkWidget * entry = state->propertydlg_entry = gtk_entry_new();
gtk_container_add(GTK_CONTAINER(scrolled_wnd), textview);
gtk_box_pack_start(GTK_BOX(vbox), scrolled_wnd, true, true, 0);
gtk_box_pack_start(GTK_BOX(vbox), entry, false, false, 0);
gtk_widget_set_vexpand(scrolled_wnd, true);
gtk_widget_set_hexpand(scrolled_wnd, true);
gtk_container_add(GTK_CONTAINER(vbox), scrolled_wnd);
gtk_widget_set_margin_top(entry, 3);
gtk_container_add(GTK_CONTAINER(vbox), entry);
gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), false);
gtk_text_view_set_left_margin(GTK_TEXT_VIEW(textview), 2);
@ -1082,69 +1065,66 @@ bool C4ToolsDlg::State::Open()
{
if (hbox == NULL)
{
hbox = gtk_hbox_new(false, 12);
GtkWidget* vbox = gtk_vbox_new(false, 6);
hbox = gtk_grid_new();
GtkWidget * toolbar = gtk_toolbar_new();
GtkWidget* image_brush = CreateImageFromInlinedPixbuf(brush_pixbuf_data);
GtkWidget* image_line = CreateImageFromInlinedPixbuf(line_pixbuf_data);
GtkWidget* image_rect = CreateImageFromInlinedPixbuf(rect_pixbuf_data);
GtkWidget* image_fill = CreateImageFromInlinedPixbuf(fill_pixbuf_data);
GtkWidget* image_picker = CreateImageFromInlinedPixbuf(picker_pixbuf_data);
GtkWidget* image_brush = gtk_image_new_from_resource("/org/openclonk/engine/Brush_Trans.png");
GtkWidget* image_line = gtk_image_new_from_resource("/org/openclonk/engine/Line_Trans.png");
GtkWidget* image_rect = gtk_image_new_from_resource("/org/openclonk/engine/Rect_Trans.png");
GtkWidget* image_fill = gtk_image_new_from_resource("/org/openclonk/engine/Fill_Trans.png");
GtkWidget* image_picker = gtk_image_new_from_resource("/org/openclonk/engine/Picker_Trans.png");
GtkWidget* image_dynamic = gtk_image_new_from_resource("/org/openclonk/engine/Dynamic_Trans.png");
GtkWidget* image_static = gtk_image_new_from_resource("/org/openclonk/engine/Static_Trans.png");
GtkWidget* image_exact = gtk_image_new_from_resource("/org/openclonk/engine/Exact_Trans.png");
GtkWidget* image_dynamic = CreateImageFromInlinedPixbuf(dynamic_pixbuf_data);
GtkWidget* image_static = CreateImageFromInlinedPixbuf(static_pixbuf_data);
GtkWidget* image_exact = CreateImageFromInlinedPixbuf(exact_pixbuf_data);
brush = GTK_WIDGET(gtk_toggle_tool_button_new());
line = GTK_WIDGET(gtk_toggle_tool_button_new());
rect = GTK_WIDGET(gtk_toggle_tool_button_new());
fill = GTK_WIDGET(gtk_toggle_tool_button_new());
picker = GTK_WIDGET(gtk_toggle_tool_button_new());
landscape_dynamic = GTK_WIDGET(gtk_toggle_tool_button_new());
landscape_static = GTK_WIDGET(gtk_toggle_tool_button_new());
landscape_exact = GTK_WIDGET(gtk_toggle_tool_button_new());
landscape_dynamic = gtk_toggle_button_new();
landscape_static = gtk_toggle_button_new();
landscape_exact = gtk_toggle_button_new();
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(landscape_dynamic), image_dynamic);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(landscape_static), image_static);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(landscape_exact), image_exact);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(brush), image_brush);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(line), image_line);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(rect), image_rect);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(fill), image_fill);
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(picker), image_picker);
gtk_container_add(GTK_CONTAINER(landscape_dynamic), image_dynamic);
gtk_container_add(GTK_CONTAINER(landscape_static), image_static);
gtk_container_add(GTK_CONTAINER(landscape_exact), image_exact);
gtk_container_add(GTK_CONTAINER(toolbar), landscape_dynamic);
gtk_container_add(GTK_CONTAINER(toolbar), landscape_static);
gtk_container_add(GTK_CONTAINER(toolbar), landscape_exact);
gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(gtk_separator_tool_item_new()));
gtk_container_add(GTK_CONTAINER(toolbar), brush);
gtk_container_add(GTK_CONTAINER(toolbar), line);
gtk_container_add(GTK_CONTAINER(toolbar), rect);
gtk_container_add(GTK_CONTAINER(toolbar), fill);
gtk_container_add(GTK_CONTAINER(toolbar), picker);
gtk_box_pack_start(GTK_BOX(vbox), landscape_dynamic, false, false, 0);
gtk_box_pack_start(GTK_BOX(vbox), landscape_static, false, false, 0);
gtk_box_pack_start(GTK_BOX(vbox), landscape_exact, false, false, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, false, false, 0);
vbox = gtk_vbox_new(false, 12);
gtk_box_pack_start(GTK_BOX(hbox), vbox, true, true, 0);
GtkWidget* local_hbox = gtk_hbox_new(false, 6);
brush = gtk_toggle_button_new();
line = gtk_toggle_button_new();
rect = gtk_toggle_button_new();
fill = gtk_toggle_button_new();
picker = gtk_toggle_button_new();
gtk_container_add(GTK_CONTAINER(brush), image_brush);
gtk_container_add(GTK_CONTAINER(line), image_line);
gtk_container_add(GTK_CONTAINER(rect), image_rect);
gtk_container_add(GTK_CONTAINER(fill), image_fill);
gtk_container_add(GTK_CONTAINER(picker), image_picker);
gtk_box_pack_start(GTK_BOX(local_hbox), brush, false, false, 0);
gtk_box_pack_start(GTK_BOX(local_hbox), line, false, false, 0);
gtk_box_pack_start(GTK_BOX(local_hbox), rect, false, false, 0);
gtk_box_pack_start(GTK_BOX(local_hbox), fill, false, false, 0);
gtk_box_pack_start(GTK_BOX(local_hbox), picker, false, false, 0);
gtk_box_pack_start(GTK_BOX(vbox), local_hbox, false, false, 0);
local_hbox = gtk_hbox_new(false, 12);
gtk_box_pack_start(GTK_BOX(vbox), local_hbox, true, true, 0);
gtk_grid_attach(GTK_GRID(hbox), toolbar, 0, 0, 5, 1);
preview = gtk_image_new();
gtk_box_pack_start(GTK_BOX(local_hbox), preview, false, false, 0);
gtk_widget_set_vexpand(preview, true);
gtk_widget_set_hexpand(preview, true);
gtk_grid_attach(GTK_GRID(hbox), preview, 0, 1, 1, 1);
scale = gtk_vscale_new(NULL);
gtk_box_pack_start(GTK_BOX(local_hbox), scale, false, false, 0);
scale = gtk_scale_new(GTK_ORIENTATION_VERTICAL, NULL);
gtk_widget_set_vexpand(scale, true);
gtk_grid_attach(GTK_GRID(hbox), scale, 1, 1, 1, 1);
vbox = gtk_vbox_new(false, 6);
GtkWidget * grid = gtk_grid_new();
fg_materials = gtk_combo_box_text_new();
fg_textures = gtk_combo_box_text_new();
g_object_set(fg_materials, "margin", 3, NULL);
fg_textures = gtk_combo_box_text_new();
g_object_set(fg_textures, "margin", 3, NULL);
bg_materials = gtk_combo_box_text_new();
bg_textures = gtk_combo_box_text_new();
g_object_set(bg_materials, "margin", 3, NULL);
bg_textures = gtk_combo_box_text_new();
g_object_set(bg_textures, "margin", 3, NULL);
// Link the material combo boxes together, but not the texture combo boxes,
// so that we can sort the texture combo box differently.
@ -1155,23 +1135,33 @@ bool C4ToolsDlg::State::Open()
gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(bg_materials), RowSeparatorFunc, NULL, NULL);
gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(bg_textures), RowSeparatorFunc, NULL, NULL);
GtkWidget* fg_box = gtk_hbox_new(false, 6);
GtkWidget* fg_lbl = gtk_label_new("Foreground:");
gtk_box_pack_start(GTK_BOX(fg_box), fg_lbl, false, false, 0);
gtk_box_pack_start(GTK_BOX(fg_box), fg_materials, true, false, 0);
gtk_box_pack_start(GTK_BOX(fg_box), fg_textures, true, false, 0);
gtk_grid_attach(GTK_GRID(grid), gtk_label_new(LoadResStr("IDS_CTL_MATERIAL")), 1, 0, 1, 1);
gtk_grid_attach(GTK_GRID(grid), gtk_label_new(LoadResStr("IDS_CTL_TEXTURE")), 2, 0, 1, 1);
GtkWidget* fg_lbl = gtk_label_new(LoadResStr("IDS_CTL_FOREGROUND"));
gtk_widget_set_halign(fg_lbl, GTK_ALIGN_END);
#if GTK_CHECK_VERSION(3,12,0)
gtk_widget_set_margin_start(fg_lbl, 3);
#else
gtk_widget_set_margin_left(fg_lbl, 3);
#endif
gtk_grid_attach(GTK_GRID(grid), fg_lbl, 0, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), fg_materials, 1, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), fg_textures, 2, 1, 1, 1);
GtkWidget* bg_box = gtk_hbox_new(false, 6);
GtkWidget* bg_lbl = gtk_label_new("Background:");
gtk_box_pack_start(GTK_BOX(bg_box), bg_lbl, false, false, 0);
gtk_box_pack_start(GTK_BOX(bg_box), bg_materials, true, false, 0);
gtk_box_pack_start(GTK_BOX(bg_box), bg_textures, true, false, 0);
GtkWidget* bg_lbl = gtk_label_new(LoadResStr("IDS_CTL_BACKGROUND"));
gtk_widget_set_halign(bg_lbl, GTK_ALIGN_END);
#if GTK_CHECK_VERSION(3,12,0)
gtk_widget_set_margin_start(bg_lbl, 3);
#else
gtk_widget_set_margin_left(bg_lbl, 3);
#endif
gtk_grid_attach(GTK_GRID(grid), bg_lbl, 0, 2, 1, 1);
gtk_grid_attach(GTK_GRID(grid), bg_materials, 1, 2, 1, 1);
gtk_grid_attach(GTK_GRID(grid), bg_textures, 2, 2, 1, 1);
gtk_box_pack_start(GTK_BOX(vbox), fg_box, false, false, 0);
gtk_box_pack_start(GTK_BOX(vbox), bg_box, false, false, 0);
gtk_grid_attach(GTK_GRID(hbox), grid, 2, 1, 1, 1);
gtk_box_pack_start(GTK_BOX(local_hbox), vbox, true, true, 0); // ???
gtk_widget_show_all(hbox);
C4DevmodeDlg::AddPage(hbox, GTK_WINDOW(Console.window), LoadResStr("IDS_DLG_TOOLS"));
@ -1239,11 +1229,11 @@ void C4ToolsDlg::State::UpdateToolCtrls()
g_signal_handler_block(fill, handlerFill);
g_signal_handler_block(picker, handlerPicker);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(brush), dlg->Tool == C4TLS_Brush);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(line), dlg->Tool == C4TLS_Line);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rect), dlg->Tool == C4TLS_Rect);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fill), dlg->Tool == C4TLS_Fill);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(picker), dlg->Tool == C4TLS_Picker);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(brush), dlg->Tool == C4TLS_Brush);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(line), dlg->Tool == C4TLS_Line);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(rect), dlg->Tool == C4TLS_Rect);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(fill), dlg->Tool == C4TLS_Fill);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(picker), dlg->Tool == C4TLS_Picker);
g_signal_handler_unblock(brush, handlerBrush);
g_signal_handler_unblock(line, handlerLine);
@ -1318,20 +1308,16 @@ void C4ToolsDlg::NeedPreviewUpdate()
void C4ToolsDlg::State::UpdatePreview()
{
if (!hbox) return;
if (!gtk_widget_is_sensitive(preview)) return;
C4ToolsDlg* dlg = GetOwner();
C4Surface * sfcPreview;
int32_t iPrvWdt,iPrvHgt;
/* TODO: Set size request for image to read size from image's size request? */
iPrvWdt=64;
iPrvHgt=64;
if (!(sfcPreview=new C4Surface(iPrvWdt,iPrvHgt,0))) return;
int width = gtk_widget_get_allocated_width(preview);
int height = gtk_widget_get_allocated_height(preview);
width = std::min(width, dlg->Grade * 2);
height = std::min(height, dlg->Grade * 2);
// fill bg
BYTE bCol = 0;
C4Pattern Pattern;
// Sky material: sky as pattern only
if (SEqual(dlg->Material,C4TLS_MatSky))
@ -1341,7 +1327,6 @@ void C4ToolsDlg::State::UpdatePreview()
// Material-Texture
else
{
bCol=Mat2PixColDefault(::MaterialMap.Get(dlg->Material));
// Get/Create TexMap entry
BYTE iTex = ::TextureMap.GetIndex(dlg->Material, dlg->Texture, true);
if (iTex)
@ -1356,29 +1341,27 @@ void C4ToolsDlg::State::UpdatePreview()
}
}
}
if (gtk_widget_is_sensitive(preview))
pDraw->DrawPatternedCircle( sfcPreview,
iPrvWdt/2,iPrvHgt/2,
dlg->Grade,
bCol, Pattern, *::Landscape.GetPal());
// TODO: Can we optimize this?
GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, 64, 64);
guchar* data = gdk_pixbuf_get_pixels(pixbuf);
sfcPreview->Lock();
for (int x = 0; x < 64; ++ x) for (int y = 0; y < 64; ++ y)
// Copy the texture into a circle in a cairo surface
// TODO: Apply zoom factor to the circle size
cairo_surface_t * surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
cairo_surface_flush(surface);
unsigned char * data = cairo_image_surface_get_data(surface);
int stride = cairo_image_surface_get_stride(surface);
int x = width/2, y = height/2, r = dlg->Grade;
for (int ycnt = -std::min(r, height); ycnt < std::min(r, height - y); ycnt++)
{
int lwdt = (int)sqrt(float(r * r - ycnt * ycnt));
for (int xcnt = std::max(x - lwdt, 0); xcnt < std::min(x + lwdt, width); ++xcnt)
{
DWORD dw = sfcPreview->GetPixDw(x, y, true);
*data = (dw >> 16) & 0xff; ++ data;
*data = (dw >> 8 ) & 0xff; ++ data;
*data = (dw ) & 0xff; ++ data;
*data = (dw >> 24) & 0xff; ++ data;
DWORD * pix = reinterpret_cast<DWORD *>(data + xcnt * 4 + (y + ycnt) * stride);
*pix = Pattern.PatternClr(xcnt, y + ycnt);
}
sfcPreview->Unlock();
gtk_image_set_from_pixbuf(GTK_IMAGE(preview), pixbuf);
g_object_unref(pixbuf);
delete sfcPreview;
}
cairo_surface_mark_dirty(surface);
gtk_image_set_from_surface(GTK_IMAGE(preview), surface);
cairo_surface_destroy(surface);
}
void C4ToolsDlg::UpdateLandscapeModeCtrls()
@ -1393,13 +1376,13 @@ void C4ToolsDlg::State::UpdateLandscapeModeCtrls()
g_signal_handler_block(landscape_static, handlerStatic);
g_signal_handler_block(landscape_exact, handlerExact);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(landscape_dynamic), iMode==C4LSC_Dynamic);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(landscape_dynamic), iMode==C4LSC_Dynamic);
gtk_widget_set_sensitive(landscape_dynamic, iMode==C4LSC_Dynamic);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(landscape_static), iMode==C4LSC_Static);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(landscape_static), iMode==C4LSC_Static);
gtk_widget_set_sensitive(landscape_static, ::Landscape.HasMap());
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(landscape_exact), iMode==C4LSC_Exact);
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(landscape_exact), iMode==C4LSC_Exact);
g_signal_handler_unblock(landscape_dynamic, handlerDynamic);
g_signal_handler_unblock(landscape_static, handlerStatic);

View File

@ -733,6 +733,27 @@ void C4EditCursor::ApplyToolFill()
EMControl(CID_EMDrawTool, new C4ControlEMDrawTool(EMDT_Fill, ::Landscape.Mode, X,Y,0,Y2, pTools->Grade, pTools->Material, NULL, NULL, NULL));
}
void C4EditCursor::AppendMenuItem(int num, const StdStrBuf & label)
{
#ifdef USE_WIN32_WINDOWS
itemsObjselect[num].ItemId = IDM_VPORTDYN_FIRST + num;
if (num)
AppendMenu(GetSubMenu(hMenu,0), MF_STRING, IDM_VPORTDYN_FIRST + num, label.GetWideChar());
else
AppendMenu(GetSubMenu(hMenu,0), MF_SEPARATOR, IDM_VPORTDYN_FIRST, NULL);
#elif defined(WITH_DEVELOPER_MODE)
GtkWidget * wdg;
if (num)
wdg = gtk_menu_item_new_with_label(label.getData());
else
wdg = gtk_separator_menu_item_new();
itemsObjselect[num].MenuItem = wdg;
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), wdg);
if (num)
g_signal_connect(G_OBJECT(wdg), "activate", G_CALLBACK(OnObjselect), &itemsObjselect[num]);
#endif
}
bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
{
bool fObjectSelected = !!Selection.ObjectCount();
@ -745,6 +766,11 @@ bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
SetMenuItemText(hContext,IDM_VIEWPORT_DELETE,LoadResStr("IDS_MNU_DELETE"));
SetMenuItemText(hContext,IDM_VIEWPORT_DUPLICATE,LoadResStr("IDS_MNU_DUPLICATE"));
SetMenuItemText(hContext,IDM_VIEWPORT_CONTENTS,LoadResStr("IDS_MNU_CONTENTS"));
#elif defined(WITH_DEVELOPER_MODE)
gtk_widget_set_sensitive(itemDelete, fObjectSelected && Console.Editing);
gtk_widget_set_sensitive(itemDuplicate, fObjectSelected && Console.Editing);
gtk_widget_set_sensitive(itemGrabContents, fObjectSelected && Selection.GetObject()->Contents.ObjectCount() && Console.Editing);
#endif
// Add selection and custom command entries for any objects at the cursor
ObjselectDelItems(); // clear previous entries
@ -761,16 +787,20 @@ bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
C4ValueArray *custom_commands = pObj->GetPropertyArray(P_EditCursorCommands);
if (custom_commands) entrycount += custom_commands->GetSize();
}
#ifdef USE_WIN32_WINDOWS
// If too many entries would be shown, add a "..." in the end
const int maxentries = 25; // Maximum displayed objects. if you raise it, also change note with IDM_VPORTDYN_FIRST in resource.h
bool has_too_many_entries = (entrycount > maxentries);
if (has_too_many_entries) entrycount = maxentries + 1;
#else
const int maxentries = std::numeric_limits<int>::max();
#endif
itemsObjselect.resize(entrycount + 1); // +1 for a separator
// Add a separator bar
itemsObjselect[0].ItemId = IDM_VPORTDYN_FIRST;
itemsObjselect[0].Object = NULL;
itemsObjselect[0].Command.Clear();
AppendMenu(hContext, MF_SEPARATOR, IDM_VPORTDYN_FIRST, NULL);
itemsObjselect[0].EditCursor = this;
AppendMenuItem(0, StdStrBuf());
// Add all objects
int i_entry = 0;
for (int i_item = 0; i_item < itemcount; ++i_item)
@ -778,10 +808,12 @@ bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
++i_entry; if (i_entry >= maxentries) break;
// Add selection entry
C4Object *obj = (*atcursor)[i_item].getObj();
itemsObjselect[i_entry].ItemId = IDM_VPORTDYN_FIRST + i_entry;
assert(obj);
itemsObjselect[i_entry].Object = obj;
itemsObjselect[i_entry].Command.Clear();
AppendMenu(hContext, MF_STRING, IDM_VPORTDYN_FIRST + i_entry, FormatString("%s #%i (%i/%i)", obj->GetName(), obj->Number, obj->GetX(), obj->GetY()).GetWideChar());
itemsObjselect[i_entry].EditCursor = this;
AppendMenuItem(i_entry, FormatString("%s #%i (%i/%i)", obj->GetName(), obj->Number, obj->GetX(), obj->GetY()));
// Add custom command entries
C4ValueArray *custom_commands = obj->GetPropertyArray(P_EditCursorCommands);
if (custom_commands) for (int i_cmd = 0; i_cmd < custom_commands->GetSize(); ++i_cmd)
@ -796,18 +828,14 @@ bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
custom_command_szstr.Copy(custom_command_string->GetData()); // copy just in case script get reloaded inbetween
if (custom_command_szstr.getLength())
{
itemsObjselect[i_entry].ItemId = IDM_VPORTDYN_FIRST + i_entry;
itemsObjselect[i_entry].Object = obj;
itemsObjselect[i_entry].Command.Take(custom_command_szstr);
AppendMenu(hContext, MF_STRING, IDM_VPORTDYN_FIRST + i_entry, FormatString("%s->%s", obj->GetName(), custom_command_szstr.getData()).GetWideChar());
}
else
{
// invalid entry in commands list. do not create a menu item.
itemsObjselect[i_entry].ItemId = 0;
itemsObjselect[i_entry].Command.Take(custom_command_szstr);
itemsObjselect[i_entry].EditCursor = this;
AppendMenuItem(i_entry, FormatString("%s->%s", obj->GetName(), custom_command_szstr.getData()));
}
}
}
#ifdef USE_WIN32_WINDOWS
if (has_too_many_entries)
{
AppendMenu(hContext, MF_GRAYED, IDM_VPORTDYN_FIRST + maxentries + 1, L"...");
@ -815,9 +843,11 @@ bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
itemsObjselect[maxentries + 1].Object = NULL;
itemsObjselect[maxentries + 1].Command.Clear();
}
#endif
}
delete atcursor;
#ifdef USE_WIN32_WINDOWS
int32_t iItem = TrackPopupMenu(
hContext,
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_NONOTIFY,
@ -843,40 +873,9 @@ bool C4EditCursor::DoContextMenu(DWORD dwKeyState)
break;
}
ObjselectDelItems();
#else
#ifdef WITH_DEVELOPER_MODE
gtk_widget_set_sensitive(itemDelete, fObjectSelected && Console.Editing);
gtk_widget_set_sensitive(itemDuplicate, fObjectSelected && Console.Editing);
gtk_widget_set_sensitive(itemGrabContents, fObjectSelected && Selection.GetObject()->Contents.ObjectCount() && Console.Editing);
ObjselectDelItems();
C4FindObjectAtPoint pFO(X,Y);
C4ValueArray * atcursor; atcursor = pFO.FindMany(::Objects, ::Objects.Sectors); // needs freeing
int itemcount = atcursor->GetSize();
if(itemcount > 0)
{
itemsObjselect.resize(itemcount+1); // +1 for a separator
itemsObjselect[0].MenuItem = gtk_separator_menu_item_new();
itemsObjselect[0].EditCursor = this;
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), itemsObjselect[0].MenuItem);
int i = 0;
for(std::vector<ObjselItemDt>::iterator it = itemsObjselect.begin() + 1; it != itemsObjselect.end(); ++it, ++i)
{
it->EditCursor = this;
C4Object * obj = (*atcursor)[i].getObj();
assert(obj);
it->Object = obj;
GtkWidget * wdg = gtk_menu_item_new_with_label(FormatString("%s #%i (%i/%i)", obj->GetName(), obj->Number, obj->GetX(), obj->GetY()).getData());
it->MenuItem = wdg;
gtk_menu_shell_append(GTK_MENU_SHELL(menuContext), wdg);
g_signal_connect(G_OBJECT(wdg), "activate", G_CALLBACK(OnObjselect), &*it);
}
}
delete atcursor;
#elif defined(WITH_DEVELOPER_MODE)
gtk_widget_show_all(menuContext);
gtk_menu_popup(GTK_MENU(menuContext), NULL, NULL, NULL, NULL, 3, 0);
#endif
gtk_menu_popup(GTK_MENU(menuContext), NULL, NULL, NULL, NULL, 3, gtk_get_current_event_time());
#endif
return true;
}
@ -1066,9 +1065,12 @@ void C4EditCursor::OnObjselect(GtkWidget* widget, gpointer data)
gdk_event_free(event);
}
static_cast<ObjselItemDt*>(data)->EditCursor->DoContextObjsel(static_cast<ObjselItemDt*>(data)->Object, !IsShiftDown);
static_cast<ObjselItemDt*>(data)->EditCursor->ObjselectDelItems();
ObjselItemDt* it = static_cast<ObjselItemDt*>(data);
if (it->Command.getLength())
it->EditCursor->DoContextObjCommand(it->Object, it->Command.getData());
else
it->EditCursor->DoContextObjsel(it->Object, !IsShiftDown);
it->EditCursor->ObjselectDelItems();
}
#endif

View File

@ -97,6 +97,7 @@ protected:
void ToolFailure();
void PutContents();
void UpdateDropTarget(DWORD dwKeyState);
void AppendMenuItem(int num, const StdStrBuf & label);
bool DoContextMenu(DWORD dwKeyState);
void ApplyToolFill();
void ApplyToolRect();

View File

@ -776,9 +776,7 @@ void C4ObjectListDlg::Open()
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(OnDestroy), this);
// The VBox and Tree
GtkWidget* vbox = gtk_vbox_new(false, 8);
// The Tree
GtkWidget* scrolled_wnd = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_wnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_wnd), GTK_SHADOW_IN);
@ -809,9 +807,10 @@ void C4ObjectListDlg::Open()
g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(OnSelectionChanged), this);
gtk_container_add(GTK_CONTAINER(scrolled_wnd), treeview);
gtk_box_pack_start(GTK_BOX(vbox), scrolled_wnd, true, true, 0);
gtk_widget_set_vexpand(scrolled_wnd, true);
gtk_widget_set_hexpand(scrolled_wnd, true);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_container_add(GTK_CONTAINER(window), scrolled_wnd);
gtk_widget_show_all(window);
}

View File

@ -17,7 +17,6 @@
#include <gtk/gtk.h>
#include "mape/fileicon.h"
#include "mape-icons.h" // Generated file
static MapeFileIcon* mape_file_icon_new(GtkWidget* widget,
MapeFileIconType type)
@ -26,6 +25,7 @@ static MapeFileIcon* mape_file_icon_new(GtkWidget* widget,
GdkPixbuf* pixbuf;
gint width, height;
GdkPixbuf* scaled_pixbuf;
GError *error = 0;
switch(type)
{
@ -46,49 +46,29 @@ static MapeFileIcon* mape_file_icon_new(GtkWidget* widget,
);
break;
case MAPE_FILE_ICON_C4OBJECT:
pixbuf = gdk_pixbuf_new_from_inline(
-1,
mape_icon_ocd,
FALSE,
NULL
);
pixbuf = gdk_pixbuf_new_from_resource("/org/openclonk/mape/ocd.ico", &error);
break;
case MAPE_FILE_ICON_C4FOLDER:
pixbuf = gdk_pixbuf_new_from_inline(
-1,
mape_icon_ocf,
FALSE,
NULL
);
pixbuf = gdk_pixbuf_new_from_resource("/org/openclonk/mape/ocf.ico", &error);
break;
case MAPE_FILE_ICON_C4GROUP:
pixbuf = gdk_pixbuf_new_from_inline(
-1,
mape_icon_ocg,
FALSE,
NULL
);
pixbuf = gdk_pixbuf_new_from_resource("/org/openclonk/mape/ocg.ico", &error);
break;
case MAPE_FILE_ICON_C4SCENARIO:
pixbuf = gdk_pixbuf_new_from_inline(
-1,
mape_icon_ocs,
FALSE,
NULL
);
pixbuf = gdk_pixbuf_new_from_resource("/org/openclonk/mape/ocs.ico", &error);
break;
case MAPE_FILE_ICON_C4MATERIAL:
pixbuf = gdk_pixbuf_new_from_inline(
-1,
mape_icon_ocm,
FALSE,
NULL
);
pixbuf = gdk_pixbuf_new_from_resource("/org/openclonk/mape/ocm.ico", &error);
break;
default:
g_assert_not_reached();
break;
}
if (error)
{
fprintf (stderr, "Unable to create icon: %s\n", error->message);
g_error_free (error);
}
if(pixbuf == NULL)
return NULL;

View File

@ -34,8 +34,6 @@
#include <gdk/gdkx.h>
#endif
#include <oc-icon.h>
#include "C4AppGTKImpl.h"
C4AbstractApp::C4AbstractApp(): Active(false), fQuitMsgReceived(false),
@ -60,7 +58,7 @@ bool C4AbstractApp::Init(int argc, char * argv[])
setlocale(LC_ALL,"");
gtk_init(&argc, &argv);
GdkPixbuf* icon = gdk_pixbuf_new_from_inline(-1, oc_icon_pixbuf_data, false, NULL);
GdkPixbuf* icon = gdk_pixbuf_new_from_resource("/org/openclonk/engine/oc.ico", NULL);
gtk_window_set_default_icon(icon);
g_object_unref(icon);
// Try to figure out the location of the executable

View File

@ -616,12 +616,15 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
// Cannot just use ScrolledWindow because this would just move
// the GdkWindow of the DrawingArea.
GtkWidget* table;
GtkWidget* table = gtk_grid_new();
render_widget = gtk_drawing_area_new();
vw->h_scrollbar = gtk_hscrollbar_new(NULL);
vw->v_scrollbar = gtk_vscrollbar_new(NULL);
table = gtk_table_new(2, 2, false);
gtk_widget_set_hexpand(GTK_WIDGET(render_widget), true);
gtk_widget_set_vexpand(GTK_WIDGET(render_widget), true);
gtk_grid_attach(GTK_GRID(table), GTK_WIDGET(render_widget), 0, 0, 1, 1);
vw->h_scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, NULL);
gtk_grid_attach(GTK_GRID(table), vw->h_scrollbar, 0, 1, 1, 1);
vw->v_scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL);
gtk_grid_attach(GTK_GRID(table), vw->v_scrollbar, 1, 0, 1, 1);
GtkAdjustment* adjustment = gtk_range_get_adjustment(GTK_RANGE(vw->h_scrollbar));
@ -641,10 +644,6 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
this
);
gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(render_widget), 0, 1, 0, 1, static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), 0, 0);
gtk_table_attach(GTK_TABLE(table), vw->v_scrollbar, 1, 2, 0, 1, GTK_SHRINK, static_cast<GtkAttachOptions>(GTK_FILL | GTK_EXPAND), 0, 0);
gtk_table_attach(GTK_TABLE(table), vw->h_scrollbar, 0, 1, 1, 2, static_cast<GtkAttachOptions>(GTK_EXPAND | GTK_FILL), GTK_SHRINK, 0, 0);
gtk_container_add(GTK_CONTAINER(window), table);
gtk_widget_add_events(GTK_WIDGET(window), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK | GDK_POINTER_MOTION_MASK);
@ -665,11 +664,15 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
g_signal_connect_after(G_OBJECT(render_widget), "configure-event", G_CALLBACK(OnConfigureDareaStatic), this);
#if !GTK_CHECK_VERSION(3,10,0)
// do not draw the default background
gtk_widget_set_double_buffered (GTK_WIDGET(render_widget), false);
#endif
gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(Console.window));
#if !GTK_CHECK_VERSION(3,14,0)
gtk_window_set_has_resize_grip(GTK_WINDOW(window), false);
#endif
}
else if (windowKind == W_Fullscreen)
{
@ -687,7 +690,9 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
g_signal_connect(G_OBJECT(window), "key-release-event", G_CALLBACK(OnKeyRelease), this);
g_signal_connect(G_OBJECT(window), "scroll-event", G_CALLBACK(OnScroll), this);
gtk_widget_add_events(GTK_WIDGET(window), GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
#if !GTK_CHECK_VERSION(3,10,0)
gtk_widget_set_double_buffered (GTK_WIDGET(render_widget), false);
#endif
GValue val = {0,{{0}}};
g_value_init (&val, G_TYPE_BOOLEAN);
@ -695,7 +700,9 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
g_object_set_property (G_OBJECT (render_widget), "can-focus", &val);
g_object_set_property (G_OBJECT (window), "can-focus", &val);
g_value_unset (&val);
#if !GTK_CHECK_VERSION(3,14,0)
gtk_window_set_has_resize_grip(GTK_WINDOW(window), false);
#endif
}
else if (windowKind == W_GuiWindow)
{
@ -707,7 +714,9 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
g_signal_connect(G_OBJECT(window), "scroll-event", G_CALLBACK(OnScroll), this);
gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(Console.window));
#if !GTK_CHECK_VERSION(3,14,0)
gtk_window_set_has_resize_grip(GTK_WINDOW(window), false);
#endif
}
else if (windowKind == W_Console)
{
@ -779,7 +788,8 @@ C4Window* C4Window::Init(WindowKind windowKind, C4AbstractApp * pApp, const char
gdk_flush();
if (windowKind == W_Fullscreen)
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(render_widget)), gdk_cursor_new(GDK_BLANK_CURSOR));
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(render_widget)),
gdk_cursor_new_for_display(gdk_display_get_default(), GDK_BLANK_CURSOR));
return this;
}
@ -809,7 +819,9 @@ bool C4Window::ReInit(C4AbstractApp* pApp)
// remains hidden afterwards. So we re-create it from scratch.
gtk_widget_destroy(GTK_WIDGET(render_widget));
render_widget = gtk_drawing_area_new();
#if !GTK_CHECK_VERSION(3,10,0)
gtk_widget_set_double_buffered (GTK_WIDGET(render_widget), false);
#endif
g_object_set(G_OBJECT(render_widget), "can-focus", TRUE, NULL);
gtk_widget_set_visual(GTK_WIDGET(render_widget),vis);
@ -832,7 +844,8 @@ bool C4Window::ReInit(C4AbstractApp* pApp)
}
gdk_flush();
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(render_widget)), gdk_cursor_new(GDK_BLANK_CURSOR));
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(render_widget)),
gdk_cursor_new_for_display(gdk_display_get_default(), GDK_BLANK_CURSOR));
return true;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 B

View File

@ -212,8 +212,6 @@ IDB_BRUSH2 BITMAP DISCARDABLE "Brush2.bmp"
IDB_FILL BITMAP DISCARDABLE "Fill.bmp"
IDB_LINE BITMAP DISCARDABLE "Line.bmp"
IDB_RECT BITMAP DISCARDABLE "Rectangle.bmp"
IDB_NOIFT BITMAP DISCARDABLE "NoIFT.bmp"
IDB_IFT BITMAP DISCARDABLE "IFT.bmp"
IDB_MOUSE BITMAP DISCARDABLE "mouse.bmp"
IDB_MOUSE2 BITMAP DISCARDABLE "mouse1.bmp"
IDB_DYNAMIC BITMAP DISCARDABLE "ift1.bmp"

17
src/res/engine.xml 100644
View File

@ -0,0 +1,17 @@
<gresources>
<gresource prefix="/org/openclonk/engine">
<file preprocess="to-pixdata">oc.ico</file>
<file preprocess="to-pixdata">Brush_Trans.png</file>
<file preprocess="to-pixdata">Halt_Trans.png</file>
<file preprocess="to-pixdata">Picker_Trans.png</file>
<file preprocess="to-pixdata">Cursor_Trans.png</file>
<file preprocess="to-pixdata">Play_Trans.png</file>
<file preprocess="to-pixdata">Dynamic_Trans.png</file>
<file preprocess="to-pixdata">Line_Trans.png</file>
<file preprocess="to-pixdata">Rect_Trans.png</file>
<file preprocess="to-pixdata">Exact_Trans.png</file>
<file preprocess="to-pixdata">Mouse_Trans.png</file>
<file preprocess="to-pixdata">Static_Trans.png</file>
<file preprocess="to-pixdata">Fill_Trans.png</file>
</gresource>
</gresources>

9
src/res/mape.xml 100644
View File

@ -0,0 +1,9 @@
<gresources>
<gresource prefix="/org/openclonk/mape">
<file preprocess="to-pixdata">ocd.ico</file>
<file preprocess="to-pixdata">ocf.ico</file>
<file preprocess="to-pixdata">ocg.ico</file>
<file preprocess="to-pixdata">ocm.ico</file>
<file preprocess="to-pixdata">ocs.ico</file>
</gresource>
</gresources>