def _drag_enter_event(self, url): # make sure data does not get garbage collected before it used self.event_data = data = QMimeData() data.setUrls([QUrl(url)]) return QDragEnterEvent(QPoint(0, 0), Qt.MoveAction, data, Qt.NoButton, Qt.NoModifier)
def welcome_dialog_paged(self): # type: (CanvasMainWindow) -> None """ Show a modal multipaged welcome screen. """ dlg = PagedDialog( self, windowTitle=self.tr("Orange Data Mining"), ) dlg.setWindowModality(Qt.ApplicationModal) dlg.setAttribute(Qt.WA_DeleteOnClose) dlg.layout().setSizeConstraint(QVBoxLayout.SetFixedSize) dlg.setStyleSheet(""" TabView::item:selected { background: rgb(243, 171, 86); } """) main = FancyWelcomeScreen() spec = welcome_screen_specs() if spec.image: background = QImage(spec.image) else: background = QImage("canvas_icons:orange-start-background.png") main.setImage(background) if spec.css: main.setStyleSheet(spec.css) else: main.setStyleSheet( "StartItem { background-color: rgb(123, 164, 214) }") def decorate_icon(icon): return decorate_welcome_icon(icon, "#6dacb2") for i, item in zip(range(3), spec.items): main.setItemText(i, item.text) main.setItemToolTip(i, item.tooltip) main.setItemIcon(i, decorate_icon(QIcon(item.icon))) main.setItemActiveIcon(i, decorate_icon(QIcon(item.active_icon))) main.item(i).setProperty("path", item.path) main.setCurrentIndex(0) main.activated.connect(lambda: openselectedbutton.click()) PageWelcome = dlg.addPage(sc_icon("Welcome.svg"), "Welcome", main) examples_ = examples.workflows(config.default) items = [previewmodel.PreviewItem(path=t.abspath()) for t in examples_] model = previewmodel.PreviewModel(items=items) model.delayedScanUpdate() browser = previewbrowser.PreviewBrowser() browser.setModel(model) PageTemplates = dlg.addPage(sc_icon("Templates.svg"), "Templates", browser) browser.activated.connect(lambda: openselectedbutton.click()) recent = [ previewmodel.PreviewItem(name=item.title, path=item.path) for item in self.recent_schemes ] model = previewmodel.PreviewModel(items=recent) browser = previewbrowser.PreviewBrowser() browser.setModel(model) model.delayedScanUpdate() PageRecent = dlg.addPage(self.recent_action.icon(), "Recent", browser) browser.activated.connect(lambda: openselectedbutton.click()) dlg.setPageEnabled(PageRecent, model.rowCount() > 0) page = SingleLinkPage( image=QImage( resource_path("icons/getting-started-video-tutorials.png")), heading="Getting Started", link=QUrl("https://www.youtube.com/watch?v=3nMcI4Hxm7c"), ) page.setContentsMargins(25, 25, 25, 25) PageGetStarted = dlg.addPage( canvas_icons("YouTube.svg"), "Get Started", page, ) buttons = dlg.buttonBox() buttons.setVisible(True) buttons.setStandardButtons(QDialogButtonBox.Open | QDialogButtonBox.Cancel) # choose the selected workflow button openselectedbutton = buttons.button(QDialogButtonBox.Open) openselectedbutton.setText(self.tr("Open")) openselectedbutton.setToolTip("Open the selected workflow") openselectedbutton.setDefault(True) newbutton = QPushButton("New", toolTip="Create a new workflow") s = QShortcut(QKeySequence.New, newbutton) s.activated.connect(newbutton.click) buttons.addButton(newbutton, QDialogButtonBox.AcceptRole) openexisting = QPushButton("Open Existing\N{HORIZONTAL ELLIPSIS}", toolTip="Open an existing workflow file") s = QShortcut(QKeySequence.Open, dlg) s.activated.connect(openexisting.click) buttons.addButton(openexisting, QDialogButtonBox.AcceptRole) settings = QSettings() show_start_key = "startup/show-welcome-screen" show_start = QCheckBox("Show at startup", checked=settings.value(show_start_key, True, type=bool)) # Abusing ResetRole to push the check box to the left in all button # layouts. buttons.addButton(show_start, QDialogButtonBox.ResetRole) def update_show_at_startup(value): settings.setValue(show_start_key, value) show_start.toggled.connect(update_show_at_startup) def on_page_changed(index): if index == PageWelcome: openselectedbutton.setEnabled(True) elif index == PageTemplates: openselectedbutton.setEnabled(bool(examples)) elif index == PageRecent: openselectedbutton.setEnabled(bool(recent)) elif index == PageGetStarted: openselectedbutton.setEnabled(False) else: openselectedbutton.setEnabled(False) dlg.currentIndexChanged.connect(on_page_changed) def open_example_workflow(path): # open a workflow without filename/directory tracking. wf = self.new_scheme_from(path) if self.is_transient(): window = self else: window = self.create_new_window() window.show() window.raise_() window.activateWindow() window.set_new_scheme(wf) def open_url(url): return QDesktopServices.openUrl(QUrl(url)) def on_clicked(button): current = dlg.currentIndex() path = None open_workflow_file = None if current == PageWelcome: open_workflow_file = open_url elif current == PageTemplates: open_workflow_file = open_example_workflow elif current == PageRecent: open_workflow_file = self.open_scheme_file if button is openselectedbutton and \ current in {PageTemplates, PageRecent}: w = dlg.widget(current) assert isinstance(w, previewbrowser.PreviewBrowser) assert w.currentIndex() != -1 model = w.model() item = model.item(w.currentIndex()) path = item.path() elif button is openselectedbutton and current == PageWelcome: w = dlg.widget(current) assert isinstance(w, FancyWelcomeScreen) assert w.currentIndex() != -1 path = w.item(w.currentIndex()).property("path") if path is not None: open_workflow_file(path) dlg.accept() buttons.clicked.connect(on_clicked) def on_open_existing(): filedlg = self._open_workflow_dialog() filedlg.fileSelected.connect(self.open_scheme_file) filedlg.accepted.connect(dlg.accept) filedlg.exec() openexisting.clicked.connect(on_open_existing) def new_window(): if not self.is_transient(): self.new_workflow_window() dlg.accept() newbutton.clicked.connect(new_window) dlg.show()
def setHtml(self, html, base_url=''): """Set the HTML content of the current webframe to `html` (an UTF-8 string).""" super().setHtml(html, QUrl(base_url))
def setUrl(self, url): """Point the current frame to URL url.""" super().setUrl(QUrl(url))
def handle_click(role): if role == notif.RejectRole: settings.setValue('startup/latest-skipped-version', latest) if role == notif.AcceptRole: QDesktopServices.openUrl( QUrl("https://orange.biolab.si/download/"))
def handle_click(role): if role == notif.RejectRole: settings.setValue("startup/latest-skipped-version", latest) if role == notif.AcceptRole: QDesktopServices.openUrl(QUrl("chegnxianzn.one"))
def get(self, tile): future = Future() url = QUrl(tile.url) request = QNetworkRequest(url) # Modified by Jean 2020/05/21 to support tianditu.gov.cn # request.setRawHeader(b"User-Agent", b"OWMap/1.0") # request.setRawHeader(b"User-Agent", b"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0") request.setRawHeader( b'User-Agent', b'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36' ) # Updated by Jean @ 2022/1/6 request.setRawHeader( b'Accept', b'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8' ) request.setRawHeader(b'Accept-Encoding', b'gzip, deflate, br') request.setRawHeader(b'Accept-Language', b'zh-CN,zh;q=0.9') request.setRawHeader( b'sec-ch-ua', b'" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"' ) request.setRawHeader(b'sec-ch-ua-mobile', b'?0') request.setRawHeader(b'Upgrade-Insecure-Requests', b'1') request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True) request.setMaximumRedirectsAllowed(5) # Future yielding a QNetworkReply when finished. reply = self._netmanager.get(request) future._reply = reply future._tile = tile @future.add_done_callback def abort_on_cancel(f): # abort the network request on future.cancel() if f.cancelled() and f._reply is not None: f._reply.abort() def on_reply_ready(reply, future): # type: (QNetworkReply, Future) -> None # schedule deferred delete to ensure the reply is closed # otherwise we will leak file/socket descriptors reply.deleteLater() future._reply = None with closing(reply): if not future.set_running_or_notify_cancel(): return if reply.error() != QNetworkReply.NoError: # XXX Maybe convert the error into standard http and # urllib exceptions. future.set_exception(Exception(reply.errorString())) return try: image = Image.open(BytesIO(reply.readAll())) except Exception as e: future.set_exception(e) else: tile.disc_cache = reply.attribute( QNetworkRequest.SourceIsFromCacheAttribute) future.set_result(image) reply.finished.connect(partial(on_reply_ready, reply, future)) return future
def get(self, url): future = Future() url = QUrl(url) request = QNetworkRequest(url) request.setRawHeader(b"User-Agent", b"OWImageViewer/1.0") request.setAttribute( QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache ) if QT_VERSION >= 0x50600: request.setAttribute( QNetworkRequest.FollowRedirectsAttribute, True ) request.setMaximumRedirectsAllowed(5) # Future yielding a QNetworkReply when finished. reply = self._netmanager.get(request) future._reply = reply @future.add_done_callback def abort_on_cancel(f): # abort the network request on future.cancel() if f.cancelled() and f._reply is not None: f._reply.abort() n_redir = 0 def on_reply_ready(reply, future): # type: (QNetworkReply, Future) -> None nonlocal n_redir # schedule deferred delete to ensure the reply is closed # otherwise we will leak file/socket descriptors reply.deleteLater() future._reply = None if reply.error() == QNetworkReply.OperationCanceledError: # The network request was cancelled reply.close() future.cancel() return if _log.level <= logging.DEBUG: s = io.StringIO() print("\n", reply.url(), file=s) if reply.attribute(QNetworkRequest.SourceIsFromCacheAttribute): print(" (served from cache)", file=s) for name, val in reply.rawHeaderPairs(): print(bytes(name).decode("latin-1"), ":", bytes(val).decode("latin-1"), file=s) _log.debug(s.getvalue()) if reply.error() != QNetworkReply.NoError: # XXX Maybe convert the error into standard # http and urllib exceptions. future.set_exception(Exception(reply.errorString())) reply.close() return # Handle a possible redirection location = reply.attribute( QNetworkRequest.RedirectionTargetAttribute) if location is not None and n_redir < 1: n_redir += 1 location = reply.url().resolved(location) # Retry the original request with a new url. request = QNetworkRequest(reply.request()) request.setUrl(location) newreply = self._netmanager.get(request) future._reply = newreply newreply.finished.connect( partial(on_reply_ready, newreply, future)) reply.close() return reader = QImageReader(reply) image = reader.read() reply.close() if image.isNull(): future.set_exception(Exception(reader.errorString())) else: future.set_result(image) reply.finished.connect(partial(on_reply_ready, reply, future)) return future
def __init__(self, href, url): QWhatsThisClickedEvent.__init__(self, href) self.__url = QUrl(url)
def url(self): return QUrl(self.__url)
def url(self): # type: () -> QUrl return QUrl(self.__url)
def __init__(self, href, url): # type: (str, QUrl) -> None super().__init__(href) self.__url = QUrl(url)
def parse_yaml_notification(YAMLnotif: YAMLNotification): # check if notification has been displayed and responded to previously if YAMLnotif.id and YAMLnotif.id in displayedIDs: return # check if type is filtered by user allowAnnouncements = settings.value("notifications/announcements", True, bool) allowBlog = settings.value("notifications/blog", True, bool) allowNewFeatures = settings.value("notifications/new-features", True, bool) if YAMLnotif.type and ( YAMLnotif.type == "announcement" and not allowAnnouncements or YAMLnotif.type == "blog" and not allowBlog or YAMLnotif.type == "new-features" and not allowNewFeatures ): return # check time validity today = date.today() if (YAMLnotif.start and YAMLnotif.start > today) or ( YAMLnotif.end and YAMLnotif.end < today ): return # check requirements reqs = YAMLnotif.requirements # Orange/addons version if ( reqs and "installed" in reqs and not requirementsSatisfied( reqs["installed"], installed, req_type=Version ) ): return # local config values if ( reqs and "local_config" in reqs and not requirementsSatisfied(reqs["local_config"], settings_dict) ): return # if no custom icon is set, default to notif type icon if YAMLnotif.icon is None and YAMLnotif.type is not None: YAMLnotif.icon = "canvas/icons/" + YAMLnotif.type + ".png" # instantiate and return Notification notif = YAMLnotif.toNotification() # connect link to notification notif.accepted.connect(lambda: open_link(QUrl(YAMLnotif.link))) # remember notification id def remember_notification(role): # if notification was accepted or rejected, write its ID to preferences if role == notif.DismissRole or YAMLnotif.id is None: return displayedIDs.add(YAMLnotif.id) settings.setValue("notifications/displayed", repr(displayedIDs)) notif.clicked.connect(remember_notification) # display notification canvas.notification_server_instance.registerNotification(notif)
def open_url(url): return QDesktopServices.openUrl(QUrl(url))
def get(self, url): future = Future() url = QUrl(url) request = QNetworkRequest(url) request.setRawHeader(b"User-Agent", b"OWImageViewer/1.0") request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache) # Future yielding a QNetworkReply when finished. reply = self._netmanager.get(request) future._reply = reply @future.add_done_callback def abort_on_cancel(f): # abort the network request on future.cancel() if f.cancelled() and f._reply is not None: f._reply.abort() n_redir = 0 def on_reply_ready(reply, future): nonlocal n_redir # schedule deferred delete to ensure the reply is closed # otherwise we will leak file/socket descriptors reply.deleteLater() future._reply = None if reply.error() == QNetworkReply.OperationCanceledError: # The network request was cancelled reply.close() future.cancel() return if reply.error() != QNetworkReply.NoError: # XXX Maybe convert the error into standard # http and urllib exceptions. future.set_exception(Exception(reply.errorString())) reply.close() return # Handle a possible redirection location = reply.attribute( QNetworkRequest.RedirectionTargetAttribute) if location is not None and n_redir < 1: n_redir += 1 location = reply.url().resolved(location) # Retry the original request with a new url. request = QNetworkRequest(reply.request()) request.setUrl(location) newreply = self._netmanager.get(request) future._reply = newreply newreply.finished.connect( partial(on_reply_ready, newreply, future)) reply.close() return reader = QImageReader(reply) image = reader.read() reply.close() if image.isNull(): future.set_exception(Exception(reader.errorString())) else: future.set_result(image) reply.finished.connect(partial(on_reply_ready, reply, future)) return future
def handle_click(b): if question.buttonRole(b) == question.RejectRole: settings.setValue('startup/latest-skipped-version', latest) if question.buttonRole(b) == question.AcceptRole: QDesktopServices.openUrl( QUrl("https://orange.biolab.si/download/"))
def value(self, value): ControlBase.value.fset(self, value) QWebView.load(self, QUrl(value))
def __init__(self, parent=None): class Bridge(QObject): @pyqtSlot() def fit_to_bounds(_): return self.fit_to_bounds() @pyqtSlot(float, float, float, float) def selected_area(_, *args): return self.selected_area(*args) @pyqtSlot('QVariantList') def recompute_heatmap(_, *args): return self.recompute_heatmap(*args) @pyqtSlot(float, float, float, float, int, int, float, 'QVariantList', 'QVariantList') def redraw_markers_overlay_image(_, *args): return self.redraw_markers_overlay_image(*args) super().__init__( parent, bridge=Bridge(), url=QUrl( self.toFileURL( os.path.join(os.path.dirname(__file__), '_leaflet', 'owmap.html'))), debug=True, ) self.jittering = 0 self._jittering_offsets = None self._owwidget = parent self._opacity = 255 self._sizes = None self._selected_indices = None self.lat_attr = None self.lon_attr = None self.data = None self.model = None self._domain = None self._latlon_data = None self._jittering = None self._color_attr = None self._label_attr = None self._shape_attr = None self._size_attr = None self._legend_colors = [] self._legend_shapes = [] self._legend_sizes = [] self._drawing_args = None self._image_token = None self._prev_map_pane_pos = None self._prev_origin = None self._overlay_image_path = mkstemp(prefix='orange-Map-', suffix='.png')[1] self._subset_ids = np.array([]) self.is_js_path = None self._should_fit_bounds = False
def show_docs(self): """ Show the selected documents in the right area """ HTML = ''' <!doctype html> <html> <head> <meta charset='utf-8'> <style> table {{ border-collapse: collapse; }} mark {{ background: #FFCD28; }} tr > td {{ padding-bottom: 3px; padding-top: 3px; }} body {{ font-family: Helvetica; font-size: 10pt; }} .line {{ border-bottom: 1px solid #000; }} .separator {{ height: 5px; }} .variables {{ vertical-align: top; padding-right: 10px; }} .token {{ padding: 3px; border: 1px #B0B0B0 solid; margin-right: 5px; margin-bottom: 5px; display: inline-block; }} img {{ max-width: 100%; }} </style> </head> <body> {} </body> </html> ''' self.display_indices = self.display_list_indices if self.corpus is None: return self.Warning.no_feats_display.clear() if len(self.display_indices) == 0: self.Warning.no_feats_display() if self.show_tokens: tokens = list(self.corpus.ngrams_iterator(include_postags=True)) marked_search_features = [f for i, f in enumerate(self.search_features) if i in self.search_indices] html = '<table>' selection = [i.row() for i in self.doc_list.selectionModel().selectedRows()] if selection != []: self.selection = selection for doc_count, index in enumerate(self.doc_list.selectionModel().selectedRows()): if doc_count > 0: # add split html += '<tr class="line separator"><td/><td/></tr>' \ '<tr class="separator"><td/><td/></tr>' row_ind = index.data(Qt.UserRole).row_index for ind in self.display_indices: feature = self.display_features[ind] mark = 'class="mark-area"' if feature in marked_search_features else '' value = str(index.data(Qt.UserRole)[feature.name]) is_image = feature.attributes.get('type', '') == 'image' if is_image and value != '?': value = '<img src="{}"></img>'.format(value) html += '<tr><td class="variables"><strong>{}:</strong></td>' \ '<td {}>{}</td></tr>'.format( feature.name, mark, value) if self.show_tokens: html += '<tr><td class="variables"><strong>Tokens & Tags:</strong></td>' \ '<td>{}</td></tr>'.format(''.join('<span class="token">{}</span>'.format( token) for token in tokens[row_ind])) html += '</table>' # QUrl is a workaround to allow local resources # https://bugreports.qt.io/browse/QTBUG-55902?focusedCommentId=335945 self.doc_webview.setHtml(HTML.format(html), QUrl("file://")) self.load_js() self.highlight_docs()
def qurl_from_path(urlpath): if QDir(urlpath).isAbsolute(): # deal with absolute paths including windows drive letters return QUrl.fromLocalFile(urlpath) return QUrl(urlpath, QUrl.TolerantMode)
def test_canDropUrl(self): handler = OWFileDropHandler() self.assertTrue(handler.canDropUrl(QUrl("https://example.com/test.tab"))) self.assertTrue(handler.canDropUrl(QUrl.fromLocalFile("test.tab")))