Basic status bar functionality in place

This commit is contained in:
Kovid Goyal 2007-06-19 20:08:09 +00:00
parent 3526d3d28c
commit 6c63fc0ec7
6 changed files with 22647 additions and 221 deletions

View File

@ -6,12 +6,13 @@
<file>images/delfile.png</file>
<file>images/edit.png</file>
<file>images/fileopen.png</file>
<file>images/jobs-animated.mng</file>
<file>images/jobs.svg</file>
<file alias="library" >images/library.png</file>
<file alias="card" >images/memory_stick_unmount.png</file>
<file>images/minus.png</file>
<file>images/plus.png</file>
<file alias="reader" >images/reader.png</file>
<file>images/upload.png</file>
<file>images/jobs.svg</file>
</qresource>
</RCC>

File diff suppressed because it is too large Load Diff

View File

@ -24,6 +24,7 @@ from PyQt4.Qt import qDebug, qFatal, qWarning, qCritical
from libprs500.gui2 import APP_TITLE, installErrorHandler
from libprs500.gui2.main_ui import Ui_MainWindow
from libprs500.gui2.device import DeviceDetector
from libprs500.gui2.status import StatusBar
class Main(QObject, Ui_MainWindow):
@ -34,10 +35,9 @@ class Main(QObject, Ui_MainWindow):
self.setupUi(window)
self.read_settings()
####################### Tabs setup #####################
self.tabs.setup()
self.tabs.animate()
####################### Status Bar #####################
self.status_bar = StatusBar()
self.window.setStatusBar(self.status_bar)
####################### Setup books view ########################
self.library_view.set_database(self.database_path)

View File

@ -170,38 +170,19 @@
</layout>
</item>
<item row="2" column="0" >
<widget class="AnimatedTabWidget" name="tabs" >
<property name="tabPosition" >
<enum>QTabWidget::West</enum>
</property>
<property name="currentIndex" >
<number>0</number>
</property>
<property name="usesScrollButtons" >
<bool>false</bool>
</property>
<widget class="QWidget" name="books_tab" >
<attribute name="title" >
<string>Books</string>
</attribute>
<attribute name="icon" >
<iconset resource="images.qrc" >:/library</iconset>
</attribute>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QStackedWidget" name="stacks" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
<horstretch>100</horstretch>
<verstretch>0</verstretch>
<verstretch>100</verstretch>
</sizepolicy>
</property>
<property name="currentIndex" >
<number>0</number>
</property>
<widget class="QWidget" name="library" >
<layout class="QGridLayout" >
<item row="0" column="0" >
<layout class="QVBoxLayout" >
<item>
<widget class="BooksView" name="library_view" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
@ -273,67 +254,6 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="jobs_tab" >
<attribute name="title" >
<string>Jobs</string>
</attribute>
<attribute name="toolTip" >
<string>Show jobs being currently processed</string>
</attribute>
<layout class="QGridLayout" />
</widget>
</widget>
</item>
<item row="3" column="0" >
<layout class="QHBoxLayout" >
<property name="spacing" >
<number>6</number>
</property>
<property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number>
</property>
<item>
<widget class="CoverDisplay" name="book_cover" >
<property name="maximumSize" >
<size>
<width>60</width>
<height>80</height>
</size>
</property>
<property name="acceptDrops" >
<bool>true</bool>
</property>
<property name="pixmap" >
<pixmap/>
</property>
<property name="scaledContents" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="book_info" >
<property name="text" >
<string>&lt;table>&lt;tr>&lt;td>&lt;b>Title: &lt;/b>%1&lt;/td>&lt;td>&lt;b>&amp;nbsp;Size:&lt;/b> %2&lt;/td>&lt;/tr>&lt;tr>&lt;td>&lt;b>Author: &lt;/b>%3&lt;/td>&lt;td>&lt;b>&amp;nbsp;Type: &lt;/b>%4&lt;/td>&lt;/tr>&lt;/table></string>
</property>
<property name="textFormat" >
<enum>Qt::RichText</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QToolBar" name="tool_bar" >
<property name="minimumSize" >
<size>
@ -366,6 +286,11 @@
<addaction name="action_del" />
<addaction name="action_edit" />
</widget>
<widget class="QStatusBar" name="statusBar" >
<property name="mouseTracking" >
<bool>true</bool>
</property>
</widget>
<action name="action_add" >
<property name="icon" >
<iconset resource="images.qrc" >:/images/addfile.png</iconset>
@ -407,11 +332,6 @@
</action>
</widget>
<customwidgets>
<customwidget>
<class>CoverDisplay</class>
<extends>QLabel</extends>
<header>widgets.h</header>
</customwidget>
<customwidget>
<class>DeviceView</class>
<extends>QListView</extends>
@ -427,12 +347,6 @@
<extends>QLineEdit</extends>
<header>library.h</header>
</customwidget>
<customwidget>
<class>AnimatedTabWidget</class>
<extends>QTabWidget</extends>
<header>progress.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="images.qrc" />

