# Copyright (C) 2007 daelstorm. All rights reserved. # # 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 3 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, see . # # Stole several code blocks from dkuhlman's examples # If you're learning Python, check out his Python 101 page # http://www.rexx.com/~dkuhlman/python_101/ import gtk, gobject import os from pynicotine.utils import version import imagedata from pynicotine.utils import _ class MetaDialog( gtk.Dialog): def __init__(self, frame, message="", data=None, modal= True, Search=True): gtk.Dialog.__init__(self) self.connect("destroy", self.quit) self.connect("delete-event", self.quit) self.nicotine = frame if modal: self.set_modal(True) self.Search = Search self.box = gtk.VBox(spacing=10) self.box.set_border_width(10) self.box.show() self.vbox.pack_start(self.box) if message: label = gtk.Label() label.set_markup(message) label.set_line_wrap(False) self.box.pack_start(label, False, False) label.show() label.set_alignment(0, 0.5) self.current = 0 self.data = data hbox2 = gtk.HBox(spacing=5) hbox2.show() self.UF = gtk.Frame() self.UF.show() self.UF.set_shadow_type(gtk.SHADOW_ETCHED_IN) self.box.pack_start(self.UF, False, False) vbox3 = gtk.VBox(spacing=5) vbox3.set_border_width(5) vbox3.show() self.UF.add(vbox3) self.UsernameLabel, self.Username = self.MakeLabelStaticEntry( hbox2, "%s:" % _("Username"), "", expand=False) self.BrowseUser = self.nicotine.CreateIconButton(gtk.STOCK_HARDDISK, "stock", self.OnBrowseUser, _("Browse")) hbox2.pack_start(self.BrowseUser, False, False) self.PositionLabel, self.Position = self.MakeLabelStaticEntry( hbox2, _("List Position:"), "", expand=False, width=7, xalign=1) vbox3.pack_start(hbox2, False, False) hbox3 = gtk.HBox(spacing=5) hbox3.show() vbox3.pack_start(hbox3, False, False) self.FilenameLabel, self.Filename = self.MakeLabelStaticEntry( hbox3, _("File Name:"), "", fill=True) hbox5 = gtk.HBox(spacing=5) hbox5.show() vbox3.pack_start(hbox5, False, False) self.DirectoryLabel, self.Directory = self.MakeLabelStaticEntry( hbox5, _("Directory:"), "", fill=True) self.Media = gtk.Frame() self.Media.show() self.Media.set_shadow_type(gtk.SHADOW_ETCHED_IN) hbox6 = gtk.HBox(spacing=5, homogeneous=False) hbox6.set_border_width(5) hbox6.show() self.SizeLabel, self.Size = self.MakeLabelStaticEntry( hbox6, _("File Size:"), "", expand=False, width=11, xalign=1) self.LengthLabel, self.Length = self.MakeLabelStaticEntry( hbox6, _("Length:"), "", expand=False, width=7, xalign=0.5) self.BitrateLabel, self.Bitrate = self.MakeLabelStaticEntry( hbox6, _("Bitrate:"), "", expand=False, width=12, xalign=0.5) self.Media.add(hbox6) self.box.pack_start(self.Media, False, False) hbox7 = gtk.HBox(spacing=5, homogeneous=False) hbox7.show() self.box.pack_start(hbox7, False, False) self.ImmediateLabel, self.Immediate = self.MakeLabelStaticEntry( hbox7, _("Immediate Downloads:"), "", expand=False, width=6, xalign=0.5) self.QueueLabel, self.Queue = self.MakeLabelStaticEntry( hbox7, _("Queue:"), "", expand=False, width=6, xalign=1) hbox4 = gtk.HBox(spacing=5, homogeneous=False) hbox4.show() self.box.pack_start(hbox4, False, False) self.SpeedLabel, self.Speed = self.MakeLabelStaticEntry( hbox4, _("Last Speed:"), "", expand=False, width=11, xalign=1) self.Country = gtk.Label() self.Country.hide() hbox4.pack_start(self.Country, False, False) self.Flag = gtk.Image() self.Flag.hide() hbox4.pack_start(self.Flag, False, False) self.buttonbox = gtk.HBox(False, 2) self.buttonbox.show() self.buttonbox.set_spacing(2) self.box.pack_start(self.buttonbox, False, False) # Download Button self.DownloadItem = self.nicotine.CreateIconButton(gtk.STOCK_GO_DOWN, "stock", self.OnDownloadItem, _("Download")) self.buttonbox.pack_start(self.DownloadItem, False, False) # Download All Button self.DownloadAll = self.nicotine.CreateIconButton(gtk.STOCK_GO_DOWN, "stock", self.OnDownloadAll, _("Download All")) self.buttonbox.pack_start(self.DownloadAll, False, False) self.Selected = self.MakeLabel( self.buttonbox, _("%s File(s) Selected") % len(self.data.keys()), expand=False, xalign=1) self.Previous = self.nicotine.CreateIconButton(gtk.STOCK_GO_BACK, "stock", self.OnPrevious, _("Previous")) self.Next = self.nicotine.CreateIconButton(gtk.STOCK_GO_FORWARD, "stock", self.OnNext, _("Next")) self.buttonbox.pack_end(self.Next, False, False) self.buttonbox.pack_end(self.Previous, False, False) button = self.nicotine.CreateIconButton(gtk.STOCK_CLOSE, "stock", self.click, _("Close")) button.set_flags(gtk.CAN_DEFAULT) self.action_area.pack_start(button) button.grab_default() self.ret = None self.Display(self.current) def OnDownloadItem(self, widget): meta = self.data[self.current] self.nicotine.np.transfers.getFile(meta["user"], meta["fn"], "") def OnBrowseUser(self, widget): meta = self.data[self.current] self.nicotine.BrowseUser(meta["user"]) def OnDownloadAll(self, widget): for item, meta in self.data.items(): self.nicotine.np.transfers.getFile(meta["user"], meta["fn"], "") def OnPrevious(self, widget): if len(self.data.keys()) > 1: _list = self.data.keys() if not self.current in _list: ix -= 1 else: ix = _list.index(self.current) ix -= 1 if ix < 0: ix = -1 elif ix >= len(_list): ix = 0 if ix != None: self.current = _list[ix] if self.current == None: return self.Display(self.current) def OnNext(self, widget): if len(self.data.keys()) > 1: _list = self.data.keys() if not self.current in _list: ix += 1 else: ix = _list.index(self.current) ix += 1 if ix < 0: ix = -1 elif ix >= len(_list): ix = 0 if ix != None: self.current = _list[ix] if self.current == None: return self.Display(self.current) def Display(self, item): if item not in self.data: return if not self.Search: self.Immediate.hide() self.Position.hide() self.Country.hide() self.Flag.hide() self.Queue.hide() self.Immediate.hide() self.ImmediateLabel.hide() self.PositionLabel.hide() self.QueueLabel.hide() self.ImmediateLabel.hide() self.DownloadItem.hide() self.DownloadAll.hide() else: self.Immediate.show() self.Position.show() self.Country.show() self.Flag.show() self.Queue.show() self.Immediate.show() self.ImmediateLabel.show() self.PositionLabel.show() self.QueueLabel.show() self.ImmediateLabel.show() self.DownloadItem.show() self.DownloadAll.show() self.current = item data = self.data[self.current] More = False if len(self.data.keys()) > 1: More = True self.Next.set_sensitive(More) self.Previous.set_sensitive(More) self.DownloadAll.set_sensitive(More) self.Username.set_text(data["user"]) self.Filename.set_text(data["filename"]) self.Directory.set_text(data["directory"]) self.Size.set_text(str(data["size"])) self.Speed.set_text(data["speed"]) self.Position.set_text(str(data["position"])) if data["bitrate"] not in ("", None): self.Bitrate.set_text(data["bitrate"]) else: self.Bitrate.set_text("") self.Length.set_text(data["length"]) self.Queue.set_text(data["queue"]) self.Immediate.set_text(str(data["immediate"] == "Y")) country = data["country"] if country not in ("", None): self.Country.set_markup(_("Country Code: ") + country ) self.Country.show() self.Flag.set_from_pixbuf(self.nicotine.GetFlagImage("flag_" + country) ) self.Flag.show() else: self.Country.set_text("") self.Country.hide() self.Flag.set_from_pixbuf(None) self.Flag.hide() def quit(self, w=None, event=None): self.hide() self.destroy() gtk.main_quit() def click(self, button): self.quit() def MakeLabel(self, parent, labeltitle, expand=True, fill=False, xalign=0): label = gtk.Label() label.set_markup(labeltitle) label.show() #label.set_property("selectable", True) parent.pack_start(label, expand, fill) try: label.set_property("xalign", xalign) except Exception, e: print e pass return label def MakeLabelStaticEntry(self, parent, labeltitle, entrydata, editable=False, expand=True, fill=False, width=-1, xalign=0): label = gtk.Label() label.set_markup(labeltitle) label.show() parent.pack_start(label, False, False) entry = gtk.Entry() entry.set_property("editable", editable) entry.set_property("width-chars", width) try:entry.set_property("xalign", xalign) except:pass entry.show() if entrydata is not None: entry.set_text(entrydata) parent.pack_start(entry, expand, fill) return label, entry class EntryDialog( gtk.Dialog): def __init__(self, frame, message="", default_text='', modal= True, option=False, optionmessage="", optionvalue=False, droplist=[]): gtk.Dialog.__init__(self) self.connect("destroy", self.quit) self.connect("delete-event", self.quit) self.gotoption = option if modal: self.set_modal(True) box = gtk.VBox(spacing=10) box.set_border_width(10) self.vbox.pack_start(box) box.show() if message: label = gtk.Label(message) box.pack_start(label, False, False) label.set_line_wrap(True) label.show() self.combo = gtk.combo_box_entry_new_text() for i in droplist: self.combo.append_text( i) self.combo.child.set_text(default_text) box.pack_start(self.combo, False, False) self.combo.show() self.combo.grab_focus() self.option = gtk.CheckButton() self.option.set_active(optionvalue) self.option.set_label(optionmessage) self.option.show() if self.gotoption: box.pack_start(self.option, False, False) button = gtk.Button(_("OK")) button.connect("clicked", self.click) button.set_flags(gtk.CAN_DEFAULT) self.action_area.pack_start(button) button.show() button.grab_default() button = gtk.Button(_("Cancel")) button.connect("clicked", self.quit) button.set_flags(gtk.CAN_DEFAULT) self.action_area.pack_start(button) button.show() self.ret = None def quit(self, w=None, event=None): self.hide() self.destroy() gtk.main_quit() def click(self, button): if self.gotoption: self.ret = [self.combo.child.get_text(), self.option.get_active()] else: self.ret = self.combo.child.get_text() self.quit() def input_box(frame, title="Input Box", message="", default_text='', modal= True, option=False, optionmessage="", optionvalue=False, droplist=[]): win = EntryDialog(frame, message, default_text, modal=modal, option=option, optionmessage=optionmessage, optionvalue=optionvalue, droplist=droplist) win.set_title(title) win.set_icon(frame.images["n"]) win.set_default_size(300, 100) win.show() gtk.main() return win.ret class FindDialog( gtk.Dialog): def __init__(self, frame, message="", default_text='', textview=None, modal= True): gtk.Dialog.__init__(self) gobject.signal_new("find-click", gtk.Window, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING,)) self.textview = textview self.nicotine = frame self.connect("destroy", self.quit) self.connect("delete-event", self.quit) self.nextPosition = None self.currentPosition = None self.lastdirection = "next" if modal: self.set_modal(True) box = gtk.VBox(spacing=10) box.set_border_width(10) self.vbox.pack_start(box) box.show() if message: label = gtk.Label(message) box.pack_start(label, False, False) label.set_line_wrap(True) label.show() self.entry = gtk.Entry() box.pack_start(self.entry, False, False) self.entry.show() self.entry.grab_focus() self.entry.connect("activate", self.next) Previousbutton = self.nicotine.CreateIconButton(gtk.STOCK_GO_BACK, "stock", self.previous, _("Previous")) Previousbutton.set_flags(gtk.CAN_DEFAULT) self.action_area.pack_start(Previousbutton) Nextbutton = self.nicotine.CreateIconButton(gtk.STOCK_GO_FORWARD, "stock", self.next, _("Next")) Nextbutton.set_flags(gtk.CAN_DEFAULT) self.action_area.pack_start(Nextbutton) Nextbutton.grab_default() Cancelbutton = self.nicotine.CreateIconButton(gtk.STOCK_CANCEL, "stock", self.quit, _("Cancel")) Cancelbutton.set_flags(gtk.CAN_DEFAULT) self.action_area.pack_start(Cancelbutton) def quit(self, w=None, event=None): self.hide() def next(self, button): self.emit("find-click", "next") def previous(self, button): self.emit("find-click", "previous") def FolderDownload(frame, title="Option Box", message="", default_text='', modal= True, data=None, callback=None ): win = FolderDownloadDialog(frame, message, modal=modal) win.connect("response", callback, data) win.set_title(title) win.set_icon(frame.images["n"]) win.show() class FolderDownloadDialog( gtk.Dialog): def __init__(self, frame, message="",modal= False, ): gtk.Dialog.__init__(self) self.connect("destroy", self.quit) self.connect("delete-event", self.quit) self.nicotine = frame self.set_modal(modal) box = gtk.VBox(spacing=10) box.set_border_width(10) self.vbox.pack_start(box) box.show() hbox = gtk.HBox(spacing=5) hbox.set_border_width(5) hbox.show() box.pack_start(hbox) image = gtk.Image() image.set_padding(0, 0) icon = gtk.STOCK_DIALOG_QUESTION image.set_from_stock(icon, 4) image.show() hbox.pack_start(image) if message: label = gtk.Label(message) hbox.pack_start(label) label.set_line_wrap(True) label.show() hbox2 = gtk.HBox(spacing=5) hbox2.set_border_width(5) hbox2.show() box.pack_start(hbox2) cancel_button = self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) ok_button = self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) ok_button.grab_default() def quit(self, *args): self.destroy() def QuitBox(frame, title="Option Box", message="", default_text='', modal= True, status=None, tray=False, third="" ): win = OptionDialog(frame, message, modal=modal, status=status, option=tray, third=third, rememberbox=True) win.connect("response", frame.on_quit_response) win.set_title(title) win.set_icon(frame.images["n"]) win.show() return win def ClearDialog(frame, title=_("Nicotine+"), message="", default_text='', modal= True, status=None, tray=False, third="", direction=None): win = OptionDialog(frame, message, modal=modal, status=status, option=False, third=third) win.connect("response", frame.on_clear_response, direction) win.set_title(title) win.set_icon(frame.images["n"]) win.show() return win class OptionDialog(gtk.Dialog): def __init__(self, frame, message="",modal= False, status=None, option=False, third="", rememberbox=False): gtk.Dialog.__init__(self) self.connect("destroy", self.quit) self.connect("delete-event", self.quit) self.nicotine = frame self.set_modal(modal) box = gtk.VBox(spacing=10) box.set_border_width(10) self.vbox.pack_start(box) box.show() hbox = gtk.HBox(spacing=5) hbox.set_border_width(5) hbox.show() box.pack_start(hbox) if status: image = gtk.Image() image.set_padding(0, 0) if status == "warning": icon = gtk.STOCK_DIALOG_WARNING else: icon = gtk.STOCK_DIALOG_QUESTION image.set_from_stock(icon, 4) image.show() hbox.pack_start(image) if message: label = gtk.Label(message) hbox.pack_start(label) label.set_line_wrap(True) label.show() hbox2 = gtk.HBox(spacing=5) hbox2.set_border_width(5) hbox2.show() box.pack_start(hbox2) # Storing under self. so we can find it easily later if rememberbox: self.checkbox = gtk.CheckButton("Remember choice") box.pack_start(self.checkbox) self.checkbox.show() if option: Alignment = gtk.Alignment(0.5, 0.5, 0, 0) Alignment.show() Hbox = gtk.HBox(False, 2) Hbox.show() Hbox.set_spacing(2) image = gtk.Image() image.set_padding(0, 0) image.set_from_stock(gtk.STOCK_GO_DOWN, 4) image.show() Hbox.pack_start(image, False, False, 0) Alignment.add(Hbox) if label: Label = gtk.Label(third) Label.set_padding(0, 0) Label.show() Hbox.pack_start(Label, False, False, 0) tray_button = self.add_button("", gtk.RESPONSE_REJECT) tray_button.remove(tray_button.get_child()) tray_button.add(Alignment) cancel_button = self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) ok_button = self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) ok_button.grab_default() def quit(self, *args): self.destroy()