395 lines
12 KiB
C++
395 lines
12 KiB
C++
#include <gtkmm.h>
|
|
#include "mainWindow.hpp"
|
|
#include <sirEdit/main.hpp>
|
|
|
|
extern std::string sirEdit_mainWindow_glade;
|
|
|
|
#include <list>
|
|
#include <unordered_map>
|
|
|
|
using namespace std;
|
|
using namespace sirEdit;
|
|
using namespace sirEdit::data;
|
|
using namespace sirEdit::gui;
|
|
|
|
class TmpModel : public Gtk::TreeModel::ColumnRecord
|
|
{
|
|
public:
|
|
Gtk::TreeModelColumn<Glib::ustring> data_name;
|
|
Gtk::TreeModelColumn<bool> data_used;
|
|
Gtk::TreeModelColumn<bool> data_active;
|
|
|
|
TmpModel() {
|
|
this->add(data_used);
|
|
this->add(data_active);
|
|
this->add(data_name);
|
|
}
|
|
};
|
|
//static TmpModel tmpModel;
|
|
|
|
class MainWindow {
|
|
private:
|
|
Glib::RefPtr<Gtk::Builder> __builder;
|
|
|
|
unique_ptr<Serializer> __serializer;
|
|
Glib::RefPtr<Gio::File> __file;
|
|
Transactions __transitions;
|
|
|
|
unordered_map<string, int> __tabs;
|
|
Gtk::Notebook* __notebook;
|
|
|
|
Gtk::ListBox* __toolsList;
|
|
Gtk::Popover* __toolsPopover;
|
|
|
|
//
|
|
// Tab management
|
|
//
|
|
void __create_tab(Tool& tool) {
|
|
Gtk::HBox* labelBox = new Gtk::HBox();
|
|
Gtk::Label* label = new Gtk::Label(tool.getName());
|
|
Gtk::Image* closeImage = new Gtk::Image(Gtk::Stock::CLOSE, Gtk::ICON_SIZE_BUTTON);
|
|
Gtk::Button* closeButon = new Gtk::Button();
|
|
// TODO: Close tab
|
|
closeButon->add(*closeImage);
|
|
closeButon->set_property("relief", Gtk::RELIEF_NONE);
|
|
labelBox->pack_start(*label);
|
|
labelBox->pack_end(*closeButon);
|
|
labelBox->show_all();
|
|
Gtk::Widget* content = createToolEdit(tool.getName(), this->__transitions);
|
|
auto tmp = this->__notebook->append_page(*content, *labelBox);
|
|
this->__tabs[tool.getName()] = tmp;
|
|
this->__notebook->set_current_page(tmp);
|
|
}
|
|
|
|
//
|
|
// Event
|
|
//
|
|
void __event_toolButton_click() {
|
|
// Clear list
|
|
{
|
|
auto tmp = this->__toolsList->get_children();
|
|
for(auto i : tmp) {
|
|
this->__toolsList->remove(*i);
|
|
delete i;
|
|
}
|
|
}
|
|
|
|
// Rebuild list
|
|
{
|
|
const sirEdit::data::Serializer& view = this->__transitions.getData();
|
|
auto& tools = view.getTools();
|
|
size_t pos = 0;
|
|
for(auto& i : tools) {
|
|
Gtk::VBox* main = Gtk::manage(new Gtk::VBox());
|
|
{
|
|
Gtk::HBox* top = Gtk::manage(new Gtk::HBox());
|
|
{
|
|
Gtk::Label* tmp = Gtk::manage(new Gtk::Label(i->getName()));
|
|
tmp->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
|
|
Gtk::Button* button = Gtk::manage(new Gtk::Button());
|
|
button->set_image(*tmp);
|
|
tmp->show_all();
|
|
top->pack_start(*(button), true, true);
|
|
button->set_relief(Gtk::RELIEF_NONE);
|
|
button->signal_clicked().connect([&i, this]() -> void {
|
|
if(this->__tabs.find(i->getName()) == this->__tabs.end())
|
|
this->__create_tab(*const_cast<Tool*>(i));
|
|
else
|
|
this->__notebook->set_current_page(this->__tabs[i->getName()]);
|
|
this->__toolsPopover->hide();
|
|
});
|
|
}
|
|
{
|
|
Gtk::Button* button = Gtk::manage(new Gtk::Button());
|
|
button->set_relief(Gtk::RELIEF_NONE);
|
|
button->set_image(*(Gtk::manage(new Gtk::Image(Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_BUTTON))));
|
|
top->pack_end(*button, false, true);
|
|
}
|
|
{
|
|
Gtk::Button* button = Gtk::manage(new Gtk::Button());
|
|
button->set_relief(Gtk::RELIEF_NONE);
|
|
button->set_image(*(Gtk::manage(new Gtk::Image(Gtk::Stock::PROPERTIES, Gtk::ICON_SIZE_BUTTON))));
|
|
top->pack_end(*button, false, true);
|
|
}
|
|
{
|
|
Gtk::Button* button = Gtk::manage(new Gtk::Button());
|
|
button->set_relief(Gtk::RELIEF_NONE);
|
|
button->set_image(*(Gtk::manage(new Gtk::Image(Gtk::Stock::DELETE, Gtk::ICON_SIZE_BUTTON))));
|
|
top->pack_end(*button, false, true);
|
|
}
|
|
main->pack_start(*top, true, true);
|
|
}
|
|
{
|
|
Gtk::Label* description = Gtk::manage(new Gtk::Label(i->getDescription()));
|
|
description->set_line_wrap_mode(Pango::WrapMode::WRAP_CHAR);
|
|
description->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
|
|
description->set_lines(1);
|
|
main->pack_end(*description, true, true);
|
|
}
|
|
|
|
this->__toolsList->insert(*main, pos);
|
|
pos++;
|
|
}
|
|
}
|
|
|
|
// Show
|
|
this->__toolsPopover->show_all();
|
|
}
|
|
|
|
public:
|
|
MainWindow(unique_ptr<sirEdit::data::Serializer> serializer, Glib::RefPtr<Gio::File> file) : __transitions(*serializer) {
|
|
// Builder
|
|
this->__builder = Gtk::Builder::create_from_string(sirEdit_mainWindow_glade);
|
|
|
|
// Gen historical view
|
|
this->__serializer = std::move(serializer);
|
|
this->__file = file;
|
|
|
|
// Notebook
|
|
this->__builder->get_widget("Notebook", this->__notebook);
|
|
|
|
// Tools pop-up
|
|
{
|
|
Gtk::Button* toolsButton;
|
|
this->__builder->get_widget("ToolsButton", toolsButton);
|
|
this->__builder->get_widget("ToolsPopup", this->__toolsPopover);
|
|
this->__builder->get_widget("ToolsList", this->__toolsList);
|
|
|
|
toolsButton->signal_clicked().connect([this]() -> void {
|
|
this->__event_toolButton_click();
|
|
});
|
|
}
|
|
|
|
// New tool
|
|
{
|
|
Gtk::Button* newToolButton;
|
|
Gtk::Dialog* newToolDialog;
|
|
Gtk::Entry* toolName;
|
|
Gtk::Button* toolFinish;
|
|
Gtk::Button* toolExit;
|
|
Gtk::TextView* toolDescription;
|
|
Gtk::TextView* toolCommand;
|
|
this->__builder->get_widget("ToolAddButton", newToolButton);
|
|
this->__builder->get_widget("NewToolDialog", newToolDialog);
|
|
this->__builder->get_widget("ToolName", toolName);
|
|
this->__builder->get_widget("ToolNewAdd", toolFinish);
|
|
this->__builder->get_widget("ToolNewExit", toolExit);
|
|
this->__builder->get_widget("ToolDescription", toolDescription);
|
|
this->__builder->get_widget("ToolCommand", toolCommand);
|
|
|
|
// New dialog / close
|
|
{
|
|
newToolButton->signal_clicked().connect([newToolDialog, toolName, toolFinish, toolDescription, toolCommand]() -> void {
|
|
toolName->set_text("");
|
|
toolDescription->set_buffer(Gtk::TextBuffer::create());
|
|
toolCommand->set_buffer(Gtk::TextBuffer::create());
|
|
toolFinish->set_sensitive(false);
|
|
newToolDialog->show_all();
|
|
});
|
|
|
|
auto closeFunc = [newToolDialog]() -> void {
|
|
newToolDialog->hide();
|
|
};
|
|
toolExit->signal_clicked().connect(closeFunc);
|
|
}
|
|
|
|
// Dialog update checkers
|
|
{
|
|
auto updateCheck = [this, toolName, newToolDialog, toolFinish]() -> void {
|
|
string text = toolName->get_text();
|
|
if(text == "") {
|
|
toolFinish->set_sensitive(false);
|
|
return;
|
|
}
|
|
|
|
for(auto i : this->__transitions.getData().getTools())
|
|
if(i->getName() == text) {
|
|
toolFinish->set_sensitive(false);
|
|
return;
|
|
}
|
|
|
|
toolFinish->set_sensitive(true);
|
|
return;
|
|
};
|
|
toolName->signal_changed().connect(updateCheck);
|
|
}
|
|
|
|
// Dialog finished
|
|
toolFinish->signal_clicked().connect([this, newToolDialog, toolName, toolDescription, toolCommand]() -> void {
|
|
newToolDialog->hide();
|
|
this->__transitions.addTool({toolName->get_text(), toolDescription->get_buffer()->get_text(), toolCommand->get_buffer()->get_text()});
|
|
// TODO: Open new tool view
|
|
});
|
|
}
|
|
|
|
{
|
|
this->__notebook->append_page(*(Gtk::manage(createOverview(this->__transitions))), "Overview");
|
|
}
|
|
|
|
// TODO: Remove prototype
|
|
if(false)
|
|
{
|
|
{
|
|
Gtk::TreeView* tools;
|
|
TmpModel* tmpModel = new TmpModel;
|
|
this->__builder->get_widget("OverviewTools", tools);
|
|
{
|
|
auto tmp = Gtk::TreeStore::create(*tmpModel);
|
|
auto tmp2 = *tmp->append();
|
|
tmp2[tmpModel->data_name] = "ToolA";
|
|
tmp2[tmpModel->data_used] = true;
|
|
tmp2[tmpModel->data_active] = true;
|
|
auto tmp3 = *tmp->append();
|
|
tmp3[tmpModel->data_name] = "ToolB";
|
|
tmp3[tmpModel->data_used] = true;
|
|
tmp3[tmpModel->data_active] = false;
|
|
auto tmp4 = *tmp->append();
|
|
tmp4[tmpModel->data_name] = "ToolC";
|
|
tmp4[tmpModel->data_used] = false;
|
|
tmp4[tmpModel->data_active] = false;
|
|
tools->set_model(tmp);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tools->append_column("Active", *tmp);
|
|
tools->get_column(0)->add_attribute(tmp->property_active(), tmpModel->data_active);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tmp->set_activatable(false);
|
|
tools->append_column("Used", *tmp);
|
|
tools->get_column(1)->add_attribute(tmp->property_active(), tmpModel->data_used);
|
|
}
|
|
{
|
|
tools->append_column("Tool", tmpModel->data_name);
|
|
}
|
|
}
|
|
{
|
|
Gtk::TreeView* tools;
|
|
TmpModel* tmpModel = new TmpModel;
|
|
this->__builder->get_widget("OverviewTypes", tools);
|
|
{
|
|
auto tmp = Gtk::TreeStore::create(*tmpModel);
|
|
auto tmp2 = *tmp->append();
|
|
tmp2[tmpModel->data_name] = "TypeExample";
|
|
tmp2[tmpModel->data_used] = true;
|
|
tmp2[tmpModel->data_active] = true;
|
|
tools->set_model(tmp);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tools->append_column("Active", *tmp);
|
|
tools->get_column(0)->add_attribute(tmp->property_active(), tmpModel->data_active);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tmp->set_activatable(false);
|
|
tools->append_column("Used", *tmp);
|
|
tools->get_column(1)->add_attribute(tmp->property_active(), tmpModel->data_used);
|
|
}
|
|
{
|
|
tools->append_column("Type", tmpModel->data_name);
|
|
}
|
|
}
|
|
{
|
|
Gtk::TreeView* tools;
|
|
TmpModel* tmpModel = new TmpModel;
|
|
this->__builder->get_widget("OverviewFields", tools);
|
|
{
|
|
auto tmp = Gtk::TreeStore::create(*tmpModel);
|
|
auto tmp2 = *tmp->append();
|
|
tmp2[tmpModel->data_name] = "exampleField";
|
|
tmp2[tmpModel->data_used] = true;
|
|
tmp2[tmpModel->data_active] = true;
|
|
tools->set_model(tmp);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tools->append_column("Active", *tmp);
|
|
tools->get_column(0)->add_attribute(tmp->property_active(), tmpModel->data_active);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tmp->set_activatable(false);
|
|
tools->append_column("Used", *tmp);
|
|
tools->get_column(1)->add_attribute(tmp->property_active(), tmpModel->data_used);
|
|
}
|
|
{
|
|
tools->append_column("Field", tmpModel->data_name);
|
|
}
|
|
}
|
|
{
|
|
Gtk::Button* button;
|
|
Gtk::Popover* over;
|
|
this->__builder->get_widget("ErrorButton", button);
|
|
this->__builder->get_widget("ErrorPopover", over);
|
|
button->signal_clicked().connect([over]() -> void {
|
|
over->show_all();
|
|
});
|
|
}
|
|
{
|
|
Gtk::Button* button;
|
|
Gtk::PopoverMenu* over;
|
|
this->__builder->get_widget("MenuButton", button);
|
|
this->__builder->get_widget("Menu", over);
|
|
button->signal_clicked().connect([over]() -> void {
|
|
over->show_all();
|
|
});
|
|
}
|
|
{
|
|
Gtk::TreeView* tools;
|
|
TmpModel* tmpModel = new TmpModel;
|
|
this->__builder->get_widget("ExportTools", tools);
|
|
{
|
|
auto tmp = Gtk::TreeStore::create(*tmpModel);
|
|
auto tmp2 = *tmp->append();
|
|
tmp2[tmpModel->data_name] = "ToolA";
|
|
tmp2[tmpModel->data_used] = true;
|
|
tmp2[tmpModel->data_active] = true;
|
|
auto tmp3 = *tmp->append();
|
|
tmp3[tmpModel->data_name] = "ToolB";
|
|
tmp3[tmpModel->data_used] = true;
|
|
tmp3[tmpModel->data_active] = true;
|
|
auto tmp4 = *tmp->append();
|
|
tmp4[tmpModel->data_name] = "ToolC";
|
|
tmp4[tmpModel->data_used] = false;
|
|
tmp4[tmpModel->data_active] = true;
|
|
tools->set_model(tmp);
|
|
}
|
|
{
|
|
auto tmp = Gtk::manage(new Gtk::CellRendererToggle());
|
|
tools->append_column("Export", *tmp);
|
|
tools->get_column(0)->add_attribute(tmp->property_active(), tmpModel->data_active);
|
|
}
|
|
{
|
|
tools->append_column("Tool", tmpModel->data_name);
|
|
}
|
|
}
|
|
{
|
|
Gtk::Dialog* dialog;
|
|
Gtk::Button* button;
|
|
this->__builder->get_widget("ExportButton", button);
|
|
this->__builder->get_widget("Export", dialog);
|
|
button->signal_clicked().connect([dialog]()-> void{
|
|
dialog->show_all();
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
// Make window visible
|
|
{
|
|
Gtk::ApplicationWindow* window;
|
|
this->__builder->get_widget("mainWindow", window);
|
|
window->show_all();
|
|
sirEdit::mainApplication->add_window(*window);
|
|
}
|
|
}
|
|
};
|
|
|
|
static shared_ptr<MainWindow> mainWindow;
|
|
|
|
extern void sirEdit::gui::openMainWindow(std::unique_ptr<sirEdit::data::Serializer> serializer, Glib::RefPtr<Gio::File> file) {
|
|
mainWindow = move(make_shared<MainWindow>(std::move(serializer), file));
|
|
}
|