View File

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'main.ui'
#
# Created: Thu Jun 7 08:58:03 2007
# Created: Tue Jun 19 11:07:30 2007
# by: PyQt4 UI code generator 4-snapshot-20070606
#
# WARNING! All changes made in this file will be lost!
@ -86,22 +86,11 @@ class Ui_MainWindow(object):
self.hboxlayout1.addWidget(self.clear_button)
self.gridlayout.addLayout(self.hboxlayout1,1,0,1,1)
self.tabs = AnimatedTabWidget(self.centralwidget)
self.tabs.setTabPosition(QtGui.QTabWidget.West)
self.tabs.setUsesScrollButtons(False)
self.tabs.setObjectName("tabs")
self.stacks = QtGui.QStackedWidget(self.centralwidget)
self.books_tab = QtGui.QWidget()
self.books_tab.setObjectName("books_tab")
self.gridlayout1 = QtGui.QGridLayout(self.books_tab)
self.gridlayout1.setObjectName("gridlayout1")
self.stacks = QtGui.QStackedWidget(self.books_tab)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Preferred)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(100)
sizePolicy.setVerticalStretch(0)
sizePolicy.setVerticalStretch(100)
sizePolicy.setHeightForWidth(self.stacks.sizePolicy().hasHeightForWidth())
self.stacks.setSizePolicy(sizePolicy)
self.stacks.setObjectName("stacks")
@ -109,8 +98,8 @@ class Ui_MainWindow(object):
self.library = QtGui.QWidget()
self.library.setObjectName("library")
self.gridlayout2 = QtGui.QGridLayout(self.library)
self.gridlayout2.setObjectName("gridlayout2")
self.vboxlayout = QtGui.QVBoxLayout(self.library)
self.vboxlayout.setObjectName("vboxlayout")
self.library_view = BooksView(self.library)
@ -127,14 +116,14 @@ class Ui_MainWindow(object):
self.library_view.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.library_view.setShowGrid(False)
self.library_view.setObjectName("library_view")
self.gridlayout2.addWidget(self.library_view,0,0,1,1)
self.vboxlayout.addWidget(self.library_view)
self.stacks.addWidget(self.library)
self.main_memory = QtGui.QWidget()
self.main_memory.setObjectName("main_memory")
self.gridlayout3 = QtGui.QGridLayout(self.main_memory)
self.gridlayout3.setObjectName("gridlayout3")
self.gridlayout1 = QtGui.QGridLayout(self.main_memory)
self.gridlayout1.setObjectName("gridlayout1")
self.main_memory_view = BooksView(self.main_memory)
@ -151,36 +140,9 @@ class Ui_MainWindow(object):
self.main_memory_view.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.main_memory_view.setShowGrid(False)
self.main_memory_view.setObjectName("main_memory_view")
self.gridlayout3.addWidget(self.main_memory_view,0,0,1,1)
self.gridlayout1.addWidget(self.main_memory_view,0,0,1,1)
self.stacks.addWidget(self.main_memory)
self.gridlayout1.addWidget(self.stacks,0,0,1,1)
self.tabs.addTab(self.books_tab,QtGui.QIcon(":/library"),"")
self.jobs_tab = QtGui.QWidget()
self.jobs_tab.setObjectName("jobs_tab")
self.gridlayout4 = QtGui.QGridLayout(self.jobs_tab)
self.gridlayout4.setObjectName("gridlayout4")
self.tabs.addTab(self.jobs_tab,"")
self.gridlayout.addWidget(self.tabs,2,0,1,1)
self.hboxlayout2 = QtGui.QHBoxLayout()
self.hboxlayout2.setSpacing(6)
self.hboxlayout2.setMargin(0)
self.hboxlayout2.setObjectName("hboxlayout2")
self.book_cover = CoverDisplay(self.centralwidget)
self.book_cover.setMaximumSize(QtCore.QSize(60,80))
self.book_cover.setAcceptDrops(True)
self.book_cover.setScaledContents(True)
self.book_cover.setObjectName("book_cover")
self.hboxlayout2.addWidget(self.book_cover)
self.book_info = QtGui.QLabel(self.centralwidget)
self.book_info.setTextFormat(QtCore.Qt.RichText)
self.book_info.setObjectName("book_info")
self.hboxlayout2.addWidget(self.book_info)
self.gridlayout.addLayout(self.hboxlayout2,3,0,1,1)
self.gridlayout.addWidget(self.stacks,2,0,1,1)
MainWindow.setCentralWidget(self.centralwidget)
self.tool_bar = QtGui.QToolBar(MainWindow)
@ -192,6 +154,11 @@ class Ui_MainWindow(object):
self.tool_bar.setObjectName("tool_bar")
MainWindow.addToolBar(self.tool_bar)
self.statusBar = QtGui.QStatusBar(MainWindow)
self.statusBar.setMouseTracking(True)
self.statusBar.setObjectName("statusBar")
MainWindow.setStatusBar(self.statusBar)
self.action_add = QtGui.QAction(MainWindow)
self.action_add.setIcon(QtGui.QIcon(":/images/addfile.png"))
self.action_add.setAutoRepeat(False)
@ -211,7 +178,6 @@ class Ui_MainWindow(object):
self.label.setBuddy(self.search)
self.retranslateUi(MainWindow)
self.tabs.setCurrentIndex(0)
self.stacks.setCurrentIndex(0)
QtCore.QObject.connect(self.clear_button,QtCore.SIGNAL("clicked()"),self.search.clear)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
@ -224,10 +190,6 @@ class Ui_MainWindow(object):
self.search.setWhatsThis(QtGui.QApplication.translate("MainWindow", "Search the list of books by title, author, publisher, tags and comments<br><br>Words separated by spaces are ANDed", None, QtGui.QApplication.UnicodeUTF8))
self.clear_button.setToolTip(QtGui.QApplication.translate("MainWindow", "Reset Quick Search", None, QtGui.QApplication.UnicodeUTF8))
self.clear_button.setText(QtGui.QApplication.translate("MainWindow", "...", None, QtGui.QApplication.UnicodeUTF8))
self.tabs.setTabText(self.tabs.indexOf(self.books_tab), QtGui.QApplication.translate("MainWindow", "Books", None, QtGui.QApplication.UnicodeUTF8))
self.tabs.setTabText(self.tabs.indexOf(self.jobs_tab), QtGui.QApplication.translate("MainWindow", "Jobs", None, QtGui.QApplication.UnicodeUTF8))
self.tabs.setTabToolTip(self.tabs.indexOf(self.jobs_tab),QtGui.QApplication.translate("MainWindow", "Show jobs being currently processed", None, QtGui.QApplication.UnicodeUTF8))
self.book_info.setText(QtGui.QApplication.translate("MainWindow", "<table><tr><td><b>Title: </b>%1</td><td><b>&nbsp;Size:</b> %2</td></tr><tr><td><b>Author: </b>%3</td><td><b>&nbsp;Type: </b>%4</td></tr></table>", None, QtGui.QApplication.UnicodeUTF8))
self.action_add.setText(QtGui.QApplication.translate("MainWindow", "Add books to Library", None, QtGui.QApplication.UnicodeUTF8))
self.action_add.setShortcut(QtGui.QApplication.translate("MainWindow", "A", None, QtGui.QApplication.UnicodeUTF8))
self.action_del.setText(QtGui.QApplication.translate("MainWindow", "Delete books", None, QtGui.QApplication.UnicodeUTF8))
@ -235,7 +197,6 @@ class Ui_MainWindow(object):
self.action_edit.setText(QtGui.QApplication.translate("MainWindow", "Edit meta-information", None, QtGui.QApplication.UnicodeUTF8))
self.action_edit.setShortcut(QtGui.QApplication.translate("MainWindow", "E", None, QtGui.QApplication.UnicodeUTF8))
from widgets import DeviceView, CoverDisplay
from progress import AnimatedTabWidget
from widgets import DeviceView
from library import BooksView, SearchBox
import images_rc

