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. 108
      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", "new_cc_file": "<alt>c",
"close_tab": "<control>w", "close_tab": "<control>w",
"open_folder": "<control><alt>o", "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": { "directoryfilter": {
"ignore": [ "ignore": [

2
juci/menu.cc

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

4
juci/menu.xml

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

3
juci/notebook.cc

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

108
juci/terminal.cc

@ -1,70 +1,94 @@
#include "terminal.h" #include "terminal.h"
#include <iostream> #include <iostream>
#include <thread>
Terminal::View::View(){ Terminal::View::View(){
scrolledwindow_.add(textview_); scrolledwindow_.add(textview_);
scrolledwindow_.set_size_request(-1,150); scrolledwindow_.set_size_request(-1,150);
view_.add(scrolledwindow_); 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() { Terminal::Controller::Controller() {
root = ""; folder_command_ = "";
Terminal().signal_key_release_event().
connect(sigc::mem_fun(*this,&Terminal::Controller::OnButtonRealeaseEvenet),false);
} }
bool Terminal::Controller::OnButtonRealeaseEvenet(GdkEventKey *key) { void Terminal::Controller::SetFolderCommand(std::string path) {
if(key->keyval == 65421 || key->keyval == 65293){ int pos = path.find_last_of("/\\");
ExecuteCommand(); path.erase(path.begin()+pos,path.end());
folder_command_ = "cd "+ path + "; ";
} }
return false;
}
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");
void Terminal::Controller::CompileAndRun(std::string project_name) {
if (folder_command_=="") {
PrintMessage("juCi++ ERROR: Can not find project's CMakeList.txt\n");
} else { } else {
char buffer[1028]; if (running.try_lock()) {
std::thread execute([=]() {
while (fgets(buffer, 1028, p) != NULL) Terminal().get_buffer()->set_text("");
{ ExecuteCommand("cmake .");
Terminal().get_buffer()->insert(Terminal().get_buffer()->end(),buffer); 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");
}
}
}
});
execute.detach();
running.unlock();
} }
pclose(p);
} }
Terminal().get_buffer()->insert(Terminal().get_buffer()->end(),"Command Executed\n");
}else{
std::cout << "NO COMMAND TO RUN"<< std::endl;
} }
void Terminal::Controller::PrintMessage(std::string message){
Terminal().get_buffer()->
insert(Terminal().get_buffer()-> end(),"> "+message);
} }
std::string Terminal::Controller::getCommand(){ bool Terminal::Controller::FindExecutable(std::string executable) {
std::string command = ""; std::string build = Terminal().get_buffer()->get_text();
Gtk::TextIter start,end; double pos = build.find(make_built);
int a = Terminal().get_buffer()->get_insert()->get_iter().get_line()-1; Gtk::TextIter start = Terminal().get_buffer()->get_iter_at_offset(pos);
if(a==-1)a=0; Gtk::TextIter end = Terminal().get_buffer()->get_iter_at_offset(pos);
start = Terminal().get_buffer()->get_iter_at_line(a);
end =Terminal().get_buffer()->get_iter_at_line(a);
while (!end.ends_line()) { while (!end.ends_line()) {
end++; end.forward_char();
} }
while(!start.starts_line()) { build = Terminal().get_buffer()->get_text(start, end);
start--; 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;
} }
command = Terminal().get_buffer()->get_text(start,end); bool Terminal::Controller::ExistInConsole(std::string string) {
return command; 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_ #ifndef JUCI_TERMINAL_H_
#define JUCI_TERMINAL_H_ #define JUCI_TERMINAL_H_
#include <mutex>
#include "gtkmm.h" #include "gtkmm.h"
namespace Terminal { namespace Terminal {
@ -21,14 +22,20 @@ namespace Terminal {
Controller(); Controller();
Gtk::HBox& view() {return view_.view();} Gtk::HBox& view() {return view_.view();}
Gtk::TextView& Terminal(){return view_.textview();} Gtk::TextView& Terminal(){return view_.textview();}
void SetFolderCommand(std::string path);
void CompileAndRun(std::string project_name);
private: private:
void ExecuteCommand(); void ExecuteCommand(std::string command);
std::string getCommand(); bool OnButtonRealeaseEvent(GdkEventKey* key);
bool OnButtonRealeaseEvenet(GdkEventKey* key); bool ExistInConsole(std::string string);
bool FindExecutable(std::string executable);
void PrintMessage(std::string message);
Terminal::View view_; 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 }; // class controller
} // namespace Terminal } // namespace Terminal

23
juci/window.cc

@ -35,6 +35,28 @@ Window::Window() :
OnSaveFileAs(); 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(). this->signal_button_release_event().
connect(sigc::mem_fun(*this,&Window::OnMouseRelease),false); connect(sigc::mem_fun(*this,&Window::OnMouseRelease),false);
terminal_.Terminal().signal_button_release_event(). terminal_.Terminal().signal_button_release_event().
@ -77,6 +99,7 @@ void Window::OnFileOpenFolder() {
std::cout << "Folder selected: " << dialog.get_filename() std::cout << "Folder selected: " << dialog.get_filename()
<< std::endl; << std::endl;
notebook_.directories().open_folder(dialog.get_filename()); notebook_.directories().open_folder(dialog.get_filename());
std::cout << dialog.get_filename()<< std::endl;
break; break;
} }
case(Gtk::RESPONSE_CANCEL): case(Gtk::RESPONSE_CANCEL):

1
juci/window.h

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

Loading…
Cancel
Save