diff --git a/README b/README index d58cfae..34981e2 100644 --- a/README +++ b/README @@ -26,7 +26,6 @@ pyGTKtalog is written in python with following dependencies: Optional modules: - PIL for image manipulation - - pyExcelerator for export to excel capability @@ -54,15 +53,38 @@ Then, just run pyGTKtalog script. TODO ==== +For version 1.0 following aims have to be done: + - searching database -- taggin files -- files properties -- adding images -- generating/saving thumbnails -- command line query support (text output) +- tagging files +- file details: + - files properties + x thumbnail + - description + - file information (date, size, etc) (50%) + - exif information + - keywords + - anime/movie + - title + - alt title + - type (anime movie, movie, anime oav, anime tv series, tv series, etc) + - cover/images + - genre + - lang + - sub lang + - release date (from - to) + - anidb link/imdb link +- adding images (60% done) +x generating/saving thumbnails +x moving hardcoded files extensions into config + +Legend: [-] not done, [x] done. + +For version 2.0: +- Icon grid in files view +- command line support: query, adding media to collection etc - internationalization support - statistics -- moving hardcoded files extensions into config NOTES ===== @@ -75,3 +97,4 @@ BUGS ==== All bugs please report to Roman 'gryf' Dobosz + diff --git a/resources/glade/main.glade b/resources/glade/main.glade index e80e8a0..dc0704e 100644 --- a/resources/glade/main.glade +++ b/resources/glade/main.glade @@ -233,7 +233,6 @@ - True @@ -451,7 +450,7 @@ - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -523,7 +522,104 @@ - + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 3 + gtk-missing-image + + + False + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Remove thumbnail image + Remove + 0 + + + False + + + + + + + + 1 + + + + + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + False + GTK_WRAP_CHAR + 3 + 3 + False + + + + + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + File info + + + tab + False + + + + + True + True + @@ -632,56 +728,10 @@ - + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-missing-image - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - True - - - 1 - - - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - True - - - 1 - - - - - + diff --git a/src/ctrls/c_main.py b/src/ctrls/c_main.py index 45284c5..6a837eb 100644 --- a/src/ctrls/c_main.py +++ b/src/ctrls/c_main.py @@ -34,7 +34,6 @@ from utils import deviceHelper from gtkmvc import Controller from c_config import ConfigController -from c_details import DetailsController from views.v_config import ConfigView from models.m_config import ConfigModel @@ -48,21 +47,22 @@ class MainController(Controller): """Controller for main application window""" scan_cd = False widgets = ( - "discs","files", - 'save1','save_as1','cut1','copy1','paste1','delete1','add_cd','add_directory1', - 'tb_save','tb_addcd','tb_find', + "discs","files", + 'save1','save_as1','cut1','copy1','paste1','delete1','add_cd','add_directory1', + 'tb_save','tb_addcd','tb_find','keywords','description', ) widgets_all = ( - "discs","files", - 'file1','edit1','add_cd','add_directory1','help1', - 'tb_save','tb_addcd','tb_find','tb_new','tb_open','tb_quit', + "discs","files", + 'file1','edit1','add_cd','add_directory1','help1', + 'tb_save','tb_addcd','tb_find','tb_new','tb_open','tb_quit', + 'keywords','description', ) + widgets_cancel = ('cancel','cancel1') def __init__(self, model): """Initialize controller""" Controller.__init__(self, model) - self.details = DetailsController(model.details) return def register_view(self, view): @@ -115,11 +115,9 @@ class MainController(Controller): if self.model.filename != None: self.__activateUI(self.model.filename) - # register detail subview - #self.view.create_sub_view(self.details) - # generate recent menu self.__generate_recent_menu() + # Show main window self.view['main'].show(); return @@ -277,6 +275,7 @@ class MainController(Controller): print "c_main.py: on_files_cursor_changed() directory selected" else: #file, show what you got. + #self.details.get_top_widget() selected_item = self.model.files_list.get_value(model.get_iter(treeview.get_cursor()[0]),0) self.__get_item_info(selected_item) if __debug__: @@ -654,10 +653,20 @@ class MainController(Controller): return def __get_item_info(self, item): - '''self.view['details'].show() - txt = self.model.get_file_info(item) - buf = self.view['details'].get_buffer() - buf.set_text(txt) - self.view['details'].set_buffer(buf)''' + self.view['description'].show() + set = self.model.get_file_info(item) + + buf = self.view['description'].get_buffer() + if set.has_key('description'): + buf.set_text(set['description']) + else: + buf.set_text('') + self.view['description'].set_buffer(buf) + + if set.has_key('thumbnail'): + self.view['thumb'].set_from_file(set['thumbnail']) + self.view['thumb'].show() + else: + self.view['thumb'].hide() return pass # end of class diff --git a/src/models/m_main.py b/src/models/m_main.py index ff4251c..a897cce 100644 --- a/src/models/m_main.py +++ b/src/models/m_main.py @@ -426,15 +426,23 @@ class MainModel(ModelMT): def get_file_info(self, id): """get file info from database""" - self.db_cursor.execute("SELECT filename, date, size, type \ - FROM files WHERE id = ?", (id,)) + retval = {} + self.db_cursor.execute("SELECT filename, date, size, type, filetype, \ + id FROM files WHERE id = ?", (id,)) set = self.db_cursor.fetchone() - if set == None: - return '' + if set: + string = "Filename: %s\nDate: %s\nSize: %s\ntype: %s" % \ + (set[0], datetime.fromtimestamp(set[1]), set[2], set[3]) + retval['description'] = string - string = "Filename: %s\nDate: %s\nSize: %s\ntype: %s" % \ - (set[0], datetime.fromtimestamp(set[1]), set[2], set[3]) - return string + if set[4] == self.F_IMG: + self.db_cursor.execute("SELECT filename FROM thumbnails \ + WHERE file_id = ?", + (id,)) + set = self.db_cursor.fetchone() + if set: + retval['thumbnail'] = os.path.join(self.internal_dirname, set[0]) + return retval def get_source(self, path): """get source of top level directory""" diff --git a/src/views/v_main.py b/src/views/v_main.py index 5af43c3..55b0de6 100644 --- a/src/views/v_main.py +++ b/src/views/v_main.py @@ -34,13 +34,11 @@ class MainView(View): GLADE = os.path.join(utils.globals.GLADE_DIR, "main.glade") def __init__(self, ctrl): View.__init__(self, ctrl, self.GLADE) - self.details = None + + # hide v2.0 features + self['separatormenuitem4'].hide() + self['list1'].hide() + self['thumbnails1'].hide() return - def create_sub_view(self, details_ctrl): - """attach sub view""" - self.details = DetailsView(details_ctrl, False) - vpan = self['vpaned1'] - vpan.add2(self.details.get_top_widget()) - return pass # end of class