/*
GREX - A graphical frontend for creating and managing Rex project files.
Copyright (C) 2026 SILO GROUP, LLC. Written by Chris Punches
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
#pragma once
#include
#include "models/project.h"
namespace grex {
class ShellsView {
public:
explicit ShellsView(Project& project);
GtkWidget* widget() { return root_; }
void refresh();
private:
Project& project_;
GtkWidget* root_;
// Left panel: shell files
GtkWidget* file_listbox_;
GtkWidget* btn_save_;
// Right panel: shells in selected file
GtkWidget* file_label_;
GtkWidget* shell_listbox_;
// Editor
GtkWidget* editor_grid_;
GtkWidget* entry_name_;
GtkWidget* entry_path_;
GtkWidget* entry_exec_arg_;
GtkWidget* entry_source_cmd_;
ShellsFile* selected_file_ = nullptr;
int current_shell_idx_ = -1;
bool loading_ = false;
bool file_dirty_ = false;
void populate_file_list();
void populate_shell_list();
void load_shell(int idx);
void clear_editor();
void mark_file_dirty();
GtkListBoxRow* find_file_row(ShellsFile* sf);
static void on_file_selected(GtkListBox* box, GtkListBoxRow* row, gpointer data);
static void on_new_file(GtkButton* btn, gpointer data);
static void on_new_file_response(GObject* source, GAsyncResult* res, gpointer data);
static void on_delete_file(GtkButton* btn, gpointer data);
static void on_new_shell(GtkButton* btn, gpointer data);
static void on_delete_shell(GtkButton* btn, gpointer data);
static void on_move_up(GtkButton* btn, gpointer data);
static void on_move_down(GtkButton* btn, gpointer data);
};
}