Created
March 28, 2012 12:01
-
-
Save Mon-Ouie/2225669 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'Qt4' | |
require 'set' | |
require 'pry' | |
# Fight fire with fire | |
class << Qt::Internal | |
alias _pride_find_pclassid find_pclassid | |
private :_pride_find_pclassid | |
def find_pclassid(val) | |
if String === val | |
_pride_find_pclassid val | |
else | |
Qt::Internal::ModuleIndex.new(nil, nil) | |
end | |
end | |
end | |
# Pry GUI, Pry Guide, Pride. | |
module Pride | |
Version = "0.0.0" | |
module_function | |
def run(args = ARGV) | |
app = Qt::Application.new(ARGV) | |
Window.new.show | |
app.exec | |
end | |
end | |
module Pride | |
class Window < Qt::MainWindow | |
def initialize | |
super | |
self.window_title = "Pride" | |
add_dock_widget Qt::LeftDockWidgetArea, | |
Qt::DockWidget.new("Object browser") { |dock| | |
dock.widget = Browser.new | |
} | |
self.central_widget = Qt::TabWidget.new do |tabs| | |
tabs.add_tab Prompt.new(TOPLEVEL_BINDING), "main" | |
end | |
end | |
end | |
class Browser < Qt::TabWidget | |
class Item < Qt::TreeWidgetItem | |
def initialize(object) | |
super() | |
@object = object | |
set_text 0, inspect_for(object) | |
end | |
attr_accessor :object | |
private | |
def inspect_for(object) | |
if Module === object | |
object.name || object.inspect | |
else | |
object.inspect | |
end | |
rescue Exception => e | |
"[Unable to inspect: #{e}]" | |
end | |
end | |
def initialize | |
super | |
add_tab Qt::Widget.new { |mod_tab| | |
mod_tab.layout = Qt::VBoxLayout.new do |layout| | |
@class_list = Qt::TreeWidget.new | |
@class_list.header_item.hidden = true | |
layout.add_widget @class_list | |
end | |
}, "Modules" | |
reload_classes | |
end | |
def reload_classes | |
@class_list.clear | |
@class_list.add_top_level_item Item.new(Object) | |
Object.constants.each do |const| | |
val = Object.const_get(const) | |
next if Object == val | |
if Module === val | |
@class_list.add_top_level_item Item.new(val) { |item| | |
val.constants(false).each do |sub_const| | |
sub_val = val.const_get(sub_const) | |
next if Object == sub_val | |
traverse_module(item, sub_val) if Module === sub_val | |
end | |
} | |
end | |
end | |
end | |
def traverse_module(item, mod, seen = Set.new([Object])) | |
return if seen.include? mod | |
seen << mod | |
item.add_child Item.new(mod) { |sub_item| | |
mod.constants(false).each do |const| | |
val = mod.const_get(const) | |
traverse_module(sub_item, val, seen) if Module === val | |
end | |
} | |
end | |
end | |
class Prompt < Qt::TextEdit | |
# I have no idea how to do this so I'll overload all the events to know when | |
# they're called. | |
def initialize(object) | |
super() | |
self.text = "test" | |
@min_pos = 3 | |
@modifiable = true | |
connect(SIGNAL("cursorPositionChanged()")) do | |
@modifiable = text_cursor.position > @min_pos | |
end | |
connect(SIGNAL("textChanged()")) do | |
undo unless @modifiable | |
end | |
end | |
def changeEvent(ev) | |
puts __method__ | |
super | |
end | |
def contextMenuEvent(ev) | |
puts __method__ | |
super | |
end | |
def dragEnterEvent(ev) | |
puts __method__ | |
super | |
end | |
def dragLeaveEvent(ev) | |
puts __method__ | |
super | |
end | |
def dragMoveEvent(ev) | |
puts __method__ | |
super | |
end | |
def dropEvent(ev) | |
puts __method__ | |
super | |
end | |
def focusInEvent(ev) | |
puts __method__ | |
super | |
end | |
def focusOutEvent(ev) | |
puts __method__ | |
super | |
end | |
def focusNextPrevChild(is_next) | |
puts __method__ | |
super | |
end | |
def inputMethodEvent(ev) | |
puts __method__ | |
super | |
end | |
def inputMethodQuery(prop) | |
puts __method__ | |
super | |
end | |
def keyPressEvent(ev) | |
puts __method__ | |
super | |
end | |
def keyReleaseEvent(ev) | |
puts __method__ | |
super | |
end | |
def mouseDoubleClickEvent(ev) | |
puts __method__ | |
super | |
end | |
def mousePressEvent(ev) | |
puts __method__ | |
super | |
end | |
def mouseReleaseEvent(ev) | |
puts __method__ | |
super | |
end | |
def mouseMoveEvent(ev) | |
puts __method__ | |
super | |
end | |
def paintEvent(ev) | |
puts __method__ | |
super | |
end | |
def resizeEvent(ev) | |
puts __method__ | |
super | |
end | |
def scrollContentsBy(dx, dy) | |
puts __method__ | |
super | |
end | |
def showEvent(ev) | |
puts __method__ | |
super | |
end | |
def wheelEvent(ev) | |
puts __metohd__ | |
super | |
end | |
end | |
end | |
Pride.run if __FILE__ == $PROGRAM_NAME |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment