00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 import os
00022 import ost
00023 from ost import gui
00024 from ost import gfx
00025 from datetime import datetime
00026 from PyQt4 import QtCore, QtGui
00027
00028 from loader_list_model import LoaderListModel
00029 from file_loader import GenericLoader
00030
00031
00032 class LoaderManagerWidget(QtGui.QDialog):
00033 ICONS_DIR = os.path.join(ost.GetSharedDataPath(), "gui", "icons/")
00034 def __init__(self, parent=None):
00035 QtGui.QDialog.__init__(self, parent)
00036
00037
00038 self.text_ = "Loader Manager"
00039
00040
00041 self.list_view_ = QtGui.QListView()
00042
00043
00044 self.list_model_ = LoaderListModel(self)
00045 self.list_view_.setModel(self.list_model_)
00046 self.list_view_.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
00047
00048 loader_label = QtGui.QLabel(self.text_)
00049 font = loader_label.font()
00050 font.setBold(True)
00051
00052 self.add_action = QtGui.QAction("+",self)
00053 self.add_action.setIcon(QtGui.QIcon(LoaderManagerWidget.ICONS_DIR+"add_icon.png"))
00054
00055 QtCore.QObject.connect(self.add_action, QtCore.SIGNAL("triggered()"), self.Add)
00056
00057 self.add_button_ = QtGui.QToolButton(self)
00058 self.add_button_.setIconSize(QtCore.QSize(20,20))
00059 self.add_button_.setDefaultAction(self.add_action)
00060
00061 grid = QtGui.QGridLayout()
00062 grid.setContentsMargins(0,5,0,0)
00063 grid.addWidget(loader_label, 0, 0, 1, 1)
00064 qhbox = QtGui.QHBoxLayout()
00065 grid.addWidget(self.list_view_,1,0,3,3)
00066 grid.addWidget(self.add_button_,4,0,1,1)
00067 self.setLayout(grid)
00068
00069 self.list_view_.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
00070 QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("customContextMenuRequested(const QPoint)"), self.contextMenuEvent)
00071 self.CreateContextMenu()
00072
00073 QtCore.QObject.connect(self.list_view_, QtCore.SIGNAL("doubleClicked(const QModelIndex)"), self.Edit)
00074
00075 def CreateContextMenu(self):
00076 self.contextMenu_ = QtGui.QMenu("Context menu", self)
00077 self.remove_ = QtGui.QAction("Remove", self.list_view_)
00078 self.rename_ = QtGui.QAction("Rename", self.list_view_)
00079 self.edit_ = QtGui.QAction("Edit", self.list_view_)
00080 self.contextMenu_.addAction(self.remove_)
00081 self.contextMenu_.addAction(self.rename_)
00082 self.contextMenu_.addAction(self.edit_)
00083
00084 QtCore.QObject.connect(self.remove_, QtCore.SIGNAL("triggered()"), self.Remove)
00085 QtCore.QObject.connect(self.rename_, QtCore.SIGNAL("triggered()"), self.Rename)
00086 QtCore.QObject.connect(self.edit_, QtCore.SIGNAL("triggered()"), self.Edit)
00087
00088 def contextMenuEvent(self, pos):
00089
00090 index = self.list_view_.indexAt(pos)
00091 if index.isValid():
00092 if self.list_model_.IsEditable(index.row()):
00093 self.contextMenu_.popup(QtGui.QCursor.pos())
00094
00095 def Add(self):
00096 row = self.list_model_.GetLastRow()
00097 edit_widget = LoaderEditWidget()
00098
00099 if edit_widget.exec_() and self.list_model_.AddItem(datetime.now().isoformat(' '), edit_widget.GetLoader(), row, True, True):
00100 index = self.list_model_.index(row)
00101 self.list_view_.setCurrentIndex(index)
00102 self.Rename()
00103
00104 def Edit(self):
00105 current_index = self.list_view_.currentIndex()
00106 loader = self.list_model_.GetLoader(current_index)
00107 edit_widget = LoaderEditWidget()
00108 edit_widget.SetLoader(loader)
00109 if edit_widget.exec_():
00110 self.list_model_.SetItem(current_index, edit_widget.GetLoader())
00111
00112
00113 def Remove(self):
00114 if(self.list_view_.currentIndex().isValid()):
00115 ret = QtGui.QMessageBox.warning(self, "Delete File Loader",
00116 "Delete File Loader?",
00117 QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
00118 if ret == QtGui.QMessageBox.Yes:
00119 self.list_model_.RemoveItem(self.list_view_.currentIndex().row())
00120
00121 def Rename(self):
00122 if(self.list_view_.currentIndex().isValid()):
00123 self.list_view_.edit(self.list_view_.currentIndex())
00124
00125 def GetText(self):
00126 return self.text_
00127
00128
00129
00130
00131 class LoaderEditWidget(QtGui.QDialog):
00132 def __init__(self, parent=None):
00133 QtGui.QDialog.__init__(self, parent)
00134 name_ext_label = QtGui.QLabel("Name Extension")
00135 self.name_ext_edit_ = QtGui.QLineEdit()
00136
00137 url_label = QtGui.QLabel("Url")
00138 self.url_edit_ = QtGui.QLineEdit()
00139 self.add_id_button_ = QtGui.QToolButton(self)
00140 self.add_id_button_.setDefaultAction(QtGui.QAction("ID",self))
00141
00142 file_ext_label = QtGui.QLabel("File Type")
00143 self.file_ext_auto_ = QtGui.QCheckBox("Auto")
00144 self.file_ext_edit_ = QtGui.QLineEdit()
00145
00146 self.hbox_ = QtGui.QHBoxLayout()
00147 self.ok_button_ = QtGui.QPushButton("OK")
00148 self.cancel_button_ = QtGui.QPushButton("Cancel")
00149 self.hbox_.addWidget(self.ok_button_)
00150 self.hbox_.addStretch()
00151 self.hbox_.addWidget(self.cancel_button_)
00152
00153 grid = QtGui.QGridLayout()
00154 grid.setContentsMargins(0,5,0,0)
00155 grid.addWidget(name_ext_label, 0, 0, 1, 1)
00156 grid.addWidget(self.name_ext_edit_, 0, 1, 1, 4)
00157 grid.addWidget(url_label, 1, 0, 1, 1)
00158 grid.addWidget(self.url_edit_, 1, 1, 1, 3)
00159 grid.addWidget(self.add_id_button_, 1, 4, 1, 1)
00160 grid.addWidget(file_ext_label, 2, 0, 1, 1)
00161 grid.addWidget(self.file_ext_auto_, 2, 1, 1, 1)
00162 grid.addWidget(self.file_ext_edit_, 2, 2, 1, 3)
00163 grid.addLayout(self.hbox_,3,0,1,2)
00164 grid.setRowStretch(2, 1)
00165 self.setLayout(grid)
00166
00167 QtCore.QObject.connect(self.add_id_button_, QtCore.SIGNAL("clicked()"), self.AppendId)
00168 QtCore.QObject.connect(self.file_ext_auto_, QtCore.SIGNAL("stateChanged(int)"), self.CbStateChanged)
00169 QtCore.QObject.connect(self.ok_button_, QtCore.SIGNAL("clicked()"), self.Ok)
00170 QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel)
00171
00172 def GetLoader(self):
00173 name_ext = str(self.name_ext_edit_.text())
00174 url = str(self.url_edit_.text())
00175 file_ext = None
00176 if not self.file_ext_auto_.isChecked():
00177 file_ext = str(self.file_ext_edit_.text())
00178
00179 return GenericLoader(name_ext, url, False, file_ext)
00180
00181 def SetLoader(self, loader):
00182 self.name_ext_edit_.setText(loader.name_)
00183 self.url_edit_.setText(loader.url_)
00184 if loader.file_type_ is not None:
00185 self.file_ext_edit_.setText(loader.file_type_)
00186 self.file_ext_auto_.setChecked(False)
00187 else:
00188 self.file_ext_auto_.setChecked(True)
00189 def AppendId(self):
00190 self.url_edit_.setText(self.url_edit_.text()+"${ID}")
00191
00192 def CbStateChanged(self, state):
00193 self.file_ext_edit_.setEnabled(not self.file_ext_auto_.isChecked())
00194
00195 def Ok(self):
00196 self.accept()
00197
00198 def Cancel(self):
00199 self.reject()