Changeset 11502:66682f793dbd in orange


Ignore:
Timestamp:
05/10/13 11:59:29 (12 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Fixed placement of popup category menu widgets.

They now popup to the right or left of the toolbar.

Location:
Orange/OrangeCanvas/application
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/application/canvasmain.py

    r11496 r11502  
    1717    QFileDialog, QMessageBox, QVBoxLayout, QSizePolicy, QColor, QKeySequence, 
    1818    QIcon, QToolBar, QToolButton, QDockWidget, QDesktopServices, QApplication, 
    19     QCursor 
    2019) 
    2120 
     
    4241 
    4342from .canvastooldock import CanvasToolDock, QuickCategoryToolbar, \ 
    44                             CategoryPopupMenu 
     43                            CategoryPopupMenu, popup_position_from_source 
    4544from .aboutdialog import AboutDialog 
    4645from .schemeinfo import SchemeInfoDialog 
     
    773772        if self.use_popover: 
    774773            # Show a popup menu with the widgets in the category 
    775             m = CategoryPopupMenu(self.quick_category) 
     774            popup = CategoryPopupMenu(self.quick_category) 
    776775            reg = self.widget_registry.model() 
    777776            i = index(self.widget_registry.categories(), category, 
    778777                      predicate=lambda name, cat: cat.name == name) 
    779778            if i != -1: 
    780                 m.setCategoryItem(reg.item(i)) 
    781                 action = m.exec_(QCursor.pos()) 
     779                popup.setCategoryItem(reg.item(i)) 
     780                button = self.quick_category.buttonForAction(action) 
     781                pos = popup_position_from_source(popup, button) 
     782                action = popup.exec_(pos) 
    782783                if action is not None: 
    783784                    self.on_tool_box_widget_activated(action) 
  • Orange/OrangeCanvas/application/canvastooldock.py

    r11495 r11502  
    1111 
    1212from PyQt4.QtCore import ( 
    13     Qt, QSize, QObject, QPropertyAnimation, QEvent, QRect, 
     13    Qt, QSize, QObject, QPropertyAnimation, QEvent, QRect, QPoint, 
    1414    QModelIndex, QPersistentModelIndex, QEventLoop, QMimeData 
    1515) 
     
    536536 
    537537    return geom 
     538 
     539 
     540def popup_position_from_source(popup, source, orientation=Qt.Vertical): 
     541    popup.ensurePolished() 
     542    source.ensurePolished() 
     543 
     544    if popup.testAttribute(Qt.WA_Resized): 
     545        size = popup.size() 
     546    else: 
     547        size = popup.sizeHint() 
     548 
     549    desktop = QApplication.desktop() 
     550    screen_geom = desktop.availableGeometry(source) 
     551    source_rect = QRect(source.mapToGlobal(QPoint(0, 0)), source.size()) 
     552 
     553    if orientation == Qt.Vertical: 
     554        if source_rect.right() + size.width() < screen_geom.width(): 
     555            x = source_rect.right() 
     556        else: 
     557            x = source_rect.left() - size.width() 
     558 
     559        # bottom overflow 
     560        dy = source_rect.top() + size.height() - screen_geom.height() 
     561        if dy < 0: 
     562            y = source_rect.top() 
     563        else: 
     564            y = source_rect.top() - dy 
     565    else: 
     566        # right overflow 
     567        dx = source_rect.left() + size.width() - screen_geom.width() 
     568        if dx < 0: 
     569            x = source_rect.left() 
     570        else: 
     571            x = source_rect.left() - dx 
     572 
     573        if source_rect.bottom() + size.height() < screen_geom.height(): 
     574            y = source_rect.bottom() 
     575        else: 
     576            y = source_rect.top() - size.height() 
     577 
     578    return QPoint(x, y) 
Note: See TracChangeset for help on using the changeset viewer.