forked from Mirrors/openclonk
Merge branch 'editor'
commit
bc3754b871
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
BIN
src/res/IFT.bmp
BIN
src/res/IFT.bmp
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 |
|
@ -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"
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
Loading…
Reference in New Issue