Skip to content

Instantly share code, notes, and snippets.

@Mon-Ouie
Created March 28, 2012 12:01
Show Gist options
  • Save Mon-Ouie/2225669 to your computer and use it in GitHub Desktop.
Save Mon-Ouie/2225669 to your computer and use it in GitHub Desktop.
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