void open_blob_editor(const char *id, const char *name, unsigned int lineno) { const char *blob_argv[] = { "git", "cat-file", "blob", id, NULL }; char file[SIZEOF_STR]; int fd; if (!name) name = "unknown"; if (!string_format(file, "%s/tigblob.XXXXXX.%s", get_temp_dir(), name)) { report("Temporary file name is too long"); return; } fd = mkstemps(file, strlen(name) + 1); if (fd == -1) report("Failed to create temporary file"); else if (!io_run_append(blob_argv, fd)) report("Failed to save blob data to file"); else open_editor(file, lineno); if (fd != -1) unlink(file); }
void Ozette::edit_file(std::string path) { struct stat st; if (0 == stat(path.c_str(), &st) && S_ISDIR(st.st_mode)) { change_dir(path); } else { open_editor(path); } }
void Ozette::find_in_file(std::string path, Editor::line_t index) { // For now we just jump to the specified line. Someday we will get a search // regex, so we can put the editor into find mode. auto edrec = open_editor(path); if (edrec.view) { Editor::location_t line(index, 0); Editor::Range sel(line, line); edrec.view->select(*edrec.window, sel); } }
static enum request tree_request(struct view *view, enum request request, struct line *line) { enum open_flags flags; struct tree_entry *entry = line->data; switch (request) { case REQ_VIEW_BLAME: if (line->type != LINE_FILE) { report("Blame only supported for files"); return REQ_NONE; } string_copy(view->env->ref, view->vid); return request; case REQ_EDIT: if (line->type != LINE_FILE) { report("Edit only supported for files"); } else if (!is_head_commit(view->vid)) { open_blob_editor(entry->id, entry->name, 0); } else { open_editor(view->env->file, 0); } return REQ_NONE; case REQ_PARENT: case REQ_BACK: if (!*view->env->directory) { /* quit view if at top of tree */ return REQ_VIEW_CLOSE; } /* fake 'cd ..' */ pop_tree_stack_entry(&view->pos); reload_view(view); break; case REQ_ENTER: break; default: return request; } /* Cleanup the stack if the tree view is at a different tree. */ if (!*view->env->directory) reset_view_history(&tree_view_history); switch (line->type) { case LINE_DIRECTORY: /* Depending on whether it is a subdirectory or parent link * mangle the path buffer. */ if (tree_path_is_parent(entry->name) && *view->env->directory) { pop_tree_stack_entry(&view->pos); } else { const char *basename = tree_path(line); push_tree_stack_entry(view, basename, &view->pos); } /* Trees and subtrees share the same ID, so they are not not * unique like blobs. */ reload_view(view); break; case LINE_FILE: flags = view_is_displayed(view) ? OPEN_SPLIT : OPEN_DEFAULT; open_blob_view(view, flags); break; default: return REQ_NONE; } return REQ_NONE; }
//******************************************************************* // customEvent PRIVATE inherited //******************************************************************* void QBtWorkspace::customEvent( QEvent* const in_event ) { const QBtEvent* const event = dynamic_cast< QBtEvent* >( in_event ); const int type = static_cast<int>( event->type() ); switch( type ) { case QBtEvent::SWITCH_TAB_REQUEST: switch_panels(); break; case QBtEvent::F5_KEY: copy(); break; case QBtEvent::F9_KEY: pack(); break; case QBtEvent::COMPARE_FILES: compare_files(); break; case QBtEvent::COMPARE_DIRS: compare_dirs(); break; case QBtEvent::SYNC_DIRS: sync_dirs(); break; case QBtEvent::JOIN_FILES: join_files(); break; case QBtEvent::DIR_TREE: dir_tree(); break; case QBtEvent::MD5_CREATE: md5_create(); break; case QBtEvent::MD5_CHECK: md5_check(); break; case QBtEvent::DATE_TIME: date_time(); break; case QBtEvent::DROP_FILES: drop_files( event->data(0).toMap() ); break; case QBtEvent::OPEN_OPOSITE: open_oposite(); break; case QBtEvent::OPEN_DIR: open_dir( event->data(0).toString() ); break; case QBtEvent::OPEN_SHELL: open_shell(); break; case QBtEvent::OPEN_TERMINAL: open_terminal(); break; case QBtEvent::OPEN_EDITOR: open_editor(); break; case QBtEvent::EXECUTE: open( event->data(0).toString(), QStringList(), QString() ); break; } }