Browse Source

Working console for linux, missing merge with forgie

merge-requests/365/head
oyvang 11 years ago
parent
commit
59925ea19c
  1. 4
      juci/config.json
  2. 2
      juci/menu.cc
  3. 4
      juci/menu.xml
  4. 3
      juci/notebook.cc
  5. 114
      juci/terminal.cc
  6. 19
      juci/terminal.h
  7. 23
      juci/window.cc
  8. 1
      juci/window.h

4
juci/config.json

@ -24,7 +24,9 @@
"new_cc_file": "<alt>c",
"close_tab": "<control>w",
"open_folder": "<control><alt>o",
"save_as": "<control><shift>s"
"save_as": "<control><shift>s",
"compile_and_run": "<control><alt>r>",
"compile": "<control>r"
},
"directoryfilter": {
"ignore": [

2
juci/menu.cc

@ -27,6 +27,8 @@ Menu::Controller::Controller(Keybindings::Controller& keybindings) :
[this]() {
OnWindowSplitWindow();
});
keybindings_.action_group_menu()->add(Gtk::Action::create("ProjectMenu",
"P_roject"));
keybindings_.action_group_menu()->add(Gtk::Action::create("PluginMenu",
"_Plugins"));
keybindings_.action_group_menu()->add(Gtk::Action::create("HelpMenu",

4
juci/menu.xml

@ -19,6 +19,10 @@
<separator/>
<menuitem action='EditFind'/>
</menu>
<menu action='ProjectMenu'>
<menuitem action='ProjectCompileAndRun'/>
<menuitem action='ProjectCompile'/>
</menu>
<menu action='WindowMenu'>
<menuitem action='WindowCloseTab'/>
<menuitem action='WindowSplitWindow'/>

3
juci/notebook.cc

@ -154,6 +154,7 @@ bool Notebook::Controller::GeneratePopup(){
start.get_line_offset()+2,
&items);
std::cout << items.size()<< std::endl;
if(items.size()>0){
// Replace over with get suggestions from zalox! OVER IS JUST FOR TESTING
@ -184,6 +185,8 @@ bool Notebook::Controller::GeneratePopup(){
popup_.hide();
ispopup = false;
return true;
}
return false;
}
bool Notebook::Controller::ScrollEventCallback(GdkEventScroll* scroll_event) {

114
juci/terminal.cc

@ -1,70 +1,94 @@
#include "terminal.h"
#include <iostream>
#include <thread>
Terminal::View::View(){
scrolledwindow_.add(textview_);
scrolledwindow_.set_size_request(-1,150);
view_.add(scrolledwindow_);
textview_.set_editable(false);
//Pango::TabArray tabsize;
//tabsize.set_tab(200,Pango::TAB_LEFT, 200);
//textview_.set_tabs(tabsize);
}
Terminal::Controller::Controller() {
root = "";
Terminal().signal_key_release_event().
connect(sigc::mem_fun(*this,&Terminal::Controller::OnButtonRealeaseEvenet),false);
folder_command_ = "";
}
bool Terminal::Controller::OnButtonRealeaseEvenet(GdkEventKey *key) {
if(key->keyval == 65421 || key->keyval == 65293){
ExecuteCommand();
}
return false;
void Terminal::Controller::SetFolderCommand(std::string path) {
int pos = path.find_last_of("/\\");
path.erase(path.begin()+pos,path.end());
folder_command_ = "cd "+ path + "; ";
}
void Terminal::Controller::ExecuteCommand() {
std::cout << "EXECUTE COMMAND ALGORITHM "<< std::endl;
std::string temp = getCommand();
if(temp != ""){
std::cout << "EXECUTE COMMAND: "<<temp << std::endl;
FILE* p = popen(temp.c_str(), "r");
if (p == NULL)
{
Terminal().get_buffer()->insert(Terminal().get_buffer()->end(),"Command Failed\n");
} else{
char buffer[1028];
while (fgets(buffer, 1028, p) != NULL)
{
Terminal().get_buffer()->insert(Terminal().get_buffer()->end(),buffer);
void Terminal::Controller::CompileAndRun(std::string project_name) {
if (folder_command_=="") {
PrintMessage("juCi++ ERROR: Can not find project's CMakeList.txt\n");
} else {
if (running.try_lock()) {
std::thread execute([=]() {
Terminal().get_buffer()->set_text("");
ExecuteCommand("cmake .");
if (ExistInConsole(cmake_sucsess)){
ExecuteCommand("make");
if (ExistInConsole(make_built)){
if (FindExecutable(project_name)) {
ExecuteCommand("./"+project_name);
} else {
PrintMessage("juCi++ ERROR: Can not find Executable\n");
}
pclose(p);
}
Terminal().get_buffer()->insert(Terminal().get_buffer()->end(),"Command Executed\n");
}else{
std::cout << "NO COMMAND TO RUN"<< std::endl;
}
});
execute.detach();
running.unlock();
}
}
}
void Terminal::Controller::PrintMessage(std::string message){
Terminal().get_buffer()->
insert(Terminal().get_buffer()-> end(),"> "+message);
}
std::string Terminal::Controller::getCommand(){
std::string command = "";
Gtk::TextIter start,end;
int a = Terminal().get_buffer()->get_insert()->get_iter().get_line()-1;
if(a==-1)a=0;
start = Terminal().get_buffer()->get_iter_at_line(a);
end =Terminal().get_buffer()->get_iter_at_line(a);
while(!end.ends_line()) {
end++;
}
while(!start.starts_line()) {
start--;
bool Terminal::Controller::FindExecutable(std::string executable) {
std::string build = Terminal().get_buffer()->get_text();
double pos = build.find(make_built);
Gtk::TextIter start = Terminal().get_buffer()->get_iter_at_offset(pos);
Gtk::TextIter end = Terminal().get_buffer()->get_iter_at_offset(pos);
while (!end.ends_line()) {
end.forward_char();
}
command = Terminal().get_buffer()->get_text(start,end);
return command;
build = Terminal().get_buffer()->get_text(start, end);
pos = build.find_last_of(" ");
std::cout << "FINNER NY POS" << std::endl;
build = build.substr(pos+1);
std::cout <<"BUILD TARGET = "<< build << std::endl;
std::cout << "EXECUTABLE FILE = "<< executable << std::endl;
if(build != executable) return false;
return true;
}
bool Terminal::Controller::ExistInConsole(std::string string) {
double pos = Terminal().get_buffer()->
get_text().find(string);
if (pos == std::string::npos) return false;
return true;
}
void Terminal::Controller::ExecuteCommand(std::string command) {
command = folder_command_+command;
std::cout << "EXECUTE COMMAND: "<< command << std::endl;
FILE* p = popen(command.c_str(), "r");
if (p == NULL) {
PrintMessage("juCi++ ERROR: Failed to run command" + command + "\n");
}else {
char buffer[1028];
while (fgets(buffer, 1028, p) != NULL) {
PrintMessage(buffer);
}
pclose(p);
}
}

19
juci/terminal.h

@ -1,6 +1,7 @@
#ifndef JUCI_TERMINAL_H_
#define JUCI_TERMINAL_H_
#include <mutex>
#include "gtkmm.h"
namespace Terminal {
@ -21,14 +22,20 @@ namespace Terminal {
Controller();
Gtk::HBox& view() {return view_.view();}
Gtk::TextView& Terminal(){return view_.textview();}
void SetFolderCommand(std::string path);
void CompileAndRun(std::string project_name);
private:
void ExecuteCommand();
std::string getCommand();
bool OnButtonRealeaseEvenet(GdkEventKey* key);
void ExecuteCommand(std::string command);
bool OnButtonRealeaseEvent(GdkEventKey* key);
bool ExistInConsole(std::string string);
bool FindExecutable(std::string executable);
void PrintMessage(std::string message);
Terminal::View view_;
std::string root;
std::string folder_command_;
std::mutex running;
const std::string cmake_sucsess = "Build files have been written to:";
const std::string make_built = "Built target";
const std::string make_executable = "Linking CXX executable";
}; // class controller
} // namespace Terminal

23
juci/window.cc

@ -35,6 +35,28 @@ Window::Window() :
OnSaveFileAs();
});
keybindings_.action_group_menu()->add(Gtk::Action::create("ProjectCompileAndRun",
"Compile And Run"),
Gtk::AccelKey(keybindings_.config_
.key_map()["compile_and_run"]),
[this]() {
terminal_.
SetFolderCommand("/home/gm/ClionProjects/testi/CM.txt");
std::string p = notebook_.directories().get_project_name("/home/gm/ClionProjects/testi");
terminal_.CompileAndRun(p);
});
keybindings_.action_group_menu()->add(Gtk::Action::create("ProjectCompile",
"Compile"),
Gtk::AccelKey(keybindings_.config_
.key_map()["compile"]),
[this]() {
terminal_.
SetFolderCommand("/home/gm/ClionProjects/testi/CM.txt");
std::string p = notebook_.directories().get_project_name("/home/gm/ClionProjects/testi");
terminal_.CompileAndRun(p);
});
this->signal_button_release_event().
connect(sigc::mem_fun(*this,&Window::OnMouseRelease),false);
terminal_.Terminal().signal_button_release_event().
@ -77,6 +99,7 @@ void Window::OnFileOpenFolder() {
std::cout << "Folder selected: " << dialog.get_filename()
<< std::endl;
notebook_.directories().open_folder(dialog.get_filename());
std::cout << dialog.get_filename()<< std::endl;
break;
}
case(Gtk::RESPONSE_CANCEL):

1
juci/window.h

@ -30,7 +30,6 @@ public:
void OnFileOpenFolder();
void OnSaveFileAs();
bool OnMouseRelease(GdkEventButton* button);
};
#endif // JUCI_WINDOW_H

Loading…
Cancel
Save