Update gtk158

This commit is contained in:
daleclack 2024-02-21 15:51:57 +08:00
parent 3ebf6aaea1
commit 8c6bacd7e4
3 changed files with 78 additions and 10 deletions

View File

@ -14,7 +14,7 @@ G_DEFINE_TYPE(MineCell, mine_cell, GTK_TYPE_BUTTON)
static void mine_cell_init(MineCell *self)
{
gtk_button_set_icon_name(GTK_BUTTON(self), "");
gtk_button_set_has_frame(GTK_BUTTON(self), FALSE);
// gtk_button_set_has_frame(GTK_BUTTON(self), FALSE);
gtk_widget_set_size_request(GTK_WIDGET(self), 40, 40);
self->mines_around = 0;
self->has_mine = FALSE;

View File

@ -4,18 +4,94 @@
struct _MineSweeper
{
GtkApplicationWindow parent_instance;
GtkWidget *main_box, *btn_box;
GtkWidget *mine_grid;
GtkWidget *time_label;
MineCell *cell[49];
GtkWidget *btn_start, *btn_show, *btn_exit;
int time_count;
gboolean started;
};
G_DEFINE_TYPE(MineSweeper, mine_sweeper, GTK_TYPE_APPLICATION_WINDOW)
static void mine_sweeper_cells_init(MineSweeper *self, int width, int height)
{
// The mine sweeper will be 7x7
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
(self->cell)[i * width + j] = mine_cell_new();
}
}
// Append mines to grid
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
GtkWidget *widget = GTK_WIDGET((self->cell)[i * width + j]);
gtk_grid_attach(GTK_GRID(self->mine_grid), widget, j, i, 1, 1);
}
}
}
static void mine_sweeper_reset(MineSweeper *self)
{
// Reset mines status
}
static gboolean time_func(gpointer data)
{
MineSweeper *mine_app = MINE_SWEEPER(data);
char tmp[50];
(mine_app->time_count)++;
sprintf(tmp, "Time:%d", mine_app->time_count);
gtk_label_set_label(GTK_LABEL(mine_app->time_label), tmp);
return mine_app->started;
}
static void btnstart_clicked(GtkButton *btn, MineSweeper *self)
{
// Start game
self->time_count = 0;
self->started = TRUE;
g_timeout_add(1000, time_func, self);
}
static void mine_sweeper_init(MineSweeper *self)
{
// Initalize window
gtk_window_set_title(GTK_WINDOW(self), "MineSweeper");
// Create widgets
self->main_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
self->mine_grid = gtk_grid_new();
self->time_label = gtk_label_new("");
self->btn_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
self->btn_start = gtk_button_new_with_label("Start/Reset");
self->btn_show = gtk_button_new_with_label("Show All");
self->btn_exit = gtk_button_new_with_label("Exit");
g_signal_connect(self->btn_start, "clicked", G_CALLBACK(btnstart_clicked), self);
// Create mine cells
mine_sweeper_cells_init(self, 7, 7);
gtk_widget_set_halign(self->time_label, GTK_ALIGN_CENTER);
gtk_widget_set_halign(self->mine_grid, GTK_ALIGN_CENTER);
gtk_widget_set_halign(self->btn_box, GTK_ALIGN_CENTER);
gtk_box_append(GTK_BOX(self->main_box), self->time_label);
gtk_box_append(GTK_BOX(self->main_box), self->mine_grid);
gtk_box_append(GTK_BOX(self->btn_box), self->btn_start);
gtk_box_append(GTK_BOX(self->btn_box), self->btn_show);
gtk_box_append(GTK_BOX(self->btn_box), self->btn_exit);
gtk_box_append(GTK_BOX(self->main_box), self->btn_box);
gtk_window_set_child(GTK_WINDOW(self), self->main_box);
}
static void mine_sweeper_class_init(MineSweeperClass *klass)
{
}
MineSweeper *mine_sweeper_new()

View File

@ -1,8 +0,0 @@
#include "MineSweeper.hh"
int main(int argc, char **argv){
// Create a application and run
auto app = Gtk::Application::create("org.gtk.daleclack");
return app->make_window_and_run<MineSweeper>(argc,argv);
}