diff --git a/Gtk4_Reset/CMakeLists.txt b/Gtk4_Reset/CMakeLists.txt index 2086f21..b84f452 100644 --- a/Gtk4_Reset/CMakeLists.txt +++ b/Gtk4_Reset/CMakeLists.txt @@ -28,7 +28,8 @@ set(SOURCES src/core/main.cpp src/core/MainWin.cpp src/core/MyStack.cpp src/ui/AppView.cpp src/file_app/FileColumnView.cpp src/file_app/FileGridView.cpp src/file_app/FileWindow.cpp src/game_app/GameApp.cpp src/calc_app/calc.cpp src/calc_app/CalcApp.cpp src/run_app/RunApp.cpp src/draw_app/DrawApp.cpp - src/game24_app/Game24.cpp src/game24_app/Game24App.cpp) + src/game24_app/Game24.cpp src/game24_app/Game24App.cpp src/text_app/TextEditor.cpp + src/image_app/ImageApp.cpp) #Compile resources with GCR_CMake diff --git a/Gtk4_Reset/src/apps/DrawApp.h b/Gtk4_Reset/src/apps/DrawApp.h index 95215c2..225adf4 100644 --- a/Gtk4_Reset/src/apps/DrawApp.h +++ b/Gtk4_Reset/src/apps/DrawApp.h @@ -2,3 +2,6 @@ #include +G_DECLARE_FINAL_TYPE(DrawApp, draw_app, DRAW, APP, GtkWindow) + +DrawApp *draw_app_new(); diff --git a/Gtk4_Reset/src/apps/ImageApp.h b/Gtk4_Reset/src/apps/ImageApp.h new file mode 100644 index 0000000..8a4f2e1 --- /dev/null +++ b/Gtk4_Reset/src/apps/ImageApp.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(ImageApp, image_app, IMAGE, APP, GtkApplicationWindow) + +ImageApp *image_app_new(); \ No newline at end of file diff --git a/Gtk4_Reset/src/apps/TextEditor.h b/Gtk4_Reset/src/apps/TextEditor.h new file mode 100644 index 0000000..69fc9b0 --- /dev/null +++ b/Gtk4_Reset/src/apps/TextEditor.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(TextEditor, text_editor, TEXT, EDITOR, GtkApplicationWindow) + +TextEditor *text_editor_new(); diff --git a/Gtk4_Reset/src/draw_app/DrawApp.cpp b/Gtk4_Reset/src/draw_app/DrawApp.cpp index 7c06999..77c1833 100644 --- a/Gtk4_Reset/src/draw_app/DrawApp.cpp +++ b/Gtk4_Reset/src/draw_app/DrawApp.cpp @@ -1 +1,33 @@ -#include "DrawApp.h" \ No newline at end of file +#include "DrawApp.h" + +struct _DrawApp{ + GtkWindow parent_instance; + + // Child widgets + GtkWidget *draw_area; + GtkWidget *color_btn, *fill_btn; + GtkWidget *fill_check; + GtkWidget *main_label, *size_label; + GtkWidget *left_box, *main_box, *btn_box; + GtkWidget *btn_free, *btn_line, *btn_circle, *btn_rectangle; + GtkWidget *size_scale; + + // Drawing Area + cairo_surface_t *surface; +}; + +G_DEFINE_TYPE(DrawApp, draw_app, GTK_TYPE_WINDOW) + +static void draw_app_init(DrawApp *self) +{ + gtk_window_set_title(GTK_WINDOW(self), "Drawing App"); +} + +static void draw_app_class_init(DrawAppClass *klass) +{ +} + +DrawApp *draw_app_new() +{ + return DRAW_APP(g_object_new(draw_app_get_type(), NULL)); +} diff --git a/Gtk4_Reset/src/image_app/ImageApp.cpp b/Gtk4_Reset/src/image_app/ImageApp.cpp new file mode 100644 index 0000000..cb8bc36 --- /dev/null +++ b/Gtk4_Reset/src/image_app/ImageApp.cpp @@ -0,0 +1,20 @@ +#include "ImageApp.h" + +struct _ImageApp{ + GtkWindow parent_instance; +}; + +G_DEFINE_TYPE(ImageApp, image_app, GTK_TYPE_APPLICATION_WINDOW) + +static void image_app_init(ImageApp *self) +{ + gtk_window_set_title(GTK_WINDOW(self), "Image Viewer"); +} + +static void image_app_class_init(ImageAppClass *klass) +{} + +ImageApp *image_app_new() +{ + return IMAGE_APP(g_object_new(image_app_get_type(), NULL)); +} diff --git a/Gtk4_Reset/src/text_app/TextEditor.cpp b/Gtk4_Reset/src/text_app/TextEditor.cpp new file mode 100644 index 0000000..d1a2a3e --- /dev/null +++ b/Gtk4_Reset/src/text_app/TextEditor.cpp @@ -0,0 +1,23 @@ +#include "TextEditor.h" + +struct _TextEditor +{ + GtkApplicationWindow parent_instance; +}; + +G_DEFINE_TYPE(TextEditor, text_editor, GTK_TYPE_APPLICATION_WINDOW) + +static void text_editor_init(TextEditor *self) +{ + gtk_window_set_title(GTK_WINDOW(self), "Text editor"); +} + +static void text_editor_class_init(TextEditorClass *klass) +{ + +} + +TextEditor *text_editor_new() +{ + return TEXT_EDITOR(g_object_new(text_editor_get_type(), NULL)); +} \ No newline at end of file diff --git a/Gtk4_Reset/src/ui/MyDock.cpp b/Gtk4_Reset/src/ui/MyDock.cpp index cc0fbdf..cbdd0cf 100644 --- a/Gtk4_Reset/src/ui/MyDock.cpp +++ b/Gtk4_Reset/src/ui/MyDock.cpp @@ -6,6 +6,9 @@ #include "CalcApp.h" #include "RunApp.h" #include "Game24App.h" +#include "DrawApp.h" +#include "TextEditor.h" +#include "ImageApp.h" enum PadPage { @@ -41,6 +44,9 @@ struct _MyDock GameApp *game_win; // The Guess Game CalcApp *calc_win; // Calc App Game24App *game24_win; // 24 Game Window + DrawApp *draw_win; // A Drawing App + TextEditor *edit_win; // Text Editor + ImageApp *image_app; // Image Viewer }; G_DEFINE_TYPE(MyDock, my_dock, GTK_TYPE_BOX) @@ -294,6 +300,7 @@ static void padrun_clicked(GtkWidget *widget, MyDock *dock) gtk_window_present(GTK_WINDOW(run_win)); } +// 24 Game control functions static void padgame24_clicked(GtkWindow *window, MyDock *dock) { // When the window visible, unminimize it @@ -335,6 +342,132 @@ static gboolean game24_win_closed(GtkWidget *game24_win, MyDock *dock) return TRUE; } +// Drawing App control functions +static void paddraw_clicked(GtkWindow *window, MyDock *dock) +{ + // When the window visible, unminimize it + if (gtk_widget_get_visible(GTK_WIDGET((dock->draw_win)))) + { + gtk_window_unminimize(GTK_WINDOW(dock->draw_win)); + } + else + { + // Show the window + gtk_window_set_transient_for(GTK_WINDOW(dock->draw_win), dock->parent_win); + gtk_window_present(GTK_WINDOW(dock->draw_win)); + } + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_draw), "drawing_app_running"); + btnlaunch_clicked(NULL, dock); +} + +static void btndraw_clicked(GtkWidget *widget, MyDock *dock) +{ + // When the window visible, control window state + if (gtk_widget_get_visible(GTK_WIDGET((dock->draw_win)))) + { + window_ctrl(GTK_WINDOW(dock->draw_win), dock->parent_win); + } + else + { + // Show the window + gtk_window_set_transient_for(GTK_WINDOW(dock->draw_win), dock->parent_win); + gtk_window_present(GTK_WINDOW(dock->draw_win)); + } + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_draw), "drawing_app_running"); +} + +static gboolean draw_win_closed(GtkWidget *draw_win, MyDock *dock) +{ + // Hide the window + gtk_widget_set_visible(draw_win, FALSE); + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_draw), "drawing_app"); + return TRUE; +} + +// Text Editor control functions +static void padedit_clicked(GtkWindow *window, MyDock *dock) +{ + // When the window visible, unminimize it + if (gtk_widget_get_visible(GTK_WIDGET((dock->edit_win)))) + { + gtk_window_unminimize(GTK_WINDOW(dock->edit_win)); + } + else + { + // Show the window + gtk_window_set_transient_for(GTK_WINDOW(dock->edit_win), dock->parent_win); + gtk_window_present(GTK_WINDOW(dock->edit_win)); + } + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_edit), "my_textedit_running"); + btnlaunch_clicked(NULL, dock); +} + +static void btnedit_clicked(GtkWidget *widget, MyDock *dock) +{ + // When the window visible, control window state + if (gtk_widget_get_visible(GTK_WIDGET((dock->edit_win)))) + { + window_ctrl(GTK_WINDOW(dock->edit_win), dock->parent_win); + } + else + { + // Show the window + gtk_window_set_transient_for(GTK_WINDOW(dock->edit_win), dock->parent_win); + gtk_window_present(GTK_WINDOW(dock->edit_win)); + } + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_edit), "my_textedit_running"); +} + +static gboolean edit_win_closed(GtkWidget *win, MyDock *dock) +{ + // Hide the window + gtk_widget_set_visible(win, FALSE); + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_edit), "my_textedit"); + return TRUE; +} + +// Image viewer control functions +static void padimage_clicked(GtkWindow *window, MyDock *dock) +{ + // When the window visible, unminimize it + if (gtk_widget_get_visible(GTK_WIDGET((dock->image_app)))) + { + gtk_window_unminimize(GTK_WINDOW(dock->image_app)); + } + else + { + // Show the window + gtk_window_set_transient_for(GTK_WINDOW(dock->image_app), dock->parent_win); + gtk_window_present(GTK_WINDOW(dock->image_app)); + } + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_viewer), "image_app_running"); + btnlaunch_clicked(NULL, dock); +} + +static void btnimage_clicked(GtkWidget *widget, MyDock *dock) +{ + // When the window visible, control window state + if (gtk_widget_get_visible(GTK_WIDGET((dock->image_app)))) + { + window_ctrl(GTK_WINDOW(dock->image_app), dock->parent_win); + } + else + { + // Show the window + gtk_window_set_transient_for(GTK_WINDOW(dock->image_app), dock->parent_win); + gtk_window_present(GTK_WINDOW(dock->image_app)); + } + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_viewer), "image_app_running"); +} + +static gboolean image_win_closed(GtkWidget *win, MyDock *dock) +{ + // Hide the window + gtk_widget_set_visible(win, FALSE); + gtk_image_set_from_icon_name(GTK_IMAGE(dock->image_viewer), "image_app"); + return TRUE; +} + static void my_dock_get_widgets(MyDock *self) { // Get widgets @@ -457,6 +590,24 @@ static void my_dock_init(MyDock *self) g_signal_connect(self->padgame24, "clicked", G_CALLBACK(padgame24_clicked), self); g_signal_connect(self->game24_win, "close-request", G_CALLBACK(game24_win_closed), self); + // Create Drawing App Window + self->draw_win = draw_app_new(); + g_signal_connect(self->btndraw, "clicked", G_CALLBACK(btndraw_clicked), self); + g_signal_connect(self->paddraw, "clicked", G_CALLBACK(paddraw_clicked), self); + g_signal_connect(self->draw_win, "close-request", G_CALLBACK(draw_win_closed), self); + + // Create Text Editor Window + self->edit_win = text_editor_new(); + g_signal_connect(self->btnedit, "clicked", G_CALLBACK(btnedit_clicked), self); + g_signal_connect(self->padedit, "clicked", G_CALLBACK(padedit_clicked), self); + g_signal_connect(self->edit_win, "close-request", G_CALLBACK(edit_win_closed), self); + + // Image Viewer window + self->image_app = image_app_new(); + g_signal_connect(self->btnimage, "clicked", G_CALLBACK(btnimage_clicked), self); + g_signal_connect(self->padimage, "clicked", G_CALLBACK(padimage_clicked), self); + g_signal_connect(self->image_app, "close-request", G_CALLBACK(image_win_closed), self); + // Signal for app runner g_signal_connect(self->padrun, "clicked", G_CALLBACK(padrun_clicked), self);