View File

@ -0,0 +1,108 @@
## Copyright (C) 2007 Kovid Goyal kovid@kovidgoyal.net
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from PyQt4.QtGui import QStatusBar, QMovie, QLabel, QFrame, QHBoxLayout, QPixmap, \
QSizePolicy
from PyQt4.QtCore import Qt, QSize
class BookInfoDisplay(QFrame):
class BookCoverDisplay(QLabel):
WIDTH = 60
HEIGHT = 80
def __init__(self, coverpath=':default_cover'):
QLabel.__init__(self)
self.default_pixmap = QPixmap(coverpath).scaled(self.__class__.WIDTH,
self.__class__.HEIGHT,
Qt.IgnoreAspectRatio,
Qt.SmoothTransformation)
self.setPixmap(self.default_pixmap)
self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
def sizeHint(self):
return QSize(self.__class__.WIDTH, self.__class__.HEIGHT)
class BookDataDisplay(QLabel):
def __init__(self):
QLabel.__init__(self)
self.setTextInteractionFlags(Qt.TextSelectableByMouse)
self.setText('TODO')
def __init__(self):
QFrame.__init__(self)
self.layout = QHBoxLayout()
self.setLayout(self.layout)
self.cover_display = BookInfoDisplay.BookCoverDisplay()
self.layout.addWidget(self.cover_display)
self.book_data = BookInfoDisplay.BookDataDisplay()
self.layout.addWidget(self.book_data)
class MovieButton(QLabel):
def __init__(self, movie):
QLabel.__init__(self)
self.movie = movie
self.setMovie(movie)
self.movie.start()
self.movie.stop()
class StatusBar(QStatusBar):
def __init__(self):
QStatusBar.__init__(self)
self.movie_button = MovieButton(QMovie(':/images/jobs-animated.mng'))
self.addPermanentWidget(self.movie_button)
self.book_info = BookInfoDisplay()
self.addWidget(self.book_info)
if __name__ == '__main__':
# Used to create the animated status icon
from PyQt4.Qt import QApplication, QPainter, QSvgRenderer, QPixmap, QColor
from subprocess import check_call
import os
app = QApplication([])
def create_pixmaps(path, size=16, delta=20):
r = QSvgRenderer(path)
if not r.isValid():
raise Exception(path + ' not valid svg')
pixmaps = []
for angle in range(0, 360+delta, delta):
pm = QPixmap(size, size)
pm.fill(QColor(0,0,0,0))
p = QPainter(pm)
p.translate(size/2., size/2.)
p.rotate(angle)
p.translate(-size/2., -size/2.)
r.render(p)
p.end()
pixmaps.append(pm)
return pixmaps
def create_mng(path='/home/kovid/work/libprs500/src/libprs500/gui2/images/jobs.svg', size=64, angle=5, delay=5):
pixmaps = create_pixmaps(path, size, angle)
filesl = []
for i in range(len(pixmaps)):
name = 'a%s.png'%(i,)
filesl.append(name)
pixmaps[i].save(name, 'PNG')
filesc = ' '.join(filesl)
cmd = 'convert -dispose Background -delay '+str(delay)+ ' ' + filesc + ' -loop 0 animated.mng'
print cmd
try:
check_call(cmd, shell=True)
finally:
for file in filesl:
os.remove(file)