Check-in [ffaf262c43]
Overview
Comment: | Move `state.json` and .current restoration into GenericChannel.gui(). Current category is reselected by TreeView traversal on instantion now. Previous state now load through config.state() for channels/__init__, not in main/init_app_state anymore (just row:expand / winsizes now). Disable .currentcat() overwriting, redundant now in display_categories(). Still need to avoid second .select_current() call in first_show(). |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
ffaf262c4384617dd853e33ca6ce84ba |
User & Date: | mario on 2015-04-28 17:35:15 |
Other Links: | manifest | tags |
Context
2015-04-28
| ||
20:55 | Removed export_format config option for exportcat plugin (as that's selectable now in the file dialog anyway). Recategorized dnd plugin to appear earlier in the [features] config tab. check-in: 276ae3ef5f user: mario tags: trunk | |
17:35 | Move `state.json` and .current restoration into GenericChannel.gui(). Current category is reselected by TreeView traversal on instantion now. Previous state now load through config.state() for channels/__init__, not in main/init_app_state anymore (just row:expand / winsizes now). Disable .currentcat() overwriting, redundant now in display_categories(). Still need to avoid second .select_current() call in first_show(). check-in: ffaf262c43 user: mario tags: trunk | |
2015-04-27
| ||
23:45 | Document command line flags in manual. check-in: 6135c7ecac user: mario tags: trunk | |
Changes
Modified channels/__init__.py from [ace9b7e5ae] to [cafb75235c].
︙ | ︙ | |||
140 141 142 143 144 145 146 | def gui(self, parent): # save reference to main window/glade API self.parent = parent self.gtk_list = parent.get_widget(self.module+"_list") self.gtk_cat = parent.get_widget(self.module+"_cat") | | > | | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | def gui(self, parent): # save reference to main window/glade API self.parent = parent self.gtk_list = parent.get_widget(self.module+"_list") self.gtk_cat = parent.get_widget(self.module+"_cat") # last category, and prepare genre tree self.current = conf.state(self.module).get("current") self.display_categories() # update column names for field,title in list(self.titles.items()): self.update_datamap(field, title=title) # prepare stream list if (not self.rowmap): for row in self.datamap: |
︙ | ︙ | |||
168 169 170 171 172 173 174 175 176 177 178 179 180 181 | def status(self, *v): if self.parent: self.parent.status(*v) else: log.INFO("status():", *v) #--------------------- streams/model data accesss --------------------------- # Get list of stations in current category def stations(self): return self.streams.get(self.current, []) # Convert ListStore iter to row number def rowno(self): | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | def status(self, *v): if self.parent: self.parent.status(*v) else: log.INFO("status():", *v) #--------------------- streams/model data accesss --------------------------- # traverse category TreeModel to set current, expand parent nodes def select_current(self, name): log.UI("reselect .current category in treelist:", name) model = self.gtk_cat.get_model() iter = model.get_iter_first() self.iter_cats(name, model, iter) # iterate over children to find current category def iter_cats(self, name, model, iter): while iter: val = model.get_value(iter, 0) if val == name: #log.UI("FOUND CATEGORY", name, "βselect") self.gtk_cat.get_selection().select_iter(iter) self.gtk_cat.set_cursor(model.get_path(iter)) return True if model.iter_has_child(iter): found = self.iter_cats(name, model, model.iter_children(iter)) if found: self.gtk_cat.expand_row(model.get_path(iter), 0) return True iter = model.iter_next(iter) # selected category def currentcat(self): (model, iter) = self.gtk_cat.get_selection().get_selected() if (type(iter) == gtk.TreeIter): self.current = model.get_value(iter, 0) return self.current # Get list of stations in current category def stations(self): return self.streams.get(self.current, []) # Convert ListStore iter to row number def rowno(self): |
︙ | ︙ | |||
280 281 282 283 284 285 286 | else: # parse error self.status("Category parsed empty.") self.streams[category] = self.nothing_found log.INFO("Oooops, parser returned nothing for category " + category) # Update treeview/model (if category is still selected) | < > | | < | 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 | else: # parse error self.status("Category parsed empty.") self.streams[category] = self.nothing_found log.INFO("Oooops, parser returned nothing for category " + category) # Update treeview/model (if category is still selected) if self.current == category: log.UI("load() β uikit.columns({}.streams[{}])".format(self.module, category), [inspect.stack()[x][3] for x in range(1,5)]) uikit.do(uikit.columns, self.gtk_list, self.datamap, self.prepare(self.streams[category])) if y: uikit.do(self.gtk_list.scroll_to_point, 0, y + 1) # scroll to previous position, +1 px, because # somehow Gtk.TreeView else stumbles over itself when scrolling to the same position the 2nd time # unset statusbar self.status() # store current streams data def save(self): conf.save("cache/" + self.module, self.streams, gz=1) |
︙ | ︙ | |||
400 401 402 403 404 405 406 407 | except: log.ERR("HTTP error or extraction failure.") self.categories = ["empty"] self.display_categories() # Select first category if not self.current: self.current = self.str_from_struct(self.categories) or None | > | > > | > < < < < < < < < | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 | except: log.ERR("HTTP error or extraction failure.") self.categories = ["empty"] self.display_categories() # Select first category if not self.current: log.STAT(self.module, "β first_show(); use first category as current =", self.current) self.current = self.str_from_struct(self.categories) or None # put selection/cursor on last position if True: uikit.do(self.select_current, self.current) #uikit.do(lambda:self.gtk_list.get_selection().select_path(self.shown)) # Show current category in any case log.UI(self.module, "β first_show(); station list β load(", self.current, ")") self.load(self.current) # Invoke only once self.shown = 55555 # Retrieve first list value, or key from dict (-- used to get first category on init) def str_from_struct(self, d): |
︙ | ︙ | |||
446 447 448 449 450 451 452 | # display outside of this non-main thread uikit.do(self.display_categories) # insert content into gtk category list def display_categories(self): | | | > | | > < < < < < < | 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 | # display outside of this non-main thread uikit.do(self.display_categories) # insert content into gtk category list def display_categories(self): log.UI("{}.display_categories(), uikit.tree(#{}), expand_all(#<20), select_current(={})".format(self.module, len(self.categories), self.current)) # rebuild gtk.TreeView uikit.tree(self.gtk_cat, self.categories, title="Category", icon=gtk.STOCK_OPEN) # if it's a short list of categories, there's probably subfolders if len(self.categories) < 20: self.gtk_cat.expand_all() # Select last .current or any first element if self.current: self.select_current(self.current) #self.currentcat() #else: self.gtk_cat.get_selection().select_path("0") #set_cursor # Insert/append new station rows - used by importing/drag'n'drop plugins def insert_rows(self, rows, y=None): streams = self.streams[self.current] tv = self.gtk_list |
︙ | ︙ |
Modified channels/links.py from [d2e4f35037] to [bf377754fc].
︙ | ︙ | |||
101 102 103 104 105 106 107 | "type": "text/html", }) # add to bookmarks parent.bookmarks.streams[self.module] = self.streams # redraw category | | | 101 102 103 104 105 106 107 108 | "type": "text/html", }) # add to bookmarks parent.bookmarks.streams[self.module] = self.streams # redraw category # parent.bookmarks.reload_if_current(self.module) |
Modified config.py from [7f53cc759c] to [0405b0c427].
︙ | ︙ | |||
250 251 252 253 254 255 256 257 258 259 260 261 262 263 | # 2.1.1 if "audio/mp3" in self.play: self.play["audio/mpeg"] = self.play["audio/mp3"] del self.play["audio/mp3"] if self.tmp == "/tmp": self.tmp = "/tmp/streamtuner2" # check for existing filename in directory list def find_in_dirs(self, dirs, file): for d in dirs: if os.path.exists(d+"/"+file): return d+"/"+file | > > > > > > > > > | 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | # 2.1.1 if "audio/mp3" in self.play: self.play["audio/mpeg"] = self.play["audio/mp3"] del self.play["audio/mp3"] if self.tmp == "/tmp": self.tmp = "/tmp/streamtuner2" # Shortcut to `state.json` loading (currently selected categories etc.) def state(self, module=None, d={}): if not d: d.update(conf.load("state")) if module: return d.get(module, {}) return d # check for existing filename in directory list def find_in_dirs(self, dirs, file): for d in dirs: if os.path.exists(d+"/"+file): return d+"/"+file |
︙ | ︙ |
Modified st2.py from [717429f33f] to [f820dd49d8].
︙ | ︙ | |||
234 235 236 237 238 239 240 | def channel_switch(self, notebook, page, page_num=0, *args): self.current_channel = notebook.get_menu_label_text(notebook.get_nth_page(page_num)) log.UI("main.channel_switch() :=", self.current_channel) self.update_title() # if first selected, load current category # (run in thread, to make it look speedy on first startup) self.thread( | | | 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | def channel_switch(self, notebook, page, page_num=0, *args): self.current_channel = notebook.get_menu_label_text(notebook.get_nth_page(page_num)) log.UI("main.channel_switch() :=", self.current_channel) self.update_title() # if first selected, load current category # (run in thread, to make it look speedy on first startup) self.thread( self.channel().first_show ) # Invoked from the menu instead, uses module name instead of numeric tab id def channel_switch_by_name(self, name): self.notebook_channels.set_current_page(self.channel_names.index(name)) # Mirror selected channel tab into main window title |
︙ | ︙ | |||
425 426 427 428 429 430 431 | except Exception as e: log.INIT("load_plugin_channels: error initializing:", name, ", exception:") traceback.print_exc() # load application state (widget sizes, selections, etc.) def init_app_state(self): | < | | | | | | 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 | except Exception as e: log.INIT("load_plugin_channels: error initializing:", name, ", exception:") traceback.print_exc() # load application state (widget sizes, selections, etc.) def init_app_state(self): winlayout = conf.load("window") if (winlayout): try: uikit.app_restore(self, winlayout) except Exception as e: log.APPSTATE_RESTORE(e) # may fail for disabled/reordered plugin channels #winstate = conf.state() # now handled by channels.gui() already #if (winstate): # for id,prev in winstate.items(): # try: self.channels[id].current = prev["current"] # except Exception as e: log.APPSTATE_RESTORE(e) # store window/widget states (sizes, selections, etc.) def save_app_state(self, widget): # gtk widget states widgetnames = ["win_streamtuner2", "toolbar", "notebook_channels", ] \ + [id+"_list" for id in self.channel_names] \ + [id+"_cat" for id in self.channel_names] |
︙ | ︙ |
Modified uikit.py from [33d6c42a98] to [6f3acc5193].
︙ | ︙ | |||
329 330 331 332 333 334 335 | col.set_fixed_width(args[i]) # - Rows if method == "rows:expanded": w.collapse_all() for i in args: w.expand_row(treepath(i), False) # - selected | | | | 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 | col.set_fixed_width(args[i]) # - Rows if method == "rows:expanded": w.collapse_all() for i in args: w.expand_row(treepath(i), False) # - selected # if method == "row:selected": # w.get_selection().select_path(treepath(args)) # gtk.Toolbar if method == "icon_size": w.set_icon_size(args) if method == "style": w.set_style(args) # gtk.Notebook if method == "tab_pos": |
︙ | ︙ |