summaryrefslogtreecommitdiffstats
path: root/qtruby/rubylib/examples/qtscribble/scribble.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qtruby/rubylib/examples/qtscribble/scribble.rb')
-rw-r--r--qtruby/rubylib/examples/qtscribble/scribble.rb274
1 files changed, 274 insertions, 0 deletions
diff --git a/qtruby/rubylib/examples/qtscribble/scribble.rb b/qtruby/rubylib/examples/qtscribble/scribble.rb
new file mode 100644
index 00000000..7c6e1ca5
--- /dev/null
+++ b/qtruby/rubylib/examples/qtscribble/scribble.rb
@@ -0,0 +1,274 @@
+#!/usr/bin/env ruby -w
+
+ #
+ # A class that lets the user draw with the mouse. The
+ # window knows how to redraw itself.
+ #
+
+require 'Qt'
+
+ class ScribbleArea < Qt::Widget
+
+ slots "setColor(QColor)", "slotLoad(const QString&)", "slotSave(const QString&)", "slotClearArea()"
+
+ #
+ # The constructor. Initializes the member variables.
+ #
+ def initialize()
+ super
+ # initialize member variables
+ @_buffer = Qt::Pixmap.new()
+ @_last = Qt::Point.new()
+ @_currentcolor = black
+
+ # don't blank the window before repainting
+ setBackgroundMode( NoBackground )
+
+ # create a pop-up menu
+ @_popupmenu = Qt::PopupMenu.new()
+ @_popupmenu.insertItem( "&Clear", self, SLOT( "slotClearArea()" ) )
+ end
+
+ #
+ # This slot sets the curren color for the scribble area. It will be
+ # connected with the colorChanged( Qt::Color ) signal from the
+ # ScribbleWindow.
+ #
+ def setColor( new_color )
+ @_currentcolor = new_color
+ end
+
+ #
+ # This slot clears the drawing area by filling the off-screen buffer with
+ # white and copying it over to the window.
+ #
+ def slotClearArea()
+ # fill the off screen buffer with plain white
+ @_buffer.fill( white )
+
+ # and copy it over to the window
+ bitBlt( self, 0, 0, @_buffer )
+ end
+
+
+ #
+ # This method does the actual loading. It relies on Qt::Pixmap (and the
+ # underlying I/O machinery) to determine the filetype.
+ #
+ def slotLoad( filename )
+ if !@_buffer.load( filename )
+ Qt::MessageBox.warning( nil, "Load error", "Could not load file" )
+ end
+
+ repaint() # refresh the window
+ end
+
+
+ #
+ # This method does the actual saving. We hard-code the file type as
+ # BMP. Unix users might want to replace this with something like XPM.
+ #
+ def slotSave( filename )
+ if !@_buffer.save( filename, "BMP" )
+ Qt::MessageBox.warning( nil, "Save error", "Could not save file" )
+ end
+ end
+
+
+ #
+ # This method is called whenever the user presses the
+ # mouse over the window. It just records the position of the mouse
+ # at the time of the click.
+ #
+ def mousePressEvent(event)
+ if event.button() == RightButton
+ @_popupmenu.exec( Qt::Cursor.pos() )
+ else
+ @_last = event.pos() # retrieve the coordinates from the event
+ end
+ end
+
+
+ #
+ # The method is called whenever the usr moves the mouse
+ # while the mouse button is pressed. If we had called
+ # setMouseTracking(true) before, the method would also be called
+ # when the mouse was moved with any button pressed. We know that
+ # we haven't, and thus don't have to check whether any buttons are
+ # pressed.
+ #
+ def mouseMoveEvent(event)
+ # create a Qt::Painter object for drawing onto the window
+ windowpainter = Qt::Painter.new()
+ # and another Qt::Painter object for drawing int an off-screen pixmap
+ bufferpainter = Qt::Painter.new()
+
+ # start painting
+ windowpainter.begin( self ) # This painter paints onto the window
+ bufferpainter.begin( @_buffer ) # and this one paints in the buffer
+
+ # set a standard pen with the currently selected color
+ windowpainter.setPen( @_currentcolor )
+ bufferpainter.setPen( @_currentcolor )
+
+ # draw a line in both the window and the buffer
+ windowpainter.drawLine( @_last, event.pos() )
+ bufferpainter.drawLine( @_last, event.pos() )
+
+ # done with painting
+ windowpainter.end()
+ bufferpainter.end()
+
+ # remember the current mouse position
+ @_last = event.pos()
+ end
+
+ #
+ # This method is called whenever the widget needs
+ # painting, for example when it has been obscured and then revealed again.
+ #
+ def paintEvent(event)
+ bitBlt(self, 0, 0, @_buffer)
+ end
+
+ #
+ # This method get called whenever the widget needs
+ # painting, for example, when it has been obscured and then revealed again.
+ #
+ def resizeEvent(event)
+ save = Qt::Pixmap.new( @_buffer )
+ @_buffer.resize( event.size() )
+ @_buffer.fill( white )
+ bitBlt( @_buffer, 0, 0, save )
+ end
+ end
+
+class ScribbleWindow < Qt::Widget
+
+ slots "slotAbout()", "slotAboutQt()", "slotColorMenu(int)", "slotLoad()", "slotSave()"
+ signals "colorChanged(QColor)", "load(const QString&)", "save(const QString&)"
+
+ COLOR_MENU_ID_BLACK = 0
+ COLOR_MENU_ID_RED = 1
+ COLOR_MENU_ID_BLUE = 2
+ COLOR_MENU_ID_GREEN = 3
+ COLOR_MENU_ID_YELLOW = 4
+
+ def initialize()
+ super
+ # The next lines build the menu bar. We first create the menus
+ # one by one, then add them to the menu bar. #
+ @_filemenu = Qt::PopupMenu.new() # create a file menu
+ @_filemenu.insertItem( "&Load", self, SLOT( "slotLoad()" ) )
+ @_filemenu.insertItem( "&Save", self, SLOT( "slotSave()" ) )
+ @_filemenu.insertSeparator()
+ @_filemenu.insertItem( "&Quit", $qApp, SLOT( "quit()" ) )
+
+ @_colormenu = Qt::PopupMenu.new() # create a color menu
+ @_colormenu.insertItem( "B&lack", COLOR_MENU_ID_BLACK)
+ @_colormenu.insertItem( "&Red", COLOR_MENU_ID_RED)
+ @_colormenu.insertItem( "&Blue", COLOR_MENU_ID_BLUE)
+ @_colormenu.insertItem( "&Green", COLOR_MENU_ID_GREEN)
+ @_colormenu.insertItem( "&Yellow", COLOR_MENU_ID_YELLOW)
+ Qt::Object.connect( @_colormenu, SIGNAL( "activated( int )" ),
+ self, SLOT( "slotColorMenu( int )" ) )
+
+ @_helpmenu = Qt::PopupMenu.new() # create a help menu
+ @_helpmenu.insertItem( "&About QtScribble", self, SLOT( "slotAbout()" ) )
+ @_helpmenu.insertItem( "&About Qt", self, SLOT( "slotAboutQt()" ) )
+
+ @_menubar = Qt::MenuBar.new( self, "" ) # create a menu bar
+ @_menubar.insertItem( "&File", @_filemenu )
+ @_menubar.insertItem( "&Color", @_colormenu )
+ @_menubar.insertItem( "&Help", @_helpmenu )
+
+ # We create a Qt::ScrollView and a ScribbleArea. The ScribbleArea will
+ # be managed by the scroll view.#
+ @_scrollview = Qt::ScrollView.new( self )
+ @_scrollview.setGeometry( 0, @_menubar.height(),
+ width(), height() - @_menubar.height() )
+ @_scribblearea = ScribbleArea.new()
+ @_scribblearea.setGeometry( 0, 0, 1000, 1000 )
+ @_scrollview.addChild( @_scribblearea )
+ Qt::Object.connect( self, SIGNAL( "colorChanged(QColor)" ),
+ @_scribblearea, SLOT( "setColor(QColor)" ) )
+ Qt::Object.connect( self, SIGNAL( "save(const QString&)" ),
+ @_scribblearea, SLOT( "slotSave(const QString&)" ) )
+ Qt::Object.connect( self, SIGNAL( "load(const QString&)" ),
+ @_scribblearea, SLOT( "slotLoad(const QString&)" ) )
+ end
+
+ def resizeEvent( event )
+ # When the whole window is resized, we have to rearrange the geometry
+ # in the ScribbleWindow as well. Note that the ScribbleArea does not need
+ # to be changed.
+ @_scrollview.setGeometry( 0, @_menubar.height(),
+ width(), height() - @_menubar.height() )
+ end
+
+
+
+ def slotAbout()
+ Qt::MessageBox.information( self, "About QtScribble 5",
+ "This is the Scribble 5 application\n" +
+ "Copyright 1998 by Mathias Kalle Dalheimer\n")
+ end
+
+ def slotAboutQt()
+ Qt::MessageBox.aboutQt( self, "About Qt" )
+ end
+
+ def slotColorMenu( item )
+ case item
+ when COLOR_MENU_ID_BLACK
+ emit colorChanged( black )
+ when COLOR_MENU_ID_RED
+ emit colorChanged( darkRed )
+ when COLOR_MENU_ID_BLUE
+ emit colorChanged( darkBlue )
+ when COLOR_MENU_ID_GREEN
+ emit colorChanged( darkGreen )
+ when COLOR_MENU_ID_YELLOW
+ emit colorChanged( yellow )
+ end
+ end
+
+
+ #
+ # This is the slot for the menu item File/Load. It opens a
+ # Qt::FileDialog to ask the user for a filename, then emits a save()
+ # signal with the filename as parameter.
+ #
+ def slotLoad()
+ # Open a file dialog for loading. The default directory is the
+ # current directory, the filter *.bmp.
+ #
+ filename = Qt::FileDialog.getOpenFileName( ".", "*.bmp", self )
+ if !filename.nil?
+ emit load( filename )
+ end
+ end
+
+ #
+ # This is the slot for the menu item File/Load. It opens a
+ # Qt::FileDialog to ask the user for a filename, then emits a save()
+ # signal with the filename as parameter.
+ #
+ def slotSave()
+ # Open a file dialog for saving. The default directory is the
+ # current directory, the filter *.bmp.
+ #
+ filename = Qt::FileDialog.getSaveFileName( ".", "*.bmp", self )
+ if !filename.nil?
+ emit save( filename )
+ end
+ end
+end
+
+myapp = Qt::Application.new(ARGV)
+mywidget = ScribbleWindow.new()
+mywidget.setGeometry(50, 500, 400, 400)
+
+myapp.setMainWidget(mywidget)
+mywidget.show()
+myapp.exec()