1#!/usr/bin/env python 2 3 4############################################################################# 5## 6## Copyright (C) 2013 Riverbank Computing Limited. 7## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 8## All rights reserved. 9## 10## This file is part of the examples of PyQt. 11## 12## $QT_BEGIN_LICENSE:BSD$ 13## You may use this file under the terms of the BSD license as follows: 14## 15## "Redistribution and use in source and binary forms, with or without 16## modification, are permitted provided that the following conditions are 17## met: 18## * Redistributions of source code must retain the above copyright 19## notice, this list of conditions and the following disclaimer. 20## * Redistributions in binary form must reproduce the above copyright 21## notice, this list of conditions and the following disclaimer in 22## the documentation and/or other materials provided with the 23## distribution. 24## * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor 25## the names of its contributors may be used to endorse or promote 26## products derived from this software without specific prior written 27## permission. 28## 29## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 32## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 34## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 35## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 36## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 39## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 40## $QT_END_LICENSE$ 41## 42############################################################################# 43 44 45from PyQt5.QtCore import QDate, QSize, Qt 46from PyQt5.QtGui import QIcon 47from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit, 48 QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit, 49 QListView, QListWidget, QListWidgetItem, QPushButton, QSpinBox, 50 QStackedWidget, QVBoxLayout, QWidget) 51 52import configdialog_rc 53 54 55class ConfigurationPage(QWidget): 56 def __init__(self, parent=None): 57 super(ConfigurationPage, self).__init__(parent) 58 59 configGroup = QGroupBox("Server configuration") 60 61 serverLabel = QLabel("Server:") 62 serverCombo = QComboBox() 63 serverCombo.addItem("Trolltech (Australia)") 64 serverCombo.addItem("Trolltech (Germany)") 65 serverCombo.addItem("Trolltech (Norway)") 66 serverCombo.addItem("Trolltech (People's Republic of China)") 67 serverCombo.addItem("Trolltech (USA)") 68 69 serverLayout = QHBoxLayout() 70 serverLayout.addWidget(serverLabel) 71 serverLayout.addWidget(serverCombo) 72 73 configLayout = QVBoxLayout() 74 configLayout.addLayout(serverLayout) 75 configGroup.setLayout(configLayout) 76 77 mainLayout = QVBoxLayout() 78 mainLayout.addWidget(configGroup) 79 mainLayout.addStretch(1) 80 81 self.setLayout(mainLayout) 82 83 84class UpdatePage(QWidget): 85 def __init__(self, parent=None): 86 super(UpdatePage, self).__init__(parent) 87 88 updateGroup = QGroupBox("Package selection") 89 systemCheckBox = QCheckBox("Update system") 90 appsCheckBox = QCheckBox("Update applications") 91 docsCheckBox = QCheckBox("Update documentation") 92 93 packageGroup = QGroupBox("Existing packages") 94 95 packageList = QListWidget() 96 qtItem = QListWidgetItem(packageList) 97 qtItem.setText("Qt") 98 qsaItem = QListWidgetItem(packageList) 99 qsaItem.setText("QSA") 100 teamBuilderItem = QListWidgetItem(packageList) 101 teamBuilderItem.setText("Teambuilder") 102 103 startUpdateButton = QPushButton("Start update") 104 105 updateLayout = QVBoxLayout() 106 updateLayout.addWidget(systemCheckBox) 107 updateLayout.addWidget(appsCheckBox) 108 updateLayout.addWidget(docsCheckBox) 109 updateGroup.setLayout(updateLayout) 110 111 packageLayout = QVBoxLayout() 112 packageLayout.addWidget(packageList) 113 packageGroup.setLayout(packageLayout) 114 115 mainLayout = QVBoxLayout() 116 mainLayout.addWidget(updateGroup) 117 mainLayout.addWidget(packageGroup) 118 mainLayout.addSpacing(12) 119 mainLayout.addWidget(startUpdateButton) 120 mainLayout.addStretch(1) 121 122 self.setLayout(mainLayout) 123 124 125class QueryPage(QWidget): 126 def __init__(self, parent=None): 127 super(QueryPage, self).__init__(parent) 128 129 packagesGroup = QGroupBox("Look for packages") 130 131 nameLabel = QLabel("Name:") 132 nameEdit = QLineEdit() 133 134 dateLabel = QLabel("Released after:") 135 dateEdit = QDateTimeEdit(QDate.currentDate()) 136 137 releasesCheckBox = QCheckBox("Releases") 138 upgradesCheckBox = QCheckBox("Upgrades") 139 140 hitsSpinBox = QSpinBox() 141 hitsSpinBox.setPrefix("Return up to ") 142 hitsSpinBox.setSuffix(" results") 143 hitsSpinBox.setSpecialValueText("Return only the first result") 144 hitsSpinBox.setMinimum(1) 145 hitsSpinBox.setMaximum(100) 146 hitsSpinBox.setSingleStep(10) 147 148 startQueryButton = QPushButton("Start query") 149 150 packagesLayout = QGridLayout() 151 packagesLayout.addWidget(nameLabel, 0, 0) 152 packagesLayout.addWidget(nameEdit, 0, 1) 153 packagesLayout.addWidget(dateLabel, 1, 0) 154 packagesLayout.addWidget(dateEdit, 1, 1) 155 packagesLayout.addWidget(releasesCheckBox, 2, 0) 156 packagesLayout.addWidget(upgradesCheckBox, 3, 0) 157 packagesLayout.addWidget(hitsSpinBox, 4, 0, 1, 2) 158 packagesGroup.setLayout(packagesLayout) 159 160 mainLayout = QVBoxLayout() 161 mainLayout.addWidget(packagesGroup) 162 mainLayout.addSpacing(12) 163 mainLayout.addWidget(startQueryButton) 164 mainLayout.addStretch(1) 165 166 self.setLayout(mainLayout) 167 168 169class ConfigDialog(QDialog): 170 def __init__(self, parent=None): 171 super(ConfigDialog, self).__init__(parent) 172 173 self.contentsWidget = QListWidget() 174 self.contentsWidget.setViewMode(QListView.IconMode) 175 self.contentsWidget.setIconSize(QSize(96, 84)) 176 self.contentsWidget.setMovement(QListView.Static) 177 self.contentsWidget.setMaximumWidth(128) 178 self.contentsWidget.setSpacing(12) 179 180 self.pagesWidget = QStackedWidget() 181 self.pagesWidget.addWidget(ConfigurationPage()) 182 self.pagesWidget.addWidget(UpdatePage()) 183 self.pagesWidget.addWidget(QueryPage()) 184 185 closeButton = QPushButton("Close") 186 187 self.createIcons() 188 self.contentsWidget.setCurrentRow(0) 189 190 closeButton.clicked.connect(self.close) 191 192 horizontalLayout = QHBoxLayout() 193 horizontalLayout.addWidget(self.contentsWidget) 194 horizontalLayout.addWidget(self.pagesWidget, 1) 195 196 buttonsLayout = QHBoxLayout() 197 buttonsLayout.addStretch(1) 198 buttonsLayout.addWidget(closeButton) 199 200 mainLayout = QVBoxLayout() 201 mainLayout.addLayout(horizontalLayout) 202 mainLayout.addStretch(1) 203 mainLayout.addSpacing(12) 204 mainLayout.addLayout(buttonsLayout) 205 206 self.setLayout(mainLayout) 207 208 self.setWindowTitle("Config Dialog") 209 210 def changePage(self, current, previous): 211 if not current: 212 current = previous 213 214 self.pagesWidget.setCurrentIndex(self.contentsWidget.row(current)) 215 216 def createIcons(self): 217 configButton = QListWidgetItem(self.contentsWidget) 218 configButton.setIcon(QIcon(':/images/config.png')) 219 configButton.setText("Configuration") 220 configButton.setTextAlignment(Qt.AlignHCenter) 221 configButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) 222 223 updateButton = QListWidgetItem(self.contentsWidget) 224 updateButton.setIcon(QIcon(':/images/update.png')) 225 updateButton.setText("Update") 226 updateButton.setTextAlignment(Qt.AlignHCenter) 227 updateButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) 228 229 queryButton = QListWidgetItem(self.contentsWidget) 230 queryButton.setIcon(QIcon(':/images/query.png')) 231 queryButton.setText("Query") 232 queryButton.setTextAlignment(Qt.AlignHCenter) 233 queryButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) 234 235 self.contentsWidget.currentItemChanged.connect(self.changePage) 236 237 238if __name__ == '__main__': 239 240 import sys 241 242 app = QApplication(sys.argv) 243 dialog = ConfigDialog() 244 sys.exit(dialog.exec_()) 245